스피드런 속 컴퓨터 지식 1편
1. 인트로 – 게임계의 작은 올림픽
최근 2020 도쿄 올림픽이 성황리에 종료되었다. 한평생 쌓아온 노력이 단 몇 분, 혹은 몇 초로 압축돼서 나타나는 치열한 싸움을 한 선수들 모두 고생했다고 말하고 싶다. 그들이 훈련을 통해 갈고닦은 순간의 판단력과 움직임으로 단 0.01초라도 기록을 경신하려는 모습이 정말 멋있다고 생각한다. 물론 결과에 따라서 누군가에게는 아쉬움이 남는 시간이었을 수도 있고 누군가한테는 특별하게 행복한 시간이었을 수도 있지만, 그들 모두한테 인생에서 잊을 수 없는 시간이지 않았을까 생각한다.
놀랍게도, 게임에도 치열하게 기록 싸움을 하는 유저도 존재한다. 그리고 그중에서 가장 대중화된 것은 ‘스피드런’(speedrun) 카테고리다. 비록 올림픽처럼 정해진 순간에만 할 수 있는 것은 아니지만, 스피드런을 하는 ‘스피드러너’(speedrunner)들은 하나의 게임을 더 빨리 깨기 위해서, 게임의 모든 메커니즘을 분석하고, 초 단위로 어떻게 더 빨리 깰 수 있는지 끊임없이 연구한다. 그중에서는 정말 생각지도 못한 놀라운 버그에 가까운 발견들도 있고, 이번 매거진은 스피드런을 비롯한 다양한 게임 플레이 경험에 사용되는 기술적인 트릭들을 하나하나 소개하려고 한다.
2. 스피드런이란
스피드런은 어느 게임의 특정 부분까지 최단 시간에 도달하는 것을 목표로 한다. 보통 이 지점이 엔딩 크레딧 등 게임이 끝나는 지점이기 때문에, 온라인 게임이 아닌 패키지 게임에서 주로 한다.
스피드런의 시초는 1996년 Quake라는 게임인데, 당시 Quake는 플레이 기록을 저용량 파일로 남길 수 있었기 때문에 인터넷이 지금보다 덜 활성화된 시기에도 기록 공유가 가능했다. 유저들은 “Nightmare Speed Demos”라는 사이트에 기록을 공유하면서, 누가 더 빨리 게임을 깰 수 있는지 대결을 펼쳤다. 그 뒤, 다양한 게임을 스피드런하는 사람이 더 생기면서 현재는 https://www.speedrun.com/ 라는 사이트에 다양한 게임들의 기록 및 영상이 꾸준히 올라오고 있고, 모금을 목표로 하는 대형 스피드런 대회인 Games Done Quick과 같은 행사들도 있다.
신기하게도 현재 스피드런 하는 종목 중에 옛날 게임들도 많다. 시간이 흐르면서 게임 구현 방식도 개선되어 왔기 때문에, 요즘 게임에는 재현하기 어렵거나 불가능한 트릭들도 존재하기 때문이다. 실제로 위의 사이트를 방문하면, 슈퍼마리오 64 (1996년), 슈퍼마리오 월드(1990), 포탈 (2007), 포켓몬 시리즈 등 오래전에 출시된 게임들이 인기 종목 첫 번째 페이지에 기재되어 있다.
그렇다면 오래된 게임들은 어떤 식으로 구현되어 있길래 아직도 사람들이 스피드런 하기 재미있고 적합하다고 느낄까? 그중 가장 중요한 하나의 요소를 고른다면, 많은 것을 컨트롤할 수 있는 ‘유사 랜덤성’을 만드는 PRNG (pseudo-random number generator)다.
3. 랜덤이 아닌 랜덤
게임 내에서 유저가 컨트롤할 수 없는 무작위성이 존재한다. 조금 어려운 개념일수도 있기 때문에, 몇 가지 예시를 든다면 :
1. 게임 내에서 뽑기를 하면 랜덤으로 아이템을 획득한다
2. 캐릭터를 만들거나 얻으면, 초기 능력치(스탯)가 랜덤으로 정해진다 (포켓몬, 옛날 메이플 스토리 등)
그러나, 어떤 게임에는 이런 랜덤한 일을 사람이 조작할 수 있다..! 그 이유는, 컴퓨터는 사람처럼 무작위 행동을 임의로 정할 수 있는 것이 아니라, 무작위 행동을 정할 때, 프로그램에 들어간 수학 공식을 통해서 구현하기 때문이다. 그리고 이 공식에 들어가는 초기값을 알고 있다면, 아래와 같은 PRNG 공식이 나온다.
그리고 게임 안에서는 이 숫자가 무작위 행동의 결과를 결정한다. 즉, PRNG 공식과 그 시작값을 알면, 계산만 하면 무작위 행동을 조작할 수 있다! 그리고 예전 게임에는 이 초기값이 이미 정해져 있거나 초기값을 원하는 값으로 조작하기 쉬워서, 스피드런에서는 PRNG를 활용하는 것이 기록 단축의 핵심 요소 중 하나다.
4. 스피드런에 쓰이는 PRNG
아래의 포켓몬스터 에메랄드 스피드런 영상을 참고해보자 (3분 7초 ~ 4분 15초).
https://youtu.be/ssIVZV1eDFM?t=187
출처 : Games Done Quick 유튜브 채널 (https://www.youtube.com/channel/UCI3DTtB-a3fJPjKtQ5kYHfA)
스피드런에서는 게임을 빨리 깨는 것이 목표인데, 영상에 나온 플레이어는 게임을 저장하고, 포켓몬을 기다렸다가 고르고, 그 다음에 갑자기 게임을 껐다가 다시 켜서 저장된 부분부터 다시 한다. 그 이유는 무엇일까?
정답은 영상 내의 행동에 있다. 단기적으로 기록을 늦추는 두 행동의 의도를 분석해보면, 스피드러너들의 놀라운 분석력에 감탄할 수밖에 없다.
행동 1 : 게임을 저장하고 다시 킨다.
게임을 다시 키는 이유는, PRNG 공식을 초기화하기 위함이다. 스피드러너들은 이것을 통해서 미리 계산한 PRNG 공식의 첫 몇 초 결과를 알 수 있다.
행동 2 : 기다렸다가 포켓몬을 고른다.
같은 포켓몬이더라도 기본 스탯에는 차이가 존재한다. 그리고 게임 내 모든 랜덤한 값이 그렇듯이, 이 스탯도 PRNG 공식을 통해서 정해진다. 즉, 행동 1을 통해 PRNG 공식을 초기화했기 때문에, 어느 타이밍에 받은 포켓몬이 더 강한지 알고 있다.
실제로 해설을 들어보면, 영상의 3분 21초쯤 “이건 1/6초입니다. 어렵죠.” (So this is one sixth of a second. Tough to get.)라고 한다. 타이밍을 1/6초 내로 정확하게 맞춰야 하고 기다리느라 시간이 걸리지만, 강한 포켓몬으로 게임을 더 빨리 클리어하기 위한 초석을 다지는 중요한 과정인 것이다.
마지막으로, 더 좋은 스타트로 시작할 수 있는 타이밍이 여러 개인 경우가 많다. 그러나 현실적으로 타이밍을 맞추기 불가능한 타이밍 구간이 많아서, PRNG 공식으로 가장 실현 가능성이 높으면서 스피드런에 좋은 조건을 제공하는 타이밍 구간 찾아내는 것이 스피드런에서 PRNG의 핵심이다.