"초즉사" 간단설명
페이지 정보
본문
지금은 바빠서 간단히만 설명해 드리겠습니다.
1. 유래
즉사보다 강력한 즉사가 있다면 무엇이라 불러야 할까요.
종래의 즉사 코드는 엄청난 데미지를 주어서 상대방의 Life 를 0 으로 만드는 것이
대부분이었습니다.
혹은 상대방을 자신의 스테이트로 가지고 와서 LifeSet 명령어로
Life 를 0 으로 만드는 방법 또한 존재했습니다.
이렇게 Life 가 0 이 되면, 무겐에서는 해당 캐릭터의 Alive 값을 0 으로 만듭니다.
그리고 Alive 가 0 이 되었을 때, 그 캐릭터는 사망 판정이 나게 됩니다.
예외적으로 무겐의 연습모드는 Life 가 0 이 되더라도 Alive 가 0 이 되지 않도록
설계되어 있기 때문에, 연습모드에서는 상대를 KO시킬 수 없습니다.
하지만 Life 를 건드리지 않고, 직접 Alive 값에 간섭해서 상대방에게
강제로 사망 판정을 준다면...?
기존보다 훨씬 강력한 즉사 코드가 될 수 있을 것입니다.
이러한 코드를 즉사보다 강력한 즉사, "초즉사" 라고 부릅니다.
2. 원리
무겐에서는 [statedef oooo] 를 "스테이트"라 부르고,
스테이트 안에 있는 [state oo] 를 "스테이트 컨트롤러"라고 부른다는 사실은
다들 알고 계실 것입니다.
이제부터는 "스테이트 컨트롤러"를 줄여서 "스테컨"이라 부르도록 하겠습니다.
무겐에서는 하나의 중요한 법칙이 있습니다.
그것은 바로 "하나의 스테이트에는 스테컨이 512 개 까지만 존재할 수 있다." 입니다.
만일 하나의 스테이트에 513개 이상의 스테컨이 존재한다면, 무겐은 이를 읽는 순간
강제로 종료하게 됩니다.
이러한 강제종료는 프로그램의 한계를 넘어선 입력에 의해
오류가 발생하지 않도록 만들어진 안전장치라고 할 수 있습니다.
하지만, 513개 이상의 스테컨을 가지고도 무겐이 강제종료하지 않게 만드는 방법이 있습니다.
이는 바로 "HitPauseTime" 입니다.
여러분이 알고 계신 HitDef, Projectile 등에 있는
pausetime = o,o
이 바로 HitPauseTime 입니다.
이러한 hitpausetime 에 걸리게 되면, 캐릭터는 잠시 경직에 걸리게 되고
이렇게 경직에 걸린 상태에서는 512개가 넘는 스테컨을 읽어도 무겐이 강제 종료되지 않게 됩니다.
단, hitdef, projectile 에 맞은 상대는 HitShakeTime 이라는 것이 걸립니다.
이는 hitpausetime 이 아니므로 주의합시다.
hitpausetime 은 hitdef 에서 공격측에 거는 pausetime 과 reversaldef 의 pausetime 만을 사용해야
걸어줄 수 있습니다.
무겐에는 명령어를 실행하기 위한 512개의 자리가 있습니다.
예를 들어,
[statedef 3000]
[state ]
type=hitdef
[state ]
type=playsnd
[state ]
type=changestate
이렇게 3개의 스테컨이 있는 스테이트가 실행이 될 때는
512개의 자리 중에서 3개의 자리만 사용하게 됩니다.
이처럼 자리가 512개 뿐이기 때문에 513개를 넘는 스테이트는
실행되지 않는 것입니다.
그렇다면, hitpausetime 을 걸어 주어서 강제로 512개를 넘는 스테컨을
실행시키면 무슨 일이 일어날까요?
3. 덮어쓰기
강제로 512개를 초과하는 스테컨을 실행시키는 상황을 가정해 보겠습니다.
우선, 실행시킨 스테컨의 수가 520개라고 해봅시다.
이 520개 중에서 맨 위의 512개는 정상적인 자리에 자리잡게 됩니다.
하지만 미처 자리하지 못한 맨 아래의 8개는 비정상적인 자리에 오게 되며,
이러한 스테컨들은 기존에 존재하던 값을 새로운 값으로 덮어 씌우게 됩니다.
자세한 것은 해당 스테컨이 무엇이냐에 따라 달렸습니다.
[state ]
type=null
trigger1=1
이처럼
ignorehitpause=1
이 달려 있지 않은 스테컨은 hitpausetime 동안 실행되지 않으므로 아무런 영향을 주지 않습니다.
하지만
[state ]
type=null
trigger1=1
ignorehitpause=1
이렇게 hitpausetime 도중에도 실행되는 스테컨은...
해당 위치에 있는 숫자에서 1을 뺍니다.
단, 해당 위치에 있는 숫자가 0이면 아무런 작용을 하지 않습니다.
4. 응용
512번째 자리 다음에는 513번째 자리, 그 다음에는 514번째 자리...
그리고 553번째 자리에는 캐릭터의 Alive 값이 존재합니다.
그렇다면
[state ]
type=null
trigger1=1
ignorehitpause=1
를 553번째 자리에다 적음으로서 Alive 값에서 1을 뺀다면...?
캐릭터는 즉사하게 됩니다.
5. 차회예고(...)
초즉사에는 해당 값에 1을 빼는 기능 말고도 다른 기능이 존재합니다.
적절히 코드를 설계하면...
해당 값을 자신이 원하는 값으로 변경해 버릴 수가 있습니다.
또한...
사실 553번째 자리는 Alive 값의 1의자리 수를 관장할 뿐입니다.
물론 보통의 경우, Alive 값은 0 아니면 1이기 때문에 별로 상관은 없지만,
몇몇 캐릭터는 자신의 Alive 값을 232, 786 과 같은 이상한 숫자로 조작하기도 합니다.
다음에는 이에 대해서 배워 보도록 합시다.
- 이전글혼선 버그 탈출 하는 법을 알려드리도록 하겠습니다. 24.02.06
- 다음글간단히 알아보는 초즉사, 직사 코드 24.02.06
댓글목록
등록된 댓글이 없습니다.