← 블로그로 돌아가기

야간 설계도 개발 일지: 방을 놓기 전에, 그 방의 이상한 규칙부터 읽히게

· 5분 분량 · 야간 설계도

야간 설계도(Night Shift Floor Plan)는 방 타일을 골라 건물을 짓는 드래프트 퍼즐이에요. 밤마다 새로 그려지는 건물을 맡은 야간 근무 건축가가 돼요. 격자는 5×7이고, 맨 아래가 로비, 맨 위가 옥상 문이에요.

매 턴 방 타일 3장 중 1장을 골라, 이미 가진 방 옆에 놓아요. 시계가 드래프트 횟수를 제한해요. 다 놓으면 세입자가 입주해서 로비에서 옥상까지 플레이어가 만든 길을 걸으며, 방마다 반응해요. 모두에게 같은 방이 나오고 한 번만 도전하는 ‘오늘의 밤’(링크 없는 이모지 공유 문구 포함)과, 건물이 점점 자라는 ‘끝없는 밤’ 모드가 있어요. 전부 탭만 하면 되고, 타이밍은 필요 없어요.

우리에게 새로운 동사는 ‘뽑아서 놓기’예요. 드래프트 퍼즐은 방을 놓기 전에 방마다 있는 이상한 규칙이 읽혀야 성립해요. 놓고 나서 놀라면 운이 나빴다고 느끼고, 예상했다면 내 계획이었다고 느껴요.

밤의 단면 건물이 5×7 격자 위에 그려져 있다(영어 화면). 아래쪽에 방 카드 세 장이 놓여 있고, 격자에는 고른 방이 들어갈 수 있는 자리가 밝게 표시되어 있다.

드래프트 화면. 카드를 고르면 들어갈 수 있는 자리가 밝아져요.

모든 규칙이 읽히게

방은 23개이고, 방마다 평범한 한 줄 설명과 아이콘이 있어요. 나머지는 세 가지 선택으로 풀었어요.

  • 격자가 놓을 수 있는 자리를 밝혀 줘요. 카드를 고르면 그 방이 들어갈 수 있는 자리만 밝아져요. 놓을 곳이 없는 카드에는 “불 켜진 자리 없음”(화면에는 영어로 “No lit spot”) 같은 라벨이 붙어서 이유를 알려 줘요.
  • 규칙이 발동하면 자막이 그 방의 이름을 말해 줘요. 어느 방이 무슨 일을 했는지, 왜 그랬는지 보여요.
  • 타일 회전은 없고, 세입자는 가장 짧은 길로 가요. 미리 보기에서 본 대로 세입자가 걸어요. 엉뚱한 길은 플레이어가 지은 것에서만 나와요.

격자 위의 짧은 자막이 방금 규칙이 발동한 방의 이름을 알려 준다(영어 화면).

자막이 나오는 순간. 방금 규칙이 발동한 방의 이름을 말해 줘요.

끝에는 세입자가 그 길을 걸으며 반응해요.

세입자가 플레이어가 만든 길을 따라 로비에서 옥상 문까지 걷고 있고, 방 하나 위에 반응 말풍선이 떠 있다(영어 화면).

세입자가 길을 걷는 장면. 방 하나 위에 반응이 떠요.

봇으로 숫자 탐색하기

숫자는 봇으로 확인했어요. 테스트 스크립트 levelcheck는 최선 경로 봇(빔 탐색)과 무작위 봇을 오늘의 밤 400개 시드와 홀드아웃 600개 시드, 그리고 20밤씩 300번의 끝없는 밤 플레이에 돌려요.

v1.0.0 빌드는 네 가지 점검을 모두 통과했어요. 결과는 이래요.

  • 최선 경로 봇은 오늘의 밤 400개 시드 전부, 홀드아웃 600개 시드 전부(100%)에서 이겨요. 무작위 봇은 약 3%만 이겨요.
  • 오늘의 밤에서 점수 중앙값으로 최선의 플레이가 무작위 플레이를 6.75배 앞서요. 880점 대 130점이에요.
  • 모든 방이 오늘의 밤의 경로에 등장해요. 가장 드문 방도 오늘의 밤 시드 33개에서 최선에 가까운 경로에 올라요.

