Author Topic: Пример использования Clickermann в игре Throne:kingdom at war  (Read 3650 times)

0 Members and 1 Guest are viewing this topic.

VdovenkoSergey

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Доброго всем дня.
Не нашёл на форуме отдельного раздела, где делятся разрабатываемыми решениями - решил разместить сюда.

Что это?
Делаю себе кликер для браузерной игры Throne:kingdom at war, решил поделиться ссылкой на текущие и будущие наработки.

Зачем?
Во-первых, делюсь своими наработками, вдруг они кому-то будут интересны или даже полезны
Во-вторых, может кто увидит глупую ошибку/глупое решение и поможет это поправить - буду благодарен. За любую критику/советы так же буду благодарен.
В-третих, а почему бы и нет?  ;D

Что там реализовано?
1) Хранение параметров в отдельном файле config.ini и его заполнение в ручном режиме (скрипты: ПереустановитьКоординатыТочек.cms и СозданиеINIфайла.cms)
2) Последовательные клики в разных местах экрана для выполнения разных действий
3) Простенькое меню и хот-кеи для выполнения данных скриптов
4) Есть заготовки для запуска фоновых процессов в виде "потоков"

Ссылка на гит: https://github.com/zeltyr/clickermann/tree/master/GameBot/throne-kingdom-at-war
Т.к. код ещё в работе, естественно, что со временем он может измениться

Код из файла-библиотеки и код, который крутится в фоне:
Code: [Select]
//библиотека стандартных решений для игры "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

тело основного скрипта:
Code: [Select]
#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)

П.С. Если тему посчитаете не нужной - можно её смело удалять