3.1 KiB
3.1 KiB
22. 적 시스템 리팩토링 및 AI 의도(Intent) 구현
목표
적 시스템을 데이터 주도(Data-Driven) 방식으로 리팩토링하고, 적이 자신의 행동(공격, 방어)을 미리 계획하여 플레이어에게 보여주는 "의도(Intent) 시스템"을 구현합니다.
1. 데이터 주도 적 시스템 (완료)
- JSON 데이터:
assets/data/enemies.json파일을 생성하여normal(일반) 및elite(정예) 적 목록을 정의했습니다. - 데이터 로더: JSON 데이터를 로드하고 파싱하기 위해
lib/game/data/enemy_table.dart를 생성했습니다. - 스폰(Spawn): 로드된 데이터에서 무작위로 적을 생성하도록
BattleProvider를 업데이트했습니다.
2. 적 AI 및 의도(Intent) 시스템 (구현 예정)
- 목표: 적은 플레이어와 유사한 행동(공격, 방어)을 무작위로 선택하여 수행해야 합니다.
- 가시성: 플레이어는 자신의 턴 동안 적이 다음 턴에 무엇을 할지 볼 수 있어야 합니다.
구현 상세
A. 적 의도(Intent) 구조
적의 행동을 나타내는 EnemyIntent 클래스와 열거형(Enum)을 정의합니다.
enum EnemyActionType { attack, defend }
class EnemyIntent {
final EnemyActionType type;
final int value; // 데미지 양 또는 방어구 양
final String description; // UI 표시용 설명
EnemyIntent({required this.type, required this.value, required this.description});
}
B. BattleProvider 업데이트
- 상태(State):
BattleProvider에EnemyIntent? currentEnemyIntent를 추가합니다. - 생성(Generation):
_generateEnemyIntent()메서드를 생성합니다:- 방어 불가 조건: 적의
baseDefense가 0이면 방어 행동을 선택하지 않습니다. - 리스크 레벨(Risk Level): 적도 플레이어처럼 Safe/Normal/Risky 중 하나를 무작위로 선택합니다.
- 수치 계산: 선택된 리스크 레벨의 효율(Efficiency)을 적용하여 데미지/방어량을 계산합니다.
- 방어 불가 조건: 적의
- 흐름(Flow):
- 스폰 시: 초기 의도를 생성합니다.
- 적 턴 종료 후: 다음 턴을 위한 새로운 의도를 생성합니다.
- 실행(Execution):
- 저장된
currentEnemyIntent의 리스크 레벨에 따른 성공 확률을 체크합니다. - 성공 시 의도된 행동을 수행하고, 실패 시 빗나감(Miss) 처리합니다.
- 저장된
C. UI 업데이트 (BattleScreen)
- 의도 표시:
BattleScreen에서 적의 체력 바 또는 이름 아래에 현재 의도를 보여주는 위젯을 추가합니다.description을 표시합니다 (예: "5의 피해로 공격").- 아이콘(공격은 칼, 방어는 방패)을 추가하여 시각적으로 표현합니다.
- 가시성:
- 플레이어의 턴이고 적이 살아있을 때만 의도를 표시합니다.
검증
- JSON에서 적이 정상적으로 스폰되는지 확인합니다.
- 전투 시작 시 적이 의도를 생성하는지 확인합니다.
- 적이 의도대로 행동을 수행하는지 확인합니다.
- 행동 후 적이 새로운 의도를 생성하는지 확인합니다.