game/prompt/27_predetermine_enemy_actio...

46 lines
2.9 KiB
Markdown

# 27. 적 행동 결과 선결정 (Pre-determine Enemy Action)
## 1. 배경 (Background)
현재 적의 행동(Intent)은 턴 시작 시 결정되지만, 그 행동의 **성공 여부(Risk에 따른 확률)**는 적의 턴이 실제로 실행될 때(`_enemyTurn`) 결정되거나, 방어의 경우 `_generateEnemyIntent`에서 즉시 적용되도록 수정되었으나 문제가 보고되었습니다.
사용자는 "내 턴이 시작됐을 때 적의 행동(확률적인 부분 포함)이 모두 결정되기를" 원합니다. 특히 적이 방어를 선택했을 때, 플레이어의 공격 턴에 방어도가 적용되어 있어야 합니다.
## 2. 문제 분석 (Problem Analysis)
- **현상:** 플레이어 공격력 8, 적이 방어 행동을 취했음에도 데미지가 차감되지 않음.
- **원인 추정:**
1. `_generateEnemyIntent`에서 방어도를 올리는 로직이 제대로 동작하지 않았거나,
2. `enemy.armor`가 턴 시작 시점이나 다른 곳에서 초기화되고 있을 가능성.
3. 또는 UI상으로는 방어한다고 나오지만 실제 내부 로직에서는 아직 적용되지 않은 상태(기존 로직 잔재).
## 3. 목표 (Objective)
- **결과 선결정 (Pre-determination):** `_generateEnemyIntent` 시점에 적의 행동 성공 여부(`isSuccess`)와 최종 수치(`finalValue`)를 미리 계산하여 `EnemyIntent`에 저장.
- **즉시 적용 (Immediate Application):**
- **방어(Defend):** 성공 시, **즉시** `enemy.armor`를 증가시켜 플레이어 턴 동안 유지되게 함.
- **공격(Attack):** 성공 여부와 데미지를 미리 결정해두고, `_enemyTurn`에서는 그 결과만 실행.
## 4. 작업 상세 (Implementation Details)
### A. 모델 수정 (`lib/providers/battle_provider.dart` 내 `EnemyIntent`)
- `EnemyIntent` 클래스에 필드 추가:
- `final bool isSuccess;` // 성공 여부
- `final int finalValue;` // 최종 적용될 수치 (데미지 또는 방어도)
### B. 로직 수정 (`BattleProvider`)
1. **`_generateEnemyIntent` 수정:**
- 행동 타입(Attack/Defend)과 Risk 결정 후, **즉시 확률(Random)을 굴림**.
- `isSuccess``finalValue`를 계산하여 `EnemyIntent` 생성.
- **방어(Defend)의 경우:** `isSuccess``true`라면 `enemy.armor``finalValue`**즉시 더함**.
- _주의:_ 턴이 지날 때 방어도가 초기화되는 로직과 충돌하지 않도록 확인.
2. **`_enemyTurn` 수정:**
- 다시 확률을 굴리지 않고, `currentEnemyIntent.isSuccess`를 확인하여 행동 수행.
- 방어의 경우 이미 적용되었으므로, 로그만 출력하거나 추가 이펙트만 재생 (중복 적용 방지).
### C. 검증 (Verification)
- 테스트 코드를 통해 적이 방어 의도를 가졌을 때 `enemy.armor`가 즉시 증가하는지 확인.
- 플레이어가 공격했을 때 방어도가 적용되어 데미지가 감소하는지 확인.