Compare commits

..

No commits in common. "d0240497912936c82a473a92fb4b23f284648d09" and "4beb395a38f0cee2c070850653d16e87c93464cc" have entirely different histories.

27 changed files with 4 additions and 259472 deletions

View File

@ -1,37 +0,0 @@
---
name: 세션 시작 교훈 환기 6계층 운영 모니터링 보고서 (2026-04-23_0200)
description: BT4 6계층 체계 운영 데이터 누적 분석. pm-auditor 지속 모니터링 SOT 기반. 개선 안건 식별 + PD 보고
type: audit_pattern
period: 2026-04-23_0200
trigger: archive_entry_moved
---
# BT4 6계층 운영 모니터링 보고서 — 2026-04-23_0200
## 1. 트리거 상태
- project_context_조직운영_archive.md 엔트리 수: 2
## 2. 감사관 E안 자동 윈도우 실측
- pm-auditor: 7일
- dev-auditor: 7일
- plan-auditor: 7일
## 3. 계층별 발동 통계
**BT4 6계층 첫 가동 모니터링 스켈레톤** — 운영 데이터 축적 대기 상태. 본 보고서는 BT4 집행 완결(2026-04-23 `37729cd`) 이후 `project_context_조직운영_archive.md` 첫 엔트리 이동 시점 자동 발동분이며, 실 운영 데이터는 **다음 archive 이동 시점**부터 축적되어 다음 보고서(`audit_pattern_analysis_6계층_{YYYY-MM-DD_HHMM}.md`)에 집계 예정.
- 계층 0 고정 주입: 매 세션 1회 (기본 전제, BT4 집행 이후 활성)
- 계층 1~5: 운영 데이터 축적 대기 (현 시점 기록 없음)
## 4. 개선 안건
**본 첫 가동 스켈레톤 단계에서는 개선 안건 없음** — BT4 규칙 그대로 운영하며 최소 1회 이상의 archive 이동 사이클 관찰 후 Phase 3-B·3-C 실 데이터 기반 개선 안건 도출 예정.
## 5. PD 결정 요청
**현 시점 없음** — 다음 이동 사이클의 데이터 축적 후 PM·pm-auditor 협의로 개선 안건 도출 시 PD 보고
## 연관
- `memory/org/feedback_session_restore_monitoring.md` (모니터링 SOT)
- `memory/org/project_context_조직운영.md` (트리거 기반)
- `scripts/recent_feedback_brief.sh` (6계층 구현)

View File

