秘宝批T3组F:aux_item域串16处→treasure_item+TREASURE_ITEM_TYPE常量族+reward_dangling_treasure诊断码(任务书漏计的常量消费方4处自查补齐,冒烟755/0)
This commit is contained in:
1 parent
dfd5fdd4df
commit
5294b12efa
10 files changed
+44
-44
No files matched your search
@@ -228,7 +228,7 @@ func resume_adventure(bp: Dictionary, params: Dictionary = {}) -> bool:
|
||||
_bonus_pending["aux_detail"] = (bp_pending.get("aux_detail", []) as Array).duplicate(true) # 掷定前置随停点快照续接
|
||||
var payload: Dictionary = (bp_pending.get("payload", {}) as Dictionary).duplicate(true)
|
||||
if bp_pending.has("incoming"):
|
||||
_bonus_pending["chosen"] = "aux_item"
|
||||
_bonus_pending["chosen"] = "treasure_item"
|
||||
var incoming: Array = (bp_pending.get("incoming", []) as Array).duplicate(true)
|
||||
_bonus_pending["incoming"] = incoming
|
||||
state = "running"
|
||||
@@ -363,7 +363,7 @@ func pick_bonus(kind: String, tier: String = "", relic_id: String = "") -> bool:
|
||||
return false
|
||||
var value: int = int(db.adventure.feature_value(kind, tier))
|
||||
var hp_before := int(ledger.get("hero_hp", 0))
|
||||
if kind == "aux_item":
|
||||
if kind == "treasure_item":
|
||||
return _pick_aux_item(value) # 道具件分派通关渠道(持有容器 = 跨关携带——与节点渠道分轨;池种退役后不可达)
|
||||
if not _apply_bonus_pick(kind, tier, value, relic_id):
|
||||
push_error("[冒险结构] pick_bonus 拒绝——未知件: %s|%s|%s" % [kind, tier, relic_id])
|
||||
@@ -487,7 +487,7 @@ func _pick_aux_item(count: int) -> bool:
|
||||
# 正主 = 营地装配面 Attunement.slots 满位禁选)
|
||||
for iid in picked:
|
||||
_bonus_aux_carry.append(String(iid))
|
||||
_finish_bonus_pick("aux_item", picked.size(), hp_before)
|
||||
_finish_bonus_pick("treasure_item", picked.size(), hp_before)
|
||||
return true
|
||||
|
||||
|
||||
@@ -507,7 +507,7 @@ func resolve_aux_replace(discard_index: int) -> bool:
|
||||
for iid in incoming:
|
||||
_bonus_aux_carry.append(String(iid))
|
||||
# 放弃新件(discard_index < 0)= 原持有集不动、新件不获取
|
||||
_finish_bonus_pick("aux_item", incoming.size(), hp_before)
|
||||
_finish_bonus_pick("treasure_item", incoming.size(), hp_before)
|
||||
return true
|
||||
|
||||
|
||||
@@ -553,7 +553,7 @@ func apply_node_bonus(kind: String, tier: String = "", relic_id: String = "") ->
|
||||
push_error("[冒险结构] apply_node_bonus 拒绝——令牌不在候选: %s|%s|%s" % [kind, tier, relic_id])
|
||||
return false
|
||||
var value: int = int(db.adventure.feature_value(kind, tier))
|
||||
if kind == "aux_item":
|
||||
if kind == "treasure_item":
|
||||
return _apply_node_aux(value) # 道具件分派节点渠道(持有容器 = 关卡域库存——与通关渠道分轨;池种退役后不可达)
|
||||
if not _apply_bonus_pick(kind, tier, value, relic_id):
|
||||
push_error("[冒险结构] apply_node_bonus 拒绝——未知件: %s|%s|%s" % [kind, tier, relic_id])
|
||||
@@ -580,7 +580,7 @@ func _apply_node_aux(count: int) -> bool:
|
||||
var rec: Dictionary = _runner.grant_aux_item(String(iid), "reward_node")
|
||||
if rec.is_empty():
|
||||
push_warning("[冒险结构] 奖励节点道具授予被拒(防御兜底留痕): %s" % String(iid))
|
||||
_finish_node_bonus("aux_item", picked.size())
|
||||
_finish_node_bonus("treasure_item", picked.size())
|
||||
return true
|
||||
|
||||
|
||||
@@ -598,7 +598,7 @@ func _resolve_node_replace(discard_handle: int) -> bool:
|
||||
if rec.is_empty():
|
||||
push_warning("[冒险结构] 替换子道具授予被拒(防御兜底留痕): %s" % String(iid))
|
||||
# 放弃新件(discard_handle < 0)= 原持有集不动、新件不获取
|
||||
_finish_node_bonus("aux_item", incoming.size())
|
||||
_finish_node_bonus("treasure_item", incoming.size())
|
||||
return true
|
||||
|
||||
|
||||
@@ -669,7 +669,7 @@ func refresh_bonus() -> bool:
|
||||
|
||||
# 替换在途守卫(2026-10-02 修复批——双渠道替换受理的共用前置谓词:停点态非空且 chosen=aux_item)
|
||||
func _replace_in_transit(pending: Dictionary) -> bool:
|
||||
return not pending.is_empty() and String(pending.get("chosen", "")) == "aux_item"
|
||||
return not pending.is_empty() and String(pending.get("chosen", "")) == "treasure_item"
|
||||
|
||||
|
||||
# 双渠道道具件掷定共享体(2026-10-02 修复批——_pick_aux_item/_apply_node_aux 复制债收口一步):
|
||||
|
||||
@@ -25,12 +25,12 @@ func cross_validate(loaded: Dictionary, push_diag: Callable) -> void:
|
||||
# GP+商店房实施批(2026-09-21)例外:gp_gain/gp_loss = GP 战斗内缓冲(escrow)通道的路由键
|
||||
# (战斗结算 _apply_gp_row 兑付——不入增益状态容器),词表封闭按字面豁免悬空引用校验。
|
||||
for row in rt.rows:
|
||||
if String(row.get("cell_type", "")) == RewardTable.AUX_ITEM_TYPE:
|
||||
continue # aux 行 effect_id=item_id——归 ①b 双表校验(reward_dangling_aux),不入增益词表面
|
||||
if String(row.get("cell_type", "")) == RewardTable.TREASURE_ITEM_TYPE:
|
||||
continue # aux 行 effect_id=item_id——归 ①b 双表校验(reward_dangling_treasure),不入增益词表面
|
||||
var eff: String = row.get("effect_id", "")
|
||||
if eff != "" and eff != "gp_gain" and eff != "gp_loss" and not effect_ids.has(eff):
|
||||
push_diag.call("error", "dangling_effect", "RewardTable %s 引用不存在的 effect_id: %s" % [row.get("reward_id"), eff])
|
||||
# ①b RewardTable aux 投放行双表校验(迭代 7 T1——reward_dangling_aux):aux 行 effect_id = item_id,
|
||||
# ①b RewardTable aux 投放行双表校验(迭代 7 T1——reward_dangling_treasure):aux 行 effect_id = item_id,
|
||||
# 须命中 AuxItemTable 活行(非 retired 非 deferred——罗盘退役/失义件不投放)。retired 行被引用=退役
|
||||
# 后仍投放(连带错误),同拦。
|
||||
var aux_live := {}
|
||||
@@ -39,16 +39,16 @@ func cross_validate(loaded: Dictionary, push_diag: Callable) -> void:
|
||||
for arow in aux_tab.active_rows():
|
||||
aux_live[String(arow.get("item_id", ""))] = true
|
||||
for row in rt.rows:
|
||||
if String(row.get("cell_type", "")) != RewardTable.AUX_ITEM_TYPE:
|
||||
if String(row.get("cell_type", "")) != RewardTable.TREASURE_ITEM_TYPE:
|
||||
continue
|
||||
var aux_eff: String = String(row.get("effect_id", ""))
|
||||
if aux_eff == "": # 负占位行(雷格极性字典兜底,零兑付)——不入投放词表校验
|
||||
continue
|
||||
if not aux_live.has(aux_eff):
|
||||
push_diag.call("error", "reward_dangling_aux", "RewardTable %s aux 行引用无效道具 %s(retired/deferred/不存在): %s" % [row.get("reward_id"), aux_eff, "双表校验"])
|
||||
# ①c F2 投放维度覆盖(魔法道具 GDD——五维度各 ≥1 掉落权重为正的活行):豁免面 {plan, info, counter}
|
||||
push_diag.call("error", "reward_dangling_treasure", "RewardTable %s aux 行引用无效道具 %s(retired/deferred/不存在): %s" % [row.get("reward_id"), aux_eff, "双表校验"])
|
||||
# ①c F2 投放维度覆盖(秘宝 GDD——五维度各 ≥1 掉落权重为正的活行):豁免面 {plan, info, counter}
|
||||
# = 罗盘退役(plan,2026-09-29 拍板①乙)+显影件 Alpha 重定(info/counter 悬置)——豁免随 Alpha 重定批消减
|
||||
# ①c F2 投放维度覆盖校验随战斗掉落渠道退役(2026-10-01 用户拍板甲——挖格不掉道具,魔法道具
|
||||
# ①c F2 投放维度覆盖校验随战斗掉落渠道退役(2026-10-01 用户拍板甲——挖格不掉道具,秘宝
|
||||
# 唯一来路=三选一共享池〔节点/通关〕):旧校验=「掉落池五维度各 ≥1 正权重活行」,载体已随
|
||||
# reward.tres aux 投放四行删除而消失;共享池为「抽到道具位再动态掷定具体道具」,维度覆盖不可
|
||||
# 静态校验。静态覆盖保证的重立(如按维度钉共享池抽签面)归同调实施批/渠道设计批。
|
||||
|
||||
@@ -81,7 +81,7 @@ func roll_board(eligible: Array) -> bool:
|
||||
return true
|
||||
|
||||
|
||||
# ---- 查询面(Ready 只读;未开格恒可查——魔法道具 桥接结构前提)----
|
||||
# ---- 查询面(Ready 只读;未开格恒可查——秘宝 桥接结构前提)----
|
||||
|
||||
# 相位只读出口(诊断观测面——unrolled/ready/retired;消费方禁直读 _phase 下划线字段)
|
||||
func phase() -> String:
|
||||
@@ -307,7 +307,7 @@ func _rollable_rows() -> Array:
|
||||
# 摇号池 = cell 池正向行 weight>0(负向行纯字典不消费权重;封锁格不在本函数职责域——清单由调用方裁剪)
|
||||
var out: Array[Dictionary] = []
|
||||
for row in db.reward.rows:
|
||||
if String(row.get("cell_type", "")) == RewardTable.AUX_ITEM_TYPE:
|
||||
if String(row.get("cell_type", "")) == RewardTable.TREASURE_ITEM_TYPE:
|
||||
var iid := String(row.get("effect_id", ""))
|
||||
if iid == "" or not _aux_unlocked.has(iid):
|
||||
continue
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
# TP0 令牌池换代(2026-10-03 用户全裁 b——node-reward v2.2):三选一池改固定配额令牌池——普通 70/稀有 25/
|
||||
# 罕见 5=100 张;洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭;种类次数上限退役(池消耗即上限)。
|
||||
# 档位构成:普通〔小GP 18/小增伤 18/小护甲 17/小生命 17〕+稀有〔大GP/大增伤/大护甲/大生命/恢复 各 5〕
|
||||
# +罕见〔AP 3〕——罕见档原列「道具件 2」随 aux_item 池种退役(迭代 11 第①批 T7)不投放,配额缺省收窄。
|
||||
# +罕见〔AP 3〕——罕见档原列「道具件 2」随 treasure_item 池种退役(迭代 11 第①批 T7)不投放,配额缺省收窄。
|
||||
# 恢复件=新入池种类(当即回血)。旧权重/次数上限字段整代退役。
|
||||
# 全部 knob provisional-pending-曲线调参批(数值所有权归 难度曲线与Boss,上调须重扫通关率带)。
|
||||
class_name AdventureTable
|
||||
@@ -23,7 +23,7 @@ extends Resource
|
||||
## 刷新次数 / 金币 / 回复,命名待定〕——本表两类混编;刷新次数与专长获取两项尚未入表。
|
||||
## 类内异质性:金币与回复是即时兑付,不进持有集、不持续生效。)
|
||||
## 三选一提升池 kind 词表(封闭——断点附随件与牌库剔除态依赖它;扩件走本表+registry 修订)。
|
||||
## aux_item 池种退役(迭代 11 第①批 T7——同调批出池);heal 恢复件新入池(v2.2 令牌池追认 b)。
|
||||
## treasure_item 池种退役(迭代 11 第①批 T7——同调批出池);heal 恢复件新入池(v2.2 令牌池追认 b)。
|
||||
const FEATURE_KINDS: Array[String] = ["attack", "max_hp", "armor", "gp", "ap", "heal"]
|
||||
## 令牌档位词表(v2.2 三档位——稀有度命名对齐 MC 策略判读序 316-f:1 级最稀有=rarest 优先)
|
||||
const TIERS: Array[String] = ["common", "rare", "rarest"]
|
||||
@@ -31,7 +31,7 @@ const TIER_COMMON := "common"
|
||||
const TIER_RARE := "rare"
|
||||
const TIER_RAREST := "rarest"
|
||||
## 档位配额结构锚(v2.2 追认 b 定稿——validate() 硬断言;改总量=重裁非调参)。
|
||||
## 罕见档 5→3:原「道具件 2」席位随 aux_item 池种退役(迭代 11 第①批 T7,落地晚于追认 b)收窄,
|
||||
## 罕见档 5→3:原「道具件 2」席位随 treasure_item 池种退役(迭代 11 第①批 T7,落地晚于追认 b)收窄,
|
||||
## 池总量 100→98——TP0 台账自决+人工清单披露项。
|
||||
const TIER_QUOTAS := {"common": 70, "rare": 25, "rarest": 3}
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ extends Resource
|
||||
|
||||
@export var rows: Array[Dictionary] = [] # Array[Dictionary]
|
||||
|
||||
const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp", "aux_item"] # 十型(迭代 7 T1 魔法道具内容批扩值——registry aux_items 词表;aux 行 effect_id = item_id 双表校验键)
|
||||
const AUX_ITEM_TYPE := "aux_item" # aux 行标识(掉落投放行:挖开→战斗结算 grant 路由关卡域库存,不入增益容器)
|
||||
const CELL_TYPES := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp", "treasure_item"] # 十型(迭代 7 T1 秘宝内容批扩值——registry 秘宝词表;aux 行 effect_id = item_id 双表校验键)
|
||||
const TREASURE_ITEM_TYPE := "treasure_item" # aux 行标识(掉落投放行:挖开→战斗结算 grant 路由关卡域库存,不入增益容器)
|
||||
const POLARITIES := ["positive", "negative"]
|
||||
const POOL_TAGS := ["cell", "clear_default"] # cell = 格面资源单一池;clear_<biome> 命名空间预留拒绝
|
||||
const CELL_TYPE_KEYS := ["attack", "defense", "heal", "blast", "weaken", "pierce", "magic", "action", "gp"] # 字典完整性校验轴(类型 × 极性 = 十八格)
|
||||
@@ -47,7 +47,7 @@ func validate() -> Array:
|
||||
errs.append({"category": "enum", "message": "%s attack_type 出域 {normal, pierce, magic}: %s" % [rid, atk_type]})
|
||||
# aux 投放行专属校验(迭代 7 T1):极性恒正/加权入池/effect_id=item_id 非空(悬空在 config_db 跨表层
|
||||
# 对 aux_items 词表校验——reward_dangling_aux)/无 power 无区间(数值语义不复用,道具效果读 AuxItemTable)
|
||||
if ctype == AUX_ITEM_TYPE:
|
||||
if ctype == TREASURE_ITEM_TYPE:
|
||||
# 负向行 = 雷格极性字典占位(雷安同池摇号下雷格可摇中 aux 身份——负路由零兑付兜底,
|
||||
# effect_id 空/power 0/weight 0 不入池;2026-09-29 T1)
|
||||
if pol == "negative":
|
||||
|
||||
@@ -28,11 +28,11 @@ feature_value_heal_rare = 6
|
||||
feature_value_ap_rarest = 1
|
||||
|
||||
; TP0 令牌池换代(2026-10-03,node-reward v2.2 追认 b 落地):三选一池 = 固定配额令牌池——
|
||||
; 普通 70/稀有 25/罕见 3 = 98 张(罕见档原列「道具件 2」随 aux_item 池种退役收窄——台账自决披露项);
|
||||
; 普通 70/稀有 25/罕见 3 = 98 张(罕见档原列「道具件 2」随 treasure_item 池种退役收窄——台账自决披露项);
|
||||
; 洗牌不放回抽 3、选中踢池未选回池、池耗即枯竭;
|
||||
; 种类次数上限退役(池消耗即上限;货架库存同账本=牌库剩余令牌数)。
|
||||
; 档位构成:普通〔小GP 18/小增伤 18/小护甲 17/小生命 17〕+ 稀有〔大GP/大增伤/大护甲/大生命/恢复 各 5〕
|
||||
; + 罕见〔AP 3〕——罕见档原列「道具件 2」随 aux_item 池种退役(迭代 11 第①批 T7)不投放。
|
||||
; + 罕见〔AP 3〕——罕见档原列「道具件 2」随 treasure_item 池种退役(迭代 11 第①批 T7)不投放。
|
||||
; 数值对:小GP 20/大GP 50、小增伤 +1/大 +2、小护甲 +1/大 +2、小生命 +5/大 +10、恢复 +6(当即回血)、AP +1。
|
||||
; 恢复件 = 新入池种类(rare 档)。
|
||||
; 退役字段:bonus_weight_*(E-S 权重族)/ bonus_cap_*(种类次数上限族)/ BONUS_CAP_UNLIMITED 哨兵——
|
||||
|
||||
@@ -112,10 +112,10 @@ static func bonus_card_text(id: String, tier: String, value: int, aux_line: Stri
|
||||
return "金币袋%s\n金币 +%d" % [ts, value]
|
||||
"heal":
|
||||
return "恢复药剂\n生命 +%d(当即回复)" % value
|
||||
"aux_item":
|
||||
"treasure_item":
|
||||
if aux_line != "":
|
||||
return "魔法道具\n%s" % aux_line
|
||||
return "魔法道具\n随机获得一件"
|
||||
return "秘宝\n%s" % aux_line
|
||||
return "秘宝\n随机获得一件"
|
||||
"ap":
|
||||
return "行动点提升\n每战首轮 AP +%d" % value
|
||||
return id
|
||||
|
||||
@@ -73,7 +73,7 @@ func resume_if_pending() -> bool:
|
||||
# 增量行在其上),确认后进三选一面(level-clear.md v2);续玩停点恢复同入口(零自动推进契约)
|
||||
func on_presented(payload: Dictionary) -> void:
|
||||
if int(payload.get("aux_cleared", 0)) > 0:
|
||||
toast.show_toast("上关剩余 %d 件魔法道具已随关卡结束清空" % int(payload.get("aux_cleared", 0)), "info") # 迭代 7 T4 清空反馈
|
||||
toast.show_toast("上关剩余 %d 件秘宝已随关卡结束清空" % int(payload.get("aux_cleared", 0)), "info") # 迭代 7 T4 清空反馈
|
||||
_pending_bonus = payload.duplicate(true)
|
||||
_bonus_context = "level_clear"
|
||||
if bool(payload.get("replace_pending", false)):
|
||||
@@ -89,7 +89,7 @@ func on_presented(payload: Dictionary) -> void:
|
||||
|
||||
# 三选一面开出(战斗总结结算确认 / 续玩停点恢复;替换在途由 aux_replace_presented 续发直落子态)
|
||||
# 奖励节点三选一(迭代 10 追加批——与通关三选一共享同池同权重同上限;BonusPickOverlay 共用面,
|
||||
# 道具件满位替换子交互同构)。原「魔法道具投放渠道」三选一(迭代 7 过渡形态)随批退役。
|
||||
# 道具件满位替换子交互同构)。原「秘宝投放渠道」三选一(迭代 7 过渡形态)随批退役。
|
||||
func present_node_bonus() -> void:
|
||||
var adventure = _adventure_get.call()
|
||||
_bonus_context = "reward_node"
|
||||
@@ -124,7 +124,7 @@ func _bonus_card_texts(candidates: Array, aux_detail: Array = []) -> Array:
|
||||
var text := ""
|
||||
if kind == "relic":
|
||||
text = Narrator.relic_card_text(db.relic_row(rid))
|
||||
elif kind == "aux_item":
|
||||
elif kind == "treasure_item":
|
||||
var iid := String(aux_detail[aux_i]) if aux_i < aux_detail.size() else ""
|
||||
aux_i += 1
|
||||
text = Narrator.bonus_card_text(kind, tier, int(db.adventure.feature_value(kind, tier)), _aux_card_line(iid))
|
||||
|
||||
@@ -559,7 +559,7 @@ func _smoke_adventure() -> void:
|
||||
var aux_seen := false
|
||||
for i in 40:
|
||||
for t in a11._draw_bonus_candidates():
|
||||
if String((t as Dictionary).get("kind", "")) == "aux_item":
|
||||
if String((t as Dictionary).get("kind", "")) == "treasure_item":
|
||||
aux_seen = true
|
||||
break
|
||||
check(not aux_seen, "池收缩——40 次重抽零 aux 候选(停点渠道 aux 卡退役,迭代 11 第①批 T7)")
|
||||
@@ -2573,9 +2573,9 @@ func _smoke_negative_dictionary() -> void:
|
||||
if r0.has(c) or by_type.size() == 5:
|
||||
continue
|
||||
var ident = settlement.query_reward_identity(c)
|
||||
# aux 身份不入五型轴(魔法道具内容批 2026-09-29——五型齐备=格面资源历史断言轴,
|
||||
# aux 身份不入五型轴(秘宝内容批 2026-09-29——五型齐备=格面资源历史断言轴,
|
||||
# aux 供给挤占不改变本断言语义;扫描排除 aux 身份格)
|
||||
if ident != null and String(ident.cell_type) != RewardTable.AUX_ITEM_TYPE and not by_type.has(String(ident.cell_type)):
|
||||
if ident != null and String(ident.cell_type) != RewardTable.TREASURE_ITEM_TYPE and not by_type.has(String(ident.cell_type)):
|
||||
by_type[String(ident.cell_type)] = c
|
||||
# break 条件=percent_map 三型齐备(迭代 7 T1——aux 供给挤占下 weaken/defense 收集时机漂移,
|
||||
# 直验可达性优先;五型多样性 check 保留不动)
|
||||
@@ -2650,7 +2650,7 @@ func _smoke_resource_surface() -> void:
|
||||
check(digchain_bad == 0, "chain/dig 揭示事件 resource 恒 true(雷安同池——违例 %d)" % digchain_bad)
|
||||
check(initial_bad == 0 and initial_count >= 1, "initial 揭示事件(封锁格)resource 恒 false(×%d 事件)" % initial_count)
|
||||
check(mine_with_resource >= 1, "雷格揭示携带资源(mine ×resource=true %d——雷格不再恒无)" % mine_with_resource)
|
||||
# 封锁格无身份 / 雷格未开恒可查(未开格恒可查——魔法道具 桥接结构前提)
|
||||
# 封锁格无身份 / 雷格未开恒可查(未开格恒可查——秘宝 桥接结构前提)
|
||||
var rng3 = load("res://core/rng_service.gd").new()
|
||||
rng3.set_master_seed(20260920)
|
||||
var settlement = load("res://core/battle_orchestrator.gd").new(_db, rng3)
|
||||
@@ -2667,7 +2667,7 @@ func _smoke_resource_surface() -> void:
|
||||
break
|
||||
check(settlement.query_reward_identity(r0_first) == null, "封锁格(R₀)身份查询 = null(不入摇号清单)")
|
||||
check(mine_unrevealed != null and settlement.query_reward_identity(mine_unrevealed) != null,
|
||||
"未开雷格身份恒可查({reward_id, cell_type, tier}——魔法道具 桥接前提)")
|
||||
"未开雷格身份恒可查({reward_id, cell_type, tier}——秘宝 桥接前提)")
|
||||
|
||||
|
||||
# 五段全序断言(战斗结算 验收"五段全序"+ 行型封闭 10 类):逐轮行相位序 = 授予 → 增益/减益 → 战斗 → 衰减 → 判定。
|
||||
@@ -3844,7 +3844,7 @@ func _smoke_shop_pool() -> void:
|
||||
for i in 40:
|
||||
r8._shop_draw_shelf()
|
||||
for c in r8.shop_shelf():
|
||||
if String(c.get("kind_id", "")) == "gp" or String(c.get("kind_id", "")) == "aux_item":
|
||||
if String(c.get("kind_id", "")) == "gp" or String(c.get("kind_id", "")) == "treasure_item":
|
||||
cut_seen = true
|
||||
check(not cut_seen, "切边件零入店(40 次重抽零 gp/aux——负交易切边+三轴 doctrine)")
|
||||
# ⑤ 池空硬闸(库存尽剔出牌库——TP0:white-box 耗尽 attack 令牌后货架零 attack + 消费口拒绝)
|
||||
@@ -3929,8 +3929,8 @@ func _all_entry_boss_paths(nodes: Array) -> Array:
|
||||
|
||||
func _smoke_nine_types_gp_stream() -> void:
|
||||
print("--- 格面资源九型 + gp_drop 流(奖励字典 18 格 + 黄金向量)---")
|
||||
check(RewardTable.CELL_TYPES.size() == 10 and RewardTable.CELL_TYPES.has("gp") and RewardTable.CELL_TYPES.has("aux_item"),
|
||||
"格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 aux_item 魔法道具内容批 2026-09-29——词表 v1.2)")
|
||||
check(RewardTable.CELL_TYPES.size() == 10 and RewardTable.CELL_TYPES.has("gp") and RewardTable.CELL_TYPES.has("treasure_item"),
|
||||
"格面资源十型封闭(第九型 gp 九型批 2026-09-20 / 第十型 treasure_item 秘宝内容批 2026-09-29——词表 v1.2)")
|
||||
var cell_rows := 0
|
||||
var pos_weight := 0
|
||||
var gp_pos := -1
|
||||
@@ -3944,7 +3944,7 @@ func _smoke_nine_types_gp_stream() -> void:
|
||||
gp_pos = int(row.weight)
|
||||
if String(row.get("reward_id", "")) == "gp_lose":
|
||||
gp_neg = int(row.weight)
|
||||
check(cell_rows == 18, "奖励字典 18 行(九型×正负 18 格——aux 挖格投放四行已退役 2026-10-01 用户拍板甲:战斗/挖格不掉道具,魔法道具唯一来路=三选一共享池〔节点/通关〕;清图槽独立批尾不计)")
|
||||
check(cell_rows == 18, "奖励字典 18 行(九型×正负 18 格——aux 挖格投放四行已退役 2026-10-01 用户拍板甲:战斗/挖格不掉道具,秘宝唯一来路=三选一共享池〔节点/通关〕;清图槽独立批尾不计)")
|
||||
# 雷格负向直伤当量(迭代 8 卡⑧——真人反馈「三雷 3/4 血无后果感」投值:三行各抬 +3 档,负向≈正向 2 倍定价)
|
||||
var mine_power := {"heal_backlash": 6, "pierce_snare": 8, "magic_recoil": 8} # 数值修复批 2026-10-01 再抬档(旧 4/5/5,见 numfix 报告)
|
||||
for row in _db.reward.rows:
|
||||
|
||||
@@ -10,7 +10,7 @@ const ConfigDBScript := preload("res://core/config_db.gd")
|
||||
const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:BAD 表目录夹具共享(copy_tables)
|
||||
|
||||
const SRC_DIR := "res://data/tables"
|
||||
const BAD_DIR := "user://aux_fixture_dangling_aux"
|
||||
const BAD_DIR := "user://treasure_fixture_dangling"
|
||||
|
||||
|
||||
func _inject_violation() -> bool:
|
||||
@@ -22,7 +22,7 @@ func _inject_violation() -> bool:
|
||||
f.close()
|
||||
# 追加式注入(2026-10-01 战斗掉落渠道退役随批——现行表已无 aux 行可作锚):向 rows 尾追加
|
||||
# 一块引用已退役 loot_compass 的 aux 投放行,双表校验须拦(retired 不入投放面)。
|
||||
var inject := ', {\n\n"reward_id": "aux_dangling_probe",\n"cell_type": "aux_item",\n"polarity": "positive",\n"effect_id": "loot_compass",\n"display_name": "悬空探针",\n"power": 0,\n"weight": 1,\n"pool_tag": "cell",\n"tier": 1\n}'
|
||||
var inject := ', {\n\n"reward_id": "treasure_dangling_probe",\n"cell_type": "treasure_item",\n"polarity": "positive",\n"effect_id": "loot_compass",\n"display_name": "悬空探针",\n"power": 0,\n"weight": 1,\n"pool_tag": "cell",\n"tier": 1\n}'
|
||||
var idx := s.rfind("\n}]")
|
||||
if idx < 0:
|
||||
return false
|
||||
@@ -47,8 +47,8 @@ func _init() -> void:
|
||||
quit(2)
|
||||
return
|
||||
if db.diagnostics_count("error") >= 1:
|
||||
print("[reward_dangling_aux_test] 双表校验触发(reward_dangling_aux 诊断在案,加载被拒)")
|
||||
print("[reward_dangling_aux_test] 双表校验触发(reward_dangling_treasure 诊断在案,加载被拒)")
|
||||
quit(1)
|
||||
return
|
||||
push_error("[reward_dangling_aux_test] 加载被拒但无 reward_dangling_aux 诊断——校验通道静默化(回归)")
|
||||
push_error("[reward_dangling_aux_test] 加载被拒但无 reward_dangling_treasure 诊断——校验通道静默化(回归)")
|
||||
quit(2)
|
||||
Reference in new issue
Block a user