战斗先于画面诞生
MushRog 的第一样东西,是一个不需要画面、也不需要网络就能运行的战斗模拟。我们已经可以在自动化测试里完整打一场对Salamandra Ardente的战斗。
为什么
在联网游戏里,最贵的一类 bug 就是服务器和客户端对“刚才发生了什么”看法不一致。如果战斗是一段纯代码,tick 固定为每秒 20 次,随机数生成器带种子,那么同一串指令永远产生同样的结果。服务器把这套模拟当作权威来跑,客户端跑同一套来预测接下来会发生什么,测试则可以跑成千上万次,一个窗口都不用开。
我们还把每条指令连同它进入的 tick 一起记录下来。这样 replay 就白送了:任何一场战斗都能精确重现,方便找 bug、查作弊,将来也可以拿来展示精彩操作。
怎么运作
现在有十九个测试通过,覆盖了设计里最要紧的部分。元素的顺序有影响:先火后冰伤害翻倍,先冰后火是一点五倍。雷打在冰上,会让目标防御降低 40%,持续 8 秒;雷打在火上,会发生范围爆炸。火属性首领免疫火,对冰有反应,但不会丢掉自己的元素印记。每隔 20 秒,它会打开一个窗口,天生的元素印记消失,任何元素都能附着上去。
切换角色不会清零也不会暂停 cooldown:法师退到后排时 Bola de Fogo 还在冷却,回来时已经就绪。切换本身有 1.5 秒的等待,角色被眩晕时无法切换。如果角色死亡,会被强制切换,而且不消耗等待时间。另外,种子和指令相同,产生的事件就完全相同。
可玩的原型是用矩形和文字搭的:法师是蓝色,战士是棕色,首领是红色,轮廓是它元素印记的颜色。1 到 4 键放技能,Tab 切换。故意做得很丑,因为它要回答的问题是“为了触发反应而切换”好不好玩,这不需要精灵图。
下一步
一直玩到切换变得自然。然后是移动和射程,因为现在每个技能站在哪儿都能命中。
变更
- feat(core): deterministic combat sim with team swap and elemental reactions
Fase 0 skeleton: Godot 4.7 project, data-driven content (elements, reactions, classes, skills, mobs), pure GDScript simulation with fixed tick, seeded RNG and command log for replay. Headless test runner with 19 tests covering reactions, swap rules, boss innate aura and replay.
- feat(client): offline fase 0 prototype scene
Rectangles and text over the sim: boss with innate fire aura, team of mage + warrior, skill bar with cooldowns, swap on Tab, event log.