活动是怎么识别的
《Shakes & Fidget》有两类活动,Mercy SF 对它们的处理并不相同。
服务器活动是周末的修正项:经验活动、金币活动、收紧或放宽的史诗掉率。它们改变 的是普通模块应当优先做什么,而且只要开着,就能在游戏状态里看到。
大型限时活动则是自成一块的游戏内容,有自己的界面、自己的货币和自己的进度: 世界 Boss、地狱电梯和 传说地下城。它们出现一两周,然后消失。

为什么「它到底开着没有」才是难的那部分
判断世界 Boss 是否开启,最直白的做法是去游戏状态里找世界 Boss 的数据。这行不通, 而且是以代价最高的方式行不通:活动结束很久之后,服务器仍然继续下发那一块数据。
在处理这件事之前,结果就是一个模块整天发送它的指令,而每一条都被 event not active 顶回来。每分钟一条警告,每个账号都是,还有一个把已经结束的活动 显示得像正在进行的活动界面。
Mercy SF 使用两个真相来源,按这个顺序。
- 协议给出时间窗的,就用活动自己的时间窗。 地狱电梯和传说地下城都带有开始和 结束的时间戳,因此可以给出准确的答案。
- 协议没给的,就用服务器自己的裁决。 世界 Boss 在游戏状态里没有时间窗,所以 唯一诚实的信号就是那次拒绝本身。一旦服务器说活动没在进行,这个结论会被相信一小 时,之后再探一次,以防新的一场已经开始。
那一小时就是这笔交易的全部。一个已关闭的活动,代价从每分钟一次请求降到每小时一 次;而一个刚开的活动,是在一小时之内加入,而不是立刻加入。
刻意不做的事
游戏会发来一个带数字类型码的 eventstatus 块。它的时间戳会被解析和使用。类型码本 身不会被当成到某个具体活动的映射,因为观测到的一个取值不构成一张映射表,而猜 错会悄无声息地让错误活动的模块去对着错误的时间窗运行。
解锁探测
严格依赖检测,会让新账号在世界 Boss 上陷入死锁,这一点值得了解,因为它的症状看起 来像 bug。
只有当角色加入过这个活动之后,服务器才会下发世界 Boss 的数据块。于是从未加入 过的角色没有数据块,永远检测不到,因此也永远不会加入。账号就那样一直卡着,而毫不 相干的请求不断带回 world boss join first。
因此,只要角色过了解锁等级,Mercy SF 就会按定时尝试进入,即便什么都没检测到,把判 断留给服务器。被拒绝的代价是每隔几分钟一次请求,除此之外没有别的。
活动优先级
有三个设置决定限时活动能在多大程度上打乱平常的日常循环。
| 设置 | 默认 | 作用 |
|---|---|---|
event_priority_mode | 开 | 活动进行期间,它的模块在循环中排在普通模块之前。 |
event_ending_threshold_mins | 60 | 距离活动结束多近算作「快结束了」,过了这条线活动会被更强地优先。 |
event_auto_beer_during_event | 关 | 允许在活动期间为冒险欲望花掉啤酒。默认关闭,因为啤酒是有限的每日资源,花不花它是一种偏好,而不该是默认值。 |
服务器活动与日常循环
普通模块会读取正在进行的服务器活动并作出调整:
- 经验活动会把任务选择往经验任务那边推,好让双倍经验的周末不至于花在银币上;
- 金币活动则相反;
- 每日奖励、日历、转盘和骰子无论当下开着什么活动都照领不误,因为领取它们不花任何 代价。
任务选择如何在活动和你的长期偏好之间权衡,见 任务、酒馆与远征;领取循环见 每日奖励与日历。