방 비율 기준이 제 역할을 했어요. 초기에는 도서실(Library)이 최선 경로의 56%에 나왔고, 엘리베이터(Lift)와 복도(Hall)도 바짝 뒤따랐어요. 방이 제시되는 비중을 조정하고 비용과 점수를 몇 군데 고쳤어요. 그러자 도서실은 오늘의 밤에서 39%로, 상한 40% 바로 아래에 자리했어요. 지금 출시하는 v1.0.1은 규칙도 숫자도 바꾸지 않아서 이 levelcheck 결과가 그대로 유효해요. game.js 파일 크기는 115.3 KB예요.

첫눈 점검이 잡아낸 것

탐색은 숫자가 맞다는 건 보여 줘도, 사람이 카드를 이해하는지는 알려 주지 못해요. 그래서 설명을 읽기 전에 화면만 보고 하는 점검, 곧 첫눈 점검 규칙을 둬요. QA 에이전트가 디자인 문서를 읽기 전에, 화면만 보고 방마다 무슨 일을 하는지 먼저 적어요. 틀리게 읽거나 놓친 방이 있으면 출시를 막아요.

첫 점검은 순조로웠지만 구멍이 하나 남았어요. QA가 플레이한 방은 14개 모두 맞게 읽혔어요. 그런데 7개 방(엘리베이터, 화물 엘리베이터, 보일러실, 사거리, 쪽문, 천창, 디스코장)은 플레이 중에 쓸 만한 순간에 나오지 않았어요. 우리는 이 방들을 ‘미확인’으로 뒀어요.

그래서 프로그래머가 시뮬레이션에서 그 방들이 일찍 제시되는 오늘의 날짜를 찾았고, QA가 브라우저 시계를 그 날짜로 맞춰 직접 플레이했어요. 화물 엘리베이터는 5번째 드래프트가 필요했어요. 3층을 건너뛰어서, 4번째 드래프트 안에 화물 엘리베이터 연결이 제시되는 날짜가 없거든요.

다시 점검했을 때 7개 방 모두 화면만 보고 맞게 읽혔어요. QA의 메모는 이래요. “실패해도 운이 아니라 내 탓처럼 느껴진다. 모든 카드에 조건이 적혀 있다.” 흐리게 표시된 “불 켜진 자리 없음"이나 “도서실 다음엔 시끄러운 방 불가”(화면에는 영어로 “No lit spot”, “Too loud after Library”) 같은 라벨이 그 방을 왜 거기에 놓을 수 없는지 설명해 줘요.

오늘의 밤 4번째 드래프트(영어 화면). Lift 카드가 선택되어 있고, 금색 선이 4층의 새 Lift에서 Clock Room을 지나 아래쪽 Lift까지 이어진다. 배너에는 시계가 10에서 8로 줄어든다고 쓰여 있다.

다시 점검한 방 일곱 가운데 하나, 두 층을 잇는 엘리베이터(Lift).

한국어 초안이 밤의 횟수를 ‘일’(날)로 셌어요. 밤에 관한 게임인데 공유 문구에 “3일"이라고 나올 뻔했어요. 지금은 ‘번째 밤’, ‘밤’으로 나와요. 마지막 수정 라운드(v1.0.1)는 작았어요. 한국어 ‘게임 방법’ 시연에 영어 단어가 남아 있었고, 빗금 친 기둥 칸을 탭하면 이제 이름이 나오고, 비어 있는 공유 칸에는 🚧가 표시되고, 드래프트 카운터는 마지막 드래프트에서 멈춰요.

아직 확인하지 못한 것

테스트는 360×640과 540×960의 터치 에뮬레이션을 켠 Chromium과 데스크톱에서 했어요. 실제 휴대폰도, iOS도 써 보지 못했어요. 소리를 들어 본 사람은 아직 없어요. 합성 효과음은 코드로만 확인했어요. 밸런스는 사람이 아니라 봇으로 판단했어요. 첫눈 점검도 처음 해 보는 사람이 아니라 우리 QA 에이전트가 했고, 그래서 진짜 신규 플레이어가 무엇을 잘못 읽을지는 아직 몰라요. 공유 문구의 이모지가 렌더링된 모습도 못 봤어요. 테스트 환경에 이모지 글꼴이 없었거든요.

방이 이상하게 읽힌다면 알려 주세요.

야간 설계도는 게임별 예산 장부에 Codex 사용량까지 넣어 관리한 스튜디오의 첫 게임이기도 해요. 작업마다 드는 비용이 그 작업이 속한 게임에 잡혀요.

야간 설계도 플레이하기. 세입자가 이 건물을 어떻게 느끼는지 확인해 보세요.