Всем привет!
Начал писать примитивного бота-кликера для DarkOrbit, который собирает коробки, рандомно тыкает по миникарте, улетает при виде врага (пока не сделал), и немного имитирует действия человека посредством рандома.
Для работы не подходит colormode, ибо тогда есть вероятность неправильного тыка. Для этого в настройках DO вставил низкое качество коробок (нет анимации).
Вместе с ботом использую самописную вспомогательную прогу на Алгоритме 2, которая добавляет 2 маркера области обнаружения и сбора коробок.
Проблема возникла после усложнения кода, бот начал вести себя неадекватно в некоторых случаях.
Вот код скрипта. В него добавил комментарии для ясности:
WAITMS(RND(90,110))
IF_PIXEL_IN(0,0,0,0, 255)
//Пока не сделано
ELSE
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "line.bmp")//Если обнаружена Миникарта (обнаружение идёт по полоске опасности слева от самой карты)
$click_to_mapX = RND($_return1+10,$_return1+191)//Рандомом выводим область клика в пределах карты по Х
$click_to_mapY = RND($_return2+6,$_return2+115) //Рандомом выводим область клика в пределах карты по Y
$mapBorderUpX = $_return1+10 //Задаём значения границ карты как переменные (4 строки)
$mapBorderUpY = $_return2+6
$mapBorderDownX = $_return1+191
$mapBorderDownY = $_return2+115
$mapCheckX = $_return1+194 //Задаём координаты точки, по которой в дальнейшем проверяем размер миникарты (2 строки)
$mapCheckY = $_return2+118
IF_PIXEL_IN($mapCheckX,$mapCheckY,$mapCheckX,$mapCheckY, 4013373) //Если карта имеет нужный размер...
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "uppoint.bmp")//Если замечена верхняя левая граница зоны сбора коробок (её ставлю с помощью отдельной проги)
$boxingZoneUpX = $_return1+64 //Пишем значения в переменные
$boxingZoneUpY = $_return2+64
ELSE //Иначе...
$boxingZoneUpX = $_xmax/2-300 //Устанавливаем зону сбора как поле 600х600 по центру экрана (2 строки)
$boxingZoneUpY = $_ymax/2-300
END_IF
F_PICTURE_IN (0,0, $_xmax,$_ymax, "downpoint.bmp")//То же самое с нижней правой границей (6 строк)
$boxingZoneDownX = $_return1-1
$boxingZoneDownY = $_return2-1
ELSE
$boxingZoneDownX = $_xmax/2+300
$boxingZoneDownY = $_ymax/2+300
END_IF
IF_PIXEL_IN($boxingZoneUpX,$boxingZoneUpY, $boxingZoneDownX,$boxingZoneDownY, 8242172)//Если видим коробку, кликаем по ней, рандомный клик по миникарте (задавали выше), ожидание, ещё раз клике, немного изменив значение рандома. Это нужно для имитаций действий человека.
LCLICK($_return1, $_return2)
WAITMS(RND(990,1100))
LCLICK($click_to_mapX, $click_to_mapY)
WAITMS(RND(200,300))
LCLICK($click_to_mapX+RND(-1,1), $click_to_mapY+RND(-1,1))
ELSE //иначе...
IF_PIXEL_IN($mapBorderUpX,$mapBorderUpY, $mapBorderDownX,$mapBorderDownY, 14054500)//Ищем пиксель, которым обозначается точка прибытия на миникарте в её пределах. Если пиксель есть- значит кораблик ещё летит. Ничего не делаем.
ELSE //Иначе...
LCLICK($click_to_mapX, $click_to_mapY) //Рандомно тыкаем по миникарте, имитируя действия человека.
WAITMS(RND(200,300))
LCLICK($click_to_mapX+RND(-1,1), $click_to_mapY+RND(-1,1))
END_IF
END_IF
ELSE //Если миникарта имеет неправильный размер, даём голосовое оповещение
SOUND("incorrect.wav")
END_IF
ELSE //Если миникарты не видно, даём голосовое оповещение
SOUND("forget.wav")
END_IF
END_IF