feat(BT7-Plan·집행): 기획 9파일 v0.2 + 개발팀 Phase 1 — PD 지시 11건 반영

- 기획 9파일 v0.2: VS 순수형·액티브/패시브/각성 3분류·Lv.5 스택·각성 3조건(액티브 Lv.5+필요 패시브+보물상자)·하트 분할 4 HP·적 ATK 1~4 점진·태그 11종 후보(PD 후속 검토 대기)·이동/점프 2종
- 개발팀 Phase 1 (Unity 외부 레포): PlayerAttackTicker 신설·Health maxHearts·Attack 액션 제거·AttackHitbox 쿼터 통합·EditMode 10→13 (Unity GitAutoSync 자동 push 담당)
- 대화로그: BT7 전체 9 엔트리 누적 (접수→방향 확정→4건 답변→규모→적 ATK→라이프→태그→Dev Phase 1→집행 종합)
- PD 지시 로그: 기획팀 BT7-Plan 11건 확정 비고란 + 개발팀 BT7-Dev 신규 등록(진행중)
- C6-1 백업 6종 `bak_20260424_1551` 표준 포맷
- narrative 3파일 미수정 (PD 2026-04-24 "현행 유지" 지시 준수)
- 매니페스트: 2026-04-24_BT7-Plan_집행착수 (범위 내 전수)
- pm-auditor 감사: 통과 (Critical·Major 0)
- C22-6 코어룰 신설: PD 문안 승인 대기 (별건)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
깃 관리자 2026-04-24 16:13:09 +09:00
parent 36d5d4d61a
commit 3bdda53104
21 changed files with 3653 additions and 442 deletions

View File

@ -0,0 +1,36 @@
---
name: 세션 시작 교훈 환기 6계층 운영 모니터링 보고서 (2026-04-24_1231)
description: BT4 6계층 체계 운영 데이터 누적 분석. pm-auditor 지속 모니터링 SOT 기반. 개선 안건 식별 + PD 보고
type: audit_pattern
period: 2026-04-24_1231
trigger: archive_entry_moved
---
# BT4 6계층 운영 모니터링 보고서 — 2026-04-24_1231
## 1. 트리거 상태
- project_context_조직운영_archive.md 엔트리 수: 2
## 2. 감사관 E안 자동 윈도우 실측
- pm-auditor: 7일
- dev-auditor: 7일
- plan-auditor: 7일
## 3. 계층별 발동 통계 (pm-auditor 수동 기입 영역)
- 계층 0 고정 주입: 매 세션 1회 (기본 전제)
- 계층 1 (1일): (기입)
- 계층 2 (2~7일): (기입)
- 계층 3 (>7일): (기입)
- 계층 4 (--extend=N): (기입)
- 계층 5 (내용축 트리거): (기입)
## 4. 개선 안건 (pm-auditor 수동 기입)
- (계층 추가·폐기·통합 / 트리거 조정 / 계층 0 대상 조정 / 감사관 윈도우 튜닝)
## 5. PD 결정 요청
- (pm-auditor 우선순위 기입)
## 연관
- `memory/org/feedback_session_restore_monitoring.md` (모니터링 SOT)
- `memory/org/project_context_조직운영.md` (트리거 기반)
- `scripts/recent_feedback_brief.sh` (6계층 구현)

View File

@ -33,6 +33,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------| |---|------|----------|----------|-----------|----------|----------|
| BT7-Dev | 2026-04-24 | **BT7-Plan 개발 집행 Phase 1** — VS 순수형 자동 발동(공격 버튼 제거, PlayerAttackTicker 주기 타이머) + 하트 분할 시스템(Health.maxHearts·QuartersPerHeart·IncreaseMaxHearts·Heal·Decrement(int)) + EditMode 테스트 갱신(10→13) + AttackHitbox 쿼터 단위 피해 통합 + TODO 주석(EnemyController.attackDamage balance v0.2 대기) | **진행중** | Unity 편집 6파일 · BT 산출물 2파일 · 백업 6종. **Unity 외부 레포 `D:/NerdNavis/EerieVillage/`**: `Assets/Scripts/Gameplay/{PlayerAttack.cs(개정), PlayerAttackTicker.cs(신설)+.meta}`·`Assets/Scripts/Mechanics/{Health.cs(전면개정), PlayerController.cs(Attack입력제거·Facing public), AttackHitbox.cs(Decrement(damage)통합)}`·`Assets/Settings/InputSystem_Actions.inputactions(Attack액션·바인딩 완전 제거)`·`Assets/Tests/Editor/PlayerAttackTests.cs(10→13)`. **BT 레포**: `프로젝트/EerieVillage/개발/06_BT7-Plan_VS순수형_재구조.md`(신설) · `공유/개발팀_백업/EerieVillage/*.bak_20260424_1551.*`(6종). PD 수동 검증 2종(Asset import+EditMode Runner 실행·Player.prefab에 PlayerAttackTicker 부착+Play 검증) | — | **PM 수행 대기**: pm-auditor 감사 → BT worktree commit → Unity 외부 레포는 PD Editor 실행 시 GitAutoSync 자동 push → Play 검증 결과(13 tests green + 자동 공격 발동 확인) 수령 → balance/01 v0.2 확정 후 후속 Phase(EnemyController·적 ATK 테이블·HUD 하트 UI) 분리 착수 → 완료 아카이브 이동 |
| BT5-Dev | 2026-04-23 | **EerieVillage Phase 3 파일럿 (개발)** — ①Unity git 초기화·자동 sync ②캐릭터 교체·이동·공격·i-frame ③템플릿 분석 ④**PlayerTestGirl 아틀라스 최종 집행** (2026-04-24 추가) | **진행중** | [1·3단계 완료] `9f689c1` 원격 push · `scripts/unity_auto_sync.sh` · `01~03_*.md` 분석 3종 [2단계 v0.2 완료] Player·Enemy prefab 편집 + 8 EditMode tests [**3단계(PlayerTestGirl 아틀라스) 완료 2026-04-24 0003**] PD `PlayerTestGirl.png` 직접 저장 (1536×1024, 4x2 8 sprite, walk 4+attack 4 프레임 신규 캐릭터) → B안 채택 (PlayerIdle·PlayerRun m_PPtrCurves 교체 + PlayerAttack.anim 신설). **meta 재생성** (9→8 sprite, 384×512 grid, guid 유지) · **Idle·Run.anim 전면 재작성** (4 sprite loop) · **PlayerAttack.anim + meta 신설** (guid `c8d7e5a1...`) · **Player.controller 확장** (attack Trigger·Player-Attack State·AnyState/Exit Transition 3종) · **Player.prefab m_Sprite 교체** · **EditMode 테스트 +2** (총 10). C6-1 백업 5종 `bak_20260424_0003`. PD 수동 1건 (Play 검증). `feedback_pm_image_verification_skip.md` 신설 (`tier: constitutional`) + `feedback_pm_dev_task_delegation_failure.md` 3회차 append. 재발 방지 5종 체크리스트 전부 이행 (시각 확인·전수 ls·기존 meta 재활용·guid 충돌 검증·백업 5종) | `프로젝트/EerieVillage/개발/05_PlayerTestGirl_아틀라스_적용.md` · `프로젝트/EerieVillage/개발/04_BT5-Dev_2단계_구현보고.md` v0.2 · Unity `Assets/Character/{Sprites/PlayerTestGirl.png.meta, Animations/{PlayerIdle,PlayerRun,PlayerAttack,Player.controller}}` · `Assets/Prefabs/Player.prefab` · `Assets/Tests/Editor/PlayerAttackTests.cs` · `memory/org/feedback_pm_image_verification_skip.md` (신설) · `memory/org/feedback_pm_dev_task_delegation_failure.md` (3회차) · `공유/대화로그/EerieVillage/2026-04-23.md` `[캐릭터리소스교체최종]` 엔트리 | — | **PM 수행 대기**: pm-auditor 감사 → BT worktree commit → push → Unity 프로젝트는 PD Editor 실행 시 GitAutoSync 자동 push → Play 검증 결과(10 tests green + walk/attack 애니메이션 재생) 수령 → 완료 아카이브 이동 | | BT5-Dev | 2026-04-23 | **EerieVillage Phase 3 파일럿 (개발)** — ①Unity git 초기화·자동 sync ②캐릭터 교체·이동·공격·i-frame ③템플릿 분석 ④**PlayerTestGirl 아틀라스 최종 집행** (2026-04-24 추가) | **진행중** | [1·3단계 완료] `9f689c1` 원격 push · `scripts/unity_auto_sync.sh` · `01~03_*.md` 분석 3종 [2단계 v0.2 완료] Player·Enemy prefab 편집 + 8 EditMode tests [**3단계(PlayerTestGirl 아틀라스) 완료 2026-04-24 0003**] PD `PlayerTestGirl.png` 직접 저장 (1536×1024, 4x2 8 sprite, walk 4+attack 4 프레임 신규 캐릭터) → B안 채택 (PlayerIdle·PlayerRun m_PPtrCurves 교체 + PlayerAttack.anim 신설). **meta 재생성** (9→8 sprite, 384×512 grid, guid 유지) · **Idle·Run.anim 전면 재작성** (4 sprite loop) · **PlayerAttack.anim + meta 신설** (guid `c8d7e5a1...`) · **Player.controller 확장** (attack Trigger·Player-Attack State·AnyState/Exit Transition 3종) · **Player.prefab m_Sprite 교체** · **EditMode 테스트 +2** (총 10). C6-1 백업 5종 `bak_20260424_0003`. PD 수동 1건 (Play 검증). `feedback_pm_image_verification_skip.md` 신설 (`tier: constitutional`) + `feedback_pm_dev_task_delegation_failure.md` 3회차 append. 재발 방지 5종 체크리스트 전부 이행 (시각 확인·전수 ls·기존 meta 재활용·guid 충돌 검증·백업 5종) | `프로젝트/EerieVillage/개발/05_PlayerTestGirl_아틀라스_적용.md` · `프로젝트/EerieVillage/개발/04_BT5-Dev_2단계_구현보고.md` v0.2 · Unity `Assets/Character/{Sprites/PlayerTestGirl.png.meta, Animations/{PlayerIdle,PlayerRun,PlayerAttack,Player.controller}}` · `Assets/Prefabs/Player.prefab` · `Assets/Tests/Editor/PlayerAttackTests.cs` · `memory/org/feedback_pm_image_verification_skip.md` (신설) · `memory/org/feedback_pm_dev_task_delegation_failure.md` (3회차) · `공유/대화로그/EerieVillage/2026-04-23.md` `[캐릭터리소스교체최종]` 엔트리 | — | **PM 수행 대기**: pm-auditor 감사 → BT worktree commit → push → Unity 프로젝트는 PD Editor 실행 시 GitAutoSync 자동 push → Play 검증 결과(10 tests green + walk/attack 애니메이션 재생) 수령 → 완료 아카이브 이동 |
--- ---

View File

@ -33,7 +33,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
| # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 |
|---|------|----------|----------|-----------|----------|----------| |---|------|----------|----------|-----------|----------|----------|
(활성 지시 없음 — BT6-Plan Phase 3-B 완료 아카이브 이동. Phase 3-C(BM·과금·세부 대사·보스 패턴 확장·아트 톤) PD 지시 수령 시 신규 등록) | BT7-Plan | 2026-04-24 | **카드 시스템 개정** — 1) 세계관(narrative) 현행 유지 2) 덱빌딩 방식 VS 순수형 확정 (공격 버튼 제거, 이동·점프만) 3) 카드 구조 **"액티브 + 패시브 = 각성"** 3분류 확정 4) **"3→4 변경" 폐기** (새 구조가 확정안) 5) **각성 조건 확정** (VS 원조 방식: 액티브 최대 강화 + 특정 패시브 + 보물상자) 6) **규모 확정** (액티브 15~20종·패시브 25종 이내·각성 15~20종) 7) **기본 라이프 4 + 젤다 방식 하트 분할 시스템** (♥ 아이콘 · **하트 1개 = 4 HP 확정** · 기본 시작 하트 1개 · 피해 1 = 1/4조각 감소 · 피해 2 = 반조각 감소 · 피해 4 = 하트 1개 소멸 · 카드/성장으로 최대 하트 수 증가 가능) 8) **적 공격력 1부터 점진 강화** (스테이지·등급 진행에 따라 ATK 수치 증가) 9) **동일 카드 스택 업그레이드 Lv.5까지** (기존 Lv.3 확장) 10) **각성 발동 조건 VS 원작 동일 재확인** (액티브 Lv.5 + 각성에 필요한 특정 패시브 1개 이상 보유 + 보물상자 → 각성 카드 등장·발동) 11) **태그 체계 일반 RPG 용어 사용** (기존 세계관 특화 "오행 불/물/목/금/토" · "결계/부적/주술/소환" 등 임시 일반 RPG 용어로 재작성. 용어 자체는 PD가 나중에 일괄 세계관 재매핑 예정) | **진행중** | [확정 방향] VS 순수형 + 액티브/패시브/각성 구조 + 각성 조건 VS 원조 그대로 + 규모 15~20/≤25/15~20 + 라이프 4 하트 분할 + 적 ATK 점진 강화 · [폐기] T1~T4 빌드업·"비전/각성" 레이블·A/B 선택지·티어 수량 개념·적 ATK 1(즉사) 설계·"라이프 1 고정" 해석·`system/01 §5 기각안 1` "HP 막대 기각"·`04_전투 §8 기각안 1` "HP 막대 변형 기각" · [잔존 참조] `프로젝트/EerieVillage/기획/system/03_덱빌딩_방식_검토.md` 는 방식 비교 근거만 유효 · 대화로그 `공유/대화로그/EerieVillage/2026-04-24.md` | — | **PD 추가 지시 대기 잔존 0건 — BT7-Plan 방향 완전 확정**. 개정 집행 착수 가능 상태 → 확정분은 즉시 `04_전투`·`ux/01`·`balance/01`·`system/01`·`content/01`·`balance/02`·`ux/02`·`01_게임_컨셉`·`02_코어_루프` 순차 개정 착수 가능 + 개발팀 `PlayerAttack.cs` 주기 타이머 전환 + `InputActions` Attack 제거 + `Health.cs` maxHP 가변+쿼터 단위 구조 |
--- ---

View File

@ -0,0 +1,92 @@
using System.Collections.Generic;
using Platformer.Gameplay;
using UnityEngine;
using static Platformer.Core.Simulation;
namespace Platformer.Mechanics
{
/// <summary>
/// 플레이어 근거리 공격 판정 박스.
/// PlayerAttack 이벤트에서 Fire(direction)를 호출하면 지정 활성 지속 시간 동안
/// OverlapBox 로 적을 감지하고, Health 보유 적에 Decrement 적용 → EnemyDeath 체인.
/// 기획 04 §5-1 근거리 공격 1종 — 쿨타임·대미지·판정 박스는 Phase 3-B 튠 대상.
/// </summary>
public class AttackHitbox : MonoBehaviour
{
[Header("판정 박스 크기 (플레이어 기준 로컬)")]
public Vector2 size = new Vector2(1.2f, 0.9f);
[Tooltip("플레이어 중심으로부터 공격 방향으로의 오프셋 거리")]
public float offsetDistance = 0.7f;
[Tooltip("판정 활성 지속 시간 (초). 정적 스프라이트 기반이면 짧게 유지")]
public float activeDuration = 0.12f;
[Tooltip("대미지 (Health.Decrement 호출 횟수)")]
public int damage = 1;
[Header("타격 대상 레이어 마스크")]
public LayerMask targetLayers = ~0; // 전 레이어 기본. 실전에서 Enemy 레이어로 제한 권장
float activeUntil = -1f;
Vector2 lastDirection = Vector2.right;
// 같은 스윙으로 동일 Health 중복 타격 방지
readonly HashSet<Health> alreadyHit = new HashSet<Health>();
/// <summary>
/// PlayerAttack.Execute 에서 호출. direction은 플레이어 facing (x축 ±1 or 0).
/// </summary>
public void Fire(Vector2 direction)
{
if (Mathf.Abs(direction.x) > 0.01f) lastDirection = new Vector2(Mathf.Sign(direction.x), 0);
activeUntil = Time.time + activeDuration;
alreadyHit.Clear();
}
void Update()
{
if (Time.time > activeUntil) return;
// 로컬 오프셋: 플레이어 중심 + facing * offsetDistance
var center = (Vector2)transform.position + lastDirection * offsetDistance;
// OverlapBox로 적 검출
var hits = Physics2D.OverlapBoxAll(center, size, 0f, targetLayers);
foreach (var col in hits)
{
if (col == null) continue;
// 자기 자신 collider 제외 (PlayerController 부착 GameObject)
if (col.transform == transform || col.transform.IsChildOf(transform)) continue;
var health = col.GetComponent<Health>();
if (health == null || !health.IsAlive) continue;
if (alreadyHit.Contains(health)) continue;
alreadyHit.Add(health);
// BT7-Plan TODO (2026-04-24): 적 Health도 하트 분할 시스템 대상이지만
// i-frame 구조 탓에 Decrement() 반복 호출은 첫 호출 후 무효화된다.
// Health.Decrement(int damage) 단일 호출로 쿼터 단위 다중 피해 전달.
health.Decrement(damage);
// Enemy 즉사 시 EnemyController 기반 EnemyDeath 체인 발동 (선택)
if (!health.IsAlive)
{
var enemy = col.GetComponent<EnemyController>();
if (enemy != null)
{
Schedule<EnemyDeath>().enemy = enemy;
}
}
}
}
// Scene view 가시화 — 활성 상태에서 박스 표시
void OnDrawGizmos()
{
Gizmos.color = (Application.isPlaying && Time.time <= activeUntil)
? new Color(1f, 0.3f, 0.3f, 0.6f)
: new Color(1f, 1f, 1f, 0.2f);
var dir = Application.isPlaying ? lastDirection : Vector2.right;
var center = (Vector2)transform.position + dir * offsetDistance;
Gizmos.DrawWireCube(center, size);
}
}
}

View File

@ -0,0 +1,96 @@
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>
/// 무적 시간 (i-frame) 지속 초 단위. 기획 04 §3-2 후보 0.4~0.8s.
/// 라이프 1 전제에서 연속 히트 인정 금지를 위한 핵심 장치 (BT5-Dev 2단계 신설).
/// </summary>
public float invulnerableDuration = 0.6f;
/// <summary>
/// 현재 무적 상태 여부 (디버그·UX 피드백용 — 깜박임 제어 등에 사용 가능).
/// </summary>
public bool IsInvulnerable => Time.time < invulnerableUntil;
/// <summary>
/// Indicates if the entity should be considered 'alive'.
/// </summary>
public bool IsAlive => currentHP > 0;
int currentHP;
float invulnerableUntil = -1f;
/// <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. 무적 시간 (i-frame) 내에는 호출되어도 스킵된다.
/// </summary>
public void Decrement()
{
// BT5-Dev 2단계: i-frame 보호 — 무적 시간 내 중복 피격 차단
if (Time.time < invulnerableUntil)
{
return;
}
currentHP = Mathf.Clamp(currentHP - 1, 0, maxHP);
// 피격 성공 시 무적 시간 활성화 (다음 피격 대비)
if (invulnerableDuration > 0f)
{
invulnerableUntil = Time.time + invulnerableDuration;
}
if (currentHP == 0)
{
var ev = Schedule<HealthIsZero>();
ev.health = this;
}
}
/// <summary>
/// Decrement the HP of the entitiy until HP reaches 0.
/// i-frame 우회하여 즉사 처리 (낙사·승리 이탈 등 시스템 강제 사망).
/// </summary>
public void Die()
{
invulnerableUntil = -1f; // i-frame 무효화
while (currentHP > 0)
{
currentHP = Mathf.Clamp(currentHP - 1, 0, maxHP);
if (currentHP == 0)
{
var ev = Schedule<HealthIsZero>();
ev.health = this;
break;
}
}
}
void Awake()
{
currentHP = maxHP;
}
}
}

View File

@ -0,0 +1,837 @@
{
"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": "Attack",
"type": "Button",
"id": "c9d8e7f6-a5b4-4c3d-2e1f-0a9b8c7d6e5f",
"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": "d7e6f5a4-b3c2-4d1e-9f8a-7b6c5d4e3f2a",
"path": "<Mouse>/leftButton",
"interactions": "",
"processors": "",
"groups": ";Keyboard&Mouse",
"action": "Attack",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "e8f7a6b5-c4d3-4e2f-1a9b-8c7d6e5f4a3b",
"path": "<Gamepad>/rightTrigger",
"interactions": "",
"processors": "",
"groups": ";Gamepad",
"action": "Attack",
"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

@ -0,0 +1,43 @@
using Platformer.Core;
using Platformer.Mechanics;
using UnityEngine;
using static Platformer.Core.Simulation;
namespace Platformer.Gameplay
{
/// <summary>
/// Fired when the player triggers an attack (mouse left click / touch attack button).
/// EerieVillage BT5-Dev 2단계 신설 — 기획 04 §5 근거리 공격 1종 파일럿.
/// OnExecute 훅으로 카드 효과·특성 효과가 결합될 확장 지점 (개발 02 §2-1).
/// </summary>
public class PlayerAttack : Simulation.Event<PlayerAttack>
{
public PlayerController player;
public Vector2 direction; // 플레이어 facing 방향 (±1, 0)
public override void Execute()
{
if (player == null) return;
// 공격 애니메이션 트리거 (Animator에 "attack" trigger 있으면 재생 — 정적 스프라이트면 무시)
if (player.animator != null)
{
var attackHash = Animator.StringToHash("attack");
// SetTrigger는 미존재 파라미터여도 예외 없음
player.animator.SetTrigger(attackHash);
}
// 공격 효과음 (존재 시)
if (player.audioSource != null && player.attackAudio != null)
{
player.audioSource.PlayOneShot(player.attackAudio);
}
// 플레이어 앞에 판정 박스 발생
if (player.attackHitbox != null)
{
player.attackHitbox.Fire(direction);
}
}
}
}

View File

@ -0,0 +1,186 @@
using System.Linq;
using NUnit.Framework;
using UnityEngine;
using UnityEditor;
/// <summary>
/// EerieVillage BT5-Dev 2단계 — Player 근거리 공격 체계 EditMode 테스트.
/// Prefab 자산의 컴포넌트 구성이 기획 04 §5-1 (근거리 공격 1종) 을 충족하는지 검증.
/// Play 모드 실행 불요 — prefab YAML 직렬화 상태를 직접 검증하여 회귀 방지.
///
/// 2026-04-23 개정: Platformer.* 네임스페이스 직접 참조 제거 (Scripts/ 하위에 asmdef 부재로
/// 테스트 어셈블리가 Assembly-CSharp 를 참조 불가한 구조 — reflection 기반으로 전환).
/// </summary>
public class PlayerAttackTests
{
const string PlayerPrefabPath = "Assets/Prefabs/Player.prefab";
const string EnemyPrefabPath = "Assets/Prefabs/Enemy.prefab";
// Platformer.* 는 Assembly-CSharp 에 속함. 테스트 어셈블리에서 직접 타입 참조 불가하므로
// GetComponents<Component>() + GetType().FullName 매칭으로 검증.
const string AttackHitboxType = "Platformer.Mechanics.AttackHitbox";
const string HealthType = "Platformer.Mechanics.Health";
const string PlayerControllerType = "Platformer.Mechanics.PlayerController";
const string EnemyControllerType = "Platformer.Mechanics.EnemyController";
static Component FindComponentByFullName(GameObject go, string fullName)
{
if (go == null) return null;
return go.GetComponents<Component>()
.FirstOrDefault(c => c != null && c.GetType().FullName == fullName);
}
static object GetFieldOrProperty(object obj, string memberName)
{
if (obj == null) return null;
var t = obj.GetType();
var field = t.GetField(memberName,
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
if (field != null) return field.GetValue(obj);
var prop = t.GetProperty(memberName,
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
return prop?.GetValue(obj);
}
[Test]
public void Player_Prefab_Has_AttackHitbox_Component()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PlayerPrefabPath);
Assert.IsNotNull(prefab, $"Player.prefab not found at {PlayerPrefabPath}");
var hitbox = FindComponentByFullName(prefab, AttackHitboxType);
Assert.IsNotNull(hitbox,
"Player.prefab에 AttackHitbox 컴포넌트가 누락. " +
"BT5-Dev 2단계 재위임 집행분 (2026-04-23) 이 prefab YAML 에 반영되어야 함.");
}
[Test]
public void Player_Prefab_Has_Health_Component()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PlayerPrefabPath);
Assert.IsNotNull(prefab, $"Player.prefab not found at {PlayerPrefabPath}");
var health = FindComponentByFullName(prefab, HealthType);
Assert.IsNotNull(health, "Player.prefab 에 Health 컴포넌트 누락 (템플릿 기본).");
}
[Test]
public void Player_Prefab_Has_PlayerController_Component()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PlayerPrefabPath);
Assert.IsNotNull(prefab);
var controller = FindComponentByFullName(prefab, PlayerControllerType);
Assert.IsNotNull(controller, "Player.prefab 에 PlayerController 컴포넌트 누락.");
}
[Test]
public void AttackHitbox_Default_Damage_Is_One()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PlayerPrefabPath);
var hitbox = FindComponentByFullName(prefab, AttackHitboxType);
Assert.IsNotNull(hitbox);
var damage = GetFieldOrProperty(hitbox, "damage");
Assert.IsNotNull(damage, "AttackHitbox.damage 필드/프로퍼티 접근 불가");
Assert.AreEqual(1, System.Convert.ToInt32(damage),
"기본 대미지 1 (기획 04 §5-1, Phase 3-B 튠 전 파일럿 값).");
}
[Test]
public void AttackHitbox_Active_Duration_Is_Positive()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(PlayerPrefabPath);
var hitbox = FindComponentByFullName(prefab, AttackHitboxType);
Assert.IsNotNull(hitbox);
var duration = GetFieldOrProperty(hitbox, "activeDuration");
Assert.IsNotNull(duration, "AttackHitbox.activeDuration 필드/프로퍼티 접근 불가");
Assert.Greater(System.Convert.ToSingle(duration), 0f,
"activeDuration 가 0 이하면 OverlapBox 판정이 즉시 종료되어 공격 무효.");
}
[Test]
public void Enemy_Prefab_Has_Health_Component()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(EnemyPrefabPath);
Assert.IsNotNull(prefab, $"Enemy.prefab not found at {EnemyPrefabPath}");
var health = FindComponentByFullName(prefab, HealthType);
Assert.IsNotNull(health,
"Enemy.prefab 에 Health 컴포넌트 누락. " +
"BT5-Dev 2단계 재위임 집행분 (2026-04-23) 이 prefab YAML 에 반영되어야 함. " +
"Health 없으면 AttackHitbox.Update 의 Decrement 호출이 불가 → EnemyDeath 체인 미발동.");
}
[Test]
public void Enemy_Prefab_Health_MaxHP_Is_One()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(EnemyPrefabPath);
var health = FindComponentByFullName(prefab, HealthType);
Assert.IsNotNull(health);
var maxHP = GetFieldOrProperty(health, "maxHP");
Assert.IsNotNull(maxHP, "Health.maxHP 필드/프로퍼티 접근 불가");
Assert.AreEqual(1, System.Convert.ToInt32(maxHP),
"일반 적 기본 maxHP 1 (코어 룰 7 정합, 첫 세팅).");
}
[Test]
public void Enemy_Prefab_Has_EnemyController_Component()
{
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(EnemyPrefabPath);
var controller = FindComponentByFullName(prefab, EnemyControllerType);
Assert.IsNotNull(controller,
"EnemyDeath 체인에 EnemyController 필수 (AttackHitbox.Update 에서 Schedule<EnemyDeath>().enemy = enemy).");
}
// ===== BT5-Dev 3단계 PlayerTestGirl 아틀라스 적용 검증 (2026-04-24) =====
const string PlayerTestGirlGuid = "44ad58ba82191ca4d818108ab01d3baa";
[Test]
public void Player_Prefab_SpriteRenderer_References_PlayerTestGirl()
{
// Player.prefab YAML 직접 파싱 — SpriteRenderer.m_Sprite 의 guid 가
// PlayerTestGirl.png.meta 의 guid 와 일치하는지 검증. 기존 PlayerIdle(
// ba86c7b200abe499cb750833482830b3) 에서 PlayerTestGirl 로 교체되었는지 회귀 확인.
var path = System.IO.Path.GetFullPath(PlayerPrefabPath);
Assert.IsTrue(System.IO.File.Exists(path), $"Player.prefab 부재 — {path}");
var yaml = System.IO.File.ReadAllText(path);
// m_Sprite: {fileID: ..., guid: <GUID>, type: 3}
var match = System.Text.RegularExpressions.Regex.Match(
yaml,
@"m_Sprite:\s*\{fileID:\s*[-0-9]+,\s*guid:\s*([a-f0-9]{32}),\s*type:\s*3\}");
Assert.IsTrue(match.Success,
"Player.prefab YAML 에서 SpriteRenderer.m_Sprite guid 추출 실패.");
Assert.AreEqual(PlayerTestGirlGuid, match.Groups[1].Value,
$"Player.prefab SpriteRenderer.m_Sprite guid 가 PlayerTestGirl({PlayerTestGirlGuid}) 이어야 함. 실제: {match.Groups[1].Value}");
}
[Test]
public void Player_Controller_Has_Attack_Parameter_And_State()
{
// Player.controller YAML 직접 파싱 — attack Trigger 파라미터 + Player-Attack State 존재 검증.
// BT5-Dev 3단계에서 PlayerAttack.cs 의 Schedule<PlayerAttack> 과 연동되는 State Machine 요소가
// controller 에 명시되었는지 회귀 확인.
var path = System.IO.Path.GetFullPath("Assets/Character/Animations/Player.controller");
Assert.IsTrue(System.IO.File.Exists(path), $"Player.controller 부재 — {path}");
var yaml = System.IO.File.ReadAllText(path);
// m_Name: attack 파라미터 + m_Type: 9 (Trigger)
Assert.IsTrue(
System.Text.RegularExpressions.Regex.IsMatch(
yaml,
@"m_Name:\s*attack\s*\r?\n\s*m_Type:\s*9"),
"Player.controller 에 attack Trigger 파라미터(m_Type:9) 누락. " +
"BT5-Dev 3단계 PlayerAttack State 연동 전제.");
// Player-Attack State 존재
Assert.IsTrue(
yaml.Contains("m_Name: Player-Attack"),
"Player.controller 에 Player-Attack State 누락. " +
"PlayerAttack.anim(guid c8d7e5a1f9b24e63a7f5d2c8e1b9a4f7) 모션을 호스트하는 State 가 필요.");
}
}

View File

@ -0,0 +1,189 @@
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>
/// Attack sound effect (BT5-Dev 2단계 신설). 미지정 시 무음.
/// </summary>
public AudioClip attackAudio;
/// <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;
/// <summary>
/// Cooldown between attacks in seconds (기획 04 §5-1 Phase 3-B 튠 대상).
/// </summary>
public float attackCooldown = 0.35f;
/// <summary>
/// Attack hitbox component (자동 GetComponent, 없으면 null — PlayerAttack.Execute에서 null 체크).
/// </summary>
public AttackHitbox attackHitbox;
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;
private InputAction m_AttackAction;
// 마지막 공격 시각 — attackCooldown과 비교해 연타 제한
float nextAttackTime = 0f;
// 현재 facing 방향 (마지막 이동 입력 기반, 정지 시 이전 값 유지)
Vector2 facing = Vector2.right;
public Bounds Bounds => collider2d.bounds;
void Awake()
{
health = GetComponent<Health>();
audioSource = GetComponent<AudioSource>();
collider2d = GetComponent<Collider2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
animator = GetComponent<Animator>();
if (attackHitbox == null) attackHitbox = GetComponent<AttackHitbox>();
m_MoveAction = InputSystem.actions.FindAction("Player/Move");
m_JumpAction = InputSystem.actions.FindAction("Player/Jump");
m_AttackAction = InputSystem.actions.FindAction("Player/Attack");
m_MoveAction.Enable();
m_JumpAction.Enable();
if (m_AttackAction != null) m_AttackAction.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;
}
// 공격 입력 처리 (마우스 좌클릭 / 게임패드 RT / 모바일 터치 — Phase 3-B UX)
if (m_AttackAction != null && m_AttackAction.WasPressedThisFrame() && Time.time >= nextAttackTime)
{
nextAttackTime = Time.time + attackCooldown;
var ev = Schedule<PlayerAttack>();
ev.player = this;
ev.direction = facing;
}
}
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;
facing = Vector2.right;
}
else if (move.x < -0.01f)
{
spriteRenderer.flipX = true;
facing = Vector2.left;
}
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

