255 lines
8.7 KiB
Markdown
255 lines
8.7 KiB
Markdown
|
|
# 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战斗引擎的所有核心规则和机制。*
|