슈퍼 마리오 64/버그


1 개요

슈퍼 마리오 64의 버그들을 모아 놓은 문서다. 다만, 일반적으로 잘 알려져있는 버그들만 모아 놓았다.

2 클로닝(Cloning)

들어올림과 파괴가 모두 가능한 오브젝트를 파괴되기 직전에 잡아올리는 버그다. 일반적으로 오브젝트를 잡는다고 판정하는 시간은 0프레임으로 즉발하지만 유일하게 펀치하여 잡는데에는 2프레임이 소요된다. 즉 그 2프레임안에 파괴된 오브젝트를 들어올림으로 발생하는 버그다. 피치성 내외나 암흑의 쿠파맵을 제외하고 어느맵에서나 이러한 오브젝트가 존재한다.

2.1 폭탄병 버그

대부분의 TASer나, 유저들은 다 아는 버그다.

먼저 폭탄병을 집은 후, 점프와 동시에 던지고 폭탄병이 땅에 닿아 터지기 직전에 다시 집으면 타이밍에 따라 두가지의 경우가 생긴다.

  • 커진 폭탄병을 들고있다.
    • 이 같은 경우는 뒤로가는 속도가 꽤 빠른데, 이는 TAS에서도 자주 쓰이는 버그다.
  • 일반적인 폭탄병을 들고있지만 터지지는 않는다.
    • 이를 이용해 폭탄병을 가까이에 있는 다른 오브젝트로 바꿀 수 있다. 이를 Cloning이라 한다.[1]

파일:Sm64 bug bomb 1.png
파일:Sm64 bug bomb 2.png
위와 같이 다양한 오브젝트들을 들 수 있다.

2.2 코인 박스 버그

작은 박스를 이용해 위의 폭탄병 버그처럼 할 수 있는 버그.

하는 방법은 간단하게 박스가 없어지기 직전에 다시 집으면 된다. 폭탄병 버그와 같지만 타이밍이 더욱 중요시되며 방법은 세부적으로 두가지로 나뉜다.

  • 박스를 던진 후 벽에 닿아서 터지기 직전에 다시 집는다.
  • 박스를 땅에 내려놓은 후[2] 시간이 지나(30초) 없어지기 직전에 다시 집는다.

마찬가지로 각종 오브젝트로 만들 수 있다.

2.3 원리

VS#n

일반적으로 물리적 형체가 있는 데이터를 오브젝트라고 부르며 이러한 오브젝트들을 인게임에 반영하게 할 수 있는 시스템을 오브젝트박스(OBJ)라고 부른다. 오브젝트는 일정 범위 내에 마리오가 존재할 때 스폰/리스폰하게되는데 이 때 스폰된 오브젝트를 오브젝트박스가 관리하게 된다. 오브젝트박스의 한계치는 232이며 이 이후로 오브젝트가 더 로드되려고 하면 튕긴다. 즉, 범위 밖의 오브젝트를 온오프함으로 프로세스 요구량을 줄여주는 역할을 하며 상기했듯 리스폰의 역할도 한다. 또, 물리값이 없는 시각적인 오브젝트[3] 또한 관리한다.
위 오브젝트들이 오브젝트박스에 추가되는 것을 로드, 오브젝트가 없어지는 것을 언로드라고 한다. 여기서부터 클로닝의 핵심이 시작된다. 5개의 오브젝트를 로드했다고 하자. 이 때 오브젝트박스가 사용하는 칸은 로드한 순서대로 5칸이 된다. 이 때 오브젝트를 3개 제거(언로드)했을 경우 사용하는 칸은 2칸이 된다[4]. 그렇다면 나머지 3칸은 어디로 갔을까? 바로 이것이 핵심. 언로드 된 후의 빈 박스는 그 자리에 계속 있는게 아니라, 사용되고 있는 박스의 마지막자리의 바로 뒷자리에 한꺼번에 역순으로 묶인 채 옮겨진다. 박스를 숫자로 표현해보자면, 순서대로 로드된 박스 12345에서 235를 언로드 했을 때 박스 순서는 14|532가 된다. 물론 박스 자체에 주어진 이름은 없지만 그렇다고 가정해본 것이다. 이러한 과정으로 순서를 위해 붙여진 임시적인 박스의 이름을 VS#n라고 한다. 이 원리를 먼저 인지하도록 하자.

