奇物批T3+T4:relic_*→feat_*词族全换(feat_table.gd/feats.tres/feats_engine.gd三文件改名+.uid+feat_flags/feat_id/feat_row等全token+config_db注册键feats两端+entities.yaml换代注记——kind值relic/身份前缀relic:/relics存档键/摘要键按数据契约保留);T4渠道白名单过滤(_draw_curio_candidates(channel):通关渠道只出专长/节点渠道零专长——过滤式不拆池,TIER_QUOTAS锚零改动,devour货架保底随渠道定位退役,迁移保feat_id,pick_curio测试feat_id透传;冒烟773/0+run_all 16全绿+断点往返PASS)

This commit is contained in:
DKChan committed 2026-10-05 19:28:20 +08:00
1 parent 8e2694de49
commit 6812ebbb73
24 files changed
+385 -384

No files matched your search

+13 -30
View File
@@ -479,7 +479,7 @@ func _start_battle(node: Dictionary) -> bool:
"hero_armor_class": effective_ac(), "hero_ap_bonus": effective_ap_bonus(),
"attunement": _attunement,
"attune_charges": _attune_charges,
"relics": _relics,
"feats": _feats,
"tree_rules": _tree_rules,
"node_type": String(node.get("type", ""))}):
push_error("[关卡节点地图] 战斗启动失败(depth %s)" % str(node.get("node_depth", -1)))
@@ -591,18 +591,18 @@ func set_attunement(ids: Array) -> void:
# 特性持有集注入(迭代 12 T1——AdventureRunner._start_current_level 唯一调用方;begin_battle
# enc.relics 携带进战斗求值;**共享引用不复制**——关内奖励节点兑付的 relic 须当关后续战斗生效
# enc.feats 携带进战斗求值;**共享引用不复制**——关内奖励节点兑付的 relic 须当关后续战斗生效
# (attune_charges 共享账本同款);空集=零扰动)
var _relics: Array = []
var _feats: Array = []
func set_relics(ids: Array) -> void:
_relics = ids
func set_feats(ids: Array) -> void:
_feats = ids
# 特性持有集读面(迭代 12 呈现补齐——HUD C 区特性段数据源)
func relics_held() -> Array:
return _relics.duplicate()
func feats_held() -> Array:
return _feats.duplicate()
# 树 rule 键集注入(迭代 12 T10——begin_battle enc.tree_rules 携带;Fork 激活侧 effects)
@@ -638,7 +638,7 @@ func grant_treasure_item(item_id: String, source: String) -> Dictionary:
# 三选一 GP 袋件入账(迭代 10——钱包收口扩「奖励入账」入口;复用战斗完成同一入账原语,
# wallet_changed 载荷带 source 供呈现归因)
func grant_bonus_gp(amount: int) -> void:
func grant_curio_gp(amount: int) -> void:
gp = maxi(0, gp + amount)
wallet_changed.emit("gain", gp, {"amount": amount, "source": "curio_pick"})
@@ -779,26 +779,9 @@ func _shop_draw_shelf() -> void:
_shop_shelf.append(tok)
if _shop_shelf.size() >= 3:
break
# 商店保底(迭代 12 T6——「本关变异交互件必刷」简化口径:货架零特性时**挤掉最后一张普通卡**
# 换吞噬流件〔地形交互件广义映射——按关变异精细绑定归数值批,台账披露待追认〕;占位制货架恒
# ≤3;池内无 devour 令牌=不保底合法态)
var has_relic := false
for tok in _shop_shelf:
if String((tok as Dictionary).get("kind", "")) == "relic":
has_relic = true
break
if not has_relic and not _shop_shelf.is_empty():
for row in db.relic_rows():
if String(row.get("archetype", "")) != "devour":
continue
var rid := String(row.get("relic_id", ""))
for t in _pool_deck:
var tok2: Dictionary = t as Dictionary
if String(tok2.get("kind", "")) == "relic" and String(tok2.get("relic_id", "")) == rid:
_shop_shelf[_shop_shelf.size() - 1] = {"kind": "relic", "tier": String(tok2.get("tier", "")), "relic_id": rid}
break
if String((_shop_shelf[_shop_shelf.size() - 1] as Dictionary).get("kind", "")) == "relic":
break # 换一张即止
# 商店保底退役(迭代 15 卡② T4——渠道轴定位裁决:商店渠道只出属性值提升+资源,专长在非 Boss
# 渠道只以门票形态出现(奇物.md v2.7/A4 断言)。迭代 12 T6「货架零特性挤卡换吞噬流件」简化口径
# 与渠道白名单直接冲突(devour=规则改写型=专长系),随渠道分离退役;专长商店入口=T5 门票。
# 库存余量(TP0——令牌库内该 kind 剩余枚数单点读;未注入/防御读 = 0)
@@ -836,13 +819,13 @@ func shop_shelf() -> Array:
var display := String(row.get("display_name", kind))
var value := int(db.adventure.curio_value(kind, tier))
if row.is_empty() and kind == "relic":
var rrow: Dictionary = db.relic_row(String(tok.get("relic_id", "")))
var rrow: Dictionary = db.feat_row(String(tok.get("feat_id", "")))
display = String(rrow.get("display_name", "特性"))
value = 0
out.append({
"kind_id": kind,
"tier": tier,
"relic_id": String(tok.get("relic_id", "")),
"feat_id": String(tok.get("feat_id", "")),
"display_name": display,
"value": value,
"price": pool_price(kind),