T1机制件基建(迭代12双层BD——relic_table+档位激活引擎+机制件带池接线):RelicTable schema新建(relic_id/rarity三档对齐令牌池/archetype七流派标签/hook挂点枚举23点位/effects键白名单零裸flat同族护栏+扫雷触发点铁律=有行流派各≥1扫雷端〔部分填充合法·七流派全量归T7出口〕);RelicsEngine纯函数引擎(集2档一/4档二/散件保底·成型=tier≥1·挂点投影表序稳定);relics.tres空表合法态(池98张零扰动硬断言);池接线=relic活行每件1张入稀有/罕见档(common/rare→rare·rarest→rarest·永不入普通档)+令牌身份键relic_id(同档多件可同屏)+兑付入持有集先校验后摘牌+_relics冒险级跨关携带+断点扩键relics持有集/余库relic_id随还原+摘要additive键relics(清账前快照——pool_stock同坑预防)+RUNSUM行relics字段;呈现=relic卡「流派件·流派名」+卡片id三段复合键;autoplay读数面;冒烟14新断言(空表零扰动/引擎四断言/接线含断点往返)→684/0+run_all 15套全绿

This commit is contained in:
DKChan committed 2026-10-04 00:39:26 +08:00
1 parent 2352eab988
commit c25e8bab3e
12 files changed
+413 -50

No files matched your search

+15 -1
View File
@@ -123,10 +123,24 @@ static func bonus_card_text(id: String, tier: String, value: int, aux_line: Stri
# 三选一兑付反馈行(选中件效果 + 丢弃提示;tier 缺省普通档——旧载荷防御口径)
static func bonus_result_text(result: Dictionary) -> String:
var name := bonus_card_text(String(result.get("picked", "")), String(result.get("tier", "")), int(result.get("value", 0))).replace("\n", " · ")
var name := ""
if String(result.get("picked", "")) == "relic" and String(result.get("relic_id", "")) != "":
name = relic_card_text({"relic_id": String(result.get("relic_id", "")), "display_name": String(result.get("relic_name", "")), "archetype": String(result.get("relic_archetype", ""))}).replace("\n", " · ")
else:
name = bonus_card_text(String(result.get("picked", "")), String(result.get("tier", "")), int(result.get("value", 0))).replace("\n", " · ")
return "已选择:%s\n其余选项已丢弃(不可反悔)" % name
# 流派件卡片文案(迭代 12 T1——「流派件 · 流派名」形制+件名;空行 = 防御通用文案)
static func relic_card_text(row: Dictionary) -> String:
if row.is_empty() or String(row.get("relic_id", "")) == "":
return "流派件\n???"
var arch_names := {"magic": "魔法", "pierce": "穿刺", "normal": "普攻", "dig": "开格",
"flag": "标旗", "charge": "蓄力", "devour": "吞噬"}
var arch := String(arch_names.get(String(row.get("archetype", "")), "流派"))
return "流派件 · %s\n%s" % [arch, String(row.get("display_name", row.get("relic_id", "")))]
# Boss 胜利战斗总结结算行(settlement-summary v1.1——钥石增量行;组合根拼 GP 行后追加)
static func bonus_keystone_line(payload: Dictionary) -> String:
return "钥石 +%d · 累计 %d" % [int(payload.get("keystone_gained", 0)), int(payload.get("keystone_total", 0))]
+10 -6
View File
@@ -542,16 +542,19 @@ 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)
# TP0 令牌池——候选 = {"kind","tier"} 令牌字典;卡片 id = "kind|tier|relic_id" 复合键(同 kind
# 大小两档/同档多 relic 可同屏,kind 单键不构成唯一身份),确认回程拆键(_on_bonus_pick_confirmed)
var out: Array = []
var aux_i := 0
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 rid := String((tok as Dictionary).get("relic_id", ""))
var cid := "%s|%s|%s" % [kind, tier, rid]
var text := ""
if kind == "aux_item":
if kind == "relic":
text = Narrator.relic_card_text(db.relic_row(rid))
elif 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(kind, tier, int(db.adventure.bonus_value(kind, tier)), _aux_card_line(iid))
@@ -600,11 +603,12 @@ func _on_bonus_refresh() -> void:
func _on_bonus_pick_confirmed(item_id: String) -> void:
if adventure == null:
return
# TP0 令牌池——卡片 id "kind|tier" 拆键(缺 | = 旧载荷防御归普通档)
# TP0 令牌池——卡片 id "kind|tier|relic_id" 拆键(缺 | = 旧载荷防御归普通档;relic 三段)
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)
var rid := parts[2] if parts.size() > 2 else ""
var ok: bool = adventure.apply_node_bonus(kind, tier, rid) if _bonus_context == "reward_node" else adventure.pick_bonus(kind, tier, rid)
if not ok:
push_error("[组合根] 三选一兑付被拒——见输出日志")