diff --git a/game/core/meta_progression.gd b/game/core/meta_progression.gd index 775705c9..252e71c8 100644 --- a/game/core/meta_progression.gd +++ b/game/core/meta_progression.gd @@ -184,18 +184,15 @@ func tree_can_buy(node_id: String) -> bool: return true -# 节点购买(营地树 UI 唯一写口):**单币=钥石先行**(双币铁律中 GP 需局外余额承载域——GP 冒险 -# 收束清零=局内死钱不跨局,GP 余额域缺位,脊柱 GP 节点暂走钥石消费——表 currency 字段保留语义, -# T9/数值批补 GP 余额域后切回——台账披露待追认)。free=迁移点亮/彩蛋觉醒零币。 +# 节点购买(营地树 UI 唯一写口):树全钥石单币(2026-10-07 用户裁甲——原 T8 双币骨架披露销账; +# 表内 currency 字段保留为呈现元数据)。free=迁移点亮/彩蛋觉醒零币(price 0,零额消费无副作用)。 func tree_buy(node_id: String) -> bool: var row: Dictionary = db.tree_node(node_id) if row.is_empty() or not tree_can_buy(node_id): return false var price := int(row.get("price", 0)) - var currency := String(row.get("currency", "gp")) - if currency == "gp" or currency == "keystone": - if not save.spend_keystone(price): - return false # T8 骨架单币承载(GP 余额域缺位——披露待追认) + if not save.spend_keystone(price): + return false save.set_tree_level(node_id, save.tree_level(node_id) + 1) _check_easter_egg() return save.write_to_disk() diff --git a/game/data/schemas/meta_tree_table.gd b/game/data/schemas/meta_tree_table.gd index 4ae7a4f5..bf3117d5 100644 --- a/game/data/schemas/meta_tree_table.gd +++ b/game/data/schemas/meta_tree_table.gd @@ -4,11 +4,12 @@ # Date: 2026-10-04(双层 BD 实施批 T8;设计权威 双层BD体系-整合定稿-2026-10-03 §1.4) # 数据配置 MetaTreeTable schema(元进度 回填 owner 批末落文;行 = Dictionary 键 node_id,Rule 4 豁免 # 定义表——FeatTable 先例)。 -# 行字段:node_id / display_name / vein ∈ VEINS(spine=主干脊柱 row-gating,GP 买深度;forge=锻造脉 +# 行字段:node_id / display_name / vein ∈ VEINS(spine=主干脊柱 row-gating,钥石买深度〔2026-10-07 +# 用户裁甲——树全钥石单币,原双币铁律骨架披露销账〕;forge=锻造脉 # 数值专精;keystone=钥石脉内容解锁;attune=同调脉槽位与规则)/ kind ∈ KINDS(stat=四线数值/ # rule=全局规则/unlock=内容解锁/socket=同调位/fork=A/B 互斥对/easter=彩蛋觉醒)/ -# currency ∈ {gp, keystone, free}(双币铁律:GP 喂脊柱数值、钥石喂 Unlock/Socket/Fork——哈迪斯镜内 -# 双币同构;free=迁移点亮与彩蛋)/ price [0,9999] / cap [1,9](等级上限;fork/unlock 恒 1)/ +# currency ∈ {keystone, free}(树全钥石单币——2026-10-07 用户裁甲;free=迁移点亮与彩蛋)/ +# price [0,9999] / cap [1,9](等级上限;fork/unlock 恒 1)/ # row(脊柱行号 1..N——row-gating:行 N 可购条件 = 全树已购等级总和 ≥ SPINE_ROW_GATE×(N-1))/ # requires Array[node_id](显式前置——父开子脉内链)/ effects Dictionary(stat 四线 flat: # atk/max_hp/hit/armor_class;rule 键封闭 RULE_KEYS)/ fork_group/fork_side(a/b——同组互斥、 @@ -24,7 +25,7 @@ extends Resource const VEINS := ["spine", "forge", "keystone", "attune"] const KINDS := ["stat", "rule", "unlock", "socket", "fork", "easter"] -const CURRENCIES := ["gp", "keystone", "free"] +const CURRENCIES := ["keystone", "free"] # 树全钥石单币(2026-10-07 用户裁甲——原 gp 枚举值退役,字段保留为呈现元数据) const STAT_KEYS := ["atk", "max_hp", "hit", "armor_class"] ## 规则键封闭词表(零裸 flat 同族护栏——effects.rule 键出域=加载致命;首期两键=T8 Fork 面真实接线) const RULE_KEYS := ["posture_first_strike", "posture_bulwark"] diff --git a/game/data/tables/meta.tres b/game/data/tables/meta.tres index d5532d9a..3d2cddb7 100644 --- a/game/data/tables/meta.tres +++ b/game/data/tables/meta.tres @@ -89,7 +89,8 @@ attune_refresh_upgrade = [{ ; 元进度实现批(2026-09-21,设计权威 design/gdd/systems/冒险循环/元进度.md 定稿 v1.2): ; 数值全 provisional 归元进度设计批配读数(骨架先行——元进度实现批 2026-09-21,先例 = GP+商店房批)。 -; forge flat 档与 GP 商店同族(血+3/攻+1/甲+1),base 10 / ratio 150 三行同;boss 两档 L1 5/1 · L2 8/2 · L3 12/3 +; forge flat 档与局内 GP 商店同族指数值档位非货币(血+3/攻+1/甲+1),base_price 现值 20(2026-09-22 对齿批投值)/ ratio 150 三行同;boss 两档 L1 5/1 · L2 8/2 · L3 12/3 +; 〔2026-10-07 天赋树货币甲案修复批订正——原句「GP 商店同族…base 10」陈旧:GP 字样误导(锻造消费货币=钥石,meta_progression.gd:59 spend_keystone),base 20 经 2026-09-22 对齿批改值〕 ; (首杀全量、重复杀固定小额恒定不递减);工坊六件阈值 1/1/2/2/3/3 按总通关次数(首版只挂通关次数渠道, ; 钥石直购价随定价批后补);conversion 全 0 = 未标定占位(标定归设计批,护甲行强条目:验收读数必须按 ; 解锁后参数重测)。 diff --git a/game/data/tables/meta_tree.tres b/game/data/tables/meta_tree.tres index b37942f9..527d04b3 100644 --- a/game/data/tables/meta_tree.tres +++ b/game/data/tables/meta_tree.tres @@ -9,7 +9,7 @@ rows = [{ "display_name": "生命淬炼·1 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 10, "cap": 3, "row": 1, @@ -21,7 +21,7 @@ rows = [{ "display_name": "攻击淬炼·1 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 10, "cap": 3, "row": 1, @@ -33,7 +33,7 @@ rows = [{ "display_name": "命中淬炼·1 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 10, "cap": 3, "row": 1, @@ -45,7 +45,7 @@ rows = [{ "display_name": "护甲淬炼·1 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 10, "cap": 3, "row": 1, @@ -57,7 +57,7 @@ rows = [{ "display_name": "生命淬炼·2 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 20, "cap": 3, "row": 2, @@ -69,7 +69,7 @@ rows = [{ "display_name": "攻击淬炼·2 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 20, "cap": 3, "row": 2, @@ -81,7 +81,7 @@ rows = [{ "display_name": "命中淬炼·2 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 20, "cap": 3, "row": 2, @@ -93,7 +93,7 @@ rows = [{ "display_name": "护甲淬炼·2 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 20, "cap": 3, "row": 2, @@ -105,7 +105,7 @@ rows = [{ "display_name": "生命淬炼·3 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 30, "cap": 3, "row": 3, @@ -117,7 +117,7 @@ rows = [{ "display_name": "攻击淬炼·3 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 30, "cap": 3, "row": 3, @@ -129,7 +129,7 @@ rows = [{ "display_name": "命中淬炼·3 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 30, "cap": 3, "row": 3, @@ -141,7 +141,7 @@ rows = [{ "display_name": "护甲淬炼·3 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 30, "cap": 3, "row": 3, @@ -153,7 +153,7 @@ rows = [{ "display_name": "生命淬炼·4 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 40, "cap": 3, "row": 4, @@ -165,7 +165,7 @@ rows = [{ "display_name": "攻击淬炼·4 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 40, "cap": 3, "row": 4, @@ -177,7 +177,7 @@ rows = [{ "display_name": "命中淬炼·4 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 40, "cap": 3, "row": 4, @@ -189,7 +189,7 @@ rows = [{ "display_name": "护甲淬炼·4 层", "vein": "spine", "kind": "stat", - "currency": "gp", + "currency": "keystone", "price": 40, "cap": 3, "row": 4, @@ -407,9 +407,11 @@ rows = [{ }] ; 双层 BD 实施批 T8(2026-10-04,R1 甲融合案——整合定稿 §1.4 一树双币三脉一脊+装配区+彩蛋): -; 脊柱 4 行×4 线(生命/攻击/命中/护甲——GP 买深度 cap3 价 10×row;row-gating=全树已购总等级 +; 脊柱 4 行×4 线(生命/攻击/命中/护甲——钥石买深度 cap3 价 10×row〔2026-10-07 用户裁甲 gp→keystone〕; +; row-gating=全树已购总等级 ; ≥ 4×(row−1));锻造脉 3 节点收编 forge_levels(钥石付价=现行迁移零痛);钥石脉=工坊解锁收编 ; (free 迁移点亮)+刷新升级移植;同调脉 socket 3(钥石=规则面首站)+Fork 4 对(A/B 集中同调脉 ; 营地免费切换——effects 首期两 rule 键真实接线余组 stat 面 provisional);彩蛋 1(锻造满排觉醒)。 ; 🔴 层级纪律:局外树只放全局规则件——零 archetype 键(schema 校验强制);规则改写型特性只走局内随机渠道。 ; 数值全 provisional 归 M-4 数值批;A/B 两侧差 <~3pp 验收=T10 MC。 +; 2026-10-07 用户裁甲:树全钥石单币落定(脊柱 16 行 currency gp→keystone;T8「GP 余额域缺位」双币骨架披露销账——GP 局内清零不入存档永不互兑条款不动,元进度.md:55)。数值 provisional 归 M4。 diff --git a/game/presentation/views/camp_overlay_view.gd b/game/presentation/views/camp_overlay_view.gd index 8a910815..01cf6dc9 100644 --- a/game/presentation/views/camp_overlay_view.gd +++ b/game/presentation/views/camp_overlay_view.gd @@ -200,7 +200,7 @@ func _rebuild_tree(data: Dictionary) -> void: hb.add_child(name_l) if String(row.get("kind", "")) == "fork": continue # Fork 行去 UI 化——由 fork_groups 段承载切换钮 - var btn := UiKit.button("购买 %d" % int(row.get("price", 0)), 0.0) # 柜台行板紧凑钮豁免宽度基准 + var btn := UiKit.button("购买 %d 钥石" % int(row.get("price", 0)), 0.0) # 柜台行板紧凑钮豁免宽度基准(树全钥石单币 2026-10-07 裁甲) btn.pressed.connect(func(): tree_buy_requested.emit(String(row.get("node_id", "")))) btn.disabled = not bool(row.get("can_buy", false)) hb.add_child(btn) diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 3d5a04c0..9da0c5a9 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -4667,14 +4667,14 @@ func _smoke_tree() -> void: print("--- 天赋树(MetaTreeTable · 购买面 · A/B 切换 · 三体系迁移)---") check(_db.meta_tree != null and (_db.meta_tree.rows as Array).size() == 33, "meta_tree 已加载(33 节点=脊柱 16+锻造 3+钥石 2+socket 3+Fork 8+彩蛋 1——R1 甲融合案)") - check(_db.meta_tree.validate().is_empty(), "MetaTreeTable.validate 零违例(双币/互斥对/彩蛋 ≤3/零 archetype 层级纪律护栏)") + check(_db.meta_tree.validate().is_empty(), "MetaTreeTable.validate 零违例(单币枚举/互斥对/彩蛋 ≤3/零 archetype 层级纪律护栏)") var sv = _meta_new_save(_META_SMOKE_PATHS[8]) var mp = load("res://core/meta_progression.gd").new(_db, sv) # row-gating:行 2 可购需总等级 ≥4——零购时行 2 拒绝 check(not mp.tree_can_buy("sp_hp_r2"), "row-gating:行 2 不可购(总等级 0 < 4——投入点数累计解锁新行)") check(mp.tree_can_buy("sp_hp_r1") == false or true, "行 1 可购性读面(白板钥石 0=余额面拒)") sv.add_keystone(1000) - check(mp.tree_buy("sp_hp_r1") and sv.tree_level("sp_hp_r1") == 1, "树购买受理(钥石单币承载——GP 余额域缺位披露待追认)") + check(mp.tree_buy("sp_hp_r1") and sv.tree_level("sp_hp_r1") == 1, "树购买受理(树全钥石单币——2026-10-07 用户裁甲)") for i in 3: mp.tree_buy("sp_atk_r1") check(not mp.tree_can_buy("sp_atk_r1"), "cap 拦截(atk 行 1 已满 3 级——购买拒绝)")