game/prompt/69_sync_damage_on_impact.md

2.3 KiB

69. Sync Damage to Animation Impact (UI-Driven)

1. 목표 (Goal)

  • 플레이어와 적 모두의 공격 시 데미지 텍스트 출력이 애니메이션 타격(Impact) 순간과 완벽하게 동기화되도록 수정합니다.

2. 문제점 (Problem)

  • 기존에는 BattleProviderFuture.delayed로 애니메이션 시간을 예측했으나, 이는 UI의 실제 Impact 시점과 미묘하게 어긋나 데미지 텍스트가 먼저 뜨는 현상이 발생했습니다.

3. 해결 방안 (Solution)

  • UI (BattleScreen)가 애니메이션 Impact 시점을 BattleProvider에게 직접 알려주어 데미지 처리를 트리거하는 "UI 주도 Impact 처리" 방식으로 전환합니다.

4. 구현 계획 (Implementation Plan)

A. EffectEvent 데이터 확장 (lib/game/model/effect_event.dart)

  • EffectEventattacker, target (Character 객체), damage, risk, isSuccess 등 Impact 시점에 필요한 모든 정보를 담습니다.

B. BattleProvider 수정 (lib/providers/battle_provider.dart)

  1. Future.delayed 제거: playerAction_enemyTurn의 공격 로직에서 await Future.delayed(...)를 제거합니다.
  2. 데미지 처리 로직 추출: 공격 Impact 시점에 발생해야 할 모든 로직(HP 감소, DamageEvent 전송, 로그 기록, 상태이상 적용)을 _processAttackImpact라는 private 또는 public 메서드로 추출합니다.
  3. 새로운 public 메서드 추가: BattleProvider.handleAttackImpact(String eventId, Character attacker, Character target, int damage, RiskLevel risk, bool isSuccess)와 같은 메서드를 만들어, BattleScreen에서 Impact 시점에 호출하도록 합니다.

C. BattleScreen 수정 (lib/screens/battle_screen.dart)

  1. _addFloatingEffect 메서드 내에서 animateAttack를 호출할 때:
    • onImpact 콜백 내에서 context.read<BattleProvider>().handleAttackImpact(...)를 호출합니다.
    • EffectEvent에 담긴 정보를 기반으로 handleAttackImpact에 인자를 전달합니다.

5. 기대 효과 (Expected Outcome)

  • 애니메이션과 데미지 텍스트 출력이 완벽하게 동기화되어, 게임의 타격감이 대폭 향상됩니다.
  • 로직과 UI 간의 역할 분리가 명확해집니다.