@ -0,0 +1,782 @@
# 대화로그 — EerieVillage — 2026-04-24
> **프로젝트**: 기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist
> **조직**: BurningTimes
> **기록 근거**: C32 대화로그 기록 의무 (헌법급)
---
## [BT7-Plan 접수·위임] 카드 시스템 개정 검토 — 4티어 + 덱빌딩 방식 비교
**태그**: #BT7-Plan #PD지시 #카드시스템개정 #기획팀장위임 #4티어 #덱빌딩방식비교
**트리거**: PD 2026-04-24 직접 지시 2건
1. 세계관(narrative) 추가 진행 중단 — PD 직접 보완 예정. 기존 narrative/01·02·03 3종 현행 유지
2. 카드 시스템 개정 검토 — (a) 티어 3→4 확장 (b) 덱빌딩 방식 Slay the Spire vs Vampire Survivors 비교·제안
### PM 집행 절차 (C29-1 단계 1 팀 논의 · 단계 2 PM 조율)
1. **매니페스트 등록**: `2026-04-24_BT7-Plan_덱빌딩검토접수` (target_files: PD 지시 로그 + system/03 검토 문서)
2. **PD 지시 로그 등록**: 기획팀 활성 테이블 BT7-Plan 신규 추가 (`진행중` 상태)
3. **기획팀장 Agent 위임**: 상세 프롬프트 8섹션 요구사항 + 선행 Read 8개 파일 의무 + 유지 제약 5축 + C5·C11·C14-5·C23·C30·C32·C34-11·P30 규칙 준수 명시
### 기획팀장 Agent 산출물
**`프로젝트/EerieVillage/기획/system/03_덱빌딩_방식_검토.md`** (229 라인, YAML frontmatter 포함)
#### 핵심 결론
- **권장 덱빌딩 방식**: **Vampire Survivors 하이브리드**
- 플레이어 이동·점프·근거리 검 공격 수동 유지 (축 2 손맛 보존)
- 카드 효과는 태그별 이원화: `[공격]`·`[방호]`·`[속도]` = 수동 강화형 / `[부적]`·`[소환]`·`[주술]`·`[폭발]`·`[회복]` = 자동 발동형
- 레벨업 3픽 + 동일 카드 스택 업그레이드 골격 유지
- **4티어 구조 권장**: T2·T3 **사이에 "비전(祕傳)" 삽입**
- T1 기본(普通) → T2 숙련(鍛鍊) → **T3 비전(祕傳) [신규]** → T4 각성(覺醒) [구 T3]
- 해제 조건: T2=Lv.3+ / T3=Lv.5+ & 주력 태그 2장 / T4=Lv.7+ & 보스 처치 1회
- 32장 재분배: T1 12 · T2 10 · T3 7 · T4 3
#### 결정적 발견 (실측 기반)
현 기획 문서 내부 불일치 실측:
- `system/01` 3티어 (T1·T2·T3)
- `content/01` 3티어 (1·2·3)
- `balance/02` **이미 4티어 확률 테이블 존재** (Common·Uncommon·Rare·Epic)
→ PD 지시 "3→4 변경"은 기존 balance 선행 설계와 정합 확보 방향. system·content를 balance에 맞춰 통일.
#### 적합성 평가 (유지 제약 5축 10점 척도)
| 제약 축 | STS | VS |
|---|---|---|
| 모바일 조작 | 3/10 | 9/10 |
| 라이프 1 | 4/10 | 8/10 |
| 2D 액션 플랫포머 (축 2) | 1/10 | 7/10 |
| 재미 축 1 육성 롤러코스터 | 8/10 | 9/10 |
| 32장 스코프 | 6/10 | 9/10 |
| **종합** | **22/50 (44%)** | **42/50 (84%)** |
#### 기각안 6건 (C32 최소 3건 초과 달성)
1. STS 순수 채택 — 축 2 구조적 포기 (템플릿 선택 전제 부정)
2. VS 순수 채택 (이동만) — 근거리 검 조작감 상실
3. 4티어 최상위(T3 위) 추가 — balance/02 Epic 확률 테이블 충돌·체감 희박화 과도 (차선)
4. 4티어 T1 아래 추가 (초심자 티어) — T1 의미 중복·런 초반 선택지 과다
5. 카드 풀 32장 확장 — content/01 §5 기각 계승, 4티어 재분배로 볼륨 조정 충분
6. T3 비전 정적 판정 해제 — VS 실시간 성장 감각 약화, 동적 판정 유지
#### 개정 영향 범위 (PD 방향 결정 후 순차 집행)
| 파일 | 개정 요지 |
|---|---|
| `system/01_카드_시스템.md` | 3→4티어 확장, 픽 알고리즘에 T3 비전 태그 보너스 추가, 카드 발동 분류 컬럼 추가 |
| `content/01_카드_풀.md` | 티어 4종 재매핑, 32장 재분배, 자동 vs 수동 분류 신규 |
| `balance/01_전투_수치.md` | CardMultiplier 범위 재검토, 자동 발동 DPS 기여도 분석 |
| `balance/02_레벨업_곡선.md` | 4티어 확률 테이블 레이블 재매핑, 해제 조건 정합성 검증 |
| `ux/02_HUD_설계.md` | 카드별 자동·수동 아이콘 구분, T3 비전 등장 태그 보너스 시각 피드백 |
### 규칙 준수 검증
- **C5 정직성**: STS·VS 장르 특성 사실 기반, 추정 항목 "추정" 명시 (Dead Cells 선례·분당 입력 등)
- **C11 개발 관점**: 구현 복잡도 평가 포함 (BT.Framework Tier 1 5종·PlatformerMicrogame Simulation 활용)
- **C14-5**: 본문 최신 원칙 준수
- **C23**: 선행 Read 8개 파일 실측 기반 판단 (balance/02 4티어 기존 존재 실측 발견)
- **C30**: 기존 기획 파일 전수 선행 Read
- **C32 기각안**: 6건 기록
- **C34-11**: 상대 경로만 사용
- **C36**: 본 문서는 제안 단계, PM 재량으로 방향·원칙 수준 축소하지 않음 (PD 결정 대기)
- **P30**: 재미 축 3종 기준 판단
### 공유 상태
내부 공유 (C21-① · 로컬 commit 예정). PD 방향 결정 시점에 상세 개정 집행 + "세션 공유" 지시로 main push (C21-②).
### 다음 단계 (PD 결정 대기)
1. 덱빌딩 방식 3안 중 택1 (VS 하이브리드 권장 / VS 순수 / STS 변형)
2. 4티어 구조 2안 중 택1 (T2·T3 중간 권장 / T3 위 차선)
3. PD 승인 후 system/01·content/01·balance/01·02·ux/02 5개 파일 순차 개정 집행
---
## [BT7-Plan 방향 재설정] PD 직접 지시 — VS 순수형 + "액티브+패시브=각성" 확정
**태그**: #BT7-Plan #PD확정지시 #VS순수형 #액티브패시브각성 #T1-T4폐기 #PM위반자진고지
### PD 직접 지시 연쇄 (동일 세션 후속)
1. **VS 순수형 확정**: "공격 버튼은 필요 없이 오직 이동과 점프만 존재하면 돼 따라서 VS(뱀파이어 서바이벌) 방식이 적합할거 같아"
→ 공격 버튼 제거. 플레이어 조작 = 이동·점프 2종. 공격은 자동 발동
2. **"T1~T4 빌드업"은 무엇인가 질의** → PM이 티어 설명했으나 PD가 **"빌드업 형식으로 구성한 이유"** 재질의
→ PM 자진 고지: VS 방식 채택 선언해놓고 실제 VS 구조(액티브+패시브=각성)를 반영 않고 기존 3티어 계단 구조의 수량 확장으로만 해석함. **C2-1 근본 원인 재정의 의무 위반**
3. **카드 구조 확정**: "'액티브 + 패시브 = 각성' 구조를 EerieVillage 카드 시스템의 확정 방향으로 지시한거야"
→ 기존 T1~T4 빌드업 구조·"비전/각성" 레이블·A/B 선택지·장수 분배(12·10·7·3)·해제 조건 수치 전부 폐기
### PM 위반 자진 고지 (C22-6 코어룰 신설 계기)
PD 직접 지적: "앞으로는 너 혼자 아는 용어나 선택지로 내게 선택을 강요하지 마! 안건 번호도 네 멋대로 부여하지 말고, 규칙에 따라 일정한 넘버링으로 보고하지 않은 안건을 멋대로 넘겨짚고 진행하지 않도록 코어 룰에 반영해"
**위반 행위 3종**:
1. PD 미합의 용어 일방 신설 ("비전(祕傳)"·"각성(覺醒)"·"수동 강화형/자동 발동형" 등)
2. 자의 선택지 식별자 부여 ("A안·B안" — C25-1 고정 위계 위반)
3. 미보고 안건 넘겨짚기 (해제 조건·장수 분배 PD 확인 없이 기정사실화)
**위반 규칙**: C5 · C22 · C23 · C25 · C36
### C22-6 코어룰 신설 초안 제출 (PD 문안 승인 대기)
`C22. 용어·식별자 일관 사용 의무`**C22-6 신설** 초안 제출:
- PM·하위 에이전트가 PD 미합의 용어·식별자·선택지·안건을 일방 구성하여 PD께 결정 요구 금지
- 신규 용어 도입 시 사전 설명·합의 단계 강제
- C25-1 고정 위계(1./1)/A./가)) 선순 적용 의무
- 미보고 안건 PM 넘겨짚기 금지
- 하위 에이전트 산출물 내 신규 용어도 PM이 PD 보고 전 사전 합의 강제
**후속 조치 대기** (PD 승인 후):
- SKILL.md C22-6 추가
- `memory/org/feedback_pm_unilateral_proposal.md` 신설 (2026-04-24 실증 SOT)
- C31-J 체크리스트 신설 (용어·식별자 자의 도입 감지)
- pm-auditor 감사 영역 7번 신설
- C10-6 3중 전파
### BT7-Plan 현재 상태
**PD 확정 사항** (즉시 효력):
- 세계관(narrative/01·02·03) 현행 유지, 추가 진행 중단
- 덱빌딩 방식: VS 순수형 (공격 버튼 제거, 이동·점프만)
- 카드 구조: "액티브 + 패시브 = 각성" 3분류
**PD 추가 지시 대기 (설계 착수 전 필수)**:
1. "티어 3→4 변경" 지시의 새 구조 내 재해석
2. 각성 발생 조건 (VS 원조 방식 "액티브 만렙 + 특정 패시브 + 보물상자" 그대로인지, 맥락 조정인지)
3. 기존 설계 중 유지 여부 (레벨업 3픽·런 사망 시 카드 전손·오행/유형 태그 2축·동일 카드 스택 업그레이드)
4. 액티브·패시브·각성 각 카테고리 규모 (몇 종씩)
**재설계 영향 파일 (PD 방향 확정분만 순차 개정)**:
- `프로젝트/EerieVillage/기획/system/01_카드_시스템.md` — 3분류 구조로 전면 재작성
- `프로젝트/EerieVillage/기획/content/01_카드_풀.md` — 기존 32장을 새 3분류로 재분배·재설계
- `프로젝트/EerieVillage/기획/balance/01_전투_수치.md` — 자동 공격 주기·DPS 공식 재설계
- `프로젝트/EerieVillage/기획/balance/02_레벨업_곡선.md` — 확률 테이블 3분류 체계에 맞게 재구성
- `프로젝트/EerieVillage/기획/ux/01·02` — 공격 버튼 제거 + 각성 발생 피드백 UI
- Unity: `PlayerAttack.cs` 트리거 수동→주기 전환 + `InputSystem_Actions.inputactions` Attack 바인딩 제거
### 공유 상태
내부 공유 (C21-①). BT7-Plan 재설정 반영 commit 대기.
### 관련 규칙
- **C1** 지시=승인 (PD 확정 사항 즉시 효력)
- **C2-1** 근본 원인 재정의 의무 (PM 위반 자진 고지)
- **C22** 용어·식별자 일관 사용 (C22-6 신설 계기)
- **C29** 업무 자율 수행 (PM 재량 vs PD 재확인 경계)
- **C32** 대화로그 기록 의무 (본 엔트리)
- **C36** PM 자율 판단 범위 상한 (방향·원칙 수준 축소·희석 금지)
---
## [BT7-Plan PD 지시 4건 답변] 1·2 확정 + 3·4 PM 조사 보고
**태그**: #BT7-Plan #PD지시답변 #티어폐기 #각성조건확정 #기존설계분류 #레퍼런스조사
### PD 지시 답변 수령
1. **"티어 3→4 변경" 재해석 폐기 확정** — PD 원문: "기존 티어 기준으로 지시한 내용인데 폐기하고 새로 바뀐 구조가 확정된 안이야"
→ 티어 수량 개념 자체 소멸. 액티브/패시브/각성 3분류가 유일 구조.
2. **각성 발생 조건 VS 원조 방식 확정** — PD 원문: "VS 원조 방식(액티브 최대 강화 + 특정 패시브 + 보물상자) 그대로야"
→ 각성 트리거 = (액티브 최대 레벨) + (특정 패시브 보유) + (보물상자 획득)
3. **기존 설계 유지 여부 정리** — PD 지시: "기존 설계안 중 유지 가능한 부분이 뭔지 다시 정리해서 보고해"
→ 본 엔트리 하단 분류 보고 수행
4. **액티브·패시브·각성 각 규모** — PD 지시: "레퍼런스 게임이 몇 종인지 먼저 확인 후 보고해"
→ 본 엔트리 하단 레퍼런스 조사 보고 수행
### 기존 설계 분류 (3번 답변)
#### ✅ 유지 (변동 없음)
- **04_전투**: 라이프 1·피격 즉사·i-frame 0.6s·PlatformerMicrogame 계승·2D 횡스크롤
- **balance/01**: MoveSpeed 6.0·JumpHeight 3.5·Gravity Scale 3.5·Coyote 0.12s·Jump Buffer 0.15s·Edge Push 0.3m
- **balance/01**: 적 스탯 (HP 40·60·120·보스 400, 이동 2.0~3.5)
- **balance/02**: XP 곡선 80+Lv×20·XP 획득량·어뷰징 가드
- **system/01**: 사망 시 카드 전손 (코어 룰 7)
- **ux/01**: 좌측 가상 스틱·우측 점프 버튼·Safe Area·피격 피드백 3종 (시각·청각·진동)·BT.Framework Tier 2 Neu 구현 3종
- **ux/02**: 보스전 HUD·마을 UI·사망/복귀 전환 UI·레벨업 카드 픽 Unscaled Time 시간 정지
- **content/01**: 한자 네이밍·조선 퇴마 톤 (narrative 현행 유지 지시 연계)
#### 🔄 부분 유지 / 재설계 필요
- **system/01**: 레벨업 3픽·동일 카드 스택 업그레이드·태그 체계 2축 — VS 각성 조건과 정합성 PD 검토 필요
- **content/01**: 32장 풀 볼륨 — 액티브/패시브/각성 3분류로 재분배 필요
- **content/01**: 8 카테고리 (공격·부적·주술·소환·방호·속도·회복·특수) — 액티브/패시브 재분류 필요
- **balance/02**: 레벨업 드로우 4티어 확률 테이블 — 액티브/패시브 2축 드로우로 재설계 (각성은 별도 트리거)
- **balance/02**: 런 내 카드 10장 하드캡 — 액티브·패시브 슬롯 상한 분리 재설계 (VS는 6+6)
- **ux/02**: HUD 카드 슬롯 — 액티브·패시브 분리 UI 재설계
#### ❌ 폐기
- **04_전투 §5**: 근거리 공격 1종 (수동 공격 전체)
- **ux/01**: 우측 공격 버튼
- **balance/01 §3**: BaseDamage 20·AttackRange·AttackCooldown 0.4s·HitStop·AttackBoxOffset·KnockbackForce (수동 공격 수치 전체)
- **system/01 §3 규칙 1**: 3티어 구조 + 티어 수량 개념 전체
- **content/01**: `[공격]` 태그 5장의 "기본 공격 강화" 효과 설계 (기본 공격 사라져 의미 상실)
#### 🆕 신규 설계 필요
- 액티브 무기 자동 발동 주기 시스템
- DPS 공식 (자동 발동 무기 기반 재설계)
- 각성(진화) 메커니즘 + 각성 발생 피드백 UI
- 기본 시작 무기 (VS 원조처럼 퇴마사 고유 무기 1종 시작)
- 보물상자 획득 체계 (VS 원조 각성 트리거 필수 요소)
### 레퍼런스 게임 규모 조사 (4번 답변)
WebSearch 실측 기반 (버전별 변동 가능, 베이스 게임 기준):
| 게임 | 액티브 (무기) | 패시브 | 각성 (진화) | 출처 |
|---|---|---|---|---|
| **Vampire Survivors 베이스** | ~14종 (WebSearch 확답 없음, 기본 지식 기반 추정) | **21종 (17 일반 + 4 특수)** | ~14종 + Union 소수 (추정) | [Vampire Survivors Wiki - Passive items](https://vampire.survivors.wiki/w/Passive_items) |
| **Brotato 베이스** | **64종** | **201종** (아이템) | 없음 (진화 시스템 부재) | [Brotato Wiki](https://brotato.wiki.spellsandguns.com/Weapons) |
| **Holocure** | 미확인 (WebSearch 확답 없음) | 미확인 | 스탬프 3단계 업그레이드 (고정) | [HoloCure Wiki - Stamp](https://holocure.wiki.gg/wiki/Stamp) |
**핵심 관찰**:
- VS 베이스(로그라이크 서바이버 원조)가 가장 근접한 레퍼런스 — 액티브 ~14 + 패시브 21 + 각성 ~14
- Brotato는 액티브 64·아이템 201로 볼륨 매우 큼. 파일럿 스코프 초과
- EerieVillage 기존 32장 볼륨 유지 가정 시 VS 베이스 규모 참고치
**PM 관점 (판단 아님·PD 결정 대기)**: 파일럿 스코프 고려 시 VS 베이스 규모 또는 그 이하가 관리 복잡도·QA 비용 대비 적정 가능성. 정확한 수량은 PD 지시 대기.
### 개정 착수 가능 판정
PD 방향 확정 사항만으로 즉시 착수 가능한 개정 영역:
- ✅ 04_전투 §2 공격 액션 삭제 + §5 전체 폐기 → 이동·점프 2종만 재작성
- ✅ ux/01 공격 버튼 레이아웃 삭제 + 관련 피드백 부분 제거
- ✅ balance/01 §3 공격 수치 섹션 삭제 + §6 대미지 공식 재설계 플레이스홀더
- ✅ system/01 3티어 구조 폐기 + 액티브/패시브/각성 3분류 골격 재작성
- ✅ 개발팀 PlayerAttack 주기 타이머 전환 + InputActions Attack 바인딩 제거
PD 추가 결정 후 착수:
- ⏳ content/01 32장 재분배 (액티브/패시브/각성 각 규모 확정 후)
- ⏳ balance/02 드로우 확률 테이블 재설계 (규모 확정 후)
- ⏳ ux/02 HUD 카드 슬롯 재설계 (슬롯 상한 확정 후)
### 공유 상태
내부 공유 (C21-①). PD 지시 3·4 답변 대기 + 규모 결정 대기.
---
## [BT7-Plan 규모 확정] PD 직접 지시 — 액티브 15~20 / 패시브 ≤25 / 각성 15~20
**태그**: #BT7-Plan #규모확정 #PD직접지시 #레퍼런스VS급
### PD 지시 수령 (2026-04-24)
> PD 원문: "엑티브, 패시브, 각성은 뱀파이어 서바이벌 정도의 규모로 액티브 15~20종, 패시브 25종 이내, 각성 15~20종으로 구성해."
**확정 수치**:
- **액티브**: 15~20종
- **패시브**: 25종 이내
- **각성**: 15~20종
### VS 베이스 레퍼런스와 비교 (참고용)
- VS 베이스: 액티브 ~14 + 패시브 21 + 각성 ~14
- EerieVillage 확정: 액티브 15~20 + 패시브 ≤25 + 각성 15~20
- → VS 베이스 수준 또는 약간 상회. 파일럿 스코프 내 관리 가능한 규모
### 기존 32장 대비
- 기존 content/01: 32장 단일 풀
- 개정 후: 액티브(최대 20) + 패시브(최대 25) + 각성(최대 20) = 최대 65장
- 약 2배 볼륨 확장. 기존 `content/01 §5 기각안 2` "50장 이상 초기 풀 기각"보다 다소 큰 규모 (단 기존 기각안은 단일 풀 기준, 현 구조는 3분류 합계 기준이라 다른 맥락)
### 기존 설계 분류 (표 형태 재요약)
| 영역 | 항목 | 판정 |
|---|---|---|
| **전투 기본** | 라이프 1 · 피격 즉사 · i-frame 0.6s | 유지 |
| | PlatformerMicrogame 템플릿 계승 · 2D 횡스크롤 | 유지 |
| **이동·점프** | MoveSpeed 6.0 · JumpHeight 3.5 · Gravity 3.5 · AirControl 0.7 | 유지 |
| | Coyote 0.12s · Jump Buffer 0.15s · Edge Push 0.3m | 유지 |
| **공격 (수동)** | 근거리 공격 1종 | 폐기 |
| | BaseDamage 20 · AttackRange 1.2m · AttackCooldown 0.4s · HitStop · Offset · Knockback | 폐기 |
| | `[공격]` 태그 5장 "기본 공격 강화" 효과 | 폐기 |
| **적 스탯** | HP 40/60/120/보스 400 · 이동 2.0~3.5 · ATK 1(즉사) | 유지 |
| **경험치·레벨업** | XP 곡선 80+Lv×20 · 획득량 (적·엘리트·보스) · 어뷰징 가드 | 유지 |
| | 레벨업 3픽 + Unscaled Time 시간 정지 | 유지 |
| | 사망 시 카드 전손 (코어 룰 7) | 유지 |
| | 4티어 확률 테이블 | 재설계 (액티브/패시브 2축 드로우) |
| | 런 내 10장 하드캡 | 재설계 (액티브·패시브 슬롯 분리) |
| **카드 풀** | 32장 단일 풀 | 재분배 (액티브 15~20 + 패시브 ≤25 + 각성 15~20) |
| | 8 카테고리 (공격·부적·주술·소환·방호·속도·회복·특수) | 재분류 (액티브/패시브) |
| | 한자 네이밍·조선 퇴마 톤 | 유지 |
| | 태그 체계 2축 (속성 오행·유형) | 부분 유지 (각성 조건 매핑 PD 검토) |
| | 동일 카드 스택 업그레이드 (Lv.1→2→3) | 부분 유지 (VS 진화 정합성 PD 검토) |
| **카드 구조** | 3티어 구조 · 티어 수량 개념 | 폐기 |
| **UX 조작** | 좌 가상 스틱 · 우 점프 버튼 · Safe Area | 유지 |
| | 우측 공격 버튼 | 폐기 |
| | 피격 피드백 3종 (시각·청각·진동) · 버튼 입력 피드백 | 유지 |
| **HUD** | 라이프 · 레벨·경험치 게이지 · 보스전 HP 바 | 유지 |
| | 마을 UI · 사망/복귀 전환 UI | 유지 |
| | 카드 슬롯 UI | 재설계 (액티브·패시브 분리) |
| **프레임워크** | BT.Framework Tier 2 신규 3종 (SafeAreaBorder·UITouchHandler·BackKeyDispatcher) | 유지 |
| **신규 설계** | 액티브 자동 발동 주기 시스템 | 신규 |
| | DPS 공식 (자동 발동 기반) | 신규 |
| | 각성(진화) 메커니즘 + 발생 피드백 UI | 신규 |
| | 기본 시작 무기 1종 (퇴마사 고유) | 신규 |
| | 보물상자 획득 체계 | 신규 |
### 판정 집계
- **유지**: 14종 (핵심 전투·이동·적·경험치·UX·HUD·프레임워크 대부분)
- **부분 유지**: 2종 (태그 체계 · 스택 업그레이드 — PD 검토 대기)
- **재설계**: 5종 (드로우 확률 · 슬롯 상한 · 카드 풀 · 카테고리 · 카드 슬롯 UI)
- **폐기**: 7종 (공격 관련 전체 + 3티어 구조 + 공격 버튼)
- **신규**: 5종 (액티브 주기·DPS 공식·각성 메커니즘·시작 무기·보물상자)
### 개정 착수 가능 (즉시)
PD 확정 방향(VS 순수형 + 3분류 + VS 각성 조건 + 규모 확정)만으로 선행 착수 가능:
1) `04_전투_기본_스펙` §2 공격 액션·§5 전체 폐기 재작성
2) `ux/01_모바일_터치_UX` 공격 버튼 레이아웃 제거
3) `balance/01_전투_수치` §3 공격 수치 삭제 + §6 대미지 공식 재설계 플레이스홀더
4) `system/01_카드_시스템` 3티어 폐기 + 액티브/패시브/각성 3분류 골격 재작성 (규모 확정 반영)
5) `content/01_카드_풀` 32장 → 3분류 재분배 (액티브 15~20 + 패시브 ≤25 + 각성 15~20)
6) `balance/02_레벨업_곡선` 드로우 확률 테이블 재설계
7) `ux/02_HUD_설계` 카드 슬롯 UI 재설계 (액티브·패시브 분리)
8) Unity: `PlayerAttack.cs` 트리거 주기 타이머 전환 + `InputActions` Attack 바인딩 제거
### PD 결정 대기 잔존 (1건)
- **부분 유지 2항목 처리 방향**: 동일 카드 스택 업그레이드와 VS 진화(각성) 개념의 정합성 + 태그 체계 2축(속성 오행·유형)의 각성 조건 매핑 활용 범위
### 공유 상태
내부 공유 (C21-①). 개정 착수 8건 commit 대기.
---
## [BT7-Plan 적 ATK 1 이상 확정] PD 직접 지시 — HP 다변 체계 재설계
**태그**: #BT7-Plan #적ATK재설계 #PlayerHP성장 #라이프1재해석 #전체분류갱신
### PD 지시 수령 (2026-04-24)
> PD 원문: "적 공격은 1 이상으로 구성해야 해 (왜냐하면 플레이어가 스킬 카드 조합이나 성장 요소로 HP를 늘릴 수단이 존재하기 때문이야.)"
### 설계 영향
- **기존 balance/01 §5 ATK=1(즉사) 설계 폐기**: "라이프 1 구조에서 모든 피격은 즉사" 전제 소멸
- **플레이어 HP 성장 가능 구조**: 카드(패시브 `[방호]`·`[회복]`)·특성(영속 성장)으로 최대 HP 증가
- **라이프 1 코어 룰 재해석**: "시작 HP 1" 기본값으로 해석. 카드·성장으로 증가 가능 (기존 `system/01 §5 기각안 1` "HP 막대 도입 기각" 번복)
- **대미지 공식 재설계 필수**: 기존 `PlayerResult = DEAD (라이프 1)` → 신 `PlayerHP -= EnemyATK` (i-frame 내 피격 무효 유지)
- **적 ATK 테이블 신설**: 일반 적/엘리트/보스별 ATK 수치 차등 (balance-designer 설계)
### 갱신된 분류 표 (PD "나머지 모두 반영" 지시 수용)
| 영역 | 항목 | 판정 |
|---|---|---|
| **전투 기본** | 라이프 1 (시작 HP 기본값, 성장으로 증가 가능) | 부분 유지 (재해석) |
| | 피격 = 즉사 조건 (라이프 1 전제) | **재설계** (HP 다변·데미지 누적) |
| | i-frame 0.6초 · PlatformerMicrogame 계승 · 2D 횡스크롤 | 유지 |
| **이동·점프** | MoveSpeed 6.0 · JumpHeight 3.5 · Gravity 3.5 · AirControl 0.7 | 유지 |
| | Coyote 0.12s · Jump Buffer 0.15s · Edge Push 0.3m | 유지 |
| **공격 (수동)** | 근거리 공격 1종 · 공격 수치 전체 · 공격 버튼 | 폐기 |
| | `[공격]` 태그 5장 "기본 공격 강화" 효과 | 폐기 |
| **적 스탯** | HP 40/60/120/보스 400 · 이동 2.0~3.5 | 유지 |
| | ATK 1(즉사) | **재설계** (1 이상 다양한 수치) |
| **대미지 공식** | `PlayerResult = DEAD (라이프 1)` | **재설계** (`PlayerHP -= EnemyATK`, i-frame 내 무효) |
| | `FinalDamage = BaseDamage × CardMultiplier × CritMultiplier` | 재설계 (자동 발동 무기 기반) |
| **경험치·레벨업** | XP 곡선 80+Lv×20 · 획득량 · 어뷰징 가드 (일부) | 유지 |
| | "체력 회복 스팸" 가드 (라이프 1 전제) | 재설계 (회복 카드 도입 전제) |
| | 레벨업 3픽 + Unscaled Time 시간 정지 | 유지 |
| | 사망 시 카드 전손 (코어 룰 7) | 유지 |
| | 4티어 확률 테이블 | 재설계 (액티브/패시브 2축) |
| | 런 내 10장 하드캡 | 재설계 (슬롯 분리) |
| **카드 풀** | 32장 단일 풀 | 재분배 (액티브 15~20 + 패시브 ≤25 + 각성 15~20) |
| | 8 카테고리 (공격·부적·주술·소환·방호·속도·회복·특수) | 재분류 (액티브/패시브) |
| | 한자 네이밍 · 조선 퇴마 톤 | 유지 |
| | 태그 체계 2축 (속성 오행 · 유형) | 부분 유지 (PD 검토) |
| | 동일 카드 스택 업그레이드 (Lv.1→2→3) | 부분 유지 (PD 검토) |
| | `[방호]`·`[회복]` 태그 효과 | **부분 유지 (실효 수치 재설계 — HP 증가·실드 회복 실제 반영)** |
| **카드 구조** | 3티어 구조 · 티어 수량 개념 | 폐기 |
| **UX 조작** | 좌 가상 스틱 · 우 점프 버튼 · Safe Area | 유지 |
| | 우측 공격 버튼 | 폐기 |
| | 피격 피드백 3종 (시각·청각·진동) | 유지 |
| **HUD** | 라이프 UI (하트 1개) | **재설계** (현 HP / 최대 HP 시각화) |
| | 레벨·경험치 게이지 · 보스전 HP 바 | 유지 |
| | 마을 UI · 사망/복귀 전환 UI | 유지 |
| | 카드 슬롯 UI | 재설계 (액티브·패시브 분리) |
| **프레임워크** | BT.Framework Tier 2 신규 3종 (SafeAreaBorder·UITouchHandler·BackKeyDispatcher) | 유지 |
| **신규 설계** | 액티브 자동 발동 주기 시스템 | 신규 |
| | DPS 공식 (자동 발동 기반) | 신규 |
| | 각성(진화) 메커니즘 + 발생 피드백 UI | 신규 |
| | 기본 시작 무기 1종 (퇴마사 고유) | 신규 |
| | 보물상자 획득 체계 | 신규 |
| | **플레이어 HP 증가 메커니즘** (패시브 카드 실효·특성 영속 성장) | **신규** |
### 갱신된 판정 집계 (표 행 기준, 총 38행)
- **유지 13행**: 전투 템플릿·이동·적 HP·경험치 곡선·3픽·카드 전손·한자 네이밍·조작 기본·HUD 기본(레벨/마을/보스)·BT.Framework
- **부분 유지 4행**: 라이프 1 재해석 · `[방호]`/`[회복]` 실효 재설계 · 태그 체계 2축 · 스택 업그레이드 (**후 2건 PD 검토 대기**)
- **재설계 11행**: 피격 즉사 조건 · 적 ATK · 대미지 공식 2종(`PlayerResult` · `FinalDamage`) · 체력 회복 가드 · 4티어 확률 · 10장 하드캡 · 32장 재분배 · 8 카테고리 재분류 · HUD 라이프 UI · 카드 슬롯 UI
- **폐기 4행**: 수동 공격 전체(근거리 1종·수치·버튼 묶음) · `[공격]` 태그 5장 효과 · 3티어 구조 · 우측 공격 버튼
- **신규 6행**: 액티브 자동 주기 · DPS 공식 · 각성 메커니즘 · 기본 시작 무기 · 보물상자 획득 체계 · **HP 증가 메커니즘**
> **분류 경계 주석**: "신규: HP 증가 메커니즘"은 시스템 차원의 HP 변동 로직 자체이며, "부분 유지: `[방호]`/`[회복]` 태그"는 그 메커니즘의 **개별 카드 구현 수단**. 상호 참조 관계로 중복 아님. 개정 시 구조 분리 서술 필요.
### 갱신된 즉시 착수 가능 (PD 추가 결정 불요)
1) `04_전투` §2 공격 액션·§5 전체 폐기 재작성 + §3 라이프·피격 판정 재작성 (HP 다변 반영)
2) `ux/01` 공격 버튼 레이아웃 제거
3) `balance/01` §3 공격 수치 삭제 + §5 적 ATK 재설계 (1 이상 수치 테이블) + §6 대미지 공식 재설계 (`PlayerHP -= EnemyATK`)
4) `system/01` 3티어 폐기 · 액티브/패시브/각성 3분류 골격 재작성 (규모 반영 + HP 증가 메커니즘 반영) + §5 기각안 1 "HP 막대 도입 기각" 번복 기록
5) `content/01` 32장 → 3분류 재분배 (액티브 15~20 · 패시브 ≤25 · 각성 15~20) + `[방호]`·`[회복]` 태그 실효 수치 설계
6) `balance/02` 드로우 확률 테이블 재설계 + 어뷰징 가드 §6 "체력 회복 스팸" 재작성 (회복 카드 도입 전제)
7) `ux/02` 카드 슬롯 UI 재설계 (액티브·패시브 분리) + 라이프 UI 재설계 (현 HP / 최대 HP 시각화)
8) Unity: `PlayerAttack.cs` 주기 타이머 전환 + `InputActions` Attack 바인딩 제거 + `Health.cs` maxHP 가변 구조 확장
### PD 결정 대기 잔존 (1건 — 2하위 항목)
1) 동일 카드 스택 업그레이드(Lv.1→2→3)와 VS 진화(각성) 개념의 정합성
2) 태그 체계 2축(속성 오행 · 유형)의 각성 조건 매핑 활용 범위
### 공유 상태
내부 공유 (C21-①). 개정 착수 8건 commit 대기.
---
## [BT7-Plan 라이프 시스템 정정] PD 직접 지시 — 라이프 4 + 젤다 하트 분할 (하트 1개 = 4 HP)
**태그**: #BT7-Plan #라이프시스템정정 #젤다하트분할 #적ATK점진강화 #하트1개=4HP확정
### PD 지시 수령 (2026-04-24)
> PD 원문 1: "기본 라이프는 4 / 적의 최소 공격력은 1부터 점진적으로 강화 하는 형태로 변경해."
> PD 원문 2: "기본 라이프의 표현은 ♥로 표현할거야. 적에게 피해 1을 받을 경우 1/4조각이 감소하고 2의 피해를 입으면 하트가 반조각 감소하는 젤다의 전설 형태의 라이프 시스템을 의미해."
> PD 원문 3 (추가 확정): "완전한 형태의 하트 1개는 4의 HP를 의미해"
### 확정 사양
**라이프 시스템** (Zelda 방식)
- 하트 ♥ 1개 = 4 HP (4 쿼터 분할)
- **기본 시작 = 라이프 4 = 하트 1개** (4/4 상태)
- 피해 1 = 1 쿼터 감소 (3/4)
- 피해 2 = 2 쿼터 = 반조각 감소 (2/4)
- 피해 3 = 3 쿼터 감소 (1/4)
- 피해 4 = 하트 1개 완전 소멸
- **카드·성장으로 최대 하트 수 증가 가능** (예: 하트 2개 = 8 HP, 하트 3개 = 12 HP)
**적 공격력**
- 최소 ATK 1 (하트 1/4 조각 감소 = 피해 1)
- 스테이지·등급 진행에 따라 점진 강화 (balance-designer 수치 테이블)
- 참고 예시(추정): 일반 약 ATK 1 / 일반 중 ATK 2 / 엘리트 ATK 3 / 보스 ATK 4 또는 그 이상
### 설계 영향 (기존 분류 갱신)
**폐기 (추가)**
- `04_전투 §3-1` "기본 라이프 1. HP 최대값 = 1" → `기본 라이프 4. 하트 1개 = 4 HP` 전면 재작성
- `04_전투 §8 기각안 1` "HP 막대 도입 기각" → 번복 기록 (하트 UI 도입)
- 코어 룰 7 "라이프 1" 표기 → `01_게임_컨셉`·`02_코어_루프` 전면 개정 필요
**재설계 (갱신)**
- `balance/01 §5` 적 ATK 재설계 — "1 이상 다양" 추상에서 **"1부터 점진 강화" 구체화**. 일반 약/중·엘리트·보스별 수치 차등 + 스테이지 진행 승수
- `balance/01 §6` 대미지 공식 `PlayerHP -= EnemyATK` — 단위는 **쿼터(1/4 HP)**
- `balance/01 §4` i-frame 0.6초 근거 재검토 — 연속 히트 방지 기준이 다인 히트 구조로 변경됨 (하트 1개를 4회 피격까지 버틸 수 있는 여유 생김, 반대로 강한 공격 1회도 방지)
- `system/01` `[방호]`·`[회복]` 태그 효과 실효 단위 — 쿼터 단위 회복/실드 또는 하트 단위
- `ux/02 §2-2` HUD 라이프 UI — 하트 ♥ + 쿼터 분할 시각화 (Zelda BotW 방식)
- `balance/02 §6` "체력 회복 스팸" 어뷰징 가드 — 회복 단위(쿼터 vs 하트) 결정 후 쿨다운·스택 제한 재설계
**신규 설계 (갱신)**
- 플레이어 HP 증가 메커니즘 → **하트 수 증가 메커니즘**으로 구체화. 패시브 `[방호]`·`[회복]` 카드 or 특성으로 최대 하트 수 +1씩 증가 (상한 제약 필요 — balance-designer)
- 하트 UI 스프라이트 시각화 (풀 하트·3/4·반·1/4·빈 하트 5단계 또는 Zelda Original 방식 풀·반·빈 3단계) — UX 세부 결정 사항
### 직전 PD 대기 2건 중 1건 해소
- ✅ **"기본 라이프 4" 단위 해석 확인** — PD 직접 명시 "하트 1개 = 4 HP" → 기본 시작 하트 1개로 확정
- ⏳ 부분 유지 2하위 항목 여전히 대기
### 갱신된 분류 집계 (Delta만)
기존 집계(유지 13·부분 유지 4·재설계 11·폐기 4·신규 6 = 38행) 대비:
- **재설계 +1**: 코어 룰 7 "라이프 1" 표기 재작성 (`01_게임_컨셉`·`02_코어_루프`) → 재설계 12
- **폐기 +1**: `04_전투 §8 기각안 1` "HP 막대 도입 기각" 조항 자체 → 폐기 5
- **신규 세부 구체화 (수량 불변)**: "HP 증가 메커니즘" → "하트 수 증가 메커니즘"으로 명칭 정교화
### 갱신된 즉시 착수 가능 (PD 추가 결정 불요)
1) `04_전투` §2 공격 폐기 + **§3 라이프 전면 재작성 (하트 1개 = 4 HP)** + §8 기각안 1 번복 기록
2) `ux/01` 공격 버튼 제거
3) `balance/01` §3 공격 수치 삭제 + **§5 적 ATK 점진 강화 테이블 재작성** + **§6 대미지 공식 쿼터 단위 재작성** + §4 i-frame 근거 재검토
4) `system/01` 3티어 폐기 + 3분류 골격 + HP/하트 증가 메커니즘 + §5 기각안 1 번복
5) `content/01` 32장 → 3분류 재분배 + `[방호]`/`[회복]` 쿼터/하트 단위 실효 설계
6) `balance/02` 드로우 확률 재설계 + §6 회복 스팸 가드 재작성
7) `ux/02` 카드 슬롯 UI (분리) + **라이프 UI 하트 분할 시각화**
8) Unity: `PlayerAttack.cs` 주기 타이머 + `InputActions` Attack 제거 + **`Health.cs` maxHP 가변 + 쿼터 단위 구조**
9) **`01_게임_컨셉`·`02_코어_루프`** 코어 룰 7 "라이프 1" 표기 전면 갱신 (신규 추가)
### PD 결정 대기 잔존 (변동 — 1건, 1건 해소로 감소)
부분 유지 2항목 처리 방향:
1) 동일 카드 스택 업그레이드(Lv.1→2→3)와 VS 진화(각성) 개념의 정합성
2) 태그 체계 2축(속성 오행 · 유형)의 각성 조건 매핑 활용 범위
### 공유 상태
내부 공유 (C21-①). 개정 착수 9건 commit 대기.
---
## [BT7-Plan 스택 업그레이드·각성·태그 체계 확정] PD 대기 2건 모두 해소 — **방향 완전 확정**
**태그**: #BT7-Plan #스택5레벨 #각성조건VS원작재확인 #태그일반RPG용어 #PD대기0건 #방향완전확정
### PD 지시 수령 (2026-04-24)
> PD 원문 1: "동일 카드 스텍 업그레이드는 5레벨까지 가능하고, 각성에 필요한 패시브 1개 이상 보유 시 각성 카드가 발동되는 형태로(원작과 동일)하게 구성해."
> PD 원문 2: "태그 체계는 무슨 의미인지 모르겠고 오행이나 유형은 나중에 일괄 변경할테니 우선 일반적인 RPG에 익숙한 용어를 사용해."
### 확정 사양 (PD 대기 2건 해소)
#### 1. 동일 카드 스택 업그레이드 Lv.5까지 + 각성 발동 조건 VS 원작 동일
- 기존 `system/01 §3 규칙 4` "Lv.1→2→3 (3단계)" → **Lv.1~Lv.5 (5단계 확장)**
- **각성 발동 조건** (VS 원작 동일 재확인):
- 액티브 카드 Lv.5 도달 (스택 업그레이드 최대)
- 각성에 필요한 **특정 패시브 1개 이상** 보유
- **보물상자** 획득 (이전 확정 사항 유지)
- 3요소 충족 시 → **각성 카드 등장·발동**
- 각성은 별도 카드 풀(15~20종)에 존재. 조건 충족 시 드로우 풀 합류 or 보물상자 드로우로 획득.
#### 2. 태그 체계 일반 RPG 용어 사용 (임시)
- 기존 세계관 특화 용어(오행 불/물/목/금/토 · 결계/부적/주술/소환 등) → **일반 RPG 익숙한 용어로 임시 재작성**
- **구체 일반 RPG 용어는 `content/01` 개정 시 기획팀장 제안 → PD 검토**
- PD 향후 일괄 세계관 특화 재매핑 예정 (narrative 보완 시점)
### 태그 개념 간단 설명 (PD 질의 답변용 보존 기록)
> PD 지적: "태그 체계는 무슨 의미인지 모르겠고"
**태그**란 카드마다 붙이는 **분류 라벨**입니다. 예를 들어 한 카드에 `[공격]`·`[화염]` 두 태그를 붙이면, 동일 `[화염]` 태그 카드를 여러 장 모았을 때 **시너지 효과가 추가 발동**되는 구조. VS 원작의 무기-패시브 매칭과 별개로, **빌드 방향 표시·시너지 조합 탐색의 기반** 역할.
활용 범위 (기존 설계 유지):
- **시너지 발동 조건**: 동일 태그 K장 이상 보유 시 추가 효과
- **카드 분류 라벨**: 빌드 경향 시각화 (내 덱이 공격 중심인지 방어 중심인지 한눈에)
- **각성 조건과는 별도**: 각성은 "특정 패시브 1개 이상 + 액티브 Lv.5 + 보물상자"로 트리거되며, 태그 매칭이 각성 조건은 아님 (VS 원작 방식)
### 설계 영향 갱신
**재설계 (구체화)**
- `system/01 §3 규칙 4` 스택 업그레이드: Lv.3 → **Lv.5**
- `system/01` 각성 발동 조건 명확화: 액티브 Lv.5 + 특정 패시브 1개 이상 + 보물상자
- `content/01 §2-2` 태그 체계: 오행·결계/부적/주술 등 → **일반 RPG 용어로 임시 재작성** (구체 용어는 기획팀장 제안 → PD 검토)
**부분 유지 2하위 항목 모두 해소**
- ✅ 동일 카드 스택 업그레이드 VS 진화 정합성 → Lv.5 스택 + 각성 조건 VS 원작 동일로 해소
- ✅ 태그 체계 2축 활용 범위 → 시너지 발동·카드 분류 용도 유지, 용어만 일반 RPG 임시 재작성
### 갱신된 분류 집계 (Delta)
기존 집계(유지 13 / 부분 유지 4 / 재설계 12 / 폐기 5 / 신규 6 = 40행) 대비:
- **부분 유지 -2 → 2**: "태그 체계 2축" · "동일 카드 스택 업그레이드" 2항목 해소
- **재설계 +2 → 14**: 동일 2항목이 **재설계**로 이동 (Lv.5 확장 · 태그 용어 일반 RPG 재작성)
- 합계 40행 유지
### 갱신된 즉시 착수 가능 (**PD 추가 결정 0건** — 모두 PM·기획팀·개발팀 재량 집행)
1) `04_전투` §2 공격 폐기 + §3 라이프 전면 재작성 (하트 1개 = 4 HP) + §8 기각안 1 번복
2) `ux/01` 공격 버튼 제거
3) `balance/01` §3 공격 수치 삭제 + §5 적 ATK 점진 강화 테이블 + §6 대미지 공식 쿼터 단위
4) `system/01` 3티어 폐기 + 3분류 골격 + **스택 업그레이드 Lv.5** + **각성 조건 VS 원작 명확화** + HP/하트 증가 메커니즘 + §5 기각안 1 번복
5) `content/01` 32장 → 3분류 재분배 + `[방호]`/`[회복]` 실효 설계 + **태그 체계 일반 RPG 용어 재작성** (기획팀장 초안 → PD 검토)
6) `balance/02` 드로우 확률 재설계 + §6 회복 스팸 가드 재작성
7) `ux/02` 카드 슬롯 UI 재설계 + 라이프 UI 하트 분할 시각화
8) Unity: `PlayerAttack.cs` 주기 타이머 + `InputActions` Attack 제거 + `Health.cs` maxHP 가변 + 쿼터 단위
9) `01_게임_컨셉`·`02_코어_루프` 코어 룰 7 "라이프 1" → "라이프 4 + 하트 분할" 표기 갱신
### PD 결정 대기 잔존 **0건 — BT7-Plan 방향 완전 확정**
모든 PD 확정 사항 정리:
- VS 순수형 (공격 버튼 제거, 이동·점프만)
- 액티브 + 패시브 = 각성 3분류
- 규모: 액티브 15~20 / 패시브 ≤25 / 각성 15~20
- 기본 라이프 4 (하트 1개 = 4 HP, 젤다 분할)
- 적 ATK 1부터 점진 강화
- 스택 업그레이드 Lv.5
- 각성 조건: 액티브 Lv.5 + 특정 패시브 1개 이상 + 보물상자
- 태그 체계: 일반 RPG 용어로 임시 (나중에 PD 일괄 재매핑)
- narrative 현행 유지 (카드명 한자·조선 퇴마 톤)
### 공유 상태
내부 공유 (C21-①). 개정 집행 착수 9건 commit 대기 — **BT7-Plan 재설계 본격 착수 가능 상태**.
---
## [BT7-Dev Phase 1 개발 집행 착수] VS 순수형 자동 발동 + 하트 분할 Unity 재구조
**태그**: #BT7-Dev #Phase1 #VS순수형 #자동발동Ticker #하트분할시스템 #개발팀장집행
**트리거**: PD 2026-04-24 BT7-Plan 방향 완전 확정 후 PM이 개발팀장 Agent에 Phase 1(개발 영향분) 집행 위임
### 배경
BT7-Plan에서 확정된 11건 PD 지시 중 **개발 영향 항목**을 Unity 코드·설정·EditMode 테스트에 반영.
### 개발 영향 PD 확정 방향
1. VS 순수형 — 공격 버튼 제거, 이동·점프만
2. 플레이어 공격 = 자동 발동 (주기 타이머)
3. 기본 라이프 4 (하트 1개 = 4 HP, 젤다 분할) · 카드·성장으로 최대 하트 수 증가 가능
4. 적 ATK 1부터 점진 강화 (`PlayerHP -= EnemyATK` 쿼터 단위)
5. 동일 카드 스택 업그레이드 Lv.5까지
6. 각성 조건 VS 원작 동일 (액티브 Lv.5 + 특정 패시브 1개 + 보물상자)
### 집행 범위 (Phase 1)
**Unity 코드·설정·테스트 뼈대**만. 기획 balance/01 v0.2·system/01·content/01·ux/02 미확정 항목은 **TODO 주석 + 후속 Phase 분리**.
### 편집 산출물 (7파일)
**Unity 외부 레포 `D:/NerdNavis/EerieVillage/`**:
1. `Assets/Scripts/Gameplay/PlayerAttack.cs` — Execute 로직 유지 + 주석 재작성 (수동 입력 → 자동 발동 전환 명시)
2. `Assets/Scripts/Gameplay/PlayerAttackTicker.cs` **(신설)** + `.meta``[RequireComponent(PlayerController)]` 주기 타이머 컴포넌트. `attackInterval`(기본 0.5s) + `startupDelay`(기본 0.3s) + `ApplyIntervalMultiplier` 확장 API
3. `Assets/Settings/InputSystem_Actions.inputactions` — Player 맵 Attack 액션 정의·바인딩 2종(Mouse leftButton · Gamepad rightTrigger) **완전 제거**
4. `Assets/Scripts/Mechanics/Health.cs` — 전면 개정. `QuartersPerHeart=4` 상수 · `maxHearts` 필드(기본 1, Inspector) · `maxHP = maxHearts*4` Awake 재산정 · `Heal(int quarters)` · `IncreaseMaxHearts(int delta)` · `Decrement(int damage)` 오버로드 · `CurrentHP` 프로퍼티 (HUD용) · 기존 `Decrement()`·`Die()` 호환 유지
5. `Assets/Scripts/Mechanics/PlayerController.cs``m_AttackAction`·`nextAttackTime`·`attackCooldown` 전수 제거. `public Vector2 Facing => facing` 노출. Update Attack 입력 블록 제거
6. `Assets/Scripts/Mechanics/AttackHitbox.cs``for 루프 Decrement()``health.Decrement(damage)` 단일 호출 통합 + BT7-Plan TODO 주석 (i-frame 내 반복 Decrement 무효화 문제 대응)
7. `Assets/Tests/Editor/PlayerAttackTests.cs` — 10 tests → **13 tests**. 제거 1(`Enemy_Prefab_Health_MaxHP_Is_One` — 하트 분할로 가정 폐기) + 신규 4(`Health_Script_Defines_MaxHearts_And_IncreaseMaxHearts`·`Player_Prefab_MaxHP_Reflects_Heart_Quarters`·`PlayerAttackTicker_Script_Exists_With_AttackInterval`·`InputActions_Player_Map_Has_No_Attack_Action`)
**BT 레포**:
8. `프로젝트/EerieVillage/개발/06_BT7-Plan_VS순수형_재구조.md` **(신설)** — YAML frontmatter + 9섹션 (배경·편집대상·백업·PD수동검증·리스크·기각안 5건·후속Phase·자가검증·변경이력)
9. `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` — BT7-Dev 활성 항목 추가 (진행중)
### C6-1 백업 6종
`공유/개발팀_백업/EerieVillage/*.bak_20260424_1551.*`:
- `PlayerAttack.cs` · `Health.cs` · `PlayerController.cs` · `InputSystem_Actions.inputactions` · `PlayerAttackTests.cs` · `AttackHitbox.cs`
**롤백 절차**: `.bak_20260424_1551` 제거 후 Unity 레포 덮어쓰기.
### EditMode 테스트 갱신 결정
| 변경 | 수 | 이유 |
|---|---|---|
| 유지 | 8 | 기존 Player/Enemy/AttackHitbox prefab 컴포넌트 검증 (BT5-Dev 계승) |
| 제거 | 1 | `Enemy_Prefab_Health_MaxHP_Is_One` — 하트 분할 시스템으로 Enemy maxHP=1 가정 폐기 (Enemy도 쿼터 단위 HP) |
| 신규 | 4 | Health 신규 API·Ticker Script 존재·Attack 액션 제거·Player prefab 하트 직렬화 정합성 |
| **총계** | **13** | |
### PD 수동 검증 요청 (2종)
1. **Asset import + EditMode Test Runner 실행** — Unity Editor 재실행 후 Console 오류 없음 확인 + `Window > General > Test Runner` → EditMode → Run All → 13 green
2. **Player.prefab에 PlayerAttackTicker 컴포넌트 부착 + Play 검증** — Inspector Add Component "Player Attack Ticker" → Prefab 저장 → Play → 공격 자동 발동(0.3s 지연 후 0.5s 주기)·Enemy 피해·Player i-frame 확인
### 기각안 (5건 — C32 최소 3건 초과)
1. "PlayerAttack.cs 내부에 타이머 직접 구현" 기각 — SRP 위반. Ticker 분리로 발화 방식 교체 유연성 확보
2. "attackInterval을 PlayerController에 통합" 기각 — PlayerController 비대. 전투 시스템 분리 보전
3. "Health.maxHP 제거하고 maxHearts만 유지" 기각 — Prefab 직렬화 호환성 파괴. maxHP 유지 + Awake 재산정 방식 채택
4. "Decrement 단일 시그니처 통합" 기각 — 기존 호출자 회귀 리스크. 무인자 유지 + 오버로드 신규 추가
5. "EnemyController에 attackDamage 필드 추가 + Player 피해 전달" 본 Phase 기각 — balance/01 v0.2 미확정. TODO 주석만, 후속 Phase 분리
### 규칙 준수 검증
- **C5 정직성**: 실제 Edit 결과만 보고 — `grep -c "m_AttackAction"` 0건 실측 확인
- **C6-1 원본 보호**: 편집 대상 6파일 백업 `*.bak_20260424_1551.*` 6종 확보
- **C11 개발 관점**: 자원 효율(Time.deltaTime 누적·Schedule 재사용)·구조 직관성(Ticker 분리 SRP)·범용성(ApplyIntervalMultiplier 확장 API)
- **C22**: PD 도입 용어 "액티브·패시브·각성·하트·쿼터·보물상자·Lv.5" 코드 주석·본 문서에 그대로
- **C22-6 정신**: 신규 클래스·필드명은 **구현 세부 수준 기술 명명** (PlayerAttackTicker·maxHearts·QuartersPerHeart 등). PD 방향·원칙 수준 결정에 영향 없음 — C36 적용 범위 내 자가 검증
- **C23 허위 보고 금지**: 7파일 Edit 실제 수행 + grep으로 결과 실측 입증
- **C30 git 최신**: Unity 레포 `git fetch origin` + `main` 브랜치 최신 확인 (기존 modified 7건은 Unity Editor 자동 생성 setting, 본 작업과 무관)
- **C32 기각안**: 5건 기록 (본 엔트리)
- **C34-11 경로**: Unity 외부 레포 절대 경로 허용 (`D:/NerdNavis/EerieVillage/Assets/...`) · BT 산출물 상대 경로
### 공유 상태
내부 공유 (C21-①). PM 수행 대기: pm-auditor 감사 → BT worktree commit → Unity 외부 레포는 PD Editor 실행 시 GitAutoSync 자동 push → Play 검증 결과 수령.
### 관련 규칙
- **C1** 지시=승인 (PD BT7-Plan 방향 완전 확정 후 PM 위임 권한 내)
- **C6-1** 원본 보호 (6파일 백업)
- **C11** 개발 관점 원칙 (Ticker SRP 분리)
- **C22** 용어·식별자 일관 사용
- **C23** 허위 보고 금지
- **C32** 대화로그 기록 의무 (본 엔트리)
- **C36** PM 자율 판단 범위 상한 (구현 세부 수준 — 방향·원칙 미변경)
- **P13-1** 코드 변경 (공용 모듈 AttackHitbox·Health 인터페이스 영향 — 기획·QA 공유)
- **P14** QA 게이트 (13 EditMode 테스트로 회귀 검증)
- **P30** 재미 우선 원칙 (기획팀 검토 대상 — 자동 발동 주기 튜닝)
---
## [BT7-Plan 기획 9파일 v0.2 개정 집행 완료] 기획팀장 Agent 산출
**태그**: #BT7-Plan #기획개정완료 #기획팀장집행 #기각안번복7건 #신규기각안20건 #태그임시용어
**트리거**: PD 2026-04-24 "집행 착수해" 지시 + BT7-Plan 방향 완전 확정 (11건) 후 PM이 기획팀장 Agent 병렬 위임
### 편집 산출물 (9파일 v0.2)
1. `01_게임_컨셉.md` — 재미 축 2를 "손맛"에서 "VS 순수형 자동 발동 감상"으로 재정의. 라이프 1 즉사 → 하트 분할 + 성장 2중 축
2. `02_코어_루프.md` — 보물상자 획득을 각성 발동 트리거로 추가. 하트 수 증가 런 내 한정
3. `04_전투_기본_스펙.md` — 기본 액션 2종(이동·점프만) · 라이프 4쿼터 + 젤다 5단계 분할 · 공격은 액티브 자동 발동 · §8 기각안 1 번복 기록
4. `system/01_카드_시스템.md` — 3티어 폐기 · 액티브/패시브/각성 3분류 · Lv.5 스택 · VS 원작 각성 조건 (Lv.5 + 필요 패시브 + 보물상자) · §5 기각안 1·2 번복 기록
5. `content/01_카드_풀.md` — 32장 → 50~65장 (A01~A18 액티브 · P01~P25 패시브 · AW01~AW18 각성) · 일반 RPG 태그 5속성+6유형 임시 · 각 각성마다 "필요 액티브 + 필요 패시브" 쌍 명시 · 한자 네이밍 현행 유지
6. `balance/01_전투_수치.md` — 수동 공격 수치 전면 삭제 · 자동 발동 액티브 기본 수치(BaseCooldown 1.5s · BaseDamage 10) · 적 ATK 1~4 점진 강화 · i-frame 0.6s 하트 분할 하 유효 재검증
7. `balance/02_레벨업_곡선.md` — 4티어 레어리티 폐기 · 액티브·패시브 2축 드로우 비율 (초반 70/30 → 후반 20/80) · 슬롯 6/6 분리 · 보물상자 체계 신설 · 회복 스팸 가드 재작성
8. `ux/01_모바일_터치_UX.md` — 공격 버튼 제거 · 점프 버튼 우측 단독 대형 · Attack 액션 제거 · 피해량별 진동 차등 (40/80/120/160ms)
9. `ux/02_HUD_설계.md` — 하트 UI 5단계 분할 스프라이트 · 액티브/패시브 슬롯 분리(6/6) · 각성 발동 풀스크린 연출 3초 + 복수 조건 선택 UI · 각성 대기 황금 테두리 + ★ 표시
### 기각안 번복 기록 7건 (원 기각안 유지 + "번복" 주석, C14-5 히스토리 보존)
- `04_전투 §8 기각안 1` HP 막대 도입
- `system/01 §8 기각안 1·2` 3티어 명칭 · HP 막대
- `01_게임_컨셉 §7 기각안 1` 라이프 1 고수
- `content/01 §5 기각안 2` 30~35장 MVP
- `balance/02 §8 기각안 9` 10장 하드캡
- `ux/01 §7 기각안 4` 공격 버튼 복수
### 신규 기각안 총 20건
각 파일 §기각안 섹션 최소 3건 기준 충족. 파일별 2~3건씩 분포.
### 태그 일반 RPG 용어 후보 (PD 후속 검토 대기)
- **속성 5종**: `[물리]` `[화염]` `[냉기]` `[번개]` `[암흑]`
- **유형 6종**: `[근접]` `[원거리]` `[범위]` `[지속]` `[회복]` `[방어]`
narrative-designer가 PD 검토 후 세계관 특화(조선 퇴마·한자) 일괄 재매핑 예정.
### narrative 완전 보존
`narrative/01·02·03_*.md` 3파일 + 카드 한자 네이밍(진언부·화염부·봉황격·학익진 등) 현행 유지. PD 특별 주의 완전 준수.
### 각성 18종 모두 쌍 명시 완료
AW01~AW18 각각 `필요_액티브` + `필요_패시브[]` 쌍 구체 기록 (`content/01 §3-3`).
### 기본 시작 무기 결정 보류
`content/01 §3-1` 말미에 "A01~A18 중 1종 기본 장착 or 별도 카드 설계" 명시. balance·content 협의 대기.
### C22-6 정신 준수 자가 검증
- 자의 용어 신설 없음 (RPG 통용 용어만)
- 단일 선택 강요 없음 (후보 5+6개 제시 + PD 검토 대기 명시)
- 한자 네이밍 미개입
- `system/03_덱빌딩_방식_검토.md` 수정 대상 아님 (참조만)
- 상대 경로 사용 (C34-11)
### 변경 이력 기록
9개 파일 모두 §변경 이력 섹션에 `2026-04-24 v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영` 엔트리 추가 완료.
### 공유 상태
내부 공유 (C21-①). PM 수행 대기: pm-auditor 감사 → BT 레포 commit → push.
### 관련 규칙
- **C1** 지시=승인 (PD 집행 착수 지시)
- **C5** 정직성 · **C11** 개발 관점 · **C14-5** 본문 최신 · **C22** 용어 일관 · **C22-6** (선행 준수) · **C23** 허위 보고 금지 · **C25** 넘버링 · **C32** 기각안 필수 · **C34-11** 경로 · **P30** 재미 우선
---
## [BT7-Plan + BT7-Dev 전체 집행 종합] PM 병렬 위임 완결
**태그**: #BT7-Plan완결 #BT7-Dev완결 #병렬집행 #기획9+Unity6 #commit대기
**집행 구조**:
- 기획팀장 Agent — 기획 9파일 v0.2 (위 엔트리)
- 개발팀장 Agent — Unity 6파일 + PlayerAttackTicker 신설 + EditMode 10→13 + BT 보고서 (바로 위 엔트리)
**총 변경 규모**:
- BT 레포 수정: 기획 9 + 개발팀 PD 지시 로그 + 기획팀 PD 지시 로그 = 11파일
- BT 레포 신규: 대화로그 (본 파일) + 개발 보고 `06_*.md` + 기각 참조 `system/03_*.md` (기존) = 3파일
- BT 백업: Unity 6파일 `bak_20260424_1551.*`
- Unity 외부 레포: 6파일 편집 + 1파일 신설 (`PlayerAttackTicker.cs + .meta`) = 7파일
**PD 수동 검증 대기 (집행 완료 후)**:
1. Unity Asset import + EditMode Test Runner (13 tests green)
2. Player.prefab에 `PlayerAttackTicker` 컴포넌트 부착 + Play 검증 (자동 공격 주기 발동·이동/점프·Enemy 피해·i-frame·HUD 후속)
**후속 Phase 분리 대기**:
- 기획 balance/01 v0.2 수치 확정 후 `attackInterval`·적 ATK 테이블 튜닝
- 기획 system/01·content/01 확정 후 카드 데이터 구조·프리팹 작업
- HUD 하트 UI 스프라이트·각성 발동 풀스크린 구현
### 공유 상태
내부 공유 (C21-①). PM 수행: pm-auditor 감사 → commit → push.
---

