TP0令牌池落地(迭代12条件卡——node-reward v2.2追认b实施批):三选一池改固定配额令牌池70/25/3=98张(罕见档道具件2席随aux池种退役收窄=台账自决披露项;schema validate结构锚硬断言)+抽签Fisher-Yates同kind去重+选中踢池未选回池+池耗即枯竭+种类次数上限退役+恢复件+6新入池rare档+数值对全落;MC策略316-f落地(autoplay 1级最稀有/2级最左_pick_token单点);货架=令牌级抽签价格tier-blind维持批②裁定+消费在架令牌本体;断点扩键bonus_deck余库逐枚还原(旧断点缺键=满库重建防御单版本周期);跨表校验⑥改令牌配额检查;文档四正主=node-reward v2.4+冒险结构v0.14+registry+06落地状态;normal档重锚runsum_m4iter12_tp0_n20_20261003(seed0=90000配对读数同带0/5/0零结构位移+316-f构成佐证)——闸=冒烟670/0三闸+run_all 15套+探针五绿click存量红零新增+doc三闸零新增+熵增PASS

This commit is contained in:
DKChan committed 2026-10-04 00:17:39 +08:00
1 parent cc34531048
commit fd6a8325f0
14 files changed
+525 -303

No files matched your search

+17 -9
View File
@@ -92,18 +92,26 @@ static func bonus_pick_header(payload: Dictionary) -> String:
return "\n".join(lines)
# 三选一选项卡文案(件名 + 效果读数;值 = 冒险表行值,组合根喂入;道具件掷定前置时
# aux_line = 具体道具「名 · 效果摘要」行——追加批二,空 = 无预掷回退通用文案)
static func bonus_card_text(id: String, value: int, aux_line: String = "") -> String:
# 三选一选项卡文案(件名 + 档位 + 效果读数;值 = 冒险表行值,组合根喂入;TP0 令牌池——档位词
# 对齐 v2.2 追认 b 口径:小/大前缀(小GP/大GP 族)、恢复/AP 不带档位词;道具件掷定前置时
# aux_line = 具体道具「名 · 效果摘要」行——池种退役后恒空走通用分支,机械惰性保留)
static func bonus_card_text(id: String, tier: String, value: int, aux_line: String = "") -> String:
var ts := ""
if tier == "common":
ts = " · 小"
elif tier == "rare":
ts = " · 大"
match id:
"attack":
return "攻击力提升\n攻击 +%d" % value
return "攻击力提升%s\n攻击 +%d" % [ts, value]
"max_hp":
return "生命上限提升\n生命上限 +%d" % value
return "生命上限提升%s\n生命上限 +%d" % [ts, value]
"armor":
return "护甲等级提升\n护甲 +%d" % value
return "护甲等级提升%s\n护甲 +%d" % [ts, value]
"gp":
return "金币袋\n金币 +%d" % value
return "金币袋%s\n金币 +%d" % [ts, value]
"heal":
return "恢复药剂\n生命 +%d(当即回复)" % value
"aux_item":
if aux_line != "":
return "魔法道具\n%s" % aux_line
@@ -113,9 +121,9 @@ static func bonus_card_text(id: String, value: int, aux_line: String = "") -> St
return id
# 三选一兑付反馈行(选中件效果 + 丢弃提示)
# 三选一兑付反馈行(选中件效果 + 丢弃提示;tier 缺省普通档——旧载荷防御口径)
static func bonus_result_text(result: Dictionary) -> String:
var name := bonus_card_text(String(result.get("picked", "")), int(result.get("value", 0))).replace("\n", " · ")
var name := bonus_card_text(String(result.get("picked", "")), String(result.get("tier", "")), int(result.get("value", 0))).replace("\n", " · ")
return "已选择:%s\n其余选项已丢弃(不可反悔)" % name
+14 -6
View File
@@ -542,17 +542,21 @@ var _last_replace_incoming := {} # 同上——incoming 记录
func _bonus_card_texts(candidates: Array, aux_detail: Array = []) -> Array:
# TP0 令牌池——候选 = {"kind","tier"} 令牌字典;卡片 id = "kind|tier" 复合键(同 kind 大小两档
# 可同屏,kind 单键不构成唯一身份),确认回程拆键(_on_bonus_pick_confirmed)
var out: Array = []
var aux_i := 0
for id in candidates:
var cid := String(id)
for tok in candidates:
var kind := String((tok as Dictionary).get("kind", ""))
var tier := String((tok as Dictionary).get("tier", ""))
var cid := "%s|%s" % [kind, tier]
var text := ""
if cid == "aux_item":
if kind == "aux_item":
var iid := String(aux_detail[aux_i]) if aux_i < aux_detail.size() else ""
aux_i += 1
text = Narrator.bonus_card_text(cid, int(db.adventure.bonus_value(cid)), _aux_card_line(iid))
text = Narrator.bonus_card_text(kind, tier, int(db.adventure.bonus_value(kind, tier)), _aux_card_line(iid))
else:
text = Narrator.bonus_card_text(cid, int(db.adventure.bonus_value(cid)))
text = Narrator.bonus_card_text(kind, tier, int(db.adventure.bonus_value(kind, tier)))
out.append({"id": cid, "text": text})
return out
@@ -596,7 +600,11 @@ func _on_bonus_refresh() -> void:
func _on_bonus_pick_confirmed(item_id: String) -> void:
if adventure == null:
return
var ok: bool = adventure.apply_node_bonus(item_id) if _bonus_context == "reward_node" else adventure.pick_bonus(item_id)
# TP0 令牌池——卡片 id "kind|tier" 拆键(缺 | = 旧载荷防御归普通档)
var parts := item_id.split("|")
var kind := parts[0]
var tier := parts[1] if parts.size() > 1 else ""
var ok: bool = adventure.apply_node_bonus(kind, tier) if _bonus_context == "reward_node" else adventure.pick_bonus(kind, tier)
if not ok:
push_error("[组合根] 三选一兑付被拒——见输出日志")