바가지가 용사를 죽인다는 문장은 코드 어디에도 없었다 — 「호구마트」의 세계관 찾기
기획 문서에서 가장 좋아한 문장은 "싸구려 장비를 비싸게 팔면 용사가 죽는다"였다. 그 문장을 코드에서 찾아 나섰다가 손님 네 종류가 평균 한 명으로 녹아 있는 시뮬레이션, 가격표를 보지 않는 손님, 가격이 빠진 사망 확률 식을 만났다. 그리고 범인은 AI 가 아니었다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
기획 문서에서 가장 좋아한 문장은 "싸구려 장비를 비싸게 팔면 용사가 죽는다"였다. 그 문장을 코드에서 찾아 나섰다가 손님 네 종류가 평균 한 명으로 녹아 있는 시뮬레이션, 가격표를 보지 않는 손님, 가격이 빠진 사망 확률 식을 만났다. 그리고 범인은 AI 가 아니었다.
테스트는 전부 통과했고, 세이브는 암호화까지 돼 있었다. 그런데 나는 내 게임에 "보석으론 뭘 할 수 있는 거지?"라고 묻고 있었다. Claude 와 기획하고 Claude Code 로 만든 첫 게임 「호구마트」가 출시되지 못한 이야기를 시작한다.
「오늘 누가 쏘냐?」 1.7에 정산 기능을 넣었다. 등수대로·독박·꼴등 둘이 반반·N빵·1등만 면제 다섯 가지 분담 방식과 반올림 단위, 차수별 금액과 계산한 사람으로 송금 목록을 만드는 정산 화면, 기기에만 저장하는 계좌·카카오페이 송금 링크, 탭 3개짜리 기록 화면까지 코드와 계산 예로 정리했다.
같은 도메인에 남아 있던 예전 티스토리 블로그 주소에 410(영구 삭제)으로 응답하게 했다. 구글 서치 콘솔과 네이버 서치어드바이저에 사이트를 등록하고, 그 뒤 늘어난 수집기와 스캐너를 방문 통계에서 걸러냈다. 관리자 통계는 방문 통계와 유입 경로로 나누고, 유입 로그에는 출처 사이트 파비콘을 붙였다.
연재 글을 몇 편씩 미리 써 두고 예약 발행하다 보니 관리 화면에 빈 곳이 보였다. 저장하지 않은 내용을 공개 글 화면 그대로 보는 미리보기, 발행과 예약을 나눈 글 목록, 아직 공개 전인 글로 가는 본문 링크를 렌더링 단계에서 공개 날짜로 바꾸는 처리를 만들었다. 카테고리·태그 드래그 정렬과 올리기 스크립트 수정도 함께 정리했다.
여러 편으로 나눠 쓴 글을 하나로 묶는 연재 기능을 블로그에 넣었다. Series 테이블과 글의 회차 필드, 글 상단의 접히는 목차, 연재 순서를 따르는 이전·다음 편, /series/{slug} 연재 페이지를 만들고, 아직 공개 전인 예약 편은 링크 대신 공개 예정일로 보여 주도록 했다.
기술블로그 코드를 그대로 써서 두 번째 블로그(economy.addsoft.co.kr)를 띄웠다. 사이트마다 다른 값은 sites/*.json 사이트 프로필 하나에 모으고, 운영자 표기·관리자 계정·API 키·수익 대시보드 범위를 사이트별로 나눴다. 배포 스크립트와 글 올리기 스크립트에는 -Site 옵션을 더했다.
블로그의 애드센스 광고 위치 설정을 네 단계에 걸쳐 바꿨다. 설정 파일의 slot ID를 관리자 화면으로 옮기고, 애드센스 광고 단위 목록을 불러와 드롭다운으로 고르게 했다가, 광고 단위 이름 규칙(접두어_위치)을 정한 뒤에는 드롭다운을 없애고 연결 상태와 토글만 남겼다. 단계마다 무엇이 불편했고 코드를 어떻게 바꿨는지 정리했다.
블로그 관리자 화면에 애드센스 수익 대시보드를 붙였다. 구글 OAuth로 읽기 전용 권한을 받아 AdSense Management API v2를 SDK 없이 직접 호출하고, refresh token은 암호화해 DB에 저장한다. 동의 화면에서 권한을 빼고 허용한 경우를 잡아내는 방법, 보고서 API 호출 방식, 도메인별 수익과 캐시까지 정리했다.
세로 1080x1920 모바일 게임을 Unity WebGL로 브라우저에 올리며 손본 것들. PC에서는 창 높이에 맞춘 세로 캔버스, 폰에서는 전체 화면으로 나누는 템플릿, 로딩 중 캔버스가 회색 상자로 보인 원인, 해시 파일명으로 나눈 캐시 정책, 첫 배치 빌드 실패를 다시 돌려 넘긴 방법까지 정리하며 연재를 마친다.