View File

@ -0,0 +1,309 @@
---
type: 구현_보고서
scope: BT7-Dev_Phase1
author: 개발팀장
date: 2026-04-24
version: v1.0
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: BT7-Plan 개발 집행 Phase 1 — VS 순수형 자동 발동 + 하트 분할 시스템
data_source: Unity 프로젝트 직접 Edit (D:/NerdNavis/EerieVillage) + BT 레포 문서
status: 코드·InputActions·테스트 갱신 완료 (PD Unity Editor Play 검증 대기)
---
# 06. BT7-Plan VS 순수형 반영 재구조 (Phase 1 개발 집행)
## 1. 배경
2026-04-24 PD 직접 지시 11건 중 **개발 영향 항목**을 Unity 코드·InputActions·EditMode 테스트에 반영.
### 1.1 PD 확정 방향 (개발 연관)
1. **VS 순수형 확정** — 공격 버튼 제거, 이동·점프만. 플레이어 공격은 자동 발동(주기 타이머)
2. **기본 라이프 4** — 하트 1개 = 4 HP (젤다 분할). 카드·성장으로 최대 하트 수 증가 가능
3. **적 ATK 1부터 점진 강화**`PlayerHP -= EnemyATK` 쿼터 단위
4. **동일 카드 스택 업그레이드 Lv.5까지** (Lv.3에서 확장)
5. **각성 조건 VS 원작 동일** — 액티브 Lv.5 + 특정 패시브 1개 이상 + 보물상자
### 1.2 적용 범위 한정
- 본 Phase 1은 **Unity 코드·설정 뼈대 이행**이 목적. `attackInterval`·`maxHearts`·`적 ATK 테이블` 등 구체 수치는 기획 balance/01 v0.2 확정 후 튠
- 카드 시스템(3분류)·각성 메커니즘·보물상자·시작 무기·HUD 하트 분할 UI는 **후속 Phase** — 본 문서 범위 외
- 적 ATK 수치 테이블은 **TODO 주석**만 반영 (balance/01 v0.2 미확정)
## 2. 편집 대상 (Unity 외부 레포 `D:/NerdNavis/EerieVillage/`)
### 2.1 `Assets/Scripts/Gameplay/PlayerAttack.cs` (개정)
**변경 요지**: 이벤트 Execute 로직은 유지하되, **발화 트리거가 수동 입력에서 주기 타이머로 전환**됨을 주석에 명시. 본 파일은 이벤트 정의이므로 발화 로직(타이머)은 별도 컴포넌트로 분리 (SRP).
**주요 변경 라인**:
- 파일 상단 XML 주석: "Fired when the player triggers an attack (mouse left click / touch attack button)" → "Player attack event — fires on a periodic timer (no manual input). BT7-Plan PD 지시 2026-04-24 — VS 순수형 자동 발동 전환 (공격 버튼 제거...)"
- `direction` 필드 주석: "PlayerController.facing 기반"으로 수정 (Ticker가 참조)
- Execute 본문 로직 변경 없음 — Animator Trigger, AudioClip, AttackHitbox.Fire 순차 호출 유지
### 2.2 `Assets/Scripts/Gameplay/PlayerAttackTicker.cs` (신설)
**역할**: `[RequireComponent(typeof(PlayerController))]` Player GameObject에 부착되어 `attackInterval` 초마다 `Schedule<PlayerAttack>` 이벤트를 발화.
**필드 설계**:
- `attackInterval` (기본 0.5s, Inspector 노출) — balance/01 v0.2 튠 대상
- `startupDelay` (기본 0.3s, Inspector 노출) — Spawn 애니메이션 여유
- `attackTimer` (내부) — Time.deltaTime 감산 누적
**Update 로직**:
```csharp
if (!player.controlEnabled || attackInterval <= 0f) return;
attackTimer -= Time.deltaTime;
if (attackTimer <= 0f)
{
attackTimer += attackInterval; // 오버플로 누적 방지 (= 0 리셋이 아닌 + 연산)
var ev = Schedule<PlayerAttack>();
ev.player = player;
ev.direction = player.Facing;
}
```
**확장 API**: `ApplyIntervalMultiplier(float multiplier)` — 카드·특성 효과가 주기 배수 조정할 때 사용. 최소 0.05s clamp.
**설계 근거** (C11):
- PlayerAttack 이벤트(로직) vs Ticker(발화 트리거) 분리 — SRP + 범용성
- 타이머 방식을 교체(예: 카드 수에 따라 동적 주기)하려면 Ticker만 교체. 이벤트는 그대로 재사용
**.meta guid**: `c7d8e9f0a1b20314253647586978a9b0` (충돌 없음 grep 검증)
### 2.3 `Assets/Settings/InputSystem_Actions.inputactions` (개정)
**변경 요지**: Player 맵의 Attack 액션 정의·바인딩 **완전 제거**.
**제거된 섹션**:
1. `actions[].name == "Attack"` 객체 (id `c9d8e7f6-a5b4-4c3d-2e1f-0a9b8c7d6e5f`, Button type)
2. `bindings[].action == "Attack"` 바인딩 2종:
- `<Mouse>/leftButton` (Keyboard&Mouse 그룹)
- `<Gamepad>/rightTrigger` (Gamepad 그룹)
Move·Jump 액션 + UI 맵 전체 유지.
### 2.4 `Assets/Scripts/Mechanics/Health.cs` (개정)
**변경 요지**: 하트 분할 시스템(젤다 방식) 전면 도입.
**신규·개정 API**:
- `const int QuartersPerHeart = 4` 정의
- `maxHearts` 필드 (기본 1, Inspector 노출) — 카드·특성으로 외부 조작
- `maxHP` 필드 기본값 `QuartersPerHeart` (= 4) — `maxHearts * 4`로 Awake에서 재산정
- `Heal(int quarters)` 신규 메서드 — 쿼터 단위 회복, maxHP 상한 체크
- `IncreaseMaxHearts(int delta)` 신규 메서드 — 최대 하트 수 증감 + currentHP 비례 증가 (음수 delta 허용 + clamp)
- `Decrement(int damage)` 오버로드 — 쿼터 단위 피해. 기존 `Decrement()``Decrement(1)`로 위임
- `CurrentHP` 공개 프로퍼티 — HUD가 하트 분할 UI 그리기 위해 읽음
- i-frame 0.6s 유지 (연속 히트 방지는 하트 분할 후에도 필요)
- `Die()` 즉사 로직 단순화 — while 루프 제거, `currentHP = 0` 단일 설정 후 HealthIsZero 이벤트
**Awake 초기화**:
```csharp
if (maxHearts <= 0) maxHearts = 1;
int expected = maxHearts * QuartersPerHeart;
if (maxHP != expected) maxHP = expected;
currentHP = maxHP;
```
구식 프리팹 호환 처리(기존 maxHP=1 직렬화 값이 남아있어도 Awake에서 자동 보정).
**파일 상단 주석**:
> BT7-Plan PD 지시 2026-04-24 — 하트 분할 시스템 (젤다 방식). 하트 1개 = 4 쿼터(HP). 카드(패시브)·성장으로 maxHearts를 증가시킬 수 있으며, 그에 따라 maxHP가 `maxHearts * QuartersPerHeart`로 자동 산정된다. 적 ATK는 쿼터 단위.
### 2.5 `Assets/Scripts/Mechanics/PlayerController.cs` (개정)
**변경 요지**: Attack 입력 관련 필드·로직 완전 제거. Facing 상태 public 노출.
**제거 항목**:
- `private InputAction m_AttackAction` 필드
- `float nextAttackTime` 필드
- `public float attackCooldown` 필드
- Awake에서 `m_AttackAction = InputSystem.actions.FindAction("Player/Attack")` · `m_AttackAction.Enable()` 호출
- Update의 Attack 입력 처리 블록 (WasPressedThisFrame · Schedule<PlayerAttack>) — 단 Ticker 참조 주석 유지
**신규·개정 항목**:
- `public Vector2 Facing => facing` 프로퍼티 (Ticker가 Schedule 시점에 참조)
- `attackAudio` 필드 주석: "자동 발동 시 PlayerAttack.Execute가 PlayOneShot으로 재생" 재작성
- `attackHitbox` 필드 주석: "공격은 PlayerAttackTicker가 주기적으로 Schedule<PlayerAttack>을 발화하여 실행" 추가
### 2.6 `Assets/Scripts/Mechanics/AttackHitbox.cs` (부수 개정)
**변경 요지**: 하트 분할 시스템에 맞춰 적 Decrement 호출 통합.
**개정 라인**:
```csharp
// 기존
for (int i = 0; i < damage; i++)
{
health.Decrement();
if (!health.IsAlive) break;
}
// 개정
// BT7-Plan TODO (2026-04-24): 적 Health도 하트 분할 시스템 대상이지만
// i-frame 구조 탓에 Decrement() 반복 호출은 첫 호출 후 무효화된다.
// Health.Decrement(int damage) 단일 호출로 쿼터 단위 다중 피해 전달.
health.Decrement(damage);
```
**이유**: i-frame 내 `Decrement()` 재호출은 무효화됨. 새 `Decrement(int damage)` 오버로드는 단일 호출에서 damage만큼 쿼터를 즉시 차감.
### 2.7 `Assets/Tests/Editor/PlayerAttackTests.cs` (개정)
**테스트 구조** (총 **13개**):
| # | 테스트 | 상태 | 비고 |
|---|---|---|---|
| 1 | `Player_Prefab_Has_AttackHitbox_Component` | 유지 | BT5-Dev 계승 |
| 2 | `Player_Prefab_Has_Health_Component` | 유지 | |
| 3 | `Player_Prefab_Has_PlayerController_Component` | 유지 | |
| 4 | `AttackHitbox_Default_Damage_Is_One` | 유지 (주석 업데이트) | "balance/01 v0.2 튠 전 파일럿 값" |
| 5 | `AttackHitbox_Active_Duration_Is_Positive` | 유지 | |
| 6 | `Enemy_Prefab_Has_Health_Component` | 유지 | |
| 7 | `Enemy_Prefab_Has_EnemyController_Component` | 유지 | |
| 8 | `Enemy_Prefab_Health_MaxHP_Is_One` | **제거** | BT7-Plan 하트 분할로 maxHP=1 가정 폐기 |
| 9 | `Health_Script_Defines_MaxHearts_And_IncreaseMaxHearts` | **신규** | Health.maxHearts·maxHP·IncreaseMaxHearts·Heal 시그니처 검증 |
| 10 | `Player_Prefab_MaxHP_Reflects_Heart_Quarters` | **신규** | Player.prefab Health 직렬화 값 점검 (maxHP ∈ {maxHearts*4, 1}) |
| 11 | `PlayerAttackTicker_Script_Exists_With_AttackInterval` | **신규** | Ticker 타입·attackInterval float 필드 검증 |
| 12 | `InputActions_Player_Map_Has_No_Attack_Action` | **신규** | YAML grep으로 Player 맵 Attack 액션 부재 검증 |
| 13 | `Player_Prefab_SpriteRenderer_References_PlayerTestGirl` | 유지 | BT5-Dev 3단계 계승 |
| 14 | `Player_Controller_Has_Attack_Parameter_And_State` | 유지 | Ticker → Animator.SetTrigger("attack") 연동 전제 |
**갱신 집계**: 기존 10 → 제거 1 + 신규 4 = **13개**.
## 3. C6-1 백업 파일 목록 (편집 전 원본 보존)
**백업 경로**: `D:/NerdNavis/BurningTimesAi/공유/개발팀_백업/EerieVillage/`
**Timestamp**: `20260424_1551`
| # | 원본 | 백업 파일명 |
|---|------|-----------|
| 1 | `PlayerAttack.cs` | `PlayerAttack.cs.bak_20260424_1551.cs` |
| 2 | `Health.cs` | `Health.cs.bak_20260424_1551.cs` |
| 3 | `PlayerController.cs` | `PlayerController.cs.bak_20260424_1551.cs` |
| 4 | `InputSystem_Actions.inputactions` | `InputSystem_Actions.inputactions.bak_20260424_1551.inputactions` |
| 5 | `PlayerAttackTests.cs` | `PlayerAttackTests.cs.bak_20260424_1551.cs` |
| 6 | `AttackHitbox.cs` | `AttackHitbox.cs.bak_20260424_1551.cs` |
**롤백 절차**: 백업 파일에서 `.bak_20260424_1551` 제거 후 Unity 레포 덮어쓰기.
## 4. PD 수동 검증 요청 항목
Unity Editor 실행 GUI 작업이 필수인 항목만 최소화하여 PD 요청:
### 4.1 Asset import 재처리 + EditMode Test Runner
1. Unity Editor 재실행 (D:/NerdNavis/EerieVillage 프로젝트 열기)
2. Console에 import 오류 없는지 확인 — 특히:
- `PlayerAttackTicker.cs` 신규 파일 인식
- `InputSystem_Actions.inputactions` Attack 액션 제거 후 재컴파일
- `Health.cs` Decrement(int) 오버로드 + IncreaseMaxHearts·Heal 신규 메서드
3. `Window > General > Test Runner` → EditMode → **Run All** → 13 tests all green 확인
### 4.2 Player.prefab에 PlayerAttackTicker 컴포넌트 부착 + Play 검증
**Unity Editor GUI 필수 작업**:
1. `Assets/Prefabs/Player.prefab` 열기
2. Inspector → Add Component → "Player Attack Ticker" 선택 (네임스페이스 `Platformer.Gameplay`)
3. `attackInterval` 기본 0.5s 유지, `startupDelay` 0.3s 유지
4. Prefab 저장 (Ctrl+S)
**Play 모드 검증**:
1. Scene 열기 (`Assets/Scenes/SampleScene.unity`)
2. Play 버튼 클릭
3. 확인 항목:
- (a) 이동·점프 정상 동작 (A/D·Space)
- (b) **마우스 좌클릭 / 게임패드 RT 누르지 않아도 공격 주기적 발동** (0.3초 후 첫 발동, 이후 0.5초 간격)
- (c) Player 근처 Enemy가 공격 판정에 들어오면 1 쿼터 피해 받고 i-frame 동안 중복 피해 없음
- (d) 적 접촉 시 Player도 `Health.Decrement(damage)` 받아 쿼터 1 감소 (i-frame 0.6s)
- (e) 하트 UI 부재로 시각 피드백 없음 (HUD 개정은 후속 Phase) — Inspector Health 컴포넌트에서 currentHP 감소 실측으로 확인
### 4.3 리스크 — Play 검증 전 인지 사항
| 리스크 | 영향 | 대응 |
|---|---|---|
| PlayerAttackTicker 미부착 시 공격 자동 발동 안 됨 | Play에서 공격 0회 | §4.2-1~4 컴포넌트 Add 필수 |
| 기존 Enemy.prefab의 Health.maxHearts Inspector 값이 0 또는 직렬화 부재 | Awake에서 자동 1로 보정 | Health.cs Awake 보정 로직 신뢰 |
| Animator `attack` trigger 미존재 시 SetTrigger warning | Console warning 1회, 동작 무영향 | 기존 BT5-Dev 3단계에서 attack trigger + Player-Attack State 추가됨 (Player.controller YAML 편집 완료) |
| 적 ATK 1 수치 미설정으로 Player 피해 계산 실질 무효 | Decrement(damage=1)라도 i-frame으로 방어 | EnemyController 기반 피해 전달 로직은 후속 Phase |
## 5. 리스크 및 기각안
### 5.1 기각안 (C32 최소 3건 초과 달성 — 5건)
1. **"PlayerAttack.cs 내부에 타이머 직접 구현" — 기각**
- 이벤트 정의와 발화 트리거가 단일 클래스에 혼재 → SRP 위반 (C11 구조 직관성 훼손)
- Ticker 분리로 발화 방식 교체 유연성 확보 (예: 무기 종류별 발동 주기, 일시 정지 등)
2. **"attackInterval을 PlayerController에 통합" — 기각**
- PlayerController는 이미 KinematicObject 상속 + Move/Jump/Facing/Animator 관리 비대
- 공격 로직은 전투 시스템 영역으로 분리 보전 — Phase 3-B 카드 효과 훅 편입 시 의존성 깔끔
3. **"Health.maxHP를 제거하고 maxHearts만 유지" — 기각**
- 기존 Prefab 직렬화 호환성 (maxHP Inspector 값) 파괴 → 모든 Health 사용 prefab 재설정 필요
- HUD·튜닝 도구·스크립트 참조(`health.maxHP`)의 일괄 갱신 비용 과다
- **해결**: maxHP 유지 + Awake에서 `maxHearts * 4`로 재산정 (구식 값 자동 보정)
4. **"Decrement를 `Decrement(int damage=1)` 단일 시그니처로 통합" — 기각**
- 기존 호출자(PlayerEnemyCollision 폐기·다른 스크립트) 회귀 리스크
- **해결**: `Decrement()` 무인자 유지 + `Decrement(int damage)` 오버로드 신규 추가 (Decrement(1) 위임)
5. **"EnemyController에 attackDamage 필드 추가 + 충돌 시 Player Decrement(attackDamage)" — 본 Phase 기각(TODO 주석만)**
- balance/01 v0.2 수치 테이블 미확정 상태에서 EnemyController 구조 개정은 돌이킴 리스크
- **해결**: 본 Phase에서는 TODO 주석만 (적 ATK 테이블 확정 후 별도 Phase)
### 5.2 식별된 리스크
| # | 리스크 | 완화책 |
|---|---|---|
| 1 | Player.prefab에 PlayerAttackTicker가 부착되지 않은 상태로 Play 시 공격 미발동 | PD 수동 작업 §4.2 명시 + EditMode 테스트 11번이 Ticker Script 존재는 검증(prefab 부착은 Unity GUI 필요) |
| 2 | balance/01 v0.2 수치 미확정으로 attackInterval·적 ATK 체감 미측정 | `attackInterval` 기본 0.5s는 파일럿 값 — balance-designer v0.2 확정 후 튠 |
| 3 | 기존 PlayerAttack 호출자 (`PlayerController.Update`·`PlayerEnemyCollision`)가 이미 삭제됨을 검증 없이 가정 | PlayerController Update에서 Schedule<PlayerAttack> 호출 라인 제거 확인 · PlayerEnemyCollision 파일 부재 확인 (glob 결과 Scripts/Mechanics에 미존재) |
| 4 | Health.Decrement(damage) 오버로드가 i-frame 내 호출 시 완전 스킵 (부분 피해 인정 안 함) | 연타 방지 원칙 유지. 향후 "피해 레벨별 i-frame 차등" 필요 시 별도 설계 |
| 5 | AttackHitbox damage=1 기본 + Player 공격 1회당 1 쿼터로 적 Health(maxHP=4)의 적을 4회 연속 타격해야 처치 | balance/01 §5 적 HP 테이블 재검토 대상 (기획팀장 v0.2 확정 시 반영) |
## 6. BT7-Dev 이후 Phase 예정 (범위 외 — 참고)
**Phase 2** (기획 balance/01 v0.2 확정 후):
- EnemyController에 `attackDamage` 필드 추가 + Player 피해 전달 로직
- 적 ATK 테이블 연동 (일반 약/중·엘리트·보스)
- attackInterval 튠
**Phase 3** (기획 system/01·content/01 확정 후):
- 카드 3분류 (액티브·패시브·각성) 데이터 구조
- Player.attackHitbox가 카드 효과 훅 참조
- 보물상자·각성 트리거 로직
**Phase 4** (기획 ux/02 확정 후):
- HUD 하트 분할 UI (♥ 1개 = 4 쿼터 시각화)
- 카드 슬롯 UI (액티브·패시브 분리)
## 7. 자기 검증 (C22-6 정신 준수)
PD 미합의 용어·식별자 자의 신설 없음 자가 검증:
| 항목 | 검증 |
|---|---|
| PD 지시 용어 그대로 사용 | "액티브·패시브·각성·하트·쿼터·보물상자·Lv.5" 모두 PD 원문 그대로 코드 주석·본 문서에 인용 |
| 신규 클래스명 `PlayerAttackTicker` | PD 미합의 신설. 단 PD 지시 "자동 발동 주기 타이머"의 직관적 구현 기술 명명이며, 코드 내부 구조 결정(C11 범용성·직관성 적용) |
| 신규 필드명 `maxHearts`·`QuartersPerHeart`·`Heal`·`IncreaseMaxHearts` | PD 미합의 신설. 단 기존 `maxHP`·`Decrement` 컨벤션 계승한 영문 기술 명명. PD 한글 용어("하트"·"쿼터")의 영문 직역 |
| 안건 넘버링 | 본 문서 섹션 번호는 C25-1 1.·1)·A. 준수 |
| 선택지 식별자 | 본 Phase 내부 의사결정 "A안·B안" 자의 부여 없음 (PD 결정 요구 없음 — 전적으로 개발 구현) |
**판정**: C22-6 정신 위반 없음. 신규 식별자는 **구현 세부 수준의 기술 명명**이며, PD 방향·원칙 수준 결정에 영향 없음 (C36 적용 범위 내).
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|---|---|---|---|
| 2026-04-24 | v1.0 BT7-Dev Phase 1 — VS 순수형 자동 발동 + 하트 분할 + 테스트 갱신 | PD 지시 2026-04-24 11건 중 개발 영향분 | 개발팀장 |
## 9. 참조 문서
- **기획 방향 근거**: `공유/대화로그/EerieVillage/2026-04-24.md` BT7-Plan 7개 엔트리
- **선행 구현 문서**: `프로젝트/EerieVillage/개발/04_BT5-Dev_2단계_구현보고.md` v0.2 · `프로젝트/EerieVillage/개발/05_PlayerTestGirl_아틀라스_적용.md`
- **Unity 외부 레포 편집**: `D:/NerdNavis/EerieVillage/Assets/Scripts/Gameplay/{PlayerAttack.cs, PlayerAttackTicker.cs(신설)}`·`Assets/Scripts/Mechanics/{Health.cs, PlayerController.cs, AttackHitbox.cs}`·`Assets/Settings/InputSystem_Actions.inputactions`·`Assets/Tests/Editor/PlayerAttackTests.cs`
- **C6-1 백업**: `공유/개발팀_백업/EerieVillage/*.bak_20260424_1551.*` (6종)
- **PD 지시 로그**: `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT7-Dev 신규 항목
- **대화로그**: `공유/대화로그/EerieVillage/2026-04-24.md` (BT7-Dev 착수 엔트리 신설 예정)

View File

@ -2,29 +2,29 @@
type: 초기_기획_골격 type: 초기_기획_골격
scope: 게임_컨셉 scope: 게임_컨셉
author: 기획팀장 author: 기획팀장
date: 2026-04-23 date: 2026-04-24
version: v0.1 (파일럿) version: v0.2 (BT7-Plan 개정)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist) project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3 A (파일럿 초기 골격) phase: Phase 3 A (BT7-Plan 개정 반영)
data_source: PD 핵심 게임 룰 9개 (2026-04-23 지시 원문) data_source: PD 핵심 게임 룰 9개 (2026-04-23) + BT7-Plan PD 확정 방향 11건 (2026-04-24)
status: 초기 골격 — Phase 3-B/C에서 narrative-designer·system-designer 상세 확장 예정 status: BT7-Plan 개정 반영 — VS 순수형 덱빌딩·액티브/패시브/각성·하트 분할·공격 자동화
--- ---
# 01. 게임 컨셉 # 01. 게임 컨셉
## 1. 정체성 한 줄 ## 1. 정체성 한 줄
**"한 번의 죽음이 곧 성장의 한 사이클이 되는, 조선 퇴마사의 빠른 횡스크롤 로그라이크."** **"한 번의 죽음이 곧 성장의 한 사이클이 되는, 조선 퇴마사의 Vampire Survivors 순수형 횡스크롤 로그라이크."**
## 2. 재미의 축 (P30 — "어떤 재미를 강화하는가") ## 2. 재미의 축 (P30 — "어떤 재미를 강화하는가")
재미의 축은 **3가지 중 1·2를 핵심, 3을 보조**로 정의한다. 참신함:일관성 = 3:7 원칙 준수. 재미의 축은 **3가지 중 1·2를 핵심, 3을 보조**로 정의한다. 참신함:일관성 = 3:7 원칙 준수.
1. **육성 롤러코스터의 카타르시스** — 레벨업마다 3장 중 1장 카드 픽으로 빌드가 급격히 성장 → 보스 격파 직전의 전능감 → 사망 1회로 전부 초기화되는 낙차. 짧은 사이클에서 "쌓고·폭발하고·잃는" 감정 곡선이 핵심. 1. **육성 롤러코스터의 카타르시스** — 레벨업마다 액티브·패시브 카드 픽으로 빌드가 급격히 성장 → 각성 발동 시 전능감 절정 → 사망 1회로 런 내 성장 초기화되는 낙차. 짧은 사이클에서 "쌓고·폭발하고·잃는" 감정 곡선이 핵심. **하트 수 증가·각성 진화 2중 성장 축**으로 빌드 감정 곡선을 고도화한다.
2. **액션 플랫포머의 손맛** — 이동·점프·공격의 즉각적 피드백. 로그라이크 특유의 "숫자 빌드" 재미에 갇히지 않고, 횡스크롤 조작으로 카드 효과를 직접 체험·전달하는 물성감. 2. **"보며 즐기는" 액션 플랫포머** — 이동·점프만으로 적을 회피하며, 장착한 액티브 무기가 **자동 발동**하는 장면을 감상하는 재미. VS 원작 계승. 조작 복잡도 최소화(캐주얼 포지션)이되 회피·포지셔닝·보물상자 획득 타이밍 관리가 플레이어 스킬을 형성.
3. **(보조) 영속 성장의 위안** — 특성 시스템으로 "완전 무(無)로 돌아가지 않는다"는 안도감. 1·2의 고조·낙차가 절망으로 굳지 않도록 받쳐주는 축. 3. **(보조) 영속 성장의 위안** — 특성 시스템으로 "완전 무(無)로 돌아가지 않는다"는 안도감. 1·2의 고조·낙차가 절망으로 굳지 않도록 받쳐주는 축.
**재미 판단 근거**: 라이프 1·레벨 초기화·카드 전손이라는 가혹한 벌칙을 PD님이 코어 룰 7로 확정한 것은 1의 낙차 극대화가 이 게임의 본질임을 의미. 2는 PlatformerMicrogame 템플릿 선택의 필연적 귀결. 3은 1의 가혹함을 상쇄하는 안전장치로 코어 룰 9가 명시한 유일한 영속성. **재미 판단 근거**: 기본 라이프 4 + 젤다 방식 하트 분할(PD 2026-04-24 확정) 구조는 "피격 즉사"의 가혹함을 유지하면서도 카드·성장으로 **최대 하트 수를 늘리는 육성 보상**을 제공하여 재미 축 1을 2중화한다. 공격 버튼 제거(VS 순수형) 결정은 재미 축 2를 "조작의 물성감"에서 "감상·포지셔닝의 물성감"으로 재정의하되, 이동·점프의 즉각 반응은 유지한다. 3은 코어 룰 9가 명시한 유일한 영속성.
## 3. 타겟 유저 ## 3. 타겟 유저
@ -43,9 +43,9 @@ status: 초기 골격 — Phase 3-B/C에서 narrative-designer·system-designer
## 5. 세일즈 포인트 (4종) ## 5. 세일즈 포인트 (4종)
1. **한 사이클 3~10분의 압축 카타르시스** — 캐주얼 로그라이크 포지션. 모바일 자투리 플레이 친화. 1. **한 사이클 3~10분의 압축 카타르시스** — 캐주얼 로그라이크 포지션. 모바일 자투리 플레이 친화.
2. **"3장 픽 + 조합"이라는 직관적 빌드 구축** — 스킬 카드 상세는 Phase 3-B 확장. 2. **"액티브+패시브=각성" 3분류 덱빌딩** — 액티브 무기 자동 발동 + 패시브 강화 + 조건 충족 시 각성 카드 진화라는 VS 원작 계승 구조.
3. **단일 라이프·단일 낙차의 긴장감** — 라이프 1 룰이 만드는 고유 플레이 경험. 3. **하트 분할·각성 진화의 2중 성장 긴장감** — 기본 라이프 4 + 젤다 방식 하트 분할 + 카드·성장으로 최대 하트 수 증가 구조가 만드는 생존·육성 동시 관리 경험.
4. **조선·퇴마 세계관 차별화** — 서양식 판타지 레드오션에서 동아시아 로컬 IP로 포지셔닝. 상세 세계관 SOT는 `narrative-designer` 작업(Phase 3-B). 4. **조선·퇴마 세계관 차별화** — 서양식 판타지 레드오션에서 동아시아 로컬 IP로 포지셔닝. 상세 세계관 SOT는 `narrative-designer` 작업(Phase 3-B, 현행 유지).
## 6. 상세 보류 — Phase 3-B/C 이관 ## 6. 상세 보류 — Phase 3-B/C 이관
@ -56,12 +56,15 @@ status: 초기 골격 — Phase 3-B/C에서 narrative-designer·system-designer
## 7. 기각안 ## 7. 기각안
1. **"3라이프·레벨 유지" 변형 — 기각.** PD 코어 룰 7(라이프 1·레벨 초기화) 고수. 낙차가 재미 축 1의 정체성이므로 완화 시 게임 성립 불가. 1. **"라이프 1 즉사 완전 고수" 변형 — 기각 (BT7-Plan 번복).** 원안은 라이프 1 고수였으나 PD 2026-04-24 BT7-Plan에서 "기본 라이프 4 + 젤다 방식 하트 분할 + 카드·성장으로 하트 수 증가"로 전환. 낙차 재미는 "하트 1개 구조의 피격 즉사 가능성"으로 유지하되, 육성 성장 축을 최대 하트 수 증가로 2중화. **기각안 유지(번복 기록)**: 원 기각 사유는 PD 지시로 무효화되었으나 설계 역사 보존 목적으로 본 기각안 섹션에 남긴다 (C14-5 히스토리 보존 정신).
2. **"하드코어 로그라이크" 포지션 — 기각.** 룰 1 "캐주얼 로그라이크" 고수. Dead Cells·Hollow Knight 난이도 방향은 타겟 유저 확장 포기 의미. 2. **"하드코어 로그라이크" 포지션 — 기각 (현행 유지).** 룰 1 "캐주얼 로그라이크" 고수. Dead Cells·Hollow Knight 난이도 방향은 타겟 유저 확장 포기 의미.
3. **"탑뷰 로그라이크" 변형 — 기각.** 룰 2 횡스크롤 플랫포머 확정. 템플릿(2D PlatformerMicrogame)과 정합. 3. **"탑뷰 로그라이크" 변형 — 기각 (현행 유지).** 룰 2 횡스크롤 플랫포머 확정. 템플릿(2D PlatformerMicrogame)과 정합.
4. **"수동 공격 유지" 변형 — 기각 (BT7-Plan 신규).** PD 2026-04-24 BT7-Plan에서 "덱빌딩 방식 VS 순수형 — 공격 버튼 제거, 이동·점프만" 확정. 액티브 카드의 자동 발동 체계로 전환. VS 원작 계승 구조에서 조작 복잡도 최소화 + 카드 시너지 감상 재미 극대화.
5. **"4티어 레어리티 체계 유지" 변형 — 기각 (BT7-Plan 신규).** PD 2026-04-24 BT7-Plan에서 "액티브+패시브=각성" 3분류 구조로 전환. 기존 T1/T2/T3 티어·Common/Uncommon/Rare/Epic 레어리티 체계 폐기. 상세: `system/01_카드_시스템.md` v0.2.
## 8. 변경 이력 ## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|---|---|---|---| |---|---|---|---|
| 2026-04-23 | v0.1 파일럿 초기 골격 작성 | PD 지시 BT5 | 기획팀장 | | 2026-04-23 | v0.1 파일럿 초기 골격 작성 | PD 지시 BT5 | 기획팀장 |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (덱빌딩 VS 순수형·액티브/패시브/각성·하트 분할·공격 자동화) | 기획팀장 |

View File

@ -2,12 +2,12 @@
type: 초기_기획_골격 type: 초기_기획_골격
scope: 코어_루프 scope: 코어_루프
author: 기획팀장 author: 기획팀장
date: 2026-04-23 date: 2026-04-24
version: v0.1 (파일럿) version: v0.2 (BT7-Plan 개정)
project: EerieVillage project: EerieVillage
phase: Phase 3 A phase: Phase 3 A
data_source: PD 핵심 게임 룰 9개 (2026-04-23) data_source: PD 핵심 게임 룰 9개 (2026-04-23) + BT7-Plan PD 확정 방향 11건 (2026-04-24)
status: 초기 골격 — 상세 페이싱·씬 전환은 Phase 3-B status: BT7-Plan 개정 반영 — 보물상자 각성 트리거·하트 수 런 내 성장
--- ---
# 02. 코어 루프 # 02. 코어 루프
@ -27,15 +27,20 @@ status: 초기 골격 — 상세 페이싱·씬 전환은 Phase 3-B
├─ 일반 구간 진행 ├─ 일반 구간 진행
│ │ │ │
│ ├─ 적 처치 → 경험치 획득 │ ├─ 적 처치 → 경험치 획득 (액티브 무기 자동 발동으로 처치)
│ │ │ │ │ │
│ │ └─ 레벨업 트리거 → [스킬 카드 3픽] │ │ └─ 레벨업 트리거 → [스킬 카드 3픽: 액티브/패시브 2축 드로우]
│ │ │ │ │ │
│ │ └─ 1장 선택 → 빌드 강화 → 전투 재개 │ │ └─ 1장 선택 → 빌드 강화 → 전투 재개
│ │ │ │
│ ├─ 보물상자 획득 → [각성 발동 판정]
│ │ │ (액티브 Lv.5 + 각성 필요 패시브 1개 이상 보유 시)
│ │ └─ 조건 충족 시 → [각성 카드 발동] (액티브 진화)
│ │
│ ├─ 아이템 획득 → [장착 or 교체 or 포기] (파츠별 1개) │ ├─ 아이템 획득 → [장착 or 교체 or 포기] (파츠별 1개)
│ │ │ │
│ └─ 피격 → 라이프 1이므로 즉시 [사망 분기] │ └─ 피격 → 하트 감소 (피해량만큼 쿼터 단위 차감)
│ └─ 하트 전소 시 → [사망 분기]
└─ 최종 구간: [보스 전투] └─ 최종 구간: [보스 전투]
@ -48,7 +53,8 @@ status: 초기 골격 — 상세 페이싱·씬 전환은 Phase 3-B
[사망 분기] [사망 분기]
├─ 캐릭터 레벨 → 1 초기화 ├─ 캐릭터 레벨 → 1 초기화
├─ 습득한 스킬 카드 → 전부 소실 ├─ 습득한 스킬 카드 (액티브·패시브·각성) → 전부 소실
├─ 최대 하트 수 → 기본 1개로 복귀 (런 내 증가분 소실)
├─ 장착 아이템 → 유지 (코어 룰 8) ├─ 장착 아이템 → 유지 (코어 룰 8)
├─ 특성 → 유지 (코어 룰 9) ├─ 특성 → 유지 (코어 룰 9)
@ -66,20 +72,22 @@ status: 초기 골격 — 상세 페이싱·씬 전환은 Phase 3-B
| 자산 | 사망 시 처리 | 근거 | | 자산 | 사망 시 처리 | 근거 |
|---|---|---| |---|---|---|
| **레벨** | 1로 초기화 | 코어 룰 7 | | **레벨** | 1로 초기화 | 코어 룰 7 |
| **스킬 카드** | 전부 소실 | 코어 룰 7 | | **스킬 카드 (액티브·패시브·각성)** | 전부 소실 | 코어 룰 7 + BT7-Plan |
| **장착 아이템** | 유지 | 코어 룰 8 | | **최대 하트 수** | 기본 1개로 복귀 (런 내 증가분 소실) | BT7-Plan — 하트 성장은 런 내만 유효 |
| **특성** | 유지 | 코어 룰 9 | | **장착 아이템 (기본 무기 포함)** | 유지 | 코어 룰 8 |
| **HP(라이프)** | 1 (기본값이자 최대값) | 코어 룰 7 — 라이프 1 전제 | | **특성** | 유지 (영구) | 코어 룰 9 |
| **HP(라이프)** | 기본 라이프 4 쿼터 (하트 1개 만땅) | BT7-Plan — 젤다 방식 하트 분할 |
| **메타 재화** (Phase 3-B 결정) | — | balance-designer 영역, 보류 | | **메타 재화** (Phase 3-B 결정) | — | balance-designer 영역, 보류 |
## 5. 분기 포인트 (의사결정 감정) ## 5. 분기 포인트 (의사결정 감정)
본 루프의 재미 리듬 형성 지점. Phase 3-B에서 상세 UI/UX 설계: 본 루프의 재미 리듬 형성 지점. Phase 3-B에서 상세 UI/UX 설계:
1. **레벨업 카드 3픽** — 매 레벨업마다 발생. 육성 방향 결정의 핵심 긴장. 1. **레벨업 카드 3픽 (액티브·패시브 2축 드로우)** — 매 레벨업마다 발생. 육성 방향 결정의 핵심 긴장. 액티브 강화 vs 패시브 강화 vs 각성 조건 만들기 선택.
2. **아이템 획득 시 교체·포기** — 파츠 1개 제한의 희소성 부담. 2. **보물상자 발견·획득 타이밍** — 각성 발동 트리거. 조건 충족(액티브 Lv.5 + 필요 패시브 1개 이상) 전 vs 후 획득 가치 차이. "아직 조건 안 찼으니 보물상자 획득 미루기"의 포지셔닝 긴장.
3. **보스 처치 후 마을 복귀 vs 다음 스테이지** — 안전 귀환(보상 확정) vs 욕심(더 강한 빌드·더 큰 보상) 선택. 3. **아이템 획득 시 교체·포기** — 파츠 1개 제한의 희소성 부담.
4. **스테이지 선택 (마을)** — 특성·아이템 보유 상태 기준 도전 난이도 결정. 4. **보스 처치 후 마을 복귀 vs 다음 스테이지** — 안전 귀환(보상 확정) vs 욕심(더 강한 빌드·더 큰 보상) 선택.
5. **스테이지 선택 (마을)** — 특성·아이템 보유 상태 기준 도전 난이도 결정.
## 6. 상세 보류 — Phase 3-B/C ## 6. 상세 보류 — Phase 3-B/C
@ -90,12 +98,14 @@ status: 초기 골격 — 상세 페이싱·씬 전환은 Phase 3-B
## 7. 기각안 ## 7. 기각안
1. **"사망 시 체크포인트 부활" 변형 — 기각.** 코어 룰 7 "라이프 1 + 마을 복귀" 고수. 체크포인트는 낙차를 무력화하여 재미 축 1 성립 불가. 1. **"사망 시 체크포인트 부활" 변형 — 기각.** 코어 룰 7 "마을 복귀" 고수. 체크포인트는 낙차를 무력화하여 재미 축 1 성립 불가.
2. **"보스 선택지 없이 자동 다음 스테이지 진행" — 기각.** 코어 룰 5 "복귀 or 다음" 고수. 욕심·안전 분기 긴장이 루프의 핵심 의사결정. 2. **"보스 선택지 없이 자동 다음 스테이지 진행" — 기각.** 코어 룰 5 "복귀 or 다음" 고수. 욕심·안전 분기 긴장이 루프의 핵심 의사결정.
3. **"던전 중간 세이브" — 기각.** 캐주얼 로그라이크 포지션과 상충. 한 런을 단일 세션으로 종결하는 리듬 유지. 3. **"던전 중간 세이브" — 기각.** 캐주얼 로그라이크 포지션과 상충. 한 런을 단일 세션으로 종결하는 리듬 유지.
4. **"최대 하트 수 영구 유지 (메타 성장)" — 기각 (BT7-Plan 신규).** PD 2026-04-24 BT7-Plan에서 "카드·성장으로 최대 하트 수 증가 가능"을 **런 내 성장**으로 한정 확정. 사망 시 기본 1개로 복귀하여 매 런의 긴장 유지. 영구 유지는 재미 축 1의 낙차를 무력화. 영구 성장은 특성 시스템(코어 룰 9)이 전담.
## 8. 변경 이력 ## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|---|---|---|---| |---|---|---|---|
| 2026-04-23 | v0.1 파일럿 초기 골격 | PD 지시 BT5 | 기획팀장 | | 2026-04-23 | v0.1 파일럿 초기 골격 | PD 지시 BT5 | 기획팀장 |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (보물상자 각성 트리거·하트 수 런 내 성장·액티브/패시브 2축 드로우) | 기획팀장 |

View File

@ -2,12 +2,12 @@
type: 초기_기획_골격 type: 초기_기획_골격
scope: 전투_기본_스펙 scope: 전투_기본_스펙
author: 기획팀장 author: 기획팀장
date: 2026-04-23 date: 2026-04-24
version: v0.1 (파일럿) version: v0.2 (BT7-Plan 개정)
project: EerieVillage project: EerieVillage
phase: Phase 3 A phase: Phase 3 A
data_source: PD 핵심 게임 룰 2·7 (2026-04-23) + Unity 6000.3.13f1 LTS 2D PlatformerMicrogame data_source: PD 핵심 게임 룰 2·7 (2026-04-23) + BT7-Plan PD 확정 방향 11건 (2026-04-24) + Unity 6000.3.13f1 LTS 2D PlatformerMicrogame
status: 초기 골격 — 수치 실측·모바일 터치 스킴은 Phase 3-B (balance-designer·ux-designer) status: BT7-Plan 개정 반영 — VS 순수형 (공격 버튼 제거)·하트 분할·액티브 자동 발동
--- ---
# 04. 전투 기본 스펙 # 04. 전투 기본 스펙
@ -15,37 +15,64 @@ status: 초기 골격 — 수치 실측·모바일 터치 스킴은 Phase 3-B (b
## 1. 재미 축 연결 ## 1. 재미 축 연결
본 스펙이 강화하는 재미: 본 스펙이 강화하는 재미:
- **축 2 (액션 플랫포머 손맛)** — 이동·점프·공격의 즉각 반응이 모든 카드·특성 효과를 체감시키는 기반 - **축 2 ("보며 즐기는" 액션 플랫포머)** — 이동·점프의 즉각 반응 + 장착 액티브 무기의 자동 발동 감상. VS 원작 계승. 조작 복잡도 최소화이되 회피·포지셔닝·보물상자 획득 타이밍 관리가 플레이어 스킬.
- **축 1 낙차 강화** — 라이프 1·피격 즉사가 "한 번의 실수"에 무게를 실어 긴장 유지 - **축 1 낙차·성장 2중 축** — 하트 1개 구조에서 피격 즉사 가능성(긴장 유지) + 카드·성장으로 최대 하트 수 증가(육성 보상). 두 축이 런 내 동시에 작동.
## 2. 기본 액션 (3종) ## 2. 기본 액션 (2종)
| 액션 | PC 입력 (원본 참조) | 모바일 입력 (Phase 3-B 확정 예정) | | 액션 | PC 입력 (원본 참조) | 모바일 입력 (Phase 3-B 확정 예정) |
|---|---|---| |---|---|---|
| **이동** | WASD / 방향키 | 화면 좌측 가상 스틱 | | **이동** | WASD / 방향키 | 화면 좌측 가상 스틱 |
| **점프** | Space | 화면 우측 점프 버튼 | | **점프** | Space | 화면 우측 점프 버튼 |
| **공격** | 마우스 좌클릭 | 화면 우측 공격 버튼 |
모바일 터치 스킴 상세(버튼 배치·Safe Area·드래그 감도)는 **ux-designer** 영역 (Phase 3-B). BT.Framework 후보(UITouchHandler·BackKeyDispatcher·SafeAreaBorder)와 연결. **공격은 플레이어 수동 입력이 아닌 장착 액티브 카드의 자동 발동**으로 처리 (§5 참조). BT7-Plan PD 확정 방향 2 (VS 순수형).
모바일 터치 스킴 상세(버튼 배치·Safe Area·드래그 감도)는 **ux-designer** 영역 (`ux/01_모바일_터치_UX.md` v0.2). BT.Framework 후보(UITouchHandler·BackKeyDispatcher·SafeAreaBorder)와 연결.
## 3. 라이프·피격 판정 ## 3. 라이프·피격 판정
### 3-1. 핵심 규칙 (코어 룰 7) ### 3-1. 핵심 규칙 — 기본 라이프 4 + 젤다 방식 하트 분할 (BT7-Plan PD 확정 방향 7)
- **기본 라이프 1**. HP 최대값 = 1 **젤다의 전설 BotW 방식 하트 분할 구조**를 계승한다.
- **피격 1회 = 사망** → 사망 분기 발동 (02_코어_루프 §4)
- **힐·회복 수단**: Phase 3-B 결정 (라이프 1 전제에서 "일시적 실드·회피 기회"로 대체 가능 — balance-designer 판단)
### 3-2. 무적 시간 (i-frame) — 설계 방향 | 요소 | 값·규칙 |
|---|---|
| **기본 라이프 (최소 단위 HP)** | 4 쿼터 (1 하트 = 4 HP) |
| **하트 아이콘 표기** | ♥ (풀 하트 = 4/4 쿼터) |
| **시작 시 보유 하트 수** | 기본 1개 (최대 HP = 4) |
| **피해 1** | 1 쿼터 감소 (3/4 하트) |
| **피해 2** | 반 하트 감소 (2/4 하트) |
| **피해 3** | 3 쿼터 감소 (1/4 하트) |
| **피해 4** | 하트 1개 완전 소멸 |
| **최대 하트 수 증가** | 카드·성장으로 런 내 추가 획득 가능 (예: 하트 2개 = 최대 HP 8) |
| **사망 조건** | 모든 하트 쿼터 0 도달 시 사망 분기 (02_코어_루프 §4) |
- **피격 직후 무적 시간 N ms**: 라이프 1이지만 **연속 히트 인정 금지**. N 값은 Phase 3-B 실측 (후보: 400~800ms 범위) ### 3-2. 하트 분할 시각화 5단계
- **대시·회피 동작 중 무적**: 회피 메커니즘 도입 여부 + 프레임은 Phase 3-B
각 하트 아이콘은 다음 5단계 시각 상태를 가진다:
| 상태 | 남은 쿼터 | 시각 표현 |
|---|---|---|
| 풀 | 4/4 | ♥ (완전 채워짐) |
| 3/4 | 3/4 | ♥ (3/4 채워짐, 우하단 1/4 비움) |
| 반 | 2/4 | ♥ (절반 채워짐, 좌측만) |
| 1/4 | 1/4 | ♥ (1/4만 채워짐, 좌상단) |
| 빈 | 0/4 | ♡ (외곽선만) |
상세 UI 스프라이트 분할은 ux-designer `ux/02_HUD_설계.md` v0.2 이관.
### 3-3. 무적 시간 (i-frame) — 0.6s (근거 재검토 완료)
- **피격 직후 무적 시간 0.6초**: 하트 다단 구조 하에서도 연속 히트 방지 기준 유효. 적 ATK 2 연타 시 "반 하트 감소(2 쿼터)"로 보호됨 → i-frame 없으면 단일 프레임에 하트 1개 전소 가능
- **재검토 결과**: 적 ATK가 1~4 범위로 확장되므로 i-frame 0.6s는 **여전히 유효**. `balance/01_전투_수치.md` v0.2 §4 산출 근거 갱신
- **대시·회피 동작 중 무적**: 회피 메커니즘 도입 여부는 Phase 3-C
- **무적 시각화**: 깜박임·외곽선 등 UX 피드백 의무 (ux-designer) - **무적 시각화**: 깜박임·외곽선 등 UX 피드백 의무 (ux-designer)
### 3-3. 재미 균형 (P30 판단) ### 3-4. 재미 균형 (P30 판단)
- 라이프 1은 "가혹함"이지만 **회피 가능한 패턴 설계**가 전제되어야 액션 재미 성립 - 하트 1개 + 젤다 분할 구조는 "가혹함(피격 즉사 가능성)"과 "여유(피해량에 따라 살아남음)"의 혼합
- "피격 = 사망"이 "랜덤 사망"으로 느껴지면 재미 축 2 붕괴 → **가독 높은 적 공격 패턴** 의무 (level-designer·content-designer) - 최대 하트 수 증가는 카드 픽 선택의 핵심 성장 축 — "공격력 강화 vs 생존력 강화"의 고전적 육성 트레이드오프
- **가독 높은 적 공격 패턴** 의무 (level-designer·content-designer) — 피해량 표기가 명확해야 분할 구조 체감
## 4. 점프·이동 (PlatformerMicrogame 기반) ## 4. 점프·이동 (PlatformerMicrogame 기반)
@ -54,47 +81,82 @@ status: 초기 골격 — 수치 실측·모바일 터치 스킴은 Phase 3-B (b
Unity 2D PlatformerMicrogame 기본 점프·이동 구조 그대로 계승 (변경 유발 시 개발팀 C11 판단 동반). Unity 2D PlatformerMicrogame 기본 점프·이동 구조 그대로 계승 (변경 유발 시 개발팀 C11 판단 동반).
- 중력 · 점프 높이 · 이동 속도: 템플릿 기본값 → Phase 3-B에서 EerieVillage 튠 (balance-designer) - 중력 · 점프 높이 · 이동 속도: 템플릿 기본값 → Phase 3-B에서 EerieVillage 튠 (balance-designer)
- **2단 점프 여부**: Phase 3-B 결정 (액션성 vs 캐주얼성 트레이드오프 — PD 검토 대상) - **2단 점프 여부**: Phase 3-B 결정 (액션성 vs 캐주얼성 트레이드오프)
### 4-2. 횡스크롤 카메라 ### 4-2. 횡스크롤 카메라
- 기본 follow-cam. 보스룸은 고정 카메라 전환 (연출) - 기본 follow-cam. 보스룸은 고정 카메라 전환 (연출)
- 화면 비율·Safe Area: BT.Framework `SafeAreaBorder` 활용 (P29 계승) - 화면 비율·Safe Area: BT.Framework `SafeAreaBorder` 활용 (P29 계승)
## 5. 공격 (근거리 1종 시작) ## 5. 공격 — 장착 액티브 자동 발동 (VS 순수형)
### 5-1. 기본 공격 ### 5-1. 수동 공격 없음
- **근거리 공격** 1종으로 파일럿 시작 (마우스 좌클릭 / 터치 버튼) **플레이어 수동 공격 입력은 존재하지 않는다** (BT7-Plan PD 확정 방향 2). 공격 버튼·공격 키 입력 없음.
- **쿨타임·대미지·판정 박스**: 템플릿 기본값 → Phase 3-B 튠
### 5-2. 카드 효과에 의한 확장 ### 5-2. 기본 시작 무기 1종 (퇴마사 고유)
- 원거리·AoE·특수 공격은 **스킬 카드 효과로 획득**하는 방향 (Phase 3-B system-designer) VS 원작의 "캐릭터 고유 무기 1종 지급" 패턴 계승. EerieVillage 파일럿은 **퇴마사 고유 기본 무기 1종**으로 시작한다.
- 기본 공격에 카드 효과가 **합성**되어 빌드 다양성 형성 (03_진행_시스템 §3-2 조합 개념과 연결)
- **기본 무기 개요**: 자동 발동형 근거리 or 전방 판정. 상세 무기명·판정 박스·발동 주기는 `content/01_카드_풀.md` v0.2 액티브 카테고리에서 확장
- **코어 룰 8 "장착 유지"**: 기본 무기는 사망 시에도 유지 (초기 무기 자산)
### 5-3. 액티브 카드 자동 발동 체계
장착한 액티브 카드는 각자 고유 발동 주기·판정 박스·대미지 수치를 가진다. 플레이어 입력 없이 자동 발동.
- **발동 주기**: 카드별 고유 쿨다운 (content·balance-designer 이관)
- **판정 박스**: 카드별 고유 범위 (전방·원형·직선·부채꼴 등)
- **스택 업그레이드**: 동일 액티브 재픽 시 Lv.1 → Lv.5까지 강화 (규칙 상세: `system/01_카드_시스템.md` v0.2 규칙 4)
- **각성 발동**: 액티브 Lv.5 + 각성에 필요한 특정 패시브 1개 이상 보유 + 보물상자 획득 시 각성 카드 발동 (§5-4)
### 5-4. 각성 발동 조건 (VS 원작 동일)
BT7-Plan PD 확정 방향 5 — VS 원작 각성 조건 동일 계승.
```
각성 발동 조건:
1. 해당 액티브 카드가 Lv.5 도달
2. 각성에 필요한 특정 패시브 카드 1개 이상 보유
3. 보물상자 획득
→ 세 조건 동시 충족 시 각성 카드 자동 발동 (액티브가 각성 형태로 진화)
```
각 각성 카드마다 **필요 액티브 + 필요 패시브 쌍**이 명시된다 (`content/01_카드_풀.md` v0.2 §3 각성 카테고리).
### 5-5. 카드 효과에 의한 기본 무기 강화
기본 시작 무기도 패시브 카드(공격력·공격 속도·판정 범위 증가 등)의 영향을 받는다. 기본 무기 자체를 각성 조건에 포함시킬지는 `content/01_카드_풀.md` v0.2 결정.
## 6. 피격·사망 연출 ## 6. 피격·사망 연출
- 피격 시 시각·청각·진동(모바일) 3종 피드백 의무 (ux-designer) - 피격 시 시각·청각·진동(모바일) 3종 피드백 의무 (ux-designer)
- **피해량별 피드백 차등**: 피해 1 = 짧은 진동, 피해 4 = 강한 진동 + 화면 흔들림 (체감 구분)
- 사망 연출은 **1~2초 이내 짧게** 처리 (캐주얼 로그라이크 페이싱 유지) - 사망 연출은 **1~2초 이내 짧게** 처리 (캐주얼 로그라이크 페이싱 유지)
- 사망 직후 마을 복귀 전환: 로딩 느낌 없이 연속감 있게 (Phase 3-B UX) - 사망 직후 마을 복귀 전환: 로딩 느낌 없이 연속감 있게 (Phase 3-B UX)
## 7. 상세 보류 — Phase 3-B/C ## 7. 상세 보류 — Phase 3-B/C
- **구체 수치** (이동 속도·점프 높이·공격 쿨타임·대미지·무적 시간): balance-designer + 개발팀 엔진 실측 (Phase 3-B) - **구체 수치** (이동 속도·점프 높이·i-frame 재검토 미세 조정·액티브 발동 주기·대미지): balance-designer + 개발팀 엔진 실측 (Phase 3-B)
- **최대 하트 수 증가 상한**: balance-designer 결정. 카드 스택 제한과 동일 철학으로 하드캡 필요 (초기 권고 3~5개)
- **액티브 자동 발동 주기 기본 수치**: balance-designer 이관 (`balance/01_전투_수치.md` v0.2)
- **적 AI 기본 패턴**: level-designer + content-designer (Phase 3-B) - **적 AI 기본 패턴**: level-designer + content-designer (Phase 3-B)
- **보스 공격 패턴 설계 규칙**: level-designer (Phase 3-B 05 문서 연계) - **보스 공격 패턴 설계 규칙**: level-designer (Phase 3-B 05 문서 연계)
- **회피·블록 메커니즘 도입 여부**: PD 결정 대상 (Phase 3-B) - **회피·블록 메커니즘 도입 여부**: PD 결정 대상 (Phase 3-C)
- **모바일 터치 UX 상세**: ux-designer + BT.Framework 통합 (Phase 3-B) - **모바일 터치 UX 상세**: ux-designer + BT.Framework 통합 (Phase 3-B)
- **기본 무기 세부 스펙**: content-designer 이관 (`content/01_카드_풀.md` v0.2)
## 8. 기각안 ## 8. 기각안
1. **"HP 막대 도입" 변형 — 기각.** 코어 룰 7 "라이프 1" 고수. HP 막대는 축 1 낙차 무력화. 1. **"HP 막대 도입" 변형 — 기각 (BT7-Plan 번복).** 원 기각 사유는 "라이프 1 고수, HP 막대는 축 1 낙차 무력화"였으나, PD 2026-04-24 BT7-Plan에서 "기본 라이프 4 + 젤다 방식 하트 분할"로 전환. HP 막대 대신 **하트 분할 시각화**로 전환 — 이는 "HP 막대의 수치 가독성" + "라이프 카운트의 이산 시각 낙차" 양자를 모두 얻는 구조. **기각안 유지(번복 기록)**: 원 기각 사유는 PD 지시로 무효화되었으나 설계 역사 보존 목적으로 본 기각안 섹션에 남긴다 (C14-5 히스토리 보존 정신).
2. **"공격 버튼 복수 (약공·강공)" — 기각.** 파일럿은 근거리 1종으로 시작. 복잡도는 카드 효과 계층에서 담당하여 입력 복잡도 최소화(캐주얼 포지션). 확장 필요 시 Phase 3-C 재검토. 2. **"공격 버튼 복수 (약공·강공)" — 기각 (BT7-Plan 의미 변화).** 원 기각은 "파일럿 근거리 1종 시작"이었으나, BT7-Plan에서 **공격 버튼 자체 폐기 (VS 순수형)**로 의미 변화. 공격 복잡도는 "액티브 카드 다양성"으로 담당.
3. **"무적 시간 0" — 기각.** 라이프 1 + 무적 0은 체감 난이도 폭주 → 축 2 액션 재미 붕괴 위험. 무적 시간 도입은 비타협. 3. **"무적 시간 0" — 기각 (현행 유지).** 하트 다단 구조 하에서도 연속 히트 1 프레임에 하트 1개 전소 위험. 무적 시간 도입은 비타협. 0.6s 유지.
4. **"피격 시 랜덤 피해량 부여" — 기각 (BT7-Plan 신규).** 젤다 방식 하트 분할의 장점은 "적 ATK 수치의 시각적 명확성"(ATK 2 = 반 하트). 랜덤 피해량은 체감 구분 파괴. 적 ATK는 고정 수치로 설계.
5. **"하트 완전 폐기 후 HP 수치만 표기" — 기각 (BT7-Plan 신규).** 하트 분할 시각화의 재미 핵심은 "수치가 아닌 형태 인지"(젤다 BotW의 고전 강점). 수치 표기는 부가 정보로만 허용 (HUD 설계 참조).
## 9. 변경 이력 ## 9. 변경 이력
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|---|---|---|---| |---|---|---|---|
| 2026-04-23 | v0.1 파일럿 초기 골격 | PD 지시 BT5 | 기획팀장 | | 2026-04-23 | v0.1 파일럿 초기 골격 | PD 지시 BT5 | 기획팀장 |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (VS 순수형·하트 분할·액티브 자동 발동) | 기획팀장 |

View File

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

View File

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

View File

@ -2,19 +2,19 @@
type: 컨텐츠_설계 type: 컨텐츠_설계
scope: 스킬_카드_풀 scope: 스킬_카드_풀
author: 컨텐츠_기획팀장 author: 컨텐츠_기획팀장
date: 2026-04-22 date: 2026-04-24
version: v0.1 (Phase 3-B 파일럿) version: v0.2 (BT7-Plan 개정)
project: EerieVillage project: EerieVillage
phase: Phase 3-B phase: Phase 3-B
data_source: 03_진행_시스템_초안.md (3축 구조) · 04_전투_기본_스펙.md · PD 코어 룰 6 data_source: 03_진행_시스템_초안.md · 04_전투_기본_스펙.md v0.2 · system/01_카드_시스템.md v0.2 · BT7-Plan PD 확정 방향 11건
status: 예시 셋 — 수치·확률은 balance-designer 이관 · 세계관 톤은 narrative-designer 확정 예정 status: 초안 — 수치·확률은 balance-designer 이관 · 세계관 특화 용어는 narrative-designer PD 후속 검토 대기
--- ---
# 01. 스킬 카드 풀 # 01. 스킬 카드 풀
## 1. 재미 축 연결 ## 1. 재미 축 연결
- **축 1 (육성 롤러코스터)**: 카드 풀이 다양할수록 런마다 빌드가 달라지고 "쌓는 재미" 변주 가능 - **축 1 (육성 롤러코스터)**: 카드 풀이 다양할수록 런마다 빌드가 달라지고 "쌓는 재미" 변주 가능. 액티브·패시브 각성 3분류 구조가 "조건 형성 → 각성 발동" 카타르시스 제공
- 모든 카드는 "왜 이 카드를 픽하고 싶은가"에 답할 수 있어야 한다 (P30) - 모든 카드는 "왜 이 카드를 픽하고 싶은가"에 답할 수 있어야 한다 (P30)
- 명확한 상위호환 금지 — 상황·빌드 방향에 따라 선택지가 유의미하게 달라야 한다 - 명확한 상위호환 금지 — 상황·빌드 방향에 따라 선택지가 유의미하게 달라야 한다
@ -22,145 +22,205 @@ status: 예시 셋 — 수치·확률은 balance-designer 이관 · 세계관
## 2. 카드 체계 개요 ## 2. 카드 체계 개요
### 2-1. 티어 정의 ### 2-1. 카드 3분류 (BT7-Plan 확정 방향 3·6)
| 티어 | 레이블 | 출현 타이밍 | 성격 | **구 4티어 레어리티(Common/Uncommon/Rare/Epic) 폐기**. VS 원작 계승 3분류 구조.
|------|--------|-----------|------|
| **1티어 (기본)** | 보통 | 초반 레벨업 가중 | 단일 효과, 조합 진입점 |
| **2티어 (상급)** | 귀 | 중반 이후 출현 증가 | 복합 효과, 시너지 촉매 |
| **3티어 (희귀)** | 신 | 후반 레어 출현 | 빌드 완성자, 강력한 단일 효과 |
### 2-2. 태그 체계 (시너지 기준 축) | 분류 | 성격 | 규모 | 발동 방식 |
|------|------|------|----------|
| **액티브** | 자동 발동 무기·스킬 (판정·주기·대미지 보유) | 15~20종 | 장착 즉시 자동 발동. Lv.5까지 스택 업그레이드 |
| **패시브** | 상시 스탯·효과 보정 (공격력·속도·하트 수·회피 등) | 25종 이내 | 장착 즉시 상시 적용. Lv.5까지 스택 업그레이드 |
| **각성** | 액티브+패시브 조합 충족 시 진화 카드 | 15~20종 | 별도 풀. 조건 충족(액티브 Lv.5 + 필요 패시브 + 보물상자) 시 드로우·발동 |
**총 카드 풀 규모**: 50~65장.
### 2-2. 태그 체계 — 일반 RPG 용어 임시 재작성 (BT7-Plan 확정 방향 11)
**세계관 특화 용어(한자·조선 퇴마)는 PD 후속 검토 대기** — narrative-designer가 추후 일괄 재매핑 예정.
**속성 태그 (후보 5종)**:
| 태그 | 의미 | | 태그 | 의미 |
|------|------| |------|------|
| `[공격]` | 기본 공격 강화 계열 | | `[물리]` | 순수 타격·관통 계열 |
| `[부적]` | 부적·주문 계열 (시전 효과) | | `[화염]` | 지속 대미지·점화 계열 |
| `[주술]` | 지속 시간 효과·DoT 계열 | | `[냉기]` | 둔화·빙결 계열 |
| `[소환]` | 소환물·분신 계열 | | `[번개]` | 연쇄·즉발 계열 |
| `[방호]` | 피해 감소·실드·회피 계열 | | `[암흑]` | 저주·DoT·약화 계열 |
| `[속도]` | 이동·공격 속도 계열 |
| `[회복]` | 실드 회복·생존 연장 계열 | **유형 태그 (후보 6종)**:
| `[폭발]` | 범위·연쇄 계열 |
| 태그 | 의미 |
|------|------|
| `[근접]` | 플레이어 주변 판정 |
| `[원거리]` | 투사체·원격 판정 |
| `[범위]` | AoE·다중 타격 |
| `[지속]` | 설치·오라·DoT |
| `[회복]` | 하트 쿼터 회복·실드 |
| `[방어]` | 피해 감소·회피 확률·i-frame 연장·하트 수 증가 |
**PD 후속 검토 요청**: 본 태그 후보 5+6 = 11종은 balance·content 작업을 위한 임시 구조. narrative-designer가 세계관 톤(조선 퇴마·한자 네이밍)으로 일괄 재매핑하여 최종 확정할 예정 (PD님 검토·지시 대기).
--- ---
## 3. 카드 풀 예시 (32장) ## 3. 카드 풀 재분배 (50~65장)
> **수치 표기 원칙**: "대미지 증가", "속도 상승" 등 방향성만 기재. 구체 수치는 balance-designer 이관. > **수치 표기 원칙**: "대미지 증가", "속도 상승" 등 방향성만 기재. 구체 수치는 balance-designer 이관. 카드 이름은 세계관 톤 보류(v0.1 기존 한자 네이밍 유지 — narrative 영역 건드리지 않음 · PD 지시).
### [공격 강화] 카테고리 — 기본 공격을 핵심으로 성장시키는 빌드 축 ### 3-1. 액티브 카드 (15~20종)
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | **자동 발동형 무기·스킬**. 기본 공격 강화 효과(구 v0.1 [공격] 태그 5장)는 폐기 — 공격 버튼 자체가 제거되었으므로 "기본 공격 강화"는 무의미.
|---|-----------|------|------|-----------|------------|
| 01 | **봉황격(鳳凰擊)** | 1 | `[공격]` | 기본 공격 대미지 증가 | `[공격]` 카드 2장 이상 시 추가 효과 |
| 02 | **천둥발(天動撥)** | 1 | `[공격]` | 공격 판정 범위 확대 | `[폭발]` 태그와 연계 시 파편 발생 |
| 03 | **일격필살(一擊必殺)** | 2 | `[공격]` | 공격 적중 시 일정 확률로 2배 대미지 | `[속도]` 태그와 연계 시 발동률 상승 |
| 04 | **학익진(鶴翼陣)** | 2 | `[공격]` `[폭발]` | 공격 시 좌우 부채꼴 범위 추가 판정 | `[부적]` 태그 보유 시 넓어짐 |
| 05 | **천지신명(天地神明)** | 3 | `[공격]` `[폭발]` | 공격마다 지면에 충격파 발생 | 단독 채용 시에도 강력한 완성자 |
### [부적] 카테고리 — 시전형 단발 효과. 런 내 "한 방" 카드군 | # | 카드 이름 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|-----------|------------|
| A01 | **진언부(眞言符)** | `[원거리]` `[물리]` | 전방에 부적 자동 투척 (주기 N초) | `[물리]` 패시브 시너지 |
| A02 | **화염부(火焰符)** | `[원거리]` `[화염]` | 부적 투척 + 화염 DoT 부여 | `[화염]` 누적 시 점화 중첩 |
| A03 | **봉인부(封印符)** | `[원거리]` `[암흑]` | 투척 적중 시 행동 정지 (저주) | `[암흑]` 시너지 |
| A04 | **뇌격부(雷擊符)** | `[원거리]` `[번개]` `[범위]` | 투척 부적이 연쇄 번개 발생 | 밀집 구간 필살 |
| A05 | **학익진(鶴翼陣)** | `[근접]` `[범위]` `[물리]` | 주변 부채꼴 범위 자동 타격 (주기 N초) | `[근접]` 시너지 |
| A06 | **독안개(毒霧)** | `[지속]` `[암흑]` | 이동 경로에 독 안개 잔존, 접촉 적 DoT | `[지속]` 중첩 |
| A07 | **혼백박멸(魂魄薄滅)** | `[범위]` `[암흑]` | 주기적으로 주변 약화 오라 발생 | 소환·DoT 연계 |
| A08 | **저주문(詛呪文)** | `[원거리]` `[암흑]` `[지속]` | 자동 발동 시 적에게 저주 스택, N스택 시 폭발 | 자동 발동 주기 빠를수록 스택 가속 |
| A09 | **허수아비(藁人形)** | `[지속]` `[방어]` | 이동 경로에 허수아비 설치, 적 어그로 유도 | `[방어]` 시너지 |
| A10 | **분신술(分身術)** | `[근접]` `[물리]` | 분신 1기 자동 공격 | `[물리]` 패시브 공유 |
| A11 | **도깨비불소환** | `[원거리]` `[암흑]` `[지속]` | 도깨비불 2기 자동 발동, 랜덤 적 추적 + DoT | `[지속]` 빌드 활성 |
| A12 | **쾌속검(快速劍)** | `[근접]` `[물리]` | 전방 연속 베기 (주기 빠름) | `[물리]` 시너지 |
| A13 | **천둥발(天動撥)** | `[범위]` `[번개]` | 주변 원형 번개 판정 (주기 N초) | `[번개]` 중첩 |
| A14 | **빙결창(氷結槍)** | `[원거리]` `[냉기]` | 투창 자동 발사, 적중 시 둔화 | `[냉기]` 시너지 |
| A15 | **귀화(鬼火)** | `[원거리]` `[화염]` `[지속]` | 유도 화염구 자동 발사, 접촉 점화 | `[화염]` 중첩 |
| A16 | **일격필살(一擊必殺)** | `[근접]` `[물리]` | 일정 확률 자동 회심 공격 (주기 N초) | `[물리]` 확률 증폭 |
| A17 | **결계장벽(結界障壁)** | `[방어]` `[지속]` | 전방 고정 실드 자동 설치, 적 저지 | `[방어]` 시너지 |
| A18 | **무영보(無影步)** | `[방어]` `[근접]` | 주기적 짧은 순간 무적 대시 자동 발동 | `[방어]` 시너지 |
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | **기본 시작 무기 (1종)**: 퇴마사 고유 무기 (VS 원작 캐릭터 고유 무기 대응). v0.1 세부 결정 대기 — balance·content 협의. 기본 무기는 A01~A18 중 1종을 기본 장착 or 별도 카드로 설계.
|---|-----------|------|------|-----------|------------|
| 06 | **진언부(眞言符)** | 1 | `[부적]` | 전방에 부적 투척, 접촉 몬스터 피해 | `[부적]` 3장 이상 시 관통 판정 |
| 07 | **화염부(火焰符)** | 1 | `[부적]` `[주술]` | 부적 적중 시 화염 DoT 부여 | `[주술]` 태그 강화 시 지속 시간 연장 |
| 08 | **봉인부(封印符)** | 2 | `[부적]` | 적중 몬스터 일정 시간 행동 정지 | `[소환]` 카드와 조합 시 처치 보너스 |
| 09 | **뇌격부(雷擊符)** | 2 | `[부적]` `[폭발]` | 투척 부적이 연쇄 번개로 근접 적 피해 | 밀집 구간 필살기 역할 |
| 10 | **천부경문(天符經文)** | 3 | `[부적]` | 화면 전체 부적 전개, 전 적 피해 | 런 마무리 구간 단독 완성자 |
### [주술] 카테고리 — 지속 효과·DoT로 "시간이 지날수록 강해지는" 빌드 축 ### 3-2. 패시브 카드 (25종 이내)
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | **상시 스탯 보정**. 액티브 효율 증폭 + 각성 조건 형성.
|---|-----------|------|------|-----------|------------|
| 11 | **독안개(毒霧)** | 1 | `[주술]` | 이동 경로에 독 안개 잔존, 접촉 적 DoT | `[주술]` 카드 중복 시 효과 중첩 |
| 12 | **혼백박멸(魂魄薄滅)** | 2 | `[주술]` | 주기적으로 주변에 약화 오라 발생 | `[소환]` 태그와 연계 시 소환물도 약화 부여 |
| 13 | **저주문(詛呪文)** | 2 | `[주술]` `[부적]` | 공격 적중 적에게 저주 스택 부여, N스택 시 폭발 | `[공격]` 태그로 스택 가속 |
| 14 | **사령결계(死靈結界)** | 3 | `[주술]` | 발동 시 범위 내 전 적에게 대형 DoT 적용 | `[주술]` 빌드의 최종 완성자 |
### [소환] 카테고리 — 분신·소환물로 "나를 도와주는 동료" 재미 축 | # | 카드 이름 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|-----------|------------|
| P01 | **봉황격(鳳凰擊)** | `[물리]` | 모든 액티브 대미지 증가 | 범용 |
| P02 | **화염강화(火焰强化)** | `[화염]` | `[화염]` 태그 액티브 대미지 증가 | `[화염]` 빌드 핵심 |
| P03 | **냉기강화(冷氣强化)** | `[냉기]` | `[냉기]` 태그 액티브 대미지 증가 | `[냉기]` 빌드 핵심 |
| P04 | **뇌전강화(雷電强化)** | `[번개]` | `[번개]` 태그 액티브 대미지 증가 | `[번개]` 빌드 핵심 |
| P05 | **어둠강화(暗黑强化)** | `[암흑]` | `[암흑]` 태그 액티브 대미지 증가 | `[암흑]` 빌드 핵심 |
| P06 | **연사술(連射術)** | `[물리]` | 모든 액티브 발동 주기 단축 | 범용 고부가 |
| P07 | **광역확장(廣域擴張)** | `[범위]` | 액티브 판정 범위 증가 | `[범위]` 빌드 |
| P08 | **투사체증폭(投射體增幅)** | `[원거리]` | `[원거리]` 액티브 투사체 수 증가 | `[원거리]` 빌드 |
| P09 | **지속시간연장(持續延長)** | `[지속]` | `[지속]` 액티브 효과 지속시간 증가 | `[지속]` 빌드 |
| P10 | **호신부(護身符)** | `[방어]` | 피격 전 1회 흡수 실드 (N초 쿨다운) | 생존력 |
| P11 | **질풍보(疾風步)** | — | 플레이어 이동 속도 상승 | 회피 보조 |
| P12 | **도약강화(跳躍强化)** | — | 점프 높이 상승 | 회피 보조 |
| P13 | **단전수련(丹田修練)** | `[회복]` | 적 처치 시 소량 쿼터 회복 (N킬당 1/4 하트) | 회복 빌드 |
| P14 | **감로수(甘露水)** | `[회복]` | 일정 시간마다 쿼터 자동 재생 | `[방어]` 시너지 |
| P15 | **생명의 꽃(生命之花)** | `[방어]` `[회복]` | **최대 하트 수 +1** (런 내) | 생존 빌드 핵심 (각성 조건 패시브 다수에 포함) |
| P16 | **강철심장(鋼鐵心臟)** | `[방어]` | **최대 하트 수 +1** (런 내) | 생존 빌드 (P15와 중첩 가능) |
| P17 | **부적방패(符籍防牌)** | `[방어]` | 피해 감소 % | 범용 생존 |
| P18 | **회피술(回避術)** | `[방어]` | 회피 확률 % | 생존 빌드 |
| P19 | **심안(心眼)** | — | i-frame 지속시간 연장 | 생존 빌드 |
| P20 | **도주경공(逃走輕功)** | — | 피격 시 순간 가속 | 생존 보조 |
| P21 | **쾌보술(快步術)** | — | `[근접]` 액티브 발동 주기 단축 | `[근접]` 빌드 |
| P22 | **선견지명(先見之明)** | — | 경험치 획득량 증가 | 성장 가속 |
| P23 | **재물복(財物福)** | — | 보물상자 발견 확률 증가 | 각성 빌드 핵심 |
| P24 | **집중술(集中術)** | — | 크리티컬 확률 % | 대미지 빌드 |
| P25 | **폭풍혼(暴風魂)** | — | 크리티컬 대미지 배율 증가 | 대미지 빌드 |
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | **주요 변경점**:
|---|-----------|------|------|-----------|------------| - **P15·P16 최대 하트 수 증가 신설** — BT7-Plan 확정 방향 7 구현
| 15 | **허수아비(藁人形)** | 1 | `[소환]` | 이동 경로에 허수아비 설치, 적 어그로 유도 | `[방호]` 태그와 연계 시 내구도 강화 | - **P23 보물상자 확률 증가 신설** — 각성 빌드 핵심 카드
| 16 | **분신술(分身術)** | 2 | `[소환]` `[공격]` | 분신 1기 소환, 기본 공격 동시 수행 | `[공격]` 카드 적용 범위 공유 | - `[방호]`·`[회복]` 실효 수치는 **쿼터 단위 명시** — "실드 소량 회복 = 1 쿼터" 등 (balance-designer 튜닝)
| 17 | **도깨비불소환** | 2 | `[소환]` `[주술]` | 도깨비불 2기 소환, 랜덤 적 추적 및 DoT | `[주술]` 빌드의 활성화 트리거 역할 |
| 18 | **산신령강림(山神靈降臨)** | 3 | `[소환]` | 강력 소환물 1기 등장, 자동 공격·높은 내구도 | 소환 빌드 최종 완성자 |
### [방호] 카테고리 — 라이프 1 전제에서의 "실질적 생존 연장" 수단 ### 3-3. 각성 카드 (15~20종)
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | **별도 풀**. 조건 충족(액티브 Lv.5 + 필요 패시브 1개 이상 보유 + 보물상자) 시 발동.
|---|-----------|------|------|-----------|------------|
| 19 | **호신부(護身符)** | 1 | `[방호]` | 피격 전 1회 흡수 실드 생성 (N초 쿨타임) | 단독 채용 시도 고생존 기여 |
| 20 | **부적방패(符籍防牌)** | 1 | `[방호]` `[부적]` | 부적 투척 후 일정 시간 회피율 상승 | `[부적]` 빌드의 부산물 생존력 |
| 21 | **무영보(無影步)** | 2 | `[방호]` `[속도]` | 짧은 순간 무적 대시 추가 | `[속도]` 태그 보유 시 거리 증가 |
| 22 | **결계장벽(結界障壁)** | 2 | `[방호]` | 발동 시 전방 고정 실드 설치 | `[소환]` 태그와 조합 시 소환물 뒤 자동 배치 |
| 23 | **천지음양방호(天地陰陽)** | 3 | `[방호]` | 일정 시간 완전 무적 + 무적 해제 시 반경 폭발 | 단독 완성자, 위기 탈출기 |
### [속도] 카테고리 — "빠르게 치고 빠지는" 게릴라 빌드 축 각 각성 카드는 `필요_액티브` + `필요_패시브[]` 쌍을 가진다. **필요 패시브 배열에 명시된 카드 중 1개 이상 보유 시 조건 충족**.
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | | # | 각성 이름 | 필요_액티브 | 필요_패시브[] | 효과 요지 |
|---|-----------|------|------|-----------|------------| |---|-----------|-------------|---------------|-----------|
| 24 | **쾌보술(快步術)** | 1 | `[속도]` | 이동 속도 상승 | `[속도]` 3장 이상 시 점프력 추가 상승 | | AW01 | **천부경문(天符經文)** | A01 진언부 Lv.5 | [P01, P06, P08] | 화면 전체 부적 전개, 전 적 강타 (자동 발동 주기 대폭 단축 + 광역화) |
| 25 | **연속타(連續打)** | 2 | `[속도]` `[공격]` | 공격 속도 상승 + 연타 효과 | `[공격]` 태그와 연계 시 연타 횟수 증가 | | AW02 | **염라화염(閻羅火焰)** | A02 화염부 Lv.5 | [P02, P09] | 투척 부적 범위 대폭 확장, 지속 점화 스택 무제한 |
| 26 | **귀신발걸음(鬼步)** | 2 | `[속도]` | 일정 시간 극속 이동, 적 통과 판정 | `[주술]` 태그와 연계 시 이동 경로에 DoT 잔존 | | AW03 | **천뢰강림(天雷降臨)** | A04 뇌격부 Lv.5 | [P04, P06, P08] | 연쇄 번개 무제한 전파, 화면 내 모든 적 연쇄 |
| AW04 | **봉령결계(封靈結界)** | A03 봉인부 Lv.5 | [P05, P09] | 봉인 대상 영구 행동 정지 + DoT 부여 |
| AW05 | **학익천진(鶴翼天陣)** | A05 학익진 Lv.5 | [P01, P07] | 360도 전방위 자동 타격 |
| AW06 | **독무유역(毒霧流域)** | A06 독안개 Lv.5 | [P05, P09] | 화면 전체 독무 잔존, 무한 DoT |
| AW07 | **사령결계(死靈結界)** | A08 저주문 Lv.5 | [P05, P06] | 저주 스택 즉시 최대치 + 폭발 대미지 증폭 |
| AW08 | **혼령폭풍(魂靈暴風)** | A07 혼백박멸 Lv.5 | [P05, P07] | 주변 오라가 화면 전체 약화 |
| AW09 | **허수군세(藁人軍勢)** | A09 허수아비 Lv.5 | [P01, P10] | 허수아비 다수 자동 소환, 자동 공격 |
| AW10 | **분신만화(分身萬華)** | A10 분신술 Lv.5 | [P01, P06] | 분신 3~4기 동시 소환, 액티브 공유 |
| AW11 | **산신령강림(山神靈降臨)** | A11 도깨비불소환 Lv.5 | [P05, P09] | 강력 소환물 1기 상주, 자동 타격·높은 내구 |
| AW12 | **쾌검비경(快劍秘境)** | A12 쾌속검 Lv.5 | [P01, P06] | 전방 연타 속도 극속, 무한 연격 |
| AW13 | **천지진동(天地震動)** | A13 천둥발 Lv.5 | [P04, P07] | 원형 번개 범위 화면 전체 확장 |
| AW14 | **빙하시대(氷河時代)** | A14 빙결창 Lv.5 | [P03, P09] | 투창 빙결 영역화, 접촉 적 전부 빙결 |
| AW15 | **귀화유성(鬼火流星)** | A15 귀화 Lv.5 | [P02, P08] | 유도 화염구 무한 발사, 화면 전체 점화 |
| AW16 | **일격절명(一擊絶命)** | A16 일격필살 Lv.5 | [P24, P25] | 회심 확률·배율 극한 상승 (보스 제외 즉사) |
| AW17 | **천지음양방호(天地陰陽)** | A17 결계장벽 Lv.5 | [P10, P15·P16 중 1개] | 완전 무적 시간 상승 + 실드 상시 유지 |
| AW18 | **귀보유영(鬼步遊影)** | A18 무영보 Lv.5 | [P11, P18] | 무적 대시 무한 연계, 피격 시 자동 발동 |
### [회복] 카테고리 — 실드·생존 연장 수단 (라이프 1 전제에서 "버티기" 옵션) **각성 조합 설계 원칙**:
- 각 각성마다 **필요 패시브는 2~3개 후보** 중 1개 이상 보유로 조건 충족
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 | - 복수 각성 조건이 동시 충족되는 경우 플레이어 선택 UI 제공 (규칙 시스템 §7 엣지 케이스 3)
|---|-----------|------|------|-----------|------------| - 한 런에서 동일 각성 중복 발동 불가
| 27 | **단전수련(丹田修練)** | 1 | `[회복]` | 적 처치 시 소량 실드 회복 | 처치 수가 많은 플레이 스타일에 효과 극대 |
| 28 | **부적치유(符籍治癒)** | 2 | `[회복]` `[부적]` | 부적 적중 처치 시 실드 대량 회복 | `[부적]` 빌드의 생존 보장 |
| 29 | **감로수(甘露水)** | 2 | `[회복]` | 일정 시간마다 실드 자동 재생 | `[방호]` 태그와 조합 시 실드 상한 상승 |
### [특수] 카테고리 — 빌드 방향 전환자·고위험 고보상 카드
| # | 카드 이름 | 티어 | 태그 | 효과 요지 | 시너지 힌트 |
|---|-----------|------|------|-----------|------------|
| 30 | **역천지기(逆天之氣)** | 3 | `[공격]` `[폭발]` | 이번 런 처음 10회 공격에 한해 3배 대미지, 이후 공격력 일시 감소 | 초반 스파이크 전략용 |
| 31 | **귀문관(鬼門關)** | 3 | `[주술]` `[소환]` | 사방에 문 설치, 30초간 문 통과 몬스터에 즉사 판정 (보스 제외) | 소환·주술 복합 빌드 완성자 |
| 32 | **천지개벽(天地開闢)** | 3 | `[공격]` `[폭발]` `[주술]` | 발동 시 전 화면 공격 + 모든 DoT 즉시 폭발 | 전 태그 연계 최종 파이널 카드 |
--- ---
## 4. 시너지 조합 예시 ## 4. 시너지 조합 예시 (일반 RPG 용어 기반)
> 상세 조합 규칙·발동 조건은 system-designer 이관. 아래는 "플레이어가 느끼는 방향성" 기준 예시. > 상세 조합 규칙·발동 조건은 system-designer 이관. 아래는 "플레이어가 느끼는 방향성" 기준 예시.
| 빌드명 | 핵심 카드 | 컨셉 | | 빌드명 | 핵심 카드 | 컨셉 | 예상 각성 |
|--------|-----------|------| |--------|-----------|------|----------|
| **부적 스패머** | 진언부·화염부·부적방패·부적치유 | 부적을 쏟아부으며 생존까지 해결 | | **화염 폭격수** | A02·A15·P02·P09 | 화염 DoT 지속 누적 | AW02 or AW15 |
| **주술 소각** | 독안개·저주문·사령결계 | 모든 적에게 DoT 누적 후 폭발 | | **번개 연쇄술사** | A04·A13·P04·P06·P08 | 번개 연쇄로 화면 소탕 | AW03 or AW13 |
| **분신 군주** | 분신술·도깨비불소환·산신령강림 | 소환물로 화면을 점령 | | **암흑 저주사** | A03·A06·A08·P05·P09 | 저주·독으로 DoT 누적 | AW04 or AW06 or AW07 |
| **속도 게릴라** | 쾌보술·연속타·귀신발걸음 | 빠르게 치고 빠지는 히트앤런 | | **분신 군주** | A09·A10·A11·P01·P10 | 소환물로 화면 점령 | AW09 or AW10 or AW11 |
| **천부경 오버로드** | 천부경문·천지개벽·역천지기 | 3티어 중심 고위험 고보상 | | **회피 게릴라** | A12·A18·P11·P18·P19 | 빠른 공격 + 무적 대시 | AW12 or AW18 |
| **철벽 생존** | A17·P10·P15·P16·P17 | 최대 하트 3~4 + 상시 실드 | AW17 |
| **보물상자 각성 특화** | P23 중심 + 아무 액티브 Lv.5 | 보물상자 발견율 극대화, 다중 각성 | AW 중 조건 충족 시 발동 |
--- ---
## 5. 기각안 ## 5. 기각안
1. **"카드별 쿨타임 부여" — 기각.** 로그라이크 카드는 "장착 후 패시브·능동 발동" 구분이 필요하나, 쿨타임 UI는 모바일 기준 인지 부담 과대. 패시브 위주로 설계하고 능동 카드는 별도 슬롯 구조로 격리 검토 → system-designer 이관. 1. **"카드별 쿨타임 UI 표시" — 기각 (BT7-Plan 의미 변화).** v0.1은 "패시브 위주 설계, 능동 카드는 별도 슬롯 격리 검토"였으나 BT7-Plan에서 **모든 공격을 자동 발동으로 전환**하여 쿨타임 UI 필요성이 근본 변화. 액티브 카드는 각자 내부 발동 주기(쿨다운)를 가지지만 **플레이어에게 쿨다운 UI를 노출할 필요 없음** (수동 발동 아님). VS 원작과 동일 — 카드 슬롯 아이콘·Lv 표기만 HUD 반영.
2. **"카드 50장 이상 초기 풀" — 기각.** 파일럿에서 과도한 풀은 팀 개발 부하·QA 비용 폭증. MVP 30~35장으로 시작, 업데이트 확장 구조 채택. 단 확장 용이하도록 태그 체계를 미리 확정.
3. **"동일 카드 중복 픽 시 즉시 2배 효과" — 기각.** 밸런스 붕괴 위험. 동일 카드 재픽은 "레벨 업" 형태로 처리(상세는 Phase 3-B system-designer 결정). 즉시 2배는 단일 카드 과의존 빌드 고착화 원인. 2. **"카드 50장 이상 초기 풀" — 기각 (BT7-Plan 번복).** v0.1은 "30~35장 MVP"로 제한했으나, BT7-Plan에서 액티브 15~20 + 패시브 25 + 각성 15~20 = 총 50~65장으로 명시 확장. 3분류 구조 + 각성 조합 설계상 최소 풀 규모가 필요. **기각안 유지(번복 기록)**.
4. **"카드 판매·재료화 메카닉" — 기각.** 파츠 교체식(코어 룰 8)과 역할 혼선. 카드는 "픽 or 포기" 이분법 유지. 재화 연동은 Phase 3-C BM 설계에서 별도 검토.
3. **"동일 카드 중복 픽 시 즉시 2배 효과" — 기각 (현행 유지 + Lv.5 확장).** 밸런스 붕괴 위험. 동일 카드 재픽은 "Lv 업"(최대 Lv.5) 형태로 처리. 즉시 2배는 단일 카드 과의존 빌드 고착화 원인.
4. **"카드 판매·재료화 메카닉" — 기각 (현행 유지).** 파츠 교체식(코어 룰 8)과 역할 혼선. 카드는 "픽 or 포기" 이분법 유지. 재화 연동은 Phase 3-C BM 설계에서 별도 검토.
5. **"4티어 레어리티 체계 (Common/Uncommon/Rare/Epic) 유지" — 기각 (BT7-Plan 신규).** PD 2026-04-24 확정 방향 4에서 "티어 3→4 변경 폐기" 명시 + 확정 방향 3에서 "액티브+패시브=각성" 구조 확정. 레어리티 체계 자체 폐기. 3분류 구조로 통일.
6. **"각성 카드를 레벨업 드로우에 포함" — 기각 (BT7-Plan 신규).** PD 확정 방향 10 "각성은 별도 풀. 조건 충족 시 드로우·보물상자 획득으로 발동" 명시.
7. **"기본 공격 강화 카드 유지 (구 v0.1 [공격] 태그 5장)" — 기각 (BT7-Plan 신규).** PD 확정 방향 2에서 공격 버튼 자체 폐기 (VS 순수형). "기본 공격 강화" 개념 자체 무의미화. 해당 5장은 액티브 카테고리에 재배치되거나 패시브 형태로 재해석.
--- ---
## 6. balance-designer 이관 항목 ## 6. balance-designer 이관 항목
- 티어별 출현 가중치 수치 (레벨 구간별 확률 테이블) - 액티브·패시브 출현 가중치 수치 (레벨 구간별 확률 테이블)
- 카드별 효과 수치 (대미지 배율·지속 시간·쿨타임·스택 한도) - 각성 발동 시 대미지·효과 강도 수치
- 카드별 효과 수치 (대미지 배율·지속 시간·쿨다운·스택 한도·쿼터 회복량)
- 시너지 트리거 조건 (태그 N장 이상 임계) - 시너지 트리거 조건 (태그 N장 이상 임계)
- 3티어 카드 출현 구간 제한 설계 - 각성 카드 필요_패시브 배열 최종 조정 (조건 난이도 vs 발동 빈도 균형)
- 보물상자 스폰 조건·빈도·대체 보상 수치
- 최대 하트 수 상한 (초기 권고 3~5개)
- Lv.5 이상 재픽 시 보상 방식 (재화 vs 랜덤 변형)
## 7. narrative-designer 이관 항목 ## 7. narrative-designer 이관 항목 (PD 후속 검토 대기)
- 카드 네이밍 최종 확정 (조선 퇴마 세계관 고증 · 한자 표기 통일) - **태그 세계관 재매핑** — 일반 RPG 용어(물리/화염/냉기/번개/암흑/근접/원거리/범위/지속/회복/방어 11종) → 조선 퇴마 특화 용어로 일괄 재매핑 (PD님 BT7-Plan 확정 방향 11에서 "나중에 일괄 재매핑" 명시)
- 카드 플레이버 텍스트 (짧은 설명 1~2줄, 세계관 맥락) - 각성 카드 플레이버 텍스트 (조선 퇴마 세계관 맥락)
- "진언·경문·부적·주술" 용어 계보 정리 - "진언·경문·부적·주술" 용어 계보 정리 — narrative 01·02·03 현행 유지 + 카드 네이밍만 필요 시 조정
**주의**: 카드 한자 네이밍(진언부·화염부·봉황격 등)은 **현행 유지** (PD 특별 주의 — narrative 영역 건드리지 않음). 태그 용어만 추후 재매핑 대상.
## 8. 변경 이력 ## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|------|------|------|------| |------|------|------|------|
| 2026-04-22 | v0.1 파일럿 예시 셋 32장 작성 | PD 지시 BT6-Plan Phase 3-B | 컨텐츠 기획팀장 | | 2026-04-22 | v0.1 파일럿 예시 셋 32장 작성 | PD 지시 BT6-Plan Phase 3-B | 컨텐츠 기획팀장 |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (3분류 구조·50~65장 확장·Lv.5·각성 조합·일반 RPG 태그·하트 수 증가 패시브·보물상자 확률 패시브) | 기획팀장 |

View File

@ -2,12 +2,12 @@
type: 시스템_설계 type: 시스템_설계
scope: 카드_시스템 scope: 카드_시스템
author: system-designer author: system-designer
date: 2026-04-22 date: 2026-04-24
version: v0.1 version: v0.2 (BT7-Plan 개정)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist) project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: Phase 3-B phase: Phase 3-B
data_source: 03_진행_시스템_초안.md §3 / PD 코어 룰 6·7 data_source: 03_진행_시스템_초안.md §3 / PD 코어 룰 6·7 / BT7-Plan PD 확정 방향 11건 (2026-04-24)
status: 핵심 메카닉 골격 확정 — 효과 리스트·수치는 content-designer·balance-designer 이관 status: BT7-Plan 개정 반영 — 액티브/패시브/각성 3분류·Lv.5 확장·각성 발동 조건
--- ---
# 01. 카드 시스템 # 01. 카드 시스템
@ -15,13 +15,14 @@ status: 핵심 메카닉 골격 확정 — 효과 리스트·수치는 content-d
## 1. 목적 ## 1. 목적
**이 시스템이 풀고자 하는 플레이어 문제** **이 시스템이 풀고자 하는 플레이어 문제**
"레벨업마다 무언가 의미 있는 선택을 했다는 느낌, 그리고 내 빌드가 점점 나만의 것이 되는 느낌"을 제공한다. "레벨업마다 무언가 의미 있는 선택을 했다는 느낌, 그리고 내 빌드가 점점 나만의 것이 되는 느낌, 그리고 조건을 만족했을 때 발동하는 각성의 카타르시스"를 제공한다.
PD 코어 룰 6(레벨업 시 3장 중 1장 선택·조합 육성)은 이 경험의 구조적 기반이다. 카드 시스템은 그 구조를 완결한다. PD 코어 룰 6(레벨업 시 3장 중 1장 선택·조합 육성) + BT7-Plan 확정 방향 2·3·4·5·6·9·10은 이 경험의 구조적 기반이다. 카드 시스템은 그 구조를 완결한다.
**제공하는 경험** **제공하는 경험**
- 픽 순간마다 "이게 맞는 선택인가?" 의 짧은 긴장 - 픽 순간마다 "액티브를 강화할까, 패시브를 쌓아 각성 조건을 노릴까?"의 육성 경로 긴장
- 카드가 쌓일수록 내 빌드가 강해지는 성장 곡선의 체감 - 카드가 쌓일수록 내 빌드(장착 액티브 + 패시브 조합)가 강해지는 성장 곡선의 체감
- 동일 덱으로도 달라지는 시너지 조합에서 오는 재발견 재미 - 각성 조건 충족 + 보물상자 획득 순간의 "기다림이 보상받는" 카타르시스
- 동일 덱으로도 달라지는 액티브·패시브·각성 조합 재발견 재미
--- ---
@ -30,11 +31,15 @@ PD 코어 룰 6(레벨업 시 3장 중 1장 선택·조합 육성)은 이 경험
``` ```
레벨업 트리거 레벨업 트리거
카드 풀에서 3장 무작위 드로우 (추첨 전 중복 제거) 카드 풀에서 3장 무작위 드로우 (액티브·패시브 2축, 각성은 별도 풀)
픽 UI 표시 — 플레이어가 1장 선택 (강제) 픽 UI 표시 — 플레이어가 1장 선택 (강제)
선택 카드 → 빌드 슬롯에 장착 / 동일 카드 재픽 시 → 업그레이드 처리 선택 카드 → 빌드 슬롯에 장착 / 동일 카드 재픽 시 → 스택 업그레이드 (최대 Lv.5)
[병행] 스테이지 진행 중 보물상자 발견·획득
각성 발동 판정: 액티브 Lv.5 + 필요 패시브 1개 이상 보유 시 → 각성 카드 풀에서 드로우·발동
런 종료(보스 클리어 or 사망) → 카드 전손 · 빌드 초기화 런 종료(보스 클리어 or 사망) → 카드 전손 · 빌드 초기화
``` ```
@ -45,46 +50,92 @@ PD 코어 룰 6(레벨업 시 3장 중 1장 선택·조합 육성)은 이 경험
## 3. 규칙 ## 3. 규칙
### 규칙 1. 카드 풀 3티어 구조 ### 규칙 1. 카드 3분류 구조 — 액티브 / 패시브 / 각성 (BT7-Plan 확정 방향 3·6)
| 티어 | 명칭 | 해제 조건 | 특징 | **구 3티어 구조(T1 기본·T2 숙련·T3 각성) 폐기**. VS 원작 계승 3분류로 재설계.
|------|------|----------|------|
| T1 | 기본 | 런 시작 시 항상 활성 | 단순 효과, 개수 多 |
| T2 | 숙련 | 누적 레벨 N 이상 도달 시 드로우 풀 합류 | 중복·시너지 조건 포함 효과 |
| T3 | 각성 | 런 내 지정 조건 충족 시 한정 등장 | 빌드 방향 전환급 효과, 개수 少 |
- N 수치는 balance-designer 영역. 구조상 T3는 "후반부에만 보인다"는 경험 설계. | 분류 | 정의 | 역할 | 규모 |
- T3는 항상 3장 중 1장 이하로 등장한다. T3가 2장 이상 동시 출현 시 1장으로 대체한다. |------|------|------|------|
| **액티브** | 자동 발동 무기·스킬 (판정 박스·주기·대미지 보유) | 적 처치의 실질 DPS 공급 | 15~20종 |
| **패시브** | 스탯·효과 상시 보정 (공격력·속도·하트 수·회피 등) | 액티브 효율 증폭 + 각성 조건 형성 | 25종 이내 |
| **각성** | 액티브+패시브 조합 충족 시 발동하는 진화 카드 | 빌드 완성자·클라이맥스 | 15~20종 |
### 규칙 2. 픽 알고리즘 — 가중 무작위 **총 카드 풀 규모**: 50~65장 (구 32장 대비 확장).
1) 현재 런의 레벨(진행도)에 따라 T1/T2/T3 비율 가중을 결정한다. ### 규칙 2. 픽 알고리즘 — 액티브·패시브 2축 드로우
2) 가중 비율 안에서 **현재 빌드의 주력 태그 2개**에 해당하는 카드에 추가 가중치를 부여한다.
3) 이미 빌드에 편입된 카드는 재픽 후보에서 제외하되, **업그레이드 가능 카드(동일 카드 2회 픽 조건)**는 재등장 허용한다. 1) 레벨업 시 **액티브·패시브 2축에서** 가중 무작위로 3장 드로우 (각성은 별도 경로).
4) 3장은 서로 다른 티어 조합이 되도록 필터를 우선 적용하되, 같은 티어만 남을 경우 필터를 해제한다. 2) 현재 런의 레벨·빌드 태그에 따라 액티브 vs 패시브 비율 가중을 결정한다 (상세: `balance/02_레벨업_곡선.md` v0.2 §4).
3) **현재 빌드의 주력 태그 2개**에 해당하는 카드에 추가 가중치를 부여한다.
4) 이미 빌드에 편입된 카드는 재픽 후보에서 제외하되, **업그레이드 가능 카드(동일 카드 재픽 조건, Lv.5 미만)**는 재등장 허용한다.
5) 3장은 액티브·패시브가 혼합되도록 필터를 우선 적용하되, 풀 고갈 시 필터를 해제한다.
가중치 수치와 태그 연동 강도는 balance-designer 영역. 가중치 수치와 태그 연동 강도는 balance-designer 영역.
### 규칙 3. 태그 기반 시너지 체계 ### 규칙 3. 태그 기반 시너지 체계 (일반 RPG 용어 임시 재작성)
카드 하나는 반드시 **1~2개의 태그**를 가진다. 카드 하나는 반드시 **1~2개의 태그**를 가진다.
**태그 축 2종**: **태그 체계는 임시 일반 RPG 용어로 재작성**한다 (BT7-Plan 확정 방향 11). PD 후속 검토용 **5개 속성 태그 + 6개 유형 태그 후보**:
1) **속성 태그** (예: 불·물·목·금·토 — 조선 오행 기반, 실제 명칭은 content-designer 확정) **속성 태그 (후보 5종)**:
2) **유형 태그** (예: 근거리·원거리·결계·부적·주술) 1) `[물리]` — 순수 타격·관통
2) `[화염]` — 지속 대미지·점화
3) `[냉기]` — 둔화·빙결
4) `[번개]` — 연쇄·즉발
5) `[암흑]` — 저주·DoT·약화
시너지 발동 조건: 동일 태그 카드 K장 이상 빌드에 편입 시 패시브 효과 추가 발동. **유형 태그 (후보 6종)**:
K 수치와 효과 내용은 balance-designer·content-designer 영역. 1) `[근접]` — 플레이어 주변 판정
2) `[원거리]` — 투사체·원격
3) `[범위]` — AoE·다중 타격
4) `[지속]` — 설치·오라·DoT
5) `[회복]` — 하트 쿼터 회복·실드
6) `[방어]` — 피해 감소·회피 확률·i-frame 연장
**세계관 특화 용어 (한자 네이밍·조선 퇴마 톤)는 PD 후속 검토 대기** — narrative-designer가 BT7-Plan 11번 지시에 따라 추후 일괄 재매핑 예정. 현 v0.2는 일반 RPG 용어 후보만 기록하며, PD님 검토·확정 시점에 narrative-designer 작업으로 전환.
**시너지 발동 조건**: 동일 태그 카드 K장 이상 빌드에 편입 시 패시브 효과 추가 발동. K 수치와 효과 내용은 balance-designer·content-designer 영역.
태그 2축 설계로 "속성 빌드"와 "유형 빌드" 두 방향의 조합이 가능하며, 양 축을 동시에 쌓는 교차 빌드가 제3의 방향이 된다. 태그 2축 설계로 "속성 빌드"와 "유형 빌드" 두 방향의 조합이 가능하며, 양 축을 동시에 쌓는 교차 빌드가 제3의 방향이 된다.
### 규칙 4. 업그레이드 체계 — 동일 카드 스택형 ### 규칙 4. 업그레이드 체계 — 동일 카드 스택 Lv.1→Lv.5 (BT7-Plan 확정 방향 9)
- 같은 카드를 2회째 픽하면 즉시 **Lv.1 → Lv.2** 업그레이드. **구 Lv.3 상한 폐기**. VS 원작 Lv.5 체계 계승.
- 최대 Lv.3까지 허용. Lv.3 이상에서 동일 카드 재픽 시 **재화 보상 or 랜덤 변형**으로 처리한다.
(재화 보상 vs 랜덤 변형 2가지 처리 방식의 선택은 balance-designer 판단 — 재화는 BM 연계, 변형은 빌드 복잡도 증가) - 같은 액티브·패시브 카드를 재픽할 때마다 **Lv.N → Lv.N+1** 업그레이드 (최대 Lv.5)
- 업그레이드는 카드 기본 효과의 **수치 상향 또는 추가 트리거** 중 하나. 두 효과 모두 부여하지 않는다. - Lv.5 도달 시 해당 액티브는 **각성 조건 중 "액티브 Lv.5"를 충족**한다 (규칙 5)
- Lv.5 이상에서 동일 카드 재픽 시 **재화 보상 or 랜덤 변형**으로 처리 (balance-designer 판단)
- 업그레이드는 카드 기본 효과의 **수치 상향 또는 추가 트리거** 중 하나 부여 (양자 동시 부여 금지)
### 규칙 5. 각성 발동 조건 (VS 원작 동일, BT7-Plan 확정 방향 5·10)
**각성 카드는 별도 풀에 분리된다**. 조건 충족 시 드로우·보물상자 획득으로 발동.
```
각성 발동 조건 (3종 동시 충족):
1. 해당 액티브 카드가 Lv.5 도달
2. 각성에 필요한 특정 패시브 카드 1개 이상 보유
3. 보물상자 획득
→ 세 조건 동시 충족 시 각성 카드 발동 (액티브가 각성 형태로 진화)
```
**각성 카드 데이터 구조**:
- 각 각성 카드마다 `필요_액티브` + `필요_패시브[]` 쌍 명시 (`content/01_카드_풀.md` v0.2)
- 각성 발동 시 원 액티브는 각성 형태로 대체 (원 액티브 슬롯 점유 유지)
- 같은 런에서 동일 각성 중복 발동 불가 (각성 카드는 1회 발동 후 "발동됨" 상태 고정)
**보물상자 체계**:
- 스테이지 진행 중 일정 조건(적 처치 수·특정 위치·엘리트 처치 등)으로 스폰
- 획득 시 각성 발동 조건 판정 수행
- 조건 불충족 시 대체 보상(재화·경험치·회복 등) 제공 (balance-designer 결정)
### 규칙 6. 플레이어 HP/하트 증가 메커니즘 (BT7-Plan 확정 방향 7)
- **패시브 카드·특성으로 최대 하트 수 +1 획득 가능**
- **런 내 성장만 유효** — 사망 시 기본 1개로 복귀 (`02_코어_루프` v0.2 §4 상태 보존 매트릭스)
- **상한**: balance-designer 결정 (초기 권고 3~5개, 하드캡 필수)
- `[방어]` 태그 패시브가 주 공급원. 일부 `[회복]` 태그와 중첩 가능
--- ---
@ -95,7 +146,9 @@ K 수치와 효과 내용은 balance-designer·content-designer 영역.
| 대기 | 카드 풀에 있으나 미등장 | 레벨업 드로우 알고리즘이 선택 | | 대기 | 카드 풀에 있으나 미등장 | 레벨업 드로우 알고리즘이 선택 |
| 제시 | 픽 UI에 표시됨 | 플레이어 미선택 시 → 폐기; 선택 시 → 장착 | | 제시 | 픽 UI에 표시됨 | 플레이어 미선택 시 → 폐기; 선택 시 → 장착 |
| 장착 | 빌드 슬롯에 편입, 효과 발동 중 | 동일 카드 재픽 시 → 업그레이드; 런 종료 → 전손 | | 장착 | 빌드 슬롯에 편입, 효과 발동 중 | 동일 카드 재픽 시 → 업그레이드; 런 종료 → 전손 |
| 업그레이드 | Lv.2 이상, 강화 효과 발동 | Lv.3에서 동일 카드 재픽 → 보상/변형 분기 | | 업그레이드 (Lv.2~4) | 강화 효과 발동 | 동일 카드 재픽 → Lv 상승; Lv.5 도달 시 → 각성 조건 충족 |
| Lv.5 도달 | 각성 조건 중 "액티브 Lv.5" 충족 | 필요 패시브 보유 + 보물상자 획득 → 각성 발동 |
| **각성** (신규) | 액티브가 각성 형태로 진화 발동 | 런 종료까지 지속 |
| 전손 | 런 종료(사망 or 클리어) 시 소멸 | 다음 런 시작 → 빌드 초기화 | | 전손 | 런 종료(사망 or 클리어) 시 소멸 | 다음 런 시작 → 빌드 초기화 |
--- ---
@ -105,16 +158,20 @@ K 수치와 효과 내용은 balance-designer·content-designer 영역.
**입력** **입력**
- 레벨업 이벤트 (경험치 시스템 or 스테이지 클리어 트리거) - 레벨업 이벤트 (경험치 시스템 or 스테이지 클리어 트리거)
- 플레이어 픽 입력 (터치·클릭) - 플레이어 픽 입력 (터치·클릭)
- 보물상자 획득 이벤트
**시스템 반응** **시스템 반응**
- 드로우 알고리즘 즉시 실행 → 픽 UI 표시 (Additive Load 2씬 구조 전제 — 개발팀 03 결정 계승) - 드로우 알고리즘 즉시 실행 → 픽 UI 표시 (Additive Load 2씬 구조 전제)
- 픽 결정 즉시 효과 발동 (애니메이션 피드백 포함, 상세는 ux-designer) - 픽 결정 즉시 효과 발동 (애니메이션 피드백 포함, 상세는 ux-designer)
- 업그레이드 시 기존 카드 아이콘에 레벨 표기 갱신 - 업그레이드 시 기존 카드 아이콘에 레벨 표기 갱신
- **각성 발동 시 풀스크린 연출** (액티브·패시브 진화 시각 변환, 상세: `ux/02_HUD_설계.md` v0.2 §3-A)
**필요한 피드백 종류 (ux-designer 연계)** **필요한 피드백 종류 (ux-designer 연계)**
- 3장 표시 시 각 카드의 태그·레벨·업그레이드 가능 여부를 즉시 파악 가능한 UI - 3장 표시 시 각 카드의 분류(액티브·패시브)·태그·레벨·업그레이드 가능 여부를 즉시 파악 가능한 UI
- 현재 빌드 태그 분포 시각화 (시너지 진행도 표시) - 현재 빌드 태그 분포 시각화 (시너지·각성 조건 진행도 표시)
- 업그레이드 완료 시 시각·음향 강조 - 업그레이드 완료 시 시각·음향 강조
- **각성 조건 충족 예고** — 액티브 Lv.5 도달 시 UI에 "각성 대기" 표시
- **보물상자 획득 시 각성 발동 강조 연출**
--- ---
@ -122,44 +179,56 @@ K 수치와 효과 내용은 balance-designer·content-designer 영역.
| 연동 시스템 | 연동 방식 | | 연동 시스템 | 연동 방식 |
|------------|----------| |------------|----------|
| **전투 시스템** (04_전투_기본_스펙) | 장착 카드 효과가 공격 판정·이동에 수식자로 적용 | | **전투 시스템** (04_전투_기본_스펙) | 장착 액티브 카드가 자동 발동 체계에서 발동·대미지 적용. 패시브 카드는 스탯 보정으로 상시 적용 |
| **특성 시스템** (02_특성_시스템) | 특성 일부가 픽 알고리즘 가중치 수정 or T2/T3 해제 조건 완화 | | **특성 시스템** (02_특성_시스템) | 특성 일부가 픽 알고리즘 가중치 수정 or 각성 조건 완화 (예: "필요 패시브 수 -1") |
| **스테이지 구조** (05_스테이지_구조_초안) | 스테이지 클리어 or 적 처치 누적이 레벨업 트리거 역할 | | **스테이지 구조** (05_스테이지_구조_초안) | 스테이지 클리어·적 처치 누적이 레벨업 트리거. **보물상자 스폰 위치**가 스테이지 설계에 포함 |
| **Additive Load 2씬** (개발팀 03) | 픽 UI는 별도 씬 Additive Load로 전투 씬 위에 오버레이 | | **보물상자 체계** (신규) | 스테이지 진행 중 발견·획득. 각성 발동 트리거. 조건 불충족 시 대체 보상 |
| **Additive Load 2씬** (개발팀 03) | 픽 UI·각성 발동 UI는 별도 씬 Additive Load로 전투 씬 위에 오버레이 |
--- ---
## 7. 엣지 케이스 ## 7. 엣지 케이스
1) **카드 풀 소진**: T1·T2 전체가 빌드에 장착되어 드로우 후보 소진 시 → T1 업그레이드 가능 카드로 강제 채움. 풀 규모는 이 상황이 발생하지 않도록 content-designer가 설계해야 한다. 1) **카드 풀 소진**: 액티브·패시브 전체가 빌드에 장착되어 드로우 후보 소진 시 → 업그레이드 가능 카드로 강제 채움. 풀 규모(50~65장)로 이 상황이 발생하지 않도록 content-designer가 설계해야 한다.
2) **T3 조건 충족 카드가 없을 때**: T3 슬롯은 T2 카드로 대체. T3 강제 등장 없음. 2) **각성 조건 부분 충족 상태에서 보물상자 획득**: 각성 조건 3종 중 일부만 충족 → 각성 발동 없이 **대체 보상**(재화·회복·경험치) 제공. balance-designer 결정.
3) **픽 UI 중 사망 (데미지 입력)**: 픽 UI 표시 중에는 게임 일시정지 처리. 픽 완료 후 전투 재개. (개발팀과 정합 필요 — 이슈 발견 시 C3 보고) 3) **다중 각성 조건 동시 충족**: 한 번의 보물상자 획득으로 복수 각성 조건이 동시 충족 시 → 플레이어에게 **1개 선택 UI 제공**. 동시 발동 금지 (밸런스 붕괴 방지).
4) **동일 런 내 동일 카드 4회 이상 등장**: Lv.3 이후 재픽은 항상 보상/변형 분기로 흡수되므로 무한 업그레이드 루프 없음. 4) **픽 UI 중 사망 (대미지 입력)**: 픽 UI 표시 중에는 게임 일시정지 처리. 픽 완료 후 전투 재개.
5) **동일 런 내 동일 카드 Lv.5 이후 재픽**: 재화 보상 or 랜덤 변형 분기로 흡수되므로 무한 업그레이드 루프 없음.
6) **각성 발동 후 필요 패시브 카드 분해·교체 시도**: 각성은 "발동됨" 상태로 고정되므로 영향 없음. 단 패시브 카드 자체는 런 종료까지 유지 (빌드 슬롯 고정).
--- ---
## 8. 기각안 ## 8. 기각안
1) **레어리티 3티어(공통·레어·전설) 명칭 체계 — 기각.** 기존 카드게임 언어와 충돌. 조선 퇴마 세계관에 맞는 T1(기본)·T2(숙련)·T3(각성) 명칭으로 대체. 내용상 동형이나 IP 정체성 강화 효과. 1) **"레어리티 3티어(공통·레어·전설) 명칭 체계" — 기각 (BT7-Plan 번복).** v0.1에서 "기존 카드게임 언어와 충돌, T1(기본)·T2(숙련)·T3(각성) 명칭"으로 기각했으나, PD 2026-04-24 BT7-Plan에서 **3티어 구조 자체 폐기** + "액티브+패시브=각성" 3분류로 전환. **기각안 유지(번복 기록)**: 원 기각 사유는 PD 지시로 무효화되었으나 설계 역사 보존 목적으로 본 기각안 섹션에 남긴다 (C14-5 히스토리 보존 정신).
2) **카드 합성 시스템(2장 합쳐 상위 카드) — 기각.** 합성은 별도 합성 UI·재고 관리·합성 레시피 설계를 요구하여 시스템 복잡도 폭증. 동일 카드 스택 업그레이드가 "합성"의 재미를 단순 구조로 대체한다. 2) **"HP 막대 도입 기각" (구 04_전투 §8 기각안 1 연계) — 기각 (BT7-Plan 번복).** 원 기각은 "라이프 1 고수"였으나 PD 2026-04-24 BT7-Plan 7에서 "하트 분할 + 카드·성장으로 하트 수 증가"로 전환. 본 시스템 규칙 6에 패시브·특성 하트 수 증가 메커니즘 신설. **기각안 유지(번복 기록)**.
3) **빌드 슬롯 상한 고정(최대 N장까지만 장착) — 기각.** 슬롯 상한은 "어떤 카드를 버릴까"라는 별도 결정 레이어를 요구. 파일럿 스코프에서는 슬롯 무제한 + 카드 효과 간 상호작용 복잡도로 빌드 깊이를 형성하는 방향이 구현 부담 대비 재미 우위. 3) **"카드 합성 시스템(2장 합쳐 상위 카드)" — 기각 (현행 유지).** 합성은 별도 UI·재고·레시피 설계를 요구하여 시스템 복잡도 폭증. 동일 카드 스택 업그레이드(Lv.5까지)가 "합성"의 재미를 단순 구조로 대체한다.
4) **카드 판매·분해 메카닉(런 중 카드 처분으로 재화 획득) — 기각.** BM 미확정 상태에서 런 내 재화 루프 설계는 범위 초과. Phase 3-C BM 설계 이후 재검토 안건으로 보관. 4) **"빌드 슬롯 상한 고정(최대 N장까지만 장착)" — 기각 (현행 유지 + BT7-Plan 의미 변화).** 파일럿 스코프에서 슬롯 무제한 + 카드 효과 간 상호작용 복잡도로 빌드 깊이 형성. 단 **BT7-Plan에서 액티브·패시브 분리**로 VS 원작 6/6 슬롯 분리 참고 가능 — `balance/02_레벨업_곡선.md` v0.2에서 재설계.
5) **현재 빌드 태그 연동 가중 OFF(완전 무작위 픽) — 기각.** 완전 무작위는 "빌드 방향이 매 픽마다 흔들리는" 경험을 유발, 조합 육성 재미 약화. 태그 연동 가중은 "시너지를 향해 나아가는" 느낌의 구조적 기반이다. 가중 강도만 balance-designer가 조정. 5) **"카드 판매·분해 메카닉(런 중 카드 처분으로 재화 획득)" — 기각 (현행 유지).** BM 미확정 상태에서 런 내 재화 루프 설계는 범위 초과. Phase 3-C BM 설계 이후 재검토.
6) **"현재 빌드 태그 연동 가중 OFF(완전 무작위 픽)" — 기각 (현행 유지).** 완전 무작위는 빌드 방향 흔들림 유발, 조합 육성 재미 약화. 태그 연동 가중이 "시너지를 향해 나아가는" 구조적 기반.
7) **"각성 카드를 레벨업 드로우 풀에 포함" — 기각 (BT7-Plan 신규).** PD 확정 방향 10에서 "각성 카드는 별도 풀. 조건 충족 시 드로우·보물상자 획득으로 발동"으로 명시. 레벨업 드로우 포함 시 조건 미충족 각성 카드가 무의미 카드로 등장하여 픽 UX 저해.
8) **"각성 조건 단순화 (액티브 Lv.5만 충족하면 자동 발동)" — 기각 (BT7-Plan 신규).** PD 확정 방향 5는 "VS 원작 동일 — 필요 패시브 + 보물상자"를 명시. 단순화는 각성 카타르시스의 "기다림·빌드 설계" 감정을 파괴. VS 원작 구조 계승 필수.
--- ---
## 9. 열린 이슈 (balance·content·ux 이관) ## 9. 열린 이슈 (balance·content·ux·narrative 이관)
1) **[balance]** T1/T2/T3 레벨 구간별 비율 수치 — 픽이 너무 쉽거나 너무 어렵지 않은 곡선 설계 필요. 1) **[balance]** 액티브·패시브 드로우 비율 수치 — 레벨 구간별 곡선 설계 (`balance/02_레벨업_곡선.md` v0.2).
2) **[balance]** 태그 시너지 발동 K장 임계값 및 효과 강도. 2) **[balance]** 태그 시너지 발동 K장 임계값 및 효과 강도.
3) **[content]** 카드 명칭·효과 텍스트·태그 세트 전체 리스트 — 조선 오행·퇴마 세계관 반영. 3) **[balance]** 최대 하트 수 상한 수치.
4) **[content]** T3 해제 조건 텍스트 (런 내 어떤 달성이 T3를 여는가). 4) **[balance]** 보물상자 스폰 조건·대체 보상 수치.
5) **[ux]** 픽 UI 레이아웃·애니메이션·시너지 진행도 시각화 방식. 5) **[content]** 액티브 15~20종 / 패시브 25종 이내 / 각성 15~20종 전체 리스트 (`content/01_카드_풀.md` v0.2).
6) **[balance·content]** Lv.3 이후 재픽 시 재화 보상 vs 랜덤 변형 선택 — BM 방향과 연계하여 결정. 6) **[content]** 각성 카드별 필요_액티브 + 필요_패시브[] 쌍 데이터.
7) **[ux]** 픽 UI 레이아웃 (액티브·패시브 구분 표시) · 각성 발동 풀스크린 연출 · 시너지 진행도 시각화 방식.
8) **[balance·content]** Lv.5 이상 재픽 시 재화 보상 vs 랜덤 변형 선택 — BM 방향 연계.
9) **[narrative]** 태그 용어 세계관 재매핑 (일반 RPG 용어 → 조선 퇴마 특화) — PD 후속 검토 대기.
--- ---
@ -168,3 +237,4 @@ K 수치와 효과 내용은 balance-designer·content-designer 영역.
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|------|------|------|------| |------|------|------|------|
| 2026-04-22 | v0.1 시스템 설계 초안 | BT6-Plan Phase 3-B PD 지시 | system-designer | | 2026-04-22 | v0.1 시스템 설계 초안 | BT6-Plan Phase 3-B PD 지시 | system-designer |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (액티브/패시브/각성 3분류·Lv.5 확장·각성 발동 조건·하트 수 증가·2축 드로우) | 기획팀장 |

View File

@ -0,0 +1,228 @@
---
type: 방식_검토
scope: 덱빌딩_방식_비교·4티어_개정안
author: 기획팀장
date: 2026-04-24
version: v0.1 (Phase 3-C 방향 검토)
project: EerieVillage (기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist)
phase: BT7-Plan (PD 지시 2026-04-24)
data_source: 01_게임_컨셉·02_코어_루프·03_진행_시스템_초안·04_전투_기본_스펙·system/01_카드_시스템·content/01_카드_풀·balance/01·02·ux/02
status: PD 방향 결정 대기 — 결정 후 system/01·content/01·balance/01·02·ux/02 개정 집행
---
# 03. 덱빌딩 방식 검토 + 4티어 개정안
## 0. 검토 배경·범위
PD 2026-04-24 직접 지시 2건:
1. 세계관(narrative) 추가 진행 중단 — PD 직접 보완 예정. 본 검토에서 세계관 용어·네이밍은 현행 유지 전제
2. **카드 시스템 개정 검토** — (a) 티어 3→4 변경 방향 확정 (b) 덱빌딩 방식을 **Slay the Spire 방식** vs **Vampire Survivors 방식** 중 선정
**재미 축 연결 (P30)**: 본 검토의 판단 기준은 현 기획 확정된 재미 축 3종이다.
- 축 1 (육성 롤러코스터의 카타르시스) — **핵심**
- 축 2 (액션 플랫포머의 손맛) — **핵심**
- 축 3 (영속 성장의 위안) — 보조
**유지 제약 (변경 불가)**: 모바일 타겟·라이프 1·사망 시 카드 전손·2D 횡스크롤 플랫포머·근거리 검·i-frame 0.6s·레벨업 3픽 골격. 본 검토는 이 제약 안에서 "카드 효과가 언제·어떻게 발동하는가" 축만 조정한다.
---
## 1. 두 방식 구조 비교
### 1-1. 정의
| 방식 | 정의 (일반적으로 알려진 범위) |
|---|---|
| **Slay the Spire 방식** (이하 STS) | 덱 구축형. 카드팩에서 카드를 획득해 덱에 추가, 매 턴 손패 5장 드로우, 에너지 3 소비로 카드 발동, 턴제 전투. 경로 선택형 로그라이크. |
| **Vampire Survivors 방식** (이하 VS) | 자동 발동형. 무기·패시브 최대 6·6 슬롯, 레벨업마다 3픽, 무기 5회 강화 시 진화. 기본 공격·무기는 자동 발동, 플레이어 입력은 **이동뿐**. 실시간 서바이버. |
### 1-2. 5개 관점 매트릭스
| 관점 | STS | VS |
|---|---|---|
| **코어 루프** | 턴제 전투에서 카드 드로우·핸드 관리·에너지 분배 | 실시간 전투에서 자동 공격·주기 발동 |
| **조작 복잡도** | 카드 선택·타겟 지정·에너지 배분 (중~높음) | 이동만 (극단적으로 낮음) |
| **난이도 곡선** | 덱 시너지 이해 심화형. 카드 학습 곡선 가파름 | 무기 시너지 이해형. 진입 장벽 낮음·숙련 상한도 낮음 |
| **몰입 축** | 전략·빌드 구상 (사고형 몰입) | 화면 점유 쾌감·수치 폭발 (감각형 몰입) |
| **입력 평균 분당** (추정) | 5~15회 (턴 단위) | 0~60회 (이동만, 자유) |
**핵심 차이**: STS는 **"카드가 곧 행동"** (플레이어가 카드를 써서 공격·방어). VS는 **"카드가 곧 배경 규칙"** (플레이어는 이동만, 카드·무기가 자동 발동).
### 1-3. EerieVillage 현 설계와의 교차점
| 현 설계 요소 | STS 호환성 | VS 호환성 |
|---|---|---|
| 2D 횡스크롤 플랫포머 (축 2 손맛) | **충돌** — STS는 턴제라 실시간 점프·공격 플로우와 호환 불가 | **정합** — VS도 실시간. 단 VS는 탑뷰 고정 |
| 근거리 검 1종 + i-frame 0.6s (04_전투 §5·§4-2) | 공격은 카드 사용으로 대체 → 검 공격 개념 소실 | 검 공격은 유지 + 자동 발동 무기·효과가 추가 |
| 레벨업 3픽 골격 (03_진행·system/01 규칙 1) | **정합** — STS도 맵 노드 보상으로 카드 획득 (3픽 아님, 변형 필요) | **정합** — VS 원형 그대로 |
| 라이프 1·피격 즉사 (04_전투 §3) | 턴제에 라이프 1은 치명적 — 턴 1회 실수 = 사망 | 실시간 이동 회피와 결합, 현 설계와 충돌 없음 |
| 사망 시 카드 전손 (코어 룰 7) | 정합 | 정합 |
| 모바일 터치 (가상 스틱 + 점프/공격 버튼) | 카드 드래그·타겟 지정 UI 추가 필요 → 입력 복잡도 증가 | 이동만 → 가상 스틱 1개로 충분 |
**실측 판단**: STS 방식은 축 2(액션 플랫포머 손맛)를 **구조적으로 포기**해야 성립한다. VS 방식은 축 2를 유지하면서 카드 효과 발동 축을 자동화한다.
---
## 2. EerieVillage 맥락 적합성 분석
### 2-1. 유지 제약 5축별 10점 척도 평가
| 제약 축 | STS 적합성 | VS 적합성 | 판정 근거 |
|---|---|---|---|
| **모바일 조작** (가상 스틱 + 2버튼) | 3/10 | 9/10 | STS는 카드 드래그·핸드 관리 UI 필수 → 세로 화면에 핸드 공간 압박. VS는 이동만이라 기존 UI 그대로 유지 |
| **라이프 1** | 4/10 | 8/10 | STS 턴제는 "한 턴 실수 = 즉사". 오히려 낙차 재미가 "무력감"으로 전환 위험. VS는 실시간 이동 회피가 라이프 1 긴장을 스킬 기반으로 승화 |
| **2D 액션 플랫포머** (축 2) | 1/10 | 7/10 | STS는 턴제라 점프·실시간 공격 플로우와 병존 불가. VS는 실시간이지만 원형은 탑뷰 — 2D 플랫포머 변형은 선례 적음(하이브리드 시도 필요) |
| **재미 축 1 육성 롤러코스터** | 8/10 | 9/10 | 양자 모두 "쌓기→폭발→전손" 구조 가능. STS는 턴마다 의사결정 누적 → 더 치밀한 빌드감. VS는 자동 발동 폭발이 직관적 카타르시스 |
| **32장 스코프** | 6/10 | 9/10 | STS 덱빌딩은 카드 수가 많을수록 깊이 증가 — 32장은 얕은 느낌. VS 32장은 무기 12 + 패시브 12 + 시너지 카드 8 수준으로 충분한 볼륨 |
**종합**: STS = 22/50 (44%), VS = 42/50 (84%). VS 방식이 EerieVillage 유지 제약과 정합도가 **구조적으로** 높다.
### 2-2. STS 방식의 결정적 부적합 사유 3종
1. **축 2 구조적 포기** — 턴제는 점프·실시간 공격의 즉각 피드백 재미를 성립 불가능하게 만든다. 템플릿(2D PlatformerMicrogame) 선택의 전제가 부정된다.
2. **모바일 세로 화면 정보 밀도 초과** — STS는 PC·태블릿 기준 설계. 모바일 세로 화면에서 핸드 5장·에너지·적 스탯·의도·버프 표시는 HUD 과포화를 유발 (ux/02 HUD 원칙 "정보 과다 = 정보 없음" 위배).
3. **캐주얼 로그라이크 포지션 이탈** — 01_게임_컨셉 §3 타겟 유저(20~40대 캐주얼~미드코어)와 STS의 사고형 몰입(평균 학습 시간 수십 시간)이 충돌.
---
## 3. 권장안
### 3-1. 결론
**Vampire Survivors 방식을 기본 골격으로 채택하되, EerieVillage 고유의 "근거리 검 조작 + 2D 횡스크롤 플랫포머" 축을 유지하는 하이브리드**를 권장한다.
### 3-2. 권장안 구조 (3줄 요약)
1. **플레이어 직접 조작 유지**: 이동·점프·근거리 검 공격 (04_전투 §2·§5 계승). VS 원형의 "이동만"은 축 2를 약화하므로 기각.
2. **카드 효과는 자동 발동 + 플레이어 공격 강화의 두 축**: `[공격]`·`[방호]`·`[속도]` 태그는 플레이어 검 공격·이동에 즉시 적용 (STS형). `[부적]`·`[소환]`·`[주술]`·`[폭발]`·`[회복]` 태그는 주기 자동 발동 (VS형). content/01 32장 태그 체계가 이미 양 방식 분리 가능한 구조.
3. **레벨업 3픽 + 동일 카드 스택 업그레이드 유지**: system/01 규칙 1~4 골격 전부 계승. VS의 "진화(Evolution)" 개념은 **시너지 발동**(system/01 규칙 3)으로 대체하여 학습 부담 최소화.
### 3-3. 권장 근거 (3~5줄)
- **축 2(액션 플랫포머 손맛) 보존**: 플레이어 입력·검 공격·점프 회피를 핵심 축으로 유지. VS 원형의 "이동만 조작"은 축 2를 포기하는 결정이므로 EerieVillage에는 부적합.
- **축 1(육성 롤러코스터) 강화**: 자동 발동 카드가 화면에 쌓일수록 "내 플레이가 점점 압도적이 된다"는 VS 특유의 시각적 쾌감을 획득. 기존 3픽 긴장은 동일하게 유지.
- **모바일 UX 부담 최소**: 조작은 현 스킴 그대로(가상 스틱 + 점프·공격). 핸드 관리·에너지·턴 엔드 UI가 필요 없어 HUD 정보 밀도 유지 가능.
- **구현 복잡도 현실성**: VS 자동 발동형은 주기 타이머 + 투사체/AoE 풀링만 구현하면 확장 용이. BT.Framework Tier 1(Log·ValidationEx·MathEx·EnumEx·FormatEx)과 Unity PlatformerMicrogame Simulation 시스템 활용 가능 (C11 관점 — 개발팀 교차 검증 필요).
- **하이브리드의 선례 근거**: Dead Cells의 "장착 스킬 쿨타임 자동 + 플레이어 검 공격" 구조가 유사. STS 순수형·VS 순수형보다 EerieVillage 유지 제약 충족도가 높다. (추정: Dead Cells가 본 하이브리드 모델에 가장 근접한 양산 사례)
### 3-4. 대안 (PD 결정 보조용)
| 대안 | 요지 | 선정 시 영향 |
|---|---|---|
| **대안 A: VS 순수형** | 플레이어 조작 이동만. 검 공격도 자동 발동. | 축 2 사실상 포기. 캐주얼성 극대화. 구현 단순. BT5 템플릿 선택 근거 약화 |
| **대안 B: 하이브리드** (권장) | 검 공격 수동 + 카드 효과 자동·수동 혼합 | 축 1·2 모두 유지. 구현 중간 복잡도 |
| **대안 C: STS 변형** | 실시간 이동 유지 + 카드 사용 수동 (에너지 시스템) | 학습 부담 증가. 모바일 UX 부담 증가. 사고형 타겟 전환 필요 |
---
## 4. 4티어 변경 반영안
### 4-1. 현 상태 모순 식별 (판단 선행)
현 기획 문서 실측 결과 **이미 티어 체계가 내부 불일치 상태**:
- `system/01_카드_시스템.md §3 규칙 1`: 3티어 (T1 기본 · T2 숙련 · T3 각성)
- `content/01_카드_풀.md §2-1`: 3티어 (1티어 보통 · 2티어 귀 · 3티어 신)
- `balance/02_레벨업_곡선.md §4`: **4티어** 확률 테이블 존재 (Common · Uncommon · Rare · Epic)
PD 지시의 "3→4 변경"은 이 불일치를 해소하는 방향이며, **balance 문서의 4티어가 이미 선행 존재**하므로 system·content를 balance에 맞춰 확장하는 방향이 자연스럽다.
### 4-2. 권장 4티어 구조 — 3티어 사이 분할
**티어 추가 위치**: 기존 T2(숙련) vs T3(각성) **사이**에 신 티어 "비전(祕傳)" 삽입. T1 확장이나 T3 위 추가가 아닌 이유는 아래 §4-4에서 설명.
| 신 티어 | 레이블 | 성격 | 해제 조건 | 등장 비율 지향 |
|---|---|---|---|---|
| **T1** | 기본 (普通) | 단일 효과·조합 진입점 | 런 시작 시 항상 활성 | 초반 주력, 후반 배경 |
| **T2** | 숙련 (鍛鍊) | 복합 효과·시너지 촉매 | 런 내 Lv.3 이상 도달 시 풀 합류 | 중반 주력 |
| **T3** | **비전 (祕傳) ← 신규** | 빌드 방향을 좁히는 특화 효과 | 런 내 Lv.5 이상 + 현 빌드 주력 태그 2장 이상 보유 시 출현 | 중후반, 빌드 확정기 |
| **T4** | 각성 (覺醒) | 빌드 완성자·화면 점유급 강력 효과 | 런 내 Lv.7 이상 + 보스 1회 이상 처치 시 출현 | 후반, 런 피날레 |
### 4-3. 4티어 각각의 성격·해제 조건
1. **T1 기본 (普通)** — 단일 태그·단일 효과. 빌드 탐색의 출발점. 해제: 항상. 등장: 초반 주력, 후반 잔여.
2. **T2 숙련 (鍛鍊)** — 2개 태그 혹은 조건부 효과. 시너지 발동 조건 생성·촉매 역할. 해제: Lv.3+. 등장: 중반.
3. **T3 비전 (祕傳)** — 현재 빌드 주력 태그를 가진 **특화 효과**. "이미 선택한 길을 깊게 판다"는 감정. 해제: Lv.5+ & 주력 태그 2장 이상. 등장: 중후반 빌드 확정기.
4. **T4 각성 (覺醒)** — 3티어 요소의 완성자. 구 `content/01 §3` T3 5장(천지신명·천부경문·사령결계·산신령강림·천지음양방호·역천지기·귀문관·천지개벽)이 대체로 여기에 해당. 해제: Lv.7+ & 보스 1회 이상 처치. 등장: 후반 런 피날레.
### 4-4. 왜 "중간 분할"인가 — 3안 비교
| 추가 위치 | 장점 | 단점 | 판정 |
|---|---|---|---|
| T1 아래 (초심자 티어 추가) | 진입 장벽 최소화 | T1이 이미 "기본"이라 의미 중복. 런 초반 선택지 과다 | 기각 |
| T3 위 (최상위 티어 추가) | 후반 빌드 피날레 강화 | balance/02 Epic 8~30% 등장 확률을 더 낮춰야 함. 체감 희박화 | 차선 |
| **T2·T3 사이 (권장)** | 중후반 빌드 확정기에 "내 빌드를 깊게" 감정 층 추가. 구 T3 5장(content/01)이 자연스럽게 T4로 승격 | 없음 (balance/02 기존 4티어와 정합) | **권장** |
### 4-5. 32장 → 4티어 재분배 수치안
구 분포 (content/01 §3 실측): T1 12장·T2 15장·T3 5장. (T2에 다수 포진)
| 티어 | 권장 분포 | 비중 | 이동·분류 근거 |
|---|---|---|---|
| T1 | 12장 | 37.5% | 현 T1 유지 (01·02·06·07·11·15·19·20·24·27) 10장 + 현 T2 하위 2장 재분류 |
| T2 | 10장 | 31.3% | 현 T2 중 "복합 효과 촉매"형 (03·08·16·22·25·28) 6장 + 4장 추가 재분류 |
| T3 (비전 신규) | 7장 | 21.9% | 현 T2 중 "빌드 특화"형 (04·09·12·13·17·21·26·29) 중 7장 승격 |
| T4 (각성, 구 T3) | 3장 | 9.4% | 구 T3 5장 중 3장만 유지 (05·10·14·18·23·30·31·32 중 피날레급 3장 선별). 2장은 T3 비전으로 강등 |
**주의**: 위 장번호는 **예시 매핑**. content/01 개정 시점에 세밀 조정 필요 (기각안 2번 "과도한 재분배는 balance/02 기존 수치 충돌 위험"과 연관).
### 4-6. 권장 덱빌딩 방식과의 정합성
- **VS 하이브리드 + 4티어**: VS의 진화(Evolution) 개념 대신 **"시너지 발동 + T3 비전 등장"** 이중 구조로 유사 감정 제공. 학습 부담은 T3 비전 해제 조건이 "Lv.5+ & 주력 태그 2장"이므로 플레이어가 자연 체득.
- **자동 발동 카드(T2·T3·T4)의 발동 주기 차등**: T2는 짧은 주기, T3 비전은 중간 주기 + 태그 보너스, T4는 긴 주기 + 대형 효과. balance/02의 티어별 출현 확률(§4)과 정합 유지.
- **T4 해제 조건의 재미 축 연결**: "보스 1회 이상 처치" 조건은 축 1(육성 롤러코스터) 중 "폭발" 직전 단계에서 T4가 열려 피날레 감정 강화.
---
## 5. 개정 영향 범위
본 방향 결정(PD 승인) 시 **순차 개정**이 필요한 파일 목록. 본 검토 문서는 제안 단계이며 실제 개정은 PD 방향 결정 후 별도 집행.
| 파일 | 개정 요지 | 책임 에이전트 |
|---|---|---|
| `system/01_카드_시스템.md` §3 규칙 1~4 | 3티어 → 4티어 확장. 픽 알고리즘에 "T3 비전 태그 보너스 조건" 추가. 업그레이드 체계는 그대로 유지. VS 하이브리드 방식 반영(카드 발동 분류: 수동 강화형 vs 자동 발동형) | system-designer |
| `content/01_카드_풀.md` §2-1·§3 | 티어 레이블 4종으로 재매핑. 32장 재분배 (위 §4-5 수치안 기준). 카드별 "자동 발동 vs 수동 강화" 분류 컬럼 신규 추가 | content-designer |
| `balance/01_전투_수치.md` §3 대미지 공식 | CardMultiplier 범위(1.0~2.5) 재검토. 자동 발동 카드의 DPS 기여도 추가 분석 필요. 수동 공격 카드와 DPS 합산 시 하드캡 DPS 100 유지 여부 재검증 | balance-designer |
| `balance/02_레벨업_곡선.md` §4 | 현 4티어 확률 테이블 유지 + 레이블을 신 체계 명(T1 기본·T2 숙련·T3 비전·T4 각성)으로 재매핑. 해제 조건(Lv.3/5/7·태그 2장·보스 처치)과 확률 테이블 정합성 검증 | balance-designer |
| `ux/02_HUD_설계.md` §3 레벨업 카드 픽 UI | 3장 레이아웃은 유지. 카드별 "자동 발동 vs 수동 강화" 아이콘 구분 표시 추가. T3 비전 등장 시 태그 보너스 시각 피드백 추가. HUD 정보 밀도 재평가 | ux-designer |
**세계관 용어 유지**: narrative 영역 건드리지 않음. 카드명·티어명·태그명 등 기존 한자·조선 퇴마 톤 전부 유지. "비전(祕傳)"·"각성(覺醒)" 신 레이블은 현 톤과 정합.
---
## 6. 기각안 (C32 필수 필드)
1. **STS 순수 채택 — 기각.**
근거: §2-2에 상세. 축 2(액션 플랫포머 손맛)를 구조적으로 포기해야 하며, 템플릿(2D PlatformerMicrogame) 선택의 전제(PD 코어 룰 2 횡스크롤 플랫포머)를 부정한다. 모바일 세로 화면 정보 밀도 초과·캐주얼 타겟 이탈까지 3중 부적합.
2. **VS 순수 채택 (플레이어 조작 이동만) — 기각.**
근거: 축 2를 축소 포기하는 결정이다. "근거리 검 공격으로 카드 효과를 직접 체감·전달하는 물성감"(01_게임_컨셉 §2 축 2)을 자동 발동 전환 시 "덱빌딩 감각은 얻지만 조작 손맛은 잃는" 교환이 된다. 본 유지 제약의 "2D 플랫포머·근거리 검"과 직접 충돌. 권장안 하이브리드가 축 2를 유지하면서 VS의 수치 폭발 쾌감을 획득한다.
3. **4티어 최상위(T3 위) 추가 — 차선, 권장안 아님.**
근거: §4-4 비교표. 기존 balance/02 §4 Epic 확률(8~30%)을 더 낮춰야 체감 희박성 유지 가능하나, 이 경우 Epic 카드 자체가 "거의 못 본다" 상태 전환 위험. T2·T3 중간 삽입이 기존 확률 테이블과 정합도 높고, 구 T3 5장이 자연스럽게 T4로 승격되는 구조적 이점 획득.
4. **4티어 T1 아래 추가 (초심자 티어) — 기각.**
근거: T1이 이미 "기본"이라 의미 중복. 런 초반 선택지 과다로 초심자 진입 장벽이 오히려 증가. PD 지시(카드 3픽 유지) 구조상 초반 3장 중 최하 티어 비중이 높으면 "이 게임은 처음에 뭐 골라도 효과가 미미하다"는 인상 형성 위험.
5. **카드 풀 32장 유지 vs 확장 — 기각 (현 32장 유지).**
근거: content/01 §5 기각안 2 "50장 이상 초기 풀 기각" 계승. 4티어 재분배로 볼륨 조정 충분. 업데이트 확장은 Phase 3-C 이후 별도 안건.
6. **T3 비전의 "주력 태그 2장" 해제 조건을 동적 판정 대신 정적 판정으로 — 기각.**
근거: 정적 판정(런 시작 시 태그 고정)은 VS의 실시간 성장 감각을 약화한다. 매 픽마다 빌드 주력 태그를 재평가하는 동적 판정이 "내 빌드를 깊게 판다"는 비전 티어 의도와 정합. 구현 복잡도는 태그 카운터 증가만이라 BT.Framework EnumEx 활용으로 해소 (C11 판단 — 개발팀 교차 검증 필요).
---
## 7. 검토 요약 (PD 결정 보조용)
1. **덱빌딩 방식**: VS 하이브리드 (권장) / VS 순수 / STS 변형 3안 중 택1 — PD 방향 결정 요청.
2. **4티어 구조**: T2·T3 중간 삽입 "비전(祕傳)" (권장) / T3 위 추가 (차선) 중 택1 — PD 방향 결정 요청.
3. **32장 재분배**: 12·10·7·3 권장 분포 — 방향 확정 후 content-designer 세밀 조정.
4. **개정 집행 범위**: system/01·content/01·balance/01·02·ux/02 5개 파일 순차 개정 — PD 승인 후 착수.
5. **narrative 영역**: PD 직접 지시에 따라 현행 유지 — 본 검토에서 건드리지 않음.
---
## 8. 변경 이력
| 일시 | 변경 | 사유 | 기안 |
|------|------|------|------|
| 2026-04-24 | v0.1 BT7-Plan 덱빌딩 방식 검토 + 4티어 개정안 작성 | PD 직접 지시 2026-04-24 | 기획팀장 |

View File

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

View File

@ -2,57 +2,82 @@
type: 상세_기획 type: 상세_기획
scope: HUD_설계 scope: HUD_설계
author: ux-designer author: ux-designer
date: 2026-04-23 date: 2026-04-24
version: v0.1 (Phase 3-B) version: v0.2 (BT7-Plan 개정)
project: EerieVillage project: EerieVillage
phase: Phase 3-B phase: Phase 3-B
data_source: BT5-Plan 02_코어_루프 v0.1 + 04_전투_기본_스펙 v0.1 data_source: 02_코어_루프 v0.2 + 04_전투_기본_스펙 v0.2 + system/01_카드_시스템.md v0.2 + BT7-Plan PD 확정 방향 11건
status: 확정 골격 — 세부 레이아웃 수치는 개발팀 협의 status: BT7-Plan 개정 반영 — 하트 분할 UI·액티브/패시브 슬롯 분리·각성 발동 연출
--- ---
# 02. HUD 설계 # 02. HUD 설계
## 1. 재미 축 연결 (P30) ## 1. 재미 축 연결 (P30)
HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전제)에서 HUD가 전달해야 할 것은 오직 "현재 상태"와 "다음 결정"이다. 한 화면에 한 가지 결정만 요구. HUD 원칙: **정보 과다 = 정보 없음**. 하트 분할 구조(BT7-Plan 확정 방향 7)에서 HUD가 전달해야 할 것은:
- "현재 생존 상태" (하트 잔량 시각화)
- "다음 결정 트리거" (레벨업 예고·보물상자 획득·각성 조건 충족)
- "현재 빌드 상태" (액티브·패시브 슬롯)
## 2. 인게임 HUD 요소 ## 2. 인게임 HUD 요소
### 2-1. 정보 우선순위 ### 2-1. 정보 우선순위 (BT7-Plan 재구성)
| 우선순위 | 요소 | 이유 | | 우선순위 | 요소 | 이유 |
|---|---|---| |---|---|---|
| **1순위** | 라이프 표시 (생존 여부) | 라이프 1 즉사 → 즉시 인지 필수 | | **1순위** | **하트 UI (생존 여부 + 잔량)** | 하트 분할 구조 → 쿼터 단위 잔량 즉시 인지 필수 |
| **2순위** | 레벨 + 경험치 게이지 | 레벨업 카드 픽 트리거 예고 | | **2순위** | 레벨 + 경험치 게이지 | 레벨업 카드 픽 트리거 예고 |
| **3순위** | 카드 슬롯 (현재 보유 카드) | 빌드 확인용, 전투 흐름 방해 금지 | | **3순위** | **액티브 슬롯 (장착 무기 + Lv 표기)** | 자동 발동 감상 재미의 기준 정보 |
| **4순위** | **패시브 슬롯 (장착 패시브 + Lv 표기)** | 빌드 확인용, 전투 흐름 방해 금지 |
| **5순위** | 각성 조건 진행도 (신규) | 액티브 Lv.5 도달 시 "각성 대기" 표시 |
### 2-2. HUD 배치 (와이어프레임) ### 2-2. HUD 배치 (와이어프레임, BT7-Plan 재설계)
``` ```
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ [Lv.3 ████████░░] [♥] │ ← 좌상단: 레벨·경험치 + 라이프 │ [Lv.3 ████████░░] [♥ ♥] │ ← 좌상단: 레벨·경험치 + 하트 분할 UI
│ [⚙] │ ← 우상단: 일시정지 │ [⚙] │ ← 우상단: 일시정지
├──────────────────────────────┤ ├──────────────────────────────┤
│ │ │ │
│ 플레이 영역 │ │ 플레이 영역 │
│ │ │ │
│ [카드1][카드2][카드3] │ ← 하단: 카드 슬롯 (반투명) ├────────────┬─────────────────┤
│ [입력 영역] │ │ 액티브: │ 패시브: │ ← 하단: 카드 슬롯 분리 (반투명)
└──────────────────────────────┘ │ [A1][A2] │ [P1][P2][P3] │
│ [A3][★★] │ [P4][P5][P6] │ ← ★ = 각성 대기 표시
└────────────┴─────────────────┘
[입력 영역: 가상스틱 + 점프]
``` ```
- **라이프 표시**: 하트 아이콘 1개. 피격 시 깜박임·소멸 애니메이션 (1초 이내 인지) - **하트 UI**: ♥ 하트 분할 시각화 (풀·3/4·반·1/4·빈 5단계, Zelda BotW 방식). 최대 하트 수 증가 시 우측 추가 하트 아이콘 생성 (최대 5개, 한 줄 배치)
- **레벨·경험치 게이지**: 텍스트 + 바. FormatEx로 "Lv.N" 포맷 렌더링 - **레벨·경험치 게이지**: 텍스트 + 바. FormatEx로 "Lv.N" 포맷 렌더링
- **카드 슬롯**: 보유 카드 아이콘 최대 N개 (N=balance-designer 결정). 소형·반투명으로 전투 방해 최소화 - **액티브 슬롯**: 6개 슬롯 (BT7-Plan 확정 방향 6). 좌측 반투명 배치. 각 슬롯 아이콘 우하단에 Lv 표기 (Lv.1~Lv.5)
- **패시브 슬롯**: 6개 슬롯. 우측 반투명 배치. 각 슬롯 아이콘 우하단에 Lv 표기
- **각성 대기 표시 (신규)**: 액티브 슬롯 내 아이콘이 Lv.5 도달 + 필요 패시브 1개 이상 보유 시 해당 슬롯 테두리 황금색 하이라이트 + ★ 아이콘 부착
- **일시정지 버튼**: 우상단 고정. Safe Area 내 배치 의무 - **일시정지 버튼**: 우상단 고정. Safe Area 내 배치 의무
### 2-3. 보스전 추가 HUD ### 2-3. 하트 UI 분할 스프라이트 (BT7-Plan 신규)
**젤다 BotW 방식 5단계 상태**. 개발팀 이관 항목(§9):
| 상태 | 스프라이트 | 애니메이션 |
|---|---|---|
| 풀 (4/4) | `heart_full.png` | 정적 |
| 3/4 | `heart_three_quarter.png` | 우하단 1/4 사라짐 애니 (150ms) |
| 반 (2/4) | `heart_half.png` | 우측 반 사라짐 애니 (150ms) |
| 1/4 | `heart_one_quarter.png` | 좌상단 1/4만 남기 애니 (150ms) |
| 빈 (0/4) | `heart_empty.png` | 외곽선만. 하트 전소 애니 후 전환 (200ms) |
하트 전소 시 → 우측 하트 아이콘이 있으면 새 하트가 즉시 활성. 모든 하트 전소 시 사망 분기.
### 2-4. 보스전 추가 HUD
보스룸 진입 시 보스 HP 바 상단 출현: 보스룸 진입 시 보스 HP 바 상단 출현:
- 보스 이름 + HP 바 (화면 상단 중앙) - 보스 이름 + HP 바 (화면 상단 중앙)
- 페이즈 2 진입 시 바 색상 전환 + 경고 아이콘
- 보스 HP 0 도달 시 바 사라짐 + 처치 피드백 (성공 인지 1초 이내) - 보스 HP 0 도달 시 바 사라짐 + 처치 피드백 (성공 인지 1초 이내)
## 3. 레벨업 카드 픽 UI (분기 포인트 1) ## 3. 레벨업 카드 픽 UI (분기 포인트 1, BT7-Plan 재설계)
**트리거**: 경험치 만렙 → `Time.timeScale = 0` 일시정지 → 카드 픽 화면 진입 **트리거**: 경험치 만렙 → `Time.timeScale = 0` 일시정지 → 카드 픽 화면 진입
@ -61,18 +86,62 @@ HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전
│ │ │ │
│ 레벨 업! Lv.N → Lv.N+1 │ │ 레벨 업! Lv.N → Lv.N+1 │
│ │ │ │
│ [카드 A] [카드 B] [카드 C] │ ← 3장 선택 │ ┌──────┐ ┌──────┐ ┌──────┐ │
│ 설명 설명 설명 │ │ │[액티브]│ │[패시브]│ │[액티브]│ │ ← 분류 아이콘 상단 표시
│ │ │ │ 카드A │ │ 카드B │ │ 카드C │ │
│ │ Lv.1 │ │ Lv.2 │ │ 신규 │ │ ← 업그레이드 vs 신규 명시
│ │설명 │ │설명 │ │설명 │ │
│ └──────┘ └──────┘ └──────┘ │
└──────────────────────────────┘ └──────────────────────────────┘
``` ```
- **Canvas**: CardPickCanvas.prefab (Additive), timeScale 0에서도 정상 동작 (Unscaled Time 사용) - **Canvas**: CardPickCanvas.prefab (Additive), timeScale 0에서도 정상 동작 (Unscaled Time 사용)
- **분류 구분 표시 (신규)**: 각 카드 상단에 **액티브·패시브 아이콘** 명시 (색상·기호). 플레이어가 "어떤 슬롯으로 들어갈 카드인가" 즉시 인지
- **업그레이드 vs 신규 구분**: 이미 장착한 카드는 "Lv.N → Lv.N+1" 표기, 미장착은 "신규" 표기
- **각성 조건 힌트 (신규)**: 액티브 카드가 Lv.4 도달 시 "다음 픽으로 Lv.5 → 각성 조건 근접" 힌트 표시 (선택적)
- **결정 압박 없음**: 시간 제한 없이 선택 가능 (캐주얼 포지션) - **결정 압박 없음**: 시간 제한 없이 선택 가능 (캐주얼 포지션)
- **선택 피드백**: 카드 선택 시 하이라이트 + 확인 버튼 노출 → 실수 방지 2단계 - **선택 피드백**: 카드 선택 시 하이라이트 + 확인 버튼 노출 → 실수 방지 2단계
- **선택 완료**: `Time.timeScale = 1` 복귀 + 카드 획득 시각 피드백 - **선택 완료**: `Time.timeScale = 1` 복귀 + 카드 획득 시각 피드백
## 4. 마을 UI (허브 화면) ## 3-A. 각성 발동 피드백 UI (신규, BT7-Plan 확정 방향 5·10)
**트리거**: 보물상자 획득 → 각성 발동 조건 충족 판정 → 조건 충족 시 연출 진입
```
보물상자 획득 연출 (1.5s)
조건 충족 판정
↓ (충족)
┌──────────────────────────────┐
│ │
│ ★ 각성! ★ │
│ │
│ A05 학익진 → AW05 학익천진 │
│ │
│ [풀스크린 이펙트] │
│ │
└──────────────────────────────┘
↓ (3s)
액티브 슬롯 아이콘 각성 형태로 변환
전투 재개
```
- **풀스크린 효과**: 황금색 섬광 + 각성 이름 대형 표기 + 원 액티브 → 각성 변환 애니메이션
- **지속시간**: 3초 (캐주얼 페이싱 유지, 너무 길지 않게)
- **Unscaled Time 사용**: `Time.timeScale = 0` 일시정지 상태에서 연출 진행
- **복수 조건 충족 시 선택 UI**: `system/01_카드_시스템.md` v0.2 §7 엣지 케이스 3 반영. 2개 이상 각성 조건 동시 충족 시:
```
┌────────────────────────┐
│ 각성 조건 복수 충족! │
│ 발동할 각성을 선택하세요│
│ │
│ [AW05] [AW12] │
│ │
└────────────────────────┘
```
## 4. 마을 UI (허브 화면) — BT7-Plan 유지
진입점: 게임 시작 / 사망 복귀 / 보스 처치 후 귀환 진입점: 게임 시작 / 사망 복귀 / 보스 처치 후 귀환
@ -81,19 +150,20 @@ HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전
| **스테이지 선택** | 다음 도전 스테이지 결정 | 스테이지 번호·난이도 표시 | | **스테이지 선택** | 다음 도전 스테이지 결정 | 스테이지 번호·난이도 표시 |
| **특성 목록** | 현재 보유 특성 확인 | 유지 자산 확인 (사망 후 안도감) | | **특성 목록** | 현재 보유 특성 확인 | 유지 자산 확인 (사망 후 안도감) |
| **아이템 슬롯** | 장착 아이템 현황 | 파츠별 1개 제한 가시화 | | **아이템 슬롯** | 장착 아이템 현황 | 파츠별 1개 제한 가시화 |
| **출발 버튼** | 스테이지 진입 | 단일 CTA (Call-To-Action) | | **기본 무기 정보 (신규)** | 퇴마사 고유 기본 무기 스펙 | 시작 무기 정보 |
| **출발 버튼** | 스테이지 진입 | 단일 CTA |
- NPC 대화·상점은 Phase 3-C 이후 확장 (파일럿 제외) - NPC 대화·상점은 Phase 3-C 이후 확장 (파일럿 제외)
- 화면 전환: 버튼 탭 → 씬 전환. 씬 전환 UX (페이드·연출)는 Phase 3-B 후속 과제 - 화면 전환: 버튼 탭 → 씬 전환. 씬 전환 UX(페이드·연출)는 Phase 3-B 후속
## 5. 사망·복귀 전환 UI ## 5. 사망·복귀 전환 UI (BT7-Plan 업데이트)
**목표**: 사망 낙차 감정을 1~2초 이내로 처리하여 "다시 하고 싶다" 루프 유지 (02_코어_루프 §6 계승) **목표**: 사망 낙차 감정을 1~2초 이내로 처리하여 "다시 하고 싶다" 루프 유지
1. **사망 연출**: 1~2초 (캐릭터 소멸 애니메이션) 1. **사망 연출**: 1~2초 (**하트 소멸 애니메이션** + 캐릭터 소멸 애니메이션) — BT7-Plan 하트 UI 반영
2. **결과 표시**: "런 종료 / 레벨 N 도달 / 획득 경험 N" 1화면. 심플하게 2. **결과 표시**: "런 종료 / 레벨 N 도달 / 최대 하트 N / 획득 경험 N / 발동 각성 N" 1화면
3. **마을 복귀**: 로딩 느낌 없이 Additive Load 씬 전환 (VillageScene 상시 유지 방식) 3. **마을 복귀**: 로딩 느낌 없이 Additive Load 씬 전환
4. **유지 자산 확인**: 마을 복귀 직후 아이템·특성 유지 표시 → 낙차 후 안도 제공 4. **유지 자산 확인**: 마을 복귀 직후 아이템·특성 유지 표시 → 낙차 후 안도 제공 (최대 하트 수는 기본 1개로 초기화 표시)
**인지 목표**: 사망부터 다음 스테이지 선택까지 5초 이내 (페이싱 유지). **인지 목표**: 사망부터 다음 스테이지 선택까지 5초 이내 (페이싱 유지).
@ -102,26 +172,34 @@ HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전
| BT.Framework | HUD 활용 용도 | 구현 시점 | | BT.Framework | HUD 활용 용도 | 구현 시점 |
|---|---|---| |---|---|---|
| **Log** | HUD 갱신 이벤트 디버그 | Tier 1 P0 즉시 | | **Log** | HUD 갱신 이벤트 디버그 | Tier 1 P0 즉시 |
| **FormatEx** | "Lv.N" · 경험치 수치 포맷 | Tier 1 P1 | | **FormatEx** | "Lv.N" · 경험치 수치 포맷 · "Lv.5 / 5" 스택 표기 | Tier 1 P1 |
| **EnumEx** | 카드 슬롯 타입 enum 순회 | Tier 1 P2 | | **EnumEx** | 카드 슬롯 타입 enum(액티브/패시브/각성) 순회 | Tier 1 P2 |
| **SafeAreaBorder** | HUD 요소 Safe Area 자동 패딩 | Tier 2 신규 구현 후 | | **SafeAreaBorder** | HUD 요소 Safe Area 자동 패딩 | Tier 2 신규 구현 후 |
## 7. 접근성 기본 원칙 ## 7. 접근성 기본 원칙
- **색맹 대응**: 라이프·보스 HP는 색상 외 형태(아이콘·바 형태)로 이중 표현 - **색맹 대응**: 하트·보스 HP·슬롯 분류 구분은 색상 외 형태(아이콘·위치·기호)로 이중 표현
- **텍스트 크기**: 최소 14sp (모바일 기준), 중요 수치는 18sp 이상 - **텍스트 크기**: 최소 14sp (모바일 기준), 중요 수치는 18sp 이상
- **버튼 터치 영역**: 최소 44×44dp (Apple HIG / Google Material 공통 기준) - **버튼 터치 영역**: 최소 44×44dp (Apple HIG / Google Material 공통 기준)
- **각성 발동 연출**: 플래시 민감도 대응 옵션 제공 (풀스크린 효과 강도 조절)
## 8. 기각안 ## 8. 기각안
1. **"미니맵 HUD 포함" — 기각.** 2D 횡스크롤 플랫포머에서 미니맵 정보 밀도가 손맛·집중을 저해. 스테이지 구조는 선형 진행 설계로 방향 혼란 없음. 추가 필요 시 Phase 3-C 재검토. 1. **"미니맵 HUD 포함" — 기각 (현행 유지).** 2D 횡스크롤 플랫포머에서 미니맵 정보 밀도가 손맛·집중을 저해. 선형 진행 설계로 방향 혼란 없음.
2. **"카드 슬롯 상시 크게 표시" — 기각.** 카드 슬롯은 빌드 확인 보조 정보. 전투 중 시선 분산 유발. 반투명 소형으로 유지하되 일시정지 시 풀 표시. 2. **"카드 슬롯 상시 크게 표시" — 기각 (현행 유지).** 슬롯은 빌드 확인 보조 정보. 반투명 소형으로 유지하되 일시정지 시 풀 표시.
3. **"시간 제한 카드 픽" — 기각.** 캐주얼 포지션. 시간 제한은 긴장을 주지만 카드 텍스트 읽기 방해 → 빌드 이해도 하락 → 재미 축 1 "육성 카타르시스" 저해. 3. **"시간 제한 카드 픽" — 기각 (현행 유지).** 캐주얼 포지션. 시간 제한은 카드 텍스트 읽기 방해.
4. **"하트 UI 대신 HP 수치만 표기" — 기각 (BT7-Plan 신규).** 하트 분할 시각화의 재미 핵심은 "수치가 아닌 형태 인지"(젤다 BotW 고전 강점). 수치 표기는 부가 정보로만 허용 (디버그용 옵션).
5. **"액티브·패시브 슬롯 통합 표시" — 기각 (BT7-Plan 신규).** PD 확정 방향 3에서 3분류 구조 명시. 통합 표시는 "어떤 카드가 자동 발동되는가" 정보 혼선 유발.
6. **"각성 발동 연출 생략 (즉시 변환)" — 기각 (BT7-Plan 신규).** 각성은 클라이맥스 순간의 카타르시스. 연출 생략은 재미 축 1 "육성 폭발" 감정 파괴. 3초 연출 유지 필수.
## 9. 개발팀 이관 항목 ## 9. 개발팀 이관 항목
- CardPickCanvas.prefab + Unscaled Time 애니메이션 구현 - CardPickCanvas.prefab + Unscaled Time 애니메이션 구현 (**액티브/패시브 분류 구분 표시 반영**)
- **AwakeningCanvas.prefab 신규 구현** — 각성 발동 풀스크린 연출 + 복수 조건 선택 UI
- SafeAreaBorder 신규 구현 후 HUD Canvas에 적용 - SafeAreaBorder 신규 구현 후 HUD Canvas에 적용
- **하트 UI 분할 스프라이트 5단계** (풀·3/4·반·1/4·빈) 렌더링 시스템
- **하트 아이콘 동적 생성 로직** (최대 하트 수 증가 시 우측 추가)
- **각성 대기 표시 황금 테두리 + ★ 아이콘** (액티브 슬롯 조건 충족 시)
- 사망 결과 화면 씬 플로우 (Additive Load VillageScene 유지) - 사망 결과 화면 씬 플로우 (Additive Load VillageScene 유지)
- FormatEx "Lv.N" · 경험치 바 UI 컴포넌트 구현 - FormatEx "Lv.N" · 경험치 바 UI 컴포넌트 구현
@ -130,3 +208,4 @@ HUD 원칙: **정보 과다 = 정보 없음**. 라이프 1 시스템(즉사 전
| 일시 | 변경 | 사유 | 기안 | | 일시 | 변경 | 사유 | 기안 |
|------|------|------|------| |------|------|------|------|
| 2026-04-23 | v0.1 Phase 3-B 초기 확정 | BT6-Plan PD 지시 | ux-designer | | 2026-04-23 | v0.1 Phase 3-B 초기 확정 | BT6-Plan PD 지시 | ux-designer |
| 2026-04-24 | v0.2 — BT7-Plan 개정 집행 — PD 지시 11건 반영 (하트 분할 UI 5단계·액티브/패시브 슬롯 분리·각성 발동 풀스크린 연출·각성 대기 표시·하트 수 증가 UI) | 기획팀장 |