Написал я бота, который в одной игре может пинать одного моба.
Суть такова :
1. Бот перед боем проверяет здоровье персонажа и дракона (при необходимости восстанавливает здоровье)
2. Ищет моба и атакует его (если не найдет проверяет на наличие ошибок и выскакивающих окон)
3. Проводит бой (если бой не начался после атаки моба, проверяет на наличие ошибок и выскакивающих окон)
4. При завершении боя проверяет победа или поражение
Код получился большой и безобразный, прошу помочь довести его до ума. Или дайте правильную конструкцию, я готов переписать его заново, лишь бы он был нормальней.
LOGSHOW (1, 950,600)
SUB (hppers)
//Проверка на хп персонажа
GETSCREEN
COLORMODE(6,$xtop+100, $ytop+35, $xtop+130, $ytop+42)
IF_PICTURE_IN ($xtop+100, $ytop+35, $xtop+130, $ytop+42, "hp.bmp", -1, 90)
LOGWRITE ("Персонаж Голоден")
WAITMS(100)
MOVE($xeda+16, $yeda+19)
WAITMS(100)
LDOWN($xeda+16, $yeda+19)
WAITMS(100)
LUP($xeda+16, $yeda+19)
WAITMS(200)
MOVE($xeda+16, $yeda+100)
WAITMS(800)
else
LOGWRITE ("Персонаж сыт")
END_IF
END_SUB
SUB (stat)
//проверка на наличие выскакивающего окна статистика
LOGWRITE ("статистика ?")
WAITMS(100)
GETSCREEN
COLORMODE(6, $xtop+880, $ytop-5, $xtop+930, $ytop+38)
IF_PICTURE_IN ($xtop+880, $ytop-5, $xtop+930, $ytop+38, "sta.bmp", -1, 90)
LOGWRITE ("да, стат")
WAITMS(100)
LDOWN($_return1, $_return2)
wAITMS(100)
LUP($_return1, $_return2)
WAITMS(200)
MOVE($xtop+50, $ytop+100)
WAITMS(100)
Else
LOGWRITE ("Нет")
END_IF
END_SUB
SUB (bonus)
//Проверка на наличие выскакивающего окна бонусов
LOGWRITE ("бонусы?")
WAITMS(100)
GETSCREEN
COLORMODE(6, $xtop+400, $ytop+300, $xtop+700, $ytop+480)
IF_PICTURE_IN ($xtop+400, $ytop+300, $xtop+700, $ytop+480, "bonus.bmp", -1, 90)
LOGWRITE ("да, бонус")
WAITMS(100)
LDOWN($_return1, $_return2)
wAITMS(100)
LUP($_return1, $_return2)
WAITMS(200)
MOVE($xtop+50, $ytop+100)
WAITMS(100)
Else
LOGWRITE ("Нет бонусов")
END_IF
END_SUB
SUB (sliv)
//Проверка на проигрыш в бою
GETSCREEN
COLORMODE(6,$xtop+266, $ytop+150, $xtop+1025, $ytop+450)
IF_PICTURE_IN ($xtop+266, $ytop+150, $xtop+1025, $ytop+450, "sliv.bmp", -1, 90)
LOGWRITE ("СЛИЛИ")
//Если проиграли в бою нажимаем на кнопку закрыть игру и прерываем сценарий
WAITMS(100)
LDOWN($xtop+1006, $ytop-35)
WAITMS(100)
LUP($xtop+1006, $ytop-35)
WAITMS(200)
HALT
else
LOGWRITE ("Победа")
END_IF
END_SUB
SUB (atak)
//Сам процесс боя
$atak = 0
while ($atak =0)
//Нажатие на кнопку призыва дракона (если она активна)
GETSCREEN
COLORMODE(6, $xtop, $ytop+60, $xtop+40, $ytop+72)
IF_PICTURE_IN ($xtop, $ytop+60, $xtop+40, $ytop+72, "prizv.bmp", -1, 90)
LDOWN($_return1+5, $_return2+3)
wAITMS(100)
LUP($_return1+5, $_return2+3)
WAITMS(50)
LOGWRITE ("зовем драка")
WAITMS(500)
MOVE($xtop+50, $ytop+100)
Else
//Если кнопка удара не активна, то нажмем на нее
GETSCREEN
COLORMODE(6, $xtop+455,$ytop+430, $xtop+900,$ytop+465)
IF_PICTURE_IN ($xtop+455,$ytop+430, $xtop+900,$ytop+465, "an2.bmp", -1, 100)
LCLICK($_return1+30, $_return2)
WAITMS(50)
LOGWRITE ("атака1")
MOVE($xtop+50, $ytop+100)
WAIT(2)
Else
//Если кнопка удара нстала активной, то нажмем на нее
GETSCREEN
COLORMODE(6, $xtop+455,$ytop+430, $xtop+900,$ytop+465)
IF_PICTURE_IN ($xtop+455,$ytop+430, $xtop+900,$ytop+465, "aa2.bmp", -1, 100)
LCLICK($_return1+30, $_return2)
WAITMS(50)
LOGWRITE ("атака2")
MOVE($xtop+50, $ytop+100)
WAIT(2)
Else
GETSCREEN
// Проверка на наличие кнопки закрыть бой (если противник или наш герой повержен)
IF_PICTURE_IN ($xtop+400,$ytop+300, $xtop+1000,$ytop+500, "zak2.bmp", -1, 90)
WAITMS(800)
//проверяем проиграли мы или победили
sliv ()
//Закрываем бой
WAITMS(200)
LDOWN($_return1, $_return2)
WAITMS(200)
LUP($_return1, $_return2)
WAITMS(200)
MOVE($xtop+50, $ytop+100)
LOGWRITE ("бойзак")
$atak = 1
WAIT(1)
END_IF
END_IF
END_IF
END_IF
end_cyc
//boiend()
WAITMS(100)
END_SUB
SUB (rec)
//Проверка на выскакивающее окно с ошибкой реконект
LOGWRITE ("реконект?")
WAIT(2)
GETSCREEN
COLORMODE(6, $xtop, $ytop+80, $xtop+1240, $ytop+502)
IF_PICTURE_IN ($xtop, $ytop+80, $xtop+1240, $ytop+502, "rec.bmp", -1, 90)
LOGWRITE ("дА")
// Если окно найдено закрываем его
wAITMS(200)
LDOWN($_return1, $_return2)
wAITMS(100)
LUP($_return1, $_return2)
// И посылаем команду боя
wAITMS(200)
atak ()
Else
LOGWRITE ("Нет")
END_IF
END_SUB
SUB (boi)
//Проверяем бой начался или нет (определяется по кнопке призыва дракона, которая появляется во время боя)
LOGWRITE ("бой нач-ся?")
WAIT(2)
GETSCREEN
COLORMODE(6)
COLORMODE(6, $xtop, $ytop+60, $xtop+40, $ytop+72)
IF_PICTURE_IN ($xtop, $ytop+60, $xtop+40, $ytop+72, "prizv.bmp", -1, 90)
LOGWRITE ("дА")
// отправляем команду начать бой
atak ()
Else
LOGWRITE ("Нет")
//Не начался бой. уменьшаем счетчик убитых мобов на 1
INC($mob,-1)
END_IF
END_SUB
SUB (boii)
GETSCREEN
COLORMODE(6, $xtop+455,$ytop+430, $xtop+500,$ytop+465)
IF_PICTURE_IN ($xtop+455,$ytop+430, $xtop+500,$ytop+465, "an2.bmp", -1, 90)
atak ()
Else
LOGWRITE ("Бой начался")
END_IF
END_SUB
//Проведение проверок
SUB (prover)
//На наличие окна с реконектом
rec ()
//Начался ли бой (но дракон еще не призван)
boi ()
//Начался ли бой ( дракон уже призван)
boii ()
//На наличие окна с бонусами
bonus ()
//на наличие окна со статистикой
stat ()
//проверка вдруг бой уже закончился
GETSCREEN
COLORMODE(6, $xtop+400,$ytop+300, $xtop+1000,$ytop+500)
IF_PICTURE_IN ($xtop+400,$ytop+300, $xtop+1000,$ytop+500, "zak.bmp", -1, 90)
WAITMS(1000)
// если бой закончился проверяем проиграли или нет
sliv ()
WAITMS(200)
LDOWN($_return1+20, $_return2)
WAITMS(200)
LUP($_return1+20, $_return2)
WAITMS(200)
MOVE($xtop+50, $ytop+100)
LOGWRITE ("бойзак")
$atak = 1
WAIT(1)
END_IF
END_SUB
SUB (poisk)
$prov = 0
$poiskm = 0
// количество попыток найти моба (они перемещаются и могут быть не сразу найдены)
while ($poiskm <19)
INC($prov,1)
LOGWRITE ("поиск моба ",$prov )
//Ищем моба
GETSCREEN
COLORMODE(6, $xtop+209, $ytop+212, $xtop+240, $ytop+227)
IF_PICTURE_IN ($xtop+209, $ytop+212, $xtop+240, $ytop+227, "31.bmp", -1, 100)
// моб найден. заканчиваем поиски моба
$poiskm = 20
$prov = 0
//Нажимаем на картинку моба
DBLCLICK($_return1, $_return2-15)
WAITMS(50)
INC($mob,1)
LOGWRITE ("бой номер ", $mob)
LOGWRITE ("Бъем верхнего")
WAITMS(300)
//Отправляем команду на проверку начался бой или нет
boi()
WAIT(1)
Else
WAITMS(400)
INC($poiskm,1)
if ($prov > 18)
prover ()
END_IF
END_IF
END_CYC
END_SUB
SUB (drakhp)
//Проверка здоровья дракона
GETSCREEN
COLORMODE(6)
IF_PIXEL_IN ($xtop-3, $ytop+78, $xtop, $ytop+81, 4144959)
//низкое здоровье нажимаем на иконку еды (находится с небольшим смещением от еды персонажа)
LOGWRITE ("ДРАК Голод")
WAITMS(100)
MOVE($xeda+70, $yeda+19)
WAITMS(100)
LDOWN($xeda+70, $yeda+19)
WAITMS(100)
LUP($xeda+70, $yeda+19)
WAITMS(200)
MOVE($xeda+70, $yeda+100)
WAITMS(800)
else
//полоса здоровья нормальная для боя
LOGWRITE ("ДРАК сыт")
END_IF
END_SUB
GETSCREEN
COLORMODE(6)
// Расположение ОРИЕНТИРА по отношению к которой будем искать те или иные предметы.
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "xy.bmp", -1, 90)
$xtop = $_return1
$ytop = $_return2
LOGWRITE("X: ", $xtop," Y: ", $ytop)
// поиск предмета на карте, захватив который мы смещаем карту в нужное положение по отношению к ориентиру
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "ornt.bmp", -1, 90)
$xor = $_return1
$yor = $_return2
WAITMS(100)
LDOWN($xor,$yor)
WAITMS(50)
MOVE($xtop+258, $ytop+359)
WAITMS(50)
LUP($xtop+258, $ytop+359)
WAITMS(100)
//Поиск картинки с едой
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "eda.bmp", -1, 90)
$xeda = $_return1
$yeda = $_return2
LOGWRITE ("еда найдена")
$mob = 0
while ($mob <2000)
WAITMS(200)
//прверки на выскакивающие окна и на сытость песонажа и дракона
//Проверка на ежедневный бонус
bonus ()
//Проверка на ошибку реконект
rec ()
//Проверка на хп персонажа
hppers ()
//Проверка на хп дракона
drakhp ()
//Поиск моба
poisk ()
END_CYC
END_IF
END_IF
WAITMS(100)
LDOWN($xtop+1006, $ytop-35)
WAITMS(100)
LUP($xtop+1006, $ytop-35)
WAITMS(200)
END_IF
HALT