You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
4.4 KiB
117 lines
4.4 KiB
|
3 weeks ago
|
# 战斗系统需求说明(逻辑层 / 表现层)
|
||
|
|
|
||
|
|
> 本文档为战斗模块的**需求与架构约束**,与 `接入指南.md` 互补。
|
||
|
|
> 完整技能方案见 [`docs/方案-战斗技能逻辑层.md`](../../../docs/方案-战斗技能逻辑层.md)。
|
||
|
|
表现数据驱动见 [`docs/方案-战斗表现数据驱动.md`](../../../docs/方案-战斗表现数据驱动.md)。
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. 术语(必读)
|
||
|
|
|
||
|
|
| 对外说法 | 配表 / 代码名 | 含义 |
|
||
|
|
|----------|---------------|------|
|
||
|
|
| **技能** | `Skill` 表 / `ITableSkill` | 战斗技能配置:普攻形态、主动、被动、额外效果。 |
|
||
|
|
| **普攻** | `Hero.atk_id[level-1]` → `Skill.id` | 每塔 1 个,随合成等级取数组索引。 |
|
||
|
|
| **英雄技能** | `Hero.act_skill[level-1]` → `Skill.id` | 可无;按合成等级取索引。 |
|
||
|
|
| **武器技能** | `Weapon.act_skill` → `Skill.id` | 局外装备确定;`type=1` 主动 / `type=2` 被动。 |
|
||
|
|
| **词条** | — | 旧三选1表已删;遗留代码须空操作。 |
|
||
|
|
|
||
|
|
代码中历史名 `weapon1Id` 表示 **Hero.id**;新增优先用 `heroId`。
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. PVP:当前不实现,架构必须预留
|
||
|
|
|
||
|
|
**现状**:仅 solo 完整跑通;PVP **不做联机与匹配**,但**禁止**为赶进度写死「只有一个玩家」的逻辑。
|
||
|
|
|
||
|
|
### 2.1 必须遵守
|
||
|
|
|
||
|
|
| 规则 | 做法 |
|
||
|
|
|------|------|
|
||
|
|
| 玩家上下文 | 业务入口用 `Player` / `match.players` / `match.getPlayer(id)`,**不要**在战斗逻辑里散落 `gg.game.localPlayer`(UI 层可缓存 `_player`)。 |
|
||
|
|
| 部署与同步 | `DeploySync` / `SkillController` 均带 **`playerId`**,远端玩家无 `bagSession` 时走 map 扫描 fallback。 |
|
||
|
|
| 事件监听 | 每玩家一个 `SkillController`;表现 cue 用 `_ownsEntity` 过滤。 |
|
||
|
|
| 模式参数 | `BattleStartParams.mode: 'solo' \| 'pvp'`、`localPlayerId` 已存在;新功能不得假设 `players.length === 1`。 |
|
||
|
|
|
||
|
|
### 2.2 刻意不做(后续 PVP 迭代)
|
||
|
|
|
||
|
|
- 词条选择的网络同步(词条玩法已移除)
|
||
|
|
- 远端 `bagSession` / 背包 UI
|
||
|
|
|
||
|
|
### 2.3 验收标准(架构预留)
|
||
|
|
|
||
|
|
- [ ] 新增战斗逻辑函数签名包含 `playerId` 或 `Player` 参数
|
||
|
|
- [ ] 无全局可变「本局唯一塔列表」;按玩家槽位查询 `deployedUnits`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. 塔战斗能力(优先级 P0)
|
||
|
|
|
||
|
|
### 3.1 三槽模型
|
||
|
|
|
||
|
|
```
|
||
|
|
Hero
|
||
|
|
├─ atk_id[level-1] → Skill(普攻)
|
||
|
|
├─ act_skill[level-1] → Skill(英雄主动;可空)
|
||
|
|
└─ 装备武器
|
||
|
|
└─ Weapon.act_skill → Skill(武器技能;0=无)
|
||
|
|
```
|
||
|
|
|
||
|
|
- 允许同一塔同时挂 **普攻 + 英雄主动 + 武器主动**(有配置才挂)。
|
||
|
|
- 主动技(英雄+武器)按 `Skill.priority` **降序** 入队,**串行**释放。
|
||
|
|
- 被动(`Skill.type=2`)走 condition/result,不进施法队列。
|
||
|
|
|
||
|
|
### 3.2 部署时初始化
|
||
|
|
|
||
|
|
1. 解析武器:`getHeroDisplayWeaponId(heroId)`。
|
||
|
|
2. 从 `Hero` + `level` + 武器计算 `CombatComp`。
|
||
|
|
3. 绑定普攻 / 英雄主动 / 武器主动 Ability;注册被动。
|
||
|
|
4. 词条物化:空操作(表已删)。
|
||
|
|
|
||
|
|
### 3.3 实现模块
|
||
|
|
|
||
|
|
| 模块 | 职责 |
|
||
|
|
|------|------|
|
||
|
|
| `SkillAbilityBuilder` | `Skill` → MX `AbilityDef` |
|
||
|
|
| `TowerCombatSetup` | 部署后写 Combat + Ability |
|
||
|
|
| `TowerLoadoutService` | 实体 loadout、刷新 Ability 绑定 |
|
||
|
|
| `PassiveSkillRuntime` | type=2 被动 |
|
||
|
|
| `SkillPickApplier` | 遗留空操作 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. 表现层需求
|
||
|
|
|
||
|
|
### 4.1 逻辑 → 表现
|
||
|
|
|
||
|
|
- MX 发出 `PresentationCue`(timeline 内 `PlayPresentation`)。
|
||
|
|
- `SkillController` 按 cue 调用 `onAttack` / `onSkill` / `onWeaponSkill`。
|
||
|
|
- **cue**:普攻 `attack`,英雄主动 `skill`,武器主动 `weaponSkill`。
|
||
|
|
- 默认经 `SkillPresenterRouter`:按 `skillId` 覆盖或 `Skill.atk_type` 通用播控(三槽同一管线)。
|
||
|
|
- 伤害归逻辑层;表现不通过碰撞 AABB 作为唯一命中源。
|
||
|
|
|
||
|
|
### 4.2 表现 params
|
||
|
|
|
||
|
|
见 [`docs/方案-战斗技能逻辑层.md`](../../../docs/方案-战斗技能逻辑层.md) §6。
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. 配表依赖
|
||
|
|
|
||
|
|
| 表 | 用途 |
|
||
|
|
|----|------|
|
||
|
|
| `Hero` | 塔数值、`atk_id`、`act_skill`、`startweapon` |
|
||
|
|
| `Weapon` | 局外装备、`atk` 加成、`act_skill` |
|
||
|
|
| `Skill` | 战斗技能(普攻/主动/被动) |
|
||
|
|
| `Text` | 背包字块合成 |
|
||
|
|
| `Level` / `Monster` | 关卡与出怪 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. 修订记录
|
||
|
|
|
||
|
|
| 日期 | 说明 |
|
||
|
|
|------|------|
|
||
|
|
| 2026-07-08 | 初版:PVP 架构预留、一塔一普攻一主动 |
|
||
|
|
| 2026-08-29 | 改为三槽(普攻+英雄技能+武器技能);Skill=战斗技能;去掉词条模型 |
|