From 5294b12efad015268cc5e2e2922ce0b4b5272039 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 5 Oct 2026 08:27:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=98=E5=AE=9D=E6=89=B9T3=E7=BB=84F?= =?UTF-8?q?=EF=BC=9Aaux=5Fitem=E5=9F=9F=E4=B8=B216=E5=A4=84=E2=86=92treasu?= =?UTF-8?q?re=5Fitem+TREASURE=5FITEM=5FTYPE=E5=B8=B8=E9=87=8F=E6=97=8F+rew?= =?UTF-8?q?ard=5Fdangling=5Ftreasure=E8=AF=8A=E6=96=AD=E7=A0=81=EF=BC=88?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B9=A6=E6=BC=8F=E8=AE=A1=E7=9A=84=E5=B8=B8?= =?UTF-8?q?=E9=87=8F=E6=B6=88=E8=B4=B9=E6=96=B94=E5=A4=84=E8=87=AA?= =?UTF-8?q?=E6=9F=A5=E8=A1=A5=E9=BD=90=EF=BC=8C=E5=86=92=E7=83=9F755/0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/adventure_runner.gd | 16 ++++++++-------- game/core/config_db_cross_validator.gd | 14 +++++++------- game/core/reward_economy.gd | 4 ++-- game/data/schemas/adventure_table.gd | 6 +++--- game/data/schemas/reward_table.gd | 6 +++--- game/data/tables/adventure.tres | 4 ++-- game/presentation/battle_narrator.gd | 6 +++--- game/presentation/bonus_interact_controller.gd | 6 +++--- game/smoke/smoke_all.gd | 18 +++++++++--------- .../data_config/reward_dangling_aux_test.gd | 8 ++++---- 10 files changed, 44 insertions(+), 44 deletions(-) diff --git a/game/core/adventure_runner.gd b/game/core/adventure_runner.gd index fe300572..9f63cabb 100644 --- a/game/core/adventure_runner.gd +++ b/game/core/adventure_runner.gd @@ -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 复制债收口一步): diff --git a/game/core/config_db_cross_validator.gd b/game/core/config_db_cross_validator.gd index d784a86c..6a26bb9d 100644 --- a/game/core/config_db_cross_validator.gd +++ b/game/core/config_db_cross_validator.gd @@ -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 投放四行删除而消失;共享池为「抽到道具位再动态掷定具体道具」,维度覆盖不可 # 静态校验。静态覆盖保证的重立(如按维度钉共享池抽签面)归同调实施批/渠道设计批。 diff --git a/game/core/reward_economy.gd b/game/core/reward_economy.gd index 09d9de60..ef30c59b 100644 --- a/game/core/reward_economy.gd +++ b/game/core/reward_economy.gd @@ -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 diff --git a/game/data/schemas/adventure_table.gd b/game/data/schemas/adventure_table.gd index 54d8e4b0..8b55a98f 100644 --- a/game/data/schemas/adventure_table.gd +++ b/game/data/schemas/adventure_table.gd @@ -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} diff --git a/game/data/schemas/reward_table.gd b/game/data/schemas/reward_table.gd index f8ff8f76..2fdd1ca9 100644 --- a/game/data/schemas/reward_table.gd +++ b/game/data/schemas/reward_table.gd @@ -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_ 命名空间预留拒绝 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": diff --git a/game/data/tables/adventure.tres b/game/data/tables/adventure.tres index e1ce4c3a..e64cd4d8 100644 --- a/game/data/tables/adventure.tres +++ b/game/data/tables/adventure.tres @@ -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 哨兵—— diff --git a/game/presentation/battle_narrator.gd b/game/presentation/battle_narrator.gd index db5b90be..ade692fc 100644 --- a/game/presentation/battle_narrator.gd +++ b/game/presentation/battle_narrator.gd @@ -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 diff --git a/game/presentation/bonus_interact_controller.gd b/game/presentation/bonus_interact_controller.gd index d6930cbc..55ad68f9 100644 --- a/game/presentation/bonus_interact_controller.gd +++ b/game/presentation/bonus_interact_controller.gd @@ -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)) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 382b8979..94f249c9 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -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: diff --git a/game/tests/unit/data_config/reward_dangling_aux_test.gd b/game/tests/unit/data_config/reward_dangling_aux_test.gd index 7d110512..b8db39d1 100644 --- a/game/tests/unit/data_config/reward_dangling_aux_test.gd +++ b/game/tests/unit/data_config/reward_dangling_aux_test.gd @@ -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)