개발 노트

죽음 없는 게임에 긴장을 넣는 법

세 신수를 만들며 내린 결정들과, 그 과정에서 배운 것들.

1. 죽음을 먼저 지웠습니다

가장 먼저 정한 규칙은 죽지 않는다였습니다. 몽실이는 원래 아이들이 쓰는 QR 카드에서 출발한 프로젝트라, 실패했다고 되돌아가는 경험을 넣고 싶지 않았습니다.

그런데 이 결정은 곧 어려운 질문을 낳습니다. 죽지 않으면 무엇이 긴장을 만드는가? 벌칙이 없으면 위험도 없고, 위험이 없으면 선택에 무게가 없습니다.

답을 찾은 곳은 INSIDE였습니다. 그 게임에도 죽음이 있지만 벌칙은 거의 없습니다 — 죽으면 몇 초 전으로 돌아갈 뿐입니다. 그런데도 무섭습니다. 긴장은 잃는 것에서 오는 게 아니라 지금 통제하지 못한다는 감각에서 온다는 걸 거기서 배웠습니다.

그래서 이 게임의 위험은 전부 밀어냅니다. 불에 닿으면 뒤로 밀리고, 밤것에 부딪히면 물러섭니다. 잃는 것은 자리와 시간뿐입니다. 그런데 어렵게 만들어 놓은 배치가 한순간에 흐트러지는 그 느낌은, 놀랍게도 죽는 것과 비슷한 무게를 가집니다.

2. 그림보다 후처리가 먼저였습니다

한동안 아무리 요소를 더해도 "상용 게임 같지 않다"는 인상이 사라지지 않았습니다. 원인을 오래 잘못 짚었습니다 — 더 많은 이펙트, 더 많은 파티클, 더 많은 배경 요소를 넣었지만 소용이 없었습니다.

진짜 원인은 그림이 전부 캔버스 기본 도형이라는 것이었습니다. 타원과 사각형과 삼각형으로 그린 화면은, 아무리 요소를 더해도 "만들어진 그림"이 아니라 "코드로 그린 도형"으로 읽힙니다.

해결은 두 갈래였습니다. 하나는 실제 그림을 넣는 것 — 수묵화 배경을 그려 넣었더니 화면의 격이 단번에 달라졌습니다. 다른 하나는 후처리였습니다. 블룸, 필름 그레인, 컬러 그레이딩, 심도 블러. INSIDE도 도형 자체는 단순하지만 그 위에 얹힌 후처리가 화면을 만듭니다.

여기서 예상 못 한 버그가 하나 나왔습니다. 후처리를 넣자 프레임이 떨어졌는데, 이 엔진은 프레임이 초당 20을 밑돌면 물리 시간 간격에 상한이 걸립니다. 즉 화면만 버벅이는 게 아니라 게임 세계 자체가 느려졌습니다. 저사양 기기에서 캐릭터가 슬로모션으로 걷게 되는 상황이었습니다. 블룸을 1/8 해상도 버퍼에서 처리하고, 프레임이 떨어지면 스스로 효과를 벗는 적응형 화질을 넣어 해결했습니다.

3. 클리어할 수 없는 밤이 네 개 있었습니다

이 프로젝트에서 가장 무서웠던 종류의 버그입니다. 게임이 멈추지도, 에러를 뱉지도 않는데 그냥 깰 수가 없는 스테이지입니다.

발단은 플레이어의 한마디였습니다. "28판 어떻게 깨? 버그인가?" 확인해 보니 진짜였습니다. 며칠 전에 스테이지를 손보며 넓힌 발판이 자물쇠 위를 지붕처럼 덮었고, 여의주를 나르는 까치가 바람에 그 지붕 위로 밀려 올라가 열쇠구멍에 영영 닿을 수 없었습니다.

더 나쁜 것은, 그 스테이지를 검사했던 이전 감사가 그 수정 이전에 돌았다는 사실이었습니다. 검증이 있었지만 검증 시점이 틀렸던 것입니다.

