## VERTICAL SLICE - NOT FOR PRODUCTION ## 敌人技能摇号器:可摇条目+随机子流 → skill_id,权重份额归一(垂直切片验证:敌方行动可归因)。 ## 不碰血量/表/容器——过滤与冷却由调用方注入确定值;随机只消费传入子流,本类零自建随机源。 class_name SkillLottery extends RefCounted # 权重摇号(整数份额,行序累计走查——同份额前行优先,确定性);entries = [{skill_id, weight}](非空) static func draw(entries: Array, stream: RandomNumberGenerator) -> String: assert(not entries.is_empty(), "[技能摇号] 空可摇集合(普攻冷却恒 0 → 池恒非空——结构违例即致命)") var total := 0 for e in entries: var w: int = int(e.get("weight", 0)) assert(w > 0, "[技能摇号] 池条目权重须 > 0: %s" % str(e)) total += w assert(total > 0, "[技能摇号] 可摇权重合计为 0") var r: int = stream.randi_range(1, total) var acc := 0 for e in entries: acc += int(e.weight) if r <= acc: return String(e.skill_id) return String(entries[entries.size() - 1].skill_id) # 数值防御分支(不可达——r ≤ total 恒有落点)