상세 컨텐츠

본문 제목

크루세이더 퀘스트 매크로 [5강] 진정한 예외처리, 최종 코드 v2.0

자작프로그램/히로/프렙-Mobile

by Rahs 2015. 2. 16. 21:36

본문


3강에서 예외처리란 말만 하고 실제로 다뤘던 건 "놓친 부분에 대한 보강"이었는데

이 장에서는 예외처리의 개념과 0강에서 잠시 언급했던 그 방법론적인 부분을 한번 짚어보고 코드 보겠습니다.


쉽게 말해 예외처리는 아래와 같은 상황에서도 프로그램이 원래의 목적을 향해 돌아갈 수 있도록 하는 것입니다.


일반적인 상황이라면 좌표 (0,0)에 검은색(0x000000)이 나타날 순서로, 매크로는 검은색이 나타나길 기다리고 있는 상태


그 상황에서 특정한 상황(예를 들어 온라인 게임이라면 친구의 귓말이 온다던가, 윈도우 업데이트 창이 뜬다던가?) 발생으로


그 검은색이 나타날 (0,0)자리에 검은색이 나타나지 않게 된 경우」▶ 매크로는 영원히 더 이상 진행되지 않습니다.



0강에서 간단하게 다뤘던 개념이지요 :)

자, 이제 제가 어설프게 구현한 watchdog이라는 것을 잠시 보시겠습니다. watchdog의 개념은 제가 설명할 수 있는 것보다

몇 십만배로 더 잘 설명된 블로그나 웹페이지가 많으니 생략하도록 하고 제가 구현한 watchdog은 아래와 같습니다.

var #watchdogcnt 0

var #limit 500



:STEP1

if #watchdogcnt > #limit

goto :watchdog

endif


// 조건분기

// 조건이 참이면

goto :STEP2

// 조건이 거짓이면

calc #watchdogcnt #watchdogcnt + 1

goto :STEP1

endif


:STEP2

// 다음 내용 시작과 동시에 watchdog 카운터는 초기화

set #watchdogcnt 0

:REALSTEP2

//초기화 후 다음 watchdog 및 조건 분기 시작


:watchdog

//앱 종료 후 재시작


자, 감이 잡히시나요?

기존에 watchdog이 없을 때의 0~4강까지의 조건문은 무조건 대기를 했었는데,

5강에서는 대기를 할 때마다 카운터가 누적되고 이 카운터가 일정 수치가 되면 강제로 앱을 종료해버린 후 재실행을

하는 겁니다.

3번 중에 1번 오작동을 한다고 하더라도 장시간 동안 어쨌든 돌아가게 되는 것이지요.

세부적으로 log 기록이 되도록 만들어놓으면 나중에 log기록보고 어느 부분에서 미스가 나는 것인지를 보고 수정을 해줄 수도

있구요 :)


아래 코드는 watchdog이 반영된 최종 코드 v2.0이나 부분적으로 손봐야 할 부분들이 좀 남아 있습니다.

지금까지 0~4강을 따라해보신 분이라면 얼마든지 직접 수정을 해서 사용은 할 수 있을 만큼만 남아 있습니다 :)

// 항상 첫 줄은 비우고 주석으로 채워주도록 합니다.

// 히로매크로 자체 문제거나 제 기기만의 문제일 수 있겠지만 여하튼 첫 줄에 뭐 있으면 에러가 나서요.


var #app 0

var #towncolor 15532031

var #allwhite 16777215

var #resultcolor 2307123

var #newcolor 15518532

var #sellcolor 15518532

var #coincolor 12320767

var #color 0

var #first 1

var #watchdogcnt 0

var #limit 500


:start


:checkApp

log [0] 크퀘 실행여부 감지 중입니다.

CheckApp #app com.nhnent.SKQUEST


if #app == 1

log [1] 실행감지되어 시나리오 루틴으로 이동합니다.

set #first 0

goto :scenario

endif

// 이렇게 함으로써 크퀘를 플레이 중이더라도 시나리오 화면에만 맞춰놓으면

// 매크로가 이어서 플레이할 수 있게 됩니다.


log [1] 크퀘 실행합니다.

RunApp com.nhnent.SKQUEST

WaitApp com.nhnent.SKQUEST


:work

if #watchdogcnt > #limit

goto :watchdog

endif


getColor #color 1160 150

if #color == #towncolor

log [2] 기본 마을 진입했습니다.

goto :work2

else

touchpress 0 220 1900

sleep 500

touchpress 0 1272 1925

calc #watchdogcnt #watchdogcnt + 1

goto :work

endif



:work2

set #watchdogcnt 0

log [3] 빵판매 루틴 시작합니다.

touchpress 0 150 1600

sleep 700

// [용사 관리] 메뉴 선택

touchpress 0 880 800

// 2번째 용사 선택 (첫번째부터 500, 800, 1100, ...)

sleep 700

touchpress 0 180 1000

sleep 700

// [훈련] 선택


:breadsell

if #watchdogcnt > #limit

goto :watchdog

endif


