Доброго всем дня.
Не нашёл на форуме отдельного раздела, где делятся разрабатываемыми решениями - решил разместить сюда.
Что это?Делаю себе кликер для браузерной игры Throne:kingdom at war, решил поделиться ссылкой на текущие и будущие наработки.
Зачем?Во-первых, делюсь своими наработками, вдруг они кому-то будут интересны или даже полезны
Во-вторых, может кто увидит глупую ошибку/глупое решение и поможет это поправить - буду благодарен. За любую критику/советы так же буду благодарен.
В-третих, а почему бы и нет?
Что там реализовано?1) Хранение параметров в отдельном файле config.ini и его заполнение в ручном режиме (скрипты: ПереустановитьКоординатыТочек.cms и СозданиеINIфайла.cms)
2) Последовательные клики в разных местах экрана для выполнения разных действий
3) Простенькое меню и хот-кеи для выполнения данных скриптов
4) Есть заготовки для запуска фоновых процессов в виде "потоков"
Ссылка на гит:
https://github.com/zeltyr/clickermann/tree/master/GameBot/throne-kingdom-at-warТ.к. код ещё в работе, естественно, что со временем он может измениться
Код из файла-библиотеки и код, который крутится в фоне:
//библиотека стандартных решений для игры "Throne"
#logfile
$filename = "config.ini"
$coefficient = 1
$right_hand_mouse = INIREAD($filename, "right_hand_mouse")
$Button_Close_X = INIREAD($filename, "Button_Close_X","Button_Close")
$Button_Close_Y = INIREAD($filename, "Button_Close_Y","Button_Close")
$Button_CloseWide_X = INIREAD($filename, "Icon_CloseWide_X", "Button_CloseWide")
$Button_CloseWide_Y = INIREAD($filename, "Icon_CloseWide_Y", "Button_CloseWide")
//секция задания
$Icon_Errand_X = INIREAD($filename, "Icon_Errand_X", "Errand")
$Icon_Errand_Y = INIREAD($filename, "Icon_Errand_Y", "Errand")
$Icon_UsualErrand_X = INIREAD($filename, "Icon_UsualErrand_X", "Errand")
$Icon_UsualErrand_Y = INIREAD($filename, "Icon_UsualErrand_Y", "Errand")
$DeltaErrandX = INIREAD($filename, "DeltaErrandX", "Errand")
$Button_ErrandStart_X = INIREAD($filename, "Button_ErrandStart_X", "Errand")
$Button_ErrandStart_Y = INIREAD($filename, "Button_ErrandStart_Y", "Errand")
//секция сокровище
$Icon_Treasure_X = INIREAD($filename, "Icon_Treasure_X", "Treasure")
$Icon_Treasure_Y = INIREAD($filename, "Icon_Treasure_Y", "Treasure")
$Button_Claim_X = INIREAD($filename, "Button_Claim_X", "Treasure")
$Button_Claim_Y = INIREAD($filename, "Button_Claim_Y", "Treasure")
//секция основное меню
$Icon_MainMenu1_X = INIREAD($filename, "Icon_MainMenu1_X", "MainMenu")
$Icon_MainMenu1_Y = INIREAD($filename, "Icon_MainMenu1_Y", "MainMenu")
$Icon_MainMenu2_X = INIREAD($filename, "Icon_MainMenu2_X", "MainMenu")
$Icon_Guild_X = INIREAD($filename, "Icon_Guild_X", "MainMenu")
$Icon_Guild_Y = INIREAD($filename, "Icon_Guild_Y", "MainMenu")
$Icon_Watchman_X = INIREAD($filename, "Icon_Watchman_X", "MainMenu")
$Icon_Watchman_Y = INIREAD($filename, "Icon_Watchman_Y", "MainMenu")
$Icon_Workshop_X = INIREAD($filename, "Icon_Workshop_X", "MainMenu")
$Icon_Workshop_Y = INIREAD($filename, "Icon_Workshop_Y", "MainMenu")
//секция гильдия
$Icon_HelpOrderMembers_X = INIREAD($filename, "Icon_HelpOrderMembers_X", "Guild")
$Icon_HelpOrderMembers_Y = INIREAD($filename, "Icon_HelpOrderMembers_Y", "Guild")
$Button_HelpAll_X = INIREAD($filename, "Button_HelpAll_X", "Guild")
$Button_HelpAll_Y = INIREAD($filename, "Button_HelpAll_Y", "Guild")
//секция сбор ресурсов
$Icon_ResourcesChooseMenu_X = INIREAD($filename, "Icon_ResourcesChooseMenu_X", "Resources")
$Icon_ResourcesChooseMenu_Y = INIREAD($filename, "Icon_ResourcesChooseMenu_Y", "Resources")
$ResourcesChoose_X = INIREAD($filename, "ResourcesChoose_X", "Resources")
$HuntersSettlement_Y = INIREAD($filename, "HuntersSettlement_Y", "Resources")
$StonePit_Y = INIREAD($filename, "StonePit_Y", "Resources")
$LoggersCamp_Y = INIREAD($filename, "LoggersCamp_Y", "Resources")
$OreMine_Y = INIREAD($filename, "OreMine_Y", "Resources")
$Fief_Y = INIREAD($filename, "Fief_Y", "Resources")
$DeltaResourcesY = INIREAD($filename, "DeltaResourcesY", "Resources")
$Button_Capture_X = INIREAD($filename, "Button_Capture_X", "Resources")
$Button_Capture_Y = INIREAD($filename, "Button_Capture_Y", "Resources")
$Field_Army_X = INIREAD($filename, "Field_Army_X", "Resources")
$Field_Army_Y = INIREAD($filename, "Field_Army_Y", "Resources")
$Button_Send_X = INIREAD($filename, "Button_Send_X", "Resources")
$Button_Send_Y = INIREAD($filename, "Button_Send_Y", "Resources")
//секция Workshop
$Button_Titles_X = INIREAD($filename, "Button_Titles_X", "Workshop")
$Button_Titles_Y = INIREAD($filename, "Button_Titles_Y", "Workshop")
$Icon_Material_X = INIREAD($filename, "Icon_Material_X", "Workshop")
$Icon_Material_Y = INIREAD($filename, "Icon_Material_Y", "Workshop")
$Button_Combine_X = INIREAD($filename, "Button_Combine_X", "Workshop")
$Button_Combine_Y = INIREAD($filename, "Button_Combine_Y", "Workshop")
//$lX , $lY - координаты точки
sub(MoveAndClick, $lX , $lY)
$DelayR = RND(100, 150)
$LongDelayR = RND(650, 750)
move($lX,$lY)
waitms($DelayR)
IF($right_hand_mouse = 1)
lDown($lX,$lY)
waitms($DelayR)
lUp($lX,$lY)
ELSE
rDown($lX,$lY)
waitms($DelayR)
rUp($lX,$lY)
END_IF
//спец. задержка после нажатия. чтобы сервер обработал клик
//иначе много кликов пройдёт впустую
waitms($LongDelayR)
end_sub
SUB(DoErrands)
$ErrandsCount = INIREAD($filename, "ErrandsCount", "Errand")
//открываем окно выполнения заданий
MoveAndClick($Icon_Errand_X, $Icon_Errand_Y)
//на 3х вкладках выполняем задания
FOR($kv = 0, $kv < 3)
$lx = $Icon_UsualErrand_X + $kv * $DeltaErrandX
MoveAndClick($lx, $Icon_UsualErrand_Y)
FOR($a = 0, $a < $ErrandsCount)
MoveAndClick($Button_ErrandStart_X, $Button_ErrandStart_Y)
MoveAndClick($Button_ErrandStart_X, $Button_ErrandStart_Y)
END_CYC
END_CYC
MoveAndClick($Button_Close_X, $Button_Close_Y)
END_SUB
SUB(TakeTreasure)
//открываем окно выполнения заданий
MoveAndClick($Icon_Treasure_X, $Icon_Treasure_Y)
$LongDelayR = RND(650, 750)
waitms($LongDelayR)
MoveAndClick($Button_Claim_X, $Button_Claim_Y)
END_SUB
SUB(HelpOrderMembers)
MoveAndClick($Icon_MainMenu1_X, $Icon_MainMenu1_Y)
MoveAndClick($Icon_Guild_X, $Icon_Guild_Y)
MoveAndClick($Icon_HelpOrderMembers_X, $Icon_HelpOrderMembers_Y)
MoveAndClick($Button_HelpAll_X, $Button_HelpAll_Y)
MoveAndClick($Button_Close_X, $Button_Close_Y)
MoveAndClick($Button_CloseWide_X, $Button_CloseWide_Y)
END_SUB
SUB(OpenWatchman)
MoveAndClick($Icon_MainMenu1_X, $Icon_MainMenu1_Y)
MoveAndClick($Icon_Watchman_X, $Icon_Watchman_Y)
END_SUB
SUB(ChooseResource, $ResourceTypel)
//вызвали подменю
MoveAndClick($Icon_ResourcesChooseMenu_X,$Icon_ResourcesChooseMenu_Y)
SWITCH($ResourceTypel)
CASE(1)
//выбрали еду
MoveAndClick ($ResourcesChoose_X, $HuntersSettlement_Y)
$coefficient = 1
CASE(2)
//выбрали камень
MoveAndClick ($ResourcesChoose_X, $StonePit_Y)
$coefficient = 0.8
CASE(3)
//выбрали дерево
MoveAndClick ($ResourcesChoose_X, $LoggersCamp_Y)
$coefficient = 0.8
CASE(4)
//выбрали железо
MoveAndClick ($ResourcesChoose_X, $OreMine_Y)
$coefficient = 0.6
CASE(5)
//выбрали серебро
MoveAndClick ($ResourcesChoose_X, $Fief_Y)
$coefficient = 0.4
DEFAULT
//выбрали еду
MoveAndClick ($ResourcesChoose_X, $HuntersSettlement_Y)
$coefficient = 1
END_SWITCH
END_SUB
SUB(TakeResource, $pResourceType, $pNumberOfSoldiers, $pSdvig, $pSecondArmy)
OpenWatchman()
ChooseResource($pResourceType)
MoveAndClick($Button_Capture_X, $Button_Capture_Y + $pSdvig * $DeltaResourcesY)
MoveAndClick($Field_Army_X, $Field_Army_Y)
KEYSTRING($pNumberOfSoldiers*$coefficient)
IF($pSecondArmy = 2)
MoveAndClick($Field_Army_X,$Field_Army_Y + 100)
KEYSTRING($pNumberOfSoldiers*$coefficient)
END_IF
MoveAndClick($Button_Send_X,$Button_Send_Y)
//закрыть маленькое окно
//$Ystart = $Field_CheckScreen_Ystart + $a * $DeltaY
//$Yend = $Field_CheckScreen_Yend + $a * $DeltaY
//GETSCREEN ($Field_CheckScreen_Xstart, $Ystart, $Field_CheckScreen_Xend, $Yend)
// LOGWRITE ($Field_CheckScreen_Xstart, $Ystart, $Field_CheckScreen_Xend, $Yend)
//IF_PIXEL_IN($Field_CheckScreen_Xstart, $Ystart, $Field_CheckScreen_Xend, $Yend, $Color_ResourceNotClear
// LOGWRITE ("Цвет найден")
//ELSE
// LOGWRITE ("Цвет не найден")
//Координаты области экрана по которой будем проверять, что ресурс занят
// $Field_CheckScreen_Xstart = 1107
// $Field_CheckScreen_Ystart = 623
//
// $Field_CheckScreen_Xend = 1188
// $Field_CheckScreen_Yend = 646
//
// $Color_ResourceNotClear = 1384091
// END_IF
END_SUB
SUB(OpenWorkshop)
MoveAndClick($Icon_MainMenu2_X, $Icon_MainMenu1_Y)
MoveAndClick($Icon_Workshop_X, $Icon_Workshop_Y)
END_SUB
SUB(CreateMaterial, $NumberofMaterial)
OpenWorkshop()
MoveAndClick($Button_Titles_X, $Button_Titles_Y)
$Num = INT($NumberofMaterial)
FOR($a = 0,$a<$Num)
MoveAndClick($Icon_Material_X, $Icon_Material_Y)
MoveAndClick($Button_Combine_X, $Button_Combine_Y)
END_CYC
MoveAndClick($Button_CloseWide_X, $Button_CloseWide_Y)
END_SUB
тело основного скрипта:
#include "thronelib.cms"
#logfile
//основной алгоритм
//LOGCLEAR
// поток
THREAD(thr_name)
#include "thronelib.cms"
HelpOrderMembers()
waitms(5*RND(60,120)*1000)
END_THREAD
THREAD(thr_name1)
#include "thronelib.cms"
waitms(10*1000)
DoErrands()
TakeTreasure()
waitms(60*60*1000)
END_THREAD
SUB (ExecuteSelected, $Numner)
//нажать руку помощи
IF($Numner = 1)
HelpOrderMembers()
END_IF
//2 собрать сокровища
IF($Numner = 2)
TakeTreasure()
END_IF
//выполнить задания
IF($Numner = 3)
DoErrands()
END_IF
IF($Numner = 4)
move(945, 707)
$NumberofMaterial = INPUTBOX("Cколько материалов вы хотите создать?", "5", 20)
CreateMaterial($NumberofMaterial)
END_IF
IF($Numner = 5)
//позволяет выбрать сколько видов войск вы хотите отправить на ресурс
$ArmyTypes = RADIOBOX("Сколько видов войск отправить?", "1", "2")
$ArmyTypes = INT($ArmyTypes)
$NumberofSolder = INPUTBOX("Укажите количество войск в каждом виде:", "5000", 20)
$NumberofSolder = INT($NumberofSolder)
//2 на еду
TakeResource(1, $NumberofSolder, 0, $ArmyTypes)
TakeResource(1, $NumberofSolder, 1, $ArmyTypes)
//2 на железо
TakeResource(2, $NumberofSolder, 0, $ArmyTypes)
TakeResource(2, $NumberofSolder, 1, $ArmyTypes)
//2 на серебро
TakeResource(4, $NumberofSolder, 0, $ArmyTypes)
TakeResource(4, $NumberofSolder, 1, $ArmyTypes)
END_IF
IF($Numner = 6)
//послать на 1 ресурс
$ResourceType = RADIOBOX("На какой ресурс отправить войска?", "1 - еда", "2 - камень", "3 - дерево", "4 - железо", "5 - серебро")
$ResourceType = INT(STRCUT($ResourceType, 1, 1))
$ArmyTypes = RADIOBOX("Сколько видов войск отправить?", "1", "2")
$ArmyTypes = INT($ArmyTypes)
$NumberofSolder = INPUTBOX("Укажите количество войск в каждом виде:", "5000", 20)
LOGWRITE ($NumberofSolder)
//$NumberofSolder = INT($NumberofSolder)
$String = RADIOBOX("1й или 2й ближайший ресурс собирать?", "1", "2")
$String = INT($String) - 1
IF($NumberofSolder ! 0 AND $ArmyTypes ! 0)
TakeResource($ResourceType, $NumberofSolder, $String, $ArmyTypes)
END_IF
END_IF
END_SUB
IF(ISKEYDOWN(#ALT)=1)
IF(ISKEYDOWN(#1) = 1)
$Result = RADIOBOX("Что вы хотите сделать?", "1 - Нажать руку помощи", "2 - Забрать сокровище", "3 - Выполнить задания", "4 - Создать материалы", "5 - (ТЕСТ) Сбор ближайших ресурсов", "6 - (ТЕСТ) Сбор одного ресурса")
$Result = INT(STRCUT($Result, 1, 1))
IF($Result ! 0)
ExecuteSelected($Result)
END_IF
END_IF
IF(ISKEYDOWN(#2) = 1)
ExecuteSelected(1)
END_IF
IF(ISKEYDOWN(#3) = 1)
ExecuteSelected(2)
END_IF
IF(ISKEYDOWN(#4) = 1)
ExecuteSelected(3)
END_IF
IF(ISKEYDOWN(#5) = 1)
ExecuteSelected(4)
END_IF
IF(ISKEYDOWN(#6) = 1)
ExecuteSelected(5)
END_IF
IF(ISKEYDOWN(#7) = 1)
ExecuteSelected(6)
END_IF
WAITMS(50)
END_IF
setThread(thr_name, 0)
setThread(thr_name1, 0)
WAITMS(20)
П.С. Если тему посчитаете не нужной - можно её смело удалять