kards-env/docs/KARDS_GAME_RULES.md

255 lines
8.7 KiB
Markdown
Raw Permalink Normal View History

2025-09-05 17:05:43 +08:00
# 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战斗引擎的所有核心规则和机制。*