자산(엔진) 시스템 v1 + 오염 카드 압박 강화

자산 시스템 (docs/작업지시서/자산시스템_작업지시서.md 반영, 이전 세션 작업분 커밋):
- 발라트로형 조커 레이어 엔진 빌딩 도입. assets.json 8종(트리거→효과→성장 스키마) +
  engine/assetEngine.js(이벤트 버스, 연쇄 깊이 상한 10)로 기존 수동 클릭형 자산 4종 전면 대체
- AssetInfoPopup 추가 — 자산 슬롯 클릭 시 트리거/효과/스택/충전 상태 표시, 발동 로그 피드 노출

오염 카드 압박 강화 (그레이박스 위기감 피드백 반영):
- engine/pollution.js 신설 — 오염 주입 규칙(타입 매핑·등급 추첨·물량)을 단일 모듈로 분리해
  사전 예고(SwipeCard) · 실제 주입(GameScreen) · 사후 알림이 같은 계산을 공유하도록 함
- 위험 파라미터를 올리는 결재는 정례회의를 기다리지 않고 그 자리에서 덱에 오염 카드를 주입
- UI 3종: 스와이프 시 오염 유입 사전 경고, 결재 후 유입 토스트, 상단 덱 오염 상시 게이지
- currentCardIndex를 매 결재마다 덱 길이로 정규화(주입/소각으로 덱 길이가 바뀌므로 필요)

기타:
- docs/architecture_design.md를 실제 구현(plain JS/CSS, useState, engine/ 순수 함수 경계)
  기준으로 전면 재작성 — 기존 문서는 채택되지 않은 초기 제안(Tailwind/Zustand/TS)이었음
- playtest.bat 추가 — 더블클릭으로 dev 서버 실행 (ASCII 전용, chcp로 인한 배치 파싱 오류 회피)
- CLAUDE.md 상태 갱신 및 실기 플레이 결과 기록

실기 플레이로 정상 동작 확인. 자산 획득 경로(극비 카드 스와이프)는 플레이 중 한 번도 발생하지
않아 원인 미조사 상태로 남김 — CLAUDE.md에 후속 확인 항목으로 기록.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
kyoung5seo
2026-07-23 22:59:30 +09:00
parent 31558edcb2
commit db1051c08c
14 changed files with 1397 additions and 279 deletions

View File

