状态与数据
时间、离线、随机与倍速
正确区分游戏帧、现实时间、离线结算、随机来源和运行倍速。
状态与数据 · 时间
先定义时间语义,再选择特殊属性或脚本
“每分钟恢复”“每天刷新”和“离线获得”使用的时钟不同。没有写清时间来源和重复结算规则,最容易产生跨设备漏洞。
# 四种时间问题
| 需求 | 关注点 |
|---|---|
| 按游戏帧推进 | 默认运行节奏、暂停和倍速 |
| 按现实时间判断 | 毫秒时间戳、时区、客户端时间可信度 |
| 登录后的离线结算 | 最大离线时长、已自动结算部分、重复登录 |
| 临时延迟 | tools.delay(callback, ticks),刷新后失效 |
tools.delay 的单位是游戏帧,不是秒,也不进入存档。长期倒计时必须保存在属性中并由事件或明确操作推进。
# 特殊属性
编辑器可以添加与离线和倍速相关的特殊属性:
maxofflinetime:最大自动离线结算时长,按分钟配置。realofflinetime:扣除自动离线运行后剩余的真实离线时长。acctime:运行倍速;默认节奏约为每秒 5 帧,倍速会提高单位现实时间内的游戏帧数。- 当前时间类特殊值:以毫秒表示现实时间,用于时间窗口判断。
让 AI 使用特殊属性前,应先调用项目能力查询或添加入口,不能假设项目已经存在同名资源。
# 离线结算契约
离线收益:每 60 秒获得 1 木材。
最多自动结算 8 小时。
超过部分记录为真实离线时间,只用于一次登录奖励。
领取后写入已处理时间,重复进入不能再次领取。
倍速不影响现实时间活动截止时间。
离线重放期间会跳过不适合重复执行的异步调用。不要在离线循环中发送 AI、弱联网、聊天、云存档或客户端特效请求。
# 随机规则
帧随机值可以在一个帧周期内保持结果,纯随机值每次读取都可能变化。无论使用哪种方式,都要把“抽一次”与“显示结果”分开:先在行为脚本中抽取并保存结果,再由页面读取。不要在渲染脚本或动态字符串脚本里反复随机,否则一次页面刷新就会改变结果。
随机奖励还应定义:
- 概率还是权重。
- 空奖是否允许。
- 结果数量上下限。
- 是否需要保底或去重。
- 失败、重试和快速点击是否会重复抽取。
客户端随机不能作为付费、安全或反作弊校验的唯一依据。
# 现实时间边界
涉及每日奖励、活动截止和冷却时,明确时区和权威时间来源。客户端当前时间可以被修改,不适合高价值结算;平台活动与付费应使用后端能力。
# 两种模式各自怎样实现
| 工作项 | 纯 AI 模式 | 传统模式 |
|---|---|---|
| 定义时钟 | 在任务合同中写清秒/帧/现实时间、时区和权威来源 | 选择并记录准确的特殊/普通属性与事件字段 |
| 在线周期 | 要求 AI 保留唯一结算所有者并查询现有规则 | 检查自动增长、事件和脚本是否重复 |
| 离线补算 | 要求上限、已处理标记和排除的异步工作 | 手动配置离线字段并验证事件/脚本重放 |
| 随机结果 | 要求动作时只随机一次并保存结果 | 把随机放在所属动作脚本,不能放展示字段 |
| 验证 | 让 AI 生成边界样例,再由作者执行 | 为每个边界制作测试存档并检查前后状态 |
两种模式必须产出同一份运行时合同。切换工作台不能引入第二套时钟、第二条离线奖励路径或渲染时随机。
# 验收
- 正常在线、短离线、超过上限离线都得到预期结果。
- 同一存档重复打开不会再次领取已结算收益。
- 倍速只影响游戏帧系统,不改变现实活动截止时间。
- 页面重复渲染不会重新随机。
- 异步能力不会在离线重放中批量触发。
- 客户端时间前后调整时,高价值奖励没有可利用路径。