diff --git a/active.md b/active.md index c5c770f2..e3da07f4 100644 --- a/active.md +++ b/active.md @@ -80,3 +80,5 @@ - **485(2026-10-13,R1 机制位批——requires_level 等级阈值前置随批重立)**:用户对迭代 21 追认单 #1 裁「b) 推翻,补机制位小批」并令当场做(不占迭代号——用户令小批模式)。落地=卡片 v1.7 留任案形态:meta_tree_table.gd KEY_WHITELIST+requires_level 字段(Dictionary{node_id: n})+validate 三拒(键悬空/阈值<1/类型错);meta_progression.gd tree_can_buy 等级阈值判定分支+tree_gate_text 门槛文案+tree_camp_rows 投影行 gate_text;camp_overlay_view.gd 行板未达标 🔒 标+悬停文案;新单测 tree_requires_level_test 八断言(schema 四拒一过+判定三态+投影两态——首跑抓出测试自身时序 bug〔零配置行断言跑在 cap 满状态后〕重排修正)入 run_all(24→25 套);现役 12 行零配置=机制位空转零行为影响(配置归表行随需填)。闸=冒烟 938/0+run_all 25 套+probe --click/--full+render_gate 全绿(零漂移;MC 豁免=零数值零行为)+doc 三闸对基线零新增+熵增 PASS。文档=天赋树.md v0.10(六处 R1 表述换代:状态行/范围表/schema 连带/购买校验③/调参表/验收前置行)+iter21 报告 §四 #1 推翻标注+§八兑现注。合并 29b08d4(基点含并行 UI 主题卡片批 89b0008);主区 run_all 25 套兜底绿;worktree 与分支已清理。**迭代 21 追认单终态:十二条全收口**(十条追认+#1 推翻重立+#4 追认带意向);悬置仅剩 #10 锻造段异议结论(状态面板改名已落地)。(worktree r1mech-20261013;编号顺延 485——483 系并行术语表微批、484 系本会话改名批登记) - **486(2026-10-13,迭代 21 追认单终清——#10 裁维持现状)**:用户裁「维持现状就行了,到时候效果有问题,我再让你做对应的优化更改。现在不用动」——状态面板不补锻造概览(原属性锻造三行的信息缺口:锻造工坊武器/护甲路线等级面板不可见,用户知悉并接受,将来实际游玩效果有问题时按需提优化)。iter21 报告 §四 #10 标注追认结果收口。**至此迭代 21 待用户事项全部出清**(追认单十二条+反哺六条+欠账三条全链闭环);各批(20/21/22/23)追认与反哺全部出清,项目待用户面仅剩四批实机目检人闸+存量未决面(美术 P0 两项/去毒残留词/喂雷流 R5/通关口径 273 处)。快照/主战场换代。零代码零游戏文件。(worktree log486-20261013;编号顺延 486) + +- **487(2026-10-13,迭代 24 敌人表内容修批(三关)开工——U0 单会话交付)**:定义入库 0c083bb(主区守卫拦 commit 坑再证——b89c3fe worktree 提交 --no-ff 合回舞步);开工门=需求卡片 v1.1 零待裁点(Q1-Q9 全裁用户令「按推荐方式」)。基线复读:冒烟 938/0 + run_all **25 套**(卡片/roadmap 记 24 系 485 R1 批加套前旧基线,随批换代呈报)+ probe --click 全绿;改前 MC 锚落盘 sim-data/runsum_iter24_pre_n40both_20261013.jsonl(二档 N=20×both·seed0=9000 沿用迭代 23 配对种子:normal L1 通关 3/20·taken 中位 29.5;perfect L1 19/20·L2 8/20·全通 6/20·taken 中位 76.5)。T1 N1 落地=enemy.tres (1,2) hp 50→22·ac 3→2+表尾批注(阶名化解方案实机未达预期重裁沿革)+V1 两断言(降档锚定+相邻总量比≤2.5 护栏);T2 N2 落地=skills.tres 12→14 行(venom_spit 毒吐 ×1.6/CD2·shield_bash 盾击 ×1.7/CD3 均无 rider)+六池投放(蜘蛛 (2,5)-(2,7)+毒吐 2、灰矮人 (3,0)/(3,5)/(3,7)+盾击 2、首遇位 (2,4) 不动)+expect_pools 六键同步+旧「技能表十二行」断言换代十四行+V3/V4 五断言(两行字段域/两投放面/逐池增益妨害纪律)。冒烟 945/0+probe 全绿。T3 N3 进行中。(worktree g-plan2-iter24-enemy) diff --git a/game/data/tables/enemy.tres b/game/data/tables/enemy.tres index 7684f2fa..71f39f1a 100644 --- a/game/data/tables/enemy.tres +++ b/game/data/tables/enemy.tres @@ -50,7 +50,7 @@ rows = [{ "enemy_id": "bugbear", "display_name": "熊地精", "unit_count": 1, - "hp": 50, + "hp": 22, "atk": 1, "atk_min": 0, "atk_max": 2, @@ -65,7 +65,7 @@ rows = [{ "weight": 2 }], "armor_type": "light", -"armor_class": 3 +"armor_class": 2 }, { "level_index": 1, "node_depth": 3, @@ -224,6 +224,9 @@ rows = [{ }, { "skill_id": "charge", "weight": 1 +}, { +"skill_id": "venom_spit", +"weight": 2 }], "armor_type": "light", "armor_class": 2 @@ -247,6 +250,9 @@ rows = [{ }, { "skill_id": "charge", "weight": 1 +}, { +"skill_id": "venom_spit", +"weight": 2 }], "armor_type": "light", "armor_class": 2 @@ -270,6 +276,9 @@ rows = [{ }, { "skill_id": "charge", "weight": 1 +}, { +"skill_id": "venom_spit", +"weight": 2 }], "armor_type": "light", "armor_class": 3 @@ -321,6 +330,9 @@ rows = [{ }, { "skill_id": "heavy", "weight": 2 +}, { +"skill_id": "shield_bash", +"weight": 2 }], "armor_type": "heavy", "armor_class": 2 @@ -388,6 +400,9 @@ rows = [{ }, { "skill_id": "heavy", "weight": 2 +}, { +"skill_id": "shield_bash", +"weight": 2 }], "armor_type": "heavy", "armor_class": 9 @@ -434,6 +449,9 @@ rows = [{ }, { "skill_id": "heavy", "weight": 2 +}, { +"skill_id": "shield_bash", +"weight": 2 }], "armor_type": "heavy", "armor_class": 4 @@ -624,3 +642,7 @@ rows = [{ ; 读数预期:(2,5) 场敌人 3-4 只(3=重击手 1+蜘蛛 2,4=蜘蛛掷 3);L2 难度带位移读数随 Alpha 收官 M4 数值批 ; 统一执行(07 在册义务——MC 取证跑批届时另报批,本批零跑)。禁区排查:巨蜘蛛首遇位 (2,4)「固定 2 不加骰」 ; 零触碰、Boss d9 零触碰、跨关混编禁令过(两敌种首遇关均 ≤L2)、既有 19 行现值零变更。 +; 敌人表内容修批 N1(2026-10-13 用户令「按推荐方式」,迭代 24 卡①):(1,2) 熊地精降档 hp 50>>22、armor_class 3>>2—— +; 2026-09-24 阶名化解方案((1,3) 改名大地精以阶名归位化解同族血量倒挂观感)实机验证未达预期,按体验反馈重裁: +; 第一关总量曲线 12/10/50/35/72 的 5 倍墙消除(22 后曲线 12/10/22/35/72 相邻比最大 2.2);敌种 bugbear/池/数量/atk 区间零改动。 +; 曲线标定其余行归 M4 数值批。 diff --git a/game/data/tables/skills.tres b/game/data/tables/skills.tres index eb50ab67..ded31cb3 100644 --- a/game/data/tables/skills.tres +++ b/game/data/tables/skills.tres @@ -81,6 +81,18 @@ rows = [{ "type": "damage", "damage_mult": 2.5, "cooldown_beats": 4 +}, { +"skill_id": "venom_spit", +"display_name": "毒吐", +"type": "damage", +"damage_mult": 1.6, +"cooldown_beats": 2 +}, { +"skill_id": "shield_bash", +"display_name": "盾击", +"type": "damage", +"damage_mult": 1.7, +"cooldown_beats": 3 }] ; 敌人技能池批(2026-09-16 用户拍板——设计权威 docs/proposal-skill-pool.md v1.0,全值 provisional 投值归 难度曲线与Boss): @@ -131,3 +143,13 @@ rows = [{ ; atk=3(L2 精英/L3 全系):attack 3 / lunge·bite 5(×1.667 +11pp)/ heavy 6 / venom_burst 8(×2.667 +6.7pp)/ ; venom_curb 6(=名义)/ quake_smash 8 / rockslide 8 ; atk=4(区间上界):全精确(4/6/6/8/10/8/10) +; +; 敌人表内容修批 N2(2026-10-13 用户令「按推荐方式」,迭代 24 卡①)——普通敌错峰两行(12→14 行): +; venom_spit 毒吐 = 伤害 ×1.6 冷却 2(巨蜘蛛族普通敌池载体,挂 (2,5)/(2,6)/(2,7),首遇教学位 (2,4) 不投—— +; 「独占技随关错峰」首轨只做在 Boss 侧的补齐;venom_spit 自 (2,5) 起投)。 +; shield_bash 盾击 = 伤害 ×1.7 冷却 3(灰矮人族普通敌池载体,挂 (3,0)/(3,5)/(3,7))。 +; 两行均不带 rider_mult:L2/L3 普通敌 atk 1–3,floor(atk×r) 恒被 damage_floor 兜成 1,与 0.75 档效果 +; 完全相同——白占字段(毒绕开护甲由 damage 直伤表达已足够)。 +; 有效倍率(int(round) 半值上取):毒吐 atk1→2/atk2→3/atk3→5;盾击 atk1→2/atk2→3/atk3→5。 +; 倍率 provisional 归 M4 数值批。池权重均 2;逐池「恰一普攻/增益≤1/妨害≤1」纪律复查过 +; (巨蜘蛛族增益仍仅 charge、灰矮人族 (3,0)/(3,7) 仅 charge·(3,5) 无增益、两族妨害 0)。 diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index f59bb110..c4cd935e 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -1303,6 +1303,42 @@ func _smoke_ac_swap_guard() -> void: boss_ac[int(row.get("level_index", 0))] = int(row.get("armor_class", 0)) check(int(boss_ac.get(1, 0)) < int(boss_ac.get(2, 0)) and int(boss_ac.get(2, 0)) < int(boss_ac.get(3, 0)), "Boss AC 关卡台阶严格递增(%d < %d < %d)" % [int(boss_ac.get(1, 0)), int(boss_ac.get(2, 0)), int(boss_ac.get(3, 0))]) + # ③c 迭代 24 N1(2026-10-13):(1,2) 降档锚定 + 第一关总量曲线护栏 + # 降档裁决沿革:2026-09-24 阶名化解方案(50 血系设计非填错)实机未达预期,按体验反馈重裁 hp 22 / ac 2; + # 敌种 bugbear 与池 attack6/charge2/heavy2 钉死不动(防顺手改多——hobgoblin 无立绘,改敌种案已否决); + # 曲线护栏 = 相邻节点「hp × 中位数量」总量比 ≤ 2.5(12/10/22/35/72 现行全绿;不用单调不回撤——会红在 (1,0)→(1,1)) + var l12_row: Dictionary = {} + for row in _db.enemy.rows: + if int(row.get("level_index", -1)) == 1 and int(row.get("node_depth", -1)) == 2: + l12_row = row + break + var l12_pool := {} + for entry in l12_row.get("pool", []): + l12_pool[String(entry.skill_id)] = int(entry.weight) + check(String(l12_row.get("enemy_id", "")) == "bugbear" and int(l12_row.get("hp", -1)) == 22 \ + and int(l12_row.get("armor_class", -1)) == 2 \ + and l12_pool == {"attack": 6, "charge": 2, "heavy": 2}, + "第一关 (1,2) 降档锚定(bugbear 保留 · hp 22 · ac 2 · 池 attack6/charge2/heavy2 零改动——迭代 24 N1)") + var l1_totals := {} + for row in _db.enemy.rows: + if int(row.get("level_index", -1)) != 1: + continue + var cnt_lo: int = int(row.get("unit_count", 1)) + var cnt_hi: int = int(row.get("unit_count_max", cnt_lo)) + l1_totals[int(row.get("node_depth", -1))] = int(row.get("hp", 0)) * (cnt_lo + cnt_hi) / 2.0 + var curve_ok := true + var curve_detail := "" + var depths_sorted := l1_totals.keys() + depths_sorted.sort() + for i in range(1, depths_sorted.size()): + var prev: float = float(l1_totals[depths_sorted[i - 1]]) + var curr: float = float(l1_totals[depths_sorted[i]]) + var ratio: float = curr / prev if prev > 0.0 else 999.0 + if ratio > 2.5: + curve_ok = false + curve_detail += " (%d→%d):%.2f" % [depths_sorted[i - 1], depths_sorted[i], ratio] + check(curve_ok, "第一关相邻节点总量比 ≤ 2.5(12/10/22/35/72——迭代 24 N1 曲线护栏,越带%s)" % [ + curve_detail if curve_detail != "" else "无"]) # ④ 掷点参数域(加载校验已过——此处钉形状语义) var bounds: Array = _db.settlement.roll_tier_bounds var discounts: Array = _db.settlement.roll_tier_discounts @@ -3168,7 +3204,7 @@ func _smoke_skill_pool() -> void: # ① 数据面:技能表行集 + 普攻锁死 + 建议池行值 + 空池不可能(结构断言) func _smoke_skill_pool_data() -> void: - check(_db.skill.rows.size() == 12, "技能表十二行(普攻/突刺/蓄力/重击/硬化 + 撕咬/毒爆/蛛网束缚 + 大地脉动 + 震地怒击/遏毒/岩崩——前三批 + Boss 半血解锁技三行〔迭代14④ T5〕)") + check(_db.skill.rows.size() == 14, "技能表十四行(普攻/突刺/蓄力/重击/硬化 + 撕咬/毒爆/蛛网束缚 + 大地脉动 + 震地怒击/遏毒/岩崩 + 毒吐/盾击——前三批 + Boss 半血解锁技三行〔迭代14④ T5〕+ 普通敌错峰两行〔迭代 24 N2〕)") var basic: Dictionary = _db.skill.row_by_id("attack") check(not basic.is_empty() and String(basic.type) == "basic" and int(basic.cooldown_beats) == 0 and (not basic.has("damage_mult") or is_equal_approx(float(basic.damage_mult), 1.0)), @@ -3206,6 +3242,26 @@ func _smoke_skill_pool_data() -> void: var off_guard_row: Dictionary = _db.status_effect_row("off_guard") check(not off_guard_row.is_empty() and String(off_guard_row.target_side) == "hero" and String(off_guard_row.unit) == "ac", "失衡状态行(hero · ac 轴——妨害技落点,ConfigDB side 守卫正例)") + # 迭代 24 N2(2026-10-13):普通敌错峰两新行——毒吐/盾击(V3) + var spit: Dictionary = _db.skill.row_by_id("venom_spit") + check(not spit.is_empty() and String(spit.display_name) == "毒吐" and String(spit.type) == "damage" \ + and is_equal_approx(float(spit.damage_mult), 1.6) and int(spit.cooldown_beats) == 2 and not spit.has("rider_mult"), + "毒吐行(伤害 ×1.6 · 冷却 2 · 无 rider——低 atk 下 rider 恒被 damage_floor 兜成 1 白占字段,迭代 24 N2)") + var bash: Dictionary = _db.skill.row_by_id("shield_bash") + check(not bash.is_empty() and String(bash.display_name) == "盾击" and String(bash.type) == "damage" \ + and is_equal_approx(float(bash.damage_mult), 1.7) and int(bash.cooldown_beats) == 3 and not bash.has("rider_mult"), + "盾击行(伤害 ×1.7 · 冷却 3 · 无 rider——迭代 24 N2)") + var spit_sole_ok := true # 毒吐只挂巨蜘蛛族且首遇位 (2,4) 不投(Q6——教学位池零新招) + var bash_sole_ok := true # 盾击只挂灰矮人族三行 + for row in _db.enemy.rows: + for entry in row.pool: + var sid := String(entry.skill_id) + if sid == "venom_spit" and not (String(row.enemy_id) == "giant_spider" and int(row.level_index) == 2 and int(row.node_depth) >= 5): + spit_sole_ok = false + if sid == "shield_bash" and not (String(row.enemy_id) == "duergar" and int(row.level_index) == 3): + bash_sole_ok = false + check(spit_sole_ok, "毒吐投放面(仅 (2,5)/(2,6)/(2,7) 巨蜘蛛族——首遇位 (2,4) 池不动,迭代 24 N2/Q6)") + check(bash_sole_ok, "盾击投放面(仅 (3,0)/(3,5)/(3,7) 灰矮人族——钩爪恐魔零触碰,迭代 24 N2)") # 行集键 = (level_index, node_depth, enemy_id)——分支节点图批起 bugbear 等敌种跨关异池,enemy_id 不再唯一; # 2026-10-07 行集多行批:同坐标混编多行后每行各一池,键升维到三元组(行序 = 文件序 = 契约序) var expect_pools := { @@ -3217,17 +3273,17 @@ func _smoke_skill_pool_data() -> void: "2_0_bugbear": {"attack": 6, "lunge": 1, "heavy": 2}, "2_1_bugbear": {"attack": 6, "lunge": 1, "heavy": 2}, "2_4_giant_spider": {"attack": 6, "bite": 2, "charge": 1}, - "2_5_giant_spider": {"attack": 6, "bite": 2, "charge": 1}, + "2_5_giant_spider": {"attack": 6, "bite": 2, "charge": 1, "venom_spit": 2}, "2_5_bugbear": {"attack": 5, "lunge": 2, "heavy": 2}, - "2_6_giant_spider": {"attack": 6, "bite": 2, "charge": 1}, - "2_7_giant_spider": {"attack": 6, "bite": 2, "charge": 1}, + "2_6_giant_spider": {"attack": 6, "bite": 2, "charge": 1, "venom_spit": 2}, + "2_7_giant_spider": {"attack": 6, "bite": 2, "charge": 1, "venom_spit": 2}, "2_9_drider": {"attack": 6, "heavy": 2, "venom_burst": 2, "web_snare": 2, "venom_curb": 2}, - "3_0_duergar": {"attack": 6, "charge": 2, "heavy": 2}, + "3_0_duergar": {"attack": 6, "charge": 2, "heavy": 2, "shield_bash": 2}, "3_1_hook_horror": {"attack": 6, "bite": 2, "charge": 1}, "3_4_hook_horror": {"attack": 6, "bite": 2, "charge": 1}, - "3_5_duergar": {"attack": 5, "lunge": 2, "heavy": 2}, + "3_5_duergar": {"attack": 5, "lunge": 2, "heavy": 2, "shield_bash": 2}, "3_6_hook_horror": {"attack": 6, "bite": 2, "charge": 1}, - "3_7_duergar": {"attack": 6, "charge": 2, "heavy": 2}, + "3_7_duergar": {"attack": 6, "charge": 2, "heavy": 2, "shield_bash": 2}, "3_9_duergar_king": {"attack": 6, "heavy": 2, "earth_pulse": 2, "rockslide": 2}, } var pools_ok := true @@ -3241,7 +3297,7 @@ func _smoke_skill_pool_data() -> void: got[String(entry.skill_id)] = int(entry.weight) if got != expect_pools[rk]: pools_ok = false - check(pools_ok, "二十行九种池模板 = 建议池行值((L,D,enemy_id) 三元键逐行精确比对——2026-10-07 行集多行批口径;L1 地精 9/1 · 熊地精 6/2/2 · 酋长 6/2/2;L2 熊地精 6/1/2 · 蜘蛛 6/2/1 · 重击手 5/2/2 · 蛛化卓尔精灵 6/2/2/2〔(2,9)——商店房批 Boss 重编号〕;L3 灰矮人 6/2/2 · 钩爪恐魔 6/2/1 · 重装手 5/2/2 · 石君王 6/2/2〔earth_pulse·(3,9)〕——全部 provisional;三 Boss 池尾 +1 门控条目〔quake_smash/venom_curb/rockslide 权重 2+unlock_hp_pct 50——迭代14④ T5〕;混编行集同坐标多行各一池合法——首批投放 (2,5) 双行〔迭代 18 卡⑤:重击手+巢群,新行行值复制 (2,6)〕,其余坐标仍恰一行)") + check(pools_ok, "二十行九种池模板 = 建议池行值((L,D,enemy_id) 三元键逐行精确比对——2026-10-07 行集多行批口径;L1 地精 9/1 · 熊地精 6/2/2 · 酋长 6/2/2;L2 熊地精 6/1/2 · 蜘蛛 6/2/1+毒吐2〔(2,5)-(2,7) 投放,首遇位 (2,4) 不投——迭代 24 N2〕 · 重击手 5/2/2 · 蛛化卓尔精灵 6/2/2/2〔(2,9)——商店房批 Boss 重编号〕;L3 灰矮人 6/2/2+盾击2〔(3,0)/(3,7)〕 · 钩爪恐魔 6/2/1 · 重装手 5/2/2+盾击2 · 石君王 6/2/2〔earth_pulse·(3,9)〕——全部 provisional;三 Boss 池尾 +1 门控条目〔quake_smash/venom_curb/rockslide 权重 2+unlock_hp_pct 50——迭代14④ T5〕;混编行集同坐标多行各一池合法——首批投放 (2,5) 双行〔迭代 18 卡⑤:重击手+巢群,新行行值复制 (2,6)〕,其余坐标仍恰一行)") var basic_count_ok := true for row in _db.enemy.rows: var n := 0 @@ -3252,6 +3308,23 @@ func _smoke_skill_pool_data() -> void: if n != 1: basic_count_ok = false check(basic_count_ok, "每池恰一行普攻(空池不可能的加载校验同款)") + # 迭代 24 N2 复查(V4):池构成纪律零违反——增益 ≤1 / 妨害 ≤1(敌人系统 v0.13 结构冻结;载入期 + # validate_skill_pool_links 已硬闸,此处冒烟侧显式复核新投放后仍绿) + var comp_ok := true + for row in _db.enemy.rows: + var n_buff := 0 + var n_debuff := 0 + for entry in row.pool: + var srow: Dictionary = _db.skill_row(String(entry.skill_id)) + if srow.is_empty(): + continue + if String(srow.type) == "buff": + n_buff += 1 + elif String(srow.type) == "debuff": + n_debuff += 1 + if n_buff > 1 or n_debuff > 1: + comp_ok = false + check(comp_ok, "逐池增益 ≤1 · 妨害 ≤1(池构成纪律——迭代 24 N2 毒吐/盾击投放后复查)") # Boss 半血解锁技·编排集成断言(迭代14④ T6——真实编排回路:半血 → 下轮开轮闩检查 → 解锁行恰一次) var st_unlock: Dictionary = {"rows": []} var sett_u = load("res://core/battle_orchestrator.gd").new(_db, _fresh_rng(4242))