kards-env/docs/KARDS_GAME_RULES.md

255 lines
8.7 KiB
Markdown
Raw Permalink 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 游戏规则统一文档
## 1. 单位类型特性
### 1.1 步兵 (INFANTRY) 🚶
- **移动规则**: 只能攻击相邻阵线(前线攻击敌方支援线,支援线攻击敌方前线)
- **攻击规则**: 不能跨阵线攻击,必须遵循距离限制
- **反击规则**: 正常反击
- **特殊规则**: 无
### 1.2 坦克 (TANK) 🚗
- **移动规则**: 与步兵相同的距离限制
- **攻击规则**: 与步兵相同
- **反击规则**: 正常反击
- **特殊规则**:
- 可以一回合内移动+攻击(`can_move_and_attack = True`
- 默认具有TANK关键词能力
### 1.3 火炮 (ARTILLERY) 🎯
- **移动规则**: 需要消耗激活成本移动
- **攻击规则**:
- 无视攻击距离,可以攻击任意敌方目标
- 无视守护保护
- **反击规则**: 火炮攻击不受反击
- **特殊规则**: 可以跨阵线攻击任意敌方目标
### 1.4 战斗机 (FIGHTER) ✈️
- **移动规则**: 需要消耗激活成本移动
- **攻击规则**: 无视攻击距离,可以攻击任意敌方目标
- **反击规则**: 正常反击,轰炸机被攻击时只对战斗机反击
- **特殊规则**: 可以保护同阵线其他单位免受轰炸机攻击
### 1.5 轰炸机 (BOMBER) 💣
- **移动规则**: 需要消耗激活成本移动
- **攻击规则**:
- 无视攻击距离和守护保护
- 不能攻击与战斗机同阵线的非战斗机目标
- **反击规则**: 轰炸机攻击不受反击,被攻击时不会反击(除非攻击者是战斗机)
- **特殊规则**: 受战斗机保护限制
## 2. 关键词特性
### 2.1 BLITZ闪击
- **效果**: 单位部署当回合就能立即行动
- **实现**: `can_operate_immediately = True`
- **影响**: 跳过`deployed_this_turn`限制
### 2.2 TANK坦克
- **效果**: 可以在同一回合内移动和攻击
- **实现**: `can_move_and_attack = True`
- **影响**: 移动后仍可攻击,攻击后仍可移动
### 2.3 FURY奋战
- **效果**: 每回合可以攻击两次
- **实现**: `can_attack_multiple_times = True`, `max_attacks_per_turn = 2`
- **影响**: 增加每回合攻击次数上限
### 2.4 GUARD守护
- **效果**: 保护相邻的友方单位和HQ
- **实现**: 阻止敌方攻击相邻目标(除非敌方可以无视守护)
- **影响**: 必须先攻击守护单位才能攻击被保护目标
### 2.5 HEAVY_ARMOR_X重甲X
- **效果**: 受到的伤害减少X点
- **实现**: 伤害计算时减去护甲值
- **格式**: `HEAVY_ARMOR_1`, `HEAVY_ARMOR_2`
- **影响**: `final_damage = max(0, damage - armor_value)`
### 2.6 AMBUSH伏击
- **效果**: 首次被攻击时先对攻击者造成伤害
- **实现**: 在受到伤害前先进行反击
- **影响**: 改变战斗顺序
### 2.7 SMOKESCREEN烟幕
- **效果**: 不能被敌方单位攻击
- **实现**: `can_be_attacked_by()`返回False
- **移除条件**:
- 单位**移动**后自动失去烟幕
- 单位**攻击**后自动失去烟幕
- 单位**移动到前线**时自动失去烟幕
- 单位**获得GUARD关键词**时自动失去烟幕
- 单位**离开己方支援线**时自动失去烟幕
- **约束**: 烟幕与守护不能共存,任何情况下单位离开己方支援线或获得守护都会失去烟幕
### 2.8 PINNED压制
- **效果**: 被压制的单位不能主动攻击,但可以反击
- **实现**: `can_attack()`检查压制状态,但不影响反击
- **持续时间**: 持续到下个己方回合结束
- **影响**: 阻止主动攻击,但保留反击能力
## 3. 移动规则
### 3.1 基本移动规则
- **费用**: 每次移动消耗单位的操作费用(`operation_cost`
- **限制**: 每回合最多移动一次(除非有特殊能力)
- **目标**: 只能移动到有效的空位或友方控制的位置
### 3.2 移动限制检查
```python
def can_move(self) -> bool:
# 刚部署的单位不能移动除非有BLITZ
if self.deployed_this_turn and not self.can_operate_immediately:
return False
# 已经移动过的单位不能再移动
if self.has_moved_this_turn:
return False
# 已经攻击过的单位不能移动除非有TANK能力
if self.has_attacked_this_turn and not self.can_move_and_attack:
return False
return True
```
### 3.3 移动方向规则
- **支援线到前线**: 从己方支援线移动到前线空位
- **前线单位不能移动**: 已在前线的单位无法再移动
- **不能移动**: 不能移动到敌方支援线
## 4. 战斗规则
### 4.1 攻击距离规则
#### 步兵/坦克攻击规则
- 前线单位 → 敌方支援线单位
- 支援线单位 → 敌方前线单位
- 不能攻击同阵线目标
#### 火炮攻击规则
- 可以攻击任意敌方目标
- 无视距离和守护限制
#### 空中单位攻击规则
- 战斗机:可以攻击任意敌方目标
- 轰炸机:可以攻击任意敌方目标,但受战斗机保护限制
### 4.2 攻击限制检查
```python
def can_attack(self) -> bool:
# 刚部署的单位不能攻击除非有BLITZ
if self.deployed_this_turn and not self.can_operate_immediately:
return False
# 已经达到最大攻击次数
if self.attacks_this_turn >= self.max_attacks_per_turn:
return False
# 已经移动过的单位不能攻击除非有TANK能力
if self.has_moved_this_turn and not self.can_move_and_attack:
return False
return True
```
### 4.3 守护保护规则
- **守护检查**: 攻击前检查目标是否被相邻GUARD单位保护
- **无视守护**: 火炮(ARTILLERY)和轰炸机(BOMBER)可以无视守护
- **守护范围**: 保护相邻位置的友方单位和HQ
### 4.4 反击规则
```python
def can_counter_attack(defender: Unit, attacker: Unit) -> bool:
# 被压制的单位不能反击
if defender.has_keyword("PINNED"):
return False
# 轰炸机和火炮攻击不受反击
if attacker.unit_type in [UnitType.BOMBER, UnitType.ARTILLERY]:
return False
# 轰炸机被攻击时不会反击(除非攻击者是战斗机)
if defender.unit_type == UnitType.BOMBER:
return attacker.unit_type == UnitType.FIGHTER
return True
```
### 4.5 伤害计算规则
1. **基础攻击力**: `attacker.get_effective_attack()`
2. **伏击处理**: 如果目标有AMBUSH先进行伏击伤害
3. **重甲减伤**: 应用`HEAVY_ARMOR_X`减伤
4. **最终伤害**: `target.stats.take_damage(final_damage)`
## 5. 部署规则
### 5.1 部署位置
- **支援线部署**: 单位只能部署到己方支援线
- **位置选择**: 可以指定位置或自动添加到末尾
- **HQ位置**: HQ总是位于支援线末端
### 5.2 部署限制
- **容量限制**: 每条支援线有最大容量限制
- **费用检查**: 部署不消耗操作费用,但激活需要费用
- **所有权**: 部署时自动设置单位所有者
### 5.3 部署状态
- **新部署状态**: `deployed_this_turn = True`
- **行动限制**: 除非有BLITZ否则当回合不能移动/攻击
- **下回合重置**: 回合开始时`deployed_this_turn = False`
## 6. 回合制规则
### 6.1 回合结构
- **玩家回合**: 每个玩家轮流进行完整回合
- **行动阶段**: 玩家可以自由进行移动、攻击等行动
- **回合结束**: 重置所有单位的行动状态
### 6.2 行动状态管理
```python
# 单位状态属性
self.deployed_this_turn: bool = True
self.has_moved_this_turn: bool = False
self.has_attacked_this_turn: bool = False
self.attacks_this_turn: int = 0
self.max_attacks_per_turn: int = 1
# 回合开始时重置
def start_new_turn(self):
self.deployed_this_turn = False
self.has_moved_this_turn = False
self.has_attacked_this_turn = False
self.attacks_this_turn = 0
```
### 6.3 资源系统Kredits
- **Kredits Slot**: 指挥点槽位每回合自然增长上限12
- **Kredits**: 当前可用指挥点,每回合重置为槽位数
- **激活费用**: 移动和攻击都需要消耗单位的操作费用
## 7. 特殊规则汇总
### 7.1 立即行动规则
- **BLITZ单位**: 部署当回合可立即行动
- **实现方式**: `can_operate_immediately = True`
### 7.2 多次行动规则
- **TANK单位**: 可以移动后攻击或攻击后移动
- **FURY单位**: 可以每回合攻击两次
- **组合效果**: TANK+FURY可以移动后攻击两次
### 7.3 保护机制
- **GUARD保护**: 相邻友方单位和HQ
- **战斗机保护**: 同阵线单位免受轰炸机攻击
- **SMOKESCREEN保护**: 完全免疫攻击(攻击后消失)
### 7.4 特殊攻击规则
- **无视距离**: 火炮、战斗机、轰炸机
- **无视守护**: 火炮、轰炸机
- **无反击攻击**: 火炮、轰炸机的攻击
- **战斗机限制**: 轰炸机不能攻击有战斗机保护的目标
---
*此文档基于当前代码实现整理涵盖了KARDS战斗引擎的所有核心规则和机制。*