혼선 버그
페이지 정보
작성자 Aravis 작성일 24-02-06 16:56 조회 1,693 댓글 0본문
*** 시작하기에 앞서 드리는 말씀 ***
무겐의 거의 모든 흉악 캐릭터는 윈무겐 (WinMugen) 에서만 작동합니다.
저 또한 윈무겐에 대해서만 다룹니다. 무겐 1.0은 다루지 않습니다.
하지만 무겐 1.0에서 흉악 캐릭터가 작동하지 않는 건 전혀 아닙니다.
기존의 캐릭터는 윈무겐 전용 흉악 캐릭터이기 때문에 무겐 1.0에서 작동하지 않는 것이고,
무겐 1.0 전용으로 만들어진 흉악 캐릭터는 무겐 1.0에서도 잘 작동합니다.
단, 윈무겐과 달리 무겐 1.0은 역사가 깊지 않기에 무겐 1.0 전용 흉악 캐릭터는
만들어진 것이 거의 없습니다.
따라서 무겐에 존재하는 거의 모든 흉악 캐릭터는 윈무겐 전용 캐릭터라고 할 수 있습니다.
*** 서론 ***
혼선 버그는 "영구 타겟 버그"에서 한걸음 더 나아간 코드라고 할 수 있습니다.
따라서, 이 글을 읽으시기에 앞서 "영구 타겟"에 대해 먼저 읽어주시기 바랍니다.
http://blog.naver.com/snuphe/40180519872
*** 작동 원리 ***
영구 타겟을 이용해서 상대방을 타겟으로 잡았다고 가정해 봅시다.
그런데 그 타겟은 사실 상대방의 본체가 아닌 헬퍼였고,
그 헬퍼가 DestroySelf 를 이용해서 사라져 버린다면 무슨 일이 일어날까요?
분명히 영구 타겟을 사용했기에 타겟은 존재해야 하는데, 정작 타겟이었던 헬퍼는
사라져 버렸습니다.
이러한 상황에서는 "빈 타겟"이라는 것이 생겨나게 됩니다.
분명 타겟이 있긴 있습니다. 따라서 NumTarget 트리거를 사용하면 타겟이 있다는 결과가 나옵니다.
그러나 정작 타겟은 DestroySelf 를 사용해서 사라져버린 상태입니다.
이렇게 타겟이 존재한다는 상태로 표시되긴 하지만, 정작 타겟은 없는 상태를 "빈 타겟"이라고
부릅니다.
무겐에는 총 60 개의 자리가 있습니다.
이중 4개는 플레이어를 위한 자리이고, 나머지 56개는 헬퍼를 위한 자리입니다.
1 : 1 대전에서 5개의 헬퍼가 소환된 상황을 가정해 봅시다.
일단,
1번 자리는 1P의 것,
2번 자리는 2P의 것,
3번 자리는 공백 (2 : 2 대전에서 사용됩니다.)
4번 자리는 공백 (마찬가지)
5번 자리는 제일 먼저 소환된 헬퍼의 것,
6번 자리는 2번째로 소환된 헬퍼의 것,
7번 자리는 3번째로 소환된 헬퍼의 것,
8번 자리는 4번째로 소환된 헬퍼의 것,
9번 자리는 5번째로 소환된 헬퍼의 것입니다.
이러한 상황에서 8번 자리를 차지하고 있는 헬퍼가 DestroySelf 를 사용해서
사라진다면 무슨 일이 일어날까요?
9번 자리에 있는 헬퍼가 한칸 내려와서 8번 자리를 차지하게 될까요?
정답은 "그렇지 않다" 입니다.
8번 자리에 있던 헬퍼가 사라진 상황을 가정해 보겠습니다.
1번 자리는 1P의 것,
2번 자리는 2P의 것,
3번 자리는 공백
4번 자리는 공백
5번 자리는 제일 먼저 소환된 헬퍼의 것,
6번 자리는 2번째로 소환된 헬퍼의 것,
7번 자리는 3번째로 소환된 헬퍼의 것,
8번 자리는 공백
9번 자리는 5번째로 소환된 헬퍼의 것입니다.
이처럼 공백이 되어 버립니다.
8번 자리는 계속 공백으로 유지가 되고, 새로운 헬퍼가 소환되었을 때
비로소 메꿔지게 됩니다.
혼선 버그는 이때 발생합니다.
8번 자리에 있던 헬퍼가 사실 영구 타겟에 의해 타겟으로 지정되어있던 헬퍼라고
해 봅시다.
8번 자리에 있던 헬퍼는 타겟으로 지정된 상태였는데 DestroySelf 로 사라져 버렸습니다.
그렇다면 위에서 설명해 드렸던 "빈 타겟"이 생겨나게 됩니다.
그리고 이 "빈 타겟"의 대상은 "8번 자리"가 됩니다.
따라서, 새로운 헬퍼가 소환된다면 자동적으로 8번 자리에 배정될 것이고,
그 헬퍼는 본의 아니게 타겟이 되어 버리게 됩니다.
따라서 TargetState 를 이용해서 마음대로 조작할 수 있게 되어 버립니다.
혼선 버그를 발동하고자 하는 캐릭터는 일단 두 개의 헬퍼를 소환합니다.
하나는 영구 타겟 버그를 발동하기 위한 헬퍼이고, 하나는 영구 타겟 버그에 의해
타겟으로 지정될 헬퍼입니다.
메커니즘은 아래와 같습니다.
영구 타겟 버그 발동
↓
자신의 헬퍼를 타겟으로 지정
↓
타겟으로 지정된 헬퍼에게 DestroySelf 명령을 내림
↓
타겟이었던 헬퍼가 사라지고, "빈 타겟" 생성
↓
상대가 헬퍼를 소환하는 순간 바로 타겟으로 지정되어버림
*** 본론 ***
코드를 직접 살펴봅시다.
[statedef -2]
[state ]
type = helper
; 영구 타겟을 발동하는 헬퍼입니다.
triggerall = !ishelper
trigger1 = !numhelper(10000)
helpertype = player
; 안정성을 위해 헬퍼타입은 플레이어로 설정해 줍시다.
stateno = 10000
id = 10000
pos = 0,0
postype = p1
ownpal = 1
[state ]
type = helper
; 영구 타겟의 대상이 될 헬퍼입니다.
triggerall = !ishelper
trigger1 = !helper(10000),numtarget
; 헬퍼(10000)이 타겟을 가지고 있지 않을 때만 소환
trigger1 = !numhelper(10001)
helpertype = player
stateno = 10001
id = 10001
pos = 0,0
postype = p1
ownpal = 1
[state ]
type = selfstate
; "state 고정"입니다.
trigger1 = ishelper(10000)
value = 10000
ignorehitpause = 1
[state ]
type = selfstate
trigger1 = ishelper(10001)
value = 10001
ignorehitpause = 1
;******************************
[statedef 10000]
movetype = A
; Hitdef 를 사용하기 때문에 movetype 은 A 로 두어야 합니다.
anim = 1
; 공격 판정이 있는 애니메이션
[state ]
type = hitdef
trigger1 = !numtarget
attr = ,NA
sparkno = -1
affectteam = F
; 우리 팀의 헬퍼를 공격하는 것이 목적이기 때문에 팀킬 설정을 해줍니다.
ignorehitpause = 1
[state ]
type = reversaldef
; 영구 타겟 발동용 리버설입니다.
trigger1 = numtarget
reversal.attr = SCA,AA,AT,AP
sparkno = -1
ignorehitpause = 1
;******************************
[statedef 10001]
anim = 2
; 피격 판정이 있는 애니메이션.
; 헬퍼(10000) 에게 공격당할 수 있도록 만들어야 합니다.
[state ]
type = destroyself
trigger1 = helper(10000),numtarget
; 영구 타겟이 발동되었을 때, DestroySelf 명령을 내립니다.
ignorehitpause = 1
이렇게 하면 다음번에 나오는 헬퍼는 이유 불문하고 무조건 헬퍼(10000) 의 타겟이 됩니다.
OTHK 의 경우, Hitdef 로 공격해 들어오는 헬퍼만 타겟으로 잡을 수 있지만,
혼선 버그를 사용하면 무슨 헬퍼건간에 무조건 타겟으로 잡아버릴 수가 있습니다.
일단 타겟으로 잡으면 TargetState 명령어를 이용해서 마음대로 조작할 수가 있게 됩니다.
단, TargetState 명령어는 trigger1 = 1 처럼 무한정 발동되게 지정해 두면 안된다는 점을
숙지해 두시기 바랍니다. (하나의 스테이트에 고정되어 버립니다.)
댓글목록 0
등록된 댓글이 없습니다.