도입에서 기술한 내용으로 진행해보자. 그 방법으로 마리오가 무언가를 들어올린 상태는 그 오브젝트를 담당한 오브젝트박스의 VS#에 저장이 된다. 여기서 클로닝이 시작된다. 마리오가 들어올린 오브젝트의 스폰범위의 바깥으로 나가면 들고 있는 오브젝트가 완전히 언로드되고[5] 마리오가 들고있는 오브젝트박스의 순서가 뒤로 밀려난다. 만일 일정거리 갔다가 다시 되돌아간다면 없어야 할 오브젝트가 멀쩡히 있다. 마리오가 들고있는 오브젝트는 파괴되는 과정을 둔 원래의 오브젝트와 같으면서도 독립적인 존재이기 때문에 이런 일이 발생하는 것이다. 이렇게하면 클로닝의 첫 단계를 성공한 것이다.

이렇게 빈 오브젝트박스를 들고있는 마리오가 이동하여 순서에 맞춰 굼바가 로드되었다면 들고있는 오브젝트박스에 굼바가 추가됨으로써 마리오는 굼바를 가지고 있는 것으로 판정하게된다. 들고있는 것으로 판정된 원래 굼바는 제 자리에서 정상적으로 잘 돌아다니고 있다. 이 때 마리오가 오브젝트를 던지(오브젝트박스에서 해제하)는 순간 돌아다니던 굼바가 갑자기 던진 위치(HOLP)로 순간이동하더니 형체와 물리값만 남긴 채 그 위치에 1회용으로 존재해버리게 된다. 오브젝트에도 마리오가 던진 후의 상태고유값이 있는데 굼바나 코인 등은 들어올릴 수 없으므로 이러한 현상이 발생하는 것이다. 이렇게 클로닝의 첫 루프 끝. 오브젝트박스의 칸이 한계치까지 가기 전까지 무한정 복사할 수 있다.

하지만 먼지 등의 요소 때문에 원하는 복제를 위해서는 계산을 잘 해야하는 것을 요한다. 대신 특정한 행동이나 이펙트마다 오브젝트박스 고유요구량이 있으니 크게 문제될 변수는 없다. 직접 연구해보자.

여담으로 클로닝은 엄밀히 말하면 오브젝트를 먹거나 사용하지 않았다고 속이면서 바꿔치기하는 버그다. 예를들어 코인. 무더기로 있는 코인의 경우에는 먹었다고 판정하는 신호가 제 위치 밖에서는 인식되지 않아서 바꿔치기 후 리스폰시키면 원래대로 되돌아가는 것을 볼 수 있다. 다만 레드코인의 경우에는 그 자체로 고유하기 때문에 바꿔치기로 먹어도 2코인만 얻을 수 있고 레드코인 카운트가 추가되지는 않는다. 또한 오브젝트박스에 기본적으로 항시 로드되어있는 오브젝트들[6]을 위 방법으로 바꿔치기 하면 인터페이스 자체가 이동하고, 언로드 개념이 없는 오브젝트이기 때문에 범위 밖으로 들고나가도 제기능을 잃지 않으며, 던지면 그 자리에 영원히 고정된다.

3 BLJ(Backward Long Jump)

국내에서는 무한뛰얏후, 무한멀리뛰기, 이야야야야야야야얏후 등으로 잘 알려져있는 버그다. 실제로 슈퍼 마리오 64 TAS의 기본적이고 필수적인 버그 중의 하나다.

