애완동물 대전용 Rematch 스크립트를 직접 짜는 방법에 대한 글입니다.

제가 가끔씩 올리는 애완동물 전역퀘 공략글에 들어있는 스크립트가 어떻게 짜여지는지 궁금하거나

스크립트를 직접 짜보고 싶으신 분들이 계실듯 해서 써봤습니다.

미리 알려드리지만 코딩을 전혀 모르신다면 좀 어려울거고 코딩 경험자라면 쉬운 내용입니다.


▶ 스크립트를 짜려면 Rematch와 Pet Battle Scripts 두개의 애드온이 필요합니다.

Rematch

다운로드 : https://www.curseforge.com/wow/addons/rematch

Battle Pet Scripts
(용군단 이전 버전인 tdbattlepetscript 애드온을 쓰고 계시면 반드시 지우고 이걸로 교체)
다운로드 : https://www.curseforge.com/wow/addons/pet-battle-scripts


애완동물 대전용 스크립트를 짜는 방법은 생각보다 간단합니다.
애완동물 대전을 시작한 후 -> 스크립트 편집창을 띄우고 -> 자동 완성의 도움을 받아 코딩을 하면 됩니다.
(단 애완동물 대전에 들어간 상태가 아니면 자동 완성 기능이 작동하지 않습니다.)

이 자동 완성 기능만 있어도 스킬이나 함수를 자동으로 불러오기 때문에 코드를 짜는게 훨씬 쉬워집니다.
다만 스킬과 스킬 코드는 현재 활성화된 애완동물의 것만 불러올 수 있습니다.

