Обучаем Бабуляторов
Создание интеллекта монстров - одна из интересных задач в ремейках игр. Кто-то вооружается дизассемблерами и ищет в коде оригинальной игры такие процедуры. У меня другой метод - я просто изучаю логику поведения этих самых монстров в оригинальной игре и потом делаю свои алгоримы на основе этих наблюдений. Если в итоге мои монстры ведут себя также как в оригинале - значит мне удалось разгадать задумку автора.
Первым делом я обучил Бабок и Зомби обнаруживать ямы и стены, это само собой. Затем стал смотреть, как они реагируют на Дейва. Зомби - самые простые в этом плане. Они бродят от стены к стене, ожидая появления Дейва на своей горизонтали или ниже. Если Дейв появился на их горизонтали - Зомби сразу же поворачиваются в его сторону и бредут к нему. Если на пути им вдруг встретилась яма или стена, то Зомби поворачивают назад и делают от 1 до 5 шагов в обратном направлении, уже не обращая внимания на Дейва. Иначе монстр просто зациклится в бесконечных поворотах у стены - "Дейв в переди! Блин, стена, разворот. Но Дейв на этом уровне, поворачиваем к нему! Блин, стена..."
Изначально, кстати, я по привычке сделал обнаружение стены между Дейвом и монстром, чтобы монстр не реагировал на Дейва, если между ними стена. Но оказалось, что в оригинале монстры видят Дейва сквозь стены и реагируют на него. Бабки даже ножи кидают в такие стены. Пришлось процедуру выкинуть пока.
Бабки ведут себя гораздо хитрее, чем Зомби. Во-первых, они не приближаются к Дейву, если есть такая возможность, а поворачивают назад, отходят и потом уже кидают нож. Но могут и не кинуть, тут уже явно применен генератор случайных чисел. Пришлось подбирать подбирать подходящее значение порога и для генератора случайных чисел, чтобы Бабка не кидалась ножами как пулемет, но и не делала это раз в пятилетку. Во-вторых, Бабка не сразу реагирует на то, что Дейв появился на ее горизонтали. Она вполне может пройти шагов пять и не обернуться, даже если Дейв идет у нее за спиной. Но при встрече с препятствием Бабуляторы поступают также, как Зомби - поворачивают назад и делают случайное количество шагов.
Таким образом, в алгоритме есть коллизия - если Бабка находится слишком близко к стене и при этом слишком близко к Дейву, то она тоже может зациклиться в своих попытках и от Дейва отойти на расстояние броска, и от стены удалиться после разворота. В оригинале такое происходит - Бабка начинает вертеться вокруг Дейва бесконечно на одном месте. Не думаю, что это стоит копировать, поможем Бабуле разобраться в ситуации :)
На данный момент Бабки уже почти все делают как надо и даже делают движения броска. Осталось выдать им ножи...