다만, 추후의 진동팩 대응 버전에서는 수정되어서 이전의 북미판, 일본판에서만 사용 가능한 버그다. 버추얼 콘솔에선 사용할 수 있다.

멀리뛰기를 하면서 속도가 점점 증가하여 엄청난 속도로 벽을 뚫을 수도 있는 버그다. 단, 툴 없이 발생하는 버그를 다루는 문단이므로 TAS를 이용한 BLJ는 아래 툴을 이용한 버그 문단 참조.

하는 방법은 의외로 쉽다. 대신 TAS 수준으로 세밀한 컨트롤이 아닌 이상 오직 계단이나 특수 지형에서만 가능하다.

  • 먼저 앞으로 멀리뛰기를 한 후에 바로 반대 방향키를 눌러 뒤로 멀리뛰기를 한다.
  • 그리고 Z키를 눌러 숙인 상태를 유지하면서, 뒤를 누른 상태로 점프키를 연타하면 된다. 다만 거의 손이 안보일 정도로 연타해야된다. 제일 연습하기 좋은 곳은 성 최상층에 있는 무한의 계단.

4 Side BLJ

위와 같은 BLJ지만 하는 방법이 조금 다르다. 보통은 앞으로 멀리뛰기 하며 뒷키를 눌러서 뒤로 하지만, 이건 이름대로 옆에서 하는 것이다. 이건 대부분 계단이 아닌, 벽에서 한다. 단, 계단과 붙어있는 벽이여야 한다. 우선 계단에 있는 각 블럭들의 끝 중 아무 곳이나 잘 맞춰서 선 다음, 원하는 옆 방향으로 멀리뛰기를 한 후, 똑같이느리게 해서 점프키를 연타하면 된다. 하지만 처음에는 꽤 어려울 수 있다. 기존과 약간 다르고 끝에 거의 정확히 맞춰야 하기 때문이다.

5 BLJ를 이용한 HSF

HSF란 HyperSpeed Flying, 즉 엄청난 속도로 나는 것이다. 먼저 날개마리오 모자를 먹은 뒤에, BLJ를 이용해 속도를 높인 다음, 잘 조작하여 3단 점프를 해서 날면 속도가 엄청나게 빨라진다. 너무 빨라서 느리게 해서 조작하는 방법 외에는 컨트롤이 어렵다. HSW(Hyper Speed Walking)라는 것도 있다.

영상을 직접 보자.

이건 폭탄병의 전쟁터에서 하는 영상.

6 꽈당이 버그

꽈당킹의 요새에 있는 꽈당이들을 쉽게 죽일 수 있는 버그다. 초보자들도 쉽게 해낼 수 있다.

방법은 간단하다. 꽈당이가 넘어지기 직전에 점프를 하면 된다. 그러면 꽈당이는 마리오를 뚫고 넘어진다.

7 벽 속의 스타 먹기 버그

꽈당킹의 요새에 있는 미션 중에 벽을 부숴서 스타를 획득하는 미션이 있다. 원래는 대포를 이용해 벽을 부순 다음, 스타를 먹어야 하지만 버그를 이용해 대포 없이도 먹을 수 있다.

  • 위치를 잘 맞추고 벽에 닿으면 된다.

8 토끼 버그

말 그대로 토끼를 이용한 버그이며, 15 스타를 모으면 지하에 나타나는 토끼를 잡고 문에 딱 달라붙어서 놓으면 마리오가 문을 통과함과 동시에 토끼도 문에 낀다.[7] 그 상태로 다시 토끼를 집을 수 있으며, 그 버그를 이용해 30 스타를 모아야 갈 수 있는 문도 뚫을 수 있다. 이 버그는 슈퍼 마리오 64 DS에서도 비슷한 형태로 나타난다.

9 로비 버그

피치 성 메인 로비에서 할 수 있는 버그 중 하나이다. 성에 처음 들어와서 가운데 계단 양 쪽에 있는 나무 문으로 들어간 뒤에 다음과 같이 하면 된다.

