초즉사 && 초즉사 응용 && 직사
페이지 정보
작성자 Aravis 작성일 24-02-06 16:57 조회 1,440 댓글 0본문
*** 시작하기에 앞서 드리는 말씀 ***
무겐의 거의 모든 흉악 캐릭터는 윈무겐 (WinMugen) 에서만 작동합니다.
저 또한 윈무겐에 대해서만 다룹니다. 무겐 1.0은 다루지 않습니다.
하지만 무겐 1.0에서 흉악 캐릭터가 작동하지 않는 건 전혀 아닙니다.
기존의 캐릭터는 윈무겐 전용 흉악 캐릭터이기 때문에 무겐 1.0에서 작동하지 않는 것이고,
무겐 1.0 전용으로 만들어진 흉악 캐릭터는 무겐 1.0에서도 잘 작동합니다.
단, 윈무겐과 달리 무겐 1.0은 역사가 깊지 않기에 무겐 1.0 전용 흉악 캐릭터는
만들어진 것이 거의 없습니다.
따라서 무겐에 존재하는 거의 모든 흉악 캐릭터는 윈무겐 전용 캐릭터라고 할 수 있습니다.
*** 서론 ***
많이 피곤한 탓에 아주 간단히만 쓰겠습니다.
*** 작동 원리 ***
무겐에서는 [statedef xxxx]를 "state (스테이트)",
스테이트 안에 포함된 [state ]를 "state controller (스테이트 컨트롤러)"라고 부릅니다.
하나의 스테이트에는 최대 512개의 스테이트 컨트롤러가 존재할 수 있습니다.
만일 513개 이상의 스테이트 컨트롤러가 존재할 경우, 해당 스테이트가 실행되었을 때
무겐이 강제 종료하게 됩니다.
예를 들어서, 이러한 스테이트가 존재한다고 해봅시다.
[statedef 1000]
[state 1]
type = null
trigger1 = 1
[state 2]
type = null
trigger1 = 1
[state 3]
type = null
trigger1 = 1
...
...
...
[state 510]
type = null
trigger1 = 1
[state 511]
type = null
trigger1 = 1
[state 512]
type = null
trigger1 = 1
1000 번 스테이트에 존재하는 스테이트 컨트롤러의 개수는 512개입니다.
따라서 ChangeState 명령어를 통해 1000 번 스테이트로 이동한다고 해서 딱히
문제가 생기거나 하진 않습니다.
하지만 이런 스테이트는 어떨까요?
[statedef 2000]
[state 1]
type = null
trigger1 = 1
[state 2]
type = null
trigger1 = 1
[state 3]
type = null
trigger1 = 1
...
...
...
[state 511]
type = null
trigger1 = 1
[state 512]
type = null
trigger1 = 1
[state 513]
type = null
trigger1 = 1
2000 번 스테이트에는 513개의 스테이트 컨트롤러가 존재합니다.
따라서 2000 번 스테이트로 가는 ChangeState 명령어가 있다면,
이러한 명령어는 발동 즉시 무겐이 강제 종료하게 됩니다.
그러나 이를 막을 수 있는 방법이 한 가지 있습니다.
바로 hitpausetime 을 걸어 놓는 것입니다.
여러분도 아시다시피 Hitdef와 프로젝타일, 그리고 리버설에는
pausetime =
이라는 파라미터가 있습니다.
이는 자신과 상대에게 경직시간을 주는 파라미터로서,
이 파라미터에 의해 경직이 걸리게 되면, 경직이 풀릴 때까지 남은 시간이
바로 hitpausetime 이 됩니다.
따라서, hitpausetime 이 존재한다는 것은 뭔가에 맞아서 경직이
걸려 있는 상태라는 말이 됩니다.
hitpausetime이 일정값 이상 존재하는 시점, 즉 무언가에 맞아서 경직이 걸려있는
상태에서 ChangeState (혹은 SelfState) 를 이용, 위에 있는 2000 번 스테이트로 간다면
무슨 일이 벌어질까요?
아무리 스테이트 컨트롤러의 개수가 512개를 초과한다고 해도 hitpausetime이 일정값 이상
존재한다면 (경직이 걸려있다면) 무겐이 강제 종료하지 않게 됩니다.
그런데 다시 원점으로 돌아와서, 스테이트 컨트롤러의 개수가 512개를 넘으면 무겐은 도대체 왜
강제 종료하게 될까요?
무겐에서 하나의 스테이트에 허용된 공간은 (메모리는) 딱 512개입니다.
따라서 하나의 스테이트에 512개 이상의 스테이트 컨트롤러가 존재하게 되면
원래 허용된 공간보다 더 큰 공간을 사용하게 되는 것입니다.
이러한 상황에서 무겐은 추가적인 오류를 방지하기 위하여 "하나의 안전장치로서"
스스로 강제 종료하게 되는 것입니다.
그렇다면 hitpausetime 을 이용, 강제 종료를 막는다면 도대체 무슨 오류가 일어날까요?
처음엔 아무도 알지 못했지만, 흉악 캐릭터의 세계가 발전함에 따라서 이러한 오류에 대해서도
낱낱히 밝혀지기 시작했습니다.
스테이트 컨트롤러의 개수가 512개를 넘는데도 hitpausetime 에 의해 무겐이 강제 종료하지
않는다면 아래와 같은 일이 벌어지게 됩니다.
일단 어떤 스테이트가 550개의 스테이트 컨트롤러를 가지고 있다고 가정해 봅시다.
ChangeState를 이용해서 이 스테이트로 이동하되, hitpausetime 을 이용, 강제 종료를
막았다고 해 봅시다.
이 때, 550개의 스테이트 컨트롤러 중에서 앞에 있는 512개는 처음에 정해진 512개의 메모리에
쓰여지게 됩니다.
하지만 뒤에 남아있던 38개는 스테이트 컨트롤러를 위한 메모리 뒤의 공간에
강제로 쓰여지게 됩니다.
(hitpausetime 이 걸려있기 때문에 ignorehitpause=1 옵션을 줘야지 쓰여질 수 있게 됩니다.)
스테이트 컨트롤러 뒤에는 alive 값을 관리하는 메모리 공간, statetype, movetype, hitpausetime
등을 관리하는 메모리 공간이 있습니다.
따라서 스테이트 컨트롤러의 개수가 512개를 넘게 되면, alive, statetype, movetype 과 같은 값들이
제멋대로 바뀌어 버릴 수가 있습니다.
흉악 캐릭터 제작자들이 주목한 것은 바로 alive 값입니다.
alive 값을 관장하는 메모리 영역은 553번째, 554번째, 555번째, 556번째. 이렇게 4개라는 것을
이용하여 흉악 캐릭터 제작자들은 alive 값을 마음대로 변경할 수 있게 되었습니다.
따라서, 상대방의 라이프에 간섭하지 않고 바로 alive 값을 0 으로 만들어 버려서
상대를 즉사시킬 수가 있게 되었고, 이는 "초즉사"라고 불리우게 되었습니다.
NoKO 방어법이나 SelfState 회피법 등을 싸그리 무시해버릴 수 있다는 점에서
초즉사는 굉장히 강력한 코드로 인정받게 되었습니다.
하지만 제작자들은 여기서 그치지 않았습니다.
헤당 값을 원하는 값 (16진수) 으로 바꿔주는 persistent, 특이한 성질을 지닌 changestate 를
이용해서 alive 값을 -255 와 같은 음수로 지정해버릴 수도 있게 되었고,
결국은 죽어버린 캐릭터를 다시 부활시키는 지경에 이를 수 있게 되었습니다.
아직 한참 남았습니다.
흉악 캐릭터 제작자들은 이를 응용, 캐릭터의 palno 값이나 helpertype 값까지 변형시킬 수
있게 되었고, palno 값을 변경해서 캐릭터를 강제로 약하게 만들거나, helpertype 값을 변경해서
헬퍼를 무방비 상태로 만들어버리는 코드가 등장하게 되었습니다.
이러한 코드는 "초즉사 응용" 코드라고 불리우게 되었습니다.
결국 헬퍼의 parent 값까지 변경해버릴 수 있는 지경에 이르게 되었고,
상대방의 헬퍼를 자신의 것으로 만들거나, 자신의 헬퍼를 상대방에게 일부러 줌으로서
상대방을 격파하는 방법도 고안되게 되었습니다.
그리고 끝내... "직사" 코드가 고안되게 되었습니다.
"초즉사"와 "초즉사 응용" 코드는 캐릭터의 alive, palno 등을 마음대로 바꿔버릴 수 있는
코드입니다.
따라서 상대방에게 이것을 적용시키기 위해서는, 상대방을 강제로 자신의 스테이트로
끌고와야만 했습니다.
그러나... 캐릭터의 alive 값이 아닌, "상대 캐릭터의 alive"값을 조정할 수 있는, 흔히
"직사" 라고 부르는 코드가 고안되게 되었고,
흉악 캐릭터들은 더이상 복잡한 싸움을 벌일 필요가 없게 되었습니다.
단순히 시작하자마자 "직사"코드만 발동하면 상대는 바로 끝나 버리기 때문입니다.
하지만 여기서 그치지 않고, "parent 날조"라는 코드가 등장하게 되었습니다.
이 코드는 헬퍼의 parent 를 무겐의 특정 주소값으로 정해버리는 코드입니다.
이 상태에서 ParentVarSet 을 발동하면, 무겐의 특정 주소값을 건드리는 일이 가능해집니다.
그리고 제작자들은 이를 이용해서 상대 캐릭터를 게임에서 삭제해 버리는 코드를
구동하는데 성공하기에 이르렀습니다.
댓글목록 0
등록된 댓글이 없습니다.