■ 시작: "이 게임, 대고객 서비스로 재미가 충분한가?"
'달밤의 도깨비'는 한국 요괴 세계관의 방치형 클리커 RPG다. 달걀귀신, 물귀신, 장산범, 저승사자 같은 우리 요괴 24종을 사냥하며 고개를 넘는 게임인데, CrazyGames 출시를 앞두고 스스로에게 질문을 던졌다. "세션 1회는 재밌다. 그런데 내일 다시 켜고 싶은가?"
냉정하게 코드를 전부 다시 읽으며 심층 분석을 했다. 결론부터 말하면 — 타격감(히트스탑, 화면 흔들림, 파편 비산, WebAudio 합성 타격음)은 동급 방치형 평균을 확실히 넘는데, 방치형 장르의 생명줄인 '다시 돌아올 이유'가 구조적으로 약했다.
발견한 문제 5가지:
1) 첫 환생이 허무하다. 제15고개에서 환생하면 혼(영구 강화 재화)을 겨우 1개 주는데, 가장 싼 유물이 혼 2개였다. 첫 환생 보상으로 아무것도 살 수 없는 구조. 유저가 "환생 = 무의미"라고 학습하는 최악의 첫인상이다.
2) 게임에서 가장 재밌는 시스템(탭·콤보·크리티컬)이 자동사냥이 시작되는 순간 쓸모없어진다. 콤보를 아무리 쌓아도 영구적 보상이 없으니 탭할 이유가 사라진다.
3) 스킬 쿨타임이 5~30분. 웹게임 평균 세션이 5~15분인데 스킬 하나를 한 세션에 한 번 쓸까 말까. 스킬바가 늘 회색이었다.
4) 제61고개부터는 몬스터를 재활용하면서 hue-rotate(색조 회전) 필터만 돌렸다. 색만 이상하게 변한 재탕이라 싸구려로 보였다.
5) 출석 보상도, 업적도 없었다. D1/D7 리텐션을 만드는 장치가 통째로 없었다.
■ v1.1.0 — 재미 구조 수술
다섯 문제를 전부 고쳤다.
환생 곡선: 공식에 계수 3을 곱해 첫 환생이 혼 3개가 되도록 했다. 최저가 유물(혼 2)을 바로 사고도 1개가 남는다. "환생하면 눈에 보이는 이득이 생긴다"를 첫 경험에 심는 게 핵심이었다. 제20고개면 8개, 제50고개면 67개로 뒤로 갈수록 폭발적으로 커진다.
콤보 보상: 25/50/100/200콤보에 골드 폭탄을 터뜨린다. 각각 몬스터 8/20/50/120마리 처치분의 엽전. 이제 방치해두다가도 가끔 손을 대면 확실한 이득이 있다. '능동 플레이 보상 루프'가 생긴 것.
스킬 쿨타임: 5~30분에서 1~7분으로 전면 축소. 한 세션에 스킬을 여러 번 돌릴 수 있으니 스킬바가 살아났다. 기존 유저 세이브의 남은 쿨타임은 마이그레이션에서 새 상한으로 잘라줬다.
상위 티어: 무작위 색조 회전을 버리고 의도된 연출로 교체했다. 제61고개부터 '저주받은'(진한 채도 + 붉은 오라), '심연의'(어둡게 + 푸른 오라), '태고의'(세피아 + 금빛 오라) 접두사가 붙은 티어 몬스터가 나온다. 같은 스프라이트인데 "격이 다른 놈"으로 읽힌다.
리텐션 장치: 출석 보상(연속 스트릭, 3일차부터 혼 지급)과 업적 19종(6계열, 하나당 모든 피해 +4% 영구)을 새 탭으로 추가했다. 업적 수령 가능하면 탭에 빨간 점이 뜬다 — 사소해 보여도 이 빨간 점이 사람을 움직인다.
전부 실브라우저에서 검증했다. 콤보 25 정확히 40골드, 환생 수치 전 구간, 티어 필터 렌더링, 업적 수령까지. 자동화 테스트 없는 단일 파일 게임이라 검증 스크립트를 브라우저 콘솔에서 직접 돌리는 방식으로.
■ v1.2.0 — CrazyGames SDK, 그리고 '가짜 광고 버튼' 문제
광고 버튼이 스텁 상태였다. 누르면 "광고 시청 (연동 예정 자리) — 테스트 모드라 바로 지급됩니다"라는 모달이 떴는데, 이대로 제출하면 리뷰어가 보는 순간 미완성 게임 판정이다.
CrazyGames SDK v3를 연동했다. 보상형 광고 요청, 광고 중 자동 음소거, 모달 열릴 때마다 gameplayStop / 닫히면 gameplayStart, 로딩 신호, 환생 때 happytime(포털 축하 연출)까지.
여기서 중요한 설계 하나. CrazyGames는 신규 게임을 'Basic Launch'로 시작하는데 이 단계에선 광고가 아예 비활성이다. 광고 요청이 adsDisabledBasicLaunch 에러로 떨어진다. 그래서 광고 실패 시엔 보상을 그냥 지급하고 "지금은 광고가 없어 바로 지급됩니다" 토스트를 띄우게 했다. 심사 단계에서 누가 눌러도 게임이 어색해지지 않는다.
그리고 예상 못 한 함정이 하나 더 있었다. "다른 사이트에 올려도 문제없나?" 확인해보니 — Netlify 같은 곳에 올리면 SDK가 CDN에서 로드되면서 '개발(local) 모드'로 붙어, 광고 버튼을 누르면 "A rewarded ad would appear here"라는 영어 테스트 오버레이가 3초간 뜨는 거였다. 실서비스에서 이게 보이면 대참사. environment가 'crazygames'가 아니면 광고 경로를 아예 끄고 '달빛 보너스'라는 폴백으로 즉시 지급하게 한 줄을 추가했다. 이제 포털에선 실광고, 그 외 어디서든 자연스러운 보너스 버튼이 된다.
■ v1.3.0 — PC에서 화면 절반이 검은색이던 문제
게임이 세로 고정(max-width:62vh)이라 1920×1080 모니터에서 가운데 670px만 쓰고 좌우 65%가 검은 여백이었다. CrazyGames 트래픽 다수가 데스크톱인데 이건 "모바일 게임을 대충 올렸네"라는 첫인상을 준다.
Clicker Heroes식 좌우 분할로 갔다. 가로 화면이면 왼쪽에 관리 패널(재화·탭·영웅 목록이 세로를 꽉 채움 — 목록 노출이 3줄에서 10줄로), 오른쪽에 전투 스테이지와 스킬바.
구현이 의외로 쌌던 이유: DOM 순서를 전혀 안 바꾸고 CSS Grid의 grid-area 재배치만으로 해결했다. orientation:landscape 미디어쿼리 하나에 레이아웃 전환이 다 들어간다. 타격 이펙트 좌표가 전부 getBoundingClientRect 기반 상대좌표였던 것도 한몫했다 — 스테이지가 어떤 크기든 이펙트가 그대로 동작한다. JS 수정은 몬스터 크기를 인라인 스타일에서 CSS 클래스로 바꾼 한 줄뿐.
검증에서 잡은 디테일 두 개: 가로에서 모달이 1024px로 뻥 튀는 것(440px 캡), 토스트가 좌패널 경계에 어정쩡하게 걸치는 것(스테이지 중앙 정렬로 수정). 데스크톱 1280×800, 폰 가로 700×360, 폰 세로 375×812 세 해상도에서 실측으로 확인했고, 세로 모드는 픽셀 하나 안 변했다.
■ 마치며
하루 동안 버전이 세 번 올랐다.
- v1.1.0: 재미 구조(환생·콤보·스킬·티어·출석·업적)
- v1.2.0: CrazyGames SDK v3 + 광고 폴백 설계
- v1.3.0: PC/가로 레이아웃
방치형은 "숫자가 오르는 게임"이 아니라 "내일 다시 켤 이유를 파는 게임"이라는 걸 코드로 배운 하루였다. 타격감이 아무리 좋아도 첫 환생이 허무하면 유저는 돌아오지 않는다. 반대로 곡선 하나, 빨간 점 하나가 사람을 다시 부른다.
다음 단계는 CrazyGames 재제출이다. 이번엔 붙길.
(달밤의 도깨비 — Korean Monster Idle. HTML5 단일 파일, 프레임워크 없음, 바닐라 JS)