ALERT: long post
1. LocateTH
i've written this function and put a button to trigger it manually while visiting a village for testing purposes. what am i missing?
running 32bit exe, no th found. is there some other functions /variables to initiate before _CaptureRegion() ?
Code:
Func LocateTH() ; locates TH
Global $atkTHs[5] = [$atkTH6,$atkTH7,$atkTH8,$atkTH9,$atkTH10]
_CaptureRegion()
$THLocation1 = 0
$searchTH1 = "-"
for $i = 0 to 4
$THLocation1 = _ImageSearch($atkTHs[$i], 1, $THx1, $THy1, $Tolerance1) ; Getting TH Location
If $THLocation1 = 1 Then
if $i = 0 Then
$searchTH1 = '"4-' & $i+6 & '"'
Else
$searchTH1 = '"' & $i+6 & '"'
EndIf
ExitLoop
EndIf
Next
If $THx1 > 227 And $THx1 < 627 And $THy1 > 151 And $THy1 < 419 And $searchTH1 <> "-" Then
$THLoc1 = "Inside"
Else
$THLoc1 = "Outside"
EndIf
SetLog("located townhall: " & $searchTH1 & " @" & $THx1 & "," & $THy1 & ". It's " & $THLoc1)
EndFunc
this is the output
Code:
located townhall: - @0,0. It's -
2. revised CompareResources
this is my revised CompareResources to meet ALL conditions specified - (gold/elixir AND max th) - for example.
Code:
Func CompareResources() ;Compares resources and returns true if conditions meet, otherwise returns false
If GUICtrlRead($chkMeetTH) <> $GUI_CHECKED Then
$MaxTH = "-"
EndIf
If $SearchCount <> 0 And Mod($SearchCount, 20) = 0 Then
If $MinGold - 2000 >= 0 Then $MinGold -= 2000
If $MinElixir - 2000 >= 0 Then $MinElixir -= 2000
If $MinDark - 100 >= 0 Then $MinDark -= 100
If $MinTrophy - 2 >= 0 Then $MinTrophy -= 2
SetLog("~Gold: " & $MinGold & "; Elixir: " & $MinElixir & "; Dark: " & $MinDark & "; Trophy: " & $MinTrophy & "; Townhall: " & $MaxTH)
EndIf
Local $G = (Number($searchGold) >= Number($MinGold)), $E = (Number($searchElixir) >= Number($MinElixir)), $D = (Number($searchDark) >= Number($MinDark)), $T = (Number($searchTrophy) >= Number($MinTrophy))
Local $THL = -1, $THLO = -1
Switch $searchTH
Case "4-6"
$THL = 0
Case "7"
$THL = 1
Case "8"
$THL = 2
Case "9"
$THL = 3
Case "10"
$THL = 4
EndSwitch
Switch $THLoc
Case "Inside"
$THLO = 0
Case "Outside"
$THLO = 1
EndSwitch
Local $chkMeetGxE_bool = True
Local $chkMeetDE_bool = True
Local $chkMeetTrophy_bool = True
Local $chkMeetGorE_bool = True
Local $chkMeetTH_bool = True
Local $chkMeetTHO_bool = True
If GUICtrlRead($chkMeetGxE) = $GUI_CHECKED Then
If $G = False Or $E = False Then
$chkMeetGxE_bool = False
EndIf
EndIf
If GUICtrlRead($chkMeetDE) = $GUI_CHECKED Then
If $D = False Then
$chkMeetDE_bool = False
EndIf
EndIf
If GUICtrlRead($chkMeetTrophy) = $GUI_CHECKED Then
If $T = False Then
$chkMeetTrophy_bool = False
EndIf
EndIf
If GUICtrlRead($chkMeetGorE) = $GUI_CHECKED Then
If $G = False And $E = False Then
$chkMeetGorE_bool = False
EndIf
EndIf
If GUICtrlRead($chkMeetTH) = $GUI_CHECKED Then
If $THL > _GUICtrlComboBox_GetCurSel($cmbTH) And ZombieSearch() = False Then
$chkMeetTH_bool = False
EndIf
EndIf
If GUICtrlRead($chkMeetTHO) = $GUI_CHECKED Then
If $THLO <> 1 Then
$chkMeetTHO_bool = False
EndIf
EndIf
Local $Boolean = $chkMeetGxE_bool And $chkMeetDE_bool And $chkMeetTrophy_bool And $chkMeetGorE_bool And $chkMeetTH_bool And $chkMeetTHO_bool
Return $Boolean
EndFunc ;==>CompareResources
please note i've added the option to attack the base even if th > than specified IF that village is deadbase. don't know if could work as i'm having problems with deadbase/imagesearch as per first point
3. other issues
a. i would like to take screenshots of what the bot considers zombies or not dead bases when attacking with the option deadbase, testing purposes. this is what i've added
Code:
DirCreate(@ScriptDir & "\Dead\")
DirCreate(@ScriptDir & "\unDead\")
and the modified villagesearch
Code:
Func VillageSearch() ;Control for searching a village that meets conditions
While 1
Switch $iradAttackMode
Case 0
SetLog("============Searching For Dead Base============")
Case 1
SetLog("============Searching For Weak Base============")
Case 2
SetLog("============Searching For All Base============")
EndSwitch
SetLog("~Gold: " & $MinGold & "; Elixir: " & $MinElixir & "; Dark: " & $MinDark & "; Trophy: " & $MinTrophy & "; Townhall: " & $MaxTH)
$SearchCount = 0
$OptimizeSleep = 0
While 1
If _Sleep(1000) Then ExitLoop (2)
GetResources() ;Reads Resource Values
If $Restart = True Then ExitLoop (2)
If CompareResources() Then
If $iradAttackMode = 0 Then
If ZombieSearch() Then
SetLog("~~~~~~~Dead Base Found!~~~~~~~")
Local $Date = @MDAY & "." & @MON & "." & @YEAR
Local $Time = @HOUR & "." & @MIN& "." & @SEC
_CaptureRegion()
_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Dead\" & $Date & " at " & $Time & ".jpg")
ExitLoop
Else
SetLog("~~~~~~~Not dead base, skipping~~~~~~~")
Local $Date = @MDAY & "." & @MON & "." & @YEAR
Local $Time = @HOUR & "." & @MIN & "." & @SEC
_CaptureRegion()
_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\unDead\" & $Date & " at " & $Time & ".jpg")
Click(750, 500) ;Click Next
EndIf
Else
ExitLoop
EndIf
Else
Click(750, 500) ;Click Next
EndIf
WEnd
If GUICtrlRead($chkAlertSearch) = $GUI_CHECKED Then
TrayTip("Match Found!", "Gold: " & $searchGold & "; Elixir: " & $searchElixir & "; Dark: " & $searchDark & "; Trophy: " & $searchTrophy & "; Townhall: " & $searchTH & "", 0)
If FileExists(@WindowsDir & "\media\Windows Exclamation.wav") Then
SoundPlay(@WindowsDir & "\media\Windows Exclamation.wav", 1)
Else
SoundPlay(@WindowsDir & "\media\Festival\Windows Exclamation.wav", 1)
EndIf
EndIf
SetLog("===============Searching Complete===============")
readConfig()
ExitLoop
WEnd
EndFunc ;==>VillageSearch
b.troop donation
i found out my clanmate with 30 spaces in clan castle wasn't getting troops donated. the solution has been to change every occurrence of
Code:
Click(($DonateTroop[0]+200), ($DonateTroop[1]-20),5) ; donate archer
with
Code:
Click(($DonateTroop[0]+200), ($DonateTroop[1]-30),5) ; donate archer
it seems to work fine with this change for everyone.
c. Train()
you have missed the last click to close the 4th barrack so the bot behaves weird
this is just the end of the function with the 2 lines to add back
Code:
EndIf
If _Sleep(500) Then ExitLoop (2)
Click(1, 1, 2, 250); Click away twice with 250ms delay
Next
SetLog("Training Troops Complete")
ExitLoop
WEnd
EndFunc ;==>Train
d. idle()
i was thinking, is the "if" statement outside the "while" one necessary?
Code:
If $fullArmy = False Then
While $fullArmy = False
by looking at the function i would say no, so we could clean more code
that's almost all, for now