merge: 天赋树货币甲案修复+卡③提案S2纠偏落籍(2026-10-07 用户裁甲——树全钥石单币:meta_tree.tres 脊柱16行 gp→keystone+schema枚举{keystone,free}+tree_buy直走spend_keystone零行为变更+购买钮文案换代+断言消息换代+meta.tres陈旧注释订正;卡③提案v1.1货币前提全案订正5b/5c换代为钥石口径;闸=基线834/0+改后834/0+probe_gate--click全绿+layout/tune过+run_all 17套件全绿+doc三闸/熵增闸零新增;MC零跑静态论证)

This commit is contained in:
DKChan committed 2026-10-07 22:49:09 +08:00
commit 3b86c9bcc7
8 files changed
+131 -48

No files matched your search

@@ -0,0 +1,76 @@
# 出口报告:天赋树货币甲案修复批 + 卡③提案 S2 纠偏重写(2026-10-07)
- **工作树**:`g-plan2-iter18-treefix`(基点 master 3e9360d)
- **裁决依据**:用户 2026-10-07「按甲方案修复完」——树全钥石单币落定,T8「GP 余额域缺位」双币骨架披露销账
- **性质**:零行为变更静态批(tree_buy 改动前后同走 spend_keystone;currency 仅呈现元数据)
## 一、提交清单
| # | hash | 内容 |
|---|---|---|
| ① | d7a6406 | 修复: 天赋树货币甲案——树全钥石单币落定(6 文件) |
| ② | 30154e5 | 修复: 卡③武器锻造提案 v1.1——盘问轮 S2 纠偏(1 文件) |
| ③ | (本提交) | 出口报告(本文件) |
## 二、改动对照(A-E + meta.tres 顺带订正)
| 项 | 文件 | 改动 |
|---|---|---|
| A | `game/data/tables/meta_tree.tres` | 16 脊柱行(sp_hp/atk/hit/ac × r1..r4)`"currency": "gp"` → `"keystone"`(价格 10/20/30/40 不动,provisional 归 M4);表尾 T8 注释 GP 买深度→钥石买深度;追加 2026-10-07 裁甲销账行注 |
| B | `game/core/meta_progression.gd` tree_buy | 删 currency 变量与 if 包裹,直走 `save.spend_keystone(price)`;注释改裁甲口径。tree_buy_fork 原本直走 spend_keystone 零改动 |
| C | `game/data/schemas/meta_tree_table.gd` | `CURRENCIES` 枚举 `{gp, keystone, free}` → `{keystone, free}`(缺省容忍语义不变——validate 对缺失键照旧报出域);头注双币铁律段换代单币口径 |
| D | `game/presentation/views/camp_overlay_view.gd:203` | 树购买钮 `"购买 %d"` → `"购买 %d 钥石"`(行板紧凑钮豁免宽度基准不变) |
| E | `game/smoke/smoke_all.gd` | 4670「双币/互斥对…」→「单币枚举/互斥对…」、4677「钥石单币承载——GP 余额域缺位披露待追认」→「树全钥石单币——2026-10-07 用户裁甲」(两条均消息文字,逻辑断言零改) |
| 附 | `game/data/tables/meta.tres:92` | 陈旧注释订正:「与 GP 商店同族…base 10」→「与局内 GP 商店同族**指数值档位非货币**…base_price 现值 20(2026-09-22 对齿批投值)」+ 订正溯源注 |
## 三、闸数字
| 闸 | 结果 |
|---|---|
| 基线冒烟(改动前,worktree) | 834 项检查,0 项失败(三闸全过) |
| 改后冒烟 run_smoke | 834 项检查,0 项失败(三闸全过) |
| probe_gate --click | ui_input/ui_struct/ui_contrast/ui_click 四段全绿,批末残留 Godot=0 |
| ui_layout_probe | 退出码 0,SCRIPT ERROR/Parse Error 零命中(该探针系布局 facts 打印设计,无 PASS 行) |
| ui_tune_probe | PASS 全链路 |
| run_all(game/tests) | 17 套件全绿 |
| doc_link_audit --strict | 既有死链 4(06-待办清单 ×2、奇物.md ×2——本批未触碰该三文件,零新增) |
| gdd_lint | 既有 2 文件不通过(R3/R4/R7——本批零 gdd 改动,零新增) |
| doc_term_audit --strict | 既有疑似现行 3 处(伏击/可选类道具/拔旗——均不在本批触碰文件,零新增) |
| repo_structure_audit(熵增闸) | 既有违例 1(design/diagrams 子目录越界——基点已存在,非本批引入,零新增) |
## 四、MC 零跑静态论证(零行为变更)
1. **tree_buy**:旧逻辑 gp/keystone 两值都走 `spend_keystone(price)`;新逻辑无条件走同一口——对全部 currency ∈ {keystone, free} 行为逐值等价。free 行(ks_workshop/easter_ley)price=0,`spend_keystone(0)` 恒 true(实现为 `keystone_balance() < n` 判拒,0 余额不减值)→ free 节点购买状态迁移逐位不变。
2. **currency 字段残余消费方**:全 game/ grep 证实仅剩 schema 枚举校验(新词表覆盖现役全部行值,smoke 4670 validate 零违例过闸)与 `tree_camp_rows` 投影透传(呈现层无渲染消费,camp_overlay_view 仅注释提及)。
3. **按钮文案**:呈现面文字变更,smoke/probe 断言面零钉死(grep `购买 ` 命中均为商店 buy_product 动作描述非树钮文案)。
4. **实证背书**:改后 run_smoke 834/0 + 全探针绿 = 静态论证经验闭环。
## 五、文档命中清单(F 项先 grep 后动)
| 文档 | grep 词 | 结果 | 处置 |
|---|---|---|---|
| design/gdd/systems/跨局循环/元进度.md(注:任务书误写「冒险循环」目录,实际在跨局循环/) | 双币/脊柱/GP 买/天赋树 | 树双币与脊柱 GP 表述零命中(命中 3 行均系历史定名注/版本史;:55 两币分工条款确认在案,不动) | 零改动 |
| design/registry/entities.yaml | meta_tree/currency | 零命中 | 零改动 |
| design/gdd/06-待办清单.md | 天赋树/货币/追认/双币/余额域 | 无 T8 树货币待追认挂单项(命中行均系其他主题) | 零改动 |
## 六、卡③提案 v1.1(S2 纠偏)订正清单
1. 〇节原案一:「营地花金币」→「营地花钥石」
2. F1 事实行:「单次价 20 金币」→「20 钥石(货币=钥石:消费口 meta_progression.gd:59 spend_keystone;meta.tres 仅存计价参数)」
3. 裁点 4b 乙引文:「消费钥石/金币的成长枢纽」→「消费钥石的成长枢纽」
4. 裁点 5a 丙:不同源论据作废改写(工坊=通关次数渠道+钥石直购预留,与武器锻造同属营地钥石经济;淘汰仅依职责混装)
5. 裁点 5b 货币裁点整节重组:甲=纯钥石(推荐)/乙=局外金币余额域(淘汰)/丙=第三货币锻造币(淘汰)
6. 裁点 5c 前提换钥石:甲=纯钥石零材料(推荐,原「不要材料」结论存活)/乙=钥石+材料(代价并列)/丙=纯材料(淘汰)
7. 第九节定价行:基础价 20 钥石(量纲不变括注)
8. 汇总表 5b-1/5c 行换代
9. 文末新增修订记录 v1.1(含错误根源与配套实况)
10. 全文「金币」扫尾:残余 9 处均系订正说明/乙丙备选案描述对象/修订记录事实陈述,合法保留
## 七、偏差披露
1. **任务书元进度.md 路径勘误**:任务书写 `design/gdd/systems/冒险循环/元进度.md`,实际文件在 `design/gdd/systems/跨局循环/元进度.md`(提案 F5 引文路径正确)。已按实际路径完成 grep。
2. **F 项三文档全零命中**:元进度.md 无树双币表述可换代(树系迭代 12 T8 落码,文档正主从未写入双币树口径)、entities.yaml 无树货币登记、待办清单无 T8 追认挂单项——均零改动,未补版本史行注(任务书行注以「有表述则换代」为前提)。
3. **断言面命中 14 处**:13 处系商店 buy_product 动作描述(非树断言),仅 smoke_all.gd 4670/4677 两条消息文字换代。
4. **doc 三闸与熵增闸既有命中**:死链 4/格式 2 文件/术语 3/熵增 1 均系基点既有(本批触碰文件不在其扫描域或未触碰),判据「零新增」满足。
5. **ui_layout_probe 无 PASS 行**:该探针设计为布局 facts 打印(无断言 PASS 输出),以退出码 0 + 零 SCRIPT ERROR 判过。
6. 环境无降级;边车 115 枚全数拷入 worktree(ui_font_asset_test 过闸印证)。
@@ -12,7 +12,7 @@
**原案一(playnote.md:16-17)**:「剑(普通攻击):通过锻造升级可以增加攻击力,升到最高等级时,还可以增加一些额外的效果。」 **原案一(playnote.md:16-17)**:「剑(普通攻击):通过锻造升级可以增加攻击力,升到最高等级时,还可以增加一些额外的效果。」
→ **提案是放大**。游戏现在已经有"攻击锻造"这个营地消费点(营地花金币,攻击力 +1,可重复买——`game/data/tables/meta.tres:14-18`)。提案把它改造成一条有等级、有成长曲线、有满级特效的"剑"升级路线。方向与原案一致,范围扩大。 → **提案是放大**。游戏现在已经有"攻击锻造"这个营地消费点(营地花钥石,攻击力 +1,可重复买——`game/data/tables/meta.tres:14-18`)。提案把它改造成一条有等级、有成长曲线、有满级特效的"剑"升级路线。方向与原案一致,范围扩大。
**原案二(playnote.md:19-22)**:「长枪与法杖:后续可以增加长枪、法杖等武器,它们的攻击类型要分别变为"穿刺"和"魔法"。同样在最高等级时,也会有一些特殊的效果。……实现武器之间的差异化。」 **原案二(playnote.md:19-22)**:「长枪与法杖:后续可以增加长枪、法杖等武器,它们的攻击类型要分别变为"穿刺"和"魔法"。同样在最高等级时,也会有一些特殊的效果。……实现武器之间的差异化。」
@@ -34,7 +34,7 @@
| # | 事实 | 出处 | | # | 事实 | 出处 |
|---|---|---| |---|---|---|
| F1 | 攻击力提升现有两个来源,都是直接加数字,没有"武器"这个实体:①营地属性锻造(攻击锻造 +1 / 生命锻造 +3 / 护甲锻造 +1,单次价 20 金币、每次涨价 150%)②关卡内商店货架(六行共享池+乘法价格公式,`game/core/config_db.gd:329-334` 现役访问器)。商店里还有一组旧的三行商品定义(`shop.tres:36-57`),只在对照模式承载,属遗留(`game/data/schemas/shop_table.gd:16`、`shop.tres:107-109`) | `meta.tres:7-25`、`shop.tres:68-94` | | F1 | 攻击力提升现有两个来源,都是直接加数字,没有"武器"这个实体:①营地属性锻造(攻击锻造 +1 / 生命锻造 +3 / 护甲锻造 +1,单次价 20 钥石、每次涨价 150%——货币=钥石:消费口 `meta_progression.gd:59` spend_keystone,meta.tres 仅存计价参数)②关卡内商店货架(六行共享池+乘法价格公式,`game/core/config_db.gd:329-334` 现役访问器)。商店里还有一组旧的三行商品定义(`shop.tres:36-57`),只在对照模式承载,属遗留(`game/data/schemas/shop_table.gd:16`、`shop.tres:107-109`) | `meta.tres:7-25`、`shop.tres:68-94` |
| F2 | 主角攻击类型轴**已存在、休眠中**:`hero.tres:11` 值为 "normal",字段枚举 {normal, pierce, magic}(`hero_table.gd:13`)。战斗段主角基础攻击按此查克制矩阵。棋盘上的穿刺/魔法直伤奖励件走同一张矩阵但必中全额不掷点(`battle_orchestrator.gd:830` 注、`:846-854`)。**克制矩阵已经是 3×3 九格满格**(`settlement.tres:31-47`:普通/穿刺/魔法 × 轻甲/魔法护甲/重甲)。专长里的三个条件值(pierce_vs_light / magic_vs_heavy / magic_vs_magic)是专长的触发条件值、不是矩阵本体——其中 magic_vs_magic 在现行甲型域下永远为假(见第四节裁点 2c)。敌方装甲类型域 {light, ward, heavy}(`enemy_table.gd:110-113`,缺省 light),实际分布:light×14 行 / heavy×4 行 / ward×1 行(`enemy.tres`;L1 全轻甲、L2 只有 Boss 蛛化卓尔精灵是魔法护甲、L3 灰矮人族四行重甲)。敌方攻击无类型、不查矩阵(`damage_controller.gd:19/:513`)。克制矩阵的定义文档 = [战斗结算](../gdd/systems/战斗循环/战斗结算.md)与[敌人系统](../gdd/systems/战斗循环/敌人系统.md) | 见左 | | F2 | 主角攻击类型轴**已存在、休眠中**:`hero.tres:11` 值为 "normal",字段枚举 {normal, pierce, magic}(`hero_table.gd:13`)。战斗段主角基础攻击按此查克制矩阵。棋盘上的穿刺/魔法直伤奖励件走同一张矩阵但必中全额不掷点(`battle_orchestrator.gd:830` 注、`:846-854`)。**克制矩阵已经是 3×3 九格满格**(`settlement.tres:31-47`:普通/穿刺/魔法 × 轻甲/魔法护甲/重甲)。专长里的三个条件值(pierce_vs_light / magic_vs_heavy / magic_vs_magic)是专长的触发条件值、不是矩阵本体——其中 magic_vs_magic 在现行甲型域下永远为假(见第四节裁点 2c)。敌方装甲类型域 {light, ward, heavy}(`enemy_table.gd:110-113`,缺省 light),实际分布:light×14 行 / heavy×4 行 / ward×1 行(`enemy.tres`;L1 全轻甲、L2 只有 Boss 蛛化卓尔精灵是魔法护甲、L3 灰矮人族四行重甲)。敌方攻击无类型、不查矩阵(`damage_controller.gd:19/:513`)。克制矩阵的定义文档 = [战斗结算](../gdd/systems/战斗循环/战斗结算.md)与[敌人系统](../gdd/systems/战斗循环/敌人系统.md) | 见左 |
| F3 | 主角护甲现状:AC(护甲等级,掷点减伤判定用)单值现役生效(`hero.tres:9` 值 10,判定消费 `battle_orchestrator.gd:172`);**甲型结构位已在册休眠**(`hero.tres:10` armor_type="light",`hero_table.gd:12`)——休眠原因是敌方攻击不查矩阵,属结构性而非数值性(《敌人系统》主角字段表注记)。甲型域三值 = {light, ward, heavy}。AC 现有提升渠道 = 营地护甲锻造 +1 / 商店货架护甲件 / 局内奇物属性件 | 见左 | | F3 | 主角护甲现状:AC(护甲等级,掷点减伤判定用)单值现役生效(`hero.tres:9` 值 10,判定消费 `battle_orchestrator.gd:172`);**甲型结构位已在册休眠**(`hero.tres:10` armor_type="light",`hero_table.gd:12`)——休眠原因是敌方攻击不查矩阵,属结构性而非数值性(《敌人系统》主角字段表注记)。甲型域三值 = {light, ward, heavy}。AC 现有提升渠道 = 营地护甲锻造 +1 / 商店货架护甲件 / 局内奇物属性件 | 见左 |
| F4 | 局内属性件:奇物三分类里的"属性值提升"分类 = 生命上限 / AC / 攻击三轴,进冒险加算区,关间不清零([奇物](../gdd/systems/冒险循环/奇物.md) §1.2,分类封闭:"只有这三项,多一项就要走文档修订")。它与 F1 的营地/商店构成"账号层永久 + 局内单冒险"两层结构,现役并存 | `design/gdd/systems/冒险循环/奇物.md` | | F4 | 局内属性件:奇物三分类里的"属性值提升"分类 = 生命上限 / AC / 攻击三轴,进冒险加算区,关间不清零([奇物](../gdd/systems/冒险循环/奇物.md) §1.2,分类封闭:"只有这三项,多一项就要走文档修订")。它与 F1 的营地/商店构成"账号层永久 + 局内单冒险"两层结构,现役并存 | `design/gdd/systems/冒险循环/奇物.md` |
@@ -188,7 +188,7 @@ AC(护甲等级)单值现役生效(`hero.tres:9`=10;敌方攻击掷点
### 裁点 4b:解锁节奏从哪来 ### 裁点 4b:解锁节奏从哪来
- **甲=锻造内自闭环(推荐)**:新武器/新甲型的解锁条件在锻造系统内部(练满前一档或花一次性解锁价,见第七节);满级特效是每条路线的终点奖励。这是原案的精神("最高等级时拿到额外效果""最高等级时解锁重甲/魔法甲")。 - **甲=锻造内自闭环(推荐)**:新武器/新甲型的解锁条件在锻造系统内部(练满前一档或花一次性解锁价,见第七节);满级特效是每条路线的终点奖励。这是原案的精神("最高等级时拿到额外效果""最高等级时解锁重甲/魔法甲")。
- **乙=绑关卡进度**:L1 通关解锁长枪之类。**淘汰依据**:①把永久强化做成关卡奖励,与"营地 = 消费钥石/金币的成长枢纽"的现役定位(《元进度》营地定义)冲突;②首通关卡前玩家零武器选择,第一局体验被绑死在剑上——而第一局恰恰是教学局。 - **乙=绑关卡进度**:L1 通关解锁长枪之类。**淘汰依据**:①把永久强化做成关卡奖励,与"营地 = 消费钥石的成长枢纽"的现役定位(《元进度》营地定义)冲突;②首通关卡前玩家零武器选择,第一局体验被绑死在剑上——而第一局恰恰是教学局。
### 裁点 4c:与难度曲线的匹配义务(显式登记,不在本批执行) ### 裁点 4c:与难度曲线的匹配义务(显式登记,不在本批执行)
@@ -204,24 +204,24 @@ AC(护甲等级)单值现役生效(`hero.tres:9`=10;敌方攻击掷点
- **甲=就地改造属性锻造柜台(推荐)**:柜台改名"武器与护甲锻造"——攻击行改造为武器锻造区(三件武器路线),护甲行改造为护甲锻造区(三型甲路线),**生命行原样保留**(原案没有覆盖生命,保留是唯一不失义的处理)。三柜台结构不动,营地界面零重排。 - **甲=就地改造属性锻造柜台(推荐)**:柜台改名"武器与护甲锻造"——攻击行改造为武器锻造区(三件武器路线),护甲行改造为护甲锻造区(三型甲路线),**生命行原样保留**(原案没有覆盖生命,保留是唯一不失义的处理)。三柜台结构不动,营地界面零重排。
- **乙=新开第四柜台**:武器锻造独立成柜,属性锻造柜台的攻击/护甲两行退役。**淘汰依据**:属性锻造被拆剩一行生命,柜台语义残废;营地从三柜台变四柜台=界面结构改动;"锻造"两个字同时出现在两个柜台(外加商店货架的"攻击锻升","锻"字已有三处)——词汇更乱。 - **乙=新开第四柜台**:武器锻造独立成柜,属性锻造柜台的攻击/护甲两行退役。**淘汰依据**:属性锻造被拆剩一行生命,柜台语义残废;营地从三柜台变四柜台=界面结构改动;"锻造"两个字同时出现在两个柜台(外加商店货架的"攻击锻升","锻"字已有三处)——词汇更乱。
- **丙=塞进道具工坊**:**淘汰依据**:工坊的消费货币是通关次数/钥石(`meta.tres:39-88`),与武器锻造的金币定价体系不同源;工坊职责已有明确归属(秘宝解锁与同调装配,《元进度》形态沿革节),塞武器=职责混装。 - **丙=塞进道具工坊**:**淘汰依据**:工坊职责已有明确归属(秘宝解锁与同调装配,《元进度》形态沿革节),塞武器=职责混装。注(v1.1 订正):工坊与武器锻造在货币上同源——工坊现役=通关次数渠道+钥石直购预留(`meta.tres:39-88`),与武器锻造同属营地钥石经济;原「金币定价体系不同源」论据作废,本案淘汰仅依职责混装。
### 裁点 5b:等级上限与定价结构 ### 裁点 5b:等级上限与定价结构
- **等级上限**:每件武器/每型甲各自封顶(provisional 锚点 = 5 级量级)。量纲理由:满级特效要"值得等",级数太多会稀释解锁节奏(与 F6 冲突)。终值归 M4。 - **等级上限**:每件武器/每型甲各自封顶(provisional 锚点 = 5 级量级)。量纲理由:满级特效要"值得等",级数太多会稀释解锁节奏(与 F6 冲突)。终值归 M4。
- **定价结构**:沿用现役几何递增——每级价格 = 基础价 × 150%^(已购级数)(现役参数:单次 20 金币、每级涨 150%,`meta.tres:11-24`;《元进度》定价曲线几何递增是已拍板条款)。甲型解锁 = 一次性解锁价(量纲 ≈ 中段几级锻造的花费,provisional)。全部终值归 M4。 - **定价结构**:沿用现役几何递增——每级价格 = 基础价 × 150%^(已购级数)(现役参数:单次 20 钥石、每级涨 150%,`meta.tres:11-24`;《元进度》定价曲线几何递增是已拍板条款)。甲型解锁 = 一次性解锁价(量纲 ≈ 中段几级锻造的花费,provisional)。全部终值归 M4。
- **货币裁点**: - **货币裁点(v1.1 重组——现役营地一切消费货币=钥石非金币,事实依据见文末修订记录)**:
- **甲=纯金币(推荐)**:与现役属性锻造同币——原案语义是"攻击力提升改造",即同一笔钱换个花法,不是新经济。 - **甲=纯钥石(推荐)**:与现役属性锻造/天赋树(2026-10-07 用户裁甲后树全钥石单币)/同调刷新升级同币同柜——原案语义是"攻击力提升改造",即同一笔钱换个花法,语义保真;零新经济面;Boss 击杀掉落产出与几何递增定价配套现成(`meta.tres:26-38`)。
- **乙=金币+钥石双币**(解锁新武器/甲用钥石):钥石现役 = Boss 击杀掉落、用于直购强化(`meta.tres:26-38`)。**淘汰依据**:解锁节奏被 Boss 掉落概率绑死,与裁点 4b"解锁在锻造内自闭环"矛盾;双币定价面翻倍。 - **乙=引入局外持久金币余额域**(金币入存档、可付营地消费):**淘汰依据**:须推翻两币分工拍板条款(《元进度》:"GP(金币)= 冒险内一次性属性提升货币——局内清零、不入存档……两币永不互兑",元进度.md:55)+ 新存档域 + 金币出口入账规则一套;与"金币无法带出冒险"(2026-10-07 用户判定)直接相逆。
- **丙=纯钥石**:**淘汰依据**:与"攻击力提升改造"直接相逆(现役攻击锻造吃金币),等于换了一个系统而不是改造它。 - **丙=第三货币锻造币**(独立于钥石/金币的专用锻造币):**淘汰依据**:无产出渠道凭空造经济——产出渠道、兑换规则、存档域、呈现位全套新建,实装量三案最大。
### 裁点 5c:材料经济——金币之外要不要材料/掉落物? ### 裁点 5c:材料经济——钥石之外要不要材料/掉落物?(v1.1 前提由金币换钥石)
**现状钩子**:效果引擎有效果类型 grant_material(`effect_engine.gd:32`;`feats.tres` 四件专长在用,形态=局内材料计数器,如"雷区图谱")。注意:这个钩子现役是**局内**计数器,不是账号层库存——提案若引入账号层锻造材料,是全新经济面(存档域、获取渠道、囤积规则全要新建)。 **现状钩子**:效果引擎有效果类型 grant_material(`effect_engine.gd:32`;`feats.tres` 四件专长在用,形态=局内材料计数器,如"雷区图谱")。注意:这个钩子现役是**局内**计数器,不是账号层库存——提案若引入账号层锻造材料,是全新经济面(存档域、获取渠道、囤积规则全要新建)。
- **甲=纯金币(推荐)**:零新经济面。原案全文只字未提材料;武器差异化的价值轴是类型与特效,不是采集刷料。 - **甲=纯钥石零材料(推荐)**:零新经济面。原案全文只字未提材料;武器差异化的价值轴是类型与特效,不是采集刷料。(v1.1 注:原「不要材料」结论存活,计价前提由金币换钥石。)
- **乙=金币+材料**:敌杀掉落锻造材料,高阶解锁或满级特效需要材料(grant_material 账号层化)。**代价(不淘汰,并列呈交)**:新存档域+新掉落配置+囤积/回收规则;且"局内材料计数器"与"账号层锻造材料"同名易混,呈现层必须区分两个概念。 - **乙=钥石+材料**:敌杀掉落锻造材料,高阶解锁或满级特效需要材料(grant_material 账号层化)。**代价(不淘汰,并列呈交)**:新存档域+新掉落配置+囤积/回收规则;且"局内材料计数器"与"账号层锻造材料"同名易混,呈现层必须区分两个概念。
- **丙=纯材料**:金币买不了武器,只有材料能锻。**淘汰依据**:与"攻击力提升改造"直接相逆(把现有金币消费点脱钩);双货币双定价体系,实装量三案最大。 - **丙=纯材料**:钥石买不了武器,只有材料能锻。**淘汰依据**:与现役钥石直购脱钩=换系统而非改造;双货币双定价体系,实装量三案最大。
### 裁点 5d:配比预设挂起批的边界注记(强制条目) ### 裁点 5d:配比预设挂起批的边界注记(强制条目)
@@ -264,7 +264,7 @@ AC(护甲等级)单值现役生效(`hero.tres:9`=10;敌方攻击掷点
| 武器成长曲线 | 前缓后陡:低级每级攻击 +0/+1 量级,高级 +1/+2 量级 | 现役攻击锻造 +1/次(`meta.tres:16-17`);主角基础攻击 =2(`hero.tres:8`) | M4 | | 武器成长曲线 | 前缓后陡:低级每级攻击 +0/+1 量级,高级 +1/+2 量级 | 现役攻击锻造 +1/次(`meta.tres:16-17`);主角基础攻击 =2(`hero.tres:8`) | M4 |
| 甲型基础 AC | 轻 10(现役不动)/ 重 +2 / 魔法甲 −1 | 主角 AC=10(`hero.tres:9`);每 1 AC ≈ 3.75% 期望减伤(`settlement.tres:74` EV 锚) | M4 | | 甲型基础 AC | 轻 10(现役不动)/ 重 +2 / 魔法甲 −1 | 主角 AC=10(`hero.tres:9`);每 1 AC ≈ 3.75% 期望减伤(`settlement.tres:74` EV 锚) | M4 |
| 等级上限 | 每件/每型各自 5 级量级 | 满级特效节奏需要(F6) | M4 | | 等级上限 | 每件/每型各自 5 级量级 | 满级特效节奏需要(F6) | M4 |
| 升级定价 | 基础价 20 金币 × 150%^(级数),几何递增 | 现役参数沿用(`meta.tres:11-24`、《元进度》几何递增条款) | M4 | | 升级定价 | 基础价 20 钥石 × 150%^(级数),几何递增〔该参数本系现役钥石计价——meta.tres:11-24 经 meta_progression.gd:59 钥石消费口生效,量纲不变〕 | 现役参数沿用(`meta.tres:11-24`、《元进度》几何递增条款) | M4 |
| 甲型解锁价 | ≈ 中段几级锻造花费的一次性价 | 同上量纲系 | M4 | | 甲型解锁价 | ≈ 中段几级锻造花费的一次性价 | 同上量纲系 | M4 |
| 满级特效值 | 各 +1 点/若干层量级,逐条配 | 第八节框架表 | M4 | | 满级特效值 | 各 +1 点/若干层量级,逐条配 | 第八节框架表 | M4 |
| 数值验证义务 | 实装批改前/改后同种子配对读数;统一调整归 M4 | 裁点 4c | M4 | | 数值验证义务 | 实装批改前/改后同种子配对读数;统一调整归 M4 | 裁点 4c | M4 |
@@ -299,8 +299,8 @@ AC(护甲等级)单值现役生效(`hero.tres:9`=10;敌方攻击掷点
| 4a | 成长曲线形状 | 前缓后陡 | 线性 | 阶梯 | 甲(只锁方向,值归 M4) | | 4a | 成长曲线形状 | 前缓后陡 | 线性 | 阶梯 | 甲(只锁方向,值归 M4) |
| 4b | 解锁节奏 | 锻造内自闭环 | 绑关卡进度 | — | 甲 | | 4b | 解锁节奏 | 锻造内自闭环 | 绑关卡进度 | — | 甲 |
| 5a | 柜台承载 | 就地改造属性锻造柜台 | 新开第四柜台 | 塞进道具工坊 | 甲 | | 5a | 柜台承载 | 就地改造属性锻造柜台 | 新开第四柜台 | 塞进道具工坊 | 甲 |
| 5b-1 | 货币 | 纯金币 | 金币+钥石双币 | 纯钥石 | 纯金币 | | 5b-1 | 货币 | 纯钥石 | 局外金币余额域 | 第三货币锻造币 | 纯钥石 |
| 5c | 材料经济 | 纯金币 | 金币+材料 | 纯材料 | 纯金币 | | 5c | 材料经济 | 纯钥石(零材料) | 钥石+材料 | 纯材料 | 纯钥石(零材料) |
| 6 | 满级特效 | 全复用现役效果类型 | 含新参数位(三条标红) | 引入新效果类型 | 乙(复用为主,零新效果类型) | | 6 | 满级特效 | 全复用现役效果类型 | 含新参数位(三条标红) | 引入新效果类型 | 乙(复用为主,零新效果类型) |
| 8a | 货架现名 | 保留"攻击锻升"现名 | 改"训练·攻击"式中性名 | — | 随实装批呈现细节定 | | 8a | 货架现名 | 保留"攻击锻升"现名 | 改"训练·攻击"式中性名 | — | 随实装批呈现细节定 |
@@ -309,3 +309,9 @@ AC(护甲等级)单值现役生效(`hero.tres:9`=10;敌方攻击掷点
## 附:本提案的裁决方式 ## 附:本提案的裁决方式
每个裁点独立拍板,互不绑死(推荐列只是提案立场,不是打包方案)。裁决结果落 06-待办清单「武器锻造系统」专条与路线图卡③行;裁决通过后实装批另行立项,以本提案+裁决记录为任务书输入。 每个裁点独立拍板,互不绑死(推荐列只是提案立场,不是打包方案)。裁决结果落 06-待办清单「武器锻造系统」专条与路线图卡③行;裁决通过后实装批另行立项,以本提案+裁决记录为任务书输入。
---
## 修订记录
- **v1.1(2026-10-07 盘问轮 S2 纠偏)——货币前提全案订正**。事实修正依据:现役营地一切消费货币=钥石(buy_forge→spend_keystone `meta_progression.gd:59`;树 tree_buy/tree_buy_fork 与刷新升级 buy_attune_refresh 同走 spend_keystone 钥石消费口);GP(显示名金币)=局内一次性货币,开局清零(`adventure_runner.gd:116`)、不入存档(save schema 无 gp 域),两币永不互兑(《元进度》两币分工拍板条款,元进度.md:55);金币无法支付营地柜台账(用户判定 2026-10-07)。错误根源=meta_tree.tres 脊柱行 gp 声明 + meta.tres 表尾陈旧注释「与 GP 商店同族」误导成文。订正面:〇节原案一注记、F1 事实行、裁点 4b 乙引文、裁点 5a 丙论据、裁点 5b 货币裁点整节重组(甲=纯钥石/乙=局外金币余额域/丙=第三货币锻造币)、裁点 5c 前提换钥石(甲=纯钥石零材料)、第九节定价行、第十节汇总表 5b-1/5c 行。配套实况:天赋树货币甲案同日修复(树全钥石单币落定,T8「GP 余额域缺位」双币骨架披露销账)。
+4 -7
View File
@@ -184,18 +184,15 @@ func tree_can_buy(node_id: String) -> bool:
return true return true
# 节点购买(营地树 UI 唯一写口):**单币=钥石先行**(双币铁律中 GP 需局外余额承载域——GP 冒险 # 节点购买(营地树 UI 唯一写口):树全钥石单币(2026-10-07 用户裁甲——原 T8 双币骨架披露销账;
# 收束清零=局内死钱不跨局,GP 余额域缺位,脊柱 GP 节点暂走钥石消费——表 currency 字段保留语义, # 表内 currency 字段保留为呈现元数据)。free=迁移点亮/彩蛋觉醒零币(price 0,零额消费无副作用)。
# T9/数值批补 GP 余额域后切回——台账披露待追认)。free=迁移点亮/彩蛋觉醒零币。
func tree_buy(node_id: String) -> bool: func tree_buy(node_id: String) -> bool:
var row: Dictionary = db.tree_node(node_id) var row: Dictionary = db.tree_node(node_id)
if row.is_empty() or not tree_can_buy(node_id): if row.is_empty() or not tree_can_buy(node_id):
return false return false
var price := int(row.get("price", 0)) var price := int(row.get("price", 0))
var currency := String(row.get("currency", "gp")) if not save.spend_keystone(price):
if currency == "gp" or currency == "keystone": return false
if not save.spend_keystone(price):
return false # T8 骨架单币承载(GP 余额域缺位——披露待追认)
save.set_tree_level(node_id, save.tree_level(node_id) + 1) save.set_tree_level(node_id, save.tree_level(node_id) + 1)
_check_easter_egg() _check_easter_egg()
return save.write_to_disk() 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) # Date: 2026-10-04(双层 BD 实施批 T8;设计权威 双层BD体系-整合定稿-2026-10-03 §1.4)
# 数据配置 MetaTreeTable schema(元进度 回填 owner 批末落文;行 = Dictionary 键 node_id,Rule 4 豁免 # 数据配置 MetaTreeTable schema(元进度 回填 owner 批末落文;行 = Dictionary 键 node_id,Rule 4 豁免
# 定义表——FeatTable 先例)。 # 定义表——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=四线数值/ # 数值专精;keystone=钥石脉内容解锁;attune=同调脉槽位与规则)/ kind ∈ KINDS(stat=四线数值/
# rule=全局规则/unlock=内容解锁/socket=同调位/fork=A/B 互斥对/easter=彩蛋觉醒)/ # rule=全局规则/unlock=内容解锁/socket=同调位/fork=A/B 互斥对/easter=彩蛋觉醒)/
# currency ∈ {gp, keystone, free}(双币铁律:GP 喂脊柱数值、钥石喂 Unlock/Socket/Fork——哈迪斯镜内 # currency ∈ {keystone, free}(树全钥石单币——2026-10-07 用户裁甲;free=迁移点亮与彩蛋)/
# 双币同构;free=迁移点亮与彩蛋)/ price [0,9999] / cap [1,9](等级上限;fork/unlock 恒 1)/ # price [0,9999] / cap [1,9](等级上限;fork/unlock 恒 1)/
# row(脊柱行号 1..N——row-gating:行 N 可购条件 = 全树已购等级总和 ≥ SPINE_ROW_GATE×(N-1))/ # row(脊柱行号 1..N——row-gating:行 N 可购条件 = 全树已购等级总和 ≥ SPINE_ROW_GATE×(N-1))/
# requires Array[node_id](显式前置——父开子脉内链)/ effects Dictionary(stat 四线 flat: # requires Array[node_id](显式前置——父开子脉内链)/ effects Dictionary(stat 四线 flat:
# atk/max_hp/hit/armor_class;rule 键封闭 RULE_KEYS)/ fork_group/fork_side(a/b——同组互斥、 # 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 VEINS := ["spine", "forge", "keystone", "attune"]
const KINDS := ["stat", "rule", "unlock", "socket", "fork", "easter"] 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"] const STAT_KEYS := ["atk", "max_hp", "hit", "armor_class"]
## 规则键封闭词表(零裸 flat 同族护栏——effects.rule 键出域=加载致命;首期两键=T8 Fork 面真实接线) ## 规则键封闭词表(零裸 flat 同族护栏——effects.rule 键出域=加载致命;首期两键=T8 Fork 面真实接线)
const RULE_KEYS := ["posture_first_strike", "posture_bulwark"] 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): ; 元进度实现批(2026-09-21,设计权威 design/gdd/systems/冒险循环/元进度.md 定稿 v1.2):
; 数值全 provisional 归元进度设计批配读数(骨架先行——元进度实现批 2026-09-21,先例 = GP+商店房批)。 ; 数值全 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 按总通关次数(首版只挂通关次数渠道, ; (首杀全量、重复杀固定小额恒定不递减);工坊六件阈值 1/1/2/2/3/3 按总通关次数(首版只挂通关次数渠道,
; 钥石直购价随定价批后补);conversion 全 0 = 未标定占位(标定归设计批,护甲行强条目:验收读数必须按 ; 钥石直购价随定价批后补);conversion 全 0 = 未标定占位(标定归设计批,护甲行强条目:验收读数必须按
; 解锁后参数重测)。 ; 解锁后参数重测)。
+19 -17
View File
@@ -9,7 +9,7 @@ rows = [{
"display_name": "生命淬炼·1 层", "display_name": "生命淬炼·1 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 10, "price": 10,
"cap": 3, "cap": 3,
"row": 1, "row": 1,
@@ -21,7 +21,7 @@ rows = [{
"display_name": "攻击淬炼·1 层", "display_name": "攻击淬炼·1 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 10, "price": 10,
"cap": 3, "cap": 3,
"row": 1, "row": 1,
@@ -33,7 +33,7 @@ rows = [{
"display_name": "命中淬炼·1 层", "display_name": "命中淬炼·1 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 10, "price": 10,
"cap": 3, "cap": 3,
"row": 1, "row": 1,
@@ -45,7 +45,7 @@ rows = [{
"display_name": "护甲淬炼·1 层", "display_name": "护甲淬炼·1 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 10, "price": 10,
"cap": 3, "cap": 3,
"row": 1, "row": 1,
@@ -57,7 +57,7 @@ rows = [{
"display_name": "生命淬炼·2 层", "display_name": "生命淬炼·2 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 20, "price": 20,
"cap": 3, "cap": 3,
"row": 2, "row": 2,
@@ -69,7 +69,7 @@ rows = [{
"display_name": "攻击淬炼·2 层", "display_name": "攻击淬炼·2 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 20, "price": 20,
"cap": 3, "cap": 3,
"row": 2, "row": 2,
@@ -81,7 +81,7 @@ rows = [{
"display_name": "命中淬炼·2 层", "display_name": "命中淬炼·2 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 20, "price": 20,
"cap": 3, "cap": 3,
"row": 2, "row": 2,
@@ -93,7 +93,7 @@ rows = [{
"display_name": "护甲淬炼·2 层", "display_name": "护甲淬炼·2 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 20, "price": 20,
"cap": 3, "cap": 3,
"row": 2, "row": 2,
@@ -105,7 +105,7 @@ rows = [{
"display_name": "生命淬炼·3 层", "display_name": "生命淬炼·3 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 30, "price": 30,
"cap": 3, "cap": 3,
"row": 3, "row": 3,
@@ -117,7 +117,7 @@ rows = [{
"display_name": "攻击淬炼·3 层", "display_name": "攻击淬炼·3 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 30, "price": 30,
"cap": 3, "cap": 3,
"row": 3, "row": 3,
@@ -129,7 +129,7 @@ rows = [{
"display_name": "命中淬炼·3 层", "display_name": "命中淬炼·3 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 30, "price": 30,
"cap": 3, "cap": 3,
"row": 3, "row": 3,
@@ -141,7 +141,7 @@ rows = [{
"display_name": "护甲淬炼·3 层", "display_name": "护甲淬炼·3 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 30, "price": 30,
"cap": 3, "cap": 3,
"row": 3, "row": 3,
@@ -153,7 +153,7 @@ rows = [{
"display_name": "生命淬炼·4 层", "display_name": "生命淬炼·4 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 40, "price": 40,
"cap": 3, "cap": 3,
"row": 4, "row": 4,
@@ -165,7 +165,7 @@ rows = [{
"display_name": "攻击淬炼·4 层", "display_name": "攻击淬炼·4 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 40, "price": 40,
"cap": 3, "cap": 3,
"row": 4, "row": 4,
@@ -177,7 +177,7 @@ rows = [{
"display_name": "命中淬炼·4 层", "display_name": "命中淬炼·4 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 40, "price": 40,
"cap": 3, "cap": 3,
"row": 4, "row": 4,
@@ -189,7 +189,7 @@ rows = [{
"display_name": "护甲淬炼·4 层", "display_name": "护甲淬炼·4 层",
"vein": "spine", "vein": "spine",
"kind": "stat", "kind": "stat",
"currency": "gp", "currency": "keystone",
"price": 40, "price": 40,
"cap": 3, "cap": 3,
"row": 4, "row": 4,
@@ -407,9 +407,11 @@ rows = [{
}] }]
; 双层 BD 实施批 T8(2026-10-04,R1 甲融合案——整合定稿 §1.4 一树双币三脉一脊+装配区+彩蛋): ; 双层 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(钥石付价=现行迁移零痛);钥石脉=工坊解锁收编 ; ≥ 4×(row−1));锻造脉 3 节点收编 forge_levels(钥石付价=现行迁移零痛);钥石脉=工坊解锁收编
; (free 迁移点亮)+刷新升级移植;同调脉 socket 3(钥石=规则面首站)+Fork 4 对(A/B 集中同调脉 ; (free 迁移点亮)+刷新升级移植;同调脉 socket 3(钥石=规则面首站)+Fork 4 对(A/B 集中同调脉
; 营地免费切换——effects 首期两 rule 键真实接线余组 stat 面 provisional);彩蛋 1(锻造满排觉醒)。 ; 营地免费切换——effects 首期两 rule 键真实接线余组 stat 面 provisional);彩蛋 1(锻造满排觉醒)。
; 🔴 层级纪律:局外树只放全局规则件——零 archetype 键(schema 校验强制);规则改写型特性只走局内随机渠道。 ; 🔴 层级纪律:局外树只放全局规则件——零 archetype 键(schema 校验强制);规则改写型特性只走局内随机渠道。
; 数值全 provisional 归 M-4 数值批;A/B 两侧差 <~3pp 验收=T10 MC。 ; 数值全 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) hb.add_child(name_l)
if String(row.get("kind", "")) == "fork": if String(row.get("kind", "")) == "fork":
continue # Fork 行去 UI 化——由 fork_groups 段承载切换钮 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.pressed.connect(func(): tree_buy_requested.emit(String(row.get("node_id", ""))))
btn.disabled = not bool(row.get("can_buy", false)) btn.disabled = not bool(row.get("can_buy", false))
hb.add_child(btn) hb.add_child(btn)
+2 -2
View File
@@ -4667,14 +4667,14 @@ func _smoke_tree() -> void:
print("--- 天赋树(MetaTreeTable · 购买面 · A/B 切换 · 三体系迁移)---") print("--- 天赋树(MetaTreeTable · 购买面 · A/B 切换 · 三体系迁移)---")
check(_db.meta_tree != null and (_db.meta_tree.rows as Array).size() == 33, 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 甲融合案)") "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 sv = _meta_new_save(_META_SMOKE_PATHS[8])
var mp = load("res://core/meta_progression.gd").new(_db, sv) var mp = load("res://core/meta_progression.gd").new(_db, sv)
# row-gating:行 2 可购需总等级 ≥4——零购时行 2 拒绝 # row-gating:行 2 可购需总等级 ≥4——零购时行 2 拒绝
check(not mp.tree_can_buy("sp_hp_r2"), "row-gating:行 2 不可购(总等级 0 < 4——投入点数累计解锁新行)") 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=余额面拒)") check(mp.tree_can_buy("sp_hp_r1") == false or true, "行 1 可购性读面(白板钥石 0=余额面拒)")
sv.add_keystone(1000) 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: for i in 3:
mp.tree_buy("sp_atk_r1") mp.tree_buy("sp_atk_r1")
check(not mp.tree_can_buy("sp_atk_r1"), "cap 拦截(atk 行 1 已满 3 级——购买拒绝)") check(not mp.tree_can_buy("sp_atk_r1"), "cap 拦截(atk 行 1 已满 3 级——购买拒绝)")