파일:Lobby w.png

사진과 같은 비슷한 위치에 선 후, 앞, 오른쪽 방향키를 동시에 누른 채로 2단점프를 하면 아래 사진과 같이 올라올 수 있다.

Lobby.png
반대쪽도 같은 방법으로 하면 되며, 위 사진 속 위치에서 멀리뛰기를 해서 BLJ도 할 수 있다. 실제로 구 TAS 타임어택에서 쓰였던 버그. 지금의 TAS 루트는 조금 바뀌어서, 폭탄병의 전쟁터로 들어가는 문 바로 앞의 계단에서 BLJ를 해서 바로 암흑 세계의 쿠파로 가는 루트다. 그러나 RTA에선 계단에서 BLJ가 매우 어려워서 위의 방식을 사용한다.

10 김수한무 스킵 버그

스토리를 처음 시작하고 성 입구 바로 앞의 다리로 가면 카메라맨인 김수한무가 성 입구 문에서 나타나서 카메라 조작 관련 설명을 해주는데, 바로 옆 다리 난간으로 멀리뛰기를 해서 넘어가면 김수한무를 만나지 않고 바로 스킵할 수 있다. RTS에서도 쓰이는 버그이다. TAS 에서는 슬라이드 버그를 이용해 속도를 높여서 2단 점프로 그냥 넘어가는데, 다리에 닿지 않고 문 앞까지 바로 넘어가면 김수한무가 안 나온다.

멀리뛰기를 이용해 스킵하는 영상.

11 투척병 버그

투척병은 원래 마리오가 멀리 있거나, 바로 앞이 낭떠러지일 때는 따라오지 않는다. 또한 집어서 던지거나 해서 땅에 닿게 하면 바로 죽어버린다. 이 버그는 마르고 젖은 세계에 있는 투척병을 바닥까지 내려오게 하는 버그이다. 먼저 투척병을 든 후, 끝 모서리 까지 간 다음 타이밍에 맞추어 점프하고 투척병에게 떨어지면 투척병이 떨어지기 직전에 잡아서 던진다. 그럼 투척병은 죽지 않고 계속 살아있게 된다. 다른 버그로는 바로 위에 있는 물 높이 조절 다이아몬드를 이용해 물 높이를 높인 다음, 물이 다 차오르기 전에 투척병을 집으면 아래와 사진과 같이 된다. 또한 다른 스테이지에 존재하는 투척병도 똑같은 방법으로 사용할 수 있다.
파일:Sm64 chunkya bug.png
이렇게 된 상태에서는 마치 다른 오브젝트를 든 것 처럼 움직이고, 던질 수 있다. 또 이 버그를 이용해 위의 폭탄병 버그 사용 시에 나타나는 현상도 나타나게할 수 있다. 다만 이 버그는 슈퍼플레이 용으로, 타임어택에서는 쓰이지 않는다.

이 버그를 하고 있을 때 주의할 점은 잡고있는 상태에선 항상 같은 방향을 바라보면서 이동하며 후딜이 끝나는 틈을 주지 말아야 한다는 것이다. 단 방향의 교체는 물에 들어가 헤엄치거나 나무를 잡거나 미끄러지는것으로 해결할 수 있다.

12 벽차기 버그

벽차기를 쉬지않고 연속으로 하면 속도가 점점 빨라지는 버그이다. 이를 HSWK(Hyper Speed Wall Kicks)라고 부른다. 하지만 계속 하다보면 눈갱을 당할 수 있다.

실제로 이 버그를 이용한 TAS도 있다.

13 속도 보존의 법칙

