오늘의 선택 — 같은 하루, 다른 마음
출근길 횡단보도에서 시작해 서로 다른 하루를 지나 같은 집으로 돌아오는 이야기. 242개의 장면과 26개의 엔딩으로 갈라지는 모바일 세로 전용 선택형 어드벤처입니다.
게임 소개
알람이 울린 아침부터 집에 돌아오기까지, 하루 동안 마주치는 장면마다 선택지를 고릅니다. 부재중 전화를 눌러볼지 그냥 넘길지, 신호가 바뀌기 전에 건널지 한 번 더 기다릴지 같은 사소한 결정들이 쌓여 하루의 결말이 갈립니다. 선택은 되돌릴 수 없고, 흘러간 시각도 되감기지 않습니다.
장면 242개, 선택지 519개, 대사 3,370줄, 엔딩 26개 규모입니다. 하루 사이에 심어 둔 복선이 12개 있고, 엔딩마다 전용 에필로그 체인이 따로 붙습니다. 첫 회차에는 열리지 않는 장면이 88개라, 같은 아침에서 시작해도 회차를 거듭할수록 못 보던 길이 열립니다. 지나온 장면은 '하루 지도'에, 주워 온 물건은 '주머니'에, 본 엔딩은 '오늘의 일기'에 남습니다.
기술적 접근
먼저 Vue 3로 웹판을 만들어 공개하고, 그것을 Flutter로 옮겨 안드로이드 앱으로 만들었습니다. 시나리오와 아트, 오디오의 정본은 웹 원본에 두고 앱은 파생물만 소비합니다. 원본의 검증 출력을 골든 파일로 떠서 앱의 엔진 결과와 대조하기 때문에, 두 구현이 갈라지면 테스트가 먼저 깨집니다.
시나리오는 코드가 아니라 데이터입니다. 그래서 빌드 파이프라인이 타입 검사 → 데이터 검증 → 무작위 플레이 시뮬레이션 순으로 돌고, 하나라도 걸리면 빌드가 실패합니다. 검증은 모든 선택지가 실재하는 장면을 가리키는지, 시각이 거꾸로 흐르지 않는지, 조건부 선택지만 있는 막다른 노드가 없는지, 자막이 규격 길이를 넘지 않는지를 봅니다. 시뮬레이션은 무작위로 12,000회 플레이해서 장면 242개와 엔딩 26개에 전부 도달하는지, 막다른 길이나 무한 루프가 생기지 않는지를 확인합니다.
콘텐츠는 전부 앱에 번들돼 있습니다. 배경 아트도 배경음악도 효과음도 설치 파일 안에 들어 있어서 이야기를 진행하는 데에는 네트워크가 필요하지 않습니다. 배경음악은 전곡 CC0 음원을 45초 루프로 직접 구워 넣었고, 본문 글꼴은 Pretendard를 번들해 기기 폰트에 상관없이 같은 화면이 나오도록 했습니다.
네트워크를 쓰는 곳은 따로 붙인 세 가지입니다 — 진행 상황을 서버에 미러링하는 클라우드 세이브, 회차 광고, 광고 제거 결제입니다. 클라우드 세이브는 실패해도 게임을 막지 않도록 조용히 삼키는 구조인데, 그 때문에 초기 출시본에서 사고가 하나 있었습니다. Flutter 템플릿은 인터넷 권한을 디버그·프로파일 매니페스트에만 넣어 둬서 릴리스 빌드에서만 권한이 조용히 빠졌고, 클라우드 세이브가 통째로 실패하는데도 아무도 눈치채지 못했습니다. 지금은 권한을 앱 본체 매니페스트에 직접 선언해 두었습니다.
주요 기능
화면 갤러리
약관 및 정책
회원가입은 없지만 구글 로그인과 클라우드 세이브, 광고와 일회성 결제가 들어가는 앱이라, 무엇을 받고 무엇을 받지 않는지 문서로 두었습니다.