Только что скачал дему, (вчера не качалось). С такими уровнями сделать АИ будет очень-очень сложно. Я больше расчитывал на оригинальный аркадный вариант, а тут больше на лабиринты похоже.
Всё что могу предложить, это сделать "тупых" врагов, например одни ходят туда-сюда, другие постоянно прыгают высоко и т.п.
Я всё же попробую состряпать чего-нибудь, а потом посмотрим как это можно будет применить в твоём проекте.
Добавлено через 1 час 57 минут
Я подумал ещё раз над алгоритмами поведения противника, и понял, что это бессмысслено делать ИИ в твоей ситуации. Даже если бы у тебя был ИИ из оригинальной игры, всё что получалось бы у него, так это упираться в стену, или ходить туда-сюда без смысла.
Вот скриншот ИИ из оригинальной игры. В твоём случае всё гораздо хуже, такие ситуации повсюду.
Я не виже смысла в создании полноценного ИИ. То что работает для уровня размером с экран, не всегда сработает для больших пространств.
Я хотел замутить примерно следующее: определить все лестницы на которые можно запрыгнуть (делается кодом), если игрок слишком высоко, враг ищет ближайшую лестницу с пометкой на высоте от у и у-32 (высота спрайта 32). Затем враг следует за лестницей, а не за персонажем, и когда враг запрыгивает на лестницу, он начинает искать путь по ней.
Но что если ближайшая лестница всего лишь в двух клетка, но огорожденна высокой стеной, а другая на другом конце экрана, но перед ней обрыв? Враг пойдёт за ближайней, и упрётся в стену, но даже если рассчитать коллизию со стеной, то обрыв навряд-ли удасться обойти. А поиск пути по лестнице, когда персонаж в другом конце экрана....
Код для прыжка через стены и через ямы, движение в направлении игрока.
Объекты игрока и врага 24 пикселя шириной и 32 высотой (иначе не проваливаются в одиночную яму). Стены и другие объекты 32х32. Подправь значения если нужно. Враг проверяет стену (obj_block) и пружину (obj_spring), если нет пружины, лишние проверки можешь убрать.
//right
if x{
if place_free(x+3,y)
x+=2
if !place_free(x,y+1)
{
//detect hole to the right
if !collision_point(x+28,y+35,obj_block,false,true)
if !collision_point(x+28,y+35,obj_spring,false,true)
vspeed=-6
}
//detect brick to the right
{
if collision_point(x+48,y+16,obj_block,false,true) or collision_point(x+48,y+16,obj_spring,false,true)
vspeed=-6
}
}
//left
if x>obj_player.x
{
if place_free(x-3,y)
x-=2
if !place_free(x,y+1)
{
//detect hole to the left
if !collision_point(x-4,y+35,obj_block,false,true)
if !collision_point(x-4,y+35,obj_spring,false,true)
vspeed=-6
}
//detect brick to the left
{
if collision_point(x-16,y+16,obj_block,false,true) or collision_point(x-16,y+16,obj_spring,false,true)
vspeed=-6
}
}