매크로 프로그램 중 가장 강력한 기능을 자랑하는 프로그램. 다른 매크로 프로그램과는 달리 스크립트 언어를 이용하여 매크로를 만든다. 온라인 게임 자동 사냥에도 많이 쓰이는 프로그램이라 게임 제작 업체에게는 골치 아픈 존재.
다음은 디아블로3의 자동 사냥 예제1)이다.
;실행 단축키는 Home 입니다
;종료는 X 입니다
$win = "디아블로 III"
WinActivate($win, "")
Global $Paused
Global $i = 0, $j = 0
Global $hgame = 8 ;여기 설정된 숫자만큼 눅눅이 잡은 후 상인에게 수리받음
Global $sellmagic = False ;True 로 수정하면 매직템 줍고, 상점에 팔고
Global $gamelog = False ;True 로 수정하면 구글드라이브 로그 남김 기능 작동
HotKeySet("{Home}", "Leave") ;시작키
HotKeySet("{End}", "Pause") ;일시정지
HotKeySet("x", "Stop") ;중지
$go = True
$Leave = False
ToolTip("방을 만든 후" & @CRLF & "HOME 키를 누르면 시작합니다", 0, 0)
While $go
If ($Leave) Then
ingame()
EndIf
WEnd
Func error_check() ; <--- 방만들기 실패 체크
$game1 = Hex(PixelGetColor(286, 273), 6) ;오류메세지 확인
If $game1 = "000000" Then
write_log(10)
ToolTip("Failed to create Game", 0, 0)
Sleep(1000)
Send("{Enter}")
Sleep(10000)
MouseClick("left", 189, 254) ;게임 계속하기
Sleep(3000)
EndIf
EndFunc ;==>error_check
Func ingame()
$game = Hex(PixelGetColor(239, 614), 6)
If $game = "000000" Then
write_log(1)
ToolTip("", 0, 0)
gogogo()
Else
ToolTip("Not in game", 0, 0)
Sleep(1000)
error_check()
EndIf
EndFunc ;==>ingame
Func repair()
If $j < $hgame Then
$j = $j + 1
Else
MouseClick("left", 688, 48) ;상인한테 가기
Sleep(2300)
MouseClick("left", 510, 150) ;상인한테
Sleep(2400)
If $sellmagic = True Then
clearbag() ; 비우기
EndIf
MouseClick("left", 296, 299) ;수리탭
Sleep(500)
MouseClick("left", 200, 356) ;수리하기
Sleep(500)
MouseClick("left", 286, 31) ;창닫기
Sleep(500)
$j = 0
If $sellmagic = True Then
gotochest() ; 창고로 이동
EndIf
EndIf
EndFunc ;==>repair
Func gotochest()
MouseClick("left", 170, 514) ; 보관함 이동
Sleep(3000)
MouseClick("left", 93, 493) ; 보관함 클릭
Sleep(3000)
MouseClick("left", 292, 227) ; 두번째 가방 클릭
Sleep(1200)
clearbag() ; 보관하기
Sleep(1500)
MouseClick("left", 286, 31) ;창닫기
EndFunc ;==>gotochest
Func clearbag() ; 인벤 위에서부터 4줄(40칸) 다 비움
Local $row = 0, $line = 0, $x = 531, $y = 361
While $line < 4
While $row < 10
MouseClick("right", $x, $y)
$x = $x + 28
$row = $row + 1
WEnd
$row = 0
$line = $line + 1
$y = $y + 27
$x = 531
WEnd
EndFunc ;==>clearbag
Func gogogo()
If checkdie() = 1 Then
Send("4")
Sleep(500)
MouseMove(222, 69, 1)
Send("m")
Sleep(2000)
MouseMove(32, 303, 1)
Send("2")
Send("m")
Sleep(1600)
MouseMove(32, 303, 1)
Send("m")
Sleep(300)
Send("1")
Sleep(1400)
Send("1")
MouseMove(32, 303, 1)
Send("m")
Sleep(1700)
Send("3")
Send("1")
Sleep(300)
Local $Pixel02 = PixelSearch(655, 100, 700, 140, 0xEBC02C, 14);눅눅 열렸는지 확인
If Not @error Then
MouseClick("left", 160, 97, 1) ;눅눅 들어가기
Sleep(500)
Send("2")
Sleep(2500)
Local $Pixel02 = PixelSearch(655, 100, 720, 150, 0xD4813E, 14);눅눅 열렸는지 확인
If @error Then
If checkdie() = 1 Then
MouseClick("left", 139, 493, 1)
Sleep(2500)
MouseClick("left", 205, 278, 1)
Sleep(2000)
MouseMove(287, 195, 1) ; sara
Send("4")
Sleep(200)
Send("{shiftdown}")
MouseDown("right")
Sleep(6000)
MouseUp("right")
MouseDown("left")
Sleep(8000)
MouseUp("left")
Send("{shiftup}")
MouseMove(262, 189)
Send("m") ;담비가 골드 줍는 동안 대기
Sleep(1000)
Send("4")
Sleep(3000)
loot()
Send("4")
Sleep(3000)
Send("t")
Sleep(8000)
repair()
quitgame()
Else
write_log(12)
quitgame()
EndIf
Else
write_log(12)
quitgame()
EndIf
Else
If checkdie() = 1 Then
write_log(2)
MouseClick("left", 560, 40) ;위로 이동 후 귀환
Sleep(200)
Send("2")
Sleep(1600)
Send("1")
Sleep(600)
Send("t")
Sleep(9500)
quitgame()
EndIf
EndIf
EndIf
EndFunc ;==>gogogo
Func loot()
checkrare()
checkseti()
checkmagic()
checklegend()
checkgems()
EndFunc ;==>loot
Func checkmagic()
If $sellmagic = True Then
Send("{Alt}") ; 매직아이템 찾기
Sleep(500)
Local $count = 0
Local $magic = PixelSearch(166, 125, 620, 436, 0x6969FF, 5)
While IsArray($magic) = True And $count < 5
$magic = PixelSearch(166, 125, 620, 436, 0x6969FF, 5)
If IsArray($magic) = True Then
MouseMove($magic[0], $magic[1], 1)
Sleep(500)
MouseClick("left", $magic[0], $magic[1])
Sleep(1000)
EndIf
$count = $count + 1
;;;;;write_log(7)
WEnd
EndIf
EndFunc ;==>checkmagic
Func checkseti()
Send("{Alt}") ; 세트 아이템 찾기
Sleep(500)
Local $count = 0
Local $setitem = PixelSearch(166, 125, 620, 436, 0x00FF00, 2)
While IsArray($setitem) = True And $count < 5
$setitem = PixelSearch(166, 125, 620, 436, 0x00FF00, 2)
If IsArray($setitem) = True Then
MouseMove($setitem[0], $setitem[1], 1)
Sleep(500)
MouseClick("left", $setitem[0], $setitem[1])
Sleep(1400)
;;write_log(7)
EndIf
$count = $count + 1
WEnd
EndFunc ;==>checkseti
Func checkrare()
Send("{Alt}") ; 노란템 찾기
Sleep(500)
Local $count = 0
Local $rare = PixelSearch(166, 125, 620, 436, 0xFFFF00, 2)
While IsArray($rare) = True And $count < 5
$rare = PixelSearch(166, 125, 620, 436, 0xFFFF00, 2)
If IsArray($rare) = True Then
MouseMove($rare[0], $rare[1], 1)
Sleep(500)
MouseClick("left", $rare[0], $rare[1])
Sleep(1400)
write_log(7)
EndIf
$count = $count + 1
WEnd
EndFunc ;==>checkrare
Func checklegend();전설템 찾기
Local $count = 0
Local $Pixel2 = PixelSearch(166, 125, 620, 436, 0x2F64BF, 2)
While IsArray($Pixel2) = True And $count < 5
$Pixel2 = PixelSearch(166, 125, 620, 436, 0x2F64BF, 2)
If IsArray($Pixel2) = True Then
MouseMove($Pixel2[0], $Pixel2[1], 1)
Sleep(500)
MouseClick("left", $Pixel2[0], $Pixel2[1])
Sleep(1400)
;write_log(8)
EndIf
$count = $count + 1
WEnd
EndFunc ;==>checklegend
Func checkgems()
$count = 0
Local $ameth = PixelSearch(166, 125, 620, 436, 0xAC6DE9, 8)
While IsArray($ameth) = True And $count < 5
$ameth = PixelSearch(166, 125, 620, 436, 0xAC6DE9, 8)
If IsArray($ameth) = True Then
MouseMove($ameth[0], $ameth[1], 1)
Sleep(500)
MouseClick("left", $ameth[0], $ameth[1])
Sleep(1400)
write_log(3)
EndIf
$count = $count + 1
WEnd
$count = 0
Local $Ruby = PixelSearch(166, 125, 620, 436, 0xFE8C81, 5)
While IsArray($Ruby) = True And $count < 5
$Ruby = PixelSearch(166, 125, 620, 436, 0xFE8C81, 5)
If IsArray($Ruby) = True Then
MouseMove($Ruby[0], $Ruby[1], 1)
Sleep(500)
MouseClick("left", $Ruby[0], $Ruby[1])
Sleep(1400)
write_log(5)
EndIf
$count = $count + 1
WEnd
$count = 0
Local $Emer = PixelSearch(166, 125, 620, 436, 0x63D753, 8)
While IsArray($Emer) = True And $count < 5
$Emer = PixelSearch(166, 125, 620, 436, 0x63D753, 8)
If IsArray($Emer) = True Then
MouseMove($Emer[0], $Emer[1], 1)
Sleep(500)
MouseClick("left", $Emer[0], $Emer[1])
Sleep(1400)
write_log(4)
EndIf
$count = $count + 1
WEnd
$count = 0
Local $Topa = PixelSearch(166, 125, 620, 436, 0xFFFF49, 2)
While IsArray($Topa) = True And $count < 5
$Topa = PixelSearch(166, 125, 620, 436, 0xFFFF49, 2)
If IsArray($Topa) Then
MouseMove($Topa[0], $Topa[1], 1)
Sleep(500)
MouseClick("left", $Topa[0], $Topa[1])
Sleep(1400)
write_log(6)
EndIf
$count = $count + 1
WEnd
EndFunc ;==>checkgems
Func checkdie()
Local $Died = PixelSearch(535, 205, 556, 234, 0xFFFFFF, 1)
If Not @error Then
write_log(9)
Call("quitgame")
Call("ingame")
Return 2
EndIf
Return 1
EndFunc ;==>checkdie
Func quitgame()
Send("{esc}")
Sleep(200)
MouseClick("left", 425, 310) ;게임 나가기
Sleep(13000)
If $i < 40 Then
$i = $i + 1
Sleep(Random(1000, 3000)) ;방 만들기 전 2초~5초간 대기
MouseClick("left", 189, 254) ;게임 계속하기
Sleep(3000)
Else
$i = 0
ToolTip("쉬는 시간입니다 -0-", 0, 0)
write_log(0)
Sleep(Random(200000, 300000)) ;20방 돌고나서 300초에서 400초간 대기
MouseClick("left", 189, 254) ;게임 계속하기
Sleep(3000)
EndIf
EndFunc ;==>quitgame
Func write_log($val)
$path = '\Google Drive\log.txt'
$file = FileOpen(@UserProfileDir & $path, 1)
$timestamp = @YEAR & "." & @MON & "." & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
If $gamelog = True Then
Select
Case $val = 1
$text = "방을 만들었습니다"
Case $val = 2
$text = "눅눅이가 외출중입니다"
Case $val = 3
$text = "자수정 입니다"
Case $val = 4
$text = "에메랄드 입니다"
Case $val = 5
$text = "루비 입니다"
Case $val = 6
$text = "토파즈 입니다"
Case $val = 7
$text = "레어 아이템을 획득했습니다"
Case $val = 8
$text = "전설 아이템을 획득했습니다"
Case $val = 9
$text = "죽었습니다 형님 ㅠㅠ"
Case $val = 0
$text = "----- 쫌만 쉬었다가 하겠습니다 -----"
Case $val = 10
$text = "<<<방 만들기 실패>>>"
Case $val = 12
$text = "Failed to enter cellar"
EndSelect
FileWriteLine($file, $timestamp & " " & $text)
FileClose($file)
EndIf
EndFunc ;==>write_log
Func Pause()
$Leave = False
EndFunc ;==>Pause
Func Stop()
Exit
EndFunc ;==>Stop
Func Leave()
$Leave = True
EndFunc ;==>Leave