게임 스피드런 버그가 가능한 이유

게임에서 스피드런 영상을 보고 있으면 캐릭터가 벽을 뚫고 지나가는 현상이나, 있어서는 안 되는 장소로 순간 이동하는 장면을 볼 수 있는데요. 이번 포스팅에서는 이런 버그가 우연으로 일어나는 것이 아니라 게임 코드의 허점이 원인이라는 것을 실제로 프로토타입을 만들어 재현해보면서 확인해보겠습니다.

1. 스피드런 버그의 세 가지 유형

스피드런의 정의

스피드런 관련 게임 커뮤니티에서 찾아내는 버그는 크게 3가지가 있는데요. 숫자가 최대값을 넘어서 엉뚱한 값으로 뒤집혀버리는 정수 오버플로우와 충돌판정이 물체의 이동 경로 전체가 아닌 특정 프레임의 위치만 체크해서 발생하는 충돌판정 허점, 마지막으로 개발자가 예상하지 못한 순서로 사건이 발생했을 때 상태 체크를 하지 않는 시퀀스 브레이크입니다. 요약하자면 다음과 같습니다.

  1. 오버플로우
  2. 충돌판정 허점
  3. 시퀀스 브레이크

아래에서는 이 3가지의 원인을 모색하는 글을 작성해보도록 하겠습니다.

1.1. 오버플로우로 인한 버그 원인

이의 대표적인 예시는 포켓몬스터의 미싱노입니다. 해당 버그는 게임이 특정 지역에서 야생 포켓몬을 만나기 전에 플레이어가 방문했던 지역 리스트를 배열로 저장해두는 방식과 연관이 있습니다.

정해진 절차를 지키지 않고 특정 순서로 지역을 이동하기 시작하면 이 배열에 값이 제대로 채워지지 않은 상태로 참조되고, 결과적으로는 메모리에 존재하던 엉뚱한 값이 포켓몬 데이터로 읽혀져서 기괴한 그래픽의 포켓몬이 등장하게 됩니다. 정수나 배열 인덱스가 개발자가 의도한 범위를 벗어나면 무슨 사건이 발생할지 보여주는 대표적인 예시라고 할 수 있습니다.

1.2. 충돌판정 허점의 원인

이를 직접 체크해보고 싶어서 예전에 만들어봤던 2D 플랫포머 물리 프로토타입의 이동 속도를 극단적으로 높여보았는데요. 평소 속도에서는 문제없이 벽에 부딪히던 캐릭터가, 속도를 몇 배로 올리자마자 게임상의 벽을 그대로 통과해버렸습니다.

이건 터널링이라 불리는 현상으로 매 프레임마다 물체의 현재 위치에서만 충돌 여부를 확인하는 방식 때문에 발생합니다.

물체가 한 프레임 동안 벽 두께보다 훨씬 더 멀리 이동하면 충돌 테스트가 이루어지는 두 시점 사이에서 벽을 완전히 뚫어버려 캐릭터가 벽에 부딪힌 적이 없는 것처럼 게임상에서 처리가 되는 것입니다. 스피드런에서 대표적으로 발생하는 “벽 뚫기” 버그의 상당수의 원인이 이것이라고 할 수 있습니다.

1.3. 시퀀스 브레이크 원인

세 번째 유형으로 소개했던 시퀀스 브레이크는 조금 결이 다르다고 할 수 있는데요. 대부분의 게임은 “이 문을 열기 위해서 열쇠가 있어야 합니다.”는 식으로 순서를 강압적으로 행사하는데, 이 순서 확인이 특정 조건 하나에만 의존되는 경우가 아주 많습니다.

예를 들어서, 열쇠 소지 여부 확인을 하는 코드가 아니라 특정 방에 진입했는지의 여부만 확인하게 된다면, 그 방에 진입한 것으로 잘못 체크하게 만드는 다른 경로(점프로 건너 뛰거나 별도의 트리거를 우회하는 방식)를 찾으면 열쇠 없이도 문을 여는 것이 가능해집니다. 게임을 만든 개발자 입장에서는 정상적인 플레이에서는 결코 마주칠 수 없는 길이라고 생각했던 것이 스피드런에서는 오히려 최적의 루트가 되는 경우가 많습니다.

2. 스피드런은 어떻게 발견될까?

이런 버그는 아무 의도 없이 우연히 발생되는 경우가 허다하지만, 대부분의 경우 TAS라고 하는 도구로 게임의 메모리 값을 프레임 단위로 직접 확인하고 체계적으로 찾아낸 결과라 할 수 있습니다.

슈퍼마리오64 분석으로도 유명한 채널 Pannenkoek2012는 수십 개의 영상에 걸쳐서 게임의 물리 코드를 역공학 수준으로 분석하여 왜 특정 행동이 버그로 이어지는지 프레임 단위로 설명해왔습니다. 이런 콘텐츠들이 존재한다는 사실 자체가 스피드런 버그가 직감이나 우연이 아니라 실제로 분석이 가능한 영역이라는 것을 보여줍니다.

3. 결과 해석 시 유의할 점

하지만, 커뮤니티의 설명이 항상 특정 게임의 실제 소스 코드와 완벽히 일치한다고 할 수는 없습니다. 대부분의 게임은 소스 코드가 공개 되고 있지 않기 때문에 커뮤니티의 분석은 면밀히 체크한 동작을 바탕으로 한 추정에 불과하며 시간이 지나면서 더 정확한 방식으로 갱신되기도 합니다.

더불어서 제가 직접 재현한 터널링 현상도 원인이 될 수도 있는 여러 원리 중 하나를 설명하고 보여준 것일 뿐, 실제 게임상의 버그가 완벽히 같은 원인으로 인해 발생되었다고 보기는 어렵습니다.

4. 총평

게임상의 스피드런 버그는 게임이 고장났다는 주장에 뒷받침되는 근거가 아니라 게임 개발자가 세상에 존재하는 모든 경우의 수를 검증할 수가 없기 때문에 코드의 틈이 드러난 결과에 가깝다고 할 수 있습니다.

다음에 신기한 스피드런 클립을 볼 수 있게 된다면 그 뒤에 정수 오버플로우나 충돌판정의 빈틈 혹은 시퀀스 브레이크 같은 구체적인 이유가 있다는 것을 떠올려보길 바라며 이번 포스팅은 여기서 마무리하도록 하겠습니다.

댓글 남기기