kards-env/docs/ENGINE_API_REFERENCE.md

369 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# KARDS 战斗引擎API接口文档
## 1. 核心引擎类 - BattleEngine
### 1.1 初始化
```python
class BattleEngine:
def __init__(self, player1_name: str, player2_name: str, debug_mode: bool = False)
```
**参数**:
- `player1_name`: 玩家1名称
- `player2_name`: 玩家2名称
- `debug_mode`: 调试模式开关
**返回**: BattleEngine实例
---
## 2. 单位部署接口
### 2.1 部署单位到支援线
```python
def deploy_unit_to_support(self, unit: Unit, player_id: int, position: Optional[int] = None) -> Dict[str, Any]
```
**参数**:
- `unit`: 要部署的单位对象
- `player_id`: 玩家ID (0或1)
- `position`: 可选的部署位置None则自动添加到末尾
**返回**:
```python
{
"success": bool,
"action": "deploy_to_support",
"unit_id": UUID,
"player": int,
"position": int,
"reason": str # 失败时提供原因
}
```
**规则验证**:
- 检查玩家ID有效性
- 检查支援线是否已满
- 自动设置单位所有者
- 单位默认`deployed_this_turn = True`
---
## 3. 单位操作接口
### 3.1 移动单位
```python
def move_unit(self, unit_id: UUID, target_position: tuple, player_id: int) -> Dict[str, Any]
```
**参数**:
- `unit_id`: 单位的唯一标识符
- `target_position`: 目标位置 (line_type, index)
- `player_id`: 执行操作的玩家ID
**返回**:
```python
{
"success": bool,
"action": "move",
"unit_id": UUID,
"from": tuple,
"to": tuple,
"reason": str # 失败时提供原因
}
```
**限制检查**:
- 回合验证: `player_id == active_player`
- 所有权验证: `unit.owner == player_names[player_id]`
- 移动能力: `unit.can_move()`
- 费用检查: `spend_kredits(player_id, unit.stats.operation_cost)`
- 成功后: `unit.perform_move()`
### 3.2 攻击目标
```python
def attack_target(self, attacker_id: UUID, target_id: Union[UUID, str], player_id: int) -> Dict[str, Any]
```
**参数**:
- `attacker_id`: 攻击者单位ID
- `target_id`: 目标单位ID或HQ标识符
- `player_id`: 执行操作的玩家ID
**返回**:
```python
{
"success": bool,
"action": "attack",
"attacker_id": UUID,
"target_id": Union[UUID, str],
"combat_resolved": bool,
"damage_dealt": int,
"counter_damage": int,
"target_destroyed": bool,
"attacker_destroyed": bool,
"reason": str # 失败时提供原因
}
```
**限制检查**:
- 回合验证和所有权验证同移动
- 攻击能力: `unit.can_attack()`
- 费用检查: `spend_kredits(player_id, unit.stats.operation_cost)`
- 攻击规则: `UnitCombatRules.can_attack_target()`
- 成功后: `unit.perform_attack()`
---
## 4. 回合管理接口
### 4.1 结束回合
```python
def end_turn(self) -> Dict[str, Any]
```
**返回**:
```python
{
"success": bool,
"action": "end_turn",
"previous_player": int,
"new_active_player": int,
"new_turn": int,
"new_phase": int
}
```
**执行流程**:
1. 切换`active_player`: `(self.active_player + 1) % 2`
2. 更新`turn_phase`: `(self.turn_phase + 1) % 2`
3. 如果`turn_phase == 0`: `current_turn += 1`
4. 调用`_start_player_turn()`更新资源
5. 重置所有单位状态: `unit.start_new_turn()`
---
## 5. 资源管理接口
### 5.1 获取Kredits
```python
def get_kredits(self, player_id: int) -> int
def get_kredits_slot(self, player_id: int) -> int
```
### 5.2 消耗Kredits
```python
def spend_kredits(self, player_id: int, amount: int) -> bool
```
**规则**:
- 检查`current_kredits >= amount`
- 成功则减少相应数量
- 失败则不消耗返回False
### 5.3 Kredits系统规则
- **Kredits Slot**: 每回合自然增长+1上限12
- **Kredits**: 每回合重置为当前Slot数
- **激活费用**: 移动和攻击消耗`unit.stats.operation_cost`
---
## 6. 游戏状态接口
### 6.1 获取完整游戏状态
```python
def get_game_state(self) -> Dict[str, Any]
```
**返回**:
```python
{
"turn": int,
"turn_phase": int,
"active_player": int,
"kredits": {
"player1": int,
"player2": int,
"active_player": int
},
"kredits_slots": {
"player1": int,
"player2": int,
"active_player": int
},
"battlefield": str,
"player1_hq": int,
"player2_hq": int,
"front_line_controller": str,
"units_count": {
"player1_total": int,
"player2_total": int,
"front_line": int
},
"debug_mode": bool
}
```
---
## 7. 调试接口
### 7.1 设置单位属性
```python
def debug_set_unit_stats(self, unit_id: UUID, attack: Optional[int] = None,
defense: Optional[int] = None, current_defense: Optional[int] = None) -> Dict[str, Any]
```
### 7.2 设置Kredits
```python
def debug_set_kredits(self, player_id: int, kredits: Optional[int] = None,
slot: Optional[int] = None) -> Dict[str, Any]
```
### 7.3 设置HQ防御
```python
def debug_set_hq_defense(self, player_id: int, defense: int) -> Dict[str, Any]
```
**注意**: 调试接口不执行规则验证,仅用于测试环境
---
## 8. 战斗规则接口 - UnitCombatRules
### 8.1 攻击目标验证
```python
@staticmethod
def can_attack_target(attacker: Unit, target: Union[Unit, HQ], battlefield: Battlefield) -> bool
```
### 8.2 反击检查
```python
@staticmethod
def can_counter_attack(defender: Unit, attacker: Unit) -> bool
```
### 8.3 守护保护检查
```python
@staticmethod
def is_protected_by_guard(target: Union[Unit, HQ], battlefield: Battlefield) -> bool
@staticmethod
def can_ignore_guard(attacker: Unit) -> bool
```
### 8.4 获取有效攻击目标
```python
@staticmethod
def get_valid_targets(attacker: Unit, battlefield: Battlefield) -> List[Union[Unit, HQ]]
```
**规则实现**:
- 步兵/坦克: 相邻阵线攻击规则
- 火炮: 无视距离和守护
- 战斗机: 无视距离
- 轰炸机: 无视距离和守护,受战斗机保护限制
---
## 9. 单位状态接口 - Unit
### 9.1 行动能力检查
```python
def can_move(self) -> bool
def can_attack(self) -> bool
```
**检查逻辑**:
```python
# 部署限制
if self.deployed_this_turn and not self.can_operate_immediately:
return False
# 移动检查
if self.has_moved_this_turn:
return False (for move)
# 攻击检查
if self.attacks_this_turn >= self.max_attacks_per_turn:
return False (for attack)
# 移动攻击互斥
if self.has_moved_this_turn and not self.can_move_and_attack:
return False (for attack)
if self.has_attacked_this_turn and not self.can_move_and_attack:
return False (for move)
```
### 9.2 行动执行
```python
def perform_move(self) -> None
def perform_attack(self) -> None
def start_new_turn(self) -> None
```
### 9.3 关键词应用
```python
def apply_keyword_abilities(self) -> None
```
**实现映射**:
- `BLITZ``can_operate_immediately = True`
- `TANK``can_move_and_attack = True`
- `FURY``max_attacks_per_turn = 2`
---
## 10. 交互式命令接口 - CommandParser
### 10.1 命令映射
```python
commands = {
# 显示命令
'show': cmd_show, # 显示战场状态
'list': cmd_list, # 列出可用单位
'info': cmd_info, # 查看单位详情
# 单位操作
'deploy': cmd_deploy, # 部署单位
'move': cmd_move, # 移动单位
'attack': cmd_attack, # 攻击目标
# 游戏控制
'endturn': cmd_endturn, # 结束回合
'reset': cmd_reset, # 重置战场
'switch': cmd_switch, # 切换活动玩家
# 资源管理
'kredits': cmd_kredits, # 查看资源
'setk': cmd_set_kredits, # 设置Kredits
'sets': cmd_set_slot, # 设置Slot
}
```
### 10.2 简化语法支持
- **移动命令**: `move <from_pos> <to_pos>`
- **攻击命令**: `attack <from> <to>` 支持 `F0 S1` 简化格式
- **位置解析**: 自动转换 `F0``(LineType.FRONT, 0)`
---
## 11. API一致性约定
### 11.1 返回值格式
所有操作API都返回包含以下字段的字典:
- `success: bool` - 操作是否成功
- `action: str` - 操作类型标识
- `reason: str` - 失败时的原因描述(可选)
### 11.2 错误处理
- **参数验证**: 无效参数返回 `{"success": False, "reason": "详细错误信息"}`
- **权限检查**: 非当前玩家操作返回权限错误
- **状态验证**: 不符合游戏规则的操作返回规则错误
- **费用检查**: Kredits不足返回资源不足错误
### 11.3 ID系统
- **单位ID**: 使用UUID系统全局唯一
- **玩家ID**: 使用整数0/1表示对应player1/player2
- **位置系统**: 使用 `(LineType, int)` 元组表示位置
### 11.4 状态管理
- **原子操作**: 所有API操作都是原子性的失败时不改变游戏状态
- **状态一致性**: 操作成功后立即更新相关状态
- **事件触发**: 重要操作会触发相应的游戏事件
---
*此文档涵盖了KARDS战斗引擎的所有主要API接口确保了接口的一致性和可用性。*