用途
该技能把设计意图转化为具体的实现约束。它位于游戏设计与引擎特定编码之间:将“连打应比有节奏地操作更差”这类陈述,转换为不变量、实现模式和验证检查,可在任何引擎中应用。
即使没有设计一键游戏,只要游戏规格包含风险/回报的文字描述,却没有说明代码如何强制执行,也可以使用本技能。
如果游戏还没有设计规格,一键类需求请先使用 designing-one-button-games,多输入类需求请先使用 designing-mini-games。
何时使用
- 根据设计规格或 README 实现某个游戏机制。
- 在运行平衡测试前,对照设计规格审查代码。
- 检查器或模拟显示 mono_dominant、tied 或重复输入占优,且你已知道哪条设计承诺需要代码级不变量。
- 设计提到空闲弱势、仅按住弱势、连打弱势、安全等待、冷却、连击、计分脉冲、护盾、充能或无敌。
- 实现是引擎特定的,但失败模式是规则层面的,而非 API 层面的。
何时不使用
- 纯渲染、资源、UI、音频、构建或引擎 API 工作。
- 规则级不变量已经强制执行后的数值调优。
- 核心规则和计分事件尚未确定前的开放式游戏设计。
- 根据遥测选择平衡修复策略。当已发生失败并需要诊断原因或选择平衡模式时,先使用 evaluating-gameplay-balance;之后当所选修复需要新的代码级不变量时,再使用本技能。
必需输入
- 设计规格或 README。
- 必须比熟练操作更差的输入策略:空闲、仅按住、连打、一直左/右、交替连按、安全等待或等价策略。
- 预期的熟练操作模式。
- 计分事件、游戏结束条件,以及任何安全/能力状态。
- 项目检查器使用的任何确定性验证种子或已知初始随机序列。
- 可选的遥测或检查器输出。
过程
-
提取每条必须在代码中成立的设计承诺:
- “空闲是弱势的”
- “仅按住是弱势的”
- “连打是弱势的”
- “分数来自时机”
- “护盾安全但有代价”
- “落地/脉冲/反弹奖励精准”
-
将每条承诺改写为不变量:
- 使用可测试的语言:“与上一次点击相隔 12 帧内的点击不能得分”,而不是“连打不好”。
- 包含作用域:每次输入、每个目标、每个危险物、每次落地、每个连击、每秒或每个资源单位。
- 包含后果:不得分、冷却、暴露、资源消耗、连击重置、瞄准失误或可见的位置代价。
- 当计分对象可以跨帧或跨输入持续存在时,明确定义其生命周期:生成/开始、有效计分窗口、已计分/已消耗状态、过期/移除,以及新的生命周期是否可以再次计分。
- 对于重复脉冲、反弹、AoE、护盾或释放计分,在验证日志中尽可能要求每次机会的身份标识(targetId、pulseId 或等价物),以便检测重复计分。
-
当机制可以从规格推理时,在编码前运行策略特定的预检查:
- 对每个不良策略,写明它应该死亡、安全超时,还是以受限分数存活。
- 如果不良策略可以无限存活,不变量必须限制或饿死其分数;死亡不能成为其弱点。
- 如果随机初始危险物、间隙、生成或路线影响生存能力,预览项目的确定性验证种子,并确认前 5-10 个结果符合不变量假设。
-
如需要,从 references/invariant-patterns.md 选择实现模式。
-
检查计分漏洞:
- 没有按输入直接给原始分数。
- 没有可重复使用的脉冲,在没有新危险物/机会的情况下反复计分。
- 除非生存是主要精通信号,否则玩家处于安全/低技能状态时没有生存计分。
- 没有无上限计分的永久安全状态。
- 没有长期存活的已计分对象仍可未来计分,除非其生命周期明显重置。
- 对连打修复,不能只验证总分;当机制可以重复计分同一对象时,还要比较每个唯一机会或唯一目标的分数。
-
添加或审查实现:
- 引擎特定代码属于引擎技能或项目代码。
- 本技能定义必须成立的条件,而非确切的渲染或 API 调用。
-
验证:
- 运行可用的单调策略和探索/熟练策略。
- 在完整全局比率检查之前,优先使用不变量特定的探针:NoInput 分数/死亡、HoldOnly 分数/死亡、SpamPress 计分事件、实体数量、资源消耗和每机会分数上限。
- 对于脉冲/反弹/AoE 修复,记录接受/拒绝的输入、脉冲年龄或冷却状态、目标/机会 id、已计分状态、分数增量和最大活跃实体数。
- 尽可能在编辑前定义探针的通过/失败界限,例如 SpamPress 每唯一目标分数低于脚本化熟练循环、HoldOnly 分数上限低于规定速率,或最大活跃实体低于固定限制。
- 确认已知不良策略得分低于熟练操作。
- 如果没有模拟器,写一份简短的人类可读验证清单,并标记该缺口。
不变量模板
在规格、PR 说明或代码审查中使用此紧凑形式:
- 设计承诺:<规格中的文字>
- 实现不变量:<可测试规则>
- 模式:<references/invariant-patterns.md 中的模式 ID,例如 cooldown、per-target-cap、resource-drain>
- 预检查:<不良策略是死亡、安全存活,还是必须限制分数>
- 验证:<策略、遥测或种子场景,若违反不变量应失败>
常见失败模式
- 仅文字弱势:README 说连打不好,但代码给每次点击都提供计分机会。
- 可重复使用的计分脉冲:落地、护盾、AoE 或反弹脉冲可以通过重复输入多次计分。
- 安全计分:最安全的状态也能得分或保留倍率。
- 隐藏测试补丁:代码特殊处理不良策略,而不是创建可见的游戏规则。
- 仅数值修复:改变生成率或分数值,却没有强制执行缺失的不变量。
- 无界实体:计分或危险物对象存活过久,导致验证缓慢和连打计分循环。
- 种子特定意外:验证种子产生早期危险物/间隙,违反设计假设,问题只在完整 GA 运行后才发现。
验证
当以下条件满足时,变更有效:
- 每条设计承诺至少有一个实现不变量。
- 每个单调策略都有可见代价或分数上限。
- 任何无限存活的单调策略都有计分上限或分数饿死规则。
- 当随机初始危险物或间隙决定生存能力时,已检查种子化早期随机序列。
- 熟练操作有因果路径获得更高分数或更长的有意义生存。
- 实现可以通过策略比较、遥测或具体手动清单进行测试。
- 如果无法验证,报告不变量已指定但未验证。
参考
- references/invariant-patterns.md — 用于连打、仅按住、空闲、安全等待、脉冲计分、连击和资源状态的可复用模式。