구현 우선 순위 1차 진행 완료

- 1차 — 코어 검증 (여기까지만 되어도 재미 판정 가능)
  1. **기호 체계 + 책상 상태 상시 노출 UI** (§3)
  2. **책상 적재 + 누진 패시브 페널티 A·B** (§4)
  3. **표준 족보 판정 및 합본 실행** (§5)
  4. **합본 기반 토큰 산출** (§8.2)

 게임 플레이 후 피드백 해결
 - 내용은 아래 문서 참고
 - docs/decisions/2026-09-05_core-graybox-ux-feedback.md
This commit is contained in:
kyoung5seo
2026-09-05 01:06:41 +09:00
parent 54e2fa8132
commit 83060f3e5b
21 changed files with 1526 additions and 8 deletions
+62
View File
@@ -0,0 +1,62 @@
// 기호 체계 (ProjectSS_코어시스템_기획서.md §3) — 모든 카드가 공유하는 단일 기호 언어.
// 스와이프 판단은 텍스트가 아니라 이 기호(축 인장 + 기밀 등급)만으로 0.5초 내에 이루어져야 한다.
// 색상만으로 구분하지 말 것 — 아이콘 형태(실루엣) 자체가 축을 구분해야 한다 (§3.1).
export const AXES = ['axis_threat', 'axis_hr', 'axis_pr', 'axis_external'];
// 인장(아이콘)은 lucide-react의 Tornado/Hand/Megaphone/Stamp를 그대로 쓴다.
// 실제 아이콘 컴포넌트 매핑은 AxisIcon.jsx에서 담당 — 여기는 축의 이름·게이지·명분·토큰 매핑만.
export const AXIS_META = {
axis_threat: {
name: '위협',
sealName: '소용돌이',
gauge: 'entropy',
gaugeName: '엔트로피',
justification: '위기',
token: null, // §8.2: 위협 축은 플레이어 선택(또는 소량 전종) — economy.js에서 처리
},
axis_hr: {
name: '인사',
sealName: '손',
gauge: 'resistance',
gaugeName: '조직 저항',
justification: '내부',
token: 'personnel',
},
axis_pr: {
name: '공보',
sealName: '확성기',
gauge: 'panic',
gaugeName: '대중 공황',
justification: '여론',
token: 'info',
},
axis_external: {
name: '대외',
sealName: '도장',
gauge: 'risk',
gaugeName: '위험 수용 계수',
justification: '절차',
token: 'budget',
},
};
export const GRADE_MIN = 1;
export const GRADE_MAX = 4;
export const GRADE_NAME = {
1: '일반',
2: '대외비',
3: '2급 기밀',
4: '1급 기밀',
};
// 숫자가 아닌 점 개수로 표기한다 (§3.2) — "●●●○" 형태 문자열을 만들어 준다.
export const gradeDots = (grade) => {
const g = Math.max(GRADE_MIN, Math.min(GRADE_MAX, grade || 0));
return '●'.repeat(g) + '○'.repeat(GRADE_MAX - g);
};
export const gaugeOf = (axis) => AXIS_META[axis]?.gauge ?? null;
export const justificationOf = (axis) => AXIS_META[axis]?.justification ?? '혼합';
export const tokenOf = (axis) => AXIS_META[axis]?.token ?? null;