# 69. Sync Damage to Animation Impact (UI-Driven) ## 1. 목표 (Goal) - 플레이어와 적 모두의 공격 시 데미지 텍스트 출력이 애니메이션 타격(Impact) 순간과 완벽하게 동기화되도록 수정합니다. ## 2. 문제점 (Problem) - 기존에는 `BattleProvider`가 `Future.delayed`로 애니메이션 시간을 예측했으나, 이는 UI의 실제 Impact 시점과 미묘하게 어긋나 데미지 텍스트가 먼저 뜨는 현상이 발생했습니다. ## 3. 해결 방안 (Solution) - **UI (BattleScreen)가 애니메이션 Impact 시점을 `BattleProvider`에게 직접 알려주어 데미지 처리를 트리거**하는 "UI 주도 Impact 처리" 방식으로 전환합니다. ## 4. 구현 계획 (Implementation Plan) ### A. `EffectEvent` 데이터 확장 (`lib/game/model/effect_event.dart`) - `EffectEvent`에 `attacker`, `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().handleAttackImpact(...)`를 호출합니다. - `EffectEvent`에 담긴 정보를 기반으로 `handleAttackImpact`에 인자를 전달합니다. ## 5. 기대 효과 (Expected Outcome) - 애니메이션과 데미지 텍스트 출력이 완벽하게 동기화되어, 게임의 타격감이 대폭 향상됩니다. - 로직과 UI 간의 역할 분리가 명확해집니다.