flowchart LR
IN([막기 버튼 누름]) --> PREP
subgraph GUARD [막는 상태]
PREP[방패 올림<br/>전방 120도 방어]
ATK{피격}
STAM[스태미너 소모<br/>안정도로 경감]
end
PREP -->|버튼 유지| ATK
ATK -->|스태미너 여유| STAM --> PREP
ATK -->|스태미너 0| BREAK[가드 붕괴<br/>행동 불능 · 피해 ×1.5]
IN -->|버튼 뗌| IDLE([Idle])
BREAK --> RECOVER[회복 대기] --> IDLE
classDef guard fill:#dbeafe,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a
classDef bad fill:#fecaca,stroke:#dc2626,stroke-width:2.5px,color:#7f1d1d
classDef node fill:#f1f5f9,stroke:#64748b,stroke-width:2px,color:#0f172a
class PREP,ATK,STAM guard
class BREAK,RECOVER bad
class IN,IDLE node
| 단계 | 동작 |
|---|
| 막기 준비 | 막기 버튼 누름 → 방패 올림. 이 구간 피격 시 일반 피해. |
| 막는 상태 | 버튼을 누르고 있는 동안 유지. 전방 120도 각도 내 공격에 피해 감소. |
| 행동 불능 | 스태미너 0 도달 시 진입. 회복 전까지 다음 행동 불가. |
→ 방패 막기 (방어율 r): D × (1 − r) = D_after_block
→ 방어구 방어력 감산: D_after_block − defense = D_after_armor
물리 피해 → × (1 − physicsAbsorption)
속성 피해 → × (1 − elementAbsorption)
| 단계 | 출처 |
|---|
방어율 r | 방패 아이템 (ShieldStats.blockRate) |
| 방어력 (감산) | 방어구 아이템 (ArmorTableData.defense / 종류별 slashDefense/strikeDefense/pierceDefense) |
| 흡수율 (곱적용) | 방어구 아이템 (ArmorTableData.physicsAbsorption/elementAbsorption) |
코드(StabilityModel.ComputeStaminaDrain) 기준:
p(s) = min(P_max, s / (s + K))
S = max(S_min, S_base × (1 − p(s)))
| 항 | 의미 |
|---|
s | 방패의 안정도 스코어 |
p(s) | 안정도가 만드는 스태미너 경감률 |
P_max | 경감률 상한 (코드 기본값 0.70) |
K | 체감 절반점 (코드 기본값 40) |
S_base | 몬스터 공격의 기본 스태미너 데미지 |
S_min | 최소 소모량 (코드 기본값 5) |
- 막기 중 이동속도 −20% (절대 감산).
- 스태미너가 0 이하가 되면 가드가 풀리고 잠시 행동 불능.
- 행동 불능 동안 피해 ×1.5배.
- 행동 불능 동안 스태미너 회복 중지.
- 가드 붕괴 (가드 실패) 시:
D_fail = k_break × D 적용 후 즉시 HP 반영.