沃姆伍德大修:月裔萌芽
一次以「角色技能树」为切口的完整系统重构:把角色的被动回血改造成一套可分配的能量经济, 并以它为核心串起 6 条技能线、32 个技能节点、7 类可指挥随从与 58 条配方。 我独立完成了玩法设计、数值设计、程序实现、四语言本地化与全部线上运营。
把「角色重做」当成一次小型系统设计项目
目标不是堆内容,而是给沃姆伍德建立一套自洽的资源—技能—战力循环,并让它在《饥荒联机版》原版规则与其他大型模组的夹缝中稳定运行。
| 项目定位 | 角色玩法大修(技能树重构 + 支线玩法扩展),面向已购买角色的玩家,无需额外付费 |
|---|---|
| 平台 / 技术 | 《饥荒联机版》DST · Lua Modding API(api_version 10),服务端权威、全客户端同步 |
| 我的角色 | 独立完成:玩法设计 · 数值设计 · 程序实现 · 本地化 · 美术需求定义 · 线上运营 |
| 时间跨度 | 2025.05 – 至今(17 个月,191 次版本更新,当前 v1.17.19) |
| 交付形态 | Steam 创意工坊订阅制模组(含模组内 51 项可配置选项) |
| 内容规模 | 32 技能节点 · 58 条配方 · 149 个动画资产包(28.1 MB)· 每种语言 813 条文案 × 中/英/德/俄 4 语言(共 3,252 条) |
| 玩家侧成绩 | 250 个五星评价 · 498 条留言 · 5 个讨论帖 · 被中文模组社区介绍文收录 |
一个人如何推进 17 个月的内容管线
我的工作流是「设计文档 → 数值表 → 实现 → 本地化 → 上线 → 读反馈 → 排期」的闭环,每一环都有可交付物。
玩法设计
确定角色的核心资源(开花值 BP)与三条输出方向(生存 / 生产 / 战斗),并把 6 条技能线各自绑定一个"资源入口 + 玩法出口"。
数值设计
维护 BP_COST / DURATION / COOLDOWN 三张表(40+ 技能),并提供难度倍率预设与 51 项可配置项。
程序实现
Lua + DST 的组件 / 状态机 / 行为树体系;168 个文件,其中 prefabs 95、brains 16、stategraphs 19。
内容生产
定义动画与特效需求(149 个资产包)、编写 58 条配方、建立 813 条四语言文案表。
线上运营
按玩家反馈排期迭代,以"修复优先"为原则;17 个月内累计 487 行修复记录、96 处崩溃修复。
兼容性维护
与《永不妥协》等大型大修模组共存(priority = -20 控制加载顺序);为被覆写的官方行为设计替代钩子。
四个可复用的系统案例
下面每一节都包含「设计目标 → 机制结构 → 平衡手段」,数值均为项目中的实际参数。
案例 0技能树结构
32 个节点按 6 条线组织,每条线都能独立成立,同时通过核心资源互相牵制:
| 技能线 | 节点数 | 设计职责 |
|---|---|---|
| 荆棘线 bramble | 7 | 受击反击与近战爆发(含多种植物特质) |
| 开花线 blooming | 7 | 核心资源「开花值」的产能与转化效率 |
| 随从线 pets | 7 | 把资源转化为可持续输出的伙伴系统 |
| 蘑菇线 mushroom | 7 | 团队增益与范围控制(蘑菇帽/孢子) |
| 月卫线 moonguard | 3 | 中后期位面属性与守护召唤 |
| 核心 moonsprout | 1 | 月裔萌芽本体(资源总入口) |
28 个技能由我重新命名与定位(其余沿用官方技能框架),完整名单:
案例 1核心资源循环:从「自动回血」到「能量经济」
原版沃姆伍德的光合作用只是"站着回血"。我把它改造成一条可分配的经济链: 环境光照不再直接变血,而是变成能量,能量再按优先级分配给多个出口; 施法消耗开花值,于是"回血"与"打输出"之间产生了真实的机会成本。
输入 · 环境
能量池 · 每秒结算
负载分配 · 优先级
输出 · 开花值与战力
平衡手段
- 时段缩放:自然光因子白天 1 / 黄昏 0.5 / 夜晚 0(洞穴按洞穴昼夜判定),让"夜里照样满速回血"不再成立。
- 季节衰减:春/冬使用不同的开花衰减系数,逼迫玩家在季节转换前重新规划资源。
- 缓冲机制:回血食物换算成缓冲开花值(
3 + 0.005 × 缓冲量每秒回吐),把"吃治疗食物"变成一种资源投资。 - 可调难度:所有消耗/时长/冷却都支持倍率预设,方便不同服务器生态自行调整。
案例 2随从系统:把伙伴做成可指挥的单位
随从线(7 个节点)从"召唤一个宠物"扩展为可指挥的伙伴编制: 7 类直属月之朋友(另有异域树附属的哈巴狸)各自承担采集、搬运、战斗、治疗、复活、管家等分工,并共用一套指令轮盘。
伙伴编制(7 类直属 + 异域树附属)
指令轮盘
AI 行为优先级(节选)
存档与跨世界
设计取舍:为了让"指挥"有意义,我把索敌模式做成互斥状态机,而不是叠加数值 —— 玩家每次切换都在改变 AI 的目标筛选规则,而不是单纯加攻击力。
案例 3植物特质线:受击被动如何不互相打架
荆棘线上每个技能都对应一种真实植物的"特质",它们共享「受击触发」这一稀缺事件, 因此核心设计问题不是"效果多强",而是触发顺序、冷却与开关。
| 特质 | 触发条件 | 概率 | 冷却 | 窗口 |
|---|---|---|---|---|
| 仙人掌硬刺 | 未穿荆棘甲时受击(含格挡) | 100% | 0.3s 内部冷却 | — |
| 猪笼草陷阱 | 被昆虫类生物攻击,且目标可入物品栏 | 50% | 60s | 1s 捕获窗口 |
| 致幻曼陀罗 | 完全盛开状态下受击,小范围释放花粉 | 40% | 10s | — |
| 应激含羞草 | 受击时瞬间获得 90% 减伤并提速 | 100% | 30s | 3s 持续 |
| 蝎子草刺毛 | 攻击虚弱目标:额外 10 点伤害 | 20% 中毒 | 6s 毒(每 2s 一跳) | — |
| 剑叶草锋刃 | 使用锋利武器攻击时释放流星根须 | 100% | — | 8 点路径伤害 |
- 防连锁:多条受击被动用"内部冷却 + 概率"错开,避免一次受击同时触发全部特效造成数值爆炸。
- 可关闭:所有特质都能用道具(芽木绿叶)单独抑制/激活,网络变量同步到客户端,玩家可按流派自由取舍。
- 已知待优化:猪笼草 / 曼陀罗 / 含羞草三者同时触发时存在"技能浪费"问题,已列入待办(见「反思与下一步」)。
案例 4把「种植」变成可配置的配方管道
树桶(可移植培育容器)不是简单换皮:我用一张诱导模式表驱动 4 种树种子的产出, 让"种什么、长成什么"成为数据配置而非硬编码逻辑,方便后续扩展新种子而不动主流程。
- 模式表定义:输入标签(
treeseed)、卡片类型、输出预制物 → 同一套配方/卡牌/界面自动生成。 - 产出侧兼容官方"月树花"体系,使新种子能接入既有资源循环,而不是另起一套经济。
三张表管住全部主动技能
所有主动技能共用 BP_COST(消耗)· DURATION(持续)· COOLDOWN(冷却)三张独立表,
-1 表示不使用该维度,0 表示无冷却。三表分离让"贵但短"与"便宜但长冷却"成为两种可调的设计语言。
| 技能 | BP 消耗 | 持续 (s) | 冷却 (s) | 设计意图 |
|---|---|---|---|---|
| 范围收获 | 5 | — | 0 | 日常高频动作,成本压到最低,避免打断节奏 |
| 装填弹药 | 25 | — | 0 | 战斗准备动作,可连续使用但成本累积 |
| 仙人掌 / 蜂蜜 / 橡果 / 常春藤 | 50–100 | 60 | 120 | 中频功能技,统一 2 分钟冷却形成"轮换使用"节奏 |
| 荆棘封锁 | 200 | 120 | 240 | 战场分割,长冷却强调"时机型大招" |
| 迷幻花粉 | 200 | 10 | 240 | 强控制但极短窗口,收益取决于释放位置 |
| 蘑菇雷 | 200 | 480 | 30 | 可预埋的长时间场控,允许叠加布场 |
| 月树 | 1200 | — | 240 | 高价基建型技能,一次投入长期收益 |
| 作物系(单发→齐射) | 250 → 1600 | — | 25 → 160 | 同一玩法内做"成本—冷却"双曲线,形成武器升级感 |
| 作物:灭绝 | 3000 | — | 300 | 上限级清场技,用价格而非冷却做限制 |
| 随从召唤(通用) | 300 | 60–120 | 120 | 所有伙伴同价,避免出现"必练随从" |
| 异食松鼠(特例) | 2400 | — | — | 唯一高价随从:定位为后期资源型伙伴 |
| 位面随从强化 | 600 | 120 | 100 | 中后期战斗投资,与月卫线衔接 |
刻度与可读性
能量整体 ×100 显示(旧制 1.0 → 100),使"每秒回多少"在 UI 上可被玩家直观比较;开花值 BP 保持原始刻度,避免打乱官方数值体感。
可配置性
除三张表外,模组开放 51 项配置(难度、语言、标签优化、UI、世界规则、与其他模组联动掉落等),并支持对三张表整体套用倍率预设。
上限与溢出
开花值上限 3600(升级后提高),接近上限时消耗补偿衰减;高出上限部分按分段加速回落,避免"挂机溢出"。
失败保护
能量不足时按优先级降级执行(先保命、再保命开花、最后放弃输出),而不是直接施法失败。
17 个月 · 191 个版本 · 以修复优先
上线不是终点:我把更新日志当作产品看板,按月复盘发布密度,并按"修复 : 新增 ≈ 17 : 1"的比例控制节奏。
纵轴为当月发布的版本数(个)。首月 1 版为立项上线,随后进入高频迭代期;2026-06 的 18 版对应一次较大的内容批次。
更新内容结构(按日志关键词统计)
我的运营策略
- 修复优先:崩溃类问题单独标记(96 处),优先于新内容排期。
- 小步快跑:单版本平均改动量小,便于玩家反馈定位与快速回滚。
- 可复现优先:所有玩家反馈先落到更新日志的"挂起事项"(待观察 / 待验证 / 待研究),确认后再排入"待办事项"。
- 公开路线图:更新日志随模组一起分发,玩家可以看到哪些内容在计划中、哪些在考虑移除。
策划也需要能把想法落地
系统设计的复杂度最终会变成工程复杂度,下面是这个项目里我实际处理的几类问题。
| 模块 | 文件数 | 职责 |
|---|---|---|
| prefabs | 95 | 实体定义(技能道具、随从、树、容器、特效等) |
| stategraphs | 19 | 动作状态机(施法、随从行为、生物攻击等) |
| brains | 16 | 行为树(随从指令、BOSS、植物行为) |
| components | 6 | 自定义组件(能量、技能书等) |
| widgets | 3 | UI(能量面板、开花值轮盘) |
| languages | 4 | 中 / 英 / 德 / 俄文案与技能树文本覆写 |
| 合计 | 168 | 86,940 行 Lua |
大文件的可维护性
最大的逻辑模块(随从系统 3,233 行、荆棘系统 1,990 行)用"章节横幅 + 单一职责局部函数 + 明确挂载点"组织;每个改动都过一遍脚本级语法校验,避免线上崩溃。
状态同步
特质开关、模式切换等全部走网络变量(net_bool)同步,服务端权威计算、客户端只做表现,避免不同步导致的"看起来生效但实际没生效"。
与其他模组共存
通过 priority = -20 让自己在《永不妥协》等大修模组之后加载,从而在对方改写技能设置后再覆盖,避免"谁后加载谁说了算"的随机性。
被覆写行为的替代方案
曾遇到"官方施法函数被其他模组整体覆写、导致我的效果完全失效":最终不再抢占函数,而是改为监听目标端的 ondeconstructstructure 事件做等价补偿,从根本上免疫加载顺序问题。
引擎约束
角色标签数量存在上限(社区经验值约 63 个),技能树本身也会消耗标签,因此新增特质必须评估标签预算,并在必要时提供"标签优化"配置项。
跨世界(地面/洞穴)
能量系统的时段判定、随从的归属重建都需要区分分片(地面用 isday/isdusk,洞穴用 iscaveday/iscavedusk),否则会出现"洞穴里永远算夜晚"这类隐蔽 bug。
一个诚实的设计 backlog
下面摘自项目更新日志的「挂起事项 / 待办事项」——我把没解决的问题公开写进日志,让玩家也知道哪些是已知问题。 面试时我很乐意展开讲其中任何一条。
我从这个项目里得到的三条方法论
- 先定资源,再定技能:技能只是资源的出口。先把能量/开花值的产出与消耗算清楚,技能数值才有一致的锚点。
- 被动效果要按"事件稀缺度"排队:受击、击杀、进食这些事件是稀缺资源,多条被动共享同一事件时,冷却与概率是比数值更重要的设计杠杆。
- 把已知问题写进产品文档:公开 backlog 既是对玩家的诚实,也让自己的迭代有据可依 —— 191 个版本里,487 行修复记录就是这套机制的产物。
想了解更多,可以直接跑起来看
作品本体
- Steam 创意工坊:沃姆伍德大修:月裔萌芽
- 订阅即用;建议开一个新存档体验技能树前 10 级与随从线。
- 模组内置 51 项配置,可在"简易"难度下快速体验全部内容。
项目文档
- 更新日志(随模组分发):3,231 行 / 191 个版本
- 本页数据采集脚本与刷新方式:
portfolio/README.md