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