게임 디자인 — Pour Decisions(落沙模擬 × Roguelike Deckbuilder)
먼저 docs/design/00_concepts.md와 docs/research/02_competitor_patterns.md를 읽으세요. 이 스킬은 실행 가능한 규칙만 제공합니다. 수학 및 시뮬레이션 세부 사항은 references/에 있습니다:
references/scoring-math.md: chips × mult 공식, 덧셈/곱셈 중첩, 목표 곡선 템플릿, Balatro 실제 수치references/balance-sim.md: Monte Carlo 밸런스 시뮬레이션 아키텍처, 봇 레벨, 지표, 강력 전략 탐지, 보고서 형식references/content-archetypes.md: 본 게임의 시너지 원형(archetype) 초안, 희귀도 할당량, 촉매 예시
0. 다섯 가지 최고 원칙(충돌 시 이 기준으로 판단)
- 시뮬레이션은 완전히 결정론적( deterministic )이어야 함 : 동일한 seed, 동일한 재료 투하 위치 → 동일한 결과, 픽셀 단위로 일치해야 합니다. 결정론적이지 않으면 기술이 없으며, 밸런스 시뮬레이션, 리플레이, 미리보기도 불가능합니다.
- 모든 반응은 '보이고, 셀 수 있어야' 함 : 반응이 발생한 위치에 숫자가 표시되고, 유형별로 고정된 색상과 사운드 효과가 있어야 합니다. 플레이어가 패배했을 때 이유를 설명할 수 있어야 합니다(Roguebook: 플레이어가 자신이 어떻게 졌는지 이해하지 못하면 게임을 포기합니다).
- 깊이는 규칙의 수가 아닌 조합에서 옴 : 표면 규칙은 매우 적어야 하며(BotW 화학 엔진: 원소가 재료를 바꾸고, 원소가 원소를 바꾸며, 재료는 재료를 바꾸지 않음), 깊이는 100–200개의 오브젝트 상호작용에서 나옵니다.
- 모든 오브젝트는 고유한 용도가 있어야 하며, 단순히 강력해서는 안 됨(Slay the Spire GDC 2019): 전략을 왜곡할 정도로 강력하고 조합이 쉬운 효과는 제한해야 합니다. 강력하지만 조합이 어렵고 적극적으로 추적해야 하는 콤보는 존재할 수 있습니다—싱글 플레이어 게임에서는 플레이어가 가끔 '사기'를 치는 것을 허용합니다.
- 데이터가 방향을 정하고, 플레이 테스트가 감각을 결정함 : 자동 시뮬레이션으로 수치 문제를 잡고, 인간 플레이 테스트로 재미를 판단합니다(Noita: 기술 지표는 검증하기 쉽지만, '재미'는 플레이 테스트로만 확인할 수 있습니다).
1. 핵심 루프와 턴 구조
턴(Round):손패(vials) 뽑기 → 1개 선택 + 재료 투하 위치/각도 선택 → 시뮬레이션이 안정화(settle)되거나 최대 tick에 도달할 때까지 실행
→ 이번 재료 투하 반응 점수 → 턴 점수에 누적 → 재료 투하 횟수 소진 → 목표 점수와 비교
턴 사이:상점(vial / catalyst / 업그레이드 / 비커 개조) → 다음 턴
한 게임(Run):8개의 '실험'(Ante) × 3턴(소/대/Boss) = 24턴
- 안정화(settle)를 단위로 점수를 계산하며, 실시간 반응 속도에 의존하지 않습니다—AI 팀의 약점(조작감)을 피하고 결과를 예측 가능하게 만듭니다.
- 안정화 상한: 시뮬레이션 tick 상한(예: 600 tick), 화면에서 최대 4–6초 동안 재생되며 ×2/×4로 빨리 감기 가능; 이후 강제 종료.
- 비커 상태는 재료 투하 간에 유지됨(동일 턴 내), 턴 종료 시 비우는 것은 디자인 노브(knob)입니다: 유지 = 장기 계획 깊이, 비움 = 가독성. 프로토타입에서는 먼저 비우고, 이후 유지 버전을 테스트합니다.
- Boss 턴 = 하나의 규칙 수정(예: "물이 얼음이 됨" "중력이 한 번 반전됨"), Balatro Boss Blind에 해당; 턴 시작 전에 반드시 공지해야 합니다.
2. 점수 디자인(chips × mult)
공식(표시 순서 = 계산 순서, 플레이어가 따라갈 수 있음):
이번 재료 투하 점수 = (Σ 반응 chips + 추가 chips) × (기본 mult + Σ +mult) × Π(×mult)
- chips : 각 반응의 기본 점수(반응 유형과 반응량에 따라, 로그 또는 구간을 사용하여 '많이 부울수록 좋다'를 방지).
- +mult : '변화'에서 옴—이번에 발생한 다른 반응 유형의 수, 연쇄 깊이(반응이 반응을 유발).
- ×mult : 희귀 촉매 또는 특수 조건에서만 제공. ×mult는 가장 강력한 통화이므로 가장 인색하게 지급해야 함.
- 종료 애니메이션은 순서대로 재생: 반응이 하나씩 chips 점프 → mult 누적 → ×mult가 하나씩 곱해짐(Balatro식 tally), 큰 숫자는 느리게, 진동 추가.
규칙:
- 덧셈 vs 곱셈: n개의 +mult 오브젝트는 선형 성장; k개의 ×1.5 오브젝트는 1.5^k. 초기에는 덧셈 위주, 후기에는 곱셈으로 전환되는 것은 자연스러운 빌드 곡선입니다—common은 덧셈, rare는 곱셈을 제공하도록 합니다.
- 덧셈의 한계 가치 체감(+4 mult는 base 20에서 +20%이지만 base 100에서는 +4%에 불과), 이는 '언제 곱셈으로 전환할까'를 플레이어 결정으로 만듭니다. 좋은 점이므로 유지합니다.
- 점수 > 1e6부터 천 단위 약어 사용, > 1e11부터 과학적 표기법 사용; 내부는
double사용, Endless는 log 공간 또는 BigNumber 사용. - 자세한 공식, 예시 숫자:
references/scoring-math.md.
3. 목표 점수 곡선
- Balatro 흰색 말뚝(ante 1–8): 300 / 800 / 2,000 / 5,000 / 11,000 / 20,000 / 35,000 / 50,000; 소/대/Boss = ×1 / ×1.5 / ×2. 각 ante 배율은 ×2.7에서 점차 ×1.4로 감소—플레이어 전투력은 초기에는 빠르게 성장하고 후기에는 둔화되기 때문.
- 본 게임 접근법: 직관으로 곡선을 정하지 마세요. 밸런스 시뮬레이션의 '적절한 봇(greedy)'으로 1,000+ 게임을 실행하고, 각 ante의 점수 중앙값 M(a)를 구한 다음, 목표 T(a) = M(a) × k(a)로 설정합니다. k는 초기 0.5(관대)에서 후기 0.9(빡빡)로 점진적으로 증가합니다.
- 목표: 흰색 말뚝에서 적절한 봇 승률 30–50%, 강한 봇 80–95%, 무작위 봇 < 5%. 인간의 첫 승리는 3–8 게임 사이.
- Endless: ante 9 이후 초지수 성장(Balatro 약 x^(x²) 규모), 빌드가 결국 붕괴하도록 하여 '몇 라운드까지 버텼다'는 공유 포인트를 제공합니다.
4. 재료(vial)와 촉매(catalyst)디자인
- 재료는 '카드'입니다: 각 병 = 하나의 재료 + 양(픽셀 수) + 가능한 수식어(온도, 순도, 마법 부여).
- 촉매는 '조커/유물'입니다: 수동, 상시, 화학 또는 점수 규칙을 수정. 상한 슬롯(예: 5)을 두어 플레이어가 선택해야 합니다.
- 오브젝트 역할 분류(모든 새 오브젝트는 하나의 주요 역할을 태그해야 함):
- Enabler(시동기) : 특정 원형을 가능하게 함("기름이 불 속에서 추가 불꽃을 생성함")
- Payoff(수익) : 원형이 성립된 후 점수를 제공함("연소 반응이 발생할 때마다 +3 mult")
- Bridge(연결) : 두 원형을 연결함("증기도 연소 반응으로 간주")—빌드가 단일 경로가 되지 않도록 함
- Economy(경제) : 돈, 할인, 추가 상점 슬롯
- Scaling(성장) : 사용할수록 강해짐("턴 종료 시, ≥3가지 반응이 있으면 이 촉매는 영구적으로 +1 mult")
- Utility/Consistency(안정) : 핸드 조작, 리롤, 미리보기, 비커 청소
- build-defining vs filler : rare 슬롯은 주로 build-defining(규칙 수정, 플레이어가 '방향 전환'을 하게 함); common은 filler(숫자, 안정)를 배치하지만 각 filler는 여전히 '언제 선택할지' 명확한 용도가 있어야 합니다.
- 희귀도(시작점, 이후 시뮬레이션으로 조정): Common 70% / Uncommon 25% / Rare 5%(Balatro 가중치); Legendary는 상점에 나오지 않고 특별 이벤트로만 획득.
- Enabler를 버프하고, 완성된 엔진을 버프하지 마세요(Luck be a Landlord 1.1): 약한 원형은 먼저 '입문 부품'을 제공하여 플레이어가 초기에 투자할 용기를 갖게 하고, '비상구'—원형 실패 시 전환할 수 있는 오브젝트를 제공합니다.
- 게임 시작 시 버프 부품을 강제로 제공하지 마세요. 시야가 좁아질 수 있습니다(tunnel vision).
- 원형 및 희귀도 할당량 표:
references/content-archetypes.md.
5. 상점 경제와 리롤
시작 수치(Balatro 기준, 이후 시뮬레이션으로 조정):
- 턴당 수입: 클리어 고정 $3–5 + 남은 재료 투하 횟수 × $1 + 이자($5 보유 시 $1, 최대 $5, 미확인이 Balatro 정확한 값). 이자는 '저축 vs 소비' 긴장을 만들므로 유지.
- 가격대: Common $2–5, Uncommon $5–8, Rare $8–10; 판매 가격 = 구매 가격 ÷ 2 무조건 내림, 최소 $1.
- 리롤: 시작 가격 $5, 매번 +$1, 새 상점 진입 시 초기화.(Balatro 규칙)
- 상점 슬롯: 2개 오브젝트 + 1–2개의 '재료 팩'(3개 중 1개 선택) + 1개의 업그레이드(voucher 유형, $10, 영구 규칙 변경).
- 경제 건강 검사(시뮬레이션 출력):
- 적절한 봇이 각 상점에서 평균 1–2개 구매 가능; 연속 3개 상점에서 아무것도 살 수 없음 = 경제 너무 빡빡함.
- 경제형 오브젝트의 승률 기여도는 수익형 오브젝트보다 높아서는 안 됨—그렇지 않으면 '돈부터 벌자'가 유일한 해결책이 됨.
- 리롤 횟수 분포: 중앙값 1–2회; 봇의 최적 전략이 매장당 리롤 ≥5회라면 리롤이 너무 싸거나 슬롯이 너무 나쁜 것.
6. 게임 길이와 템포(목표 30–60분)
- 예산: 24턴 × (3–4회 재료 투하 × 15–25초 + 상점 30–60초) ≈ 35–50분. 측정 후 재료 투하 횟수를 조정하고, 안정화 속도는 조정하지 않습니다.
- 3턴(ante 하나)마다 '새로운 것'이 하나 있어야 함: Boss 규칙, 상점 새 희귀도 해금, 새 재료 등장.
- 처음 3턴은 6분 이내에 완료해야 함: 초보자가 '재미있는지' 판단하는 시간은 매우 짧습니다(Peglin 데모 중간 플레이 시간 67분은 데모 전체 참고 값).
- 실패는 빨리: 실패한 게임은 ante 2–4에서 끝나야 하며 ante 7이 아니어야 합니다. '40분 플레이 후에야 빌드가 안 좋다는 것을 알게 되는 것'을 방지.
7. 난이도 사다리(Stakes / Ascension)
- 8–10단계, 누적 방식, 각 단계마다 규칙 하나만 추가(Slay the Spire Ascension 20, Balatro 8개 Stake 모두 누적).
- 본 게임 후보(쉬움에서 어려움 순): 목표 ×1.2 → 남은 재료 투하 시 돈 지급 안 함 → 상점 슬롯 하나 감소 → 비커 시작 시 오염 픽셀 있음 → 재료 양 -10% → 희귀 촉매 확률 절반 → Boss 규칙 두 개 → 목표 성장 곡선을 Purple 등급으로 변경.
- 난이도 사다리는 데이터 도구이기도 함: 다양한 계층의 승률은 더 세밀한 밸런스 정보를 제공합니다(Slay the Spire GDC).
- 각 계층 해금은 '이전 계층에서 한 번 승리' 조건; 메뉴에 표시하여 플레이어에게 장기 목표를 제공.
8. 메타 진행(Meta-progression, pay-to-win 금지)
- 영구 진행은 수평적 해금 위주: 새 재료, 새 촉매, 새 비커 모양, 새 시작 덱, 도감. 영구 수치 보너스는 금지(예: "모든 불 +5%").
- 해금 순서는 튜토리얼 역할: 처음에는 2–3개의 원형만 열고, 몇 게임 플레이 후 더 복잡한 원형을 엽니다(Roguebook: 진행으로 복잡한 메커니즘을 연기).
- 모든 게임(패배 포함)에서 무언가를 해금하거나 진행해야 함(Ball x Pit '플레이어 시간 존중': 거의 모든 게임에서 새 청사진).
- 올드비/스트리머를 위한 '전체 해금' 옵션 제공(Balatro도 추가), 대가로 해당 저장 파일은 업적 미인정.
- 유료 DLC는 콘텐츠(새 재료 팩)만 가능, 힘(파워)은 불가.
9. 혼돈 시뮬레이션을 기술처럼 보이게 만들기
- 결정론 : 고정 timestep, 정수 또는 고정 소수점, 고정 업데이트 순서(아래에서 위로; 좌우 스캔 방향은 tick 홀짝으로 결정, RNG 사용 안 함), 모든 무작위성은 run seed에서 파생된 PRNG에서 가져옴. 동일 입력에 대해 두 번 실행하여 hash 비교, CI 테스트에 포함.
- 미리보기 : 재료 투하 전에 낙하 궤적과 '어떤 재료와 접촉할지' 아이콘 표시; 결정론적이므로 배경 복사본에서 처음 N tick을 시뮬레이션하여 '예측 반응 아이콘'을 만들 수 있음. 전체 점수 미리보기는 촉매/아이템('시험관 거울')을 위한 리소스로 남겨두고, 공짜로 제공하지 않음.
- 반응 용어집은 고정되어 있고 적어야 함 : 각 반응마다 하나의 색상 + 아이콘 + 피치; 동일한 반응은 하나의 팝업 숫자로 집계("연소 ×37 → +185"), 픽셀마다 숫자가 튀지 않도록 함.
- 인과 관계 선 : 연쇄 반응은 가는 선이나 섬광으로 '누가 누구를 유발했는지' 연결하고, 연쇄 깊이는 큰 글씨로 표시(×2, ×3…), 이는 편집 하이라이트이기도 함.
- 변동성 제어 : 재료 투하 위치 차이는 점수에 유의미한 영향을 미쳐야 하지만, 동일 위치의 결과는 안정적이어야 함. '기술 격차' 측정 = 최적 위치 봇 점수 ÷ 무작위 위치 봇 점수, 목표 ≥ 2; < 1.3은 위치 선정이 의미 없음을 의미.
- 플레이어가 볼 수 있는 것만 시뮬레이션 : Noita는 이끼 성장, 느린 용해와 같은 미세한 효과가 아무도 주목하지 않는다는 것을 발견; 점수나 화면을 변경하는 반응에 리소스를 투자.
- 시뮬레이션이 게임 플레이를 방해할 때는 게임 플레이 우선(Noita): 치트 사용 가능(예: 반응이 재료 투하 후 X tick 내에서만 점수 계산, 입자 수 상한).
10. FTUE / 튜토리얼(시스템형 게임)
- 첫 번째 게임은 고정 seed와 고정 핸드 사용: 첫 재료 투하 = 모래(재료 투하 배우기), 두 번째 = 물(반응 배우기: 모래+물→진흙), 세 번째 = 불이 기름을 만남(연쇄와 mult 배우기). 각 투하는 한 가지만 가르칩니다.
- 비커로 가르치고, 텍스트로 가르치지 마세요: 텍스트 양이 적으면 10+ 언어 번역 비용과 AI 텍스트 노출 부담도 줄어듭니다.
- '반응 도감'(codex): 처음 발생한 반응을 자동으로 기록하고 잠시 하이라이트, 플레이어가 스스로 발견 = 재미(Roguebook: 시너지 발견은 핵심 재미).
- 각 vial/촉매 툴팁에는 'X와 반응함' 아이콘 목록이 표시되고, 텍스트에 의존하지 않음.
- 촉매와 상점은 두 번째 턴부터 개방; Boss는 ante 1 끝부터 개방.
- 첫 번째 게임은 이길 수 있지만, 진행이 첫 게임 승리에 의존하지 않음.
11. 플레이 테스트 방법과 지표
- 방법: 블라인드 테스트(설명 없음) → 처음 15분 think-aloud → 이후 조용히 관찰 → 종료 후 3가지 질문: "어떻게 졌나요?" "가장 짜릿했던 순간은?" "어디가 이해되지 않았나요?". 녹화.
- HSU 플레이 테스트: 매번 1–2개의 가설만 검증하고, 사전에
docs/design/playtests/YYYY-MM-DD.md에 작성. - 필수 수집 지표(원격 측정은 로컬 JSON에 기록, 플레이 테스트 버전에서 활성화):
- 첫 반응 시간, 첫 ×mult 이해 시간(곱셈을 적극적으로 추적하는지 확인)
- 게임당 사망 ante 분포, 게임 길이, 턴당 시간
- 자발적으로 두 번째 게임을 시작한 비율(가장 중요한 단일 지표)
- '왜 졌는지' 답변 정확도(가독성 지표, 목표 ≥ 70%)
- 오브젝트 툴팁 본 횟수 vs 구매 횟수(이해 못 함 vs 원하지 않음)
- 이벤트 형식:
run_start / pour{vial,x,angle,reactions[],score} / shop{offered[],bought[],rerolls} / run_end{ante,cause,build[]}. - '슈퍼 플레이 테스터' 편향 주의: 가장 친숙한 사람의 데이터는 일반 플레이어를 대표하지 않음(Slay the Spire GDC).
12. 밸런스 시뮬레이션(요약; 세부 사항은 references/balance-sim.md 참조)
- 밸런스 시뮬레이션은
sim/(Python 또는 headless C# 동일한 규칙 테이블)에서 실행, 규칙 데이터(재료, 반응, 촉매)는 동일한 JSON/CSV를 사용, Unity와 sim이 공유하여 두 곳이 어긋나는 것을 방지. - 봇 레벨: Random / Greedy(각 단계에서 예상 점수가 가장 높은 선택) / Lookahead(MCTS 또는 beam search로 재료 투하+구매 선택).
- 수치 변경 시마다 최소 1,000 게임 × 각 봇 실행; 보고서는
docs/design/balance/YYYY-MM-DD_<주제>.md에 저장. - 강력 전략 경보:
- 단일 오브젝트 '획득 시 승률 − 기준 승률' > +10 포인트
- 단일 원형이 승리 게임의 > 40% 차지 (목표: 상위 5개 원형이 각각 10–30% 사이)
- 특정 오브젝트가 greedy 봇에서 등장 시 획득률 < 3% → 죽은 카드
- 강한 봇의 흰색 말뚝 승률 > 98% → 전체 너무 쉬움
- 시뮬레이션이 이상한 전략을 발견 = 신호, 먼저 버그인지 확인(Google 연구: 에이전트의 이상한 행동은 종종 실제 조정 매개변수 오류를 드러냄).
- 수정 시 우선 숫자(비용, 희귀도, 보너스 값)를 조정하고, 다음으로 조건을 변경하고, 마지막에 재작업(LocalThunk: 대부분의 수정은 숫자 변경).
13. 새 vial / 촉매 검토 체크리스트
새로운 오브젝트를 제출하기 전에 각 항목을 확인하고, 오브젝트의 데이터 시트 비고에 기록:
- 한 문장으로 용도와 '언제 선택할지' 설명 가능
- 주요 역할(Enabler/Payoff/Bridge/Economy/Scaling/Utility)과 소속 원형을 태그함
- 효과를 ≤ 15개 영어 단어 또는 1줄 아이콘으로 표현 가능; 새 키워드가 필요 없거나, 새 키워드가 ≥ 3개의 오브젝트가 공유
- 효과는 '볼 수 있음': 트리거 시 화면 피드백(글자 팝업/섬광/사운드 효과)
- 결정론적: seed 처리되지 않은 무작위성 도입 없음; frame rate에 의존하지 않음
- 점수 계층 정확: common은 ×mult 제공 금지; ×mult 제공은 rare+ 또는 달성하기 어려운 조건 필요
- 기존 최강 3개 오브젝트 조합과 시뮬레이션 실행, > 10× 점수 폭주 없음(또는 폭주가 의도적이고 달성하기 어려운 경우)
- 기존 오브젝트를 무용지물로 만들지 않음(cannibalize)—동일 원형의 다른 오브젝트 획득률 전후 변화 확인
- 약세 상황에 탈출구 있음: 이 오브젝트를 선택했지만 원형이 완성되지 않은 경우, 최소한 filler 역할을 하거나 팔 수 있음
- 가격과 희귀도가 동일 역할 오브젝트와 일치
- 텍스트가 현지화 테이블(key)에 포함됨, 독일어/러시아어 팽창 +35% 후에도 공간에 맞음
- 성능: 트리거 시 최악의 경우 픽셀 양에서도 목표 FPS 유지
- 1,000 게임 시뮬레이션 실행: 획득률 5–40%, 승률 차이 ±10pp 이내(의도적인 build-defining rare가 아닌 경우)
출처
- Slay the Spire 데이터 기반 밸런스 (GDC 2019): https://www.gdcvault.com/play/1025731 ・ https://glasp.co/youtube/7rqfbvnO_H0 ・ https://podwise.ai/episodes/1459444
- Balatro 디자인 인터뷰: https://rogueliker.com/balatro-interview/ ・ https://toucharcade.com/2024/03/18/balatro-interview-mobile-port-localthunk-dlc-plans-updates-new-jokers-demo-feedback/
- Balatro 수치(블라인드, 상점): https://balatrowiki.org/w/Blinds_and_Antes ・ https://balatrowiki.org/w/Shop
- Luck be a Landlord 1.1 밸런스 노트: https://blog.trampolinetales.com/the-big-buffs-update-preview/
- Ball x Pit '플레이어 시간 존중': https://automaton-media.com/articles/newsjp/ball-pit-20251217-375231/
- Peglin 데이터: https://howtomarketagame.com/2022/05/04/how-peglin-made-1049413-in-1-week/
- Roguebook 빌드 디자인: https://www.gamedeveloper.com/design/tackling-deckbuilding-design-in-abrakam-s-roguebook
- Noita 낙사 디자인 및 기술: https://www.gamedeveloper.com/game-platforms/road-to-the-igf-nolla-games-i-noita-i- ・ https://80.lv/articles/noita-a-game-based-on-falling-sand-simulation/
- BotW 화학 엔진 (GDC 2017): https://www.thumbsticks.com/gdc-17-breath-of-the-wild-science-lies
- AI 에이전트 자동 테스트 밸런스 (Google): https://ar5iv.arxiv.org/html/1811.06962