修复: 天赋树货币甲案——树全钥石单币落定(2026-10-07 用户裁甲)

- meta_tree.tres: 脊柱 16 行 currency gp→keystone(价格 10/20/30/40 不动,provisional 归 M4);
  表尾 T8 注释改钥石口径+裁甲销账行注
- meta_progression.gd tree_buy: 删 currency 分叉直走 spend_keystone(前后同消费口=零行为变更;
  free 行 price=0 零额消费无副作用),T8 双币骨架披露注释销账
- meta_tree_table.gd: CURRENCIES 枚举 {gp,keystone,free}→{keystone,free}(currency 字段保留为呈现
  元数据),头注补单币口径
- camp_overlay_view.gd: 树购买钮文案「购买 N」→「购买 N 钥石」(行板紧凑钮豁免)
- smoke_all.gd: 4670/4677 断言消息文字随批换代(逻辑零改)
- meta.tres: 表尾陈旧注释订正(「GP 商店同族…base 10」→同族指数值档位非货币+base_price 现值 20
  系 2026-09-22 对齿批投值)

闸: 基线 834/0;改后 smoke 834/0+probe_gate --click 全绿+ui_layout/ui_tune 过;
run_all 17 套件全绿;MC 零跑(静态论证:改动前后同走 spend_keystone,currency 无残余消费方)
This commit is contained in:
DKChan committed 2026-10-07 22:39:30 +08:00
1 parent 3e9360d63f
commit d7a640650f
6 files changed
+33 -32

No files matched your search

+4 -7
View File
@@ -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()
+5 -4
View File
@@ -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"]
+2 -1
View File
@@ -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 = 未标定占位(标定归设计批,护甲行强条目:验收读数必须按
; 解锁后参数重测)。
+19 -17
View File
@@ -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。
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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 级——购买拒绝)")