game/prompt/27_predetermine_enemy_actio...

2.9 KiB

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.dartEnemyIntent)

  • EnemyIntent 클래스에 필드 추가:
    • final bool isSuccess; // 성공 여부
    • final int finalValue; // 최종 적용될 수치 (데미지 또는 방어도)

B. 로직 수정 (BattleProvider)

  1. _generateEnemyIntent 수정:
    • 행동 타입(Attack/Defend)과 Risk 결정 후, 즉시 확률(Random)을 굴림.
    • isSuccessfinalValue를 계산하여 EnemyIntent 생성.
    • 방어(Defend)의 경우: isSuccesstrue라면 enemy.armorfinalValue즉시 더함.
      • 주의: 턴이 지날 때 방어도가 초기화되는 로직과 충돌하지 않도록 확인.
  2. _enemyTurn 수정:
    • 다시 확률을 굴리지 않고, currentEnemyIntent.isSuccess를 확인하여 행동 수행.
    • 방어의 경우 이미 적용되었으므로, 로그만 출력하거나 추가 이펙트만 재생 (중복 적용 방지).

C. 검증 (Verification)

  • 테스트 코드를 통해 적이 방어 의도를 가졌을 때 enemy.armor가 즉시 증가하는지 확인.
  • 플레이어가 공격했을 때 방어도가 적용되어 데미지가 감소하는지 확인.