상세 컨텐츠

본문 제목

크루세이더 퀘스트 매크로 [3강] 예외처리

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

by Rahs 2015. 2. 15. 22:44

본문



크루세이더 퀘스트 매크로 [3강] 예외처리



글로 어떤 방법이나 의도를 전달하는 것이 생각보다 참 쉽지 않네요.

3강 내용이 반영되면 자동사냥 매크로가 어떤 모습으로 실행되는지를 보실 수 있도록 동영상을 한번 걸어 봤습니다.


화질은 좀 열악합니다만 자세히 보시면 스킬창을 찍는 하얀 동그라미가 보이실 겁니다.

자동으로 찍히고 있는 겁니다 :)




거의 매번 강조를 드리지만 "소스"보다는 "어떤 식"으로 만들어지는지에 대한 관심이 있으신 분들께 도움이 되었으면 하네요 :)


자, 예외처리.

말은 그럴 듯 한데, 이게 도대체 무슨 소리일까요?


1~2강의 소스를 조금만 응용해 수정하면 빵/무기팔아가며 무한하게 잘 돌아가는 크퀘 매크로 완전체가 나올까요?

예상하셨겠지만 정답은 Never입니다. (네이버 아닙..)


그 이유는 뭘까요?

글쓴이 네놈이 허접해서? 그것도 엄연한 사실이지만 이유의 전부는 아닙니다.



1~2강 소스 보시면 아시겠지만 대부분 소스는 아래 구조로 이루어져 있습니다.

var #A X

var #B 0


:start

:labelB

getColor #B 100 100

if #A == #B

goto :labelA

else

goto :labelB


:labelA

toast 수행이 종료되었습니다.


:end


1. 우선 #A라는 변수에 값 X를 넣어 놓고, #B라는 변수에는 그냥 초기값으로 0을 집어넣어 놓습니다.

2. 매크로가 시작되면 (100, 100)의 점 색상값을 받아와서 #B라는 변수에 집어 넣습니다.

3. 그리고 #A에 저장되어 있던 X와, #B에 저장되어 있는 방금 받아온 색상값을 비교하죠.

4. 두 색상값이 같으면, :labelA로 이동하게 되고, "수행이 종료되었습니다" 라는 메시지와 함께 매크로가 종료되게 됩니다.

5. 두 색상값이 다르면, :labelB로 이동하게 되고, 매크로는 (100, 100)의 점 색상값을 다시 받아와서 #B라는 변수에 저장, 즉 2~3을 계속 반복하게 됩니다. 언제까지요? 기존에 지정된 X라는 색상값이 얻어질 때까지요.


점(100, 100)이 언젠가 X라는 색상값을 가질 것이라고 예상을 하고, 그 때 다음 명령이 실행되도록 하기 위해서

이런식으로 매크로를 짠 것입니다.


그런데, 만약 점(100, 100)이 X라는 색상값을 안 가지게 되면 어떻게 될까요?


매크로는 점(100, 100)이 X라는 색상값을 가지는 그 순간까지 계속해서 label사이를 오가며 기다리고 있게 됩니다.

끊임없이 점(100, 100)의 색상값을 가져와서 기존 X값과 비교를 하면서요.



엄밀하게 따지자면 예외처리라 함은 "예상하지 못한 예외가 발생했을 경우에 대한 처리"겠지만 본 포스팅에서는

"예상할 수 있는 예외라도 앞서 설명한 기본 루틴을 벗어나는 경우를 포함"해서 다루도록 하겠습니다.



예상할 수 있는 예외에 어떤 것들이 있나 보겠습니다.


[그림1~3] 게임 시작 후 기본 마을 진입 시 나오는 각종 공지화면

최종적으로는 이런 부분까지 모두 감안하여 매크로를 작성할 수도 있겠지만 우선은 배제할 예정입니다.

4강 최종 코드 v1.0에는 이 부분도 함께 처리되었으니 참고하시면 되겠습니다.





[그림4] 사냥 완료 직후 새로운 용사 합류 시 나오는 용사 합류 화면

자동사냥을 돌리기 위해서는 반드시 처리해줘야 하는 부분입니다.

여차하면 새 용사 확률을 감안하여 100번 돌고 잔여영웅을 모두 왕국 귀환시키고, 뭐 이런 식으로 짜도 괜찮겠네요^ ^



[그림5] 사냥완료 결과 표시 직후 영웅 [최초 최대 레벨 도달] 화면

여러 1렙 영웅을 돌아가며 만렙을 만드는 매크로를 제작하는 경우라면 처리해줘야 부분이나 만렙 영웅들만으로 돌린다면 굳이 처리하지 않아도 되는 경우이기도 합니다. (이번 예제에는 포함하지 않았습니다, 4강에 포함)


[그림6] 사냥완료 결과 표시 직후 [용사단 레벨업] 화면

그리 자주 볼 수 있는 화면은 아니지만 구현 방법이야 어차피 다 동일하기 때문에

처리할 부분을 넣어주고 말고는 사용자 자유가 되겠습니다. (역시 이번 예제에는 포함하지 않았습니다, 4강에 포함)




