Files
Continentis/docs/Project_Overview_初步总结.md
SoulliesOfficial d09b58fd80 架构大更
2026-03-20 11:56:50 -04:00

12 KiB
Raw Permalink Blame History

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 的全部 CardDataCharacterDataEquipmentDataHUDDataKeywordData 和本地化文件的资产名 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属性 + 物理偏移量(用户) + 魔法偏移量(用户)
最终伤害 = 基础伤害 × 元素加成 × 通用魔法加成 × 最终伤害加成
  • 元素标签系统:卡牌可拥有 PhysicsSlashPrickStrikeArcaneSorceryMagic 等关键词,不同元素享有不同的攻防加成属性。
  • 攻守双方的对应 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 通过 IntentionBaseIntentionBrain() 实现基于优先级的意图决策:

  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 为被挂载目标类型(CharacterBaseCardInstance)。
  • CharacterCombatBuffBase:挂载在角色上的战斗 Buff最常用
  • CardBuffBase:挂载在卡牌上的 Buff。

6.2 生命周期

OnBuffApply()   → 尝试添加时调用(处理同类叠加/刷新逻辑)
OnAfterFirstApply() → 首次成功添加后调用
[各种事件钩子RoundStart / ActionStart / onDealAttack 等]
OnBuffDispel()  → 被驱散前调用
OnBuffRemove()  → 被正常移除时调用

6.3 驱散等级

Basic < Strong < DeathOnly < Undispellable

6.4 已实现的 General BuffBasic Mod

正面Consolidate坚固、CounterAttack反击、Firm坚定、Nimble敏捷、Protected被保护、Protecting保护、Prowess武勇、Resonance共鸣、Sharpness锐利、Withstand承受

负面Bleed流血、Blind致盲、Burn燃烧、Corrosion腐蚀、Freeze冻结、Heavy沉重阻止抽牌、Vulnerable脆弱、Weak虚弱

职业专属Assassin — AmbushStanceKnifeTrickWoundDeterioration


七、卡牌池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 技能

八、装备系统

EquipmentDataEquipmentBase 实例化。装备挂载在角色上,可以:

  • 向角色牌库中注入额外卡牌(belongingCardDataRefs)。
  • 拥有独立的事件订阅(onCombatStartonRoundStart等),实现被动效果。

九、命令队列系统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 名称注册到 ModManifestcardDataIDList
  5. 打包 Mod通过 UMod 加载。

Buff 制作最小步骤:

  1. 继承 CharacterCombatBuffBase,实现 Apply() / Remove() / OnBuffApply()
  2. 在卡牌 PlayEffect() 中调用 CreateCharacterBuff<T>().Apply(target, caster, card)
  3. 注册类型到 ModManagerUMod 自动处理)。

十一、已知开发状态与注意事项

  • 战斗流程(回合/行动)已可运行,玩家手牌操作基本完备。
  • CombatNPC 的行动逻辑中有 //TODO: 临时的,刷新一次意图目标 注释,目标检测逻辑有待完善。
  • DrawCardAmountPerAction 中存在 += 10 的临时偏移量,需后续清理。
  • ModifyMana 函数中有一处 ClampAttribute("Stamina", ...) 疑似笔误(应为 Mana
  • 卡牌的 Targeting 瞄准 UI 目前仅对第一个目标显示指向,多目标场景还需优化。
  • Roguelike 的地图/节点系统、商店、奖励等尚未在当前代码中发现,可能是下一阶段工作。

本文档由 game-designer-generic 技能基于代码扫描自动生成,如有与实际设计意图不符之处,请以开发者说明为准。