게임으로 게임 만들기
게임을 제작한다고 하면 제작도구로 흔히 게임메이커, 유니티, RPG maker, 그리고 좀 더 깊게는 Unreal Engine, Java 등을 상상할 것이다. 하지만 아주 소수의 특~별한 사람들은 1990년에 SNES(Super Nintendo Entertainment System, 한국에서는 슈퍼패미콤으로 알려져 있음)에 출시된 ‘슈퍼 마리오 월드’를 상상할 것이다. 게임을 플레이함으로써 또 하나의 게임을 코딩할 수 있다는 사실이 이상하게 들릴 수도 있지만, 이를 처음으로 해낸 스피드러너 Sethbling을 비롯해, 많은 게이머들이 게임을 만드는 데 성공하였다. 이들은 게임 속에서 발견할 수 있는 각종 버그를 활용하여, 게임을 해킹하거나 치트 코드 혹은 에뮬레이터를 사용하지 않고, 단순히 게임과 게임기 있는 그대로를 가지고 Snake, Pong, 그리고 Flappy Bird과 같은 클래식 게임들을 재현해내었다.
이러한 게임 제작은 어떻게 가능한 것인가? 과정을 일일이 설명하기엔 너무 복잡하고, 작성자가 그럴 시간도 없으니 간단하게 원리만 보이겠다.
위 사진에서 볼 수 있듯이, 게임 속 시스템에서의 모든 명령은 16진수 코드로 이루어진다. 스프라이트의 좌표에서부터 특정 값을 저장 및 불러오는 것, and, not 등의 연산자까지 다 16진수로 이루어진 값들을 읽어내어 게임을 플레이 할 수 있는 것이다. 이 중에 플레이어가 임의로 조작할 수 있는 값을 스프라이트들의 xy좌표가 있다.
위 화면에서의 예시와 같이, 슈퍼 마리오 월드는 한 화면에 대해 마리오를 제외하고는 총 12개의 스프라이트들(아이템, 요시, 적 포함)의 값까지만 처리한다. 지정 array의 각 스프라이트의 xy값들이 저장되며, 이러한 좌표값은 그 스프라이트를 가진 오브젝트가 사라진 이후에도 새로운 오브젝트가 나오지 않는 이상 저장된 상태를 유지한다. 이 array들이 플레이어가 게임을 통해 직접 값을 조정할 수 있다는 점을 통해 코드를 입력할 수 있는 것이다. 자 인제 값들을 넣었으니, 게임한테 이 값들이 스프라이트의 좌표값이 아닌 다른 코드라고 알려주기만 하면 된다!!
그걸 가능하게 하는 놈이 바로 이 놈이다. 요 놈의 이름은 Chargin Chuck으로, 적 캐릭터임에도 불구하고 아이템 클래스를 상속받고 있다. 쉽게 설명하자면, 게임이 얻을 수 있는 아이템으로 취급을 하고 있다는 것이다. 하지만 평소 게임플레이에서는 게임이 오브젝트가 아이템인지 판정하는 것보다 적인지 판정하는 것을 먼저 하기에 먹을 수 없다… 이를 해결하기 위해 요시를 이용해 버섯을 먹게 시킨 후, 바로 요시에서 내려 대신 버섯을 먹는다면, 요시로 하여금 그 위치에 대신 있는 Chuck을 먹게 할 수 있다!
이렇게 되면, 게임은 Chuck을 먹었을 때 무슨 커멘드를 내려야 할지 모르기 때문에 default위치의 코드로 이동하게 된다. 근데 우연히도 이 위치가 바로 우리가 아까 변형한 아이템들의 스프라이트 위치들을 저장한 코드이다. 즉, 스프라이트 위치값들을 좌표값이 아닌 실행코드로 봄으로써 그 안에 플레이어가 코딩한 게임을 실행할 수 있게 되는 것이 바로 이 난잡한 게임메이커의 결론이다.
참고)