@@ -0,0 +1,128 @@
# 자산(엔진) 시스템 작업지시서 — 그레이박스 v1
> **목적**: 발라트로형 엔진 빌딩 검증. 자산 8종을 데이터로 구현하고, 자산 정보 UI 블로커를 해결하여 실제 플레이 테스트가 가능한 상태를 만든다.
> **원칙**: Greybox First. 수치는 전부 가안이며 튜닝 대상. 비주얼 연출 금지(텍스트/기본 도형만).
> **주의**: `update_csv_tags.js`, `update_csv.js` 등 파이프라인 스크립트는 수정 금지. 본 작업은 신규 데이터 파일 + 신규 로직 모듈로만 구성한다.
---
## Part A. 자산 데이터 스키마
신규 파일 `src/data/assets.json` 생성. 자산 1장의 문법은 **트리거 → 효과 → (선택) 성장**.
```json
{
"id": "asset_purge_001",
"name": "문서 파쇄실",
"grade": "C", // C | B | A | S
"archetype": "purge", // purge | convert | quarantine | skip
"trigger": {
"type": "every_n_approvals", // 트리거 enum (아래 표)
"params": { "n": 5 }
},
"effect": {
"type": "purge_lowest", // 효과 enum (아래 표)
"params": { "count": 1 }
},
"growth": null, // A급 이상만 사용. { "stackOn": "...", "per": 3, "bonus": {...} }
"risk": null, // 부작용. { "param": "risk_tolerance", "amount": 5, "when": "council_end" }
"faction_link": "scavengers", // 우호도 연동 파벌 (nullable)
"description": "결재 5건마다 덱에서 최하 등급 오염 카드 1장을 영구 소각한다.",
"flavor": "파쇄 용량: 일일 1건. 증설 요청은 3회 반려됨."
}
```
### 트리거 enum (v1 범위)
| type | 의미 | params |
|---|---|---|
| `on_pollution_draw` | 오염 카드 드로우 시 | `category`(신화/저항/공황/압박, nullable), `minGrade`(nullable) |
| `on_swipe_left` | 좌 스와이프 시 | — |
| `on_token_spend` | 토큰 소모 시 | `tokenType`(nullable) |
| `every_n_approvals` | 결재 N건마다 | `n` |
| `on_council_end` | 의회 종료 시 | — |
| `on_purge` | 오염 카드 소각 시 (연쇄용) | — |
| `on_convert` | 오염 카드 변환 시 (연쇄용) | — |
| `on_quarantine_fail` | 격리 실패 복귀 시 (연쇄용) | — |
| `manual_charge` | 충전식 수동/자동 방패 | `chargeEvery` |
### 효과 enum (v1 범위)
| type | 의미 | params |
|---|---|---|
| `purge_lowest` | 최하 등급 오염 소각 | `count` |
| `convert_to_token` | 오염 → 토큰 환전 | `tokenType`, `amount` |
| `quarantine` | 오염 격리 (조건 실패 시 강화 복귀) | `failCondition` |
| `negate_penalty` | 페널티 1회 무효 | `category`(nullable) |
| `gain_token` | 토큰 생성 | `tokenType`, `amount` |
| `gain_tag` | 자원 태그 생성 | `tagType`, `amount` |
| `convert_multiplier` | 변환 산출 배수 (상시) | `multiplier` |
| `quarantine_fail_to_purge` | 격리 실패 → 영구 소각으로 치환 (규칙 왜곡) | `bonusTag`(nullable) |
> 구현 노트: 트리거는 게임 이벤트 버스에 리스너로 등록. `on_purge`/`on_convert`/`on_quarantine_fail`은 다른 자산의 효과가 발생시키는 이벤트를 구독하므로, **효과 실행부가 반드시 이벤트를 발행**해야 연쇄가 성립한다. 무한 루프 방지를 위해 결재 1건당 연쇄 깊이 상한 10회.
---
## Part B. 자산 8종 데이터 (확정 배치 1차)
### ① 소각 특화 (faction: scavengers)
1. **문서 파쇄실** — C급
- 트리거: `every_n_approvals(5)` / 효과: `purge_lowest(1)`
2. **소각 처리 대장** — A급
- 트리거: `on_purge` / 성장: 스택 +1, 스택 3마다 `purge_lowest(1)` 추가 발동
### ② 변환 경제 (faction: nexus_traders)
3. **폐기물 재활용 규정** — C급
- 트리거: `on_pollution_draw(category: 신화)` / 효과: `gain_token(예산, 2)` (페널티는 정상 적용 후)
4. **부산물 매각 계약** — B급
- 효과: `convert_multiplier(2)` 상시 / 리스크: 의회 종료 시마다 위험 수용 계수 +5%
### ③ 격리 도박 (faction: occult_collectors)
5. **임시 격리 컨테이너** — C급
- 트리거: `on_swipe_left`(발동 선택 가능) / 효과: `quarantine(failCondition: 다음 의회까지 대중 공황 1단계 상승)`
6. **심연 보관 조례** — S급
- 트리거: `on_quarantine_fail` / 효과: `quarantine_fail_to_purge(bonusTag: 감시 +1)`
### ④ 무효 회피 (faction: field_agents_union — 우호도 **하락** 연동)
7. **결재 반려 도장** — C급
- 트리거: `manual_charge(chargeEvery: 10)` / 효과: `negate_penalty(전체)`
8. **책임 소재 불명 처리** — B급
- 트리거: 조직 저항 계열 `negate_penalty` 발동 시 / 효과: 인력 토큰 소모 없이 통과 / 리스크: 내부 저항 +3%
> 수치(5건, 토큰 2, 스택 3, 5%, 3% 등)는 전부 가안. 플레이 테스트 후 일괄 튜닝.
---
## Part C. UX 블로커 해결 (최우선 선행 작업)
**현재 문제**: 자산 클릭 시 아무 정보도 표시되지 않음 → 덱압축 시스템 평가 자체가 불가능.
1. 하단 자산 슬롯의 `Icon_Asset` 탭/클릭 시 정보 팝업 표시:
- 이름, 등급, 아키타입 아이콘
- **트리거 조건 → 효과** 를 한 문장으로 (description 필드 그대로)
- 성장형이면 현재 스택 수치 표시
2. **자산 발동 시 가시 피드백 (텍스트 로그로 충분)**: 화면 한쪽에 "『문서 파쇄실』 발동 — [하급 신화] 소각됨" 식의 1줄 로그. 발라트로의 조커 점멸에 해당하는 최소 구현. 연쇄 발동 시 순서대로 줄줄이 출력되어야 "엔진이 돌아간다"는 감각이 생긴다.
3. 그레이박스 기준이므로 애니메이션 불필요. 텍스트 로그 + 팝업만.
---
## Part D. 플레이 테스트 체크리스트
구현 완료 후 아래를 검증한다.
- [ ] **역전 엔진 성립**: 3번(재활용 규정) + 1번(파쇄실) 조합 시, 오염이 늘수록 자원이 돌고 덱이 정화되는 체감이 있는가?
- [ ] **연쇄 가시성**: 2번(소각 처리 대장) 보유 시 소각→스택→추가 소각 연쇄가 로그로 읽히는가?
- [ ] **S급 킹핀**: 6번(심연 보관 조례) 획득 전후로 격리 자산의 가치 평가가 뒤집히는가? (획득 전: 격리 기피 / 획득 후: 격리 남발)
- [ ] **무효 빌드의 풍자 체감**: 7+8번 조합으로 "덱은 더럽지만 아무 일도 안 일어나는" 상태가 만들어지는가?
- [ ] **오버파워 확인**: 페이즈 3에서 엔진이 오염 주입 속도를 이기는 순간이 오는가? (이겨야 정상 — 발라트로 모델)
- [ ] 연쇄 깊이 상한(10회)에 걸리는 케이스가 있는가?
## 범위 외 (다음 배치)
- 의회 압박 강화(안건 예고제, 표차 가시화) — 별도 작업지시서로 분리 예정
- 하이브리드 아키타입 자산 및 A/S급 보강 (2차 배치)
- 자산 획득 경로(극비 프로젝트 보상 테이블) 튜닝