Kastle:四款游戏共享的引擎

自研引擎是一项昂贵的决定,我们之所以这样做,理由很简单:一周之内有三款游戏,每款都需要相同的 3D 世界、相同的生物、相同的声音、相同的 HUD、相同的 Steam 接入、相同的存档和相同的确定性多人系统。Kastle 就是这一切,它于 10 月 9 日从 Castle Survivors 中提取而来,不包含任何游戏规则。游戏是它旁边的一个文件夹,有自己的模拟、内容和文字。引擎永远不导入游戏,如果哪天它这样做了,自动检查就会失败。
引擎包含什么
外壳:标题、菜单、选项、制作人员名单、带座位、颜色、队伍与聊天的房间、一场对局的生命周期、录像以及帧循环。网络:通过 Steam、局域网或离线的房间,带校验和、追赶、重连和房主迁移的确定性帧同步。模拟:定步长循环、带种子的随机数、空间哈希、使用流场与 A* 的寻路,以及魔兽争霸III运行时,包括按攻击类型与护甲类型划分的伤害表、增益、攻击与飞弹。渲染器:天空、天气、昼夜、岛屿地形、场景、野生动物、后处理、生物、射击与各种特效。音频、带四种 HUD 布局的界面、带架构迁移的存档、Steam、模组与创意工坊。以及资源库:164 个生物模型,含 705 种皮肤;九个资源包中的 1115 个场景模型;17 个岛屿主题、4 种星云天空与深空;235 种特效与 74 种音效。各款游戏购买的资源包已迁入这个资源库,每款游戏只附带它实际加载的文件夹。
最初两周
Kastle 诞生时就带有录像与不同步报告、GPU 生物动画、防御塔的特效图集、定位武器音效,以及手柄和 Steam Deck 支持。次日它成为一个独立的包,附带测试、工具、压缩纹理、内容模组、一个名为 Kastle Skirmish 的示例游戏,以及葡萄牙语。它还获得了一个魔兽争霸III地图导入器,能够读取加密条目,并加入了该游戏的英雄规则。
10 月 24 日,0.2.0 和 0.3.0 版本发布,同时加入了持续集成:类型检查、引擎与游戏的边界检查、带覆盖率下限的测试、代码检查、在 Electron 中运行的示例、审计与发布流程。房间与帧同步已针对恶意对端加固:每个席位都有一把密钥,窗口安全现在由引擎强制执行,校验和覆盖整个世界。渲染器新增了一张统一的画质档位表、按地面格子剔除场景、在 GPU 上飞行的粒子、按屏幕尺寸调整的生物细节,以及战争迷雾覆盖层。模拟新增了人群分离、迷雾与触发器。离线对局可以保存并续玩,重连的玩家从检查点开始而不是重放整局,旁观者可以观看大厅或进行中的对局。大文件现在通过 Git LFS 管理。
至于玩家能直接看到的特效:剑光,一轮 19 发的魔法飞弹,一套 RPG 式的火焰学派,18 枚发光导弹,16 个 MOBA 英雄大招,分八个等级的气场光环(直至光龙),15 种卡通投射物,以及带有翻页动画的新图集。全部为程序化生成,每个攻击动画的击打效果都在刀刃接触的那一瞬间落下。
10 月 25 日这一轮
最后一轮是规模最大的,同时在七条战线上推进。魔兽争霸III运行时新增了指令(停止、驻守、移动、攻击、攻击移动、巡逻、跟随、Shift 排队)、数据化能力(接近、施法前摇、法力与冷却在此结算、后摇或引导、打断),以及一个六格物品栏,且在步进期间不分配内存。寻路现在能识别单位体积、拥堵代价,并让转向与流场结合,同时考虑分离。
在帧同步中,断线玩家的指令在重连后得以保留,校验和被拆分为具名部件:不同步报告会指出哪个系统出现了分歧,而 Studio 的录像标签页会标记第一处分歧。确定性检查会在模拟代码中标出一切会让两台电脑产生分歧的东西:未播种的随机数、挂钟时间、没有比较器的排序、依赖顺序的迭代。浸泡测试会在模拟网络上运行完整对局,网络带有延迟、丢包、乱序和分区,并且已经找到了一个真实 bug:一名来宾的倒计时晚于房主开始,结果丢掉了最初几个回合。性能门禁在本地针对示例与一个 500 单位的人群进行基线测量,因为 CI 分钟数是要花钱的。在 Worker 中运行模拟的方案已经测量过:在 5000 个单位时每帧节省 0.1 到 0.2 毫秒,但尚无游戏采用它。色盲队伍配色会确保每对颜色之间保持最小距离,无论是正常视觉还是模拟的色盲视觉。引擎的界面支持西班牙语和简体中文,此外还有英语和葡萄牙语。
当天收尾时,CI 在没有 GPU 的服务器上再次变绿:由软件渲染器绘制最低画质档,而视觉回归的参考图像现在使用服务器自己生成的图像。
谁在用什么
Line Tower 与 Custom Hero Survival 完全运行在 Kastle 之上,并已采用新一轮改进。Castle Survivors 出于决定只使用渲染器:其模拟、网络、界面、存档和录像仍归自身所有。Castle Arena 拥有自己的帧同步,不使用该引擎,但和其他三款一样与 Kastle Studio 通信。引擎目前自带 948 个测试,每款游戏都会与其自身的测试一同运行。
— 团队