그래서 서른다섯 밤 전부를 현재 규칙으로 다시 검사했습니다. 세 개가 더 나왔고, 셋 다 원인이 하나였습니다. 돌을 맵 밖으로 밀면 구덩이가 아닌 땅속에 파묻히는 코드였습니다. 돌을 움직이는 모든 동작이 "땅 위에 있는 돌"만 대상으로 하기 때문에, 파묻힌 돌은 영원히 죽고, 그 돌이 놓았어야 할 다리는 영원히 없습니다.

고친 뒤에는 같은 종류의 버그를 기계가 잡도록 만들었습니다. 스테이지의 모든 목표물(종·자물쇠·여의주·화로·저울·달구슬·출구)에 대해 실제 물리로 "몸이 여기 닿을 수 있는가"를 묻는 검사를 만들었습니다. 사람이 짜 놓은 정답 경로만 확인하는 기존 검증과, 데이터만 보는 단위 테스트 사이에 비어 있던 층이었습니다.

4. 플레이어가 낸 아이디어가 가장 좋았습니다

28판을 고치는 중에 플레이어가 이렇게 말했습니다. "해태가 바람을 막으면 새가 (여의주를) 먹어야 하는데 바람으로 위로 솟아나버려."

그 문장에 답이 들어 있었습니다. 해태는 이미 불을 막는 존재였습니다. 그렇다면 바람도 막아야 문법이 일관됩니다. 해태가 바람목에 서면 그 위가 잔잔해지도록 만들었더니, 망가진 스테이지 하나가 이 게임에서 가장 좋은 3인 퍼즐로 바뀌었습니다 — 종을 울리고, 해태가 바람을 막아 여의주를 얻고, 여우가 아직 살아 있는 다른 바람을 타고 판에 오르고, 그 다음 해태가 자리를 옮겨야 하는, 순서가 강제된 일곱 박자짜리 밤입니다.

설계자가 규칙을 만들지만, 그 규칙이 무엇을 약속하는지는 종종 플레이어가 더 정확히 압니다.

5. 밤것을 넣기로 했습니다

최근의 과제는 난이도입니다. 서른다섯 밤을 만들고 나서 다시 보니, 일곱 개 스테이지가 한 캐릭터만으로도 풀렸습니다. 세 신수를 번갈아 쓰는 게임에서 이건 설계 실패입니다.

그래서 순찰하는 밤것을 넣었습니다. 도깨비불과 어둑시니가 정해진 구간을 걷고, 닿으면 밀어냅니다 — 불기둥과 똑같은 계약이라 죽음 없음 규칙을 지킵니다. 다만 불기둥과 달리 움직이므로, 패턴을 읽고 타이밍을 재는 재미가 생깁니다.

그리고 셋에게 각각 답을 주었습니다. 해태는 벽입니다 — 밤것이 그를 지나치지 못해, 순찰 구간 한복판에 세우면 구간이 반으로 줄고 뒤가 안전해집니다. 여우는 놀라게 합니다 — 돌진으로 닿으면 밤것이 몇 초간 달아납니다. 까치는 하늘입니다 — 땅을 걷는 것들은 그를 잡지 못합니다. 셋 다 이미 있던 동작의 확장이지 새 시스템이 아닙니다.

여기에 정확한 무게를 요구하는 저울을 더했습니다. 해태 셋, 여우 둘, 까치 하나, 돌 셋, 여의주 하나. 무거워도 틀리고 가벼워도 틀립니다. 코드는 거의 들지 않았는데 머리는 가장 많이 쓰게 되는 장치입니다.

6. 발판을 그리다가 이무기 눈을 고쳤습니다

여섯째 밤을 폰으로 하다가 공중에 떠 있는 발판이 눈에 걸렸습니다. 배경은 다 그림인데 발판만 남색 막대. 그날 저녁에 장면별로 다섯 장을 그렸습니다. 동굴은 젖은 바위, 사당은 대들보, 눈밭은 얼음 턱, 봉우리는 벼랑, 숲은 나무 사이에 걸린 가지. 문제는 발판 길이가 밤마다 다르다는 것이었습니다. 짧은 건 120px, 긴 건 1500px. 그림을 다섯 장씩 길이별로 그릴 수는 없으니 양 끝만 살리고 가운데를 늘려 쓰기로 했습니다. 붙여 놓고 보니 캐릭터 발이 살짝 떠 보였습니다. 그림마다 걷는 선이 다른 높이에 있었던 겁니다. 봉우리는 구름이 위에 조금 걸쳐 있고 눈밭은 눈이 쌓여 있으니까요. 결국 눈대중을 포기하고 그림에서 달빛 선을 찾아 재는 작은 스크립트를 짰습니다. 이게 제일 오래 걸렸습니다.

