game/prompt/22_refactor_enemy_system.md

65 lines
3.1 KiB
Markdown

# 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)을 정의합니다.
```dart
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 업데이트
1. **상태(State)**: `BattleProvider``EnemyIntent? currentEnemyIntent`를 추가합니다.
2. **생성(Generation)**: `_generateEnemyIntent()` 메서드를 생성합니다:
- **방어 불가 조건**: 적의 `baseDefense`가 0이면 방어 행동을 선택하지 않습니다.
- **리스크 레벨(Risk Level)**: 적도 플레이어처럼 Safe/Normal/Risky 중 하나를 무작위로 선택합니다.
- **수치 계산**: 선택된 리스크 레벨의 효율(Efficiency)을 적용하여 데미지/방어량을 계산합니다.
3. **흐름(Flow)**:
- **스폰 시**: 초기 의도를 생성합니다.
- **적 턴 종료 후**: 다음 턴을 위한 새로운 의도를 생성합니다.
4. **실행(Execution)**:
- 저장된 `currentEnemyIntent`의 리스크 레벨에 따른 성공 확률을 체크합니다.
- 성공 시 의도된 행동을 수행하고, 실패 시 빗나감(Miss) 처리합니다.
#### C. UI 업데이트 (BattleScreen)
1. **의도 표시**:
- `BattleScreen`에서 적의 체력 바 또는 이름 아래에 현재 의도를 보여주는 위젯을 추가합니다.
- `description`을 표시합니다 (예: "5의 피해로 공격").
- 아이콘(공격은 칼, 방어는 방패)을 추가하여 시각적으로 표현합니다.
2. **가시성**:
- 플레이어의 턴이고 적이 살아있을 때만 의도를 표시합니다.
## 검증
- JSON에서 적이 정상적으로 스폰되는지 확인합니다.
- 전투 시작 시 적이 의도를 생성하는지 확인합니다.
- 적이 의도대로 행동을 수행하는지 확인합니다.
- 행동 후 적이 새로운 의도를 생성하는지 확인합니다.