
프롤로그를 끝까지 이었습니다
지난번에는 회사 회의실에서 탕비실까지, 커피 하나 바꿔치기하는 데서 끝났습니다. 이번에 심야 지하철과 원룸을 지나 황소항 입구까지 이었습니다. 주인공이 첫 사기를 당하고, 여주인공 윤세라를 만나고, 첫 「대화 배틀」을 치릅니다.
장면이 셋에서 여섯으로, 대사가 354줄에서 825줄로 늘었습니다. 그런데 코드에서 늘어난 것은 거의 없습니다. 장면도 대사도 퍼즐도 전부 JSON 파일이고, 프로그램은 그 파일을 읽어 해석할 뿐입니다. 새 장면을 추가한다는 것은 파일 몇 개를 쓰고 목록에 한 줄을 더하는 일입니다.
체력을 깎지 않는 싸움
이 게임에는 「대화 배틀」이 있습니다. 말로 하는 싸움인데, 상대의 체력을 깎는 방식으로는 만들고 싶지 않았습니다. 그러면 결국 어느 선택지가 데미지가 큰지 외우는 게임이 됩니다.
그래서 이렇게 정했습니다. 상대는 앞선 대화에서 이미 자기 말을 여러 번 했습니다. 첫 배틀 상대인 환전소 남자는 「규정」을 세 번 말하는데, 세 번 다 내용이 다릅니다. 플레이어가 할 일은 새 논리를 만드는 게 아니라 그 세 번을 이어 붙여 그 사람 앞에 다시 놓는 것입니다.
이기면 상대의 「멘탈 차트」가 지지선을 이탈합니다. 캔들 차트로 그려지는데, 이 게임에서 캔들은 장식이 아니라 상태 표시입니다. 선택 하나가 캔들 하나입니다.
- 틀린 선택을 해도 지지 않습니다. 상대의 자신감이 오르고 군중이 그쪽으로 기울 뿐입니다
- 오답을 고르면 옆에 선 윤세라가 짧은 힌트를 줍니다
- 이기든 지든 이야기는 같은 지점으로 나아갑니다. 이기면 수수료를 돌려받고, 지면 셔터가 내려갑니다
져도 막히지 않는다는 것을 규칙으로
「져도 진행된다」는 말은 쉽지만 만들다 보면 깨지기 쉽습니다. 이겼을 때만 다음 단계로 넘어가는 코드를 무심코 쓰게 되니까요.
그래서 검사기에 규칙을 하나 넣었습니다. 배틀 데이터에서 승리 결과와 패배 결과가 이야기를 같은 지점으로 옮기지 않으면 오류로 잡습니다. 사람이 지키기로 마음먹는 대신, 어기면 빌드가 실패하도록 만든 것입니다.
비슷한 검사가 몇 개 더 있습니다. 페이즈마다 선택지가 서너 개인지, 조건부 선택지를 빼고도 선택지가 충분한지, 자신감을 깎을 수 있는 선택지가 하나는 있는지. 마지막 것이 없으면 그 페이즈는 이길 수 없는 싸움이 됩니다.
브라우저에서 정말 되는지 재봤습니다
웹으로 내보내면서 확인하지 못한 것이 둘 있었습니다. 소리가 나는지, 저장이 남는지. 「아마 될 것이다」로 두기에는 둘 다 실패했을 때 티가 크게 나는 항목입니다.
그래서 브라우저를 자동으로 띄워 직접 재는 검사를 만들었습니다. 브라우저는 사용자가 조작하기 전에는 소리를 막는데, 이 게임은 사이트의 버튼을 눌러 실행되기 때문에 정작 게임 화면 안에서는 아무 조작도 일어나지 않은 상태입니다. 실제로 재보니 우려가 맞았습니다 — 화면을 처음 누르기 전까지 소리가 나지 않았습니다.
소리가 「날 수 있는 상태」인 것과 실제로 소리가 나는 것은 다릅니다. 그래서 오디오 출력에 측정기를 물려 파형을 직접 쟀습니다. 지금은 화면을 처음 누르는 순간 음악을 처음부터 다시 틀도록 고쳤습니다.
저장은 다행히 잘 남았습니다. 새 게임을 시작하고 자동 저장이 된 뒤 탭을 완전히 닫았다가 다시 열었더니 「이어하기」가 살아 있었습니다. 눈으로 보는 대신 글자 색을 픽셀 단위로 재서 확인했습니다 — 비활성 회색과 활성 아이보리의 밝기가 정확히 팔레트 값과 맞았습니다.
모바일에서도 되게
포인트 앤 클릭 게임의 조작은 좌클릭과 우클릭으로 나뉩니다. 우클릭은 「그 대상에게 가장 자연스러운 동작」이라, 문 앞에서 어떤 동사를 골라야 할지 몰라 헤매지 않게 해주는 장치입니다. 터치에는 우클릭이 없습니다.
길게 누르기로 대신했습니다. 0.45초 누르면 우클릭과 같습니다. 손가락이 미끄러지면 끌기로 보고 취소합니다. 터치에서는 누른 순간이 아니라 뗀 순간에 행동하는데, 누르고 있는 동안 길게 누르기로 갈아탈 여지를 남겨야 하기 때문입니다.
손가락은 커서보다 뭉툭해서 판정에 여유를 조금 줬고, 동사 패널은 여덟 개 대신 네 개짜리 간소화 모드로 시작하게 했습니다. 버튼 폭이 두 배가 됩니다.
터치보다 설정 저장이 문제였습니다
터치 기본값이 도무지 적용되지 않아 한참 헤맸습니다. 터치를 감지하지 못하는 줄 알고 감지 방법을 세 번 바꿨는데, 원인은 다른 데 있었습니다.
설정을 읽을 때 기본값을 전부 채워 넣고 있었습니다. 그래서 「사용자가 직접 고른 값」과 「그냥 기본값」을 구분할 수 없었고, 사용자의 선택을 존중하려던 조건문이 항상 참이 되어 기기별 기본값을 영영 막고 있었습니다.
이건 터치와 무관하게 더 큰 문제였습니다. 설정을 한 번이라도 건드리면 모든 항목이 「사용자가 고른 값」이 되어, 나중에 기본값을 개선해도 기존 플레이어에게는 반영되지 않았을 겁니다. 지금은 사용자가 실제로 고른 값만 파일에 적습니다.
덧붙이면, 이 과정에서 제가 두 번이나 「기능이 고장났다」고 잘못 판단했습니다. 두 번 다 검사 코드 쪽 문제였습니다. 화면 비율이 게임 비율과 다르면 게임이 화면 안에서 다시 여백을 두고 그려지는데, 그걸 계산에 넣지 않아 화면 가운데는 맞고 가장자리는 빗나가는 오차가 있었습니다. 고약한 종류의 오차라 기록해 둡니다.
소리는 파일이 아니라 코드입니다
배경음악 세 곡이 들어갔습니다. 회사와 지하철과 원룸에 흐르는 곡, 황소항의 곡, 그리고 윤세라의 곡입니다. 그런데 음원 파일은 하나도 없습니다. 게임이 실행되면서 소리를 합성합니다.
1980~90년대 FM 음원의 대역폭을 그대로 흉내 냈습니다. 도트로 그린 320×180 화면에 어울리는 소리는 그쪽이라고 생각했습니다. 황소항 곡은 경쾌한 스윙인데 중간중간 음이 반음씩 미끄러집니다. 뭔가 잘못된 번영이라는 느낌을 내려고요.
윤세라의 곡에는 날카로운 세 음이 반복됩니다. 그 세 음은 다른 어떤 곡에도 쓰지 않았습니다. 나중에 호감도가 오르는 장면에서 과장된 효과음 대신 그 세 음 중 하나를 더하려면, 그 음이 다른 데서 들린 적이 없어야 하기 때문입니다.
앞으로
다음은 챕터 1입니다. 황소항 투자자 조합에 들어가기 위한 세 가지 시험이 있고, 그중 하나가 말싸움 고수 세 명과의 대화 배틀입니다. 이번에 만든 배틀 구조를 그대로 쓸 수 있는지가 시험대가 될 것 같습니다.
확정된 일정은 없습니다. 진행 상황은 여기에 이어서 적겠습니다.