어차피 소스 패턴은 모두 동일하기 때문에 [그림4]를 추가해보겠습니다.

이번에는 시작을 마을이 아니라, 반복해서 수행할 스테이지 선택 화면, 즉 아래 화면에서 시작하고 [다시 하기]로

반복한다는 전제 하, 고기가 떨어질 때까지 사냥하도록 하는 소스를 한번 보시겠습니다.

고기가 떨어진 후 동작은 다음에 지정해주겠지만, 현재로써는 아마 앞서 말씀드린 대로 "멍" 하고 있게 되겠죠?



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

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


var #stagecolor 16777215

var #stage 0

var #resultcolor 2307123

var #result 0

var #newcolor 15518532

var #new 0

var #stagecolor 16777215

var #scenario 0

// 기초 예제라 변수가 과도하게 많이 선언되어 있죠?

// 후에 최적화때는 동일 값을 갖는 변수는 1개로만 선언할 겁니다.

// 예를 들면 #stage, #result, #new, #scenario 등은 어차피 동시에 사용될 일이 없는 변수들이기 때문에

// #color 라는 변수 1개로 사용함으로써 불필요한 메모리 낭비를 줄일 수 있습니다 :)


:start


:scenario

getColor #scenario 180 1963

if #scenario == #scenariocolor

touchpress 0 180 1963

log [1단계]전투준비 지시합니다.

else

goto :scenario

endif

// 위 화면, 즉 [전투 준비] 버튼이 나올 때까지 대기합니다.


sleep 800

touchpress 0 170 2000

log [2단계]전투 시작 지시합니다.

// [시작] 누릅니다.


:stage

getColor #stage 1400 2490

if #stage == #stagecolor

log [3단계]전투가 시작되었습니다.

goto :fightstart

else

goto :stage

endif

// 전투가 시작되어 우측 상단에 일시정지 버튼(II) 나올 때까지 대기합니다.


:fightstart


getColor #new 440 1300
if #new == #newcolor
touchpress 0 440 1300
log [★] 새 용사가 합류했습니다!
toast 새 용사가 합류했습니다!
sleep 1500
goto :fightstart
endif

// 새로운 용사 획득 여부를 확인합니다.


getColor #result 940 1830

if #result == #resultcolor

log [4단계]전투가 종료되었습니다.

goto :fightend

endif

// 전투 종료여부를 확인합니다.


// 여기까지 왔다는 말은, 일시정지 버튼은 나와있는데, 새로운 용사가 합류한 것도 아니고, 전투가 종료된 것도

// 아닙니다. 즉, 전투를 해야 한다는 말이겠죠?

sleep 6000

// 스킬블록을 쌓아줍니다.

touchpress 0 900 1200

// 여신스킬 사용합니다. 게이지가 차 있으면 사용되고, 아니면 사용 안 됩니다.

// 지금 동영상에서는 세라를 사용하고 있지만.. 나중에 빨강머리로 바꿔주면 되겠죠^ ^

sleep 300

touchpress 0 135 380

sleep 300

touchpress 0 135 640

sleep 300

touchpress 0 135 900

sleep 300

touchpress 0 135 1160

sleep 300

//--- 중간에 전투 종료여부를 한번 더 확인 합니다. 이유는 이 부분 없이 돌려보시면 자동으로!!

getColor #result 940 1830

if #result == #resultcolor

log [4단계]전투가 종료되었습니다.

goto :fightend

endif

// 전투 종료여부를 확인합니다.

//--- 중간에 전투 종료여부를 한번 더 확인 합니다. 이유는 이 부분 없이 돌려보시면 자동으로!!

touchpress 0 135 1420

sleep 300

touchpress 0 135 1680

sleep 300

touchpress 0 135 1940

sleep 300

touchpress 0 135 2200

sleep 300

goto :fightstart


:fightend

toast 전투완료 확인하였습니다.

log [5단계]전투결과 확인 완료하였습니다.

touchpress 0 240 700

sleep 600

touchpress 0 240 700

log [6단계]1단계로 돌아가도록 지시합니다.

goto :scenario

// 처음 스테이지 선택 화면으로 다시 돌아가서 반복 수행하도록 합니다.

:end



뭐 오랫동안 주절주절 길게도 썼네요.


이상까지가 크루세이더 퀘스트 매크로 작성을 위한 강좌(!?) 였습니다 :)

어떤 점의 색상을 기준으로 할 때는 항상 여.러.번 색상값을 체크해보고 변화가 없을 때에만 그 점을 기준으로 잡아야 한다는

것만 기억하셔도 어지간한 매크로 만드는데는 지금까지의 내용만으로도 충분히 만들어보실 수 있으리라 생각합니다.


4강에서는 지금까지 나온 소스를 모두 합치면 어떤 모양이 되는지,

불필요한 메모리 소모는 어떻게 줄이는지, 그리고 완성된 완전체 매크로는 어떤 식으로 동작하게 되는지에 대해

간단하게 소개드리도록 하겠습니다.


문의는 댓글로 부탁드립니다.



관련글 더보기

댓글 영역