Fix: Delay Enemy Intent generation to allow attack animation to finish
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
# 68. Global Animation Delay Adjustment
|
||||
|
||||
## 1. 목표 (Goal)
|
||||
- 플레이어와 적 모두에게 적용되는 애니메이션 딜레이 설정(`GameConfig`)을 조정하여, 데미지 텍스트가 애니메이션 타격(Impact)보다 먼저 뜨는 현상을 근본적으로 해결합니다.
|
||||
|
||||
## 2. 원인 (Cause)
|
||||
- `GameConfig`의 대기 시간이 `BattleAnimationWidget`의 재생 시간과 **완벽하게 동일(ms 단위)**하게 설정되어 있습니다.
|
||||
- 코드 실행 컨텍스트 차이로 인해 `Timer`(로직 대기)가 `Animation`(UI 렌더링)보다 미세하게 먼저 완료될 수 있어, 텍스트가 먼저 뜨는 "경쟁 상태(Race Condition)"가 발생합니다.
|
||||
|
||||
## 3. 해결 방안 (Solution)
|
||||
- `GameConfig`의 `animDelay...` 값들을 기존 값에서 **+100ms** 증가시킵니다.
|
||||
- 이는 플레이어와 적 모두에게 동일하게 적용되므로 로직의 일관성을 해치지 않으면서, 시각적으로 "타격 후 텍스트"라는 자연스러운 순서를 보장합니다.
|
||||
|
||||
## 4. 변경 값
|
||||
- Safe: 500 -> 600
|
||||
- Normal: 400 -> 500
|
||||
- Risky: 1100 -> 1200
|
||||
|
||||
## 5. 기대 효과 (Expected Outcome)
|
||||
- 플레이어와 적 모두 공격 시 애니메이션이 목표에 도달한 직후 데미지 텍스트가 표시됨.
|
||||
@@ -0,0 +1,29 @@
|
||||
# 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<BattleProvider>().handleAttackImpact(...)`를 호출합니다.
|
||||
- `EffectEvent`에 담긴 정보를 기반으로 `handleAttackImpact`에 인자를 전달합니다.
|
||||
|
||||
## 5. 기대 효과 (Expected Outcome)
|
||||
- 애니메이션과 데미지 텍스트 출력이 완벽하게 동기화되어, 게임의 타격감이 대폭 향상됩니다.
|
||||
- 로직과 UI 간의 역할 분리가 명확해집니다.
|
||||
@@ -0,0 +1,16 @@
|
||||
# 70. Fix Player Action Crash and Double Damage
|
||||
|
||||
## 1. 문제 (Problem)
|
||||
- **Crash:** `BattleProvider.playerAction`에서 생성하는 `EffectEvent`에 `attacker`, `targetEntity`, `damageValue` 등이 누락되어 있어, UI가 `handleImpact`를 호출할 때 `event.attacker!` 등에서 Null Pointer Exception이 발생함.
|
||||
- **Double Damage:** `playerAction` 메서드 내부에 구버전의 데미지 적용 로직이 남아 있어, 이를 수정하지 않으면 데미지가 두 번 들어감.
|
||||
|
||||
## 2. 해결 방안 (Solution)
|
||||
- `playerAction` 메서드를 대대적으로 수정하여 `_enemyTurn`과 동일한 패턴을 적용합니다.
|
||||
- **즉시 데미지 적용 로직 삭제:** HP/Armor 감소 로직을 제거합니다.
|
||||
- **`EffectEvent` 완전체 생성:** `attacker`, `targetEntity`, `damageValue` 등을 모두 채워서 이벤트를 생성합니다.
|
||||
- **위임:** 모든 데미지 처리는 `EffectEvent`를 통해 `handleImpact` -> `_processAttackImpact`로 위임됩니다.
|
||||
|
||||
## 3. 기대 효과 (Expected Outcome)
|
||||
- 앱 크래시 해결.
|
||||
- 플레이어 공격 시 애니메이션과 데미지 적용 시점이 정확히 일치.
|
||||
- 데미지 중복 적용 방지.
|
||||
@@ -0,0 +1,12 @@
|
||||
# 71. Fix Null Pointer Exception on Failed Actions
|
||||
|
||||
## 1. 문제 (Problem)
|
||||
- `BattleProvider`에서 공격 실패(`Miss`) 또는 방어(`Defend`) 시 `_processAttackImpact`를 직접 호출하고 있음.
|
||||
- `_processAttackImpact`는 `damageValue!`와 같이 강제 언래핑을 수행하므로, 실패한 공격(`damageValue`가 null)일 경우 앱이 크래시됨(`Unexpected null value`).
|
||||
|
||||
## 2. 해결 방안 (Solution)
|
||||
- `playerAction` 및 `_enemyTurn` 메서드에서 `_processAttackImpact` 직접 호출을 모두 `handleImpact(event)` 호출로 변경합니다.
|
||||
- `handleImpact` 메서드 내부에 있는 `if (!event.isSuccess!) return;` 안전 장치를 활용하여 크래시를 방지합니다.
|
||||
|
||||
## 3. 기대 효과 (Expected Outcome)
|
||||
- 공격 실패 시에도 앱이 정상적으로 동작하며, 로그만 출력되고 데미지 로직은 스킵됨.
|
||||
@@ -0,0 +1,11 @@
|
||||
# 72. Delay Enemy Intent Generation
|
||||
|
||||
## 1. 문제 (Problem)
|
||||
- 적이 공격하는 도중에 `_generateEnemyIntent()`가 호출되어, 다음 턴 행동(예: 방어)이 미리 실행되고 이펙트가 겹쳐 보이는 현상 발생.
|
||||
|
||||
## 2. 해결 방안 (Solution)
|
||||
- `BattleProvider._enemyTurn` 메서드에서 `_generateEnemyIntent()` 호출 전에 **충분한 대기 시간(`GameConfig.animDelayEnemyTurn` 또는 공격 애니메이션 시간)**을 둡니다.
|
||||
- 이를 통해 적의 현재 행동 연출이 완전히 끝난 뒤에 다음 행동을 준비하도록 순서를 정리합니다.
|
||||
|
||||
## 3. 기대 효과 (Expected Outcome)
|
||||
- 적 공격 -> 복귀 -> (잠시 후) -> 다음 턴 방어 준비(이펙트) 순서로 자연스럽게 진행됨.
|
||||
Reference in New Issue
Block a user