getColor #color 190 1439

if #color == #coincolor

sleep 100

else

calc #watchdogcnt #watchdogcnt + 1

goto :breadsell

endif

// 빵 판매화면이 나왔는지를 코인 모서리 점 색상값을 이용해 인식


getColor #color 180 1170

if #color == #sellcolor

sleep 100

else

log [3] 더이상 판매할 빵이 없습니다.

goto :finishbreadsell

endif

// [판매] 버튼 비활성화 상태이면 finishbreadsell 루틴으로 이동


touchpress 0 180 1170

sleep 1000

// [판매] 버튼


touchpress 0 900 1200

sleep 300

touchpress 0 700 1200

sleep 300

touchpress 0 500 1200

sleep 300

touchpress 0 300 1200

sleep 300

// 빵을 모두 선택


touchpress 0 150 2000

sleep 1500

//[판매] 버튼

touchpress 0 380 1300

sleep 800

//[확인] 버튼

log [3] 빵을 판매했습니다.

calc #watchdogcnt #watchdogcnt + 1

goto :breadsell

//다시 빵 판매 화면으로 돌아가서 남은 빵이 있는지를 확인하고 반복해서 판매합니다.


:finishbreadsell

set #watchdogcnt 0

touchpress 0 1240 2240

sleep 700

// X를 눌러 빵 판매창을 닫고

touchpress 0 1260 2040

sleep 700

// 용사 정보 창도 닫고

touchpress 0 1270 2190

sleep 1000

// 용사 관리 창도 닫습니다.


log [4] 시나리오 진행 시작합니다.

touchpress 0 180 2300

// [모험 시작] 누르고,

sleep 900

touchpress 0 560 560

// [시나리오] 눌러서, 사냥 시작합니다.


if #first == 1

set #first 0

goto :scenarioselect

endif


:scenario

if #watchdogcnt > #limit

goto :watchdog

endif


getColor #color 180 1963

if #color == #allwhite

touchpress 0 180 1963

sleep 500

goto :needmeet

else

sleep 300

log [4] 시나리오 전투준비 시작합니다.

calc #watchdogcnt #watchdogcnt + 1

goto :scenario

endif


:scenarioselect

if #watchdogcnt > #limit

goto :watchdog

endif

getColor #color 180 1963

if #color == #allwhite

touchpress 0 940 700

// 이 부분은 실행 후 최초 플레이 시 본인이 플레이하길 원하는 시나리오 좌표를 사용해야 합니다.

// 제 경우, 노멀모드이고 숲이기 때문에 추가로 더 찍어주는 부분이 없는 것입니다.

sleep 300

touchpress 0 180 1963

log [4] 시나리오 전투준비 시작합니다.

sleep 500

else

sleep 300

calc #watchdogcnt #watchdogcnt + 1

goto :scenarioselect

endif


:needmeet

set #watchdogcnt 0

:needmeetunderwatchdog

if #watchdogcnt > #limit

goto :watchdog

endif

// 고기 부족 메시지가 발생하는 경우

getColor #color 535 1560

if #color == #allwhite

log [!] 고기가 없습니다. 2시간 동안 플레이를 중지합니다.

set #first 1

goto :wait4meet

// 1시간 후 다시 :checkapp 루틴으로 이동, 반복

endif


sleep 400

touchpress 0 170 2000

sleep 500


getColor #color 1400 2490

if #color == #allwhite

log [5] 전투가 시작 되었습니다.

goto :fightstart

else

calc #watchdogcnt #watchdogcnt + 1

goto :needmeetunderwatchdog

endif


:fightstart

set #watchdogcnt 0

:fightstartunderwatchdog

if #watchdogcnt > #limit

goto :watchdog

endif

getColor #color 440 1300

if #color == #newcolor

touchpress 0 440 1300

log [!] 새 용사가 합류했습니다!

sleep 1000

calc #watchdogcnt #watchdogcnt + 1

goto :fightstartunderwatchdog

endif



set #watchdogcnt 0

// ----------전투종료 감지 #1---------- //

getColor #color 940 1830

if #color == #resultcolor

log [6] 전투가 종료 되었습니다.

goto :fightend

endif

// ----------전투종료 감지 #1 ---------- //

sleep 2500

// ----------전투종료 감지 #2 ---------- //

getColor #color 940 1830

if #color == #resultcolor

log [6] 전투가 종료 되었습니다.

goto :fightend

endif

// ----------전투종료 감지 #2 ---------- //

sleep 2500

// ----------전투종료 감지 #3 ---------- //

getColor #color 940 1830

if #color == #resultcolor

log [6] 전투가 종료 되었습니다.

goto :fightend

endif

// ----------전투종료 감지 #3 ---------- //

sleep 2500

// 스킬 블록 쌓일 때까지 7.5초 기다리면서 전투종료 3번 감지하도록 했습니다.


touchpress 0 900 1200

sleep 200

// 여신 스킬 사용

touchpress 0 135 380

sleep 200

// 왼쪽부터 첫 번째,

touchpress 0 135 640

