gm_Обнаружение - ScreamingScythe/botgame GitHub Wiki
Тут будет статья об обнаружении ботом объектов. Опрос будет происходить в двух случаях:
- Когда в поле зрения бота, который находится в состоянии Wait совершается действие другим объектом
- Когда бот "просыпается"
- Возможен третий случай - в состоянии Wait изредка еще раз кидать тест на обнаружение. Это жизненно и уменьшит число патовых ситуаций (оба бота сидят в кустах на небольшом расстоянии, смотрят друг на друга, имеют неплохие шансы заметить друг-друга, но это продолжается вечно). Если его реализовать, то можно в принципе убрать 1й случай.
Если bot.camo того, кого мы ищем равно 1, то тест валится сразу.
Обнаружение есть тест. Мы чертим луч от бота-детектора к боту-скрыватору. Получаем список тайлов черезкоторые проходит этот луч.
Далее выявляем список "interviewing objects" - объекты, мешающие обнаружению. Проверка идет по высотам.
obscured_perc_i_max = intobj[i].get_height_interview_percent(...);
obscured_perc_i_inc = intobj[i].spaceFill*intobj[i].opacity*obscured_perc_i_max;
if (obscured_perc + obscured_perc_i_inc > obscured_perc_i_max)
{
obscured_perc_i_inc = obscured_perc_i_max - obscured_perc;
if (obscured_perc_i_inc >0)
obscured_perc += obscured_perc_i_inc;
}
else
{
obscured_perc += obscured_perc_i_inc;
}
obscured_perc += *intobj[i];
get_height_interview_percent - считаем процент, на который boudingBox бота перекрыт boundingBox-ом объекта по высоте
Если obscured_perc доходит до единицы, работа алгоритма прерывается и тест на обнаружение проваливается.
на теперь собственно тест: bool spot = rand(0..1) < (1-bot.camo)*(1-obscured_perc);
bot.camo модифицируется в зависимости от заметности действия, совершаемого ботом в данный момент. Бот, идущий в соседний тайл в 3 раза заметней, чем неподвижный Бот, просто что-то делающий в 1.33 раза заметней, чем неподвижный На самом деле это не поле, а метод, потому алгоритму на этот факт пофиг