feat: 드로그 집행 개시 패턴 및 낙인 디버프 추가

- 드로그 시그니처 패턴 역할과 집행 개시 패턴 데이터를 추가하고 BT 브랜치에 연결
- 시그니처 차단 성공과 실패 흐름을 BossCombatBehaviorContext에 구현하고 authoring 그래프를 재구성
- 집행자의 낙인 이상상태를 추가하고 받는 피해 배율 증가가 플레이어 대미지 계산에 반영되도록 정리
- 집행 실패 시 광역 피해, 넉백, 다운, 낙인 부여 설정을 드로그 프리팹에 연결
- 성공 경로 검증 중 확인된 보스 Hit 트리거 오류를 방어 로직으로 수정
- Unity 플레이 검증으로 집행 개시 실패와 성공 분기를 모두 확인하고 설계값은 원복
This commit is contained in:
2026-03-23 18:14:18 +09:00
parent 8182258102
commit 0889bb0f25
19 changed files with 1635 additions and 747 deletions

View File

@@ -84,6 +84,11 @@ namespace Colosseum.Abnormalities
[Range(0f, 1f)]
public float slowMultiplier = 0.5f;
[Header("피해 배율")]
[Tooltip("이상 상태가 적용된 동안 받는 피해 배율 (1 = 기본, 1.1 = 10% 증가)")]
[Min(0f)]
public float incomingDamageMultiplier = 1f;
/// <summary>
/// 영구 효과인지 확인
/// </summary>
@@ -98,5 +103,10 @@ namespace Colosseum.Abnormalities
/// 제어 효과가 있는지 확인
/// </summary>
public bool HasControlEffect => controlType != ControlType.None;
/// <summary>
/// 받는 피해 배율 변경 여부
/// </summary>
public bool HasIncomingDamageModifier => !Mathf.Approximately(incomingDamageMultiplier, 1f);
}
}

View File

@@ -32,6 +32,7 @@ namespace Colosseum.Abnormalities
private int silenceCount;
private int invincibleCount;
private float slowMultiplier = 1f;
private float incomingDamageMultiplier = 1f;
// 클라이언트 판정용 제어 효과 동기화 변수
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
@@ -62,6 +63,11 @@ namespace Colosseum.Abnormalities
/// </summary>
public float MoveSpeedMultiplier => GetCurrentSlowMultiplier();
/// <summary>
/// 받는 피해 배율 (1.0 = 기본, 1.1 = 10% 증가)
/// </summary>
public float IncomingDamageMultiplier => incomingDamageMultiplier;
/// <summary>
/// 행동 가능 여부 (기절이 아닐 때)
/// </summary>
@@ -238,6 +244,7 @@ namespace Colosseum.Abnormalities
ApplyStatModifiers(newAbnormality);
ApplyControlEffect(data);
RecalculateIncomingDamageMultiplier();
SyncAbnormalityAdd(newAbnormality, source);
OnAbnormalityAdded?.Invoke(newAbnormality);
@@ -282,6 +289,7 @@ namespace Colosseum.Abnormalities
{
RemoveStatModifiers(abnormality);
RemoveControlEffect(abnormality.Data);
RecalculateIncomingDamageMultiplier();
SyncAbnormalityRemove(abnormality);
activeAbnormalities.Remove(abnormality);
@@ -488,6 +496,20 @@ namespace Colosseum.Abnormalities
}
}
private void RecalculateIncomingDamageMultiplier()
{
incomingDamageMultiplier = 1f;
for (int i = 0; i < activeAbnormalities.Count; i++)
{
AbnormalityData data = activeAbnormalities[i].Data;
if (data == null || !data.HasIncomingDamageModifier)
continue;
incomingDamageMultiplier *= Mathf.Max(0f, data.incomingDamageMultiplier);
}
}
private int GetCurrentStunCount() => IsServer ? stunCount : syncedStunCount.Value;
private int GetCurrentSilenceCount() => IsServer ? silenceCount : syncedSilenceCount.Value;