Theseus 模组文档
API 参考 / judge 包:判定管线

JudgmentWindowSynthesizer


判定窗口合成器:在「多策略逐字段取最大」之后,对合并结果做一次协商式改造,可表达收紧、非对称提前/延后窗口、按模式分档等 max 合并无法表达的策略。在 onPreInit 内经 ctx.registries().judgmentWindowSynthesizers() 注册,多个合成器按注册顺序链式应用,前一个的输出作为后一个的输入。

方法速览

方法用途
synthesize(JudgmentPolicy, List<JudgmentPolicy>)基于当前合并结果与来源策略,产出新的窗口策略

完整签名

java
public interface JudgmentWindowSynthesizer {

    JudgmentPolicy synthesize(JudgmentPolicy merged, List<JudgmentPolicy> inputs);
}

synthesize(JudgmentPolicy merged, List inputs)

签名:

java
JudgmentPolicy synthesize(JudgmentPolicy merged, List<JudgmentPolicy> inputs);

行为:merged 是当前合成结果——首轮为全部非内置策略逐字段取最大后的策略;没有任何模组策略时为内置默认策略 seecmd:default(70/150/150/150/50)。inputs 是参与首轮最大合并的原始策略的不可变拷贝(按注册顺序,可能为空——此时 merged 为内置默认、inputs 为空列表)。

宿主在每局装配时执行一次(GameplayModHost 构造期),结果整局生效,不随帧或判定重复调用。注册表为空时取最大结果原样生效(恒等,与旧行为逐字节一致)。

返回 null 表示跳过本合成器:宿主限频告警,当前结果继续传给后续合成器,绝不采纳空结果。抛异常同样被隔离跳过,不影响其它合成器与默认行为。

确定性契约(同款,强制):synthesize 必须是纯函数——禁随机、禁墙钟、禁网络等不可重演输入;同一输入必须产出同一窗口(倒带重演与多帧率一致性依赖于此)。返回的策略会被整局反复读取,不要返回随时间或外部状态变化的实现。

示例(把合并后的 PERFECT / GREAT 窗口各收窄 25%,其余保持):

java
@Override
public void onPreInit(ModContext ctx) {
    ctx.registries().judgmentWindowSynthesizers().register(
            RegistryKey.of("my_mod", "shrink", JudgmentWindowSynthesizer.class),
            (merged, inputs) -> new JudgmentPolicy() {
                @Override public long perfectWindowMs() {
                    return Math.max(1L, merged.perfectWindowMs() * 3L / 4L);
                }
                @Override public long greatWindowMs() {
                    return Math.max(1L, merged.greatWindowMs() * 3L / 4L);
                }
                @Override public long missWindowMs() { return merged.missWindowMs(); }
                @Override public long holdEndWindowMs() { return merged.holdEndWindowMs(); }
                @Override public long lateCutoffMs() { return merged.lateCutoffMs(); }
            });
}

线程:宿主在每局装配期(游玩场景创建时、游戏/渲染线程)同步调用一次;不要从其它线程调用,也不要在合成器里做阻塞工作。

生命周期阶段:onPreInit 注册;装配冻结后永久生效(重启进程才能变更)。

稳定性: 新增;2.x 内只增不破。