내친김에 이무기도 다시 봤는데, 눈이 둘이었습니다. 채색 그림이 들어온 뒤에도 눈의 빛은 옛날 실루엣 자리에 그려지고 있어서, 진짜 눈 옆에서 뭔가가 깜빡였던 겁니다. 목도 두 개였습니다. 똬리 그림에 목 밑동이 이미 있는데 엔진이 바닥에서 목을 하나 더 뽑아 올리고 있었습니다. 그림이 바뀌면 좌표도 같이 봐야 한다는 당연한 걸 이번에 배웠습니다.

캐릭터 바꾸는 것도 손봤습니다. 폰에서는 화면 위쪽 초상화를 눌러야 했는데, 엄지가 아래 버튼에 있는 상태에서 위로 손을 뻗는 게 은근히 귀찮았습니다. 다른 게임들은 어떻게 하나 찾아보니 대부분 행동 버튼 옆에 바꾸기 버튼을 두더군요. 그래서 ⇄ 버튼을 하나 넣었고, 화면의 캐릭터를 바로 눌러도 바뀌게 했습니다. 초상화는 지금 누군지 보여주는 용도로 남겨뒀습니다.

7. 새벽 뒤에 다섯 밤을 더 붙였습니다

서른넷째 밤에서 끝나는 게 맞다고 생각했는데, 첫째 고개의 방들을 한 번 더 쓰고 싶은 마음이 계속 남았습니다. 그래서 새벽을 건넌 사람에게만 열리는 길을 하나 더 만들었습니다. 이름은 되짚는 고개. 첫째 고개의 방을 그대로 다시 걷는데, 그 방이 가르쳤던 규칙이 하나씩 뒤집혀 있습니다. 둘째 밤의 턱 위 저울은 이제 까치 무게만 받습니다. 다섯째 밤의 불은 피하는 게 아니라 화로까지 날라야 하는 열쇠가 됐습니다. 새 그림도 새 동작도 없습니다. 같은 방이 반대 질문을 할 뿐입니다.

처음 짠 서른여덟째 밤은 풀 수 없는 밤이었습니다. 문 뒤에 있는 저울이 무게 2를 원했는데, 닫힌 문을 넘을 수 있는 건 무게 1인 까치뿐이었으니까요. 종이 위에서는 그럴듯했습니다. 이런 건 만든 사람 눈에는 안 보여서, 이번엔 힌트 없이 처음 하듯 풀어보는 테스트를 따로 돌렸습니다. 거기서 오래 숨어 있던 버그 하나가 나왔습니다. 까치가 구슬을 저울에 내려놓고 날아오르려고 버튼을 누르면, 날갯짓 대신 구슬을 도로 집어 버립니다. 서른셋째 밤에서 세 번이나 밤것 탓을 하며 위치를 옮겼던 문제의 진짜 원인이 이거였습니다. 밤것은 까치를 구슬 옆으로 되민 것뿐이었습니다. 이제 내려놓은 구슬은 그 자리를 한 번 벗어났다 와야 다시 집힙니다.

점수도 받았습니다. 서른아홉째 밤은 해태가 예전에 못 열던 저울을 혼자 여는 순간이 바로 읽힌다고 좋은 점수를 받았고, 서른여섯째 밤은 저울이 뭘 원하는지 몸으로 실험해 봐야 안다고 낮은 점수를 받았습니다. 인트로 한 줄을 고쳤는데, 사실 근본 해법은 저울이 원하는 무게를 화면이 먼저 보여주는 것입니다. 그건 다음 일입니다.

기술 메모

게임 해보기
몽실이 게임 소개 설화 이야기 공략 문의 개인정보처리방침