(스크립트 예시입니다.)
use(Lash:394) [enemy(#3).active]
use(Stun Seed:402) [round<8]
use(Healing Wave:123) [round>2 & self(#1).active]
use(#1)
change(next)
스크립트의 기본적인 작동 규칙은 코드 맨위에서부터 내려가며 실행 가능한 코드를 한줄만 사용한다는겁니다.
예를 들어 예문의 첫번째 줄의 코드가 실행되었다면 그 아랫줄의 코드들은 실행되지 않고 다음 턴으로
넘어갑니다.  (단 if문은 조건이 맞을 경우 그 아래 블록으로 넘어갑니다)

반대로 만약 아무런 코드도 실행되지 않는다면 마지막줄까지 내려갑니다.
마지막줄까지 아무런 명령어도 실행되지 않는다면 스크립트는 멈춥니다.

이런 이유로 스크립트를 짤때는 스킬의 순서를 잘 생각해서 짜야 합니다.
예를 들어 3번 스킬을 특정 상황에만 쓰고 평소에는 1번 스킬만 쓰고 싶다면 3번 스킬에 조건을 걸어서
위에다 놓고 1번 스킬을 아래에 놓아야 합니다.
1번 스킬을 위에 놓으면 위에서부터 차례대로 실행하는 특성상 1번 스킬만 계속 사용하고 3번 스킬까지
내려가지 않기 때문에 3번 스킬은 실행되지 못합니다.

보통 스크립트의 마지막 줄에는 change(next)가 있어 애완동물이 죽어서 아무런 명령도 실행하지 못할 경우
맨 마지막줄의 다음 애완동물로 교체하는 명령(change(next))이 작동합니다.


순서에 대한 규칙을 이해하셨다면 이제 스크립트에 사용되는 명령어들에 대해 알아보겠습니다.

애완동물 스크립트의 대부분은 use 명령어와 그 뒤의 조건문으로 채워집니다.

나머지 명령어는 그냥 있구나 하는 수준으로만 알아도 무방합니다.

다만 change(next)는 거의 무조건 맨 마지막에 들어갑니다.

use 명령어는 가장 많이 쓰이는 명령어로 지정된 애완동물의 스킬을 사용합니다.

애완동물 대전을 시작하고 스크립트 창을 연 후에 u를 누르면


이렇게 자동완성으로 use 가 뜹니다. 

use와 ability는 동일한 역할을 하는 명령어입니다.


use를 치면 뒤에 현재 활성화된 애완동물의 스킬들이 뜹니다. 골라주시면 됩니다.

만약 위에서 지정한 특정 스킬이 아니라 use(#1) 같이 #(숫자)로 하면 현재 활성화된 애완동물의
(숫자)번 슬롯의 스킬
만을 사용합니다. #1은 1번 슬롯, #2는 2번 슬롯, #3은 3번 슬롯입니다.
당연한 말이지만 4번 슬롯은 없습니다.

use(#1)을 쓰면 어떤 애완동물이 활성화되어있던간에 1번 슬롯의 스킬을 사용하게 할 수 있습니다.
보통 특정 조건에 맞지 않는 턴에 단순 공격만 하게 하고 싶으면 이 코드를 아래쪽에 배치해서 1번 스킬을
쓰게 합니다. 1번 슬롯에는 일반적으로 평타 스킬이 들어갑니다.


use(유도탄:777) [enemy
스킬을 고른 후 뒤에 대괄호 [를 치면 조건을 걸어 특정 상황에서만 스킬을 쓰게 할 수 있습니다.
그 다음에 enemy(적)이나 self(우리편), round(라운드 수), weather(날씨) 등의 조건이 들어갑니다.

위 짤에서는 enemy 즉 적의 상태를 조건문으로 걸었습니다.


enemy를 친 후 적들 중 하나를 고릅니다. 간단히 #1, #2, #3으로 해도 됩니다.



적을 고르고나서 .을 누르면 그와 관련된 함수가 쭉 뜹니다. 이 중 자주 쓰이는 함수 몇개만 설명하겠습니다.
참고로 enemy(적)와 self(우리편) 둘 다 동일한 함수를 사용합니다.


ability는 상대 애완동물의 스킬을 의미합니다. 보통은 스킬을 지정 후 뒤에 .을 붙여 추가 함수로 스킬을 사용할 수 있나 확인하는 usable만 쓰입니다.

active
는 이 애완동물이 현재 맨 앞에 나와 활동중인지 확인합니다.


aura는 이 애완동물에 붙은 버프, 디버프를 지정해서 추가 함수로 버프의 존재(exists)나 지속시간(duration)을 확인합니다.

dead는 지정한 애완동물이 죽었는가를 확인합니다.

exists는 지정한 애완동물이 살아있는지 확인합니다.

hp는 애완동물의 체력을 숫자로 반환하고 부등호를 통해 지정한 숫자보다 높거나 낮은지 확인합니다.

hpp는 애완동물의 체력을 %로 반환합니다. 사용법은 hp와 같습니다.

played는 이 애완동물이 한번이라도 앞에 나왔었는지 확인합니다.

power, speed는 부등호와 함께 애완동물의 힘, 속도가 지정한 수치보다 높거나 낮은지 확인할때 씁니다.
속도는 품종별로 속도에 따라 선후공이 달라져서 각 상황별로 다른 스킬을 써야 할 경우 사용합니다.

조건문에는 지금까지 알아본 enemy, self 말고도 다른 조건을 걸 수 있습니다.

use(유도탄:777) [ round = 1]
1 라운드에 유도탄을 쓰라는 명령입니다.

use(유도탄:777) [ weather(눈보라:205) ] // 날씨가 눈보라일 경우에만 유도탄을 사용합니다.
whether 뒤에 .duration을 추가하면 지속시간을 조건으로 걸 수 있습니다.

여기까지가 use명령어의 기본 함수입니다. 이제 나머지 함수를 보시겠습니다.

quit는 조건에 만족할 경우 애완동물 전투를 종료합니다.
보통 필수 애완동물이 죽어서 스크립트를 더 이상 진행할 수 없을 경우 전투 종료로 빠져나가게 합니다.
quit [self(#3).dead] // 3번 애완동물이 죽었을 경우 전투 종료

change는 괄호안에 지정된 애완동물로 교체하는 명령입니다.
change(next) // 다음 애완동물로 교체합니다 (1->2->3)
 next 대신 #1, #2, #3을 붙이면 지정한 애완동물로 교체합니다.

if는 조건이 맞을 경우 if와 endif 사이에 있는 스크립트만 실행합니다.
if [ self(#1).active ] // 1번 애완동물이 활성화되었을 경우
use(Flyby:515) [round ~ 1,3] // 1턴과 3턴에만 저공 비행 스킬 사용
use(Thunderbolt:779) // 1,3턴이 아닐때 즉 2턴에 벼락 스킬 사용
use(Explode:282) // 1~3턴이 아니고 천둥벼락이 쿨인 4턴에 폭파 스킬 실행
endif

standby는 꼭 한턴을 쉬어야 할때만 씁니다. 자주 쓰이는 명령어는 아닙니다.

여기까지 대략적인 명령어를 설명드렸지만 솔직히 말하자면 저기 있는 것들 중 실제로 스크립트를 짤 때
쓰이는건 몇개밖에 없습니다. 나머지는 정말 특수한 상황에서만 쓰입니다.

위에서 설명한 것들은 너무 많아 한번에 다 기억하기는 어려우실테니 대충 보시고 넘기셔도 됩니다.
달달 외우기 보다는 직접 짜보면서 익숙해지는게 낫습니다.


이제 실제 스크립트를 예를 들어 설명드리겠습니다.

use(검은 발톱:919) [!enemy.aura(검은 발톱:918).exists]
use(무리:581) [enemy.aura(검은 발톱:918).exists ]

여러분에게 익숙한 익키의 검은 발톱 - 무리 콤보입니다.
코드 첫줄은 상대에게 검은 발톱 디버프(aura(검은 발톱:918).exists)가 으면([!) 검은 발톱을 씁니다.
그 다음 턴에는 상대에게 검은 발톱 디버프가 있기 때문에 첫번째 줄의 코드는 조건에 맞지 않아 넘어가고
두번째 줄 코드의 조건인 enemy.aura(검은 발톱:918).exists에 만족하기 때문에 [무리] 스킬이 실행됩니다

if [enemy.aura(검은 발톱:918).exists] // 만약 검은 발톱 디버프있으면
ability(무리:581) // 무리를 사용
endif
ability(검은 발톱:919) [enemy.hp > 500] // 만약 적의 hp가 500이상이면 검은 발톱을 사용
ability(날카로운 갈퀴발톱:1370) // 위 조건들이 모두 만족하지 않으면 날카로운 갈퀴발톱을 사용

위 코드는 적의 hp를 기준으로 사용하는 스킬이 변합니다.
첫 if문은 적에게 검은 발톱 디버프가 없으니 건너뛰고 적의 hp가 500이상이면 검은 발톱 스킬을 씁니다.
다음턴에는 검은발톱 디버프가 있어 if문의 조건이 만족하기 때문에 if 내부의 코드인 무리 스킬을 사용합니다.
만약 적의 hp가 500이하라면 검은 발톱을 쓰지 않기 때문에 그 다음줄의 날카로운 갈퀴발톱을 씁니다.

이렇게 스킬의 위아래 순서를 잘 배치해야 원하는 순서대로 스킬이 나가게 할 수 있습니다.
만약 갈퀴발톱 코드가 맨 위에 있다면 아래에 뭐가 있던 무조건 갈퀴발톱만 쓰게 될겁니다.
if~endif문이 맨 아래에 있다면 ability(날카로운 갈퀴발톱:1370)코드가 먼저 실행되기 때문에 if문은
실행할 수 없습니다. 마찬가지로 검은 발톱이 맨 아랫줄이어도 [날카로운 갈퀴발톱]의 코드가 먼저 실행되어
[검은 발톱]은 사용되지 않고 이로 인해 [무리]도 사용되지 않습니다.

use(폭파:282) [!enemy(마력 깃든 새끼 엄니:3452).ability(에테리얼:998).usable ]

위 코드는 마력 깃든 새끼 엄니라는 적이 무적 회피 스킬인 [에테리얼]을 쓰지 못할 경우에만
자폭 스킬인 [폭파]를 사용합니다.
!는 부정이고 [ability(에테리얼:998).usable(에테리얼을 쓸 수 있을때)]와 같이 쓰면 [에테리얼] 스킬을 사용할 수
없을때가 됩니다. 반대로 !를 빼먹으면 에테리얼을 쓸 수 있을때만 폭파 스킬을 날립니다.


self와 enemy에 붙은 hp 함수에는 can_explode라는 특별한 함수가 붙어있는데 이건 판다렌 기계용이나
강철의 샛별에 있는 자폭 기능인 [폭파] 스킬로 상대를 죽일 수 있는 체력인지 확인하는 편리한 함수입니다.

use(explode:282) [enemy(스크리체스:3392).hp.can_explode]
상대 스크리체스의 hp가 폭파 스킬로 죽을 정도로 낮다면 폭파 스킬을 쓰라는 코드입니다.

use(무리:581) [enemy.aura(검은 발톱:918).exists ]
use(581) [enemy.aura(918).exists ]
위 두 코드는 같은 코드입니다. 581은 스킬 코드이며 그 앞에 한글로 된 스킬명을 삭제해도 코드가 돌아가는데

특정 스킬의 스킬 코드가 궁금하다면 구글 검색창에 wowehad (스킬명)으로 검색하세요.
검색 결과창에 나온 와우헤드 주소로 들어가서 주소창을 보면 번호가 하나 있을텐데 그 번호가 바로 스킬 코드입니다. 위 짤에서는 무리 스킬의 코드가 581이라고 떠있네요.

▣ 이제 스크립트를 짤때 지켜야 할 몇가지 원칙을 알아보겠습니다.

1. 안정성, 반복성 - 스크립트는 매번 돌릴때마다 똑같이 작동해야 하며 최단 시간 내에 반드시 승리해야
   좋은 스크립트라 할 수 있습니다. 80%의 확률로 이기고 20%의 확률로 진다거나 한번 이기는데 20턴, 30턴씩
   걸리는 스크립트는 좋은 스크립트가 아닙니다.

2. 가능하면 쉽게 구할 수 있는 애완동물로 - 남들과 공유할 스크립트라면 가능한 구하기 쉬운 애완동물로
   스크립트를 짜는게 좋습니다. 굉장히 어려운 업적으로 얻거나 가격이 비싸거나 구하기 힘든 애완동물로
   스크립트를 짜서 공유해봤자 아무도 쓸 수 없으니까요.

3. RNG 배제 - 1번과 비슷한 이야기인데 가끔 전투의 전개가 매번 바뀌는 전역퀘가 있습니다.
   이런 경우는 랜덤한 상황을 야기하는 상대의 스킬을 무력화하던가 피해서 최대한 매번 똑같이
   스크립트가 돌아가게 해야 합니다. if문과 조건문을 최대한 활용해서 RNG를 피해봅시다.

4. 필드 애완동물 배제 - 팀에 넣을 애완동물의 품종이 여러가지면 스크립트가 일관적으로 돌아갈 수 없습니다.
    특히 필드에서 잡는 애완동물은 품종이 네다섯종류인 경우가 많은데 이런 애완동물로 스크립트를 짜서
    공유하면 공유받은 사람들마다 다른 품종으로 스크립트를 돌려서 제대로 돌아가지 않을 수 있습니다.
    따라서 스크립트에 쓸 애완동물은 단일 품종에 구하기 쉽고 처음부터 희귀 품질인 개체로 짜는게 좋습니다.
    (예를 들어 강철의 샛별은 품종만 H/H, P/P, H/P, P/S, P/B 다섯가지라 모든 품종으로 똑같은 결과를 낼 수 있게
    짤 수 있을때만 쓰는게 좋습니다. 반면 판다렌 새끼용은 S/S 한 품종만 있고 구하기 쉬운 편이며 처음부터
    희귀 품질이라 스크립트에 쓰기 좋습니다.)

▣ 그럼 실제로 애완동물 스크립트를 직접 짜보겠습니다.
  • 스크립트를 짜서 공략할 전역퀘 NPC를 고릅니다.
  • 애완동물 관리창 좌측 상단에 가서 검색으로 이 전역퀘에 있는 상대 애완동물에게 상성상 데미지가 높게 들어가면서 받는 데미지는 적게 들어오는 애완동물을 검색합니다.
  • 그 중 단일 품종에 구하기 쉬운 것들만 선별해서 3마리를 가져온 다음에 팀을 짜서 스킬을 세팅한 후에  그 NPC를 대상으로 저장하고 애완동물 전투를 시작합니다.
  • 팀을 우클릭해서 스크립트 창을 열고 스크립트를 짜기 시작합니다.
  • 창 밑에 TEST 버튼을 누르면 방금 짠 스크립트에서 다음에 어떤 명령어를 사용할지 미리 보여줍니다.
  • 다 짰으면 저장을 누릅니다.
  • 한 10번 정도 돌려서 스크립트가 매번 똑같이 돌아가는가 테스트해봅니다.
  • 상대나 아군쪽에서 크리티컬이 두어번 터지더라도 안정적으로 돌아가도록 널널하게 짜는게 좋습니다.
  • 더 가르쳐드리고 싶지만 이건 직접 짜보면서 익혀야 되는거라 더 가르쳐 드릴게 없네요. (....)

★ 특정 애완동물 대전 NPC만을 잡는 팀을 짜는 방법입니다.

1. 특정 NPC에 대응하는 애완동물 대전 스크립트를 직접 짜려면 필드에서 NPC를 클릭한 후


2. 저장 -> 저장을 눌러줍니다.
   이렇게 하면 현재 지정된 애완동물 3마리가 이 NPC를 잡는 팀으로 지정됩니다.



3. 애완동물 대전을 시작한 후에 방금 저장한 팀을 찾아 우클릭하고 Write script를 눌러줍니다.

4. 스크립트 편집창에 들어가 코딩을 시작합니다.

5. 만약 3번째 애완동물 칸을 평준화 애완동물로 채워서 렙업을 시키고 싶다면 3번칸을 우클릭해
   [여기에 평준화 애완동물 넣기]를 클릭합니다. 이렇게 하면 3번칸에 애완동물 대기열에 있는 쪼렙
   애완동물들이 자동으로 들어갑니다.


위 영상은 TD script를 짜는 방법을 이 허접한 글 보다 더 자세히 가르쳐주는 강의 영상입니다.
영어의 압박이 좀 있지만 자동번역 기능을 쓰면 대충 알아들을 수 있을겁니다.