위 BLJ를 이용해 속도를 엄청나게 높인 후, 조작을 통해 물속에 들어가거나 나무, 봉에 매달리면 속도가 일반적인 속도로 된다. 하지만 거기에서 빠져나오는 순간 가속도가 붙는다. 보통 마리오가 땅에 착지하거나 하면 가속도가 덮어쓰기 되어 0으로 돌아오지만 몇몇 동작은 마리오가 땅에 착지할 때 가속도를 덮어쓰지 않고 가속도가 계속 유지되게 된다. 여기서 공중으로 떨어지면 가속도가 다시 발동해 가속도의 방향에 따라 붕 뜨거나 미끄러지게 된다. 펀치 같은 동작은 마리오가 땅에서 가속도를 유지시키며 이동할 수 있게 한다.. 그냥 소닉닌자를 합쳤다고 보면 된다.

또한, 메탈 마리오 상태로 물속에 들어간 상태에서도 똑같이 작용한다.

여담으로 디버그 치트를 이용해 속도를 확인할 수도 있으니 참고바란다.

14 PU (Parallel Universe)

  • 앞서 설명한 BLJ나, 마리오가 특정 지점에 낀 채로 계속 걷는 HSW(Hyper Speed Walking) 등을 이용해 속도를 엄청나게 쌓으면 마리오는 평행우주로 가게 된다. 닌텐도 64로 평행우주를 방문하면 즉시 게임이 튕기지만, 에뮬레이터버추얼 콘솔은 튕기지 않는다. 튕기는 건 닌텐도 64 자체 버그로 보인다.[8]

마리오의 이동경로는 Float(16진수)값을 사용하지만 물리좌표에서는 Short(8진수)값을 사용해서 벌어지는 버그다. 풀어보면 좌표의 한계치는 -32768~32767. 그런데 마리오가 이 좌표를 뚫고나가버리면 좌표는 자동적으로 65536을 더하거나 빼게 된다. 즉, 마리오는 아무것도 없는 세계에서 원래맵의 지형을 그대로 받는 평행세계에 도착하는 것이다.

다시말해, 마리오가 평행세계에 도달하기 위해서는 최소한 65536의 스피드를 내야 한다. 그런데 이 마저도, 마리오의 경로는 이동 전후의 결과에다가 4등분을 하여 판정하는 중간단계가 있어서[9] 마리오가 내야하는 최소 속력은 65536*4 정도로 엄청나게 불어나게 된다. 끝이 아니라, 평행세계에 도달한 이후로는 마리오가 가속도를 낼 수단이 없어지고, 지형의 굴곡까지 영향을 받아서 실제 이동경로의 거리가 감소하기 때문에 안전하게 평행세계를 배회하기 위해서는 최종적으로 약 50만의 속력을 내야 한다. 또 평행세계에는 오브젝트가 없기 때문에 원래세계에서 맵을 이동하거나 스타 등을 먹기 위해서는 되돌아와야하기까지 한다. 이 때문에 평행세계의 몇행/몇렬에 있는지 파악하게 해주는 가상의 개념인 PU map가 도입된다. 원점은 오브젝트가 있는 원래세계가 기준.

보다시피 조건이 엄청나게 많아서 이러한 개념을 사용하려면 선행계산이 필요할 뿐더러 제대로 사용할 수 있는 방안도 적다. 하지만 2016년 10월 경 나온 4분컷 TAS에서는 이러한 원리를 이용해 용암 세계의 2,3층 돌파는 물론 암흑 세계의 쿠파맵을 아예 입장조차 하지 않고 모조리 스킵해버리는 위엄을 보여주었다. 잠재용도가 굉장히 높은 버그로 더 많은 기록들이 개선될 예정에 있다.

