자산(엔진) 시스템 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,43 @@
import React from 'react';
import { ARCHETYPE_META } from '../engine/assetEngine';
import './AssetInfoPopup.css';
export default function AssetInfoPopup({ instance, def, onActivate, onClose }) {
if (!instance || !def) return null;
const meta = ARCHETYPE_META[def.archetype];
const isManualCharge = def.trigger.type === 'manual_charge';
const ready = isManualCharge && instance.charge >= 1;
return (
<div className="asset-popup-overlay" onClick={onClose}>
<div className="asset-popup" onClick={e => e.stopPropagation()}>
<div className="asset-popup-header">
<span className={`asset-popup-grade grade-${def.grade}`}>{def.grade}</span>
<span className="asset-popup-archetype">{meta.icon} {meta.label}</span>
<button className="close-btn" onClick={onClose}>&times;</button>
</div>
<h3 className="asset-popup-name">{def.name}</h3>
<p className="asset-popup-desc">{def.description}</p>
{def.growth && (
<div className="asset-popup-stat">
현재 숙련 스택: <strong>{instance.stack || 0}</strong> ( {def.growth.per}회마다 추가 발동)
</div>
)}
{isManualCharge && (
<div className="asset-popup-stat">
{ready ? '충전 완료 — 발동 가능' : `충전 대기 중 (${def.trigger.params.chargeEvery}건마다 충전)`}
</div>
)}
{ready && (
<button className="asset-popup-activate" onClick={onActivate}>발동</button>
)}
<p className="asset-popup-flavor">{def.flavor}</p>
</div>
</div>
);
}