01 · 单局执行总览
十四步执行顺序,硬限制检查引用最终否决优先级
flowchart TD
s1["① 接收请求:校验会话 / 下注档 / 局编号 / 熔断准入"]
s2["② 冻结本局配置版本、实际身份、生效身份、发展阶段、免费链上下文"]
s3["③ 计算特殊玩法基础概率、未触发计数、连输链、新手体验保证、防跳注状态"]
s4{"④ 按优先级依次抽样:免费旋转 → 奖励玩法 → 大奖池 首中即停止后续抽样"}
s5["⑤ 未命中特殊玩法时,检查梯度下注强制零赔付"]
s6["⑥ 基础玩法结算:结果库身份取预计算结果库 / 重度身份取真实卷轴随机"]
s7["⑦ 真实卷轴专属链:上局>30倍 → 近20局纠偏 → 近100局纠偏 → 身份默认卷轴 再叠加充值 / 下注变化倾向"]
s8["⑧ 若候选为零赔付,最多执行一次连输递增重抽"]
s9["⑨ 仍为零赔付时,依次判定破产保护 / 用户输钱保护 命中一项后不再判定另一项"]
s10{"⑩ 硬限制与资金检查:身份RTP、净盈利上限、平台周期硬保护、奖池余额"}
s11["⑪ 候选被拒:按配置次数重新生成候选;仍无合法结果则提交零赔付回退"]
s12["⑫ 原子提交:下注、手续费、奖池变化、派奖、余额、统计、决策记录"]
s13["⑬ 若最终为零赔付且满足连续输条件,按近失预算 50% 概率仅替换玩家看到的展示盘面 不改变权威结果"]
s14(["⑭ 前端停轴展示,盘面只能来自服务端"])
veto[["最终否决优先级(任何体验机制不可突破): 1 会话与配置版本有效 2 游戏未处于二/三级停运 3 用户RTP不超身份硬上限 4 净盈利不超身份硬上限 5 平台周期RTP/盈利目标未被突破 6 奖池余额充足,不挪用其他免费链预留 7 结算前后金币守恒,同局只提交一次"]]
s1 --> s2 --> s3 --> s4
s4 -->|"命中特殊玩法"| s10
s4 -->|"全部未命中"| s5 --> s6 --> s7 --> s8 --> s9 --> s10
s10 -->|"通过"| s12
s10 -->|"拒绝"| s11 --> s10
s12 --> s13 --> s14
s10 -.->|"引用"| veto
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
这十四步与七条否决优先级是当前口径下单局结算的完整顺序,从接收请求到前端停轴逐步展开。
触发事故的那一局在第⑫步就已经原子提交并返回给玩家;熔断(图七)是提交之后的独立判定,不回滚已完成的这一局。第⑬步只替换玩家看到的画面,不产生任何金币,权威结果在第⑫步已经确定。
02 · 用户分层与身份
身份来源优先级 + 普通 / 大R 两条独立发展轨道
flowchart TD
src0["身份来源优先级(从高到低)"] --> src1["① 人工演示选择"] --> src2["② 未来外部身份接口注入"] --> src3["③ 自然发展阶段:按累计付费局或累计下注,先达到者生效"]
subgraph ord["普通价值轨道"]
direction TB
n1["新用户 RTP≤120% · 净盈利上限10万 预计算结果库"]
n2["普通用户 RTP≤97% · 净盈利上限0 预计算结果库"]
n3["普通重度用户 RTP≤97.5% · 净盈利上限0 真实卷轴随机"]
n1 -->|"累计50付费局 或 累计下注5000,先达到"| n2
n2 -->|"累计300付费局 或 累计下注50000,先达到"| n3
end
subgraph vip["大R价值轨道"]
direction TB
h1["大R新用户 RTP≤105% · 净盈利上限100万 预计算结果库"]
h2["大R用户 RTP≤98% · 净盈利上限0 预计算结果库"]
h3["大R重度用户 RTP≤99% · 净盈利上限0 真实卷轴随机"]
h1 -->|"同发展阶段条件"| h2 --> h3
end
src3 -.-> ord
src3 -.-> vip
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
公式
RTP = 累计派奖金币 ÷ 累计下注金币
账户净盈利 = 累计派奖金币 − 累计下注金币
已确认规则 六类身份、身份来源优先级(人工选择 > 外部输入 > 自然发展阶段)、"先达到者生效"的判定逻辑、大R用户使用预计算结果库(只有两类"重度"身份使用真实卷轴)。
普通价值与大R价值是两条平行轨道:大R新用户不会"发展"成普通用户,两条轨道各自应用相同形状的发展阶段条件。免费旋转链进行期间,触发局的身份被冻结,不会在链中途切换。
03 · 卷轴选择与中奖率纠偏
卷轴优先级链:大赢恢复 → 20局纠偏 → 100局纠偏 → 身份默认(仅适用于真实卷轴身份)
flowchart TD
s0(["真实卷轴身份进入基础玩法"]) --> c1{"上一局倍率 > 30倍?"}
c1 -->|"是"| high["选择:高中奖率卷轴(最高优先级)"]
c1 -->|"否"| c2{"最近20个付费局 中奖率 < 50%?"}
c2 -->|"是"| high
c2 -->|"否"| c3{"最近100个付费局 中奖率偏离中卷轴目标 > 10个百分点?"}
c3 -->|"偏高"| low["选择:低中奖率卷轴"]
c3 -->|"偏低"| high
c3 -->|"未偏离"| deftier["选择:身份默认卷轴(通常为中卷轴)"]
high --> bias["叠加:充值保护 / 下注变化保护 可进一步按独立概率倾向高卷轴"]
low --> bias
deftier --> bias
bias --> spin["随机停点 → 公开赔率表结算"]
spin --> zero{"结算结果 = 零赔付?"}
zero -->|"否"| out(["候选结果"])
zero -->|"是,且连续零赔付≥2局"| retry["额外重抽:10%起始概率,之后每局+10个百分点,封顶100% 每付费局最多重抽一次"]
zero -->|"是,未满足连续条件"| out
retry --> out
note1[["三档卷轴参考中奖率:高≈50% / 中≈35% / 低≈15% 各档允许上下浮动约10个百分点,但须保持梯度 高中奖率卷轴显著抑制 >50倍 派奖"]]
bias -.-> note1
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
公式
纠偏判定:|实际中奖率 − 中卷轴目标中奖率| > 10个百分点
连续零赔付重抽概率:p(n) = min(100%, 10% + 10%×(n−2)),n为当前连续零赔付局数,n≥2起生效,每局至多重抽一次
已确认规则 优先级固定为:上一局>30倍 > 最近20局纠偏 > 最近100局纠偏 > 身份默认卷轴;充值和下注变化保护只能在这条链之后再叠加倾向,不能跳到最前面。
三档卷轴的参考中奖率是设计目标区间,不是某一次具体运行必然落在的精确值;高中奖率卷轴对>50倍派奖有显著抑制,避免高卷轴反而放大大额赔付。
04 · 特殊玩法概率与 Jackpot 展示
特殊玩法独立抽样 + 未触发递增 + 新用户前10局体验保证
flowchart TD
p0["本局:按生效身份读取 Free Spin / Bonus / Jackpot 各自独立基础概率"] --> p1{"有效概率 = 基础概率 ÷ (1 − 未触发局数 × 基础概率)"}
p1 -.-> pnote[["每次未触发后概率按此式递增,命中后未触发局数归零 连输提升(关联全局连续零赔付)仍是独立待定项,尚未叠加进此式"]]
p1 --> g{"是否为新用户/大R新用户 且处于前10个合格绑定档付费局窗口?"}
g -->|"第1–9局:自然触发即完成窗口"| draw["按优先级独立抽样:Free Spin → Bonus → Jackpot 首个命中即停止后续抽样"]
g -->|"窗口已完成 / 非绑定档局"| draw
g -->|"第10局起仍未中:due / overdue"| force["强制尝试选定一个 Free Spin / Bonus 目标(Jackpot 不作为强制目标) 该目标有效概率覆盖为1"]
force --> guard{"是否通过硬限制与资金检查?"}
guard -->|"通过"| hit(["特殊玩法命中"])
guard -->|"被拒"| overdue["窗口保持/进入 overdue,不计入完成 下一个合格付费局继续尝试"]
draw --> hit2{"任一玩法命中?"}
hit2 -->|"是"| hit
hit2 -->|"否"| base(["转入基础玩法(图三 / 图一 ⑤起)"])
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
Jackpot:真实奖池与模拟展示值彻底隔离
flowchart LR
bet["玩家下注"] --> real1["真实奖池 authoritativePool 参与资金检查 / 账务 / 守恒 / 事故检测"]
bet -. 不影响 .-> fake1["展示池 presentationPool 512个预排模拟事件,每10秒一个tick"]
fake1 --> fakeGrow["按当前真实入池口径模拟增长 每个事件1–20个模拟用户,最小+1"]
fakeGrow --> fakeCut{"1%概率模拟扣减 或 展示值 > 真实值×1.5?"}
fakeCut -->|"是"| fakeDeduct["模拟扣减:扣减额 = 模拟中奖下注 ÷ 最大下注 × 当前展示值"]
fakeCut -->|"否"| fakeGrow
hitReal["某局真实提交 Jackpot 命中"] --> swap["切换 actual_settlement 模式 展示赔付前的真实池快照"]
real1 -.->|"唯一交汇点:真实命中时"| swap
swap --> settle["派彩揭晓:展示值同步为赔付后真实值"]
settle --> resume["下一个tick恢复 simulated 模式"]
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
公式
有效概率(第n+1次尝试) = 基础概率 ÷ (1 − n × 基础概率),n为该玩法已连续未触发局数,命中后归零
直观等价算法:基础概率为 1/D 时,每次未触发后分母减1,即 1/D → 1/(D−1) → 1/(D−2) → … → 1/1(第D次必然触发)
该递增方式保证:连续尝试N次后至少触发一次的累计概率 = N × 基础概率(线性增长,N=D时恰好=100%)
为避免基础概率非精确整除时越界,实际取 min(1, 基础概率 ÷ (1 − n × 基础概率))
Jackpot模拟扣减额 = 模拟中奖下注 ÷ 最大下注 × 当前展示值
已确认规则 未触发递增:每次未触发后,有效概率按"分母递减"方式提升(例如基础概率 1/1000,未中一次后变 1/999,再未中变 1/998……),命中后计数归零重新起算。这个算法的优点是可以证明:连续 N 局仍未触发的概率恰好线性下降,不会出现"临近上限却迟迟不中"的失真。
连输提升(与全局连续零赔付挂钩的额外加成,区别于"该玩法自身未触发局数")仍是独立待定项,尚未叠加进上面的公式,需要你另行确认是否保留、以及叠加方式。
已确认规则 新用户体验保证:窗口按"已提交的合格绑定档付费局数"计数(不是墙钟时间),第10局起强制尝试而非无条件必中,被拒时顺延到下一局继续尝试。
已确认规则 Jackpot假数字:512个预生成有序事件、每10秒一个节拍、1%概率或展示值超真实值1.5倍时触发模拟扣减,全过程不接触真实奖池,只有真正命中的那一局才切到真实结算快照。
05 · 资金与奖池流转
下注 → 手续费 → 奖池分配 → 新手超额赔付
flowchart TD
bet["玩家付费下注金额"] --> fee["扣除0.5%手续费 累计统计,不参与随机概率判定"]
fee --> pool["剩余进入总奖金池体系"]
pool --> nb["按1%分配 → 新手保护池(上限200万)"]
pool --> bp["按0.5%分配 → 破产保护池(上限50万)"]
pool --> sf["按各玩法配置比例分配 → 特殊玩法池 比例由95%数学贡献目标与手续费反推"]
nb -.->|"达到上限"| nbcap["停止继续分配,维持在上限"]
bp -.->|"达到上限"| bpcap["停止继续分配,维持在上限"]
win["新用户获得中奖结算"] --> chk{"本次赔付是否超出 该用户自身RTP 100%的部分?"}
chk -->|"是"| draw2{"新手保护池余额 是否足够覆盖超出部分?"}
draw2 -->|"足够"| pay["由新手保护池承担超出部分"]
draw2 -->|"不足"| retry2["该次中奖重新随机候选"]
chk -->|"否"| normalpay["正常从奖池扣付,不涉及新手池"]
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
公式
手续费 = 下注金额 × 0.5%
新手保护池分配 = 入池金额 × 1%(上限200万)
破产保护池分配 = 入池金额 × 0.5%(上限50万)
数学贡献目标:总RTP 95% = 基础玩法60% + 免费旋转25% + 奖励玩法9% + 大奖池1%
已确认规则 手续费与两个保护池的分配比例、上限,以及新手保护池对新用户超额赔付的兜底与重新随机。
规则里只描述了破产保护池的累计与上限,没有明确写出它是否直接为破产保护的替换赔付出资——破产保护实际生效方式是图六的"结果替换为预生成盘面",这两者在规则里没有被显式连接,为避免编造一条资金流向,如实标注在此。
06 · 用户保护机制总览
破产 / 输钱保护判定顺序 + 五项独立触发型保护
flowchart TD
cand["零赔付候选结果"] --> pr1{"破产保护:结算后余额 < 当前下注×3? 且当日次数未耗尽(默认3–10次/身份)"}
pr1 -->|"是"| sub1["替换为预生成 1–5倍 中奖盘面 命中后不再判定输钱保护"]
pr1 -->|"否"| pr2{"用户输钱保护:自定义周期内 RTP或绝对亏损是否跌破该身份下限?"}
pr2 -->|"是"| sub2["替换为预生成 5–20倍 中奖盘面"]
pr2 -->|"否"| final["维持零赔付"]
ret["会话空闲 > 24小时"] -.-> retp["回归保护:接下来10–20个付费局 按同价值层级新用户策略执行 免费旋转链期间不切换"]
dep["1小时内充值达到10/20/50/100美元档位"] -.-> depp["充值保护:提高中奖行为 结果库身份提高命中概率 / 真实卷轴身份提高选高卷轴概率"]
bet1["连续提高下注达到配置次数(默认3次)"] -.-> ladder{"再次提高下注?"}
ladder -->|"是"| forcezero["本局强制零赔付 特殊玩法优先于此规则"]
hop["同一下注档反复出现的低注/高注切换"] -.-> antihop["防跳注:按下注档×生效身份独立动态桶 最近29局加权,当前下注>加权均值2倍时抑制动态优惠"]
betchg["本局下注 ≠ 上一局下注 且未触发梯度下注必输"] --> betchgcalc["变化差距系数 = │本局下注 − 上一局下注│ ÷ 上一局下注"]
betchgcalc --> betchgwin["开启提升窗口:影响局数 N = round(20 × 变化差距系数) 建议封顶100局(可调)"]
betchgwin --> betchgeffect["窗口内:结果库身份提高中奖候选命中概率 / 真实卷轴身份提高选高卷轴概率 新窗口覆盖旧窗口,不叠加倍数"]
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
公式
破产保护触发:结算后余额 < 当前下注 × 3
防跳注抑制条件:当前下注 > 2 × 最近29局线性加权平均下注(至少5个样本)
变化差距系数 = │本局下注 − 上一局下注│ ÷ 上一局下注
下注变化保护影响局数 N = round(20 × 变化差距系数),建议封顶100局
已确认规则 破产保护(3倍下注危险线)、输钱保护(5–20倍替换盘面)、回归保护(10–20局新用户策略)、充值保护(四档)、梯度下注必输(连续3次)、防跳注(29局线性加权、严格大于2倍)。
已确认规则 下注变化保护:升注或降注(只要没有先触发梯度必输)都会按"变化差距系数"开启一个持续 N 局的中奖率提升窗口,升降方向不影响判定,窗口内提升手段与充值保护一致(结果库身份提高命中概率,真实卷轴身份提高选高卷轴概率);同类事件不叠加,以最新一次覆盖旧窗口。封顶局数(100局)是建议默认值,可按需调整。
参数待定 回归、充值、下注变化三种提升同时出现时的最终叠加规则尚未定案(谁优先、能否叠加)。
07 · 平台硬保护与三级熔断
新请求判定顺序 → 六类监控 → 事故分级 → 显式恢复
flowchart TD
req["新的玩家变更请求:旋转 / 充值 / 身份变更 / 时钟变更等"] --> chk1{"该spinId是否已有保留结算?"}
chk1 -->|"是"| replay["直接返回原结算,不重新抽样、不重复扣款"]
chk1 -->|"否"| chk2{"平台或该游戏的熔断是否已锁存?"}
chk2 -->|"L2/L3已开启"| reject["拒绝请求:GAME_CIRCUIT_OPEN 或 PLATFORM_CIRCUIT_OPEN(HTTP 503)"]
chk2 -->|"未开启"| proceed["正常执行Slot决策与平台硬保护(见图一 ⑩)"]
proceed --> commit["原子提交结算"]
commit --> monitor["结算后运行六类熔断监控"]
monitor --> m1["platform_guard_rtp 平台周期RTP超Guard上限"]
monitor --> m2["session_profile_rtp 会话RTP超身份上限"]
monitor --> m3["session_profile_net_profit 净盈利超身份上限"]
monitor --> m4["pool_balance_floor 奖池余额低于下限"]
monitor --> m5["pool_balance_cap 奖池余额高于上限"]
monitor --> m6["state_non_finite 关键账务状态非有限数"]
m1 --> breach{"连续突破次数达到规则阈值?"}
m2 --> breach
m3 --> breach
m4 --> breach
m5 --> breach
m6 --> breach
breach -->|"是"| incident["创建 / 更新事故"]
breach -->|"否"| clear["清零该指纹连续突破计数"]
incident --> lvl{"事故等级"}
lvl -->|"L1"| notify["触发通知:邮件 / 机器人等外部提醒,游戏继续受理"]
lvl -->|"L2"| suspend1["下架该游戏:锁存受理关闭,下一次新请求起拒绝"]
lvl -->|"L3"| suspend2["下架全平台:锁存受理关闭,覆盖同监督器全部游戏"]
suspend1 --> ack["运营确认事故(ack)"]
suspend2 --> ack
ack --> recheck["显式恢复请求:基于当前权威状态做一次只读健康复查"]
recheck --> healthy{"全部相关条件已恢复健康?"}
healthy -->|"是"| reopen["解除锁存,恢复受理"]
healthy -->|"否"| staylock["维持锁存,拒绝本次恢复"]
滚轮缩放 · 拖拽平移 · 双击重置 重置视图
定义
事故指纹 = gameId + ruleId + monitor + scope + scopeKey(同一指纹只保留一个进行中的事故)
已确认规则 L1 = 触发通知(邮件、机器人等外部提醒),游戏继续受理;L2 = 下架该游戏,停止受理新请求;L3 = 下架平台全部游戏,全平台停止受理。六类监控、连续突破计数、确认+只读健康复查后才能显式恢复。
关键边界:触发事故的那一局在熔断判定之前就已经原子提交并正常返回给玩家,熔断不会回滚它;平台硬保护(图一⑩)在结算前拒绝违规候选,是独立于本图的另一道防线。