15 기타 버그

  • 일본 버전(진동판 제외)에서 1000개의 코인을 먹으면, 마리오의 목숨이 -25개가 된다. 코인이 1000개가 되면 코인 개수를 다시 999개로 바꾸도록 프로그래밍했어야 하는데, 실수로 목숨이 999개가 되도록 프로그래밍했기 때문에 일어나는 일이다. 그러나 목숨을 저장하는 바이트는 2바이트 뿐이라, 오버플로우가 일어나 목숨이 -25개가 되는 것이다. 개임 내 수치상으로 코인 1000개가 남아있는 상태에서 요시에게 목숨 100개를 얻으려 하면 영원히 목숨이 채워지지 않게 된다
  • pannenkoek2012의 유투브 채널에도 많은 버그들이 알기 쉽게 나와 있다.
  • 아래 영상에도 많은 버그가 나열되어있다.

16 여담

슈퍼 마리오 64 TAS에서는 대부분 Mupen64 라는 에뮬레이터를 사용한다. 이 툴은 기본적으로 게임 속도 조절 기능이 있으며, 세이브/로드와 무비 녹화도 할 수 있는데, 이 무비 녹화는 세이브/로드를 막 사용해도 자동으로 이전 프레임을 저장해서 처음부터 끝까지 매끄럽게 녹화할 수 있다. 이 Mupen64 녹화 파일의 확장자는 .m64이다. TASVideos 같은 사이트에서도 타임어택 마다 이 파일을 같이 배포하고 있다. 이 툴로 녹화한 파일을 불러오면 마치 직접 플레이하고있는 것 처럼 녹화할 때 눌렀던 키들이 그대로 적용돼서 보여진다. 무비를 재생하는 중간에도 끊어서 그 시점부터 직접 플레이할 수 있다. 또, 이 무비를 재생하고 AVI 녹화도 켜 놓으면 .avi 형식의 영상도 같이 만들 수 있다. TAS를 할 때 대부분 TAS Input(TASDI.dll)[10]이라는 입력 플러그인을 사용한다. 같은 N64 에뮬레이터인 Project64에서도 사용할 수 있다.
  1. 예를 들어 굼바 3마리가 나타나는 곳에 접근해 굼바가 로드된다면 손에 굼바를 들게 된다. 코인, 스타, 플랫폼 등 온갖 오브젝트에 사용 가능하다. 다만 이런 식으로 들게 된 오브젝트를 놓으면 제기능을 못하는 것도 많다. 예를 들어 이 방법으로 생긴 플랫폼 같은 경우에는 물리적 성질을 가지지 않아 쓸모가 없다. 자세한 것은 후술.
  2. 웅크리면 들어올린 오브젝트를 놓을 수 있다. 물론 아기팽귄이나 폭탄병도 이렇게 할 수 있다. 곧 터지겠지만.
  3. 먼지나 스포너나 폭발 등. 이외에도 굉장히 많다.
  4. 당연한 소리지만 짚고 넘어가야 할 요소다. 3칸을 제거하고 난 후의 빈 박스(칸)들은 어떻게 되는가? 만약 데이터가 고정되어 있다면 오브젝트박스가 사용하는 칸은 여전히 5칸이 되어야 한다. 다시 말하지만 언로드 후 사용하는 칸은 2칸으로 변했다.
  5. 이 상태에서 마리오가 들고있는 오브젝트를 가짜(Fake)오브젝트라고 한다. 즉, 이 때는 갑자기 들고있는 오브젝트가 달라지거나 없어지는 것을 볼 수 있다. 가짜오브젝트는 던져도 던지는 모션만 취하듯 아무런 효과가 없다.
  6. 특히 npc(빨간 폭탄병), 스포너 스팟, 텔레포트 스팟, 나무 등.
  7. 가끔 토끼는 안끼이기도 하는데 이는 박치기를 이용해 문에 끼이도록 하면 된다.
  8. 카메라가 마리오를 따라오게 하지 않는다면 튕기지 않는다. 이로 보아 카메라가 마리오를 따라가려는 과정에서 너무 빠르게 이동하는 바람에 튕기는 듯 하다.
  9. 만일 3번째 이동경로에 바닥이 비었다면 2번째 경로에서 멈추게 된다
  10. 파일:Tasinput.png