EerieVillage/Assets/Scripts/Skills/Runtime/PlayerStats.cs

65 lines
2.5 KiB
C#
Raw Normal View History

docs(BT12-Dev Phase 2-A): Skills 13 파일 신규 (인터페이스·SO·중앙 컴포넌트) C49 Phase 2 (집행) — Sonnet 위임 결과·Phase 1 dev-team-lead 재분석 보고서 정합. 신설 13 파일 (Assets/Scripts/Skills/): - Interfaces/ (4): ISkillRuntime, IActiveSkill, IPassiveSkill, IAwakeningSkill (+ ActiveTrigger·PassiveTriggerKind·AwakeningPattern enum) - Data/ (4): SkillDataAsset (abstract·AttributeTag·TypeTag), ActiveSkillData (Category 6종·14 신규 필드), PassiveSkillData (StatType·stub), AwakeningSkillData (stub) - Runtime/ (4): PlayerStats (POCO·AttributeTag Dictionary), ActiveSkillRuntime (Tick·Fire·EffectiveCooldown 하드캡 0.5s·StackLevelFactor), PlayerSkillInventory ([RequireComponent(Health)]·OnDamagedEvent 구독·NotifyEnemyKilled), SkillRuntimeFactory (Resolve·Create·stub 2종) - Events/ (1): SkillFireEvent (Simulation.Event<T>·Execute stub·카테고리 분기 6종 주석) 설계서 정합: - §2-1 인터페이스 계약 (ISkillRuntime → IActiveSkill·IPassiveSkill·IAwakeningSkill) - §2-2 ScriptableObject 계약 (ActiveCategory 6종·CreateAssetMenu 3종) - §2-3 PlayerStats POCO·AttributeTag 키 Dictionary - §3-2 CSV 매핑 테이블·§3-3 Resolve+Create 분기 - §4-2 EffectiveCooldown = BaseCooldown × CooldownMultiplier ÷ StackLevelFactor·하드캡 0.5s - §4-4 OnHit·OnKill 이벤트 핸들러 PlayerSkillInventory 구현 설계서 대비 조정 3건 (Sonnet 자체 정합): 1. IPassiveSkill.ApplyTo → ApplyModifier·RemoveModifier (설계서 §2-1 명세 정합) 2. AddSkillByCardId 반환 void → bool (실패 감지) 3. EnemyKillContext struct 신설 (Phase 2-D 정식 통합 전 decoupling) Phase 2-B 준비: - SkillFireEvent.Execute stub 영역 카테고리 분기 6종 주석 - Phase 2-B 투사체 진입 시 ProjectileSpawner·AttackHitbox 연결 지점 명확 기존 파일 영역 변경 X (BT12-MVP-A·BT5-Dev·BT7-Dev 미변경) 회귀 위험 = 매우 낮음 (신규 파일만) C50 분량 (PD 사전 승인 80~120K) — 실제 ~73K (정합) PD 결정 (b 5분할·b-1 카테고리 6분할·우선 투사체) 사전 승인 정합 pm-auditor 사전 감사 = Pass 4 + Minor 1 + Major 1 - Major 1 정정 영역 = git add 명시 path 한정 (Skills 디렉토리만·Screenshots·_Recovery 미포함) ✅ - Minor 1 후속 영역 = PD Editor Refresh 후 read_console 본 PM 직접 실측 untracked 영역 별도 안건: - Assets/Screenshots/ (manage_camera screenshot 영역·.gitignore 검토 영역) - Assets/_Recovery/ (Unity 자동 복구 파일·.gitignore 검토 영역)
2026-05-09 09:31:38 +00:00
using System.Collections.Generic;
namespace EerieVillage.Skills
{
/// <summary>
/// 통합 플레이어 스탯. 패시브 보정이 모두 이 객체에 누적.
/// ActiveSkillRuntime의 EffectiveCooldown·EffectiveDamage 산출 입력.
/// BT12-Dev v1 §2-3 정합.
/// </summary>
public class PlayerStats
{
/// <summary>전역 싱글톤 참조 (PlayerSkillInventory가 갱신). Phase 2-D 정식 통합 시 DI 전환 예정.</summary>
public static PlayerStats Current = new PlayerStats();
/// <summary>대미지 배율 — P01 봉황격·P02~P05 속성 강화</summary>
public float DamageMultiplier = 1.0f;
/// <summary>쿨다운 배율 — P06 연사술 (0.8 = 20% 단축). EffectiveCooldown = BaseCooldown * CooldownMultiplier</summary>
public float CooldownMultiplier = 1.0f;
/// <summary>광역 배율 — P07 광역확장</summary>
public float AreaMultiplier = 1.0f;
/// <summary>추가 투사체 수 — P08 투사체증폭</summary>
public int ExtraProjectiles = 0;
/// <summary>크리티컬 확률 — P09</summary>
public float CritChance = 0f;
/// <summary>크리티컬 대미지 배율 — P10</summary>
public float CritDamage = 1.5f;
/// <summary>추가 최대 하트 수 — P12·P13</summary>
public int ExtraMaxHearts = 0;
/// <summary>피해 감소율 — P14 부적방패</summary>
public float DamageReduction = 0f;
/// <summary>회피 확률 — P15 회피술</summary>
public float EvasionChance = 0f;
/// <summary>i-frame 연장 시간 (초) — P15</summary>
public float IFrameExtend = 0f;
/// <summary>이동속도 배율 — P18 질풍보</summary>
public float MoveSpeedMultiplier = 1.0f;
/// <summary>경험치 배율 — P19 선견지명</summary>
public float XPMultiplier = 1.0f;
/// <summary>보물 발견 보너스 — P20 재물복</summary>
public float TreasureFindBonus = 0f;
/// <summary>속성별 대미지 배율 (AttributeTag → float)</summary>
public Dictionary<AttributeTag, float> AttributeMultiplier = new Dictionary<AttributeTag, float>
{
{ AttributeTag.Physical, 1.0f },
{ AttributeTag.Fire, 1.0f },
{ AttributeTag.Frost, 1.0f },
{ AttributeTag.Lightning, 1.0f },
{ AttributeTag.Dark, 1.0f }
};
}
}