Обсуждение AI (баги, затупки, способы решения)

BugTraq: обнаруженные ошибки и обсуждение их устранения.

Модератор: 4epT

Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Обсуждение AI (баги, затупки, способы решения)

Сообщение Rumata »

Не возражаете против создания подобного топика?
давайте собирать здесь проблемы по типу -

1. кора, версия такая-то
2. бот, специализация такая-то
3. проблема, суть
4. логи (и по возможности дебаги тоже)
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

начну сам:

1. 206SVN6458
2. лукообразный
3. и 4. проблем много:

[1]

No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)
No LOS from (283, 84) to target (275, 75); moving to (283, 84)


СУТЬ: если не можем попасть по мобу из данной точки то идем в эту же точку.

РЕШЕНИЕ: в аttack.pm добавляем еще одно условие проверки координат

меняем это:

Код: Выделить всё

if ( 
	(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos)) 
	|| checkLineWalkable($spot, $realMonsterPos)) 
	&& $field->isWalkable($spot->{x}, $spot->{y}) 
	&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax}) 
) { 
на это:

Код: Выделить всё

if ( 
	(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos)) 
	|| checkLineWalkable($spot, $realMonsterPos)) 
	&& $field->isWalkable($spot->{x}, $spot->{y}) 
	&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y})                          #+++++++++add this string+++++++
	&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax}) 
) { 
[2]

No LOS from (354, 222) to target (364, 216); moving to (353, 221)
Attacking: Monster Geographer (0)
No LOS from (353, 221) to target (364, 216); moving to (352, 220)
Attacking: Monster Geographer (0)
No LOS from (352, 220) to target (364, 216); moving to (351, 219)
Attacking: Monster Geographer (0)
No LOS from (351, 219) to target (364, 216); moving to (350, 218)
Attacking: Monster Geographer (0)
No LOS from (350, 218) to target (364, 216); moving to (349, 217)
Attacking: Monster Geographer (0)


СУТЬ: моб находиться за небольшим или большим препятствием, но почему то точки которые мы получаем
чтобы атаковать моба - неудачные, мы оттуда так же не можем по нему выстрелить.

РЕШЕНИЕ: в аttack.pm опять таки меняем в том же блоке условия (теперь мы идем только в ту точку из которой
мы точно можем попасть в моба):

это:

Код: Выделить всё

if ( 
	(($config{attackCanSnipe} && checkLineSnipable($spot, $realMonsterPos)) 
	|| checkLineWalkable($spot, $realMonsterPos)) 
	&& $field->isWalkable($spot->{x}, $spot->{y}) 
	&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y})                          #+++++++++add this string+++++++
	&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax}) 
) { 
на это:

Код: Выделить всё

f (
    	$config{attackCanSnipe} 
	&& checkLineSnipable($spot, $realMonsterPos)	
	&& checkLineWalkable($realMyPos, $spot)					#+++++++++change OR to AND+++++++
	&& $field->isWalkable($spot->{x}, $spot->{y}) 
	&& ($realMyPos->{x} != $spot->{x} && $realMyPos->{y} != $spot->{y})			#+++++++++add this string+++++++
	&& (!$master || round(distance($spot, $masterPos)) <= $config{followDistanceMax})
) {
[3]

No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)
No LOS from (241, 254) to target (236, 246); no acceptable place to stand
Attacking: Monster Geographer (0)


СУТЬ: после всех изменений вышеуказанных возникает ситуация - моб по одну сторону длинной стены, а
мы по другую, соответственно к нему доступа нет, и мы попадаем в бесконечный цикл.

РЕШЕНИЕ: нам надо проигнорить моба, что мы делаем добавляя в attack.pm неоторые изменения( описание ниже):

итак в attack.pm после:

Код: Выделить всё

	warning TF("%s; no acceptable place to stand\n", $msg);
добавим:

Код: Выделить всё

	$target->{attack_failedLOS} = time;
	AI::dequeue;
	AI::dequeue;
	AI::dequeue if (AI::action eq "attack");
и еще в AI.pm после:

Код: Выделить всё

		my $control = Misc::mon_control($monster->name,$monster->{nameID}) if $type || !$wantArray;
		my $ID = $monster->{ID};
добавим строку:

Код: Выделить всё

next if (!timeOut($monster->{attack_failedLOS}, 6));
КАК ОНО ДЕЙСТВУЕТ: если мы лучники, и для моба находящегося за препятствием нет ни одной точки откуда мы можем в него попасть, то мы устанавливаем для него таймаут равный 6 секундам, в течении которых он будет игнорироваться, если же этот гад по истечении 6 секунд стал нам доступен - мы его атакуем. :секунд - оптимальное время за которое мы пройдем мимо моба так чтобы он скрылся из обзора коры. в принципе можно менять это значение по своему усмотрению. я так подумал что таймаут будет жрать меньше ресурсов процессора чем считать для каждого моба растояние и сравнивать его attackMaxRouteDistance в конфиге, хотя можно сделать и так, для этого можно в упрощенном виде использовать функцию checkLineWalkable($realMyPos, $realMonsterPos, 40), но не думаю что это надо.

зы пожалуйста потестите, если есть баги напишите.
Последний раз редактировалось Rumata Пт окт 17, 2008 1:52 pm, всего редактировалось 3 раза.
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

вобчем такая хрень - я стою в низинке, моб на взгорье, между нами соответственно стена этого взгорья тянущаяся далеко, моба то я вижу (дистанция около 10 клеток) но даже в ручном режиме не могу в него стрельнуть, нет такой возможности, соответствнно а надо ли нам вообще дават боту возможность стрелять через стену? если существуют стены через которые невозможно физически пальнуть?
Klinik
Грамотный
Сообщения: 307
Зарегистрирован: Сб фев 16, 2008 1:42 am
Контактная информация:

Сообщение Klinik »

но ведь существуют и такие через которые можно, или я ошибаюсь?
если так, то мб сделать так чтоб кора различала стенки через которые можно стрелять и считала их просто непроходимыми клетками, а через которые нельзя просто стенами?
Изображение
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

по идее должен работать блок на проверку attackMaxRouteDistance, но где он хэ его знает , вопервых он вообче не работает, и есть ли он вообще? я не смог найти.... :evil:

Добавлено спустя 3 минуты 9 секунд:

офигеть вот что нарыл
attackMaxRoute distance is disabled when you use lockmap_x _y
Добавлено спустя 22 минуты 35 секунд:

народ какая функция расчитывает путь до моба в блоках учитывая препятствия?
Аватара пользователя
kLabMouse
Профессионал
Сообщения: 4776
Зарегистрирован: Вс ноя 05, 2006 4:32 pm

Сообщение kLabMouse »

Rumata
поищи в Миск.пм
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

обновил решение проблемы № 3 в своем первом посте. теперь надо потестить.

kLabMouse - я изьявляю :)
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

[3] так должно получиться?

Код: Выделить всё

		} else {
			warning TF("%s; no acceptable place to stand\n", $msg);
			$target->{attack_failedLOS} = time;
			AI::dequeue;
			AI::dequeue;
			AI::dequeue if (AI::action eq "attack");
			AI::dequeue;
		}
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

ну разницы особой нет, свой вариант протестил - за пол-суток не заглючил вроде.
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

ты скажи в этом пункте у тебя так?
Rumata
Грамотный
Сообщения: 235
Зарегистрирован: Ср фев 14, 2007 10:52 am

Сообщение Rumata »

у меня так, без последней AI::dequeue;
Аватара пользователя
Click
Разработчик
Сообщения: 1564
Зарегистрирован: Сб ноя 04, 2006 11:30 pm
Сервер RO:: clickro.sytes.net
Откуда: Великий Новгород
Контактная информация:

Сообщение Click »

svn 6576. так что обновляемся и тестим.

Добавлено спустя 42 минуты 31 секунду:

перенёс в баги, ну как то не идея это всё таки, а баг-фикс.
Вложения
src.rar
изменённые файлы
(11.66 КБ) 222 скачивания
Ответить