12 KiB
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 加载流程
- Manifest 资产(
ModManifest.asset):列出该 Mod 的全部CardData、CharacterData、EquipmentData、HUDData、KeywordData和本地化文件的资产名 ID。 ModManifest.SaveToDatabase(ModHost host)在运行时被调用,将所有 ScriptableObject 资产按类型注入ModManager.Database字典。CardLogicBase.GenerateCardLogic()通过ModManager.GetTypeID()+ModManager.GetType()找到Mod中注册的C#类,用Activator.CreateInstance实例化,实现数据驱动的逻辑绑定。- 资产命名规范:
{类型}_{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 关键词系统
KeywordDataScriptableObject:定义每个关键词的展示名称、描述、图标等。- 卡牌通过
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() 实现基于优先级的意图决策:
- 注册意图列表:在
CharacterLogicBase.Initialize()中调用character.RegisterIntention(...)注册所有可能的意图。 - 每轮筛选:
IntentionBrain()从所有意图中筛选Condition()为true的,按优先级选最高者。 - 刷新权重:激活意图调用
RefreshCardWeights(),通过forceUse / forceIgnore / baseWeight控制当轮出牌倾向。 - 加权随机抽取:
GetIntendedCards()在资源约束下,优先强制使用牌,然后按权重随机从 Pool 中选剩余牌。 - 意图显示:使用
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 速览)
制作卡牌最小步骤:
- 创建
CardDataScriptableObject(设置属性、关键词、图片等)。 - 创建继承
CardLogicBase的 C# 类,重写PlayEffect()方法。 - 在
SetUpLogicComponents()中添加所需CardLogicComponentBase。 - 将
CardData名称注册到ModManifest的cardDataIDList。 - 打包 Mod,通过 UMod 加载。
Buff 制作最小步骤:
- 继承
CharacterCombatBuffBase,实现Apply()/Remove()/OnBuffApply()。 - 在卡牌
PlayEffect()中调用CreateCharacterBuff<T>().Apply(target, caster, card)。 - 注册类型到
ModManager(UMod 自动处理)。
十一、已知开发状态与注意事项
- 战斗流程(回合/行动)已可运行,玩家手牌操作基本完备。
CombatNPC的行动逻辑中有//TODO: 临时的,刷新一次意图目标注释,目标检测逻辑有待完善。DrawCardAmountPerAction中存在+= 10的临时偏移量,需后续清理。ModifyMana函数中有一处ClampAttribute("Stamina", ...)疑似笔误(应为 Mana)。- 卡牌的
Targeting瞄准 UI 目前仅对第一个目标显示指向,多目标场景还需优化。 - Roguelike 的地图/节点系统、商店、奖励等尚未在当前代码中发现,可能是下一阶段工作。
本文档由 game-designer-generic 技能基于代码扫描自动生成,如有与实际设计意图不符之处,请以开发者说明为准。