'자동기원'과 '철갑마' 이 둘을 Toggle하다 보면
굉장히 거슬리는 부분이 하나 생깁니다.
'철갑마'를 탈 때마다 끊임없이 이어지는 이 문구
너무나 거슬리는데 그렇다고 말 탈 때마다
'자동기원' 끄고
말 타고
이동하고
말 내리고
'자동기원' 켜고
를 끊임없이 반복하려니 상당히 귀찮고 손이 꼬입니다.
이것도 깔끔하게 만들고 싶습니다.
자동기원 X -> 철갑마 On -> 철갑마 Off -> 자동기원 X
자동기원 O -> 철갑마 On -> 철갑마 Off -> 자동기원 O
그저 말에서 내릴 때마다 '자동기원'을 켜주는 것이 아닌
말 타기 전에 '자동기원' 중이었을 경우에'만'
'자동기원'을 다시 켜주는 것이 목표입니다.
위의 경우를 살펴보면 철갑마 Off 할 때 2가지 경우가 생깁니다.
그러기에 여기서 변수 하나가 더 필요합니다.
말을 타면서 말 타기 전에 '자동기원'중이었는지 상태를 저장할 변수입니다.
PrevHealState
그리고 PrevHealState를 사용할 함수 2개가 필요합니다.
- StoreHealState : 현재 '자동기원' 상태를 저장하는 함수
- RestoreHealState : 말 타기 전의 '자동기원' 상태를 복구하는 함수
앞에서
- HorseOn ( 말 타는 함수 )
- HorseOff ( 말 내리는 함수 )
만들었던 것과 마찬가지로
자동기원도
- HealStart ( 자동기원 시작 함수 )
- HealStop ( 자동기원 중지 함수 )
이렇게 만들어 두겠습니다.
[v1.1]
; ------- Global variables ( 맨 위에 선언해주세요 )
isRiding := False ; 말을 타고 있는지 아닌지 상태 저장
isHealing := False ; 자동기원 중인지 여부 저장,
PrevHealState := False ; 말 타기 전에 자동기원 중이었는지 상태 저장
#Include ../lib/script_control_v1.ahk
#Include ../lib/common_func_v1.ahk
; ----------- Heal -------------------------------------
자동기원() {
SendInput {5} ; 자동기원이 'e'에 있을 때
return
}
HealStart() { ; 자동기원 시작 함수
global ; isHealing, PrevState 둘 다 global 변수임을 표시
SetTimer, 자동기원, 140 ; 자동기원 반복
isHealing := True ; 이제 자동기원 중
PrevHealState := False ; 자동기원 시작했으므로 이전 값은 초기화
return
}
HealStop() { ; 자동기원 중지 함수
global
SetTimer, 자동기원, off ; 자동기원 반복 종료
isHealing := False ; 이제 자동기원 안하고 있음
return
}
ToggleHeal() {
global isHealing ; global 변수인 isHealing을 사용하겠다는 의미
if isHealing { ; 지금이 자동기원 중이면
HealStop() ; 자동기원 중지
} else { ; 자동기원 하고 있지 않으면
HealStart() ; 자동기원 시작
}
return
}
StoreHealState() { ; 자동기원 상태 저장 함수
global
PrevHealState := isHealing ; 현재 자동기원 상태를 저장
if isHealing { ; 자동기원 중이면
HealStop() ; 자동기원 중지
}
return
}
RestoreHealState() { ; 자동기원 상태 복구 함수
global
if PrevHealState { ; 이전 상태가 자동기원 중이었으면
HealStart() ; 다시 자동기원 시작
}
return
}
; ----------- Horse -------------------------------------
HorseOn() { ; 말 타기
global isRiding ; global 변수인 isRiding을 사용하겠다는 의미
UseItem("d") ; 철갑마 사용 (철갑마가 'd'에 있을 때)
isRiding := True ; 이제 말 타고 있음
return
}
HorseOff() { ; 말 내리기
global isRiding ; global 변수인 isRiding을 사용하겠다는 의미
SendInput {r} ; 말 내리기
isRiding := False ; 이제 말 안 타고 있음
return
}
ToggleHorse() { ; 말 타고/ 내리기
global isRiding ; global 변수인 isRiding을 사용하겠다는 의미
if isRiding { ; 말을 타고 있으면
HorseOff() ; 말 내리기
RestoreHealState() ; 자동기원 상태 복구
} else { ; 말을 안 타고 있으면
StoreHealState() ; 자동기원 상태 저장
HorseOn() ; 말 타기
}
return
}
#IfWinActive ahk_class Nexon.NWind ; 바람의나라 창이 활성화 상태일 때만
NumPad5::ToggleHeal() ; NumPad5 Key 누르면 on/off 반전됨
End::ToggleHorse() ; 말 Toggle
#IfWinActive
구현한 함수는 많지만 정작 HotKey에 사용할 함수는 2개 뿐입니다.
이제 ToggleHeal() 과 ToggleHorse()를 HotKey에 지정해두고 사용하면 이렇게 됩니다.
굳이 이렇게 구현하지 않아도 큰 지장은 없지만
조금 더 깔끔하게 하고자 한다면 이렇게도 할 수 있습니다.
한번 시도해보세요.