The Bytecode Club
Log inJoin the club
Video Game Reverse Engineering

Made a function to get exact amount of troops in camp

Started by Henk500 · Feb 20, 2015

14 replies217,703 views
Feb 20, 2015#1

NB: camp location is hard coded!!! this need to be changed to locate camp and use those coords!

this is for the devs that want to use this in their bot version
enclosed files reads the exact amount of troops in camp. this way you can start when troop in camp is >95%
nb: in the last script the camp location is hard coded. this need to be changed to do a locate, just like barracks
I've tested it, it works 100% for me
functions\Read Text\getCamp.au3

;==============================================================================================================
;===Get Digit=============================================================================================
;--------------------------------------------------------------------------------------------------------------
;Finds pixel color pattern of specific X and Y values, returns digit if pixel color pattern found.
;--------------------------------------------------------------------------------------------------------------
Func getCamp(ByRef $x, $y, $type)
Local $width = 0
;Search for digit 1
$width = 5
Select
Case $type = "Gold"
Local $c1 = Hex(0x070706, 6), $c2 = Hex(0xbebebe, 6), $c3 = Hex(0x9c9c9c, 6)
EndSelect
Local $pixel1[3] = [$x + 1, $y , $c1], $pixel2[3] = [$x + 2, $y + 3, $c2], $pixel3[3] = [$x + 2, $y + 9, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 1
Else ;Solves the problem when the spaces between the middle goes from 6 to 5 pixels
Local $pixel1[3] = [$x , $y , $c1], $pixel2[3] = [$x + 1, $y + 3, $c2], $pixel3[3] = [$x + 1, $y + 9, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 1
EndIf
EndIf
;Search for digit 2
$width = 8
Select
Case $type = "Gold"
Local $c1 = Hex(0x9f9f9f, 6), $c2 = Hex(0x010101, 6), $c3 = Hex(0x060606, 6)
EndSelect
Local $pixel1[3] = [$x + 4, $y + 7 , $c1], $pixel2[3] = [$x + 6, $y + 7, $c2], $pixel3[3] = [$x + 2, $y + 3, $c3]
;= [$x +1 , $y + 8, $c2], $pixel3[3] = [$x + 4, $y + 9, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 2
Else ;Solves the problem when the spaces between the middle goes from 6 to 5 pixels
Local $pixel1[3] = [$x + 3, $y + 7 , $c1], $pixel2[3] = [$x + 5, $y + 7, $c2], $pixel3[3] = [$x + 1, $y + 3, $c3]
;= [$x +1 , $y + 8, $c2], $pixel3[3] = [$x + 4, $y + 9, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 2
EndIf
EndIf
;Search for digit 3
$width = 8
Select
Case $type = "Gold"
Local $c1 = Hex(0x0e0e0e, 6), $c2 = Hex(0x000000, 6), $c3 = Hex(0x191919, 6)
EndSelect
Local $pixel1[3] = [$x + 4, $y + 3 , $c1], $pixel2[3] = [$x + 2, $y + 5, $c2], $pixel3[3] = [$x + 4, $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 3
Else
Local $pixel1[3] = [$x + 3, $y + 3 , $c1], $pixel2[3] = [$x + 1, $y + 5, $c2], $pixel3[3] = [$x + 3, $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 3
EndIf
EndIf
;Get digit 4
$width = 9
Select
Case $type = "Gold"
Local $c1 = Hex(0xb0b0b0, 6), $c2 = Hex(0xc9c9c9, 6), $c3 = Hex(0x7b7b7b, 6)
EndSelect
Local $pixel1[3] = [$x + 3, $y + 2, $c1], $pixel2[3] = [$x + 2, $y + 4, $c2], $pixel3[3] = [$x + 1, $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 4
Else
Local $pixel1[3] = [$x + 2, $y + 2, $c1], $pixel2[3] = [$x + 1, $y + 4, $c2], $pixel3[3] = [$x , $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 4
EndIf
EndIf
;Digit is 5
$width = 8
Select
Case $type = "Gold"
Local $c1 = Hex(0xb7b7b7, 6), $c2 = Hex(0x404040, 6), $c3 = Hex(0xa6a6a6, 6)
EndSelect
Local $pixel1[3] = [$x + 2, $y + 8 , $c1], $pixel2[3] = [$x + 1, $y + 1, $c2], $pixel3[3] = [$x + 4, $y + 6, $c3]
;= [$x +1 , $y + 8, $c2], $pixel3[3] = [$x + 4, $y + 9, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 5
Else
Local $pixel1[3] = [$x + 1, $y + 8 , $c1], $pixel2[3] = [$x , $y + 1, $c2], $pixel3[3] = [$x + 3, $y + 6, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 5
EndIf
EndIf
;Digit is 6
$width = 9
Select
Case $type = "Gold"
Local $c1 = Hex(0xa6a6a6, 6), $c2 = Hex(0x040404, 6), $c3 = Hex(0x030303, 6)
EndSelect
Local $pixel1[3] = [$x + 4, $y + 3 , $c1], $pixel2[3] = [$x + 5, $y + 7, $c2], $pixel3[3] = [$x + 7, $y + 3, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 6
Else
Local $pixel1[3] = [$x + 3, $y + 3 , $c1], $pixel2[3] = [$x + 4, $y + 7, $c2], $pixel3[3] = [$x + 6, $y + 3, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 6
EndIf
EndIf
;Digit is 7
$width = 8
Select
Case $type = "Gold"
Local $c1 = Hex(0xbfbfbf, 6), $c2 = Hex(0xcfcfcf, 6), $c3 = Hex(0xcfcfcf, 6)
EndSelect
Local $pixel1[3] = [$x + 4, $y + 2 , $c1], $pixel2[3] = [$x + 7, $y + 3, $c2], $pixel3[3] = [$x + 6, $y + 5, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 7
Else
Local $pixel1[3] = [$x + 3, $y + 2 , $c1], $pixel2[3] = [$x + 6, $y + 3, $c2], $pixel3[3] = [$x + 5, $y + 5, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 7
EndIf
EndIf
;Digit is 8
$width = 9
Select
Case $type = "Gold"
Local $c1 = Hex(0xd0d0d0, 6), $c2 = Hex(0x6f6f6f, 6), $c3 = Hex(0x040404, 6)
EndSelect
Local $pixel1[3] = [$x + 5, $y + 4 , $c1], $pixel2[3] = [$x + 5, $y + 2, $c2], $pixel3[3] = [$x + 5, $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 8
Else
Local $pixel1[3] = [$x + 4, $y + 4 , $c1], $pixel2[3] = [$x + 4, $y + 2, $c2], $pixel3[3] = [$x + 4, $y + 7, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 8
EndIf
EndIf
;Digit is 9
$width = 9
Select
Case $type = "Gold"
Local $c1 = Hex(0xbfbfbf, 6), $c2 = Hex(0x4d4d4d, 6), $c3 = Hex(0x070707, 6)
EndSelect
Local $pixel1[3] = [$x + 5, $y + 6 , $c1], $pixel2[3] = [$x + 5, $y + 7, $c2], $pixel3[3] = [$x + 5, $y + 3, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 9
Else
Local $pixel1[3] = [$x + 4, $y + 6 , $c1], $pixel2[3] = [$x + 4, $y + 7, $c2], $pixel3[3] = [$x + 4, $y + 3, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 9
EndIf
EndIf
;Digit is 0
$width = 10
Select
Case $type = "Gold"
Local $c1 = Hex(0x050505, 6), $c2 = Hex(0x080808, 6), $c3 = Hex(0xbdbdbd, 6)
EndSelect
Local $pixel1[3] = [$x + 5, $y + 4 , $c1], $pixel2[3] = [$x + 6, $y + 6, $c2], $pixel3[3] = [$x + 4, $y + 6, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 0
Else
Local $pixel1[3] = [$x + 4, $y + 4 , $c1], $pixel2[3] = [$x + 5, $y + 6, $c2], $pixel3[3] = [$x + 3, $y + 6, $c3]
If boolPixelSearch($pixel1, $pixel2, $pixel3) Then
$x += $width
Return 0
EndIf
EndIf
Return ""
EndFunc ;==>getDigit

functions\Read Text\fullCamp.au3

Func fullCamp($x_start, $y_start)
_CaptureRegion($x_start, $y_start, $x_start + 30, $y_start + 12)
;-----------------------------------------------------------------------------
;cause our picture is not the complete bs window, reset x and y
Local $x = 2, $y = 1
Local $Gold, $tests,$kweet, $tweede, $derde, $i = 0
$Gold = getCamp($x, $y, "Gold")
While $Gold = ""
If $i >= 4 Then ExitLoop
$i += 1
$x += 1
$Gold &= getCamp($x, $y, "Gold")
WEnd
;$x = 1
;while $x < 10
			;   $tests = _GetPixelColor($x, $y)
			;   setlog("y = 1 en x " & $x & " en " & $tests)
			 ;  $tests = _GetPixelColor($x, $y + 1)
			;   setlog("y = 2 en x " & $x & " en " & $tests)
			;   $x += 1
		   ; WEnd

			;$x = 1
            $Gold &= getCamp($x, $y, "Gold")
			$Gold &= getCamp($x, $y, "Gold")
			;$Gold &= getCamp($x, $y, "Gold")
            ;$Gold &= getCamp($x, $y, "Gold")
		 setlog("final waarde " & $Gold )

	Return $Gold
EndFunc

and the final function to run it all
NB: the camp location need to be fixed. in this script its hard coded and need to be change to locate camp just like barracks,
functions\Village\CheckFullArmy.au3

;checks camp to see how much troops are in it. if troops > 95% we attack
 Func CheckFullArmy()

   ClickP($TopLeftClient)
   Sleep(1000)
	Click(506,462)  ;need to make this the same as barracks, locate 1 camp!
	sleep(2000)
	Click(380,600)
	sleep(2000)
	local $result = fullCamp(586, 192)
	if ($result / $icmbTroopCap * 100) > 95 Then
	   $fullArmy = true
	   Setlog("Lets Attack! " & $result & " of total " & $icmbTroopCap & " Troops")
	   ClickP($TopLeftClient)
	   return True
	Else
	  Setlog("Not Enough troops " & $result & " of total " & $icmbTroopCap & " Troops")
	  $fullArmy = false
	  ClickP($TopLeftClient)
	  sleep(500)
	  ClickP($TopLeftClient)
	  return false
   EndIf

EndFunc
Feb 20, 2015#2

btw, i tested it with troops from 0 to 200
it was correct 100% of the time.

let me know if it works for you

Feb 20, 2015#3

Hi Henk, Looks great could you up-load the files for me and I will try it out. Thx and all the best!

Feb 20, 2015#4

you can copy paste all the code and name it as stated just before i add the code...

this is more for developpers so the can check fullarmy

Feb 20, 2015#5

will do n i'm back within short. thx

Feb 20, 2015#6

@Henk

I will try yours. Btw, you can actually read number of troops then calculate total capacity and then compare it to the total troop reading and get a screenshot incase they aren't equal.

can insert this code:
_ScreenCapture_CaptureWnd(@ScriptDir & "\CampDigits" & @MDAY & "." & @MON & "." & @YEAR & " at " & @HOUR & "." & @MIN & ".jpg", $hWnd)

Also, does it read 74? And in my opinion, it's best not to change checkfullarmy func and just separate it.

Feb 20, 2015#7

@Henk

I will try yours. Btw, you can actually read number of troops then calculate total capacity and then compare it to the total troop reading and get a screenshot incase they aren't equal.

can insert this code:
_ScreenCapture_CaptureWnd(@ScriptDir & "\CampDigits" & @MDAY & "." & @MON & "." & @YEAR & " at " & @HOUR & "." & @MIN & ".jpg", $hWnd)

Also, does it read 74? And in my opinion, it's best not to change checkfullarmy func and just separate it.

total capacity is read from what user fills in at attack settings.
like i said, ive tested it with troops from 0 to 200. all are read perfectly

i didnt had 1 false count

im not sure why you want to capture screenshot?

Feb 20, 2015#8
  1. How do you use this?, im still new here, you just replace existing?

  2. Also, can someone explain what it does iim of kinda slow lol. From what I understand it starts attack when army is > 95% so if i want a 100% army I jusy change to =100%?.

  3. Will this solve the bug. When i donate the bot doesnt build new army and gets stuck. Lol..

  4. Thank you guys for investing your time on this.

Feb 20, 2015#9

@henk500 is that code can get the exact troops you want to train like ex: if your camp capacity is 200 and u want to train 75 bar 75 arch and giants 1=5 for 10 =50 total of 200? or just to read the camp if full or not so the bot will sure 100% full camp before attacking base? btw thanks for adding function on this bot 🙂

Feb 20, 2015#10

Because it will automatically detect if there is a miss and you can actually use the screenshot for debug reference.

ex:
reading per troop then calculate total.

80 archers x1 =80
+
80 barbs x1 =80
+
8 giants x5= 40

Total as Calculated =200

Camp as read =200

if not equal then bot takes screenshot.

I'll test it all day once maintenance is over.

Got something to add?

Log in to post a reply.

Join the conversation