279 lines
12 KiB
Markdown
279 lines
12 KiB
Markdown
|
|
# Continentis 项目初步总结
|
|||
|
|
|
|||
|
|
> **文档类型**:设计·技术综合概览
|
|||
|
|
> **生成时间**:2026-03-13
|
|||
|
|
> **负责角色**:首席游戏设计师 (game-designer-generic)
|
|||
|
|
> **状态**:初稿,待设计师确认
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、项目定性
|
|||
|
|
|
|||
|
|
**Continentis** 是一款以 **Unity** 为引擎的 **支持 Mod 的类〈杀戮尖塔〉CCG 卡牌游戏**。
|
|||
|
|
游戏以分阵营的**回合制卡牌战斗**为核心体验,兼具 JRPG 幻想世界观与 Roguelike 结构。
|
|||
|
|
Mod 支持通过 **UMod** 框架实现,允许第三方开发者自定义几乎全部的游戏内容(卡牌、角色、Buff、关卡等)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、技术架构总览
|
|||
|
|
|
|||
|
|
### 2.1 程序集分层
|
|||
|
|
|
|||
|
|
| 程序集 | 命名空间前缀 | 职责 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `GameAPI` | `Continentis.MainGame.*` | 游戏核心引擎,定义所有基类与接口 |
|
|||
|
|
| `MainGame` | (同上) | 主要游戏逻辑的具体实现 |
|
|||
|
|
| `Assembly-CSharp` | `Continentis.Mods.*` | 编辑器内置的 "Basic" Mod 实现 |
|
|||
|
|
| UMod 编译产物 | 各 Mod 自定义 | 运行时动态加载的外部 Mod |
|
|||
|
|
|
|||
|
|
### 2.2 Mod 加载流程
|
|||
|
|
|
|||
|
|
1. **Manifest 资产**(`ModManifest.asset`):列出该 Mod 的全部 `CardData`、`CharacterData`、`EquipmentData`、`HUDData`、`KeywordData` 和本地化文件的资产名 ID。
|
|||
|
|
2. `ModManifest.SaveToDatabase(ModHost host)` 在运行时被调用,将所有 ScriptableObject 资产按类型注入 `ModManager.Database` 字典。
|
|||
|
|
3. `CardLogicBase.GenerateCardLogic()` 通过 `ModManager.GetTypeID()` + `ModManager.GetType()` 找到Mod中注册的C#类,用 `Activator.CreateInstance` 实例化,**实现数据驱动的逻辑绑定**。
|
|||
|
|
4. 资产命名规范:`{类型}_{Mod名}_{资产名}`,例如 `CardData_Basic_Backstab`。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、战斗系统核心设计
|
|||
|
|
|
|||
|
|
### 3.1 战斗流程(回合结构)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
StartCombat()
|
|||
|
|
└── NextRound() ← 每轮开始;敌方计算意图
|
|||
|
|
└── NextAction() ← 每个角色的"行动"
|
|||
|
|
├── (PlayerHero) 抽牌 → 玩家操作 → EndAction()
|
|||
|
|
└── (CombatNPC) 按意图打出卡牌 → EndAction()
|
|||
|
|
└── NextAction() / NextRound() 循环
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**关键设计点:**
|
|||
|
|
- 战斗的主要时间单位是**"行动(Action)"**,而非《杀戮尖塔》的整个回合。每轮内所有角色(玩家、盟友、敌人)都有自己的行动窗口,顺序由 `actionOrderList` 决定(基于 Speed 属性)。
|
|||
|
|
- 玩家手牌逻辑:行动开始抽牌,行动结束时,标有 `Retain` 关键词的牌保留,标有 `Ethereal (虚无)` 的牌消耗,其余弃入弃牌堆。
|
|||
|
|
|
|||
|
|
### 3.2 资源系统
|
|||
|
|
|
|||
|
|
每个角色同时拥有**双资源**:
|
|||
|
|
|
|||
|
|
| 资源 | 属性名 | 补充时机 | 说明 |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 体力 (Stamina) | `Stamina` / `MaximumStamina` | 每次行动开始时恢复 `StaminaRecoverPerAction` | 物理/技能类卡牌主要消耗 |
|
|||
|
|
| 魔法 (Mana) | `Mana` / `MaximumMana` | 每次行动开始时恢复 `ManaRecoverPerAction` | 魔法类卡牌主要消耗 |
|
|||
|
|
|
|||
|
|
### 3.3 防御三层机制
|
|||
|
|
|
|||
|
|
伤害处理为**顺序削减**:
|
|||
|
|
```
|
|||
|
|
原始伤害
|
|||
|
|
1. 闪避 (Dodge) → 若闪避值 ≥ 伤害,完全回避(消耗闪避值)
|
|||
|
|
2. 格挡 (Block) → 按格挡值削减,每轮行动开始时清零
|
|||
|
|
3. 护盾 (Shield) → 按护盾值削减,不自动清零
|
|||
|
|
→ 剩余伤害扣除 Health
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.4 伤害计算公式
|
|||
|
|
|
|||
|
|
卡牌伤害最终值由以下因数相乘:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
基础伤害 = 卡牌Damage属性 + 物理偏移量(用户) + 魔法偏移量(用户)
|
|||
|
|
最终伤害 = 基础伤害 × 元素加成 × 通用魔法加成 × 最终伤害加成
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- **元素标签系统**:卡牌可拥有 `Physics`、`Slash`、`Prick`、`Strike`、`Arcane`、`Sorcery`、`Magic` 等关键词,不同元素享有不同的攻防加成属性。
|
|||
|
|
- 攻守双方的对应 `Multiplier` 属性相乘,支持元素克制/弱点设计。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、卡牌系统
|
|||
|
|
|
|||
|
|
### 4.1 卡牌类型
|
|||
|
|
|
|||
|
|
| 类型 | 枚举值 | 设计定位 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| Attack (攻击) | 0 | 主要造成伤害 |
|
|||
|
|
| Skill (技能) | 10 | 功能性效果,如格挡、Buff 等 |
|
|||
|
|
| Power (力量) | 20 | 持续效果,通常保留在场上 |
|
|||
|
|
| Status (状态) | 30 | 非主动使用的状态牌(通常由其他效果生成) |
|
|||
|
|
| Curse (诅咒) | 40 | 对玩家不利的牌 |
|
|||
|
|
| Item (物品) | 50 | 消耗性道具 |
|
|||
|
|
|
|||
|
|
### 4.2 卡牌升级系统
|
|||
|
|
|
|||
|
|
支持两种升级路径:
|
|||
|
|
- **分叉升级**(`isTerminalNode = false`):升级后变成另一张 `CardData`(完整变形)。
|
|||
|
|
- **叠加升级**(`isTerminalNode = true`):在原卡基础上按 `customUpgradeAttributes / defaultUpgradeAttributes` 叠加属性提升,支持无限升级(`isInfiniteUpgrade`)。
|
|||
|
|
|
|||
|
|
### 4.3 卡牌属性分层
|
|||
|
|
|
|||
|
|
| 层级 | 说明 |
|
|||
|
|
|---|---|
|
|||
|
|
| `originalAttributes` | 静态不变的原始值,不受运行时影响 |
|
|||
|
|
| `variableAttributes` | 设计期的可变属性(自动拆解为 BaseAttr / Attr / DisplayAttr) |
|
|||
|
|
| `runtimeCurrentAttributes` | 战斗中的实时动态属性,受 Buff/效果影响 |
|
|||
|
|
|
|||
|
|
### 4.4 关键词系统
|
|||
|
|
|
|||
|
|
- `KeywordData` ScriptableObject:定义每个关键词的展示名称、描述、图标等。
|
|||
|
|
- 卡牌通过 `keywords: List<string>` 字符串列表声明关键词,逻辑层通过 `HasKeyword("字符串")` 查询。
|
|||
|
|
- 内置功能关键词举例:`Retain`(回合末保留)、`Ethereal`(行动末消耗)、`Instant`(抽到立即打出)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、角色系统
|
|||
|
|
|
|||
|
|
### 5.1 角色分类
|
|||
|
|
|
|||
|
|
| 类 | 说明 |
|
|||
|
|
|---|---|
|
|||
|
|
| `PlayerHero` | 玩家控制的英雄角色,手牌由玩家操作 |
|
|||
|
|
| `CombatNPC` | AI控制的战斗单位(敌人与盟友均使用此类) |
|
|||
|
|
| `CombatTeam` | 可作为牌的"持有者"的队伍实体(共享牌库场景) |
|
|||
|
|
|
|||
|
|
### 5.2 核心属性两级体系
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
CoreAttributes(核心属性)
|
|||
|
|
├── Strength(力量) → 转化为 MaximumStamina、物理伤害偏移量
|
|||
|
|
├── Agility(敏捷) → 转化为 Speed、敏捷伤害偏移量
|
|||
|
|
├── Intelligence(智力)→ 转化为 DeckCapacity、ManaRecoverPerAction
|
|||
|
|
├── Physique(体质) → 转化为 MaximumHealth、StaminaRecoverPerAction
|
|||
|
|
├── Perception(感知)→ 转化为 DrawCardAmountPerAction、Awareness
|
|||
|
|
└── Charisma(魅力) → 转化为 魅力偏移量(功能待扩展)
|
|||
|
|
|
|||
|
|
↓ 经 AttributeRulesCollection 转换规则
|
|||
|
|
|
|||
|
|
GeneralAttributes(通用属性)—— 战斗中直接使用
|
|||
|
|
包含:MaximumHealth, Health, MaximumStamina, Stamina, Mana,
|
|||
|
|
Block, Shield, Dodge, Speed, DrawCardAmountPerAction, 等...
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
*转换规则(`ApplyRules_ConvertCoreIntoGeneral`)在 Mod 层定义,可被 Mod 覆盖。*
|
|||
|
|
|
|||
|
|
### 5.3 AI 意图系统
|
|||
|
|
|
|||
|
|
敌方 NPC 通过 `IntentionBase` 和 `IntentionBrain()` 实现基于优先级的意图决策:
|
|||
|
|
|
|||
|
|
1. **注册意图列表**:在 `CharacterLogicBase.Initialize()` 中调用 `character.RegisterIntention(...)` 注册所有可能的意图。
|
|||
|
|
2. **每轮筛选**:`IntentionBrain()` 从所有意图中筛选 `Condition()` 为 `true` 的,按优先级选最高者。
|
|||
|
|
3. **刷新权重**:激活意图调用 `RefreshCardWeights()`,通过 `forceUse / forceIgnore / baseWeight` 控制当轮出牌倾向。
|
|||
|
|
4. **加权随机抽取**:`GetIntendedCards()` 在资源约束下,优先强制使用牌,然后按权重随机从 Pool 中选剩余牌。
|
|||
|
|
5. **意图显示**:使用 `IntentionCardView` 在 UI 上展示敌方下回合意图(类杀戮尖塔"意图"系统)。
|
|||
|
|
|
|||
|
|
**案例(亡灵元帅)**:
|
|||
|
|
- `Normal`:默认权重分配。
|
|||
|
|
- `SummonFirst`(优先级20):盟友仅剩自身时,强制使用"亡灵大军"。
|
|||
|
|
- `UltimateAttackFirst`(优先级10):任意敌方身上的"燃烧"层数 ≥ 5 时,强制使用"冥界之怒"。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、Buff 系统
|
|||
|
|
|
|||
|
|
### 6.1 类型
|
|||
|
|
|
|||
|
|
- `BuffBase<T>` 为抽象泛型基类,`T` 为被挂载目标类型(`CharacterBase` 或 `CardInstance`)。
|
|||
|
|
- `CharacterCombatBuffBase`:挂载在角色上的战斗 Buff(最常用)。
|
|||
|
|
- `CardBuffBase`:挂载在卡牌上的 Buff。
|
|||
|
|
|
|||
|
|
### 6.2 生命周期
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
OnBuffApply() → 尝试添加时调用(处理同类叠加/刷新逻辑)
|
|||
|
|
OnAfterFirstApply() → 首次成功添加后调用
|
|||
|
|
[各种事件钩子:RoundStart / ActionStart / onDealAttack 等]
|
|||
|
|
OnBuffDispel() → 被驱散前调用
|
|||
|
|
OnBuffRemove() → 被正常移除时调用
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6.3 驱散等级
|
|||
|
|
|
|||
|
|
`Basic` < `Strong` < `DeathOnly` < `Undispellable`
|
|||
|
|
|
|||
|
|
### 6.4 已实现的 General Buff(Basic Mod)
|
|||
|
|
|
|||
|
|
正面:Consolidate(坚固)、CounterAttack(反击)、Firm(坚定)、Nimble(敏捷)、Protected(被保护)、Protecting(保护)、Prowess(武勇)、Resonance(共鸣)、Sharpness(锐利)、Withstand(承受)
|
|||
|
|
|
|||
|
|
负面:Bleed(流血)、Blind(致盲)、Burn(燃烧)、Corrosion(腐蚀)、Freeze(冻结)、Heavy(沉重,阻止抽牌)、Vulnerable(脆弱)、Weak(虚弱)
|
|||
|
|
|
|||
|
|
职业专属:Assassin — `AmbushStance`、`KnifeTrick`、`WoundDeterioration`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、卡牌池(Basic Mod 速览)
|
|||
|
|
|
|||
|
|
Basic Mod 包含约 **80+** 张卡牌,覆盖以下职业/风格:
|
|||
|
|
|
|||
|
|
| 职业/标签 | 代表牌 | 设计风格 |
|
|||
|
|
|---|---|---|
|
|||
|
|
| 骑士 (Knight) | KnightStrike, IronWall, OathOfCourage | 格挡、护盾、领袖光环 |
|
|||
|
|
| 牧师 (Cleric) | PrayerOfHealing, DivineSmite, SpiritGuardian | 治疗、圣属性攻击、护盾 |
|
|||
|
|
| 法师 (Mage) | FireBall, ArcaneMissiles, Haste | AOE 魔法、施法加速 |
|
|||
|
|
| 刺客 (Assassin) | Backstab, Stealth, AmbushStance | 隐身、叠伤、连击 |
|
|||
|
|
| 通用 | Guard, Slash, Strike, DualStrike | 基础攻防 |
|
|||
|
|
| 敌方专属 | HellfireBlast, ArmyOfTheDead, WrathOfUnderworld | BOSS 技能 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 八、装备系统
|
|||
|
|
|
|||
|
|
`EquipmentData` → `EquipmentBase` 实例化。装备挂载在角色上,可以:
|
|||
|
|
- 向角色牌库中注入额外卡牌(`belongingCardDataRefs`)。
|
|||
|
|
- 拥有独立的事件订阅(`onCombatStart`、`onRoundStart`等),实现被动效果。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 九、命令队列系统(Command Queue)
|
|||
|
|
|
|||
|
|
所有战斗演出/逻辑效果通过**命令(Command)模式**异步执行:
|
|||
|
|
|
|||
|
|
- `CommandBase`:抽象命令基类。
|
|||
|
|
- `CommandGroup`:命令容器,支持 `Sequential`(顺序)或 `Parallel`(并行)执行模式。
|
|||
|
|
- `CommandQueueManager`:全局单例,逐帧消费命令队列。
|
|||
|
|
- 卡牌逻辑的 `PlayEffect()` 返回 `List<CommandBase>`,由系统依次执行。
|
|||
|
|
|
|||
|
|
**常用命令类型:**
|
|||
|
|
|
|||
|
|
| 命令 | 功能 |
|
|||
|
|
|---|---|
|
|||
|
|
| `Cmd_Function` | 执行任意 lambda,支持延时 |
|
|||
|
|
| `Cmd_ParamFunction<T>` | 带参数的函数命令(常用于传入 Target) |
|
|||
|
|
| `Cmd_DrawCards` | 抽牌 |
|
|||
|
|
| `Cmd_DiscardCards` | 弃牌 |
|
|||
|
|
| `Cmd_ExhaustCards` | 消耗牌 |
|
|||
|
|
| `Cmd_PlayAnimation` | 播放角色动画 |
|
|||
|
|
| `Cmd_PlaySFX` | 播放音效 |
|
|||
|
|
| `Cmd_SpawnVFX` | 生成特效 |
|
|||
|
|
| `Cmd_ReshuffleDeck` | 洗牌 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十、Mod 开发者视角(Modder's API 速览)
|
|||
|
|
|
|||
|
|
制作卡牌最小步骤:
|
|||
|
|
1. 创建 `CardData` ScriptableObject(设置属性、关键词、图片等)。
|
|||
|
|
2. 创建继承 `CardLogicBase` 的 C# 类,重写 `PlayEffect()` 方法。
|
|||
|
|
3. 在 `SetUpLogicComponents()` 中添加所需 `CardLogicComponentBase`。
|
|||
|
|
4. 将 `CardData` 名称注册到 `ModManifest` 的 `cardDataIDList`。
|
|||
|
|
5. 打包 Mod,通过 UMod 加载。
|
|||
|
|
|
|||
|
|
Buff 制作最小步骤:
|
|||
|
|
1. 继承 `CharacterCombatBuffBase`,实现 `Apply()` / `Remove()` / `OnBuffApply()`。
|
|||
|
|
2. 在卡牌 `PlayEffect()` 中调用 `CreateCharacterBuff<T>().Apply(target, caster, card)`。
|
|||
|
|
3. 注册类型到 `ModManager`(UMod 自动处理)。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 十一、已知开发状态与注意事项
|
|||
|
|
|
|||
|
|
- 战斗流程(回合/行动)**已可运行**,玩家手牌操作基本完备。
|
|||
|
|
- `CombatNPC` 的行动逻辑中有 `//TODO: 临时的,刷新一次意图目标` 注释,目标检测逻辑有待完善。
|
|||
|
|
- `DrawCardAmountPerAction` 中存在 `+= 10` 的临时偏移量,需后续清理。
|
|||
|
|
- `ModifyMana` 函数中有一处 `ClampAttribute("Stamina", ...)` 疑似笔误(应为 Mana)。
|
|||
|
|
- 卡牌的 `Targeting` 瞄准 UI 目前仅对第一个目标显示指向,多目标场景还需优化。
|
|||
|
|
- Roguelike 的地图/节点系统、商店、奖励等**尚未在当前代码中发现**,可能是下一阶段工作。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本文档由 game-designer-generic 技能基于代码扫描自动生成,如有与实际设计意图不符之处,请以开发者说明为准。*
|