[크루세이더 퀘스트 매크로 이전 글 보기]
2015/02/16 - [per IT/Android of Google] - 크루세이더 퀘스트 매크로 [4강] 최종 코드 v1.0
2015/02/15 - [per IT/Android of Google] - 크루세이더 퀘스트 매크로 [3강] 예외처리
2015/02/15 - [per IT/Android of Google] - 크루세이더 퀘스트 매크로 [2강] 루틴별 구상 #2
2015/02/08 - [per IT/Android of Google] - 크루세이더 퀘스트 매크로 [1강] 루틴별 구상 #1
2015/02/08 - [per IT/Android of Google] - 크루세이더 퀘스트 매크로 [0강] 시작하기에 앞서
쉽게 말해 예외처리는 아래와 같은 상황에서도 프로그램이 원래의 목적을 향해 돌아갈 수 있도록 하는 것입니다.
「일반적인 상황이라면 좌표 (0,0)에 검은색(0x000000)이 나타날 순서로, 매크로는 검은색이 나타나길 기다리고 있는 상태
그 상황에서 특정한 상황(예를 들어 온라인 게임이라면 친구의 귓말이 온다던가, 윈도우 업데이트 창이 뜬다던가?) 발생으로
그 검은색이 나타날 (0,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
//앱 종료 후 재시작
// 항상 첫 줄은 비우고 주석으로 채워주도록 합니다.
// 히로매크로 자체 문제거나 제 기기만의 문제일 수 있겠지만 여하튼 첫 줄에 뭐 있으면 에러가 나서요.
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
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
아무쪼록 짧은, 이건 뭐 강좌라 하기도 뭣 하네요 :) 짧게 짧게 설명드리는 동안 게임 매크로를 기본적으로는 어떤 식으로
만드는지에 대한 가장 기초적인 감 정도는 충분히 잡으셨으리라 생각합니다.
심심풀이로 시작한 거 마무리 지어야지 하는 마음으로 그래도 어찌됐든 완결은 지었네요 :)
아무도 안 봐주는 블로그지만은 뭐라도 좀 공유해보자라는 취지로 열심히 썼습니다.
기실 지금 위 최종 코드 v2.0보다는 여러모로 조금 달라진 형태의 코드를 사용하고 있습니다만 매크로를 돌리니 재미가 반감ㅠ
되서.. 계속 할지조차 의문이네요.
몰랐는데 복사가 안 되는 상황이었네요.
왜 다들 보내달라고 하시나 싶었네요.
필요하신 분 아래 파일 이용하세요.
지금은 많이 바뀌어서 새로 짜는게 빠르실지도 모릅니다!
앞으로 얼마나 더 잉여로운 생활을 할 지는 모르겠지만..
다음 기회에는 디아블로3 그홈 오토 강좌나 만들어볼까요? 이미 만들어서 지인 1명에게 배포해서 둘이 한참 썼었는데..
그홈은 뭐 좋은 건 주지도 않고- -.. 뭔가 나름 비장의 한 수를 숨겨 계정 정지는 계속 안 되고 있긴 합니다만..
대충 원리는.. 그홈 잡고, 셋템/전설템 떨어지면 스샷찍고 마을와서 1번 창고에 넣고.. 1번 창고 꽉 찼으면 2번 창고.. 꽉 차면..
뭐 이런 식으로 창고에 넣고 다시 나갔다 들어와서 반복.. 창고 꽉 차면 동작 멈추고 카톡으로 알려주는 뭐 이런 형태인데..
항상 문제는 게임을 이런 식으로 플레이하니.. 오토 만드는 재미만 있고 정작 게임하는 재미는 없다는..
디아블로 아이템 파밍해서 돈 받고 팔 것도 아니고.. 심지어 라말은 줍지도 못 하고.. 시즌 2에서는 패치됐나 모르겠네요.
아무튼 혹시나 문의 있으시면~ 댓글로~ 부탁 드립니다.
크루세이더 퀘스트 매크로 [4강] 최종 코드 v1.0 (5) | 2015.02.16 |
---|---|
크루세이더 퀘스트 매크로 [3강] 예외처리 (0) | 2015.02.15 |
크루세이더 퀘스트 매크로 [2강] 루틴별 구상 #2 (0) | 2015.02.15 |
크루세이더 퀘스트 매크로 [1강] 루틴별 구상 #1 (6) | 2015.02.08 |
모바일 게임 매크로 작성 시, 정확한 좌표따는 방법 (7) | 2015.02.08 |
댓글 영역