sleep 200

// 왼쪽부터 두 번째,

touchpress 0 135 900

sleep 200

// 왼쪽부터 세 번째,

touchpress 0 135 1160

sleep 200

// 왼쪽부터 네 번째,

// 스킬은 왼쪽→오른쪽으로 나온다고 했을 때 제일 왼쪽부터 0.2초 간격으로 사용해줍니다.

// 반대로 사용하게 되면 스킬 블록이 오는 중에 사용되버려 블록 연동이 덜 될 것 같아서요 :)


// ----------전투종료 감지 #4 ---------- //

getColor #color 940 1830

if #color == #resultcolor

log [6] 전투가 종료 되었습니다.

goto :fightend

endif

// ----------전투종료 감지 #4 ---------- //


touchpress 0 900 1200

sleep 200

// 여신 스킬 사용

touchpress 0 135 1420

sleep 200

// 왼쪽부터 다섯 번째,

touchpress 0 135 1680

sleep 200

// 왼쪽부터 여섯 번째,

touchpress 0 135 1940

sleep 200

// 왼쪽부터 일곱 번째,

touchpress 0 135 2200

sleep 200

// 왼쪽부터 여덟 번째, 마지막 스킬 블록 위치까지 눌러줬습니다.

goto :fightstart

// 전투모듈에서는 watchdog 적용하지 않았습니다!


:fightend

touchpress 0 240 700

sleep 300

// 전투종료 후 결과확인을 위한 터치입니다. 

if #watchdogcnt > 1000

goto :watchdog

endif

getColor #color 440 1300

if #color == #newcolor

touchpress 0 440 1300

sleep 300

log [!] 레벨업 또는 최대레벨달성 메시지 발생했습니다.

calc #watchdogcnt #watchdogcnt + 1

goto :fightend

endif

// 최초 최대 레벨 달성 혹은 용사단 레벨업 메시지박스가 떴다면, 클릭을 해주도록 합니다.


touchpress 0 240 700

sleep 300

touchpress 0 240 700

// [다시 하기]를 누르고 루틴은 시나리오 루틴으로 돌아갑니다.

log [7] 모든 과정이 종료되어 [4] 시나리오 진행 루틴 실행합니다.

set #watchdogcnt 0

goto :scenario


:wait4meet

keypress K_BACK

sleep 200

keypress K_BACK

sleep 2000

screenLock 7200000

// 2시간 = 120(m) x 60(s) x 1000(ms) = 7200000(ms)

sleep 2000

goto :checkApp


:watchdog

keypress K_BACK

sleep 200

keypress K_BACK

sleep 2000

goto :checkApp


아무쪼록 짧은, 이건 뭐 강좌라 하기도 뭣 하네요 :) 짧게 짧게 설명드리는 동안 게임 매크로를 기본적으로는 어떤 식으로


만드는지에 대한 가장 기초적인 감 정도는 충분히 잡으셨으리라 생각합니다.



심심풀이로 시작한 거 마무리 지어야지 하는 마음으로 그래도 어찌됐든 완결은 지었네요 :)


아무도 안 봐주는 블로그지만은 뭐라도 좀 공유해보자라는 취지로 열심히 썼습니다.


기실 지금 위 최종 코드 v2.0보다는 여러모로 조금 달라진 형태의 코드를 사용하고 있습니다만 매크로를 돌리니 재미가 반감ㅠ


되서.. 계속 할지조차 의문이네요.


몰랐는데 복사가 안 되는 상황이었네요.

왜 다들 보내달라고 하시나 싶었네요.

필요하신 분 아래 파일 이용하세요.

지금은 많이 바뀌어서 새로 짜는게 빠르실지도 모릅니다!


5강 코드.txt



앞으로 얼마나 더 잉여로운 생활을 할 지는 모르겠지만..


다음 기회에는 디아블로3 그홈 오토 강좌나 만들어볼까요? 이미 만들어서 지인 1명에게 배포해서 둘이 한참 썼었는데..


그홈은 뭐 좋은 건 주지도 않고- -..  뭔가 나름 비장의 한 수를 숨겨 계정 정지는 계속 안 되고 있긴 합니다만..


대충 원리는.. 그홈 잡고, 셋템/전설템 떨어지면 스샷찍고 마을와서 1번 창고에 넣고.. 1번 창고 꽉 찼으면 2번 창고.. 꽉 차면..


뭐 이런 식으로 창고에 넣고 다시 나갔다 들어와서 반복.. 창고 꽉 차면 동작 멈추고 카톡으로 알려주는 뭐 이런 형태인데..


항상 문제는 게임을 이런 식으로 플레이하니.. 오토 만드는 재미만 있고 정작 게임하는 재미는 없다는..


디아블로 아이템 파밍해서 돈 받고 팔 것도 아니고.. 심지어 라말은 줍지도 못 하고.. 시즌 2에서는 패치됐나 모르겠네요.



아무튼 혹시나 문의 있으시면~ 댓글로~ 부탁 드립니다.

관련글 더보기

댓글 영역