merge: M-3迭代7魔法道具内容+元进度数值标定 T0-T8全落——AuxItemTable六行+掉落投放(解锁门控空集零投放)+库存四步受理+三选一奖励节点+HUD两步交互+叠加层呈现+工坊封存呈现+换算率复核读数(6/9/1 vs 实测1.7/4.1/0.0 U1呈报);重闸全绿(冒烟577/0+五探针+单测12套+doc三闸熵增零新增+机检11/11+MC剥additive 0/400逐位);出口=T9目检(检查单已交);台账259-263
# Conflicts: # game/presentation/views/node_overlay.gd
This commit is contained in:
commit
fd39a58aee
35 files changed
+1990
-19
No files matched your search
@@ -23,6 +23,7 @@ const TABLE_MANIFEST := {
|
||||
"difficulty": "difficulty.tres",
|
||||
"shop": "shop.tres", # GP+商店房实施批 2026-09-21(表与 schema 落籍归并行数据面——本批只接线加载与消费)
|
||||
"meta": "meta.tres", # 元进度实现批 2026-09-21(MetaTable 四行族——schema 与表同批落籍)
|
||||
"aux_items": "aux_items.tres", # 迭代 7 T1 魔法道具内容批(AuxItemTable 六行——定义表 Rule 4 豁免;罗盘 retired/失义件 deferred 标记见 schema 头注)
|
||||
"adventure": "adventure.tres", # 冒险结构实现批 2026-09-21(AdventureTable 建表——大奖励与钥石行值单点)
|
||||
}
|
||||
|
||||
@@ -42,6 +43,7 @@ var difficulty: DifficultyTable
|
||||
var shop: ShopTable = null
|
||||
# 元进度实现批(2026-09-21):MetaTable 类型化持用(schema 与表同批落籍,无 shop 先例的落籍间隙问题)
|
||||
var meta: MetaTable
|
||||
var aux_items: AuxItemTable # 迭代 7 T1 类型化持用(消费面走 aux_* 访问器)
|
||||
var adventure: AdventureTable
|
||||
|
||||
var is_ready := false
|
||||
@@ -126,6 +128,7 @@ func load_tables(root: String, collect_only: bool) -> bool:
|
||||
difficulty = loaded.get("difficulty")
|
||||
shop = loaded.get("shop")
|
||||
meta = loaded.get("meta")
|
||||
aux_items = loaded.get("aux_items")
|
||||
adventure = loaded.get("adventure")
|
||||
is_ready = not has_errors
|
||||
return not has_errors
|
||||
@@ -144,9 +147,43 @@ func _cross_validate(loaded: Dictionary) -> 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),不入增益词表面
|
||||
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("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,
|
||||
# 须命中 AuxItemTable 活行(非 retired 非 deferred——罗盘退役/失义件不投放)。retired 行被引用=退役
|
||||
# 后仍投放(连带错误),同拦。
|
||||
var aux_live := {}
|
||||
var aux_tab = loaded.get("aux_items")
|
||||
if aux_tab != null:
|
||||
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:
|
||||
continue
|
||||
var aux_eff: String = String(row.get("effect_id", ""))
|
||||
if aux_eff == "": # 负占位行(雷格极性字典兜底,零兑付)——不入投放词表校验
|
||||
continue
|
||||
if not aux_live.has(aux_eff):
|
||||
push_diag("error", "reward_dangling_aux", "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 重定批消减
|
||||
if aux_tab != null:
|
||||
var covered := {}
|
||||
for row in rt.rows:
|
||||
if String(row.get("cell_type", "")) != RewardTable.AUX_ITEM_TYPE or int(row.get("weight", 0)) <= 0:
|
||||
continue
|
||||
var arow: Dictionary = aux_tab.row_by_id(String(row.get("effect_id", "")))
|
||||
for tag in arow.get("dimension_tags", []):
|
||||
covered[String(tag)] = true
|
||||
var f2_exempt := {"plan": true, "info": true, "counter": true} # 豁免面(随 Alpha 重定/天赋批消减)
|
||||
for d in AuxItemTable.DIMENSIONS:
|
||||
if f2_exempt.has(d):
|
||||
continue
|
||||
if not covered.has(d):
|
||||
push_diag("error", "dimension_coverage", "F2 投放维度覆盖缺 %s(豁免面外零活行投放)" % d)
|
||||
# ② SettlementTable.effect_pool_map 悬空
|
||||
for eff in st_tab.effect_pool_map.keys():
|
||||
if not effect_ids.has(eff):
|
||||
@@ -347,6 +384,24 @@ func status_effect_row(effect_id: String) -> Dictionary:
|
||||
|
||||
|
||||
# ---- GP+商店房实施批(2026-09-21):ShopTable 消费面(行集解析单点——runner/战斗编排禁自扫表)----
|
||||
# ── 魔法道具访问器(迭代 7 T1——消费面一律走访问器,禁直读行集)──
|
||||
# 活行集(非 retired 非 deferred)——投放校验/奖励节点池/呈现可用性的唯一取数口径
|
||||
func aux_active_rows() -> Array:
|
||||
return aux_items.active_rows() if aux_items != null else []
|
||||
|
||||
|
||||
func aux_item_row(item_id: String) -> Dictionary:
|
||||
return aux_items.row_by_id(item_id) if aux_items != null else {}
|
||||
|
||||
|
||||
# 活行词表(掉落投放 effect_id 白名单)
|
||||
func aux_live_ids() -> Dictionary:
|
||||
var out := {}
|
||||
for row in aux_active_rows():
|
||||
out[String(row.get("item_id", ""))] = true
|
||||
return out
|
||||
|
||||
|
||||
# 行族四轴(数据契约,行集归 shop.tres):gp_drops {tier, mean, roll_min, roll_max} ·
|
||||
# level_gp_bonus {level_index, bonus} · products {product_id, display_name, attr, flat_value,
|
||||
# base_price, price_increment} · price_level_bonus {level_index, bonus}。
|
||||
|
||||
Reference in new issue
Block a user