01
排布如何生成 · 种子推导(玩家甲 · 当前天)
纯函数,零状态,零 IO —— 下表随左上角时钟实时重算
推导链(真实 splitmix64,BigInt 逐位一致)
每天 0 点(CST)按 (GID, activity_id, dayIdx) 三元组 re-seed;段间隔 = hash-per-index 独立可算;
绝对时间链式累加。跨午夜尾窗由次日 spillback 回看 + 自然 floor(前一日链候选携带)保证 duration / 间隔不被午夜切碎。
02
三类玩家 · 三天排布时间轴
点击标尺跳转时间 · 横向滚动查看三天
自然雷雨(现算,不落盘)
道具雨(item_rains 落盘)
被顺延的自然雨(重放时自动后移)
好友列表所见基线(仅玩家甲第二行)
列表态 vs 实际 偏差带
三条泳道对每个 GID 都无条件存在——排布是数学对象,不需要登录、不需要 timer、不需要任何触发点。
玩家丙(从不登录)与玩家甲同样精确;玩家乙离线三周后重登,任何历史时刻同样可点查(dayIdx 按目标时刻寻址,非按 now)。
03
道具雨干扰 · 顺延与跨午夜
互斥:当前有任何雨时召唤瓶不可用
玩家甲 · WeatherState(唯一落盘物)
顺延不写任何字段:读时重放对每条 item_rain 施加
next = max(next, item_end + bufSec(gid,act,k)),
级联在前向重放中自动发生——没有被存储的排期列表可以被改坏。bufSec 走独立 tag 哈希流,不扰动自然间隔序列。
04
配置热更干扰 · 版本化 + dayIdx 天界门控(05 §14)
排布 = f(GID, dayIdx, cfg(dayIdx))——配置是入参,"何时生效"决定撕不撕裂
05
好友列表 ·「雷雨中」徽标(观察者视角)
徽标 = 纯 f(好友GID, now),零好友读、零 actor load
06
作物与闪电变异 · eager 烘焙 + 纯投影揭示 + 施肥移轴
集成模型 = eager(05 §16.9 已锁):种植时预判烘焙,揭晓不查天气
规则对齐源码与配表:主线作物 6 相位(种子/发芽/小叶/大叶/开花/成熟,Plant.json 158/175 株),
总时长四档 4h/8h/12h/24h,成长段平分(如蒲公英 24h = 5×17280s,成熟段 seconds=0);
相位 BeginTime 种植时定死(system_plant.go:214)。判定点 = 进入 发芽/小叶/大叶/开花 四个跨阶段点
(种子相位跳过 mutant.go:478;变异输入不含末相位成熟 system_plant.go:262)。
口径 A 点查语义:仅当跨阶段时间点整点处于雷雨中才判定一次——如种子 0-4 点、发芽 4-8 点,
只有 4:00 在雨中才判定;雨若下在 6:00-6:20(相位中段),不触发任何判定(规则而非漏报,05 §12.1;
中段雨在下方相位条里以半透明标出)。
施肥 = 化肥桶按秒计量,一次恰好跨一个相位:reduceSec = min(当前相位剩余, 桶余量)(system_fertilize.go:56),
后续相位 BeginTime 整体前移、已发生变异不取消(model.go:531,545);无机肥每株限次(gconfig MAX_INORG_FERT_TIEMS_NUM,演示限 4 次)。
揭示 = 纯投影(system_plant_reveal.go:10-51),已揭示相位锁定不回滚(mutant.go:1224)。
天气门 = 口径 A 点查 WeatherByTime(gid, BeginTime_k);施肥/用瓶后触发 gate-only 重算(prob_pending 保留,只翻门)——
E 的门是纯函数,任何新 BeginTime(含历史时刻)恒可答。
尚未种植。选一种成熟时长(4/8/12/24h),把时间调到某场雨前再种;观察四个跨阶段判定点是否落进雨窗,再试施肥把判定点整体前移。
07
双方如何拿到同一份排布 · 数据流
三条读路径共用同一确定性引擎(禁分叉,golden 冻结)
观 察 者 Pod(好友列表)
friend.SyncAll 批量拉好友
锁外查 info(Redis 镜像)· 既有链路
│ 对每个好友 GID(含从不登录)
徽标 = IsRaining(friendGID, now)
纯 CPU 演算 ~微秒级 · 零 actor load · 零 IO
└ 用过瓶好友 → 列表态基线(精确档进农场取)
(提案)info.FieldWeather 携带近 48h item_rains
先例 = info.FieldPlant 已镜像未来 ripe_time_sec;用瓶时 MarkFieldDirty · 事件驱动非读触发写 → 列表徽标含顺延/道具雨
owner Actor(自己 / 被访问)
种植 / 施肥 / 收获(InvokeLock 内)
WeatherByTime(gid, BeginTime_k) 纯算 → 烘焙 Phases[].Mutants
好友进农场:plant/visit SS → owner actor
锁内读 item_rains → 重放 → 精确天气 + 作物纯投影
使用召唤瓶(itemsys.Use · self-context)
AppendItemRain → markDirty(唯一写点)
存 储 / 基础设施
Tcaplus player 记录
WeatherState{ item_rains } 单字段 · 从不用瓶者零记录
timersvr
—— 不使用 ——
配置(Bottle 版本列表 + effective_from_day)
按 dayIdx 纯函数选版本 · 天界生效 · 不落盘(04 节可交互热更)
08
三优三劣 与 三个开放问题
优点
- 覆盖与徽标的结构性独占:任意 GID 任意时刻(历史/当下/未来)纯算可答——从不登录好友徽标、离线数周补算、种植问未来,全部零 actor load、零落盘。
- 零运行期基础设施:无 timer / 无续约孤儿治理 / 无水位线 GC;存储单字段,从不用瓶玩家整活动零写。
- 正确性可枚举可冻结:排布 = 纯函数 → golden 向量一次冻结全量回归;改时间测试零成本;跨 Pod 一致是构造性质。
缺点
- 冻结契约税:splitmix64 + 种子构造 + 日界 + buf tag 流成为跨 Pod/跨版本 bit 级契约;上线不可改,修 bug 只能按 activity_id 开新算法版本。
- 设计期复杂度高:spillback + 自然 floor 午夜缝、override 前向重放、config 版本化 + dayIdx 门控、多类型 K 路归并 + 饥饿建模,接手心智门槛高。
- 可观测与列表精度短板:离线排布无事件发射点(统计走解析式/日终重放);用过瓶好友列表态默认存在顺延偏差带——info 镜像携带 item_rains 提案(见 05 节开关)可消除,但引入 info/friend 两处协议改动与签字点。
就方案 E 还需要拍板的三个问题(详见 10_DE_REEVAL.md §4)
- E-Q1 排布函数的活动间演进机制:修 bug/换哈希只能按 activity_id 开新版本——"schedule 版本注册表"(activity_id→算法版本、golden 多版本归档、旧版保留期)要不要现在定?
- E-Q2 徽标计算落点与 info 镜像方案签字:评估结论=「info 镜像携带近 48h item_rains」是好方案(先例 FieldPlant、事件驱动写、搭车 BatchGetInfo 零额外读),但需拍:info.proto 加 FieldWeather + fieldTypeMapping(info owner 🟡)、GameFriend proto 加 weather 字段(含 end_ts 供客户端倒计时)、镜像条目窗口(48h)与 buf_sec 预算入镜像、活动结束镜像清理口径、MarkFieldDirty 秒级陈旧窗口可接受性。
- E-Q3 "同场特殊天气仅 1 次采集瓶"的场次身份:E 的雨窗无落盘实体无 ID,场次键只能是 (owner_gid, window_begin) 记访客侧——跨午夜 spill 窗归属、owner 顺延后 begin 变化导致键失配的规则未定义。
b-weather-rain-statemachine-260624 · weather-demo-E.html · 2026-07-02 · 算法与 05 §3.10/§7/§12/§14/§15、09 §2 逐条对齐(演示级简化:日界用整 86400,真实实现走 pkg/utils/time.go CST)