@ -1,82 +0,0 @@
---
type: feedback_memory
pattern: PM_환경제약_PD수동전가_반복
severity: major
triage_date: 2026-04-23
last_updated: 2026-04-23
related_rules: [C23, C29, C36, C2, C11]
related_feedback: [feedback_pm_capability_underestimation.md]
---
# PM 환경 제약 → PD 수동 집행 전가 패턴 (개발팀 Agent 실측 우선)
## 1. 사건 요약 (2026-04-23 BT5-Dev 2단계)
PD 지시: BT5-Dev 2단계 (EerieVillage 캐릭터 교체·이동·공격·i-frame) — 원 계획은 "Claude Desktop Unity MCP로 Unity Editor 직접 조작".
PM 인식 경로:
- Claude Code 세션에는 `mcp__unity-mcp__*` 도구가 노출되지 않음 (BT4에서 Claude Desktop 전용 배포)
- PM 초기 프레이밍: "Claude Code 세션에서 Unity MCP 불가 → PD 수동 집행 대기"
PD 지적 (요지): "Unity 프로젝트 파일 직접 Edit으로 수행 가능한 범위 최대 구현. PD 수동 개입 최소화."
개발팀장 Agent 재설계:
- Unity 프로젝트는 **YAML·JSON·C# 텍스트 포맷** → Claude Code의 Read·Edit·Write로 **95%+ 구현 가능**
- 불가능한 것: Play 모드 런타임 검증, Animator GUI 특유의 StateMachine 시각 편집, Editor Inspector 컴포넌트 Add
- 파일 직접 Edit으로 수행한 범위: C# 스크립트 5종(신규 2·개정 3), Input Actions JSON 바인딩 추가, Scene YAML의 Sprite GUID 교체, .meta guid 할당
## 2. 근본 원인
1. **PM이 환경 제약을 탐색 없이 포장**: "MCP 도구 부재 = 수행 불가"로 과속 결론
2. **개발팀 Agent의 파일 직접 Edit 가능성 과소평가**: Unity 자산이 모두 텍스트 기반이라는 속성 간과
3. **C29 업무 자율 수행 위반**: PD에게 "Play 모드 검증 외 전부 수동으로 해주세요" 수준으로 떠넘기기
4. **C36 방향·원칙 수준 축소 시도**: "자동화 최대" 방향을 "일부는 불가"로 희석
## 3. 재발 방지 — PM 체크리스트
환경·도구 제약 보고 전 **반드시 다음 4단계 선행 실측**:
1. **실 파일 포맷 확인** — 편집 대상이 텍스트(YAML·JSON·md·C#)인지 바이너리인지
2. **개발팀 Agent의 Read·Edit·Write로 가능한 범위 실증** — 1개 샘플 파일로 조작 성공 여부 확인
3. **불가능한 부분만 분리** — "전부 불가"가 아닌 "A·B는 가능, C·D는 GUI 필수"로 세분
4. **C·D만 PD 수동 요청** — 개수·구체 내용 명시, 전체 떠넘기기 금지
체크리스트 미통과 시 PM 자기검증 C31-A (C29 준수) 위반 후보로 간주.
## 4. 연관 사건 로그
| 일시 | 사건 | 근본 원인 | 재발 방지 |
|---|---|---|---|
| 2026-04-20 | PM이 PreToolUse 차단 workflow를 "복잡도 과다"로 축소 시도 | 구현 복잡도 선입견 | pm-auditor 의무 호출·근본 해결안 우선 제시 (C2-3) |
| 2026-04-22 | PM이 Unity MCP 미지원을 "PD 수동 집행 대기"로 결론 | 환경 제약 = 불가 공식화 | 본 SOT 신설 — 실측 4단계 선행 |
| 2026-04-23 | 본 사건 (BT5-Dev 2단계) | 위와 동일 반복 | 본 체크리스트 운용 + C31-A 연동 |
## 5. 실증 가치 (조직 자산)
EerieVillage BT5-Dev 2단계에서 **파일 직접 Edit으로 수행한 실적**:
- C# 스크립트 신규 2종·개정 3종
- InputActions JSON 바인딩 2건 추가
- Scene YAML Sprite 참조 1건 교체
- .meta guid 할당 2종
- 백업 5종 (C6-1 표준 포맷 `{원본명}.bak_YYYYMMDD_HHMM.{확장자}`)
PD 수동 요청은 4건으로 축소:
1. AttackHitbox 컴포넌트 Player에 Add
2. Health 컴포넌트 Enemy에 Add
3. Play 모드 검증
4. (선택) Animator attack trigger 파라미터 추가
**커버리지 ~90%** 달성 — "전부 PD 수동" 대비 대폭 개선.
## 6. 연관 규칙
- **C23** 허위 보고·역할 연기 절대 금지 — 환경 제약을 "수행 불가"로 과포장 시 C23 위반 후보
- **C29** 업무 자율 수행 체계 — PM 결정 떠넘기기 금지
- **C36** PM 자율 판단 범위 상한 — 자동화 최대 방향 축소 금지
- **C2** 근원적 문제 해결 최우선 — "MCP 도구 부재" 대신 "텍스트 포맷 활용"으로 근본 재설계
- **C11** 개발 관점 원칙 (개발팀 전용) — 자원 효율성 (PD 시간)·코드 직관성(Agent 자동화) 우선
- **feedback_pm_capability_underestimation.md** — 조직 역량 과소평가 일반 패턴의 특수 사례
## 7. 영구 보존 사유
본 패턴은 **Unity MCP 확장·다른 외부 도구 도입 시에도 재발 가능**. 환경 제약이 있는 모든 경우에 본 체크리스트를 재활용할 수 있도록 SOT로 영구 보존.

View File

@ -33,7 +33,8 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------|
| BT5-Dev | 2026-04-23 | **EerieVillage Phase 3 파일럿 (개발)** — ①Unity 프로젝트 git 초기화 + C안 자동 sync ②캐릭터 스프라이트 세트 교체·이동·공격(마우스 좌)·i-frame ③템플릿 구조·소스코드 선행 분석 | **진행중** | [1단계 완료 + 경로 변경 반영] Unity `E:/EerieVillage/` · `9f689c1` 원격 push · `scripts/unity_auto_sync.sh` · `paths.local.json.template`·`paths.local.json` PM 대행 [3단계 완료 01:29] `프로젝트/EerieVillage/개발/01~03_*.md` · 재사용 10/교체 5/신규 11·P0/P1/P2·BT.Framework Tier 1 5종·Additive Load·JSON [2단계 완료 02:10 · Unity 파일 직접 Edit 커버 ~90%] **PM 자진 정정 후 개발팀 Agent 재수행** (Claude Desktop PD 전가 패턴 `feedback_pm_dev_task_delegation_failure.md` 신설) · Unity 편집 5종(`PlayerAttack.cs`·`AttackHitbox.cs` 신설·`PlayerController.cs`·`Health.cs`·`PlayerEnemyCollision.cs` 개정 + `InputSystem_Actions.inputactions` Attack 액션·`SampleScene.unity` Alien→PlayerIdle GUID 교체) · 공격 마우스 좌클릭·i-frame 0.6s·밟기 판정 폐기 · 백업 5종 C6-1 표준 · 구현 보고 `프로젝트/EerieVillage/개발/04_BT5-Dev_2단계_구현보고.md` | — | **PD 수동 검증 요청 4건** — ①Player GameObject에 AttackHitbox 컴포넌트 Add ②Enemy.prefab에 Health 컴포넌트 Add ③Play 모드 실행 검증(이동·점프·공격·i-frame·사망) ④(선택)Animator attack trigger 추가 · 방법: Unity Editor GUI Inspector Add Component 또는 Claude Desktop Unity MCP 지시 · 완료 시 BT5-Dev 전체 완료 아카이브 이동 |
| BT5-Dev | 2026-04-23 | **EerieVillage Phase 3 파일럿 (개발)** — ①Unity 프로젝트 git 초기화 + C안 자동 sync(Unity Editor GitAutoSync + BT 본 레포 unity_auto_sync.sh) ②캐릭터 스프라이트 세트 교체·이동·공격(마우스 좌) — Claude Desktop Unity MCP ③템플릿 구조·소스코드 선행 분석 | **진행중** | [1단계 완료 + 경로 변경 반영] Unity 프로젝트 `E:/EerieVillage/`(2026-04-23 PD 이동) · 초기 commit `9f689c1` · **원격 push 완료** (`origin/main`) · Gitea 레포 생성 + Discord 웹훅 연결 PD 완료 · `scripts/unity_auto_sync.sh` 버그 fix(환경변수·고정 경로 우선) · `paths.local.json.template` 경로 예시 갱신 [3단계 완료 2026-04-23 01:29] `프로젝트/EerieVillage/개발/01_템플릿_구조_분석.md`·`02_스크립트_분석.md`·`03_게임_제작_준비.md` — 스크립트 36개 중 11개 Read 실측 + 재사용/교체/신규 10/5/11 분류 + P0/P1/P2 로드맵 + BT.Framework Tier 1 5종 선별 + Additive Load 씬 구조 결정 + JSON 저장소 결정 [2단계 대기] Claude Desktop Unity MCP 캐릭터 교체 | — | 2단계만 남음: PD Claude Desktop에서 Unity MCP로 캐릭터 교체 작업 수행 시 활성 지시 완료 처리 |
| BT5-Plan | 2026-04-23 | **EerieVillage Phase 3 파일럿 (기획)** — PD 9개 코어 룰 기반 초기 기획: 캐주얼 로그라이크 2D 횡스크롤 플랫포머 · 마을/전투 구분 · 보스 스테이지 · 레벨업 스킬 카드 3픽 · 기본 라이프 1 (사망 시 레벨·스킬 초기화) · 아이템 파츠별 1개 (교체식) · 특성 영구 시스템. 스킬 카드·아이템 상세는 "추후 기획" 표기. narrative·system·content·level·balance·ux 서브에이전트 동원은 기획팀장 재량 | **진행중** | 예상: `프로젝트/EerieVillage/기획/01_게임_컨셉.md`·`02_코어_루프.md`·`03_진행_시스템_초안.md`·`04_전투_기본_스펙.md`·`05_스테이지_구조_초안.md` + 팀원 동원분 | — | 기획팀장 Agent background 호출 → 산출물 수령 시 종합 보고 |
---

View File

@ -33,7 +33,8 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------|
(활성 지시 없음 — BT6-Plan Phase 3-B 완료 아카이브 이동. Phase 3-C(BM·과금·세부 대사·보스 패턴 확장·아트 톤) PD 지시 수령 시 신규 등록)
(활성 지시 없음 — BT5 EerieVillage 파일럿 초기 기획 5종 작성 완료 아카이브 이동됨. 후속 상세 기획(Phase 3-B/C)은 PD 지시 수령 후 신규 항목 등록)
---
@ -48,4 +49,3 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| BT1 | 2026-04-21 | BurningTimes 조직 신설 — 기획팀 영역 전환 | **완료** | [완료: 2026-04-21 02:10 · commit: `4911b74`→`8ff5a1f` · 참조: `공유/대화로그/조직운영/2026-04-21.md` · 기획팀 아카이브 7종 `공유/조직자산/시행착오_아카이브/기획_*.md`] Phase 1·2-A·2-B·2-C 완료 | — | Phase 3 EerieVillage 기획 착수 대기 |
| BT2 | 2026-04-21 | BT 조직 전환 8개 지시 — 기획팀 집행 영역: ①시행착오 노하우 재정리 (기획팀장·system/content/level/narrative/balance/ux-designer 동원) ③수상한잡화점 기획 산출물 삭제 + 교훈 보존 ⑧새 프로젝트 "기묘한 고을: 조선퇴마뎐" 기획 착수 (Unity 6000.3.13f1 LTS · 2D PlatformerMicrogame 템플릿) | **완료** | [완료: 2026-04-21 02:10 · commit: `5d5b1dd`→`8ff5a1f` · 참조: `공유/대화로그/조직운영/2026-04-21.md` · 기획팀 시행착오 아카이브 7종 · `프로젝트/EerieVillage/기획/` · SKILL.md P17 폐기 · P29 EerieVillage 재작성 · P30-3 EerieVillage 적용] 기획팀 8개 지시 집행 완료 | — | EerieVillage 기획 골격(세계관 SOT·2D 플랫포머 UX·Prove-2-of-3 이식성 검토 등) Phase 3 분리 (PD 결정 6) |
| BT5 | 2026-04-23 | EerieVillage 파일럿 착수 — 핵심 게임 룰 9개 기반 초기 기획 5종 작성 (01_게임_컨셉·02_코어_루프·03_진행_시스템_초안·04_전투_기본_스펙·05_스테이지_구조_초안). 상세 기획(스킬 카드 효과·아이템·특성·세계관 디테일)은 Phase 3-B/C로 보류. 팀원 동원 재량 허용 | **완료** | [완료: 2026-04-23 · commit: `4e2d002` · 참조: `공유/대화로그/EerieVillage/2026-04-23.md`] `프로젝트/EerieVillage/기획/01~05_*.md` 5종 (총 509 라인) · 재미 축 3종 정의 (육성 롤러코스터·액션 플랫포머·영속 위안) · 각 문서 기각안·변경 이력 필수 필드 포함 · 상세 Phase 3-B/C 이관 항목 명시 | — | Phase 3-B 상세 기획 착수 시 PD 지시 수령 후 전문 에이전트 병렬 호출 (narrative-designer 세계관 SOT·system-designer 카드/특성 메카닉·content-designer 카드/아이템 풀·level-designer 스테이지·balance-designer 수치·ux-designer 모바일 터치) |
| BT6-Plan | 2026-04-23 | **Phase 3-B 상세 기획 (기획팀 6개 전문 에이전트 병렬)** — BT5-Plan 기획 5종 파일럿 계승 후 상세 기획 착수. 영역별 6개 전문 에이전트(narrative·system·content·level·balance·ux) | **완료** | [완료: 2026-04-23 02:14 · commit: `c43d20f` · 참조: `공유/대화로그/EerieVillage/2026-04-23.md` · `공유/대화로그/조직운영/2026-04-23.md`] 6개 영역 14문서 약 2224 라인 · 기각안 53건 (narrative 9·system 9·content 9·level 8·balance 12·ux 6) · 마을 **안개골**·보스 알머리 영감·솟대 장군·흑룡 미완성 · 카드 32·아이템 파츠 5·특성 15·스테이지 5·이동 6.0·i-frame 0.6s·XP 80+Lv×20·가상 스틱+버튼 HUD · pm-auditor Critical 6·Major 4 정정 후 재감사 통과 | — | Phase 3-C(BM·과금·세부 대사·보스 패턴 확장·아트 톤·외부 아트 발주) PD 결정 대기 |

View File

@ -1,60 +0,0 @@
using System;
using Platformer.Gameplay;
using UnityEngine;
using static Platformer.Core.Simulation;
namespace Platformer.Mechanics
{
/// <summary>
/// Represebts the current vital statistics of some game entity.
/// </summary>
public class Health : MonoBehaviour
{
/// <summary>
/// The maximum hit points for the entity.
/// </summary>
public int maxHP = 1;
/// <summary>
/// Indicates if the entity should be considered 'alive'.
/// </summary>
public bool IsAlive => currentHP > 0;
int currentHP;
/// <summary>
/// Increment the HP of the entity.
/// </summary>
public void Increment()
{
currentHP = Mathf.Clamp(currentHP + 1, 0, maxHP);
}
/// <summary>
/// Decrement the HP of the entity. Will trigger a HealthIsZero event when
/// current HP reaches 0.
/// </summary>
public void Decrement()
{
currentHP = Mathf.Clamp(currentHP - 1, 0, maxHP);
if (currentHP == 0)
{
var ev = Schedule<HealthIsZero>();
ev.health = this;
}
}
/// <summary>
/// Decrement the HP of the entitiy until HP reaches 0.
/// </summary>
public void Die()
{
while (currentHP > 0) Decrement();
}
void Awake()
{
currentHP = maxHP;
}
}
}

View File

@ -1,806 +0,0 @@
{
"version": 1,
"name": "InputSystem_Actions",
"maps": [
{
"name": "Player",
"id": "df70fa95-8a34-4494-b137-73ab6b9c7d37",
"actions": [
{
"name": "Move",
"type": "Value",
"id": "351f2ccd-1f9f-44bf-9bec-d62ac5c5f408",
"expectedControlType": "Vector2",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "Jump",
"type": "Button",
"id": "f1ba0d36-48eb-4cd5-b651-1c94a6531f70",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Menu",
"type": "Button",
"id": "660e2b4b-b11a-4b85-9d42-2beada90fd4a",
"expectedControlType": "",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "",
"id": "978bfe49-cc26-4a3d-ab7b-7d7a29327403",
"path": "<Gamepad>/leftStick",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Move",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "WASD",
"id": "00ca640b-d935-4593-8157-c05846ea39b3",
"path": "Dpad",
"interactions": "",
"processors": "",
"groups": "",
"action": "Move",
"isComposite": true,
"isPartOfComposite": false
},
{
"name": "up",
"id": "e2062cb9-1b15-46a2-838c-2f8d72a0bdd9",
"path": "<Keyboard>/w",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "up",
"id": "8180e8bd-4097-4f4e-ab88-4523101a6ce9",
"path": "<Keyboard>/upArrow",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "320bffee-a40b-4347-ac70-c210eb8bc73a",
"path": "<Keyboard>/s",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "1c5327b5-f71c-4f60-99c7-4e737386f1d1",
"path": "<Keyboard>/downArrow",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "d2581a9b-1d11-4566-b27d-b92aff5fabbc",
"path": "<Keyboard>/a",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "2e46982e-44cc-431b-9f0b-c11910bf467a",
"path": "<Keyboard>/leftArrow",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "fcfe95b8-67b9-4526-84b5-5d0bc98d6400",
"path": "<Keyboard>/d",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "77bff152-3580-4b21-b6de-dcd0c7e41164",
"path": "<Keyboard>/rightArrow",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Move",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "",
"id": "1635d3fe-58b6-4ba9-a4e2-f4b964f6b5c8",
"path": "<XRController>/{Primary2DAxis}",
"interactions": "",
"processors": "",
"groups": "XR",
"action": "Move",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "3ea4d645-4504-4529-b061-ab81934c3752",
"path": "<Joystick>/stick",
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Move",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "eb40bb66-4559-4dfa-9a2f-820438abb426",
"path": "<Keyboard>/space",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Jump",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "daba33a1-ad0c-4742-a909-43ad1cdfbeb6",
"path": "<Gamepad>/buttonSouth",
"interactions": "",
"processors": "",
"groups": "Gamepad",
"action": "Jump",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "603f3daf-40bd-4854-8724-93e8017f59e3",
"path": "<XRController>/secondaryButton",
"interactions": "",
"processors": "",
"groups": "XR",
"action": "Jump",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "bf91b079-c2a3-41a7-ab9e-6e5fbc7e9f4b",
"path": "<Keyboard>/escape",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse;Gamepad;Touch;Joystick;XR",
"action": "Menu",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "ab1194d0-a370-48e0-b510-68e72eba2707",
"path": "<Gamepad>/start",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Menu",
"isComposite": false,
"isPartOfComposite": false
}
]
},
{
"name": "UI",
"id": "272f6d14-89ba-496f-b7ff-215263d3219f",
"actions": [
{
"name": "Navigate",
"type": "PassThrough",
"id": "c95b2375-e6d9-4b88-9c4c-c5e76515df4b",
"expectedControlType": "Vector2",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Submit",
"type": "Button",
"id": "7607c7b6-cd76-4816-beef-bd0341cfe950",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Cancel",
"type": "Button",
"id": "15cef263-9014-4fd5-94d9-4e4a6234a6ef",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "Point",
"type": "PassThrough",
"id": "32b35790-4ed0-4e9a-aa41-69ac6d629449",
"expectedControlType": "Vector2",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "Click",
"type": "PassThrough",
"id": "3c7022bf-7922-4f7c-a998-c437916075ad",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "RightClick",
"type": "PassThrough",
"id": "44b200b1-1557-4083-816c-b22cbdf77ddf",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "MiddleClick",
"type": "PassThrough",
"id": "dad70c86-b58c-4b17-88ad-f5e53adf419e",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "ScrollWheel",
"type": "PassThrough",
"id": "0489e84a-4833-4c40-bfae-cea84b696689",
"expectedControlType": "Vector2",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "TrackedDevicePosition",
"type": "PassThrough",
"id": "24908448-c609-4bc3-a128-ea258674378a",
"expectedControlType": "Vector3",
"processors": "",
"interactions": "",
"initialStateCheck": false
},
{
"name": "TrackedDeviceOrientation",
"type": "PassThrough",
"id": "9caa3d8a-6b2f-4e8e-8bad-6ede561bd9be",
"expectedControlType": "Quaternion",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "Gamepad",
"id": "809f371f-c5e2-4e7a-83a1-d867598f40dd",
"path": "2DVector",
"interactions": "",
"processors": "",
"groups": "",
"action": "Navigate",
"isComposite": true,
"isPartOfComposite": false
},
{
"name": "up",
"id": "14a5d6e8-4aaf-4119-a9ef-34b8c2c548bf",
"path": "<Gamepad>/leftStick/up",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "up",
"id": "9144cbe6-05e1-4687-a6d7-24f99d23dd81",
"path": "<Gamepad>/rightStick/up",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "2db08d65-c5fb-421b-983f-c71163608d67",
"path": "<Gamepad>/leftStick/down",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "58748904-2ea9-4a80-8579-b500e6a76df8",
"path": "<Gamepad>/rightStick/down",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "8ba04515-75aa-45de-966d-393d9bbd1c14",
"path": "<Gamepad>/leftStick/left",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "712e721c-bdfb-4b23-a86c-a0d9fcfea921",
"path": "<Gamepad>/rightStick/left",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "fcd248ae-a788-4676-a12e-f4d81205600b",
"path": "<Gamepad>/leftStick/right",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "1f04d9bc-c50b-41a1-bfcc-afb75475ec20",
"path": "<Gamepad>/rightStick/right",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "",
"id": "fb8277d4-c5cd-4663-9dc7-ee3f0b506d90",
"path": "<Gamepad>/dpad",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "Joystick",
"id": "e25d9774-381c-4a61-b47c-7b6b299ad9f9",
"path": "2DVector",
"interactions": "",
"processors": "",
"groups": "",
"action": "Navigate",
"isComposite": true,
"isPartOfComposite": false
},
{
"name": "up",
"id": "3db53b26-6601-41be-9887-63ac74e79d19",
"path": "<Joystick>/stick/up",
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "0cb3e13e-3d90-4178-8ae6-d9c5501d653f",
"path": "<Joystick>/stick/down",
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "0392d399-f6dd-4c82-8062-c1e9c0d34835",
"path": "<Joystick>/stick/left",
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "942a66d9-d42f-43d6-8d70-ecb4ba5363bc",
"path": "<Joystick>/stick/right",
"interactions": "",
"processors": "",
"groups": "Joystick",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "Keyboard",
"id": "ff527021-f211-4c02-933e-5976594c46ed",
"path": "2DVector",
"interactions": "",
"processors": "",
"groups": "",
"action": "Navigate",
"isComposite": true,
"isPartOfComposite": false
},
{
"name": "up",
"id": "563fbfdd-0f09-408d-aa75-8642c4f08ef0",
"path": "<Keyboard>/w",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "up",
"id": "eb480147-c587-4a33-85ed-eb0ab9942c43",
"path": "<Keyboard>/upArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "2bf42165-60bc-42ca-8072-8c13ab40239b",
"path": "<Keyboard>/s",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "down",
"id": "85d264ad-e0a0-4565-b7ff-1a37edde51ac",
"path": "<Keyboard>/downArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "74214943-c580-44e4-98eb-ad7eebe17902",
"path": "<Keyboard>/a",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "left",
"id": "cea9b045-a000-445b-95b8-0c171af70a3b",
"path": "<Keyboard>/leftArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "8607c725-d935-4808-84b1-8354e29bab63",
"path": "<Keyboard>/d",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "right",
"id": "4cda81dc-9edd-4e03-9d7c-a71a14345d0b",
"path": "<Keyboard>/rightArrow",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Navigate",
"isComposite": false,
"isPartOfComposite": true
},
{
"name": "",
"id": "9e92bb26-7e3b-4ec4-b06b-3c8f8e498ddc",
"path": "*/{Submit}",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR",
"action": "Submit",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "82627dcc-3b13-4ba9-841d-e4b746d6553e",
"path": "*/{Cancel}",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse;Gamepad;Touch;Joystick;XR",
"action": "Cancel",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "c52c8e0b-8179-41d3-b8a1-d149033bbe86",
"path": "<Mouse>/position",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Point",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "e1394cbc-336e-44ce-9ea8-6007ed6193f7",
"path": "<Pen>/position",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "Point",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "5693e57a-238a-46ed-b5ae-e64e6e574302",
"path": "<Touchscreen>/touch*/position",
"interactions": "",
"processors": "",
"groups": "Touch",
"action": "Point",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4faf7dc9-b979-4210-aa8c-e808e1ef89f5",
"path": "<Mouse>/leftButton",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Click",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "8d66d5ba-88d7-48e6-b1cd-198bbfef7ace",
"path": "<Pen>/tip",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Click",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "47c2a644-3ebc-4dae-a106-589b7ca75b59",
"path": "<Touchscreen>/touch*/press",
"interactions": "",
"processors": "",
"groups": "Touch",
"action": "Click",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "bb9e6b34-44bf-4381-ac63-5aa15d19f677",
"path": "<XRController>/trigger",
"interactions": "",
"processors": "",
"groups": "XR",
"action": "Click",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "38c99815-14ea-4617-8627-164d27641299",
"path": "<Mouse>/scroll",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "ScrollWheel",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4c191405-5738-4d4b-a523-c6a301dbf754",
"path": "<Mouse>/rightButton",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "RightClick",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "24066f69-da47-44f3-a07e-0015fb02eb2e",
"path": "<Mouse>/middleButton",
"interactions": "",
"processors": "",
"groups": "Keyboard&Mouse",
"action": "MiddleClick",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "7236c0d9-6ca3-47cf-a6ee-a97f5b59ea77",
"path": "<XRController>/devicePosition",
"interactions": "",
"processors": "",
"groups": "XR",
"action": "TrackedDevicePosition",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "23e01e3a-f935-4948-8d8b-9bcac77714fb",
"path": "<XRController>/deviceRotation",
"interactions": "",
"processors": "",
"groups": "XR",
"action": "TrackedDeviceOrientation",
"isComposite": false,
"isPartOfComposite": false
}
]
}
],
"controlSchemes": [
{
"name": "Keyboard&Mouse",
"bindingGroup": "Keyboard&Mouse",
"devices": [
{
"devicePath": "<Keyboard>",
"isOptional": false,
"isOR": false
},
{
"devicePath": "<Mouse>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "Gamepad",
"bindingGroup": "Gamepad",
"devices": [
{
"devicePath": "<Gamepad>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "Touch",
"bindingGroup": "Touch",
"devices": [
{
"devicePath": "<Touchscreen>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "Joystick",
"bindingGroup": "Joystick",
"devices": [
{
"devicePath": "<Joystick>",
"isOptional": false,
"isOR": false
}
]
},
{
"name": "XR",
"bindingGroup": "XR",
"devices": [
{
"devicePath": "<XRController>",
"isOptional": false,
"isOR": false
}
]
}
]
}

View File

@ -1,151 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Platformer.Gameplay;
using static Platformer.Core.Simulation;
using Platformer.Model;
using Platformer.Core;
using UnityEngine.InputSystem;
namespace Platformer.Mechanics
{
/// <summary>
/// This is the main class used to implement control of the player.
/// It is a superset of the AnimationController class, but is inlined to allow for any kind of customisation.
/// </summary>
public class PlayerController : KinematicObject
{
public AudioClip jumpAudio;
public AudioClip respawnAudio;
public AudioClip ouchAudio;
/// <summary>
/// Max horizontal speed of the player.
/// </summary>
public float maxSpeed = 7;
/// <summary>
/// Initial jump velocity at the start of a jump.
/// </summary>
public float jumpTakeOffSpeed = 7;
public JumpState jumpState = JumpState.Grounded;
private bool stopJump;
/*internal new*/ public Collider2D collider2d;
/*internal new*/ public AudioSource audioSource;
public Health health;
public bool controlEnabled = true;
bool jump;
Vector2 move;
SpriteRenderer spriteRenderer;
internal Animator animator;
readonly PlatformerModel model = Simulation.GetModel<PlatformerModel>();
private InputAction m_MoveAction;
private InputAction m_JumpAction;
public Bounds Bounds => collider2d.bounds;
void Awake()
{
health = GetComponent<Health>();
audioSource = GetComponent<AudioSource>();
collider2d = GetComponent<Collider2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
animator = GetComponent<Animator>();
m_MoveAction = InputSystem.actions.FindAction("Player/Move");
m_JumpAction = InputSystem.actions.FindAction("Player/Jump");
m_MoveAction.Enable();
m_JumpAction.Enable();
}
protected override void Update()
{
if (controlEnabled)
{
move.x = m_MoveAction.ReadValue<Vector2>().x;
if (jumpState == JumpState.Grounded && m_JumpAction.WasPressedThisFrame())
jumpState = JumpState.PrepareToJump;
else if (m_JumpAction.WasReleasedThisFrame())
{
stopJump = true;
Schedule<PlayerStopJump>().player = this;
}
}
else
{
move.x = 0;
}
UpdateJumpState();
base.Update();
}
void UpdateJumpState()
{
jump = false;
switch (jumpState)
{
case JumpState.PrepareToJump:
jumpState = JumpState.Jumping;
jump = true;
stopJump = false;
break;
case JumpState.Jumping:
if (!IsGrounded)
{
Schedule<PlayerJumped>().player = this;
jumpState = JumpState.InFlight;
}
break;
case JumpState.InFlight:
if (IsGrounded)
{
Schedule<PlayerLanded>().player = this;
jumpState = JumpState.Landed;
}
break;
case JumpState.Landed:
jumpState = JumpState.Grounded;
break;
}
}
protected override void ComputeVelocity()
{
if (jump && IsGrounded)
{
velocity.y = jumpTakeOffSpeed * model.jumpModifier;
jump = false;
}
else if (stopJump)
{
stopJump = false;
if (velocity.y > 0)
{
velocity.y = velocity.y * model.jumpDeceleration;
}
}
if (move.x > 0.01f)
spriteRenderer.flipX = false;
else if (move.x < -0.01f)
spriteRenderer.flipX = true;
animator.SetBool("grounded", IsGrounded);
animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / maxSpeed);
targetVelocity = move * maxSpeed;
}
public enum JumpState
{
Grounded,
PrepareToJump,
Jumping,
InFlight,
Landed
}
}
}

View File

@ -1,53 +0,0 @@
using Platformer.Core;
using Platformer.Mechanics;
using Platformer.Model;
using UnityEngine;
using static Platformer.Core.Simulation;
namespace Platformer.Gameplay
{
/// <summary>
/// Fired when a Player collides with an Enemy.
/// </summary>
/// <typeparam name="EnemyCollision"></typeparam>
public class PlayerEnemyCollision : Simulation.Event<PlayerEnemyCollision>
{
public EnemyController enemy;
public PlayerController player;
PlatformerModel model = Simulation.GetModel<PlatformerModel>();
public override void Execute()
{
var willHurtEnemy = player.Bounds.center.y >= enemy.Bounds.max.y;
if (willHurtEnemy)
{
var enemyHealth = enemy.GetComponent<Health>();
if (enemyHealth != null)
{
enemyHealth.Decrement();
if (!enemyHealth.IsAlive)
{
Schedule<EnemyDeath>().enemy = enemy;
player.Bounce(2);
}
else
{
player.Bounce(7);
}
}
else
{
Schedule<EnemyDeath>().enemy = enemy;
player.Bounce(2);
}
}
else
{
Schedule<PlayerDeath>();
}
}
}
}

View File

@ -1,193 +0,0 @@
# 대화로그 — EerieVillage — 2026-04-22
> **프로젝트**: 기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist
> **조직**: BurningTimes
> **기록 근거**: C32 대화로그 기록 의무 (헌법급)
---
## [BT6-Plan Phase 3-B] system-designer — 카드 시스템·특성 시스템 설계 완료
**태그**: #시스템설계 #카드시스템 #특성시스템 #Phase3B #BT6Plan
**수행 주체**: 시스템 기획자 (system-designer)
**작업 요지**:
PD님 지시 BT6-Plan Phase 3-B 수령 — BT5-Plan 계승(03_진행_시스템_초안·01_게임_컨셉·04_전투_기본_스펙) 선행 Read 후 시스템 기획 영역 2종 설계.
**선행 Read 확인 사항**:
- 03_진행_시스템_초안: 3축 성장 구조(카드·아이템·특성)·카드 시스템 골격(3픽 강제·태그 시너지·동일 카드 업그레이드 개념)·기각안 4건 계승
- 04_전투_기본_스펙: 라이프 1·근거리 1종 기본 공격·카드 효과로 확장 방향 계승
- 01_게임_컨셉: 재미 축 3종(육성 롤러코스터·액션 플랫포머·영속 위안)·참신함:일관성 3:7 계승
**산출물** (2종 · 총 356 라인):
1. `프로젝트/EerieVillage/기획/system/01_카드_시스템.md` (170 라인)
2. `프로젝트/EerieVillage/기획/system/02_특성_시스템.md` (186 라인)
**주요 결정**:
- 카드 풀 3티어 구조: T1(기본) 항상 활성 / T2(숙련) 누적 레벨 N 해금 / T3(각성) 런 내 조건 한정 등장
- 픽 알고리즘 4단계 가중 무작위: 티어 비율 → 빌드 주력 태그 2개 추가 가중 → 보유 카드 제외(업그레이드 가능 허용) → 티어 다양성 필터
- 태그 2축 시너지: 속성 태그(오행 기반) + 유형 태그(근거리/원거리/결계/부적/주술)
- 동일 카드 스택 업그레이드: Lv.1→2→3, Lv.3 이상 재픽 시 재화 보상 or 랜덤 변형 분기
- 특성 3축 구조: A축(능력치) / B축(해금) / C축(선택지 특성)
- 특성 슬롯 무제한 + 수치 캡 방식 채택 (슬롯 N개 상한 기각)
- 특성 절대 리셋 없음 원칙 확정 / persistentDataPath JSON 데이터 모델 초안 작성
**기각안 총수**: 카드 시스템 5건 + 특성 시스템 4건 = 9건
**content-designer·balance-designer 이관 항목**:
- [content] 카드 명칭·효과 텍스트·태그 세트 전체 리스트 (조선 오행 세계관 반영)
- [content] T3 해제 조건 텍스트
- [balance] T1/T2/T3 비율 수치·태그 시너지 K장 임계값
- [content] 특성 종류·ID·효과 텍스트·배타 쌍 맵
- [balance] 특성 A축 수치 캡 / 보스 처치 후 후보 K장 수치
- [개발팀] persistentDataPath JSON 스키마 최종 확정 + 마이그레이션 로직
---
## [BT6-Plan Phase 3-B] level-designer — 스테이지 구조·보스 패턴 초안 설계 완료
**태그**: #레벨기획 #스테이지구조 #보스패턴 #Phase3B #BT6Plan
**수행 주체**: 레벨 기획자 (level-designer)
**작업 요지**:
PD님 지시 BT6-Plan Phase 3-B 수령 — BT5-Plan 계승(05_스테이지_구조_초안·02_코어_루프·01_게임_컨셉·04_전투_기본_스펙) 선행 Read 후 레벨 기획 영역 2종 설계.
**선행 Read 확인 사항**:
- 05_스테이지_구조_초안: 3단 구성·보스 아레나·후방 차단·고정 카메라·기각안 5건 계승
- 02_코어_루프: 마을↔전투 플로우·라이프 1·사망 분기·분기 선택 계승
- narrative-designer/02_보스_네이밍.md: **부재 확인** — 보스명 임시 기능명으로 작성, narrative-designer 이관 명시
**산출물** (2종 · 총 353 라인):
1. `프로젝트/EerieVillage/기획/level/01_스테이지_구조.md` (188 라인)
2. `프로젝트/EerieVillage/기획/level/02_보스_패턴_초안.md` (165 라인)
**주요 결정**:
- 스테이지 5종 채택 (3종 vs 5종 vs 7종 중 — 근거: 3종은 반복감 조기 노출, 7종은 파일럿 초과)
- 자동 생성 vs 수동 배치: 파일럿 수동 고정 + 구간 2 적 배치 소규모 셔플 (프로시저럴 기각 계승)
- 보스 3종 (스테이지 1·3·5 배치): 2·4는 balance-designer 협의 후 Phase 3-C 확장
- 보스 페이즈 3단 구성 고정: 복잡화(5종 이상 패턴) 기각
**기각안**:
1. 스테이지 3종 파일럿 최소 구성 — 기각 (반복감 조기 노출)
2. 구간 2 완전 랜덤 배치 — 기각 (레벨 의도 붕괴 위험)
3. 보스 방 후 자동 회복 아이템 — 기각 (라이프 1 원칙 훼손)
4. 패턴 복잡화 보스당 5종 이상 — 기각 (캐주얼 포지션 인지 과부하)
5. 다중 보스 동시 출현 — 기각 (05 §7-5 계승)
6. 보스 체력 회복 페이즈 — 기각 (템포 저하)
7. 보스 방 진입 후 준비 UI — 기각 (몰입 단절)
**balance·ux 이관 항목**:
- balance-designer: 스테이지 1~5 수치(적 수·강도·레벨업 경험치), 보스 수치(체력·패턴 예고 시간), 아레나 구조 최종 수치
- content-designer: 몬스터 종류·AI·스펙, 소환 몬스터 스펙
- ux-designer: 텔레그래프 시각 피드백, 모바일 터치 아레나 UX
- narrative-designer: 보스 네이밍·외형 확정 (02_보스_네이밍.md 신규 작성 필요)
- 개발팀: 순간이동 구현 가능 여부, 전장 암흑화 성능 비용, 낙하 함정 판정
**열린 이슈 수**: 총 15건 (스테이지 8건 + 보스 7건)
---
## [BT6-Plan Phase 3-B] balance-designer — 전투 수치·레벨업 곡선·i-frame·보상 구조 초안 완료
**태그**: #밸런스기획 #전투수치 #이프레임 #레벨업곡선 #보상구조 #Phase3B #BT6Plan
**수행 주체**: 밸런스 기획자 (balance-designer)
**작업 요지**:
PD님 지시 BT6-Plan Phase 3-B 수령 — BT5-Plan 계승(04_전투_기본_스펙·03_진행_시스템_초안·02_코어_루프·05_스테이지_구조_초안) 선행 Read 후 밸런스 기획 영역 2종 설계. 코어 룰 7(라이프 1·카드 전손)·9(특성 영구) 고수. P30 재미 정의 선행 수행.
**선행 Read 확인 사항**:
- 04_전투_기본_스펙: i-frame 범위 400~800ms 제시·2단 점프 보류·근거리 1종 공격·무적 0 기각
- 03_진행_시스템: 3픽 코어·레어리티 가중 방향·카드 최대 수 미결
- 02_코어_루프: 마을↔전투·사망 분기·보상 구조 보류 확인
- 05_스테이지_구조: 3단 구성·레벨업 빈도 곡선 방향성 계승
**산출물** (2종 · 총 431 라인):
1. `프로젝트/EerieVillage/기획/balance/01_전투_수치.md` (215 라인)
2. `프로젝트/EerieVillage/기획/balance/02_레벨업_곡선.md` (216 라인)
**주요 결정 및 기각안 요약**:
1. i-frame 0.6초 채택 — 0.3초(연타 방지 미달 기각)·1.0초(보스 패턴 무효화 기각)
2. 레벨업 곡선 수정 선형 `RequiredXP = 80 + (Lv × 20)` — 기하급수(후반 Lv 도달 불가 기각)·순수 선형(레어 진입 과속 기각)
3. MoveSpeed 6.0 m/s — 8.0(오버슈트 기각)
4. BaseDamage 20 / AttackCooldown 0.4s / DPS 50 / 일반 적 TTK 1.2초
5. 보스 HP 400 — 빌드 3~4장 기준 TTK 60~80초
6. 카드 티어 확률 5단계 (Lv1~2 Common 70% → Lv9+ Rare+Epic 70%)
7. DEF 스탯 미도입 — 라이프 1 즉사 구조에서 무의미
8. 보스 XP 80 고정 — 보스 처치 클라이맥스 XP 0 기각
**기각안 수**: 01_전투_수치 6건 + 02_레벨업_곡선 6건 = 총 **12건**
**개발팀·level-designer 교차 검증 이관 (Phase 3-C)**:
- MoveSpeed·GravityScale Unity 실측 (PlatformerMicrogame 템플릿 의존)
- i-frame 0.6s ± 실측 조정 (적 공격 패턴 구현 후)
- 스테이지당 적 수 level-designer 확정 후 XP/스테이지 재산출
- XP 처리 순서 코드 레벨 정합 (어뷰징 가드)
- 모바일 Touch Delay 75ms 가정 실기기 검증
---
## [BT6-Plan Phase 3-B] narrative-designer — 세계관 SOT·보스 네이밍·마을 컨셉 설계 완료
**태그**: #기획 #BT6-Plan #Phase3-B #narrative #세계관 #보스네이밍 #마을컨셉
**수행 주체**: narrative-designer (PD 지시 BT6-Plan Phase 3-B 수령)
**작업 요지**:
BT6-Plan Phase 3-B 일환으로 EerieVillage 조선·퇴마 세계관 SOT·보스 네이밍·마을 컨셉 3종 문서를 작성. BT5-Plan 계승 (01_게임_컨셉·02_코어_루프·05_스테이지_구조_초안 선행 Read 완료) 후 설계. level/02_보스_패턴_초안.md의 "narrative-designer 이관 명시" 항목에 응답.
**산출물** (3종 · 총 427 라인):
1. `프로젝트/EerieVillage/기획/narrative/01_세계관_SOT.md` (129라인)
- 한 줄 설정: "저승과 이승의 경계가 허물어진 조선 어느 고을에서, 혼자인 퇴마사는 오늘도 죽고 오늘도 다시 일어선다."
- 배경 시대: 조선 후기 가상 역사 "요괴 성행기"
- 퇴마 체계: "사방신 결계법" — 무속 중심 + 불교·도교 혼합
- 적대 세력 4카테고리: 원혼·요괴·신수 변질·저승 사자류
- 톤앤매너 기준: 해학·캐주얼 60% / 민속·신비 30% / 공포 10%
- 시리즈화 설계 포함 (경계 균열 원인 미해결로 속편 훅 제공)
2. `프로젝트/EerieVillage/기획/narrative/02_보스_네이밍.md` (119라인)
- 스테이지 1 보스: 달걀귀신 "알머리 영감" (폐주막, 입문·해학)
- 스테이지 2 보스: 두억시니 "솟대 장군" (경계 솟대 숲, 위협감 상승)
- 스테이지 3 보스: 이무기 "흑룡 미완성" (강변·늪지, 서사 클라이맥스·연민+위협)
- 각 보스 배경 스토리 2~3줄 + 외형 모티프(스프라이트 발주 기준) 포함
3. `프로젝트/EerieVillage/기획/narrative/03_마을_컨셉.md` (179라인)
- 마을 명칭 확정: "안개골"
- 공간 구조: 좌우 선형 배치 — 주막·무당집·사당·대장간·경계 문 5개 공간
- NPC 3종: 주모 "복선댁"(정보꾼·안도) / 스승 혼령 "선사"(서사 허브) / 상인 "이 서방"(아이템)
- 2D 횡스크롤 씬 구성 가이드 포함
**핵심 결정**:
- **세계관 톤앤매너 확정**: 해학·캐주얼 60% / 민속·신비 30% / 공포 10%. 고어·공포 표현 금지선 명시
- **퇴마 체계 확정**: "사방신 결계법" — 스킬 카드 = 신격의 힘을 빌리는 술식으로 시스템·서사 직결. 사망-복귀 = "고을이 존재하는 한 이승 귀환"으로 로그라이크 루프 내러티브 정당화
- **보스 3종 확정**: level/02_보스_패턴_초안 임시 보스명 대체. 설화 아이러니(수호 존재 오염) 구조로 서사 깊이 추가
- **마을 명칭 확정**: "안개골" — 안개 시각 키워드 + 순우리말 발음 + 캐주얼 톤 정합
**기각안 (전 문서 합산 9건)**:
1. 조선 고증형 리얼 세계관 — 기각 (역사 오류 리스크)
2. 불교 중심 단일 퇴마 체계 — 기각 (스테이지 다양성 제한)
3. 퇴마사 이름 고정 — 기각 (자기투영 보호, Phase 3-C 재검토)
4. 삼두구미 최종 보스 — 기각 (일본 요괴 혼선·스프라이트 복잡도)
5. 불가사리 중간 보스 — 기각 (공격 패턴 직관성 부족)
6. 어둑시니 첫 보스 — 기각 (배경 동화·가독성 저하)
7. 대규모 탐험형 마을 — 기각 (파일럿 스코프 초과)
8. NPC 없는 최소 허브 — 기각 (재미 축 3 전달 불가)
9. 마을 명칭 "경계촌" — 기각 (설명적 한자어, 캐주얼 톤 부정합)
**Phase 3-C 이관 항목**:
- 퇴마사 고유 이름 확정, 캐릭터 아크 상세, NPC 확정 대사 전문·분기 스크립트
- 사당 로어 텍스트 전문 (귀신 도감 항목)
- 보스 처치 후 연출·대사 스크립트
- 마을 내부 탐험 확장, 마을 BGM 방향성
**공유 상태**: 내부 공유 (C21-①). PD님 별도 "세션 공유" 지시 시 main push (C21-②).
---

View File

@ -126,87 +126,3 @@ PlayerController·GameController·Health·KinematicObject·Simulation·Simulatio
**변경 이력 기록 근거**: P16 산출물 추적성. 각 문서 §8 또는 §9 변경 이력 테이블 유지.
**공유 상태**: 내부 공유 (C21-① · 로컬 commit 예정). PD님 별도 "세션 공유" 지시 시 main push (C21-②).
---
## [BT6-Plan · ux-designer] 모바일 터치 UX·HUD 설계 완료
**태그**: #기획 #BT6-Plan #Phase3B #ux-designer #모바일터치 #HUD
**수행 주체**: ux-designer
**작업 요지**:
BT6-Plan Phase 3-B 지시 수령 — BT5-Plan 04_전투_기본_스펙·02_코어_루프·03_게임_제작_준비 Read 선행 후 모바일 터치 UX 설계 + HUD 설계 2종 문서 작성.
**산출물** (2종):
1. `프로젝트/EerieVillage/기획/ux/01_모바일_터치_UX.md`
- 조작 스킴 확정 (가상 스틱 좌/점프·공격 버튼 우), 버튼 레이아웃 와이어프레임, Input System 액션 맵, 피격 3종 피드백, BT.Framework 재사용 매핑 6종, 기각안 3종
2. `프로젝트/EerieVillage/기획/ux/02_HUD_설계.md`
- 정보 우선순위 3순위, 인게임 HUD 와이어프레임, 레벨업 카드 픽 UI, 마을 UI, 사망·복귀 전환 UI, 접근성 기본, BT.Framework 재사용 매핑 4종, 기각안 3종
**핵심 결정 (기각안 필수 포함)**:
- **조작 스킴**: 가상 스틱(좌) + 점프·공격 버튼(우). 스와이프 회피 기각 (오입력·라이프 1 위험)
- **레벨업 카드 픽**: Time.timeScale=0 + Unscaled Time. 시간 제한 없음 기각 철회 → 시간 제한 기각 (캐주얼 포지션)
- **HUD 정보 우선순위**: 라이프 → 레벨·경험치 → 카드 슬롯. 미니맵 기각
- **BT.Framework Tier 2 이관 3종**: SafeAreaBorder·UITouchHandler·BackKeyDispatcher 신규 구현 → 개발팀 이관
**기각안 6건**:
터치스킴: 스와이프 회피·고정 스틱·버튼 비표시. HUD: 미니맵·카드 슬롯 크게·시간 제한 카드 픽
**공유 상태**: 내부 공유 (C21-①). PD님 별도 "세션 공유" 지시 시 main push (C21-②).
---
## [02:10] BT5-Dev 2단계 Unity 프로젝트 파일 직접 Edit으로 구현 완료
**태그**: #개발 #BT5-Dev #2단계 #Unity_MCP_미지원_대응 #파일_직접_Edit #i-frame #공격 #스프라이트_교체
**수행 주체**: 개발팀장 Agent (PM Task 호출 경유)
**배경 · 방향 재설계**:
PD 지시 원 계획은 Claude Desktop Unity MCP. 본 Claude Code 세션은 `mcp__unity-mcp__*` 미지원. PD 재지시 "파일 직접 Edit으로 가능한 범위 최대 구현. PD 수동 최소화." 개발팀장 Agent가 Unity 프로젝트 텍스트 자산(YAML·JSON·C#) 직접 편집 방식으로 수행 — 커버리지 ~90% 달성.
**산출물 (Unity 프로젝트 편집 — 외부 레포 `E:/EerieVillage/`)**:
1. **C# 스크립트 신설 2종** (+ .meta guid 할당)
- `Assets/Scripts/Gameplay/PlayerAttack.cs` — Simulation.Event<PlayerAttack>, 카드·특성 훅 확장 지점
- `Assets/Scripts/Mechanics/AttackHitbox.cs` — OverlapBoxAll 근거리 판정 박스, Inspector 노출 파라미터 5종, Gizmo 가시화, 중복 타격 방지 HashSet
2. **C# 스크립트 개정 3종**
- `PlayerController.cs` — m_AttackAction·attackCooldown·attackAudio·attackHitbox·facing 추가, Update에서 Schedule<PlayerAttack> 발화
- `Health.cs` — invulnerableDuration 기본 0.6s, IsInvulnerable 프로퍼티, Decrement i-frame 가드, Die는 i-frame 우회
- `PlayerEnemyCollision.cs` — "위에서 밟기" 판정 폐기, i-frame 체크 후 Decrement, HealthIsZero 체인 신뢰
3. **Asset 편집 2종**
- `Settings/InputSystem_Actions.inputactions` — Player 맵에 Attack 액션 + `<Mouse>/leftButton`·`<Gamepad>/rightTrigger` 바인딩
- `Scenes/SampleScene.unity` — Alien 데코 SpriteRenderer `m_Sprite`를 Mr.Alien(GUID 443583d5...)에서 PlayerIdle frame10(GUID ba86c7b2..., fileID 21300020)으로 교체
**산출물 (BT worktree)**:
- `프로젝트/EerieVillage/개발/04_BT5-Dev_2단계_구현보고.md` (신설) — 편집 파일 목록·구현 체크리스트·PD 수동 요청 4건·리스크 5종·기각안 5종
- `memory/org/feedback_pm_dev_task_delegation_failure.md` (신설) — PM 환경 제약 PD 전가 패턴 SOT, 4단계 실측 체크리스트
- `공유/개발팀_백업/EerieVillage/*.bak_20260423_0201.*` (5파일) — C6-1 원본 보호
**핵심 결정 (기각안 필수 포함)**:
- **"Mr.Alien → Player 시리즈 교체" 재해석**: Player.prefab은 이미 PlayerIdle 사용 중. SampleScene의 "Alien" 데코 오브젝트만 잔존 → 스프라이트 참조만 PlayerIdle로 교체
- **i-frame 기본 0.6s**: 기획 04 §3-2 후보 범위 0.4~0.8s 중간값. Inspector 노출로 Phase 3-B balance-designer 튠 가능
- **공격 애니메이션 부재 → 정적 유지**: PD 원문 허용. Animator "attack" trigger 호출은 warning만 남김 (동작 영향 없음)
- **기각안 5건**:
- Player.prefab에 AttackHitbox YAML 직접 추가 기각 (MonoBehaviour guid 관리 복잡)
- Animator Controller YAML에 attack trigger 직접 추가 기각 (StateMachine 깨짐 리스크)
- Mr.Alien.png 자산 삭제 기각 (타 참조 검증 전, C6-1 준수)
- 공격 신규 애니메이션 생성 기각 (스프라이트 리소스 부재)
- PlayerEnemyCollision Bounce 유지 기각 ("위에서 밟기" 의도 결합 로직)
**PD 수동 작업 요청 (4건)**:
1. Player GameObject에 `AttackHitbox` 컴포넌트 Add
2. Enemy.prefab에 `Health` 컴포넌트 Add
3. Play 모드 런타임 검증 (이동·점프·공격·i-frame·사망)
4. (선택) Animator `attack` trigger 파라미터 추가
**공유 상태**: 내부 공유 (C21-①). Unity 프로젝트는 외부 레포라 Editor 실행 시 GitAutoSync가 자동 push → origin/main 반영. BT worktree 산출물은 PM 재량 commit·push (C20).
**관련 규칙 준수**:
- C6-1 원본 보호 백업 5종 (`bak_20260423_0201` 표준 포맷)
- C30 Unity 프로젝트 git 최신 확인 (fetch·status → clean)
- C34-11 절대 경로 하드코딩 주의 (Unity 프로젝트 `E:/EerieVillage/` 허용 외부 레포, BT 산출물은 worktree 상대)
- C23 정직성 — Play 모드 검증 불가 사실 명시, 리스크 5종 공개
- C29 업무 자율 수행 — PD 수동 4건으로 축소, PM 떠넘기기 차단

View File

@ -209,51 +209,3 @@ Critical 2·Major 1 발견 → 정정 완료 → 재호출 예정:
- ✅ 3단계 완료 (템플릿 분석 3종 문서)
- ⏳ 2단계 대기 (PD Claude Desktop Unity MCP 캐릭터 교체)
- ⏳ PD 최종 1건: `paths.local.json` 생성
---
## [BT5-Dev 2단계 + BT6-Plan Phase 3-B 일괄 완료] 7 Agent 병렬 집행
**태그**: #BT5-Dev2단계 #BT6-Plan #Phase3B #7Agent병렬 #PM자진정정
### PM 자진 정정 근거
PD님 지적 "Unity MCP 개발팀 책임·PD 떠넘기지 말고 직접 수행" 수용. 이전 세션 PM이 Claude Code Unity MCP 미지원을 "PD 수동 Claude Desktop"으로 전가한 패턴을 **C29 업무 자율 수행 위반·C36 PM 재량 상한 위반**으로 자인. 재발 방지 SOT `memory/org/feedback_pm_dev_task_delegation_failure.md` 신설. 개발팀 Agent에게 Unity 파일 직접 Edit 방식으로 재위임 → 커버리지 ~90% 달성 실증.
### 7 Agent 병렬 호출 결과
| 영역 | Agent | 산출 |
|------|-------|------|
| BT5-Dev 2단계 | 개발팀장 | 04_구현보고 + Unity 5종 편집 + 백업 5종 + feedback SOT |
| BT6-Plan narrative | narrative-designer | 3종 427줄 · 마을 **안개골** · 보스 3종 · 해학 60/민속 30/공포 10 |
| BT6-Plan system | system-designer | 2종 356줄 · 카드 3티어 가중 무작위·특성 A/B/C 3축 |
| BT6-Plan content | content-designer | 3종 413줄 · 카드 32·아이템 파츠 5종 21예시·특성 15종·한자 병기 |
| BT6-Plan level | level-designer | 2종 353줄 · 스테이지 5·보스 3 3페이즈 |
| BT6-Plan balance | balance-designer | 2종 431줄 · 이동 6.0·점프 3.5·i-frame 0.6s·XP 80+Lv×20 |
| BT6-Plan ux | ux-designer | 2종 · 가상 스틱+버튼·HUD 라이프→레벨→카드 |
### 핵심 결정 통합
- **세계관**: 조선 퇴마사 × 사방신 결계법 × 오행 술식. 마을 안개골 허브 + 주막·사당·대장간·무당집
- **시스템**: 카드 3티어 32장 · 오행 태그 2축 · 특성 3축 15종 · 아이템 파츠 5종 교체식
- **레벨·밸런스**: 스테이지 5·보스 3 (스테이지 2·4 Phase 3-C) · 이동 6.0 · i-frame 0.6s · 보스 HP 400 · XP 곡선 80+Lv×20
- **UX**: 가상 스틱(좌) + 점프·공격 버튼(우) · HUD 3순위 + 레벨업 카드 픽 Unscaled Time · SafeArea·UITouchHandler·BackKey Tier 2 신규 편입 후보
### Unity 구현 (BT5-Dev 2단계)
- PlayerAttack·AttackHitbox 신설 (Schedule<T> 이벤트 훅)
- PlayerController·Health·PlayerEnemyCollision 개정 (공격 입력·i-frame·밟기 판정 폐기)
- InputSystem_Actions: Attack 액션 + Mouse LeftButton 바인딩
- SampleScene.unity: Alien → PlayerIdle SpriteRenderer GUID 교체
- C6-1 표준 백업 5종
### PD 수동 검증 4건 (BT5-Dev 완료 아카이브 이동 전제)
1. Player GameObject에 AttackHitbox 컴포넌트 Add
2. Enemy.prefab에 Health 컴포넌트 Add
3. Play 모드 실행 검증 (이동·점프·공격·i-frame·사망 체인)
4. (선택) Animator attack trigger 추가
### 기각안 총계
- 기획팀 6개 영역 기각 **53건** (narrative 9·system 9·content 9·level 8·balance 12·ux 6) + 개발팀 2단계 기각 5종 = **58건**
- 총 라인수 약 **2224 라인** (14문서)
- 조직 기억 영구 보존 (C32)
- **실측 정정**: 초기 보고 59건·2350 라인은 pm-auditor 재감사 실측으로 53건·2224 라인 정정 (C5 정직성)
### pm-auditor 사전 감사 예정
commit 직전 C35-1 #2·#5 의무 호출. 통과 시 commit + push + PD 종합 보고

View File

@ -1,152 +0,0 @@
---
type: 구현_보고서
scope: BT5-Dev_2단계
author: 개발팀장
date: 2026-04-23
version: v0.1
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: BT5-Dev 2단계 (캐릭터 교체·이동·공격·i-frame)
data_source: Unity 프로젝트 직접 Edit (Unity MCP 미지원 환경 대응, 파일 YAML·C# 편집)
status: 구현 완료 (Editor Play 모드 검증은 PD 수동 수행 필요)
---
# 04. BT5-Dev 2단계 구현 보고
## 1. 배경 — 수행 방법 재설계
**원 계획**: Claude Desktop Unity MCP로 Unity Editor 직접 조작 (2026-04-23 PD 지시 원문).
**실제 집행 방법**: 본 Claude Code 세션에는 `mcp__unity-mcp__*` 도구가 배포되지 않아, **Unity 프로젝트 파일(YAML meta·C# 스크립트·Scene YAML·InputActions JSON)을 직접 Edit**으로 수행. Unity Editor Play 모드 런타임 검증만 PD 수동 집행 요청.
본 접근 근거:
- Unity 프로젝트 파일은 YAML·JSON·C# 텍스트 포맷 → 파일 Edit으로 완전 구현 가능
- 단일 SOT (Unity Editor GUI) 경유 없이도 asset 일관성 유지 가능
- Editor 실행 시 GitAutoSync가 post-commit 자동 push → PD Editor 실행 시점에 본 변경사항 자동 반영
- `feedback_pm_capability_underestimation.md`·`memory/org/feedback_pm_dev_task_delegation_failure.md` 계승 — "환경 제약을 PD 수동으로 전가" 금지
## 2. 구현 완료 항목 (체크리스트)
| # | 항목 | 상태 | 편집 파일 | 핵심 변경 |
|---|---|---|---|---|
| 1 | **이동** (WASD·방향키·게임패드·XR·Joystick) | ✅ 기존 유지 | — | 템플릿 Input Actions `Player/Move` 그대로 계승 (기획 04 §2) |
| 2 | **점프** (Space·게임패드 A·XR secondary) | ✅ 기존 유지 | — | 템플릿 Input Actions `Player/Jump` 그대로 계승 |
| 3 | **공격** (마우스 좌클릭 + 게임패드 RT) | ✅ 신설 | `InputSystem_Actions.inputactions`·`PlayerController.cs`·`PlayerAttack.cs`·`AttackHitbox.cs` | Attack 액션·이벤트·판정박스 3단 구조 신설 |
| 4 | **i-frame** (기본 0.6s, Inspector 노출) | ✅ 신설 | `Health.cs`·`PlayerEnemyCollision.cs` | `invulnerableDuration`·`IsInvulnerable`·`Decrement` 보호·`Die` 무효화·충돌 체인 i-frame 체크 |
| 5 | **스프라이트 교체** (Mr.Alien → PlayerIdle) | ✅ 교체 | `SampleScene.unity` | Alien 데코 SpriteRenderer GUID·fileID 변경 (Player.prefab과 동일 스프라이트 참조) |
| 6 | 점프·착지·피격·사망 애니메이션 | ✅ 기존 유지 | — | 템플릿 `Player.controller` + 7종 `.anim` (Idle·Run·Jump·Land·Hurt·Death·Spawn·Victory) 계승. 공격 애니메이션만 부재 → **정적 스프라이트** 상태 유지 (PD 원문 허용) |
## 3. 편집한 Unity 프로젝트 파일 목록
### 3-1. C# 스크립트 신설 (2개)
| 파일 | 역할 |
|---|---|
| `Assets/Scripts/Gameplay/PlayerAttack.cs` | Attack 이벤트 (`Simulation.Event<PlayerAttack>`). OnExecute 훅으로 카드 효과·특성 훅 확장 지점 (개발 02 §2-1). `player`·`direction` 필드 보유 |
| `Assets/Scripts/Mechanics/AttackHitbox.cs` | 근거리 공격 판정 박스 (`OverlapBoxAll`). `size`·`offsetDistance`·`activeDuration`·`damage`·`targetLayers` Inspector 노출. 같은 스윙 중복 타격 방지 (`alreadyHit HashSet`). Gizmo 가시화 포함 |
.meta 파일도 수동 생성 (guid 고유 할당).
### 3-2. C# 스크립트 개정 (3개)
| 파일 | 개정 요지 |
|---|---|
| `Assets/Scripts/Mechanics/PlayerController.cs` | `m_AttackAction` InputAction 추가 · `attackCooldown`·`attackAudio`·`attackHitbox` Inspector 필드 · `facing` Vector2로 마지막 이동 방향 추적 · Update에서 Attack 입력 → `Schedule<PlayerAttack>` |
| `Assets/Scripts/Mechanics/Health.cs` | `invulnerableDuration` (기본 0.6s) · `invulnerableUntil` float · `IsInvulnerable` 프로퍼티 · `Decrement` 에 i-frame 체크 가드 · `Die` 는 i-frame 우회 (시스템 강제 사망용) |
| `Assets/Scripts/Gameplay/PlayerEnemyCollision.cs` | 기획 04 준수 — "위에서 밟으면 적 피해" 판정 완전 폐기. i-frame 체크 후 `player.health.Decrement()` 호출. HealthIsZero → PlayerDeath 체인은 Health 이벤트 시스템 신뢰 (중복 Schedule 제거) |
### 3-3. Asset 편집 (2개)
| 파일 | 개정 요지 |
|---|---|
| `Assets/Settings/InputSystem_Actions.inputactions` | `Player` 액션맵에 **Attack 버튼 액션 추가** (id `c9d8e7f6-...`). 바인딩: `<Mouse>/leftButton`(Keyboard&Mouse 그룹) + `<Gamepad>/rightTrigger`(Gamepad 그룹) |
| `Assets/Scenes/SampleScene.unity` | Alien 데코 오브젝트 SpriteRenderer `m_Sprite` 교체: `fileID 21300000, guid 443583d5024ec0b46889a8bed11f2d5d` (Mr.Alien) → `fileID 21300020, guid ba86c7b200abe499cb750833482830b3` (PlayerIdle 프레임 10, Player.prefab과 동일 참조) |
### 3-4. 편집 제외 (이유 명시)
- **Player.prefab** (기존 상태 확인 결과 이미 PlayerIdle 스프라이트·Player.controller Animator 사용 중) — 추가 편집 불요
- **Player.controller Animator**`attack` trigger 신규 파라미터 추가는 Unity MCP 또는 Editor GUI 경유가 안전 (Animator Controller의 YAML 직접 편집은 SubStateMachine·Transition Guid 깨짐 리스크). **`PlayerAttack.cs``animator.SetTrigger("attack")` 호출하되 파라미터 부재 시 Unity는 warning만 출력하고 동작에는 영향 없음** — 정적 스프라이트 상태에서는 충분
- **Token 관련·Enemy 스프라이트** — PD 2단계 지시 범위 외 (Phase 3-B narrative-designer 작업)
## 4. YAML 직접 편집으로 해결한 것 vs 해결하지 못한 것
### 4-1. YAML 편집으로 해결 (본 세션 완결)
1. **C# 신규 스크립트 + .meta guid 할당** — Unity Editor 없이 완전 가능
2. **Input Actions JSON 구조 확장** — 기존 필드 보존하며 추가
3. **SampleScene의 SpriteRenderer 참조 교체** — fileID + guid 변경
4. **기존 Player.prefab YAML 구조 실측** — 이미 Player 시리즈 스프라이트 사용 중 확인
### 4-2. Unity Editor 없이는 불가능 (PD 수동 검증 필요)
1. **Play 모드 런타임 검증** — 이동·점프·공격·i-frame 실제 동작, 적 밸런싱
2. **Animator Controller에 `attack` trigger 파라미터 추가** (선택, 정적 스프라이트로는 불요)
3. **AttackHitbox 컴포넌트 Player GameObject에 부착** — PlayerController의 `attackHitbox` 필드는 `Awake`에서 `GetComponent<AttackHitbox>()` 자동 시도하므로, **Player GameObject에 AttackHitbox 컴포넌트를 추가만 하면 자동 연결**. Player.prefab YAML에 컴포넌트 직접 추가도 가능하나 MonoBehaviour script reference guid 관리 복잡도로 Editor GUI 권장
4. **Enemy.prefab에 `Health` 컴포넌트 존재 여부 검증** — 기존 PlayerEnemyCollision 코드가 `enemy.GetComponent<Health>()`를 체크했던 근거로 Enemy에는 Health가 없는 가능성. Enemy 처치를 위해서는 Enemy.prefab에 Health 추가 필요 (Editor GUI)
### 4-3. PD 수동 작업 요청 항목 (최소화)
PD님 Claude Desktop Unity MCP or Editor GUI에서 다음만 수행:
1. **Player GameObject에 `AttackHitbox` 컴포넌트 Add** (필수)
2. **Enemy.prefab에 `Health` 컴포넌트 Add** (적 처치 기능 동작을 위해)
3. **Play 모드 실행 → 검증**:
- 이동·점프 정상 (기존 동작 유지 확인)
- 마우스 좌클릭 시 공격 이벤트 발화 (콘솔 로그 or 적 피해 확인)
- 적 접촉 시 한 번 맞고 i-frame 0.6s 동안 중복 피해 없음
- i-frame 만료 후 다시 피격 시 HealthIsZero → PlayerDeath 체인
4. *(선택)* Animator Controller에 `attack` trigger 파라미터 추가 + 공격 애니메이션 state 구성 (정적 스프라이트 운용 시 불요)
## 5. 검증 한계 + 컴파일 리스크 검토 (C23 정직성)
### 5-1. 본 세션에서 검증한 것
- C# 파일 문법 일관성 (Read로 재확인)
- InputActions JSON 구조 유효성 (Jump 다음 Attack 삽입, Menu 다음 바인딩 추가)
- SampleScene YAML의 Sprite GUID 교체 검증 (grep 결과 `443583d5...` 0건)
### 5-2. 본 세션에서 검증 못 한 것 (PD Editor Play 모드 필수)
- C# 컴파일 성공 여부 (Unity가 빌드 시 확인)
- `PlayerAttack.cs`에서 `player.animator` 접근 — `animator``internal`이나 Platformer.Gameplay·Platformer.Mechanics 모두 같은 Assembly-CSharp 어셈블리에 속하므로 문제 없음 (Unity 기본 어셈블리 구조)
- Runtime 동작 (입력 반응·충돌·i-frame 실효)
### 5-3. 식별된 리스크
| # | 리스크 | 대응 |
|---|---|---|
| 1 | `AttackHitbox` 컴포넌트가 Player에 부착되지 않으면 공격이 시각 효과·판정 없이 무효 | `attackHitbox != null` null-safe 처리. 로그 출력은 하지 않음 (toast 없음) — PD 추가 시 즉시 동작 |
| 2 | Enemy.prefab에 `Health` 부재 시 공격으로 적 처치 불가 | AttackHitbox가 `GetComponent<Health>()` null 체크, 없으면 skip. Enemy 처치 자체는 기획 04 §7 Phase 3-B 튠으로 분리 가능 |
| 3 | Animator `attack` trigger 부재로 warning 로그 출력 | `SetTrigger` 자체는 파라미터 부재 시 no-op. Console에 warning 1회 출력되지만 동작 영향 없음 |
| 4 | PlayerEnemyCollision 개정으로 적이 "위에서 밟기"로는 안 죽음 | 기획 04 §5 의도 — 적 처치는 `PlayerAttack` 경로로 일원화 |
| 5 | Alien 데코의 m_Size·BoxCollider2D 크기가 Mr.Alien 원본 기준 | SampleScene 내 장식 오브젝트라 플레이어 게임플레이에 영향 없음. Phase 3-B narrative-designer가 조선 퇴마 테마로 전면 재디자인 예정 |
## 6. BT5-Dev C안 자동 sync 흐름
본 Agent가 Unity 프로젝트 파일을 직접 편집 완료. Unity Editor 실행 시 다음 흐름으로 BT 레포에 변경이 관찰됨:
1. 개발팀장 Agent → Unity 프로젝트 파일 5종 편집 (본 세션)
2. **PD가 Unity Editor 실행**`Assets/Editor/GitAutoSync/GitAutoSync.cs`가 asset 변경 감지
3. GitAutoSync 자동 commit + push → `origin/main` 반영
4. PM이 `bash scripts/unity_auto_sync.sh push` 수동 호출 또는 다음 세션 SessionStart hook이 pull 동기화
**현 시점**: Unity Editor 미실행 → `E:/EerieVillage/` 로컬은 변경됨, git은 아직 untracked 상태 유지. PD Editor 실행 시 자동 반영.
## 7. 기각안
1. **"Player.prefab YAML에 AttackHitbox 컴포넌트 직접 추가" — 기각.** MonoBehaviour script reference (guid `b2c3d4e5f60718293a4b5c6d7e8f90a1`)를 Prefab YAML에 직접 삽입하면 Unity가 컴파일 후 인식하나, Prefab revision 관리·Inspector 디폴트 값 동기화 리스크. Editor GUI 1클릭이 안전
2. **"Animator Controller YAML에 `attack` trigger + state 직접 추가" — 기각.** Animator Controller의 StateMachine·Transition·Parameter는 fileID 참조가 복잡. 잘못 편집하면 기존 7종 애니메이션 체인 깨짐. 정적 스프라이트 허용 범위에서 불요
3. **"Mr.Alien.png 자산 삭제" — 기각.** 아직 참조 관계 파악 중이며, 다른 Prefab·Scene에서 참조될 가능성. C6 원본 보호 원칙 준수 — 자산 삭제 대신 참조만 교체
4. **"정적 스프라이트 대신 새 공격 애니메이션 생성" — 기각.** 공격 스프라이트 리소스 부재. Phase 3-B 이후 narrative-designer 조선 퇴마 테마 아트 발주 시 일괄 생성
5. **"PlayerEnemyCollision에서 Bounce 남겨두기" — 기각.** "위에서 밟기" 의도와 결합된 로직. i-frame 체계에서는 불필요하고 물리적 예측 불가 거동 유발
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|---|---|---|---|
| 2026-04-23 | v0.1 BT5-Dev 2단계 구현 완료 (Unity MCP 미지원 대응 파일 직접 Edit) | PD 지시 BT5-Dev 2단계 | 개발팀장 |
## 9. 참조 문서
- **선행 분석**: `01_템플릿_구조_분석.md` · `02_스크립트_분석.md` · `03_게임_제작_준비.md`
- **기획**: `프로젝트/EerieVillage/기획/04_전투_기본_스펙.md` (본 2단계 직접 근거)
- **대화로그**: `공유/대화로그/EerieVillage/2026-04-23.md` (본 2단계 엔트리)
- **feedback SOT**: `memory/org/feedback_pm_dev_task_delegation_failure.md` (PM 환경 제약 전가 금지 신설)
- **백업**: `공유/개발팀_백업/EerieVillage/*.bak_20260423_0201.*` (편집 전 5파일)
- **PD 지시 로그**: `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev 행 2단계 완료 갱신

View File

@ -1,215 +0,0 @@
---
type: 밸런스_수치_초안
scope: 전투_기본_수치
author: 밸런스기획자
date: 2026-04-22
version: v0.1 (Phase 3-B 초안)
project: EerieVillage
phase: Phase 3-B
data_source: 04_전투_기본_스펙.md v0.1 + Unity 2D PlatformerMicrogame 기본값 + 코어 룰 7 (라이프 1)
status: 초안 — 개발팀 Unity 실측 검증 필수 (§10 명시)
---
# 01. 전투 기본 수치
## 1. 설계 전제 (P30 재미 정의 선행)
강화 대상 재미: **축 2 액션 플랫포머 손맛** + **축 1 낙차(라이프 1)**.
- 목표 TTK(Time To Kill) 플레이어: **연속 피격 불가 보장** — 라이프 1이므로 TTK 개념 대신 "회피 가능한 타이밍 윈도우 확보"가 핵심.
- 목표 TTK 일반 적: **공격 2~4회 타격으로 처치** (한 방 킬은 박진감, 여러 방은 패턴 학습 보조).
- 보스 TTK 목표: **50~90초** (캐주얼 5~10분 런의 15~20% 시간). 빌드 없는 초반 약 75초, 카드 2~3장 빌드 후 약 50초.
모든 수치는 Unity `Rigidbody2D` + `BoxCollider2D` 기반. `PlatformerMicrogame` 기본값에서 파생하여 EerieVillage 튠 제안.
---
## 2. 이동·점프 수치
### 공식
```
실제 이동 속도(m/s) = MoveSpeed × Time.deltaTime (FixedUpdate)
점프 초속(m/s) = sqrt(2 × |Gravity| × JumpHeight)
공중 수평 제어 = AirControl × MoveSpeed
```
### 수치 테이블
| 파라미터 | 제안 값 | Unity 단위 | 근거 |
|---|---|---|---|
| **MoveSpeed** | 6.0 | m/s | PlatformerMicrogame 기본 5.0 대비 +20%. 모바일 가상 스틱의 좁은 조작 반경을 보정하여 반응성 향상. 과하면 플랫폼 오버슈<EBB284> → 7.0이 상한 |
| **JumpHeight** | 3.5 | m | 화면 대비 플레이어 키를 1.0 기준 시 3.5배 이상은 이동감 충분. 2단 점프 미도입 전제. 2단 점프 도입 시 2.5로 하향 |
| **Gravity Scale** | 3.5 | (배율) | PlatformerMicrogame 기본 3.0 대비 +0.5. 착지 후 "묵직한 손맛" 강화. 과하면 점프 정점이 짧아 조작 스트레스 유발 → 4.0이 상한 |
| **Max Fall Speed** | -20.0 | m/s (음수) | 클리핑 방지 및 낙하 직관성. 무제한 시 빠른 하강으로 플랫폼 착지 난이도 폭등 |
| **Air Control** | 0.7 | (MoveSpeed 배율) | 공중 제어 70%. 조선퇴마 세계관 "무게감" 유지 + 공중 회피 가능성 확보. 1.0은 아이스 미끄럼 없는 완전 제어 — 너무 가볍다 |
| **Coyote Time** | 0.12 s | 초 | 절벽 끝에서 점프 입력 허용 윈도우. 모바일 터치 딜레이 75ms 상정 시 0.10~0.15가 적정. **0.12는 딜레이 보정 주축** |
| **Jump Buffer** | 0.15 s | 초 | 착지 직전 점프 입력 선행 허용. 모바일 터치에서 타이밍 맞추기 어려운 문제 해결. 0.10 미만은 효과 미약, 0.20 이상은 의도치 않은 점프 |
| **Edge Push** | 0.3 m | m | 플랫폼 모서리 0.3m 이내 도달 시 캐릭터를 플랫폼 위로 자동 보정. 모바일에서 엣지 미스 착지 빈도 감소. **근거**: 터치 정밀도 ±5mm → Unity 픽셀 기준 약 0.3m |
### 성장 곡선 — 이동·점프는 고정
이동·점프는 게임 내 **성장 없이 고정**. 카드·특성으로 MoveSpeed 버프 스택 시 최대 150% 상한 (9.0 m/s)을 하드캡으로 설정. 상한 초과 시 플랫폼 충돌 연산 오류 위험.
---
## 3. 공격 수치
### 설계 전제 — 재미 정의
"공격 1회의 손맛" = 타격 직후 히트스탑(2~3프레임)이 있어야 타격감 실재. 히트스탑 없으면 캐주얼 플레이어가 "맞은 건지 모른다" 불만.
### 수치 테이블
| 파라미터 | 제안 값 | 단위 | 근거 |
|---|---|---|---|
| **BaseDamage** (일반 공격) | 20 | HP | 일반 적 HP 60 기준 3타 킬. 2타 킬(40대미지)은 너무 단순, 4타(15대미지)는 단조. 3타가 "리듬 있는 교전" 최소 단위 |
| **AttackRange** | 1.2 m | m (BoxCollider 반경) | 플레이어 캐릭터 가로 0.6m 기준 전방 1.2m. 화면 폭 대비 약 10%. 과하면 보스 패턴 무의미화 |
| **AttackCooldown** | 0.4 s | 초 | DPS = 20 / 0.4 = 50 DPS. 일반 적(HP 60) TTK ≈ 1.2초. 캐주얼 로그라이크 교전 리듬에서 0.3초 미만은 스팸 유도, 0.6초 이상은 답답함 |
| **HitStop** | 3 프레임 | frames (60fps 기준) | 50ms. 히트스탑 2~5프레임이 "타격감 골든 존" (액션 게임 산업 경험치). 너무 길면 입력 딜레이처럼 느껴짐 |
| **AttackBoxOffset** | (0.6, 0) | Vector2 m | 플레이어 중심에서 전방 0.6m 오프셋. 캐릭터 밖 1.2m 범위에서 시작 |
| **KnockbackForce** | 3.0 m/s | m/s (적 기준) | 적 넉백. 너무 강하면 적이 벽에 끼임. 3.0은 교전 거리 유지 + 연속 피격 방지 |
### 대미지 공식
```
FinalDamage = BaseDamage × CardMultiplier × CritMultiplier
CardMultiplier: 카드 스택에 따라 1.0~2.5 범위 (Phase 3-C 카드 설계)
CritMultiplier: 기본 1.0. 크리티컬 미도입 (Phase 3-C 결정 보류)
```
---
## 4. 무적 시간 (i-frame) — 라이프 1 핵심 보호 메커니즘
### 설계 전제 — 재미 정의 (가장 중요)
라이프 1 + i-frame 0 = "거의 모든 전투에서 사망" → **축 2 액션 재미 붕괴**. i-frame은 "회피 숙련도가 생존을 결정"하는 구조의 기반. "적을 어떻게 피하느냐"가 플레이어 스킬의 전부.
i-frame이 너무 짧으면: 다단 히트 공격(적의 연속 스윙) 1회에 즉사 — 캐주얼 포지션 위배.
i-frame이 너무 길면: 적 공격이 무의미화, 긴장감 소실 — 축 1 낙차 무력화.
**목표 체험**: "피격 직후 0.6초 동안 무적이다 — 이 시간 안에 적에게서 벗어나야 한다" 플레이어 인식 형성.
### 수치 테이블
| 파라미터 | 제안 값 | 범위 | 근거 |
|---|---|---|---|
| **IFrameDuration (피격)** | **0.6 s** | 0.3~1.0s | 아래 산출 과정 참고 |
| **IFrameDuration (대시·회피)** | 보류 | — | 회피 메커니즘 미확정 (04_전투 §7) — Phase 3-C |
| **깜박임 시각화 간격** | 0.08 s | 초 | 깜박임 1회 = 0.08s 온/오프. 0.6s÷0.08s ≈ 7.5회 깜박임. 너무 빠르면 번쩍임 불쾌, 너무 느리면 무적 인식 불가 |
#### 0.6초 산출 근거
1. **연속 히트 방지 기준**: 일반 적 AttackCooldown = 0.5s 가정. i-frame ≥ 0.5s면 같은 적의 연타 불가. → 최소 0.5s.
2. **모바일 회피 반응 시간**: 터치 입력 후 캐릭터 이동 반응 75ms + 플레이어 반응 시간 300ms = 375ms. i-frame 0.6s면 피격 후 회피 이동 착수 가능. 0.3s는 너무 촉박.
3. **캐주얼 포지션 고려**: Celeste(스피드런 전문) i-frame 0.3s, Hollow Knight 0.35s — 높은 난이도 기준. 캐주얼 대상 EerieVillage는 0.5~0.8s가 적정.
4. **결론**: 0.6s는 "최소 보호(0.5s) + 모바일 반응 여유(+0.1s)"의 합리적 교점. 테스트 후 ±0.1s 조정 여지.
---
## 5. 적 스탯
### 적 등급 체계
| 등급 | HP | ATK | AttackCooldown | 이동 속도 | 비고 |
|---|---|---|---|---|---|
| **일반 적 (약)** | 40 | 1(즉사) | 1.2 s | 2.0 m/s | 첫 구간 전용. 3~4타 처치 |
| **일반 적 (중)** | 60 | 1(즉사) | 0.9 s | 3.0 m/s | 구간 2 주력 |
| **엘리트** | 120 | 1(즉사) | 0.7 s | 3.5 m/s | 구간 2 후반~보스 전 |
| **보스** | 400 | 1(즉사) | 아래 별도 | 2.5 m/s | 스테이지 보스 |
#### ATK=1(즉사) 설계 근거
라이프 1 구조에서 모든 피격은 즉사. HP를 10이나 20으로 설정하면 "HP가 10인 척 하다가 0 되면 죽는 것"으로 수치만 무의미해짐. 명확성을 위해 **ATK = 플레이어 사망** 단일 의미. 대신 적 HP는 의미 있게 차등.
#### 보스 스탯 상세 (파일럿 기준 보스 1종)
| 파라미터 | 값 | 근거 |
|---|---|---|
| HP | 400 | DPS 50 기준 TTK = 8초 (빌드 없음). 카드 3장 시 배율 ×1.5 가정 → TTK ≈ 5.3초. **목표 50~90초는 빌드 누적 후 기준** — 보스는 Phase 도중 빌드가 3~4개 쌓인 후 만나므로 실질 DPS 75~100 가정 → TTK 60~80초 성립 |
| 공격 패턴 수 | 2~3종 | 구간 1 레벨업 2~3회 완료 후 보스 진입 기준. 패턴 1은 느리고 가독 명확, 패턴 2는 빠르고 좁은 회피 윈도우 |
| 페이즈 전환 | HP 50% | 페이즈 2 진입 시 이동 속도 +0.5, 공격 간격 -0.2s |
---
## 6. 대미지 공식 (전투 핵심)
```
// 플레이어 → 적
EnemyHPResult = EnemyHP - (BaseDamage × CardMultiplier)
// 적 → 플레이어
PlayerResult = DEAD (라이프 1 — 피격 즉사. i-frame 내 피격은 무효)
```
단순성이 설계 의도. 방어 수치(DEF) 미도입 — `DEF/(DEF+200)` 패턴은 Phase 3-C 특성 확장 시 재검토.
---
## 7. 플랫포머 타이밍 윈도우 (모바일 친화)
모바일 터치 평균 입력 지연: 75ms (하드웨어 + OS 스택). PC 기준 수치를 그대로 쓰면 모바일에서 10~20% 타이트하게 느껴짐.
| 윈도우 | 값 | PC 유사 레퍼런스 | 모바일 조정 이유 |
|---|---|---|---|
| **Coyote Time** | 0.12 s | Celeste 0.08s | +50ms 터치 딜레이 보정 |
| **Jump Buffer** | 0.15 s | Celeste 0.10s | +50ms 동일 |
| **Edge Push** | 0.3 m | 미도입 사례 多 | 모바일 터치 정밀도 보정 신규 도입 |
| **최소 공격 판정 유지** | 0.05 s | — | 터치 tap 0.05s 이상 유지로 공격 판정 누락 방지 |
---
## 8. 검증 시나리오
| 시나리오 | 기대 결과 | 검증 방법 |
|---|---|---|
| V-1: 일반 적(중) 1vs1 교전 | 공격 3타(1.2s) 처치, 피격 피하면 생존 | Play 모드 수동 |
| V-2: 피격 직후 연속 히트 | i-frame 0.6s 내 2번째 적 공격 무효 | 로그 확인 |
| V-3: Coyote Time | 절벽 끝에서 0.12s 내 점프 성공 | 터치 입력 0.12s 시뮬 |
| V-4: Jump Buffer | 착지 직전 0.15s 전 입력으로 착지 즉시 점프 | 입력 타임스탬프 확인 |
| V-5: 보스 TTK 상한 | 카드 0장 기준 보스 HP 400 → DPS 50 → 8초 (단순 공격 반복) | 보스 테스트씬 |
| V-6: 모바일 Edge Push | 모바일 터치로 플랫폼 모서리 착지 성공률 >80% | 실기 QA |
---
## 9. 리스크
1. **Coyote Time·Jump Buffer 중첩**: 두 윈도우가 동시 활성 시 의도치 않은 더블 점프처럼 보일 수 있음. 우선순위 명확화 필요 (Jump Buffer > Coyote Time).
2. **i-frame 0.6s + AttackCooldown 0.4s 조합**: 플레이어 공격 쿨다운 0.4s 중 피격 시 i-frame 0.6s → 피격 후 1~2회 공격 가능. 역으로 무적 중 역공 전술 고착화 가능성. Phase 3-C 평가.
3. **보스 HP 400 + 카드 배율 스택**: 카드 5장 이상 누적 시 CardMultiplier 2.5 → DPS 125 → TTK 3.2초. 보스 전투 허무화. **하드캡 DPS 100 (보스 기준 TTK 최저 4초)** 권고.
4. **KnockbackForce 3.0**: 지형에 따라 적이 낙사하여 처치 판정 누락 가능. 낙사 시 처치 처리 명시 필요.
5. **Edge Push 오작동**: 플랫폼 모서리에서 의도치 않게 올라가는 "등반 버그" 유사 현상. 수직 이동 성분 없이 수평 보정만 적용하도록 구현 제한 필요.
---
## 10. 개발팀 실측 검증 필요 항목 (Phase 3-C 이관 목록)
다음 항목은 **Unity 실기 실측 전까지 확정 불가**. 개발팀 엔진 실측 후 수치 재조정 필수.
| 항목 | 이유 | 우선순위 |
|---|---|---|
| MoveSpeed 6.0 → 7.0 범위 최적화 | PlatformerMicrogame 템플릿 물리 설정 의존 | 최우선 |
| Gravity Scale 3.5 | 화면 해상도·카메라 줌 레벨에 따라 체감 완전히 다름 | 최우선 |
| i-frame 0.6s ± 조정 | 적 공격 패턴 구현 후 실체 연타 간격 측정 필요 | 우선 |
| Edge Push 0.3m 범위 | 실제 플랫폼 크기·충돌 레이어 구성 후 결정 | 우선 |
| 보스 HP 400 TTK 검증 | V-5 시나리오 빌드별 수행 | 보스 구현 후 |
| 모바일 Touch Delay 75ms 가정 검증 | 실기기 입력 측정 필요 | 실기 QA 단계 |
---
## 11. 기각안
1. **MoveSpeed 8.0 제안 — 기각.** 과도한 이동 속도는 플랫폼 오버슈트 빈도 증가, 캐주얼 포지션에서 역오히려 불만 유발. 7.0 상한.
2. **GravityScale 5.0 제안 — 기각.** 점프 정점 체공 시간 0.3초 이하로 줄어 공중 회피 불가. 라이프 1 구조에서 치명적 불공정. 4.0 상한.
3. **i-frame 1.0초 제안 — 기각.** 보스 공격 패턴 대부분 무효화. 특히 보스 패턴 2종 이상일 경우 i-frame 체인으로 사실상 무적. 0.8초 상한 검토.
4. **i-frame 0.3초 제안 — 기각.** 04_전투_기본_스펙 기각안 3과 동일 취지. 연속 히트 방지 최소 0.5초 미달.
5. **DEF 스탯 도입 — 기각.** 라이프 1 즉사 구조에서 DEF 수치는 무의미 (죽거나 살거나). 복잡도만 증가. 특성 구현 시 Phase 3-C에서 재검토.
6. **AttackCooldown 0.6초 제안 — 기각.** DPS 33 → 일반 적 TTK 1.8초. 캐주얼 로그라이크에서 1.8초 교전은 단조하고 답답함. 0.5초 상한.
---
## 12. 변경 이력
| 일시 | 변경 | 이전값 | 이후값 | 사유 | 기안 |
|---|---|---|---|---|---|
| 2026-04-22 | v0.1 초안 작성 | — | — | PD 지시 BT6-Plan Phase 3-B | 밸런스기획자 |

View File

@ -1,216 +0,0 @@
---
type: 밸런스_수치_초안
scope: 레벨업_곡선·보상_구조
author: 밸런스기획자
date: 2026-04-22
version: v0.1 (Phase 3-B 초안)
project: EerieVillage
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md + 05_스테이지_구조_초안.md + 코어 룰 7 (레벨·카드 전손) + 9 (특성 영구)
status: 초안 — 스테이지 구간별 적 배치 확정 후 level-designer 교차 검증 필수
---
# 02. 레벨업 곡선
## 1. 설계 전제 (P30 재미 정의 선행)
강화 대상 재미: **축 1 육성 롤러코스터** — "쌓기(카드 픽) → 폭발 → 낙차(전손)" 리듬.
- 목표: **1 스테이지(구간 1+2+3) 내 레벨업 4~6회**. 카드 4~6장 빌드로 보스 도전.
- 5~10분 런 가정 시 레벨업 1회당 50~90초 주기.
- 너무 자주(30초마다): 픽 결정 부담 과다, 흥분 희석. 너무 드물게(3분마다): 육성 재미 실종.
- **구간 1에서 2회 빠르게** 레벨업 → 빌드 시드 형성 → 구간 2에서 2~3회 → 빌드 확장 → 보스 진입.
---
## 2. 경험치 획득량
### 공식
```
RunXP_총합 = Σ(적_처치_XP) + 보스_처치_XP + 이벤트_XP
LevelUpRequired(Lv) = BASE_XP × Lv^EXPONENT (아래 §3 곡선 참조)
```
### 경험치 획득 테이블
| 소스 | 기본 XP | 근거 |
|---|---|---|
| **일반 적 (약)** | 8 XP | 구간 1 약 10마리 처치 → 80 XP. Lv1→2 목표 100 XP. 아이템 등 기타 소스로 잔여 보충 |
| **일반 적 (중)** | 12 XP | 구간 2 주력. 약 8마리 → 96 XP. Lv2→3·3→4 갱신 기여 |
| **엘리트** | 30 XP | 구간 2 후반 2~3기. 처치 시 즉시 레벨업 절반 이상 기여 → "엘리트 잡으면 레벨 쑥 오른다" 보상감 |
| **보스 처치** | 80 XP | 보스 처치 직후 즉시 1레벨업 보장(설계 의도). §4 보상 구조 참조 |
| **이벤트·특수** | 10~20 XP | 숨겨진 방·함정 통과 등. Phase 3-C level-designer 설계 |
---
## 3. 레벨업 요구 경험치 곡선
### 곡선 유형 선택: 수정 선형 복합 곡선
기각안 §8에 이유 명시. **BASE_XP 80, 증가 계수 20 (선형 증가)**로 결정.
```
RequiredXP(Lv → Lv+1) = 80 + (Lv × 20)
```
| 레벨 전환 | 요구 XP | 누적 XP | 설계 의도 |
|---|---|---|---|
| **Lv 1 → 2** | 100 | 100 | 구간 1 약 적 10마리 + α → 빠른 첫 픽 |
| **Lv 2 → 3** | 120 | 220 | 구간 1 후반~구간 2 초입 |
| **Lv 3 → 4** | 140 | 360 | 구간 2 중반 |
| **Lv 4 → 5** | 160 | 520 | 구간 2 후반·엘리트 처치 기여 |
| **Lv 5 → 6** | 180 | 700 | 보스 전 마지막 픽 기회 (보스 XP 80 포함 가능) |
| **Lv 6 → 7** | 200 | 900 | 다음 스테이지 초입 도달 가정 |
| **Lv 7 → 8** | 220 | 1120 | — |
#### 파일럿 3~5 스테이지 레벨 도달 예상
가정: 스테이지당 일반 적 약 15마리(약 7, 중 8), 엘리트 2기, 보스 1기.
XP/스테이지 ≈ (7×8)+(8×12)+(2×30)+80 = 56+96+60+80 = **292 XP**
| 스테이지 종료 후 | 예상 누적 XP | 예상 레벨 | 보유 카드 수 |
|---|---|---|---|
| Stage 1 종료 | ~292 | Lv 3~4 | 3~4장 |
| Stage 2 종료 | ~584 | Lv 5~6 | 5~6장 |
| Stage 3 종료 | ~876 | Lv 6~7 | 6~7장 |
| Stage 4 종료 | ~1168 | Lv 7~8 | 7~8장 |
| Stage 5 종료 | ~1460 | Lv 8~9 | 8~9장 |
**5스테이지 완주 시 카드 8~9장** — 빌드 다양성 충분, 시너지 탐색 여지 확보. 10장 초과 시 관리 복잡도 과다 → **런 내 카드 최대 10장 하드캡** 권고.
---
## 4. 카드 드로우 확률 (레어리티별)
### 설계 전제
03_진행_시스템 §3-3 "초반은 기본 카드, 후반은 고급·레어 카드 확률 상승" 방향 계승.
### 픽 알고리즘
```
레벨업 트리거 시:
1. 현재 레벨에 따라 티어별 가중치 계산
2. 카드 풀에서 가중치 기반 3장 비복원 추출 (중복 방지)
3. 3장 제시 → 1장 선택
```
### 티어별 출현 확률 테이블 (레벨별)
| 레벨 | Common (기본) | Uncommon (고급) | Rare (레어) | Epic (에픽) |
|---|---|---|---|---|
| Lv 1~2 | 70% | 25% | 5% | 0% |
| Lv 3~4 | 50% | 35% | 13% | 2% |
| Lv 5~6 | 30% | 40% | 22% | 8% |
| Lv 7~8 | 15% | 35% | 35% | 15% |
| Lv 9+ | 5% | 25% | 40% | 30% |
#### 확률 설계 근거
- **초반 Common 70%**: 기본 카드로 빌드 방향 탐색. 시너지 태그를 먼저 익히는 학습 단계.
- **Lv 3~4 분기점**: Rare가 13% 등장 → "첫 레어를 얻었다!" 흥분 포인트. 너무 이르면 기대 소진.
- **Lv 5~6 Epic 8%**: 스테이지 2 후반 ~ 3에서 처음 Epic 가능. 각 런의 하이라이트.
- **Lv 9+ 레어+에픽 70%**: 고 스테이지 클리어 시 강한 빌드 구성 가능 → 특성 축적의 보상.
#### 어뷰징 경계 초기 가드
- **동일 카드 3중 픽 방지**: 동일 카드가 3장 추출 풀에 2장 이상 포함되면 1장으로 강제 대체.
- **티어 잠금 최소 기준**: Epic 카드는 Lv 4 미만 절대 등장 금지 (하드코딩). 확률 수치가 0%라도 코드 예외 처리.
- **카드 스택 배율 상한**: 같은 카드 2장 이상 픽 시 배율 상한 × 1.5 → 스팸 배율 무한 증가 방지.
---
## 5. 보상 구조 (보스 처치)
### 보스 처치 시 보상 패키지
보스 처치는 스테이지의 "빌드 검증 이벤트". 보상은 **다음 스테이지 진입 결정**에 영향을 준다.
| 보상 항목 | 값/확률 | 근거 |
|---|---|---|
| **경험치** | 80 XP (고정) | Lv업 요구 XP의 50~80% 수준. "보스 잡으면 거의 레벨업" 보상감. 정확히 1레벨업 보장은 지양 (맥락 박탈) |
| **아이템 드롭** | 1개 (100%) | 항상 파츠 1개 드롭. 교체·포기 선택 압박이 보스 직후 감정 집중. 등급 확률: Common 50% / Uncommon 35% / Rare 15% |
| **특성 언락 재화** | Phase 3-C | 메타 재화 존재 여부 미결 (03_진행_시스템 §5-1 보류). 도입 시 보스 드롭 주 소스 예정 |
| **선택 분기** | 마을 or 다음 스테이지 | 보상 획득 후 의사결정 (코어 룰 5). 보상 자체가 아니라 "다음 선택지를 여는 열쇠" |
### 보상 비율 조정 레버
```
// 스테이지 깊이에 따라 보스 아이템 등급 가중치 상승
StageDepth = 현재 스테이지 번호 (1~5+)
RareWeight = BaseRareWeight + (StageDepth - 1) × 5%
→ Stage 1 보스: Rare 15%, Stage 3 보스: Rare 25%, Stage 5 보스: Rare 35%
```
---
## 6. 어뷰징 경계값 초기 가드 (Phase 3-C 상세 위임)
본 단계에서는 **명백한 어뷰징 패턴**에 대한 1차 가드만 정의. 상세 밸런싱은 Phase 3-C.
| 어뷰징 패턴 | 초기 가드 | Phase 3-C 이관 |
|---|---|---|
| **체력 회복 스팸** | 라이프 1 구조상 회복 없음 (04_전투 §3-1). 회복 아이템 도입 시 1회 제한 쿨다운 60초 기본 가이드 | 회복 아이템 도입 여부 결정 후 |
| **Experience Delay 악용** | 적을 죽이지 않고 대기하여 보스 전 미레벨업 유도 → 보스 처치 XP 80으로 Rare 레벨 진입. 가드: 보스 XP 적용 전 레벨업 차단 (보스 레벨 기준 픽 산정) | XP 처리 순서 코드 레벨 |
| **카드 배율 무한 스택** | 동일 카드 재픽 배율 상한 ×1.5 하드캡 (§4) | 카드 시스템 구현 후 수치 조정 |
| **보스 딜레이 패턴** (보스를 일부러 안 죽이고 구간 2 적 파밍) | 보스 방 진입 후 후방 차단 (05_스테이지 §3-2). 방 밖 파밍 불가 구조 | 맵 구현 후 |
| **엣지 Push 등반 버그** | 수직 성분 없는 수평 보정만 허용 (01_전투 §9 리스크 5) | 개발팀 구현 시 |
---
## 7. 성장 곡선 시각화 (텍스트)
```
누적 XP
1200 | ● (Stage 5 종료)
1000 | ●
800 | ●
600 | ●
400 | ●
200 |●
0 +----+----+----+----+----+----+----+----+----+
S1 S2 S3 S4 S5 (스테이지)
레벨
9 | ●
8 | ●
7 | ●
6 | ●
5 | ●
4 |●(S1 종료 예상)
+----+----+----+----+----
S1 S2 S3 S4 S5
```
선형 증가 구조로 스테이지별 레벨 도달이 예측 가능 → 콘텐츠 설계·적 배치 기준 명확.
---
## 8. 기각안
1. **기하급수 곡선 `RequiredXP = 100 × 1.4^Lv` 제안 — 기각.** Lv 6에서 요구 XP 537. 5~10분 런 내 Lv 5~6 도달이 사실상 불가. 카드 4장 이상 누적이 불가능해져 축 1 육성 재미 붕괴. 기하급수는 장기 RPG에 적합.
2. **순수 선형 `RequiredXP = 100 고정` 제안 — 기각.** 모든 레벨업이 동일 시간 → 긴장감·성취감 없음. 후반 레벨업이 쉬워서 고레벨 카드(Rare·Epic) 도달 너무 빠름 → 초반 Common 카드 의미 약화.
3. **스테이지마다 XP 초기화 — 기각.** 런 내 성장(축 A)의 흐름을 스테이지 경계에서 끊음. 레벨·카드는 다음 스테이지에 **연속 계승**이 03_진행_시스템 설계 의도. 전손은 사망 시에만.
4. **보스 XP 0 (보스는 아이템만 드롭) — 기각.** 보스 처치 후 즉각 보상감이 없어 클라이맥스 감정 약화. XP 80으로 "보스 잡으면 거의 레벨업" 피드백 유지.
5. **Epic 카드 Lv 3 등장 허용 — 기각.** 초회차 첫 스테이지에서 Epic 빌드 완성 가능 → 게임 난이도 즉시 붕괴. Lv 4+ 하드캡 유지.
6. **드로우 3픽 → 2픽 제안 — 기각.** 03_진행_시스템 기각안 4와 동일 근거. 선택 긴장·시너지 탐색 최소 임계는 3장.
---
## 9. 개발팀·level-designer 교차 검증 필요 (Phase 3-C 이관)
| 항목 | 이유 | 의존 주체 |
|---|---|---|
| 스테이지당 적 수 실측 | 예상 XP/스테이지 292는 적 15마리 가정 — 실제 배치 확정 후 재산출 | level-designer |
| 카드 풀 규모 확정 | 비복원 3장 추출 시 풀이 10장 미만이면 중복 불가 가드 충돌 | system-designer |
| 레어리티 수 확정 | Epic 미도입 시 Rare 40%로 병합 필요 | system-designer |
| XP 처리 순서 (보스 XP + 레벨업 판정) | 어뷰징 가드 §6과 코드 레벨 정합 | 개발팀 |
| 카드 최대 10장 하드캡 UI | 10장 초과 픽 시 교체 or 포기 선택 UX 필요 | ux-designer |
---
## 10. 변경 이력
| 일시 | 변경 | 이전값 | 이후값 | 사유 | 기안 |
|---|---|---|---|---|---|
| 2026-04-22 | v0.1 초안 작성 | — | — | PD 지시 BT6-Plan Phase 3-B | 밸런스기획자 |

View File

@ -1,166 +0,0 @@
---
type: 컨텐츠_설계
scope: 스킬_카드_풀
author: 컨텐츠_기획팀장
date: 2026-04-22
version: v0.1 (Phase 3-B 파일럿)
project: EerieVillage
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md (3축 구조) · 04_전투_기본_스펙.md · PD 코어 룰 6
status: 예시 셋 — 수치·확률은 balance-designer 이관 · 세계관 톤은 narrative-designer 확정 예정
---
# 01. 스킬 카드 풀
## 1. 재미 축 연결
- **축 1 (육성 롤러코스터)**: 카드 풀이 다양할수록 런마다 빌드가 달라지고 "쌓는 재미" 변주 가능
- 모든 카드는 "왜 이 카드를 픽하고 싶은가"에 답할 수 있어야 한다 (P30)
- 명확한 상위호환 금지 — 상황·빌드 방향에 따라 선택지가 유의미하게 달라야 한다
---
## 2. 카드 체계 개요
### 2-1. 티어 정의
| 티어 | 레이블 | 출현 타이밍 | 성격 |
|------|--------|-----------|------|
| **1티어 (기본)** | 보통 | 초반 레벨업 가중 | 단일 효과, 조합 진입점 |
| **2티어 (상급)** | 귀 | 중반 이후 출현 증가 | 복합 효과, 시너지 촉매 |
| **3티어 (희귀)** | 신 | 후반 레어 출현 | 빌드 완성자, 강력한 단일 효과 |
### 2-2. 태그 체계 (시너지 기준 축)
| 태그 | 의미 |
|------|------|
| `[공격]` | 기본 공격 강화 계열 |
| `[부적]` | 부적·주문 계열 (시전 효과) |
| `[주술]` | 지속 시간 효과·DoT 계열 |
| `[소환]` | 소환물·분신 계열 |
| `[방호]` | 피해 감소·실드·회피 계열 |
| `[속도]` | 이동·공격 속도 계열 |
| `[회복]` | 실드 회복·생존 연장 계열 |
| `[폭발]` | 범위·연쇄 계열 |
---
## 3. 카드 풀 예시 (32장)
> **수치 표기 원칙**: "대미지 증가", "속도 상승" 등 방향성만 기재. 구체 수치는 balance-designer 이관.
### [공격 강화] 카테고리 — 기본 공격을 핵심으로 성장시키는 빌드 축
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 01 | **봉황격(鳳凰擊)** | 1 | `[공격]` | 기본 공격 대미지 증가 | `[공격]` 카드 2장 이상 시 추가 효과 |
| 02 | **천둥발(天動撥)** | 1 | `[공격]` | 공격 판정 범위 확대 | `[폭발]` 태그와 연계 시 파편 발생 |
| 03 | **일격필살(一擊必殺)** | 2 | `[공격]` | 공격 적중 시 일정 확률로 2배 대미지 | `[속도]` 태그와 연계 시 발동률 상승 |
| 04 | **학익진(鶴翼陣)** | 2 | `[공격]` `[폭발]` | 공격 시 좌우 부채꼴 범위 추가 판정 | `[부적]` 태그 보유 시 넓어짐 |
| 05 | **천지신명(天地神明)** | 3 | `[공격]` `[폭발]` | 공격마다 지면에 충격파 발생 | 단독 채용 시에도 강력한 완성자 |
### [부적] 카테고리 — 시전형 단발 효과. 런 내 "한 방" 카드군
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 06 | **진언부(眞言符)** | 1 | `[부적]` | 전방에 부적 투척, 접촉 몬스터 피해 | `[부적]` 3장 이상 시 관통 판정 |
| 07 | **화염부(火焰符)** | 1 | `[부적]` `[주술]` | 부적 적중 시 화염 DoT 부여 | `[주술]` 태그 강화 시 지속 시간 연장 |
| 08 | **봉인부(封印符)** | 2 | `[부적]` | 적중 몬스터 일정 시간 행동 정지 | `[소환]` 카드와 조합 시 처치 보너스 |
| 09 | **뇌격부(雷擊符)** | 2 | `[부적]` `[폭발]` | 투척 부적이 연쇄 번개로 근접 적 피해 | 밀집 구간 필살기 역할 |
| 10 | **천부경문(天符經文)** | 3 | `[부적]` | 화면 전체 부적 전개, 전 적 피해 | 런 마무리 구간 단독 완성자 |
### [주술] 카테고리 — 지속 효과·DoT로 "시간이 지날수록 강해지는" 빌드 축
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 11 | **독안개(毒霧)** | 1 | `[주술]` | 이동 경로에 독 안개 잔존, 접촉 적 DoT | `[주술]` 카드 중복 시 효과 중첩 |
| 12 | **혼백박멸(魂魄薄滅)** | 2 | `[주술]` | 주기적으로 주변에 약화 오라 발생 | `[소환]` 태그와 연계 시 소환물도 약화 부여 |
| 13 | **저주문(詛呪文)** | 2 | `[주술]` `[부적]` | 공격 적중 적에게 저주 스택 부여, N스택 시 폭발 | `[공격]` 태그로 스택 가속 |
| 14 | **사령결계(死靈結界)** | 3 | `[주술]` | 발동 시 범위 내 전 적에게 대형 DoT 적용 | `[주술]` 빌드의 최종 완성자 |
### [소환] 카테고리 — 분신·소환물로 "나를 도와주는 동료" 재미 축
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 15 | **허수아비(藁人形)** | 1 | `[소환]` | 이동 경로에 허수아비 설치, 적 어그로 유도 | `[방호]` 태그와 연계 시 내구도 강화 |
| 16 | **분신술(分身術)** | 2 | `[소환]` `[공격]` | 분신 1기 소환, 기본 공격 동시 수행 | `[공격]` 카드 적용 범위 공유 |
| 17 | **도깨비불소환** | 2 | `[소환]` `[주술]` | 도깨비불 2기 소환, 랜덤 적 추적 및 DoT | `[주술]` 빌드의 활성화 트리거 역할 |
| 18 | **산신령강림(山神靈降臨)** | 3 | `[소환]` | 강력 소환물 1기 등장, 자동 공격·높은 내구도 | 소환 빌드 최종 완성자 |
### [방호] 카테고리 — 라이프 1 전제에서의 "실질적 생존 연장" 수단
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 19 | **호신부(護身符)** | 1 | `[방호]` | 피격 전 1회 흡수 실드 생성 (N초 쿨타임) | 단독 채용 시도 고생존 기여 |
| 20 | **부적방패(符籍防牌)** | 1 | `[방호]` `[부적]` | 부적 투척 후 일정 시간 회피율 상승 | `[부적]` 빌드의 부산물 생존력 |
| 21 | **무영보(無影步)** | 2 | `[방호]` `[속도]` | 짧은 순간 무적 대시 추가 | `[속도]` 태그 보유 시 거리 증가 |
| 22 | **결계장벽(結界障壁)** | 2 | `[방호]` | 발동 시 전방 고정 실드 설치 | `[소환]` 태그와 조합 시 소환물 뒤 자동 배치 |
| 23 | **천지음양방호(天地陰陽)** | 3 | `[방호]` | 일정 시간 완전 무적 + 무적 해제 시 반경 폭발 | 단독 완성자, 위기 탈출기 |
### [속도] 카테고리 — "빠르게 치고 빠지는" 게릴라 빌드 축
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 24 | **쾌보술(快步術)** | 1 | `[속도]` | 이동 속도 상승 | `[속도]` 3장 이상 시 점프력 추가 상승 |
| 25 | **연속타(連續打)** | 2 | `[속도]` `[공격]` | 공격 속도 상승 + 연타 효과 | `[공격]` 태그와 연계 시 연타 횟수 증가 |
| 26 | **귀신발걸음(鬼步)** | 2 | `[속도]` | 일정 시간 극속 이동, 적 통과 판정 | `[주술]` 태그와 연계 시 이동 경로에 DoT 잔존 |
### [회복] 카테고리 — 실드·생존 연장 수단 (라이프 1 전제에서 "버티기" 옵션)
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 27 | **단전수련(丹田修練)** | 1 | `[회복]` | 적 처치 시 소량 실드 회복 | 처치 수가 많은 플레이 스타일에 효과 극대 |
| 28 | **부적치유(符籍治癒)** | 2 | `[회복]` `[부적]` | 부적 적중 처치 시 실드 대량 회복 | `[부적]` 빌드의 생존 보장 |
| 29 | **감로수(甘露水)** | 2 | `[회복]` | 일정 시간마다 실드 자동 재생 | `[방호]` 태그와 조합 시 실드 상한 상승 |
### [특수] 카테고리 — 빌드 방향 전환자·고위험 고보상 카드
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 30 | **역천지기(逆天之氣)** | 3 | `[공격]` `[폭발]` | 이번 런 처음 10회 공격에 한해 3배 대미지, 이후 공격력 일시 감소 | 초반 스파이크 전략용 |
| 31 | **귀문관(鬼門關)** | 3 | `[주술]` `[소환]` | 사방에 문 설치, 30초간 문 통과 몬스터에 즉사 판정 (보스 제외) | 소환·주술 복합 빌드 완성자 |
| 32 | **천지개벽(天地開闢)** | 3 | `[공격]` `[폭발]` `[주술]` | 발동 시 전 화면 공격 + 모든 DoT 즉시 폭발 | 전 태그 연계 최종 파이널 카드 |
---
## 4. 시너지 조합 예시
> 상세 조합 규칙·발동 조건은 system-designer 이관. 아래는 "플레이어가 느끼는 방향성" 기준 예시.
| 빌드명 | 핵심 카드 | 컨셉 |
|--------|-----------|------|
| **부적 스패머** | 진언부·화염부·부적방패·부적치유 | 부적을 쏟아부으며 생존까지 해결 |
| **주술 소각** | 독안개·저주문·사령결계 | 모든 적에게 DoT 누적 후 폭발 |
| **분신 군주** | 분신술·도깨비불소환·산신령강림 | 소환물로 화면을 점령 |
| **속도 게릴라** | 쾌보술·연속타·귀신발걸음 | 빠르게 치고 빠지는 히트앤런 |
| **천부경 오버로드** | 천부경문·천지개벽·역천지기 | 3티어 중심 고위험 고보상 |
---
## 5. 기각안
1. **"카드별 쿨타임 부여" — 기각.** 로그라이크 카드는 "장착 후 패시브·능동 발동" 구분이 필요하나, 쿨타임 UI는 모바일 기준 인지 부담 과대. 패시브 위주로 설계하고 능동 카드는 별도 슬롯 구조로 격리 검토 → system-designer 이관.
2. **"카드 50장 이상 초기 풀" — 기각.** 파일럿에서 과도한 풀은 팀 개발 부하·QA 비용 폭증. MVP 30~35장으로 시작, 업데이트 확장 구조 채택. 단 확장 용이하도록 태그 체계를 미리 확정.
3. **"동일 카드 중복 픽 시 즉시 2배 효과" — 기각.** 밸런스 붕괴 위험. 동일 카드 재픽은 "레벨 업" 형태로 처리(상세는 Phase 3-B system-designer 결정). 즉시 2배는 단일 카드 과의존 빌드 고착화 원인.
4. **"카드 판매·재료화 메카닉" — 기각.** 파츠 교체식(코어 룰 8)과 역할 혼선. 카드는 "픽 or 포기" 이분법 유지. 재화 연동은 Phase 3-C BM 설계에서 별도 검토.
---
## 6. balance-designer 이관 항목
- 티어별 출현 가중치 수치 (레벨 구간별 확률 테이블)
- 카드별 효과 수치 (대미지 배율·지속 시간·쿨타임·스택 한도)
- 시너지 트리거 조건 (태그 N장 이상 임계)
- 3티어 카드 출현 구간 제한 설계
## 7. narrative-designer 이관 항목
- 카드 네이밍 최종 확정 (조선 퇴마 세계관 고증 · 한자 표기 통일)
- 카드 플레이버 텍스트 (짧은 설명 1~2줄, 세계관 맥락)
- "진언·경문·부적·주술" 용어 계보 정리
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 파일럿 예시 셋 32장 작성 | PD 지시 BT6-Plan Phase 3-B | 컨텐츠 기획팀장 |

View File

@ -1,150 +0,0 @@
---
type: 컨텐츠_설계
scope: 아이템_파츠
author: 컨텐츠_기획팀장
date: 2026-04-22
version: v0.1 (Phase 3-B 파일럿)
project: EerieVillage
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md §4 (축 B) · PD 코어 룰 8
status: 파츠 구조 확정 + 아이템 예시 — 수치는 balance-designer 이관 · UX 플로우는 ux-designer 연계
---
# 02. 아이템 파츠
## 1. 재미 축 연결
- **축 B (준영속 기반)**: 아이템은 사망 후에도 유지되어 "잃었지만 남은 것이 있다"는 감정의 안전판
- 파츠별 1개 제한(코어 룰 8)이 선택 압박을 만들고, 교체 결정이 런마다 다른 도박을 형성
- "교체할 것인가 지킬 것인가"가 이 시스템의 핵심 재미 — 교체 부담 없이 선택이 가벼워야 한다
---
## 2. 파츠 종류 확정 (5종)
> **확정 근거**: 조선 퇴마사 세계관 + 횡스크롤 플랫포머 조작 요소와 연결되는 5종으로 선별.
> 파츠가 5종이면 슬롯이 충분히 다양하면서도 UI 인지 부담이 낮다.
| 파츠 슬롯 | 이름 | 스텟 방향성 | 세계관 연결 |
|-----------|------|-----------|------------|
| **무기** | 무기 (武器) | 공격력·공격 속도·판정 범위 계열 | 도검·불로초 채찍·포박줄 등 퇴마 도구 |
| **방어** | 의복 (衣服) | 실드량·실드 재생·피격 쿨타임 계열 | 법복·도포·갑주 등 조선 복식 |
| **발** | 발걸음 (足) | 이동 속도·점프력·대시 거리 계열 | 짚신·목화·신기 (神器) 신발 |
| **부적** | 호신 부적 (護身符) | 부적 계열 카드 강화·쿨타임 단축 계열 | 각종 부적·경문 두루마리 |
| **보조** | 패물 (佩物) | 처치 효과·드롭율·특수 발동 계열 | 노리개·옥패·호신패 등 장신구 |
---
## 3. 파츠별 아이템 예시
### 3-1. 무기 (武器) — 공격 방향성을 결정하는 핵심 파츠
| 아이템 이름 | 스텟 방향성 | 특성 | 드롭 출처 |
|------------|-----------|------|----------|
| **도강검(渡江劍)** | 공격력 소폭 상승 | 기본 공격 수평 사거리 증가 | 일반 전투 드롭 (초반) |
| **신묘쌍도(神妙雙刀)** | 공격 속도 상승 | 연속 2타 판정 | 중간 보스 드롭 |
| **법장지팡이(法杖)** | 원거리 공격 추가 | 기본 공격에 소형 투사체 추가 | 상인 구매 또는 엘리트 전투 |
| **뇌성포박(雷聲捕縛)** | 공격력 대폭 상승 | 적중 시 일정 확률 기절 | 후반 보스 드롭 |
| **저승낫(彼岸鎌)** | 공격력 중간 상승 | 처치 시 소량 실드 회복 | 중후반 전투 드롭 |
### 3-2. 의복 (衣服) — 라이프 1 환경에서의 생존 기반
| 아이템 이름 | 스텟 방향성 | 특성 | 드롭 출처 |
|------------|-----------|------|----------|
| **무복(武服)** | 실드 상한 소폭 상승 | 기본 실드 시작값 제공 | 일반 전투 드롭 (초반) |
| **도포(道袍)** | 실드 재생 속도 상승 | 적 미접촉 시간 경과마다 실드 회복 | 상인 구매 또는 전투 드롭 |
| **철갑도포(鐵甲道袍)** | 실드 상한 대폭 상승 | 첫 피격 시 완전 실드 흡수 | 중간 보스 드롭 |
| **법의(法衣)** | 실드 상한 중간 상승 | 부적 계열 카드 효과 적용 시 실드 소량 회복 | 후반 상인 또는 보스 드롭 |
### 3-3. 발걸음 (足) — 조작감·기동성 직결 파츠
| 아이템 이름 | 스텟 방향성 | 특성 | 드롭 출처 |
|------------|-----------|------|----------|
| **짚신(草鞋)** | 이동 속도 소폭 상승 | 기본 제공 — 런 시작 시 착용 상태 | 기본 장착 (교체 가능) |
| **목화신(木靴)** | 점프력 상승 | 이단 점프 가능 | 중반 전투 드롭 또는 상인 |
| **비행신발(飛行靴)** | 이동·점프 동시 상승 | 점프 후 짧은 활공 가능 | 중간 보스 드롭 |
| **귀신발(鬼神足)** | 이동 속도 대폭 상승 | 이동 중 적 통과 가능 (공격은 불가) | 후반 보스 드롭 |
### 3-4. 호신 부적 (護身符) — `[부적]` 카드 시너지 증폭 전용 파츠
| 아이템 이름 | 스텟 방향성 | 특성 | 드롭 출처 |
|------------|-----------|------|----------|
| **벽사부(辟邪符)** | 부적 카드 쿨타임 단축 | 부적 태그 카드 효과 발동률 상승 | 일반 전투 드롭 |
| **사귀봉인부(邪鬼封印符)** | 부적 대미지 상승 | 적 적중 후 DoT 지속 시간 연장 | 상인 구매 |
| **오방신장부(五方神將符)** | 부적 광역 범위 확대 | 부적 투척 시 파편 2개 추가 생성 | 보스 드롭 |
### 3-5. 패물 (佩物) — 처치·드롭·특수 트리거 계열
| 아이템 이름 | 스텟 방향성 | 특성 | 드롭 출처 |
|------------|-----------|------|----------|
| **행운패(幸運牌)** | 아이템 드롭률 상승 | 처치 시 소량 확률로 추가 아이템 드롭 | 상인 구매 (초반 가성비) |
| **옥노리개(玉佩)** | 처치 시 소량 경험치 추가 | 레벨업 주기 소폭 단축 | 일반 전투 드롭 |
| **저승패(冥界牌)** | 특수 효과 발동 확률 상승 | 연속 처치 N개 시 단기 무적 발동 | 중간 보스 드롭 |
| **호랑이발톱(虎爪)** | 처치 시 폭발 범위 추가 | 처치 시 소폭 범위 폭발 발생 | 엘리트 전투 드롭 |
---
## 4. 교체식 UX 플로우 (요약)
> **상세 UI 레이아웃 및 플로우 구현은 ux-designer 이관**.
### 4-1. 드롭 발생 → 교체 결정 흐름
```
전투 중 아이템 드롭 발생
[아이템 팝업 표시]
- 신규 아이템 정보 (이름·파츠 슬롯·스텟 방향성 요약)
- 현재 장착 아이템 정보 (비교 표시)
플레이어 선택 (3초 자동 닫힘 또는 명시 선택)
├── [교체] → 신규 아이템 장착, 기존 아이템 소멸
└── [포기] → 신규 아이템 버리기, 현재 유지
```
### 4-2. 설계 원칙
- **교체 비용 없음**: 골드·재화 소모 없이 즉시 교체 (코어 룰 8)
- **비교 표시 의무**: 교체 판단에 필요한 정보를 한 화면에서 볼 수 있어야 한다 (ux-designer 연계)
- **"교체 후 후회" 방지**: 포기한 아이템은 같은 런 내 재획득 불가 → 결정의 무게 부여
- **사망 후 유지**: 장착 아이템은 메타 레이어에서 지속 (코어 룰 8) → 플레이어가 아이템 조합 전략을 런을 넘어 구축 가능
### 4-3. 드롭 출처 요약
| 출처 | 드롭 경향 |
|------|----------|
| **일반 전투** | 1·기본 등급 아이템 위주 (초반·중반 진입) |
| **엘리트 전투** | 중간 등급 아이템 (중반) |
| **중간 보스** | 중간~상위 아이템 (파츠 다양성 확보 타이밍) |
| **최종 보스** | 상위 희귀 아이템 (런 이후에도 영향 지속) |
| **상인(마을)** | 선택 구매 — 원하는 파츠 타겟 가능 (경제 요소) |
---
## 5. 기각안
1. **"파츠별 복수 슬롯 (무기 2개 장착)" — 기각.** 코어 룰 8 "파츠별 1개" 고수. 슬롯 팽창은 교체 결정의 긴장감을 희석하고 인벤토리 관리 부담을 과도하게 높인다.
2. **"아이템 분해·합성 시스템" — 기각.** 파일럿 스코프 초과. 기본 교체식 UX가 먼저 작동해야 합성 레이어가 의미 있다. Phase 3-C BM 설계에서 별도 재검토.
3. **"파츠 6종 (머리 추가)" — 검토 후 기각.** 5종으로 조선 퇴마사 복식 컨셉 커버 가능. 머리 슬롯은 세계관상 관모·상투 등으로 표현 가능하나 스텟 축이 기존 5종과 중첩 위험. narrative-designer가 세계관 확정 후 재검토 가능.
4. **"파츠 3종 미니멀" — 기각.** 3종은 선택 다양성 부족. "어떤 파츠를 먼저 찾을 것인가"라는 전략적 사고가 5종 이상에서 성립한다.
---
## 6. ux-designer 이관 항목
- 드롭 팝업 UI 레이아웃 (비교 표시 방식·버튼 배치·모바일 터치 UE)
- 교체 확인 인터랙션 (실수 교체 방지 장치)
- 파츠 슬롯 인벤토리 화면 (런 내 확인 방법)
- 자동 닫힘 타이머 UX (전투 중 방해 최소화)
## 7. balance-designer 이관 항목
- 파츠별 스텟 수치 (실드 상한·이동 속도 배율·대미지 증가량 등)
- 아이템 등급 체계 및 드롭 테이블 가중치
- 사망 후 유지 아이템의 메타 레이어 밸런스 (런 간 누적 강도 상한)
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 파츠 5종 확정 + 아이템 21종 예시 | PD 지시 BT6-Plan Phase 3-B | 컨텐츠 기획팀장 |

View File

@ -1,97 +0,0 @@
---
type: 컨텐츠_설계
scope: 특성_예시
author: 컨텐츠_기획팀장
date: 2026-04-22
version: v0.1 (Phase 3-B 파일럿)
project: EerieVillage
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md §5 (축 C) · PD 코어 룰 9
status: 예시 15종 — 획득 조건 옵션은 system-designer 확정 · 수치는 balance-designer 이관
---
# 03. 특성 예시
## 1. 재미 축 연결
- **축 3 (영속 성장의 위안)**: 특성은 죽음 이후에도 남아 "이번 런은 실패했지만 퇴마사는 성장했다"는 감정 제공
- 특성 효과는 **카드·아이템보다 절제**되어야 한다 — 특성으로 게임이 쉬워지는 것이 아니라 "도전의 범위가 넓어지는" 방향
- 각 특성은 플레이어가 지향하는 빌드 방향을 강화하거나, 새 플레이 스타일을 열어주는 역할
---
## 2. 축 분류 기준
| 축 | 레이블 | 설명 |
|----|--------|------|
| **수련 (修練)** | 기초 강화 | 공격·생존·이동의 기본값을 미미하게 상승. 하한선 상승용 |
| **계보 (系譜)** | 빌드 확장 | 특정 카드 태그·아이템 파츠와 시너지. 빌드 방향성을 강화 |
| **도전 (挑戰)** | 도전 확장 | 새로운 게임플레이 옵션 해금. 더 깊은 스테이지·변형 챌린지 진입 |
---
## 3. 특성 예시 (15종)
> **수치 표기 원칙**: 방향성만 기재. 구체 수치(배율·고정값)는 balance-designer 이관.
> **획득 조건 "옵션 A/B"**: 복수 방식은 system-designer가 결정. 현재는 방향 제시만.
| # | 특성 이름 | 효과 요지 | 축 분류 | 획득 조건 (옵션) |
|---|-----------|-----------|---------|----------------|
| 01 | **초심자의 수련 (初心修練)** | 런 시작 시 실드 소량 지급 | 수련 | A: 메타 재화 소비 / B: 첫 보스 처치 후 자동 |
| 02 | **퇴마사의 발 (退魔足)** | 기본 이동 속도 소폭 영구 상승 | 수련 | A: 메타 재화 소비 / B: 누적 N번 사망 후 해금 |
| 03 | **부적의 인연 (符籍因緣)** | `[부적]` 태그 카드 등장 확률 소폭 상승 | 계보 | A: 부적 카드로 보스 처치 N회 달성 / B: 메타 재화 소비 |
| 04 | **주술사의 혈맥 (呪術血脈)** | `[주술]` 태그 카드 효과 지속 시간 소폭 연장 | 계보 | A: 주술 DoT로 적 처치 누적 N회 / B: 메타 재화 소비 |
| 05 | **소환의 계보 (召喚系譜)** | 소환물 최대 수 +1 (기본 한도 초과) | 계보 | A: 소환 빌드로 보스 클리어 N회 달성 / B: 메타 재화 소비 |
| 06 | **이단공격 (二段攻擊)** | 기본 공격 연타 횟수 +1 | 수련 | A: 총 처치 수 N 달성 (업적 계열) |
| 07 | **귀신사냥꾼 (鬼獵者)** | 보스 피해량 소폭 상승 | 수련 | A: 보스 N회 처치 누적 / B: 특정 보스 첫 처치 후 해금 |
| 08 | **낙인 (烙印)** | DoT를 받는 적이 받는 피해 소폭 증가 (디버프 연계) | 계보 | A: `[주술]` 빌드로 스테이지 N 클리어 |
| 09 | **무쇠 의지 (鐵意志)** | 실드 교체 후 짧은 무적 시간 추가 | 수련 | A: 실드 N회 소진 후 생존 누적 달성 |
| 10 | **신령의 가호 (神靈加護)** | `[소환]` 카드 보유 시 런 시작 허수아비 1개 자동 설치 | 계보 | A: 소환 빌드로 보스 처치 N회 / B: 메타 재화 소비 |
| 11 | **퇴마사의 계보 (退魔系譜)** | 런 첫 번째 카드 픽 시 3티어 카드 출현 확률 소폭 상승 | 계보 | A: N회 런 클리어 달성 |
| 12 | **깊은 고을 도전 (深淵挑戰)** | 스테이지 N 이후 몬스터 처치 경험치 보너스 | 도전 | A: 최초로 스테이지 N 진입 시 자동 해금 |
| 13 | **변형 고을 해금 (變形挑戰)** | 특정 변형 챌린지 모드 진입 허용 | 도전 | A: 기존 스테이지 N 클리어 후 자동 해금 |
| 14 | **망자의 교훈 (亡者敎訓)** | 사망 직후 다음 런 첫 레벨업에서 카드 1장 추가 제시 (4픽) | 수련 | A: 누적 N번 사망 기록 후 해금 (역설적 보상) |
| 15 | **천지인 합일 (天地人合一)** | `[공격]`, `[부적]`, `[주술]` 태그 카드를 각 1장 이상 보유 시 전 효과 소폭 증폭 | 계보 | A: 3종 태그 보유 빌드로 보스 클리어 N회 달성 |
---
## 4. 설계 원칙 메모 (P30 판단)
- **수련 축은 "하한선 상승"이지 "쉬워지기"가 아니다.** 특성 없이도 게임이 가능해야 하고, 특성이 있으면 "조금 더 안정적으로 시작"하는 정도. 재미 축 1(낙차)이 특성에 의해 무력화되어선 안 된다.
- **계보 축은 "빌드 방향 투자"다.** 플레이어가 특정 전략을 반복하면 해당 전략이 더 잘 작동하게 된다. 다양한 빌드가 모두 고유한 계보 특성을 가지도록 설계.
- **도전 축은 "콘텐츠 확장"이다.** 새 챌린지·스테이지 해금은 플레이어가 "다음에 해볼 것이 생긴다"는 지속 동기를 형성.
- **"망자의 교훈"(#14)은 P30의 "역설적 재미" 실험**: 죽을수록 다음 런이 더 흥미로워진다는 발상. 죽음을 "실패"에서 "성장의 재료"로 리프레이밍.
---
## 5. 기각안
1. **"단점 있는 특성 (리스크 특성)" — 검토 후 보류.** 예: "모든 카드 1티어 고정, 대신 아이템 드롭 2배" 같은 트레이드오프 특성. 시스템 복잡도 상승과 플레이어 기대 위반 리스크 있음. 파일럿에서는 단방향 강화 특성으로 시작하고, Phase 3-C 재검토 시 도입 여부 결정.
2. **"특성 계열 제한 (한 특성 최대 N개)" — 기각.** 특성은 영속 메타 레이어로 누적이 동기. 제한을 두면 영속 성장의 위안(재미 축 3) 약화. 밸런스는 각 특성 효과량 절제로 해결.
3. **"특성 초기화 기능" — 기각.** 코어 룰 9 "영구 유지" 고수. 초기화 옵션은 영속성을 훼손하고 "어느 특성을 버릴 것인가"는 이 게임의 설계 방향 외.
4. **"특성 20종 이상 초기 설계" — 규모 조정.** 15종으로 시작하여 런 10회 이내에 전체 특성 해금 가능하도록 조율. 특성 종류가 너무 많으면 해금 동기 희석. 업데이트 확장 구조 채택.
---
## 6. system-designer 이관 항목
- 특성 획득 조건 최종 확정 (메타 재화 vs 업적 vs 자동 해금 중 선택)
- 특성 간 배타·계열·전제 조건 여부 (예: 특성 A 해금 후 특성 B 가용)
- 특성 선택 UI (자동 적용 vs 선택형 해금 인터페이스)
## 7. balance-designer 이관 항목
- 특성별 효과 수치 (이동 속도 배율·DoT 지속 시간 연장 초 등)
- 특성 누적 시 상한선 설계 (카드·아이템 효과를 압도하지 않는 범위)
- 메타 재화 비용 산정 (획득 조건 A 채택 시)
## 8. narrative-designer 이관 항목
- 특성 이름 고증 및 플레이버 텍스트 (조선 퇴마사 수련·계보 테마 세계관 연결)
- "망자의 교훈", "천지인 합일" 등 세계관 용어 위계 정리
## 9. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 파일럿 예시 15종 작성 | PD 지시 BT6-Plan Phase 3-B | 컨텐츠 기획팀장 |

View File

@ -1,188 +0,0 @@
---
type: 레벨_설계
scope: 스테이지_구조
author: 레벨 기획자
date: 2026-04-22
version: v0.1 (파일럿)
project: EerieVillage
phase: Phase 3-B
data_source: 05_스테이지_구조_초안.md·02_코어_루프.md·01_게임_컨셉.md·04_전투_기본_스펙.md (BT5 계승)
status: 레벨 설계 초안 — 수치·적 스펙은 balance-designer 이관
---
# 01. 스테이지 구조
## 1. 레벨 목표
**"조선 귀신을 물리치며 점점 깊은 곳으로 파고드는 퇴마사의 여정 — 한 런에 5~10분, 반복할수록 더 멀리 닿는 구조."**
## 2. 스테이지 구성 — 파일럿 5종
마을(허브) 기준 5개 스테이지. 각 스테이지는 독립 테마를 가지며 선형 진행(스테이지 1 → 2 → 3 → 4 → 5)한다. 보스 처치 후 마을 복귀 or 다음 스테이지 분기(02_코어_루프 §5-3 계승).
| # | 스테이지명 | 배경 테마 | 난이도 단계 | 주요 적 유형 |
|---|-----------|----------|------------|------------|
| 1 | **황혼 고을 어귀** | 조선 마을 외곽 — 해질녘 | 입문 | 소형 잡귀 (빠른 근접) |
| 2 | **버려진 산사** | 고지대 폐사찰 — 달빛 | 초급 | 느린 강타형 요괴·원거리 경보 귀신 |
| 3 | **뼈 바위 계곡** | 깊은 계곡 협로 — 안개 | 중급 | 무리 잡귀·낙석 지형 함정 |
| 4 | **폐가·지하 창고** | 도시 외곽 폐가 — 심야 | 중상급 | 중형 엘리트 귀신·잠복형 |
| 5 | **공동묘지 심부** | 산중 묘역 — 새벽 | 상급 | 강화 엘리트·다단 패턴 |
### 스테이지 수 결정 근거
파일럿 3종(최소) vs 5종(적정) vs 7종(확장) 중 **5종 채택**. 이유: 3종은 재도전 루프에서 반복감이 너무 빨리 드러남. 7종은 파일럿 스코프 초과(보스 제작 비용). 5종으로 "이번엔 4스테이지까지 갔다"는 진척감 계단 5단 확보.
## 3. 공간 구조 — 단일 스테이지 3단 구성
05_스테이지_구조_초안 §3-1 계승. 모든 스테이지는 아래 템플릿 고정.
```
[마을 → 스테이지 입장]
┌─────────────────────────────┐
│ 구간 1: 도입 (약 30초~1분) │ ← 빌드 시드 형성 구간
│ · 약한 잡귀 3~5기 │
│ · 평탄 플랫폼 중심 │
│ · 1~2회 레벨업 예상 │
│ · 지형 트릭: 짧은 점프 1회 │
└────────────┬────────────────┘
┌─────────────────────────────┐
│ 구간 2: 전개 (약 2~4분) │ ← 빌드 확장 + 아이템 기회
│ · 중간 강도 적 2~4기 │
│ · 엘리트 1기 (스테이지 2+) │
│ · 점프 퍼즐 1~2개 │
│ · 2~3회 레벨업 예상 │
│ · 아이템 드롭 기회 1~2회 │
│ · 지형 트릭: 낙하·고저차 │
└────────────┬────────────────┘
▼ [후방 차단 — 되돌아갈 수 없음]
┌─────────────────────────────┐
│ 구간 3: 보스 아레나 (1~3분) │ ← 빌드 검증
│ · 고정 카메라 전환 │
│ · 보스 1종 (2~3 페이즈) │
│ · 아레나 지형: 발판·장애물 │
│ · 처치 후 보상 + 분기 선택 │
└─────────────────────────────┘
│ │
▼ ▼
[마을 복귀] [다음 스테이지]
```
### 횡스크롤 길이 목표 (플레이 시간 기반)
| 스테이지 | 총 목표 시간 | 구간 1 | 구간 2 | 구간 3(보스) |
|---------|------------|--------|--------|-------------|
| 1 | 5분 | 40초 | 2분 | 2분 20초 |
| 2~3 | 6~7분 | 50초 | 3분 | 2분 30초 |
| 4~5 | 8~10분 | 1분 | 4분 | 3분 |
캐주얼 로그라이크 목표 5~10분/런 (01_게임_컨셉 §5-1) 기준. **구간 1은 짧고 빠르게** — 재도전 시 반복 심리 피로 완화 (05 §5 계승).
## 4. 동선 설계
### 4-1. 메인 경로
오른쪽 방향 선형 진행. 적을 처치하며 우측으로 이동. 보스 방 진입 트리거는 특정 지점 도달(문·계단·협로 등 세계관 오브젝트 활용).
### 4-2. 서브 경로 (구간 2 한정)
구간 2에 **고저차 분기** 1개. 상단 루트(점프 필요·아이템 보상 확률 높음) vs 하단 루트(안전·적 밀도 낮음). 선택 자체가 재미.
### 4-3. 숨겨진 경로 — 파일럿 제한
파일럿에서는 숨겨진 경로 없음. 인지 부담 최소화 우선. Phase 3-C에서 탐험 보상(숨겨진 방·특수 아이템) 검토.
## 5. 자동 생성 vs 수동 배치 판정
**결론: 파일럿 전체 수동 배치 + 구간 2 적 배치 소규모 셔플.**
- 05_스테이지_구조_초안 §7-1에서 "완전 랜덤 프로시저럴 맵 기각" 계승.
- 플랫폼 지형·보스 아레나·진행 트리거는 수동 배치 고정.
- 구간 2 적 배치만 소규모 셔플(등장 위치 2~3곳 중 1곳 랜덤)으로 반복감 완화.
- 전면 프로시저럴: 학습 곡선·제작 비용 과다, 기각 유지.
## 6. 체크포인트·회복 지점
**라이프 1 전제 — 별도 체크포인트 없음.**
- 02_코어_루프 §7-1 "체크포인트 기각" 계승. 한 런 단일 세션 유지.
- **i-frame** (피격 후 무적 시간 400~800ms)이 유일한 보조 장치 (04_전투_기본_스펙 §3-2 계승).
- 구간 2 내 **일시적 실드 카드**는 balance-designer 영역 — 본 문서는 "있을 수 있다"는 여지만 표시.
- **회복 지점 지형**: 안전 플랫폼(적 없음·정지 가능) 구간 2 중반 1곳 배치. 심리적 숨 고르기 제공. 아이템 획득·카드 교체 UI 활성화 여지(UX-designer 확인 필요).
## 7. 페이싱 곡선
```
긴장도
5 │ ████ 보스(페이즈 2~3)
4 │ ████ ████
3 │ ████ ████ ████ ████
2 │ ████ ████ ████
1 │ ████
└─────────────────────────────────────→ 진행
입장 구간1 이동 구간2 이동 보스방
(적조우) (엘리트)
```
- **입장~구간 1**: 낮은 긴장. 빠른 첫 레벨업 → "쌓기" 시작의 쾌감.
- **구간 2 전반**: 점프 퍼즐·중간 적으로 긴장 상승. 아이템 드롭 → 선택의 즐거움.
- **구간 2 중반 안전 구간**: 짧은 이완. 숨 고르기.
- **구간 2 후반 엘리트**: 긴장 재상승. 보스 예고.
- **보스방 진입**: 후방 차단 → 긴장 정점. 페이즈 전환마다 갱신.
- **보스 처치**: 해소 + 분기 선택 긴장(마을 vs 다음).
## 8. 사용 컨텐츠 (컨텐츠·밸런스 기획자 이관)
### 8-1. 몬스터 (content-designer 확정 요청)
- 스테이지 1: 빠른 근접 잡귀 1종 (소형), 투척 원거리 잡귀 1종 (약)
- 스테이지 2: 느린 강타형 요괴 1종, 경보 원거리 귀신 1종
- 스테이지 3: 무리형 잡귀 2종 변형, 낙석 지형 연계 몬스터 1종
- 스테이지 4: 중형 엘리트 귀신 1종 (신규), 잠복형 1종
- 스테이지 5: 강화 엘리트 2종 (4의 상위 버전)
- 수치·AI 패턴: balance-designer + content-designer 이관
### 8-2. 아이템 (balance-designer 확정 요청)
- 구간 2 드롭 아이템: 파츠 1개 슬롯 제약 (02_코어_루프 §2 계승)
- 드롭 빈도·가치: balance-designer 이관
### 8-3. 지형 기믹 (개발팀 확인 필요)
- 낙하 함정 (스테이지 3 계곡 — 즉사 vs 대미지 판정)
- 발판(이동 플랫폼) 타이밍 점프
- 상세 구현 가능 여부: 개발팀 C11 판단 이관
## 9. 난이도
- **추천 플레이어 수준**: 스테이지 1은 첫 런 0회차, 스테이지 5는 특성 5+ 누적 후 도달 기대
- **체크포인트 간격**: 없음 (라이프 1 전제). 사망 = 마을 복귀 전체.
- **수치 난이도 레버**: 적 수·적 강도·점프 퍼즐 정밀도·보스 페이즈 수 — balance-designer 이관 (05 §4-3 계승)
## 10. 기각안
1. **"스테이지 3종 파일럿 최소 구성" — 기각.** 3종은 재도전 시 반복감 노출이 너무 빠름. 5단 진척 계단이 "더 멀리"의 로그라이크 동기를 형성하는 최소 단위.
2. **"스테이지 중간 분기·분기 맵 구조" — 기각.** 05 §7-1 기각안 계승. 파일럿 스코프 초과, Phase 3-C 재검토.
3. **"구간 2 완전 랜덤 배치" — 기각.** 완전 랜덤은 레벨 의도 붕괴 위험. 소규모 셔플(적 등장 위치)로 반복감 완화. 지형은 수동 고정.
4. **"보스 방 후 자동 회복 아이템 지급" — 기각.** 라이프 1 긴장 원칙 훼손. 보상은 카드·아이템 획득으로 한정. 보스 방 진입 전 "안전 구간"으로 심리적 준비 대체.
## 11. 열린 이슈
| 이슈 | 이관 대상 | 우선순위 |
|------|----------|--------|
| 스테이지 1~5 수치 (적 수·강도·레벨업 경험치) | balance-designer | 높음 |
| 몬스터 종류·AI 패턴·스펙 | content-designer | 높음 |
| 낙하 함정 즉사 vs 대미지 판정 | PD 결정 + 개발팀 | 높음 |
| 2단 점프 도입 여부 | PD 결정 (04 §4-1 계승) | 중간 |
| 구간 2 아이템 드롭 빈도·종류 | balance-designer | 중간 |
| 안전 플랫폼 내 UX 인터랙션 범위 | ux-designer | 중간 |
| 보스 네이밍·외형 확정 | narrative-designer (02_보스_네이밍.md) | 높음 |
| 숨겨진 방·탐험 보상 도입 시점 | Phase 3-C 보류 | 낮음 |
## 12. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|---|---|---|---|
| 2026-04-22 | v0.1 파일럿 초기 레벨 설계 | PD 지시 BT6-Plan Phase 3-B | 레벨 기획자 |

View File

@ -1,165 +0,0 @@
---
type: 레벨_설계
scope: 보스_패턴
author: 레벨 기획자
date: 2026-04-22
version: v0.1 (파일럿)
project: EerieVillage
phase: Phase 3-B
data_source: 05_스테이지_구조_초안.md·04_전투_기본_스펙.md·01_스테이지_구조.md (본 세션)
status: 보스 패턴 초안 — 보스 네이밍·외형은 narrative-designer 02_보스_네이밍.md 이관 (현재 부재)
---
# 02. 보스 패턴 초안
## 1. 레벨 목표
**"각 보스전은 지금까지 쌓은 빌드를 '회피 가능한 패턴'으로 검증하는 장면 — 플레이어가 읽고 반응하는 재미가 핵심."**
## 2. 공통 설계 원칙
05_스테이지_구조_초안 §3-2 계승:
- **아레나 진입 시 후방 차단**: 보스 방 진입 후 이전 구간 복귀 불가
- **고정 카메라**: 횡스크롤 해제 후 아레나 전체 뷰 고정 (연출 임팩트 + 패턴 가독성)
- **텔레그래프 의무**: 모든 보스 공격은 0.5~1초 예고 동작 선행 — "랜덤 사망" 방지
- **플랫폼 지형 활용 의무**: 발판 배치로 점프·위치 선정이 회피 핵심 동작이 되도록 설계
### 아레나 기본 구조 (3종 공통 템플릿)
```
┌─────────────────────────────────────────┐
│ [발판 B] [보스 초기 위치] [발판 C] │
│ │
│ [발판 A] │ ← 고정 카메라 뷰
│ │
│ ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 바닥 │
│ ←────────────── 플레이어 이동 가능 범위 ──│
└─────────────────────────────────────────┘
```
- 발판 B·C: 점프로 올라가 원거리 패턴 회피 or 근접 공격 타이밍 확보
- 바닥: 주 전투 공간 (이동·대시·공격)
- 아레나 너비: 화면 고정 뷰 기준 3~4 화면 폭
## 3. 보스 3종 패턴 (스테이지 1·3·5 배치)
> **참조 선행 미확인**: `narrative-designer/02_보스_네이밍.md`가 현재 부재. 보스명은 임시 기능명으로 작성. 네이밍·외형 확정 시 narrative-designer 산출물로 교체 필요.
### 3-1. 보스 1 — "떠돌이 잡귀 우두머리" (스테이지 1 배치)
**레벨 목표**: 첫 보스. 패턴 학습 도구. 회피만 해도 이길 수 있다는 자신감 부여.
#### 아레나 특징
- 발판 1개(낮은 위치). 단순 구조 — 이동·점프 기초만 요구.
#### 페이즈 구성
**페이즈 1 (체력 100~60%)**
- 돌진: 한 방향으로 빠르게 전진. 예고 동작 0.8초 (자세 낮춤). 점프 or 역방향 이동으로 회피.
- 점프 내리치기: 제자리 점프 후 낙하 충격파 소형. 예고 1초 (공중 정지). 이동으로 회피.
- 패턴 속도: 느림. 간격 여유.
**페이즈 2 (체력 60~30%)**
- 돌진 2연속으로 빈도 증가.
- 잡귀 소환 2기 추가. (소환된 잡귀는 약함 — 보스 집중을 방해하는 역할)
**페이즈 3 (체력 30~0%)**
- 광역 충격파: 바닥 전체 타격. 예고 1.5초 (포효). 발판 위로 점프해서 회피 필수.
- 돌진 3연속. 회피 타이밍 요구 상승.
- 재미 포인트: "발판 점프 + 돌진 회피" 동시 처리.
---
### 3-2. 보스 2 — "산사 수문장 요괴" (스테이지 3 배치)
**레벨 목표**: 중반 보스. 원거리 공격 회피 + 플랫폼 이동이 동시에 필요한 첫 보스.
#### 아레나 특징
- 발판 2개(중간·높은 위치). 보스는 중앙 위치에서 이동 폭 좁음.
- 안개 연출 — 특정 발판 구역이 일시적으로 시야 좁아짐 (연출). 실제 판정에는 영향 없음.
#### 페이즈 구성
**페이즈 1 (체력 100~55%)**
- 탈출 부적: 3방향(좌·우·아래) 광탄 발사. 예고 0.7초 (부적 발광). 높은 발판 위로 점프 or 탄 사이 이동으로 회피.
- 발 구르기: 근접 범위 충격. 예고 0.6초. 점프 1회로 회피.
**페이즈 2 (체력 55~25%)**
- 추적 부적: 플레이어를 느리게 추적하는 광탄 2발. 탄속 낮음 — 충분히 유도 후 틱 전환으로 떼어내기 가능.
- 부적 벽: 아레나 한쪽 끝에서 부적 격벽 생성. 이동 가능 공간 축소. 반대편으로 이동.
- 재미 포인트: "추적탄 유도 이동 + 발 구르기 예고 대응" 동시 처리.
**페이즈 3 (체력 25~0%)**
- 연속 부적 폭발: 아레나 바닥 3지점 순차 폭발 예고 (원형 경고 표시 1초 선행). 안전 지점으로 이동.
- 발 구르기 2연속 + 추적탄 동시 발사.
- 보스 이동 속도 상승.
- 재미 포인트: 바닥 폭발 경고 읽기 + 위치 이동이 핵심.
---
### 3-3. 보스 3 — "공동묘지의 저승사자" (스테이지 5 배치)
**레벨 목표**: 파일럿 최종 보스. 이전 보스 패턴을 복합·가속. 충분한 빌드와 숙련 모두 필요.
#### 아레나 특징
- 발판 3개(낮음·중간·높음). 높이 차이 활용 의무.
- 묘비 장애물(이동 불가 오브젝트) 2개 — 보스 탄환의 차폐막 or 이동 장애.
#### 페이즈 구성
**페이즈 1 (체력 100~65%)**
- 낫 휘두르기: 반원 근접 범위. 예고 0.8초 (낫 들어올림). 뒤쪽 이동 or 점프.
- 죽음의 낫 투척: 직선 원거리. 예고 0.6초. 상하 이동으로 회피.
**페이즈 2 (체력 65~35%)**
- 망혼 소환: 약한 망혼 3기 소환 (방치 시 시야 방해). 근접 처치 or 무시하고 보스 집중 — 선택 압박.
- 낫 투척 다중 발사: 상·중·하 3방향. 발판 위 고지점 or 묘비 뒤 차폐.
- 그림자 이동: 보스가 순간이동(연기 텔레포트). 순간이동 후 위치 파악 0.5초 — 공격 타이밍 끊김.
- 재미 포인트: "망혼 처리 여부 판단 + 그림자 이동 후 위치 재확인"이 핵심 인지 부하.
**페이즈 3 (체력 35~0%)**
- 전장 암흑화: 아레나 조명 최소화(연출). 보스 및 공격 경고 표시는 유지(판정에 영향 없음).
- 낫 빙 돌리기: 보스 주변 회전 광역. 중·원거리 유지 필수.
- 죽음의 파동: 바닥부터 상단으로 올라오는 광역 파동. 발판 위로 점프 타이밍 필수.
- 그림자 이동 3연속. 위치 예측 불가 → "보이면 치는" 리듬.
- 재미 포인트: "파동 점프 + 낫 빙돌리기 거리 유지 + 순간이동 추적" 3중 처리.
## 4. 난이도 차등 (스테이지 1→3→5 곡선)
| 항목 | 보스 1 (스테이지 1) | 보스 2 (스테이지 3) | 보스 3 (스테이지 5) |
|-----|-----------------|-----------------|-----------------|
| 페이즈 수 | 3 | 3 | 3 |
| 공격 종류 | 2종 | 3종 | 4종 |
| 동시 처리 요구 | 낮음 | 중간 | 높음 |
| 발판 활용 필요 | 선택 | 권장 | 필수 |
| 패턴 예고 시간 | 0.8~1.5초 | 0.6~1초 | 0.5~0.8초 |
| 소환 몬스터 | 2기 (약) | 없음 | 3기 (시야 방해) |
| 인지 복잡도 | 단순 | 중간 | 복합 |
**곡선 방향**: 1회차 플레이어는 보스 1에서 패턴 학습 → 보스 2에서 복합 회피 도전 → 보스 3에서 전 스킬 통합. 보스 2·4(스테이지 2·4)는 balance-designer와 협의 후 보스 1~3의 중간 패턴으로 설계(본 문서 보류 — 열린 이슈 참조).
## 5. 기각안
1. **"패턴 복잡화 — 보스당 5종 이상 공격" — 기각.** 캐주얼 포지션에서 패턴 2~4종이 가독성·학습 곡선 적정. 5종 이상은 인지 과부하 → "랜덤 사망" 인상. 패턴 수 대신 조합·타이밍으로 깊이 확보.
2. **"다중 보스 동시 출현" — 기각.** 05 §7-5 계승. 보스 1종 고정, 소환 몬스터로 부가 압박 제공. 다중 보스는 가독성 붕괴·라이프 1에서 회피 불가능 상황 빈발.
3. **"보스 체력 회복 페이즈" — 기각.** 긴장 곡선을 의도적으로 끊는 디자인이지만 캐주얼 로그라이크에서 전투 템포 저하 → 플레이어 이탈 위험. 페이즈 전환 시 공격 속도·패턴 변화로 강도 갱신.
4. **"보스 방 진입 후 준비 아이템 선택 UI" — 기각.** 후방 차단 후 즉시 보스 등장이 긴장 최고조 연출의 핵심. 중간 UI는 몰입 단절. 준비는 구간 2 안전 플랫폼에서 완료하도록 유도.
## 6. 열린 이슈
| 이슈 | 이관 대상 | 우선순위 |
|------|----------|--------|
| 보스 1·2·3 네이밍·외형·조선 세계관 정합성 | narrative-designer | 높음 |
| 보스 2·4 (스테이지 2·4) 패턴 설계 | 본 문서 Phase 3-C 확장 | 중간 |
| 각 보스 수치 (체력·공격력·패턴 예고 시간 ms) | balance-designer | 높음 |
| 소환 몬스터 스펙 (보스 1·3) | content-designer | 중간 |
| 그림자 이동(순간이동) 구현 가능 여부 | 개발팀 C11 판단 | 중간 |
| 전장 암흑화 연출 구현·성능 비용 | 개발팀 C11 판단 | 중간 |
| 아레나 구조 최종 사이즈·발판 위치 수치 | balance-designer + 개발팀 | 높음 |
| 패턴 예고 시간 내 시각 피드백 (텔레그래프) | ux-designer | 높음 |
## 7. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|---|---|---|---|
| 2026-04-22 | v0.1 파일럿 보스 패턴 초안 | PD 지시 BT6-Plan Phase 3-B | 레벨 기획자 |

View File

@ -1,129 +0,0 @@
---
type: 세계관_SOT
scope: narrative
author: narrative-designer
date: 2026-04-22
version: v0.1 (Phase 3-B 골격)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B
data_source: BT6-Plan PD 지시 + 01_게임_컨셉.md (v0.1) 계승
status: 골격 확정 — 로어 상세·이벤트 스크립트·컷씬 대본은 Phase 3-C 이관
---
# 01. 세계관 SOT
> **본 문서는 EerieVillage 세계관의 단일 SOT(Single Source of Truth)다.** 보스 네이밍·마을 컨셉·스킬 카드 텍스트·NPC 대사 등 모든 내러티브 산출물은 이 문서의 세계관 규칙에 정합해야 한다. 구체 대사·이벤트·컷씬 스크립트는 Phase 3-C에서 별도 문서로 확장한다.
---
## 1. 한 줄 설정 (Log line)
**"저승과 이승의 경계가 허물어진 조선 어느 고을에서, 혼자인 퇴마사는 오늘도 죽고 오늘도 다시 일어선다."**
---
## 2. 배경 시대·지역·톤
### 2-1. 시대
- **조선 후기 (가상 역사) — "요괴 성행기"**
- 공식 역사와 분기된 가상 시대. "모종의 사건으로 이승과 저승의 문이 균열"된 세계.
- 구체 연호·왕 이름 명시 금지 — 역사 오류 리스크 차단. "어느 해 가을"·"역병이 돌던 그해" 등 모호한 시간 표현 사용.
- **재미 근거**: 역사 고증 의무를 벗어나 창작 자유를 확보하면서도 조선 민속의 시각 언어(한복·기와·솟대·장승)는 그대로 활용. 타겟 유저(20~40대 한국·동아시아)의 익숙한 미감과 생소한 설정이 결합하여 "알 것 같은데 새로운" 설화 호기심(재미 축 3 보조) 자극.
### 2-2. 지역
- **"기묘한 고을" — 이름 없는 경계 마을**
- 이승에도 저승에도 완전히 속하지 않는 경계 공간. 고을 바깥은 짙은 안개로 막혀 있어 주민들이 나가지 못함.
- 지형 다양성: 마을 인근에 산신이 머무는 **산**, 원혼이 쌓인 **무덤 골짜기**, 수신이 깃든 **강**, 버려진 **관아** 등 — 각각 스테이지 테마가 됨. (상세 배치는 Phase 3-B level-designer)
### 2-3. 톤앤매너 기준
| 영역 | 비중 | 구체 기준 |
|------|------|-----------|
| **해학·캐주얼** | 60% | 요괴가 허당스러운 이유로 등장, 주민 대사에 과장·익살 허용, 보스 처치 대사 유머 허용 |
| **민속·신비** | 30% | 설화 원전 어휘 활용, 시각 연출의 이질감(낯선 귀신 형상)은 유지 |
| **진지·공포** | 10% | 배경 분위기 텍스처(어두운 조명·음향)에 한정. 플레이어가 직접 보는 고어·신체 훼손 금지 |
**금지 표현**: 혈흔 상세 묘사, 고어 이미지, 저주 성인 내용, 실존 종교 직접 폄하.
---
## 3. 퇴마 체계 — "사방신 결계법"
### 3-1. 설정 원칙
- 무속(샤머니즘)을 **중심 뼈대**로, 불교·유교·도교 어휘를 **장식 층위**로 활용.
- **이유**: 한국 민속의 체험적 중심은 무속이며, 불교(부적)·유교(제례)·도교(부적 술식)는 실제 조선 민간신앙에서 혼합 사용됨. 설화 호기심(재미 축 3)을 극대화하려면 단일 체계보다 혼합이 유리.
### 3-2. 작동 원리
- 퇴마사는 **"신들린(접신)" 상태**를 스스로 제어하는 능력자. 수호신의 힘을 빌려 싸움.
- **스킬 카드 = 퇴마 술식**: 각 카드는 특정 신격(산신·수신·화신 등)의 힘을 단편적으로 빌리는 행위. 카드 픽 = 어떤 신의 힘에 더 의지하는가의 빌드 선택.
- **죽음과 부활**: 퇴마사는 고을이 존재하는 한 이승으로 귀환한다. "완전한 죽음 없이 기억만 일부 지워진 채 되돌아오는" 설정 → 로그라이크 사망-복귀 루프의 내러티브 정당화.
- **특성 = 신탁(神託)**: 마을에서 쌓이는 특성은 신들이 퇴마사에게 남긴 흔적. 죽어도 신탁은 사라지지 않는다.
### 3-3. 금기 (이 세계에 "없는 것")
1. **총포·화약 무기** — 조선 민속 설화 언어와 어울리지 않음
2. **서양식 악마·십자가·성수** — 세계관 오염 방지
3. **완전한 저승 여행** — 플레이어는 경계 마을 바깥으로 나가지 못함 (설정 내 이유 제공)
4. **절대 선신·절대 악신 이분법** — 모든 귀신·요괴는 "원한·욕심"이 쌓인 것이지 순수 악이 아님 (설화 원전 존중)
---
## 4. 주인공 정체성
- **명칭**: "퇴마사" (고유 이름은 Phase 3-C 대본 단계에서 결정 — 유저 자기투영 여지 보존)
- **계보**: 대대로 이 고을을 지키던 무격(巫覡) 가문의 마지막 후손. 스승은 이미 이 싸움에서 목숨을 잃었고, 혼자서 고을을 지키고 있다.
- **능력 기반**: 신 접신 + 부적 술식. 몸이 신의 그릇이 되어 힘을 빌리는 방식.
- **캐릭터 아크 골격**: "무력한 고독" → "반복 속의 단련" → "(가능하면) 고을을 해방". 아크 상세는 Phase 3-C 이관.
---
## 5. 적대 세력 — 귀신·요괴 카테고리 (조선 설화 기반)
| 카테고리 | 설명 | 예시 개체 | 스테이지 배치 방향 |
|---------|------|----------|-----------------|
| **원혼(怨魂)** | 억울하게 죽어 원한이 굳은 인간 혼령 | 처녀귀신, 수사(水死)귀신 | 마을 주변, 무덤 골짜기 |
| **요괴(妖怪)** | 오래된 사물·동물이 기이해진 존재 | 구미호, 달걀귀신, 도깨비 | 산길, 폐가 |
| **신수(神獸) 변질** | 신성한 존재가 오염·타락한 형태 | 이무기(용이 되지 못한 뱀), 불가사리 | 강변, 보스 방 |
| **저승 사자류** | 이승에 묶인 저승 관리직 존재 | 저승사자 탈주형, 어둑시니 | 후반 스테이지 |
**톤 주의**: 일반 적은 약간 허당스러운 외형 허용 (캐주얼 비중 60%). 보스만 위압감 있게 설계.
---
## 6. 시리즈화 가능성 설계
- **세계 확장 여지**: 이번 작에서는 "기묘한 고을 1구역"만 탐색. "경계 균열의 원인"은 미해결로 남겨 속편 훅 제공.
- **주인공 가변성**: 퇴마사 계보 설정으로 "다른 시대의 후손 퇴마사"를 2편 주인공으로 교체 가능.
- **지역 확장**: 조선 8도 각 지역의 설화·신격 차이로 스테이지 테마 무한 확장 가능 (제주 해녀 설화, 함경도 호랑이 설화 등).
- **신격 시스템 확장**: 1편의 "수호신 4종" 체계를 2편에서 12신장 체계로 확장하는 플랜 보관.
---
## 7. 기각안
### 기각안 1 — 조선 고증형 리얼 세계관 (기각)
완전 역사 고증(실제 왕 이름·연호·관직명 전부 사용) 방향. **기각 사유**: 역사 오류 리스크가 높고, 고증 의무가 창작 자유를 제한함. 캐주얼 로그라이크 타겟 유저에게 "역사 공부" 느낌은 재미 축 3(설화 호기심)이 아닌 학습 부담으로 인식될 위험. 가상 역사 "요괴 성행기"로 대체.
### 기각안 2 — 불교 중심 단일 퇴마 체계 (기각)
사찰·불화·불경 중심으로 퇴마 체계를 단일화하는 방향. **기각 사유**: 불교 단일 체계는 시각 언어가 절 배경으로 쏠려 마을·산·강 등 다양한 스테이지 테마 구성이 어려움. 무속 중심 혼합 체계가 조선 민간신앙 실태에도 더 정합하며, 스킬 카드 다양성 확보에 유리.
### 기각안 3 — 퇴마사 이름 고정 (기각)
퇴마사의 이름을 "김이현" 등으로 Phase 3-B에서 확정하는 방향. **기각 사유**: 유저가 주인공에 자기투영하는 경험을 보호하기 위해 이름 지정은 최대한 미룸. Hades(자그레우스)처럼 고유 이름이 스토리 충실도를 높이는 경우는 Phase 3-C 대본 단계에서 재검토.
---
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 골격 작성 | PD 지시 BT6-Plan Phase 3-B | narrative-designer |
---
*Phase 3-C 이관 항목: 퇴마사 고유 이름 확정, 주인공 캐릭터 아크 상세, NPC 개인 사연 로어, 이벤트·컷씬 스크립트, 보스 격파 대사 전문.*
*방향 전환 이력 참조: [방향전환 히스토리 아카이브](../../../../공유/조직공지/방향전환_히스토리_아카이브.md)*

View File

@ -1,119 +0,0 @@
---
type: 보스_네이밍
scope: narrative
author: narrative-designer
date: 2026-04-22
version: v0.1 (Phase 3-B 골격)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B
data_source: 01_세계관_SOT.md (v0.1) + 05_스테이지_구조_초안.md (v0.1) 계승
status: 네이밍·외형 모티프 확정 — 보스 패턴·페이즈 설계는 Phase 3-B level-designer 이관
---
# 02. 보스 네이밍
> **본 문서는 스테이지 3종 기준 보스 네이밍·배경 스토리·외형 모티프를 확정한다.** 05_스테이지_구조_초안의 3단 구성(도입·전개·보스 방)을 계승하며, 각 스테이지 테마와 보스를 짝지어 설계한다. 보스 전투 패턴·페이즈 상세는 Phase 3-B level-designer 이관.
---
## 1. 재미 연결 원칙
각 보스의 네이밍·외형·배경 스토리는 다음 두 가지 재미를 동시에 강화한다:
- **재미 축 2 (액션 플랫포머의 손맛)**: 외형 모티프는 공격 패턴의 "읽기 단서"를 제공해야 한다. 보스의 생김새를 보면 어떻게 싸울지 유추 가능해야 함.
- **재미 축 3 (설화 호기심·보조)**: 조선 설화 원전에 기반하여 "이 귀신이 왜 여기 있는가"의 배경이 납득 가능해야 한다. 처치 후 "그렇구나" 카타르시스 제공.
---
## 2. 스테이지 보스 3종
### 2-1. 스테이지 1 보스 — 달걀귀신 "알머리 영감"
**네이밍 근거**: "달걀귀신"은 조선 민속에서 얼굴이 없는 귀신(目·鼻·口가 없는 매끄러운 얼굴)의 이름. "알머리 영감"은 원전의 공포를 캐주얼 로그라이크 톤에 맞게 해학적으로 재해석한 명칭.
**배경 스토리 (2~3줄)**
고을에서 가장 오래된 주막을 지키던 노인이 죽고 난 뒤 귀신이 되었다. 얼굴이 없어서 자신이 귀신인지도 모르고 지금도 주막 뒤편을 어슬렁거린다. "내 얼굴이 어디 갔나" 하며 플레이어에게 달려드는데, 막상 닿으면 간지럼만 태운다고 마을 어른들은 수군댄다.
**외형 모티프 (스프라이트 발주 기준)**
- 키가 큰 노인 체형, 한복(두루마기), 갓 착용
- 얼굴 부위는 완전 매끄러운 달걀 표면 — 눈·코·입 없음
- 이동: 느리게 휘청거리며 걷는 애니메이션
- 공격: 팔을 크게 휘두르는 단순 근접. 패턴 가독성 최우선.
- 색조: 흰색·회색 중심, 은은한 야광 효과
**스테이지 테마**: 마을 인근 폐주막 일대. 입문 스테이지 → 낮은 위협감으로 규칙 학습 유도.
---
### 2-2. 스테이지 2 보스 — 두억시니 "솟대 장군"
**네이밍 근거**: "두억시니"는 조선 민속의 거대하고 힘센 귀신. 원전에서 마을 경계에서 출몰한다는 설화와 솟대(마을 수호 기둥)를 결합. "솟대 장군"은 마을을 지키러 왔다가 원한에 취해 이제는 마을을 위협하는 아이러니를 담은 이름.
**배경 스토리 (2~3줄)**
오래전 고을 어귀에 세워진 솟대에 깃들어 마을을 지키던 신령이었다. 이승과 저승의 균열 이후 경계 에너지에 감염되어 점점 거대해지고 포악해졌다. 이제는 마을을 지키는 것인지 공격하는 것인지 스스로도 구별 못하는 상태.
**외형 모티프 (스프라이트 발주 기준)**
- 약 2~3층 높이의 거대 인형 체형 (보스라는 존재감 명확히)
- 상반신은 솟대 꼭대기의 새 형상(오리·기러기)에서 유래한 깃털 장식
- 하반신은 두꺼운 통나무 다리 — 지면 진동 공격 동작 연계
- 눈은 빨갛게 빛나는 두 점
- 색조: 나무색(갈색·황갈색) + 오염된 검정 그라데이션
**스테이지 테마**: 고을 경계 솟대 숲. 중반 스테이지 → 빌드 완성도 검증.
---
### 2-3. 스테이지 3 보스 — 이무기 "흑룡 미완성"
**네이밍 근거**: "이무기"는 조선 설화에서 용이 되지 못한 거대 뱀으로, 원한과 집착이 강한 존재. "흑룡 미완성"은 이무기 자신이 용이 될 뻔했으나 실패한 순간을 내러티브로 환기하는 명칭 — 재미 유발 원리로 "불완전한 강자"의 위협감 + 연민 동시 제공.
**배경 스토리 (2~3줄)**
강 깊은 곳에서 수백 년 동안 여의주를 기다리던 이무기가 이승·저승 경계 균열의 에너지를 여의주로 착각하고 삼켜버렸다. 용이 되기는커녕 몸이 더 뒤틀려 제어 불가 상태가 되었다. 막아야 하는 줄은 알면서 멈출 수 없는 상태가 이 이무기의 비극.
**외형 모티프 (스프라이트 발주 기준)**
- 긴 뱀 형태 (상반신·하반신 구별 없음), 횡스크롤 보스 방에서 S자로 움직임
- 일부 구간에서 용의 발톱·비늘이 돋아나려다 멈춘 미완성 형태
- 입에서 오염된 검은 연기(여의주 에너지 오염) 방사
- 색조: 짙은 남색·흑색 + 용 되려다 실패한 금빛 파편
**스테이지 테마**: 고을 뒤 강변·늪지. 최종 스테이지 → 빌드 완성 검증 + 서사 클라이맥스.
---
## 3. 보스 3종 요약표
| 순서 | 이름 | 원전 | 스테이지 테마 | 재미 역할 |
|------|------|------|-------------|---------|
| 1 | 달걀귀신 "알머리 영감" | 달걀귀신 설화 | 폐주막 | 입문·해학. 패턴 학습 유도 |
| 2 | 두억시니 "솟대 장군" | 두억시니 + 솟대 | 경계 솟대 숲 | 위협감 상승. 빌드 검증 |
| 3 | 이무기 "흑룡 미완성" | 이무기 설화 | 강변·늪지 | 서사 클라이맥스. 연민+긴장 |
---
## 4. 기각안
### 기각안 1 — 삼두구미(三頭九尾)를 최종 보스로 (기각)
삼두구미(머리 셋·꼬리 아홉인 구미호 극단 진화형)를 스테이지 3 보스로 사용하는 방향. **기각 사유**: 삼두구미는 일본 요괴 체계와 혼선 가능성이 있으며, 2D 횡스크롤 보스로 구현 시 머리 3개 동시 표현이 스프라이트 복잡도를 불필요하게 높임. 이무기는 조선 설화 원전이 명확하고 "뱀 형태 = 횡스크롤 이동 패턴"과 시각적으로 자연스럽게 결합.
### 기각안 2 — 불가사리를 중간 보스로 (기각)
불가사리(쇠를 먹고 자라는 괴물)를 스테이지 2 보스로 사용하는 방향. **기각 사유**: 불가사리의 "쇠를 먹는" 속성은 2D 플랫포머 전투 시각화가 어렵고, 재미 축 2(공격 패턴 가독성)에서 유저에게 패턴 직관을 주기 힘든 설정. 두억시니 + 솟대 결합이 "마을 수호 → 오염"이라는 서사 아이러니를 더 잘 담음.
### 기각안 3 — 어둑시니를 첫 보스로 (기각)
어둑시니(어두운 곳에서 따라오는 귀신)를 스테이지 1 보스로 사용하는 방향. **기각 사유**: 어둑시니의 "어둠·추적" 속성은 시각 표현이 배경과 동화되어 캐주얼 로그라이크에서 가독성을 해침. 입문 보스는 유저가 쉽게 인식·회피 예측할 수 있는 명확한 실루엣이 필요. 달걀귀신의 "얼굴 없는 노인" 실루엣이 단순·명확하여 첫 보스로 적합. 어둑시니는 후반 일반 적 또는 이벤트 연출에 활용 여지 보관.
---
## 5. Phase 3-C 이관 항목
- 각 보스 전투 페이즈 구성·공격 패턴 상세 (level-designer)
- 보스 처치 후 대사·연출 스크립트 (narrative-designer)
- 보스 처치 시 드랍 보상 구성 (balance-designer)
- 스테이지 4 이상 추가 보스 후보 (구미호·저승사자·산신령 변질형 등) — Phase 3-C에서 재검토
---
## 6. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 골격 작성 | PD 지시 BT6-Plan Phase 3-B | narrative-designer |

View File

@ -1,179 +0,0 @@
---
type: 마을_컨셉
scope: narrative
author: narrative-designer
date: 2026-04-22
version: v0.1 (Phase 3-B 골격)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B
data_source: 01_세계관_SOT.md (v0.1) + 02_코어_루프.md (v0.1) + 05_스테이지_구조_초안.md (v0.1) 계승
status: 골격·명칭·공간 구조 확정 — NPC 상세 대사·이벤트·상점 UI는 Phase 3-C 이관
---
# 03. 마을 컨셉
> **본 문서는 코어 루프의 "마을 허브" 공간을 서사·감정적으로 설계한다.** 단순한 UI 허브가 아니라 퇴마사가 죽고 돌아오는 "감정 회복 공간"으로서의 정체성을 확립한다. 2D 횡스크롤 플랫포머 시야 기준 씬 구성 가이드를 포함한다.
---
## 1. 재미 연결 원칙
마을은 두 가지 재미를 동시에 담당한다:
- **재미 축 3 (영속 성장의 위안 — 보조)**: 죽고 돌아왔을 때 "그래도 여기는 안전하다"는 안도감. 퇴마사가 완전 무로 돌아가지 않는다는 감각을 공간이 전달.
- **재미 축 3 (설화 호기심 — 보조)**: 마을 NPC와의 짧은 대화·공간 탐색으로 "다음에는 어디까지 가나" 복귀 동기 강화. 죽음이 절망이 아닌 "다시 시도"로 읽히는 서사 환경 제공.
---
## 2. 마을 명칭 후보 및 확정
| 후보 | 의미 | 톤 |
|------|------|-----|
| **안개골** (확정) | 사방이 안개로 막힌 고을. 이승·저승 경계 공간의 성질 직관적 전달 | 신비·캐주얼 균형 |
| 망각리(忘却里) | 죽고 돌아올 때 기억 일부가 사라지는 설정 연계 | 진지한 편 — 캐주얼 비중 축소 위험으로 기각 |
| 경계촌(境界村) | 이승·저승 경계라는 설정 직접 표기 | 설명적 — 게임 내 톤과 어울리지 않음으로 기각 |
**확정: "안개골"**
- **근거**: 짧고 발음하기 쉬움. "안개" 시각 키워드가 UI·배경 아트에 일관되게 활용 가능. 공포감보다 신비감에 치우쳐 캐주얼 톤 유지에 유리.
---
## 3. 마을 공간 구조 (2D 횡스크롤 씬 기준)
### 3-1. 설계 원칙
- **단층 횡스크롤 씬**: 마을은 탐험보다 빠른 기능 접근이 우선. 스크롤 1회로 전체 공간 파악 가능한 **좌우 선형 배치**.
- **건물 내부 진입 없음 (파일럿 스코프)**: NPC와 인터랙션은 외부에서 말풍선·팝업 UI로 처리. 건물 내부 탐험은 Phase 3-C.
- **시각 계층**: 전경(캐릭터 이동 레이어) / 중경(건물·오브젝트) / 원경(산·하늘·안개) 3층.
### 3-2. 공간 배치 (좌 → 우 순서)
```
[좌 끝: 마을 입구]
솟대 2기 (마을 경계 표식) + 안개 파티클
├─ [주막 "돌아온 이 쉬어가는 곳"]
│ 역할: 특성 확인·관리 UI 진입점 + 정보꾼 NPC 위치
│ 시각: 허름하지만 불빛이 새어나오는 따뜻한 느낌
├─ [무당집 "신당"]
│ 역할: 스킬 카드 관련 특수 서비스 (상세 Phase 3-B system-designer)
│ + 스승 NPC 위치 (서사 허브)
│ 시각: 오색 천·방울·장식 가득. 마을에서 가장 화려한 건물
├─ [사당 "고을 수호신 신위"]
│ 역할: 세계관 로어 텍스트 열람 (귀신 도감·설화 기록)
│ → 설화 호기심 재미 축 3 구현 공간
│ 시각: 작고 단정한 기와 사당. 문 앞에 촛불
├─ [대장간 "쇠꾼 영감네"]
│ 역할: 아이템 강화·교체 서비스 (상세 Phase 3-B balance-designer)
│ 시각: 불빛·연기 이펙트. 망치 소리 사운드 큐
└─ [스테이지 입구 "경계 문"]
역할: 스테이지 선택 UI 진입점
시각: 낡은 성문 형태. 문 너머로 짙은 안개. 가장 오른쪽 배치로
"이 문을 나가면 위험"의 경계 감각 전달
```
---
## 4. 마을 NPC 3종
### 4-1. 주모 "복선댁" (정보꾼·안도 NPC)
**역할**: 마을에서 가장 오래 살아온 인물. 퇴마사가 죽고 돌아올 때마다 맞이해주는 존재. 특성 확인 UI와 연계.
**재미 근거**: "돌아왔구나" 한 마디로 "사망이 실패가 아니라 귀환"이라는 감정을 심어줌. 재미 축 3(위안)의 서사 앵커.
**대사 톤 + 샘플**
> 과장스럽고 넉살 좋은 아줌마 어투. 무섭지 않음. 죽음을 "돌아왔다"로 당연하게 받아들임.
샘플 대사 (분위기 참고용 — 확정 대사는 Phase 3-C):
- "아이고, 또 왔네. 밥 먹었어? 국 뜨거울 때 먹고 다시 나가."
- "오늘은 어디까지 갔다 왔어? 솟대 장군이 아직도 거기 있더냐?"
---
### 4-2. 스승 혼령 "선사(先師)" (서사·카드 NPC)
**역할**: 이미 이 싸움에서 목숨을 잃은 퇴마사의 스승. 무당집에서 희미하게 나타남. 스킬 카드 시스템 튜토리얼과 연계.
**재미 근거**: 퇴마사가 왜 혼자인지, 왜 싸우는지를 조각조각 알려주는 서사 허브. 매 귀환마다 한 문장씩 새 정보를 줘 "다음엔 뭐라고 하나" 방문 유도 → 복귀 동기 강화.
**대사 톤 + 샘플**
> 차분하고 조금 무심한 어투. 전직 엄한 스승이었으나 죽고 나서 조금 허탈해진 뉘앙스.
샘플 대사 (분위기 참고용 — 확정 대사는 Phase 3-C):
- "또 왔구나. 이번엔 어느 술식을 써봤느냐."
- "두억시니가 솟대 장군이 된 것은 내가 지키지 못해서다. 그다음은 네가 막아라."
---
### 4-3. 상인 "약재 행상 이 서방" (아이템·대장간 NPC)
**역할**: 어디서 왔는지 모르는 행상. 대장간 옆에 자리를 펴고 있음. 아이템 거래·강화 서비스 연계.
**재미 근거**: 마을 외의 세계 정보 단편을 흘려주는 존재. "바깥이 있긴 한가"의 의문을 자극하여 세계관 호기심 제공. 아이템 교환이라는 기능을 서사 공간에 자연스럽게 녹임.
**대사 톤 + 샘플**
> 능글맞고 말이 많은 장사꾼 어투. 진지한 정보 중에 엉뚱한 이야기를 섞음.
샘플 대사 (분위기 참고용 — 확정 대사는 Phase 3-C):
- "어서 오시오. 오늘 좋은 거 들어왔소. 이무기 비늘 하나에 산신령 턱뼈 하나면 안 바꿀 물건이 없지."
- "솔직히 말하면 나도 어떻게 이 안개 고을에 들어왔는지 모르오. 나가는 법은 더 모르고."
---
## 5. EerieVillage 마을 정체성
**"안개골은 단순한 UI 허브가 아니다."**
1. **감정 회복 공간**: 죽음 직후 돌아왔을 때 "따뜻한 불빛·NPC의 환영 대사"로 낙차 후 위안을 즉시 제공. 재미 축 3의 핵심 경험.
2. **정보 축적 공간**: 귀환할 때마다 NPC 대사가 조금씩 바뀌고 사당 로어가 열림 → "다음 귀환에도 들러야 할 이유" 생성.
3. **선택 압박 완충 공간**: 스테이지 선택이라는 긴장 의사결정 직전에 위치. 고요한 마을 BGM과 시각이 "지금은 쉬어도 된다"는 신호를 줌.
4. **세계관 창구**: 적 귀신들의 정체·배경·설화를 사당에서 열람 가능. 전투 밖에서도 세계를 이해하는 경로 제공.
---
## 6. 2D 횡스크롤 씬 구성 가이드
| 항목 | 기준 |
|------|------|
| **씬 폭** | 횡 스크롤 1~1.5화면 분량 권장 (파일럿). 탐험 보다 빠른 이동 우선 |
| **카메라 고정 여부** | 마을 씬은 전체 스크롤 허용. 스테이지 보스 방만 고정 카메라 |
| **인터랙션 범위** | NPC 접근 시 말풍선 또는 버튼 팝업. 전투 씬 조작과 동일 버튼 사용 권장 (학습 부담 최소화) |
| **진입·퇴장 연출** | 사망 복귀: 어두운 페이드 인 → 주모 대사. 스테이지 진입: 경계 문 통과 페이드 아웃 |
| **조명·파티클** | 마을 = 따뜻한 촛불 계열. 스테이지 = 차갑고 어두운 계열. 감정 대비 명확 |
---
## 7. 기각안
### 기각안 1 — 대규모 탐험형 마을 (기각)
건물 내부 진입·미니맵·2층 구조 등 탐험 요소가 있는 마을 설계. **기각 사유**: 파일럿 스코프 초과. 마을 탐험 자체가 별도의 게임 루프가 되어 핵심 재미 축 1·2(전투·빌드)에서 주의를 분산시킬 위험. 선형 단층 마을로 "기능 접근 속도" 최적화. 탐험 요소는 Phase 3-C에서 재검토.
### 기각안 2 — "마을 NPC 없음" 최소화 허브 (기각)
NPC 없이 UI 메뉴만 있는 최소 허브 방향. **기각 사유**: 사망 복귀 시 감정 회복 기능이 없어지고, 재미 축 3(위안·호기심) 전달 불가. Hades의 "귀환 시 Cerberus 쓰다듬기" 처럼 작은 서사 접점이 재도전 의지에 큰 영향을 미침. NPC 최소 3종은 재미 설계상 필수.
### 기각안 3 — 마을 명칭 "경계촌" (기각)
경계촌(境界村)이라는 한자어 명칭. **기각 사유**: 설명적이고 딱딱함. 캐주얼 로그라이크 톤에서 유저가 직관적으로 인식하기 어려운 한자어는 텍스트 친화도를 낮춤. "안개골"이 순우리말로 발음·기억이 쉽고 시각 키워드(안개)와 바로 연결됨.
---
## 8. Phase 3-C 이관 항목
- NPC 확정 대사 전문·분기 스크립트
- 귀환 횟수별 NPC 대사 변화 로직 (system-designer 연계)
- 사당 로어 텍스트 전문 (귀신 도감 항목)
- 마을 내부 건물 탐험 확장 설계
- 마을 BGM 방향성 (사운드 디자이너 이관)
- 세부 파티클·조명 연출 가이드 (UX·아트 이관)
---
## 9. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 골격 작성 | PD 지시 BT6-Plan Phase 3-B | narrative-designer |

View File

@ -1,170 +0,0 @@
---
type: 시스템_설계
scope: 카드_시스템
author: system-designer
date: 2026-04-22
version: v0.1
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md §3 / PD 코어 룰 6·7
status: 핵심 메카닉 골격 확정 — 효과 리스트·수치는 content-designer·balance-designer 이관
---
# 01. 카드 시스템
## 1. 목적
**이 시스템이 풀고자 하는 플레이어 문제**
"레벨업마다 무언가 의미 있는 선택을 했다는 느낌, 그리고 내 빌드가 점점 나만의 것이 되는 느낌"을 제공한다.
PD 코어 룰 6(레벨업 시 3장 중 1장 선택·조합 육성)은 이 경험의 구조적 기반이다. 카드 시스템은 그 구조를 완결한다.
**제공하는 경험**
- 픽 순간마다 "이게 맞는 선택인가?" 의 짧은 긴장
- 카드가 쌓일수록 내 빌드가 강해지는 성장 곡선의 체감
- 동일 덱으로도 달라지는 시너지 조합에서 오는 재발견 재미
---
## 2. 코어 루프
```
레벨업 트리거
카드 풀에서 3장 무작위 드로우 (추첨 전 중복 제거)
픽 UI 표시 — 플레이어가 1장 선택 (강제)
선택 카드 → 빌드 슬롯에 장착 / 동일 카드 재픽 시 → 업그레이드 처리
런 종료(보스 클리어 or 사망) → 카드 전손 · 빌드 초기화
```
"선택 건너뛰기" 옵션은 기본 제공하지 않는다. 3장 모두 나쁜 상황을 **빌드 위기**로 설계하며, 그 자체가 긴장 요소다.
---
## 3. 규칙
### 규칙 1. 카드 풀 3티어 구조
| 티어 | 명칭 | 해제 조건 | 특징 |
|------|------|----------|------|
| T1 | 기본 | 런 시작 시 항상 활성 | 단순 효과, 개수 多 |
| T2 | 숙련 | 누적 레벨 N 이상 도달 시 드로우 풀 합류 | 중복·시너지 조건 포함 효과 |
| T3 | 각성 | 런 내 지정 조건 충족 시 한정 등장 | 빌드 방향 전환급 효과, 개수 少 |
- N 수치는 balance-designer 영역. 구조상 T3는 "후반부에만 보인다"는 경험 설계.
- T3는 항상 3장 중 1장 이하로 등장한다. T3가 2장 이상 동시 출현 시 1장으로 대체한다.
### 규칙 2. 픽 알고리즘 — 가중 무작위
1) 현재 런의 레벨(진행도)에 따라 T1/T2/T3 비율 가중을 결정한다.
2) 가중 비율 안에서 **현재 빌드의 주력 태그 2개**에 해당하는 카드에 추가 가중치를 부여한다.
3) 이미 빌드에 편입된 카드는 재픽 후보에서 제외하되, **업그레이드 가능 카드(동일 카드 2회 픽 조건)**는 재등장 허용한다.
4) 3장은 서로 다른 티어 조합이 되도록 필터를 우선 적용하되, 같은 티어만 남을 경우 필터를 해제한다.
가중치 수치와 태그 연동 강도는 balance-designer 영역.
### 규칙 3. 태그 기반 시너지 체계
카드 하나는 반드시 **1~2개의 태그**를 가진다.
**태그 축 2종**:
1) **속성 태그** (예: 불·물·목·금·토 — 조선 오행 기반, 실제 명칭은 content-designer 확정)
2) **유형 태그** (예: 근거리·원거리·결계·부적·주술)
시너지 발동 조건: 동일 태그 카드 K장 이상 빌드에 편입 시 패시브 효과 추가 발동.
K 수치와 효과 내용은 balance-designer·content-designer 영역.
태그 2축 설계로 "속성 빌드"와 "유형 빌드" 두 방향의 조합이 가능하며, 양 축을 동시에 쌓는 교차 빌드가 제3의 방향이 된다.
### 규칙 4. 업그레이드 체계 — 동일 카드 스택형
- 같은 카드를 2회째 픽하면 즉시 **Lv.1 → Lv.2** 업그레이드.
- 최대 Lv.3까지 허용. Lv.3 이상에서 동일 카드 재픽 시 **재화 보상 or 랜덤 변형**으로 처리한다.
(재화 보상 vs 랜덤 변형 2가지 처리 방식의 선택은 balance-designer 판단 — 재화는 BM 연계, 변형은 빌드 복잡도 증가)
- 업그레이드는 카드 기본 효과의 **수치 상향 또는 추가 트리거** 중 하나. 두 효과 모두 부여하지 않는다.
---
## 4. 상태와 전이
| 상태 | 설명 | 전이 조건 |
|------|------|----------|
| 대기 | 카드 풀에 있으나 미등장 | 레벨업 드로우 알고리즘이 선택 |
| 제시 | 픽 UI에 표시됨 | 플레이어 미선택 시 → 폐기; 선택 시 → 장착 |
| 장착 | 빌드 슬롯에 편입, 효과 발동 중 | 동일 카드 재픽 시 → 업그레이드; 런 종료 → 전손 |
| 업그레이드 | Lv.2 이상, 강화 효과 발동 | Lv.3에서 동일 카드 재픽 → 보상/변형 분기 |
| 전손 | 런 종료(사망 or 클리어) 시 소멸 | 다음 런 시작 → 빌드 초기화 |
---
## 5. 인풋 / 아웃풋
**입력**
- 레벨업 이벤트 (경험치 시스템 or 스테이지 클리어 트리거)
- 플레이어 픽 입력 (터치·클릭)
**시스템 반응**
- 드로우 알고리즘 즉시 실행 → 픽 UI 표시 (Additive Load 2씬 구조 전제 — 개발팀 03 결정 계승)
- 픽 결정 즉시 효과 발동 (애니메이션 피드백 포함, 상세는 ux-designer)
- 업그레이드 시 기존 카드 아이콘에 레벨 표기 갱신
**필요한 피드백 종류 (ux-designer 연계)**
- 3장 표시 시 각 카드의 태그·레벨·업그레이드 가능 여부를 즉시 파악 가능한 UI
- 현재 빌드 태그 분포 시각화 (시너지 진행도 표시)
- 업그레이드 완료 시 시각·음향 강조
---
## 6. 타 시스템 연동
| 연동 시스템 | 연동 방식 |
|------------|----------|
| **전투 시스템** (04_전투_기본_스펙) | 장착 카드 효과가 공격 판정·이동에 수식자로 적용 |
| **특성 시스템** (02_특성_시스템) | 특성 일부가 픽 알고리즘 가중치 수정 or T2/T3 해제 조건 완화 |
| **스테이지 구조** (05_스테이지_구조_초안) | 스테이지 클리어 or 적 처치 누적이 레벨업 트리거 역할 |
| **Additive Load 2씬** (개발팀 03) | 픽 UI는 별도 씬 Additive Load로 전투 씬 위에 오버레이 |
---
## 7. 엣지 케이스
1) **카드 풀 소진**: T1·T2 전체가 빌드에 장착되어 드로우 후보 소진 시 → T1 업그레이드 가능 카드로 강제 채움. 풀 규모는 이 상황이 발생하지 않도록 content-designer가 설계해야 한다.
2) **T3 조건 충족 카드가 없을 때**: T3 슬롯은 T2 카드로 대체. T3 강제 등장 없음.
3) **픽 UI 중 사망 (데미지 입력)**: 픽 UI 표시 중에는 게임 일시정지 처리. 픽 완료 후 전투 재개. (개발팀과 정합 필요 — 이슈 발견 시 C3 보고)
4) **동일 런 내 동일 카드 4회 이상 등장**: Lv.3 이후 재픽은 항상 보상/변형 분기로 흡수되므로 무한 업그레이드 루프 없음.
---
## 8. 기각안
1) **레어리티 3티어(공통·레어·전설) 명칭 체계 — 기각.** 기존 카드게임 언어와 충돌. 조선 퇴마 세계관에 맞는 T1(기본)·T2(숙련)·T3(각성) 명칭으로 대체. 내용상 동형이나 IP 정체성 강화 효과.
2) **카드 합성 시스템(2장 합쳐 상위 카드) — 기각.** 합성은 별도 합성 UI·재고 관리·합성 레시피 설계를 요구하여 시스템 복잡도 폭증. 동일 카드 스택 업그레이드가 "합성"의 재미를 단순 구조로 대체한다.
3) **빌드 슬롯 상한 고정(최대 N장까지만 장착) — 기각.** 슬롯 상한은 "어떤 카드를 버릴까"라는 별도 결정 레이어를 요구. 파일럿 스코프에서는 슬롯 무제한 + 카드 효과 간 상호작용 복잡도로 빌드 깊이를 형성하는 방향이 구현 부담 대비 재미 우위.
4) **카드 판매·분해 메카닉(런 중 카드 처분으로 재화 획득) — 기각.** BM 미확정 상태에서 런 내 재화 루프 설계는 범위 초과. Phase 3-C BM 설계 이후 재검토 안건으로 보관.
5) **현재 빌드 태그 연동 가중 OFF(완전 무작위 픽) — 기각.** 완전 무작위는 "빌드 방향이 매 픽마다 흔들리는" 경험을 유발, 조합 육성 재미 약화. 태그 연동 가중은 "시너지를 향해 나아가는" 느낌의 구조적 기반이다. 가중 강도만 balance-designer가 조정.
---
## 9. 열린 이슈 (balance·content·ux 이관)
1) **[balance]** T1/T2/T3 레벨 구간별 비율 수치 — 픽이 너무 쉽거나 너무 어렵지 않은 곡선 설계 필요.
2) **[balance]** 태그 시너지 발동 K장 임계값 및 효과 강도.
3) **[content]** 카드 명칭·효과 텍스트·태그 세트 전체 리스트 — 조선 오행·퇴마 세계관 반영.
4) **[content]** T3 해제 조건 텍스트 (런 내 어떤 달성이 T3를 여는가).
5) **[ux]** 픽 UI 레이아웃·애니메이션·시너지 진행도 시각화 방식.
6) **[balance·content]** Lv.3 이후 재픽 시 재화 보상 vs 랜덤 변형 선택 — BM 방향과 연계하여 결정.
---
## 10. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 시스템 설계 초안 | BT6-Plan Phase 3-B PD 지시 | system-designer |

View File

@ -1,186 +0,0 @@
---
type: 시스템_설계
scope: 특성_시스템
author: system-designer
date: 2026-04-22
version: v0.1
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B
data_source: 03_진행_시스템_초안.md §5 / PD 코어 룰 9
status: 핵심 메카닉 골격 확정 — 특성 종류·효과·획득 조건 텍스트는 content-designer 이관
---
# 02. 특성 시스템
## 1. 목적
**이 시스템이 풀고자 하는 플레이어 문제**
"죽어도 완전히 제로로 돌아가지 않는다는 안도감, 그리고 많이 플레이할수록 내 캐릭터가 근본적으로 달라진다는 성장 체감"을 제공한다.
PD 코어 룰 9(특성 사망·레벨 초기화 유지)는 런 간 영속 성장의 구조적 근거다.
**제공하는 경험**
- 카드 전손(축 A)의 낙차를 "이번 런도 쌓였다"는 누적 감각으로 완충
- 런을 반복할수록 퇴마사가 점진적으로 변화하는 정체성 강화
- 특성 조합에 따라 다음 런의 빌드 방향이 달라지는 장기적 선택 재미
---
## 2. 코어 루프
```
조건 충족 이벤트 발생 (보스 처치 / 누적 도전 / 런 중 이벤트)
특성 후보 UI 표시 — 플레이어가 선택 or 자동 획득
특성 저장소(persistentDataPath JSON)에 즉시 기록
다음 런 시작 시 자동 적용
특성 효과가 카드·아이템·전투 수식자로 작동
```
---
## 3. 규칙
### 규칙 1. 특성 3축 구조
| 축 | 명칭 | 효과 방향 | 특징 |
|----|------|----------|------|
| A축 | **능력치 특성** | 기본 수치 상향 (공격력·이동 속도·i-frame 등) | 항상 가시적 효과, 단순 |
| B축 | **해금 특성** | 새 메카닉·카드 티어·조건 해제 | 플레이 폭 확장, 강한 체감 |
| C축 | **선택지 특성** | 픽 알고리즘 변형 or 빌드 방향 편향 | 전략 방향 결정, 조합 시 시너지 |
각 획득 조건에서 세 축 중 하나의 특성이 제공된다. 한 번의 조건 충족에서 복수 축이 동시 제공되지 않는다.
### 규칙 2. 획득 조건 3종
1) **보스 처치 보상** — 보스 클리어 직후 특성 후보 K장 중 1장 선택. K 수치는 balance-designer.
2) **누적 도전 과제** — 런 수·처치 수·사망 횟수 등 메타 누적값이 임계치 도달 시 자동 획득 (선택 없음).
3) **런 중 이벤트** — 스테이지 내 특수 조건(미탐색 구역 달성 등) 충족 시 즉시 획득. 선택형 or 자동형은 content-designer·balance-designer 결정.
### 규칙 3. 상호 배타(Exclusive) 쌍 체계
특성 중 일부는 **배타 쌍**으로 설계된다. 배타 쌍의 특성 A를 보유 중이면 특성 B가 획득 후보에서 제거된다.
- 배타 쌍은 B축(해금) 및 C축(선택지) 특성에 한정 적용한다.
- A축(능력치) 특성은 배타 없음 — 중복 획득 시 효과 누적.
- 배타 쌍 목록은 content-designer가 정의. 시스템은 보유 목록과 배타 맵을 조회해 후보 필터링만 수행.
### 규칙 4. 특성 슬롯 — 무제한
특성 보유 상한을 두지 않는다. 런을 반복할수록 특성이 누적되어 캐릭터가 변화하는 것이 본 시스템의 핵심 경험이다.
- **수치 특성 상한**: A축 특성이 동일 수치 항목에 누적되는 경우, 합산 상한 캡(cap)을 적용한다. 수치는 balance-designer 영역.
- 무제한 획득이 밸런스를 붕괴시키지 않도록 각 특성의 효과 강도를 balance-designer가 캡 기반으로 설계해야 한다.
### 규칙 5. 데이터 모델 (persistentDataPath JSON 초안)
개발팀 03에서 확정한 persistentDataPath 저장 방식을 따른다. 구조 초안:
```json
{
"traits": [
{
"id": "trait_001",
"axis": "B",
"acquired_at": "2026-01-01T00:00:00",
"exclusive_group": "exg_001"
}
],
"trait_version": 1
}
```
- `id`: 특성 고유 식별자 (content-designer 명명)
- `axis`: A/B/C 축 분류
- `acquired_at`: 획득 시각 (디버그·통계용)
- `exclusive_group`: 배타 쌍 그룹 ID. null이면 배타 없음
- `trait_version`: 데이터 스키마 버전 (향후 특성 추가·삭제 대응용 마이그레이션 플래그)
### 규칙 6. 리셋 조건 — 절대 리셋 없음 (기본)
특성은 **어떤 이유로도 초기화되지 않는다** (PD 코어 룰 9). 이것이 축 C(영속 성장)의 본질이다.
- **예외 조건**: PD님 명시 지시로 "초기화 옵션(재도전 콘텐츠용 리셋)"을 Phase 3-C BM 설계 시 재검토 가능. 현재 파일럿 스코프에서는 리셋 없음.
---
## 4. 상태와 전이
| 상태 | 설명 | 전이 조건 |
|------|------|----------|
| 미획득 | 특성 풀에 존재하나 플레이어 미보유 | 획득 조건 충족 + 플레이어 선택 or 자동 획득 → 보유 |
| 보유 | persistentDataPath에 기록, 효과 발동 | 절대 전이 없음 (리셋 없음 원칙) |
| 잠금(Locked) | 배타 쌍에 의해 획득 불가 상태 | 배타 특성 보유 → 잠금. 해제 조건 없음 |
---
## 5. 인풋 / 아웃풋
**입력**
- 보스 클리어 이벤트 (스테이지 시스템)
- 누적 도전 과제 임계치 도달 (메타 진행 데이터 감시)
- 런 중 이벤트 트리거
**시스템 반응**
- 특성 후보 UI 표시 (선택형) or 즉시 적용 알림 (자동형)
- JSON Write (persistentDataPath)
- 다음 런 시작 시 특성 효과 자동 로드
**필요한 피드백 종류 (ux-designer 연계)**
- 특성 획득 시 강조 연출 (영속 획득임을 체감하게)
- 현재 보유 특성 목록 UI (어떤 특성이 쌓였는지 확인 가능)
- 배타 특성 잠금 상태 시각화
---
## 6. 타 시스템 연동
| 연동 시스템 | 연동 방식 |
|------------|----------|
| **카드 시스템** (01_카드_시스템) | B축 특성이 픽 알고리즘 가중치 수정 or T2/T3 해제 조건 완화 |
| **전투 시스템** (04_전투_기본_스펙) | A축 특성이 공격·이동·i-frame 수치에 수식자 적용 |
| **스테이지 구조** (05_스테이지_구조_초안) | 보스 처치 이벤트 발화 → 특성 획득 트리거 |
| **개발팀 persistentDataPath** (개발팀 03) | JSON 저장·로드 구현 책임 (개발팀 영역) |
---
## 7. 엣지 케이스
1) **배타 쌍 전부 잠김으로 후보 소진**: 후보 풀에서 배타 필터 적용 후 0장이 되는 경우 → 배타 없는 A축 특성으로 강제 대체. content-designer가 A축 여분을 충분히 설계해야 한다.
2) **동일 특성 중복 획득 시도**: 이미 보유한 특성 ID가 후보에 나타나지 않도록 보유 목록 필터를 항상 먼저 적용.
3) **trait_version 불일치 (마이그레이션)**: 게임 업데이트로 특성 ID 변경·삭제 시 version 필드로 감지 → 구버전 ID는 무효 처리(손실 없이) + 마이그레이션 로직은 개발팀 책임.
4) **첫 런 (특성 0개)**: 특성 없이도 게임이 정상 작동해야 한다. 모든 특성 효과는 "있을 경우 추가 적용"이며, 기본 게임플레이는 특성 독립적으로 설계한다.
---
## 8. 기각안
1) **런 내 임시 특성(런 종료 시 소멸) — 기각.** 카드 시스템(축 A)과 역할 충돌. 03_진행_시스템_초안 §7 기각안 3번 계승. 런 내 임시 효과는 카드로 담당.
2) **특성 슬롯 N개 상한 — 기각.** 슬롯 상한은 "어떤 특성을 버릴까"라는 별도 결정 레이어를 요구하고, 영속 성장 경험을 "희소성 관리"로 왜곡한다. 축 C의 본질(도전 지속성 제공)이 무력화된다. 수치 캡(규칙 4)으로 밸런스를 제어하는 방향이 구조 단순성·경험 우위.
3) **특성 구매형(메타 재화 소모) — 기각.** BM 미확정 상태에서 런 간 재화 루프와 특성 획득을 결합하면 범위 초과. 획득 조건을 재화 종속으로 만들면 BM 방향에 따라 시스템 구조 전면 변경 필요. Phase 3-C BM 설계 이후 재검토 안건으로 보관.
4) **특성 선택 없이 전량 자동 획득 — 기각.** 자동 획득은 선택의 즐거움을 제거한다. 보스 처치 후 K장 선택 구조(규칙 2-1번)는 "이 특성을 선택하는 것이 내 빌드 방향에 맞는가"라는 소규모 전략 결정 지점을 제공한다. 단, 도전 과제 기반 자동 획득(규칙 2-2번)은 리워드 성격이므로 예외 허용.
---
## 9. 열린 이슈 (balance·content·ux·개발팀 이관)
1) **[content]** 특성 종류·ID·효과 텍스트 전체 리스트 — 3축 분류 + 조선 퇴마 세계관 반영 명칭.
2) **[content]** 배타 쌍 맵 정의 — 어떤 특성들이 배타 관계인가.
3) **[balance]** A축 특성 수치 캡 설정 — 어느 수준에서 성장을 막을 것인가.
4) **[balance]** 보스 처치 후 특성 후보 K장 수치.
5) **[content]** 누적 도전 과제 항목 및 임계값 설계.
6) **[ux]** 특성 획득 연출·보유 목록 UI·배타 잠금 시각화.
7) **[개발팀]** persistentDataPath JSON 스키마 최종 확정 + 마이그레이션 로직 구현.
---
## 10. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-22 | v0.1 시스템 설계 초안 | BT6-Plan Phase 3-B PD 지시 | system-designer |

View File

@ -1,112 +0,0 @@
---
type: 상세_기획
scope: 모바일_터치_UX
author: ux-designer
date: 2026-04-23
version: v0.1 (Phase 3-B)
project: EerieVillage
phase: Phase 3-B
data_source: BT5-Plan 04_전투_기본_스펙 v0.1 + BT5-Dev 03_게임_제작_준비
status: 확정 골격 — 수치 실측은 balance-designer + 개발팀 협의
---
# 01. 모바일 터치 UX
## 1. 재미 축 연결 (P30)
본 스킴이 강화하는 재미: **축 2 "액션 플랫포머 손맛"**. 가상 스틱·버튼의 즉각 반응(0.1초 이내)과 오입력 최소화 레이아웃이 이동·점프·공격의 체감 직결 요소다.
## 2. 조작 스킴 확정
| 액션 | PC 입력 | 모바일 입력 | 비고 |
|------|---------|------------|------|
| **이동** | WASD/방향키 | 좌측 가상 스틱 | 엄지 자연 안착 영역 |
| **점프** | Space | 우측 점프 버튼 | 오른 엄지 도달 상단 |
| **공격** | 마우스 좌클릭 | 우측 공격 버튼 | 오른 엄지 도달 하단 |
**결정 근거**: 04_전투_기본_스펙 §2 확정 스킴 계승. 단일 근거리 공격 1종으로 파일럿 시작 (공격 버튼 복수 기각안 계승).
## 3. 버튼 레이아웃 (화면 분할)
```
┌──────────────────────────────┐ ← 화면 상단 (HUD 영역)
│ [HUD] │
├──────────────────────────────┤
│ │
│ 플레이 영역 │
│ │
├────────────┬─────────────────┤
│ [가상스틱] │ [점프] [공격] │ ← 입력 영역
│ 왼손 엄지 │ 오른손 엄지 │
└────────────┴─────────────────┘
Safe Area (Home Indicator 회피)
```
- **가상 스틱 반지름**: 기본 60dp (BT 실측 전 후보값). 조이스틱 중심은 터치 다운 위치 추종
- **점프 버튼**: 우측 상단. 오른 엄지 자연 신전 위치
- **공격 버튼**: 우측 하단. 오른 엄지 굴곡 위치. 점프보다 크게 배치 (주요 인터랙션)
- **투명도**: 기본 70%, 입력 시 100% (비활성 구분 피드백)
- **Safe Area**: 노치(iOS) · 상태표시줄(Android) 상단 + Home Indicator/제스처바 하단 회피 의무 → SafeAreaBorder 컴포넌트 신규 구현 필요 (BT.Framework Tier 2 이관, §6 참조)
## 4. 입력 시스템 설계
Unity **Input System 액션 맵** 기반:
- `Move` (Value, Vector2) — 가상 스틱 → PC 키보드 WASD 동시 지원
- `Jump` (Button) — 점프 버튼 → Space
- `Attack` (Button) — 공격 버튼 → 마우스 좌클릭
**UITouchHandler** (BT.Framework Tier 2 신규 구현 예정): 가상 스틱 드래그 감도·데드존 처리 로직 캡슐화. 구현 전까지는 Unity OnScreenStick 임시 사용.
**즉각 반응 의무**: Input 감지 후 0.1초 이내 캐릭터 반응. 지연 시 플레이어가 입력 불인식으로 오인 (C7 피드백 원칙).
## 5. 피드백 설계
### 5-1. 피격 피드백 (3종 의무, 04_전투_기본_스펙 §6 계승)
| 피드백 종류 | 내용 | 인지 목표 |
|-------------|------|----------|
| **시각** | 화면 테두리 붉은 섬광 + 캐릭터 깜박임(i-frame 표시) | 0.3초 이내 인지 |
| **청각** | 피격 SFX (사운드팀 명세) | 즉시 인지 |
| **진동 (모바일)** | 짧은 진동 1회 (~80ms) | 즉각 체감 |
### 5-2. i-frame(무적 시간) 표시
- 피격 후 N ms 동안 캐릭터 스프라이트 **깜박임** (점멸 주기 80~120ms 후보)
- 깜박임 종료 = 무적 해제 → 플레이어 학습 가능한 시각 언어
- N 수치 (400~800ms)는 balance-designer + 개발팀 실측 확정
### 5-3. 버튼 입력 피드백
- 버튼 눌림 시 시각적 눌림 애니메이션(스케일 축소 0.9x, 50ms) 의무
- **성공 공격 적중** 시 짧은 진동 1회 (~40ms) — 손맛 강화 (재미 축 2)
## 6. BT.Framework 재사용 매핑
| BT.Framework | 활용 용도 | 구현 시점 |
|---|---|---|
| **Log** | 입력 이벤트 디버그 로그 | Tier 1 P0 즉시 |
| **ValidationEx** | 버튼 null 체크·스틱 범위 검증 | Tier 1 P0 즉시 |
| **MathEx** | 스틱 감도·데드존 보정 연산 | Tier 1 P0 즉시 |
| **SafeAreaBorder** | Safe Area 패딩 자동 적용 | Tier 2 신규 구현 후 |
| **UITouchHandler** | 스틱 드래그·버튼 멀티터치 처리 | Tier 2 신규 구현 후 |
| **BackKeyDispatcher** | Android 뒤로가기 키 → 일시정지 메뉴 | Tier 2 신규 구현 후 |
Tier 2 3종 미구현 상태 (BT5-Dev 3단계 실측 확인 — `Runtime/UI/Components/` 빈 디렉토리). 개발팀 이관 항목.
## 7. 기각안
1. **"스와이프 회피 제스처" — 기각.** 캐주얼 포지션에서 스와이프는 이동 입력과 오입력 충돌 위험 과다. 라이프 1 전제에서 오입력 즉사는 재미 축 2 붕괴. 회피 메커니즘 도입은 PD 결정 대상 (04_전투_기본_스펙 §7 보류 계승).
2. **"고정 위치 가상 스틱" — 기각.** 터치 다운 위치 추종 방식이 다양한 그립 스타일 수용성 높음. 고정 위치는 손 크기·그립 편차로 오입력 증가.
3. **"버튼 비표시(보이지 않는 탭 영역)" — 기각.** 버튼 시각 피드백 부재는 입력 성공 여부 불확실성 유발. 플레이어가 입력이 먹혔는지 의심하게 만들어 C7 피드백 원칙 위반.
## 8. 개발팀 이관 항목
- SafeAreaBorder · UITouchHandler · BackKeyDispatcher 컴포넌트 신규 구현 (BT.Framework Tier 2 승격 후 EerieVillage 편입)
- Input System 액션 맵 에셋 생성 + PC/모바일 바인딩 구성
- 피격 진동 Unity Handheld.Vibrate() 또는 플랫폼별 Haptic 구현
## 9. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-23 | v0.1 Phase 3-B 초기 확정 | BT6-Plan PD 지시 | ux-designer |

View File

@ -1,132 +0,0 @@
---
type: 상세_기획
scope: HUD_설계
author: ux-designer
date: 2026-04-23
version: v0.1 (Phase 3-B)
project: EerieVillage
phase: Phase 3-B
data_source: BT5-Plan 02_코어_루프 v0.1 + 04_전투_기본_스펙 v0.1
status: 확정 골격 — 세부 레이아웃 수치는 개발팀 협의
---
# 02. HUD 설계
## 1. 재미 축 연결 (P30)
HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전제)에서 HUD가 전달해야 할 것은 오직 "현재 상태"와 "다음 결정"이다. 한 화면에 한 가지 결정만 요구.
## 2. 인게임 HUD 요소
### 2-1. 정보 우선순위
| 우선순위 | 요소 | 이유 |
|---|---|---|
| **1순위** | 라이프 표시 (생존 여부) | 라이프 1 즉사 → 즉시 인지 필수 |
| **2순위** | 레벨 + 경험치 게이지 | 레벨업 카드 픽 트리거 예고 |
| **3순위** | 카드 슬롯 (현재 보유 카드) | 빌드 확인용, 전투 흐름 방해 금지 |
### 2-2. HUD 배치 (와이어프레임)
```
┌──────────────────────────────┐
│ [Lv.3 ████████░░] [♥] │ ← 좌상단: 레벨·경험치 + 라이프
│ [⚙] │ ← 우상단: 일시정지
├──────────────────────────────┤
│ │
│ 플레이 영역 │
│ │
│ [카드1][카드2][카드3] │ ← 하단: 카드 슬롯 (반투명)
│ [입력 영역] │
└──────────────────────────────┘
```
- **라이프 표시**: 하트 아이콘 1개. 피격 시 깜박임·소멸 애니메이션 (1초 이내 인지)
- **레벨·경험치 게이지**: 텍스트 + 바. FormatEx로 "Lv.N" 포맷 렌더링
- **카드 슬롯**: 보유 카드 아이콘 최대 N개 (N=balance-designer 결정). 소형·반투명으로 전투 방해 최소화
- **일시정지 버튼**: 우상단 고정. Safe Area 내 배치 의무
### 2-3. 보스전 추가 HUD
보스룸 진입 시 보스 HP 바 상단 출현:
- 보스 이름 + HP 바 (화면 상단 중앙)
- 보스 HP 0 도달 시 바 사라짐 + 처치 피드백 (성공 인지 1초 이내)
## 3. 레벨업 카드 픽 UI (분기 포인트 1)
**트리거**: 경험치 만렙 → `Time.timeScale = 0` 일시정지 → 카드 픽 화면 진입
```
┌──────────────────────────────┐
│ │
│ 레벨 업! Lv.N → Lv.N+1 │
│ │
│ [카드 A] [카드 B] [카드 C] │ ← 3장 선택
│ 설명 설명 설명 │
│ │
└──────────────────────────────┘
```
- **Canvas**: CardPickCanvas.prefab (Additive), timeScale 0에서도 정상 동작 (Unscaled Time 사용)
- **결정 압박 없음**: 시간 제한 없이 선택 가능 (캐주얼 포지션)
- **선택 피드백**: 카드 선택 시 하이라이트 + 확인 버튼 노출 → 실수 방지 2단계
- **선택 완료**: `Time.timeScale = 1` 복귀 + 카드 획득 시각 피드백
## 4. 마을 UI (허브 화면)
진입점: 게임 시작 / 사망 복귀 / 보스 처치 후 귀환
| 화면 | 역할 | 최소 정보 |
|------|------|----------|
| **스테이지 선택** | 다음 도전 스테이지 결정 | 스테이지 번호·난이도 표시 |
| **특성 목록** | 현재 보유 특성 확인 | 유지 자산 확인 (사망 후 안도감) |
| **아이템 슬롯** | 장착 아이템 현황 | 파츠별 1개 제한 가시화 |
| **출발 버튼** | 스테이지 진입 | 단일 CTA (Call-To-Action) |
- NPC 대화·상점은 Phase 3-C 이후 확장 (파일럿 제외)
- 화면 전환: 버튼 탭 → 씬 전환. 씬 전환 UX (페이드·연출)는 Phase 3-B 후속 과제
## 5. 사망·복귀 전환 UI
**목표**: 사망 낙차 감정을 1~2초 이내로 처리하여 "다시 하고 싶다" 루프 유지 (02_코어_루프 §6 계승)
1. **사망 연출**: 1~2초 (캐릭터 소멸 애니메이션)
2. **결과 표시**: "런 종료 / 레벨 N 도달 / 획득 경험 N" 1화면. 심플하게
3. **마을 복귀**: 로딩 느낌 없이 Additive Load 씬 전환 (VillageScene 상시 유지 방식)
4. **유지 자산 확인**: 마을 복귀 직후 아이템·특성 유지 표시 → 낙차 후 안도 제공
**인지 목표**: 사망부터 다음 스테이지 선택까지 5초 이내 (페이싱 유지).
## 6. BT.Framework 재사용 매핑
| BT.Framework | HUD 활용 용도 | 구현 시점 |
|---|---|---|
| **Log** | HUD 갱신 이벤트 디버그 | Tier 1 P0 즉시 |
| **FormatEx** | "Lv.N" · 경험치 수치 포맷 | Tier 1 P1 |
| **EnumEx** | 카드 슬롯 타입 enum 순회 | Tier 1 P2 |
| **SafeAreaBorder** | HUD 요소 Safe Area 자동 패딩 | Tier 2 신규 구현 후 |
## 7. 접근성 기본 원칙
- **색맹 대응**: 라이프·보스 HP는 색상 외 형태(아이콘·바 형태)로 이중 표현
- **텍스트 크기**: 최소 14sp (모바일 기준), 중요 수치는 18sp 이상
- **버튼 터치 영역**: 최소 44×44dp (Apple HIG / Google Material 공통 기준)
## 8. 기각안
1. **"미니맵 HUD 포함" — 기각.** 2D 횡스크롤 플랫포머에서 미니맵 정보 밀도가 손맛·집중을 저해. 스테이지 구조는 선형 진행 설계로 방향 혼란 없음. 추가 필요 시 Phase 3-C 재검토.
2. **"카드 슬롯 상시 크게 표시" — 기각.** 카드 슬롯은 빌드 확인 보조 정보. 전투 중 시선 분산 유발. 반투명 소형으로 유지하되 일시정지 시 풀 표시.
3. **"시간 제한 카드 픽" — 기각.** 캐주얼 포지션. 시간 제한은 긴장을 주지만 카드 텍스트 읽기 방해 → 빌드 이해도 하락 → 재미 축 1 "육성 카타르시스" 저해.
## 9. 개발팀 이관 항목
- CardPickCanvas.prefab + Unscaled Time 애니메이션 구현
- SafeAreaBorder 신규 구현 후 HUD Canvas에 적용
- 사망 결과 화면 씬 플로우 (Additive Load VillageScene 유지)
- FormatEx "Lv.N" · 경험치 바 UI 컴포넌트 구현
## 10. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-23 | v0.1 Phase 3-B 초기 확정 | BT6-Plan PD 지시 | ux-designer |