不久前,我推出了Catalyst,一个简化复杂可修改统计数据的库。自那以后,我一直在开发这个库的一个更具雄心的版本,现在它终于来了。Catalyst 2 正式发布!

Catalyst最初处理的是统计数据和修饰符,让你能轻松地为统计数据添加或移除任意数量的修饰符,就像这样:

damage = new CatalystStatistic(10);
var _damage = damage.GetValue(); // 此时damage返回10

var _mod = new CatalystModifier(5, eCatMathOps.ADD);
damage.AddModifier(_mod);

var _damage = damage.GetValue(); // 此时damage返回15

显然,这是一个非常简单的例子,Catalyst在这个简单起点下隐藏着大量的选项。

然而,Catalyst 2 更加灵活、可靠且实用。

它具备诸如 资源(生命值、法力值、弹药、城市人口等)、资源流(生命恢复、人口增长、冲刺时的耐力消耗速率)以及 效果(例如,一种每秒造成2点伤害、降低移动速度、持续5秒、每 tick 有50%概率触发的毒药DOT)等功能。还有更多其他功能

但当你看到这些功能如何组合时,一切才真正变得有趣起来。资源的上限和下限本身就是统计数据,资源流动速率是统计数据,效果每 tick 的触发概率也是统计数据,诸如此类。所有这些都可以像修改Catalyst中的任何统计数据一样,轻松且广泛地进行修改。当你把这些元素叠加在一起时,就能获得极其灵活的行为,并用少得惊人的代码量设计出复杂的游戏规则。

让我们看一个实际案例。假设我们有一个城市,它拥有发电能力和应急电力储备。每当暴风雨来袭时,发电能力应下降30%,应急电力储备应以每个模拟步15单位的速度消耗。

首先设置统计数据、资源、效果管理器以及(如果你想要的话)一个自定义时钟:

power_generation = new CatalystStatistic(120);
emergency_power = new CatalystResource(500);
city_effects = new CatalystEffectManager(self);
city_clock = new CatalystCountdownTracker();

然后创建一个暴风雨效果,并为其添加修饰符和资源流:

storm_effect = new CatalystEffect("severe_storm", 12)
    .AddTag("weather")
    .AddTag("storm")
    .SetCountdownTracker(city_clock)
    .SetTickInterval(1);

storm_effect.AddModifier(
    power_generation,
    new CatalystModifier(-0.30, eCatMathOps.MULTIPLY)
        .SetSourceLabel("Storm damage")
);

storm_effect.AddFlow(
    emergency_power,
    new CatalystResourceFlow(-15, "Storm reserve usage")
);

// 然后,稍后当你想触发暴风雨效果时,只需将效果添加到效果管理器
city_effects.AddEffect(storm_effect);

然后按照你想要的间隔驱动城市时钟前进(你可以让它每帧自动运行,或者基于增量时间运行,如果你愿意的话):

city_clock.Countdown(1);

这就是全部了。你可以随时添加或移除效果(你甚至可以添加特殊的技能,比如“清除所有天气”)。你可以精确查找是什么原因导致发电能力下降,并将其显示给玩家。你可以轻松地向效果添加新内容、移除现有部分,或者添加其他与相同系统交互的效果。并且它会始终准确反映当前状态。

你不必担心任何烦人的细节(等等?如何从我的主属性中移除一个-30%的减益效果?)。只需以不同的方式组合统计数据、修饰符、资源和资源流,你就能像这样用几行代码模拟任何游戏规则。

RPG和roguelike游戏显然是合适的使用场景,但Catalyst实际上不关心你制作的是什么类型。自从多年前我开始构建Catalyst以来,我之后参与的每个项目都使用了它,哈哈。

链接

(如果你想了解更多,还有Ignition Kit,可以以优惠价格将Catalyst与StatementPulseEcho一起获取,或者以单一价格购买Full Pass Suite,获得我当前和未来的所有工具。)