From 710d8e038d27857ce228759896e8d809d9ae9b95 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 12 Oct 2026 00:44:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor(t9):=20=E8=BF=AD=E4=BB=A320=20V13=20?= =?UTF-8?q?=E9=9D=99=E6=80=81=E6=A0=B8=E6=9F=A5=E6=94=B6=E5=8F=A3=E2=80=94?= =?UTF-8?q?=E2=80=94=E5=9B=9B=E5=A4=84=E6=97=A7=E4=BB=B6=E5=90=8D=20source?= =?UTF-8?q?=5Fclass=20=E4=B8=AD=E6=80=A7=E5=90=8D=E6=8D=A2=E4=BB=A3?= =?UTF-8?q?=EF=BC=88fx=5Foverflow/fx=5Fapply=5Fstatus/fx=5Fblast=5Fcounter?= =?UTF-8?q?/fx=5Fstreak=5Fsegments=EF=BC=9B=E6=B3=9B=E7=94=A8=E9=80=9A?= =?UTF-8?q?=E9=81=93=E4=BF=9D=E7=95=99+=E6=97=A7=E4=BB=B6=E5=90=8D?= =?UTF-8?q?=E9=9A=8F=E9=80=80=E5=BD=B9=E4=BB=B6=E6=91=98=E9=99=A4=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9=E7=85=A7=E6=B3=A8=E9=87=8A=E7=95=99=E7=97=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/README.md | 5 +++++ game/core/battle_orchestrator.gd | 10 ++++++---- game/core/damage_controller.gd | 8 +++++--- game/smoke/smoke_all.gd | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/game/README.md b/game/README.md index 05601491..ce5e9a64 100644 --- a/game/README.md +++ b/game/README.md @@ -560,3 +560,8 @@ Godot_v4.7.2-stable_win64_console.exe --headless --path . --script res://smoke/a ## 2026-10-10 秘宝匣改名(文档面同步——2026-10-10 天赋树设计会话裁) 营地柜台「道具工坊」正名「秘宝匣」(树上解锁节点与营地柜台同名):本文档现行正文扫改完毕;**代码标识符(workshop_items 等)与界面文案暂未动**——柜台 UI 名/表行语义连带面归 design/gdd/06-待办清单.md「天赋树结构重构批」实装批办理。 + +## 2026-10-11 专长实装批(迭代 20——奇物重设计 T0-T10 全落) + +**换代面**:feats.tres 整表换代(旧 27 件退役→重设计 29 行=基础 27+迁入淬毒刃纹/封印爆裂——订阅行 on/when/do 四级 rarity+cap);效果引擎词表扩签(事件 18/效果类型 30/事实 18/算子 +mod_eq——heal/ac_bonus/damage_reduce/bonus_delta/blast_scaled/preview_area/target_attack_bonus 七新类型+adventure 域计数器跨战账本);池结构案D(四级档位 70/25/9/0=104+曝光槽 2+1+概率上限解耦案②+Boss 按档配比加权抽取);凭证五件入池(刷新券 F-1 修复/储备金袋/同调电池〔choose_battery_target 玩家点选〕/时沙/完美保险);流派标签/档位激活机制退役(FeatsEngine 求值摘除——HUD 特性段降级为逐件行,呈现改法归 06 在册奇物呈现条)。 +**验证**:冒烟 864/0+run_all 21 套+probe_gate 全绿;MC 同种子重放 30 局逐位复现;新基线 normal/off 100 局通关 0%(master 对照同为 0%=零配基线本相,止步分布 90/10→93/7 可归因曝光槽)。设计权威=奇物.md(反哺点清单见 design/qa/iter20-实现报告-2026-10-11.md)。 diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index e2844a4f..fae9e11c 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -743,8 +743,9 @@ func _settle() -> void: var mg_layers := _fx.counter(String(h.get("per", ""))) var mg_total := int(h.get("value", 0)) * mg_layers if mg_total > 0: - var mg_t := _damage.open_ticket(DamageController.KIND_BOARD_BLAST, "feat_magma_body", - "熔火反噬 ×%d" % mg_layers, "board", mg_total, + # 迭代 20 T9——source_class 中性名(旧件名 feat_magma_body 随熔火之躯退役;per-counter 反打通道保留泛用面) + var mg_t := _damage.open_ticket(DamageController.KIND_BOARD_BLAST, "fx_blast_counter", + "积层反噬 ×%d" % mg_layers, "board", mg_total, DamageController.TARGET_ALL_ALIVE, ri, minesweeper.hero_pos(), "", 0, "", {}) _submit(mg_t, false) for h in re_fx: @@ -1255,8 +1256,9 @@ func _combat_segment(ri: int) -> void: for h in _hits_of(ht.context.get("fx_attack_hits", []) as Array, "attack_segments"): var segments := mini(int(h.get("cap", 2)), _damage.dig_streak / maxi(1, int(h.get("divisor", 3)))) for s in segments: - var ct := _damage.open_ticket(DamageController.KIND_BOARD_TYPED, "feat_chain_arrows", - "连珠矢", "board", int(h.get("value", 0)), DamageController.TARGET_FRONT_ALIVE, ri, + # 迭代 20 T9——source_class 中性名(旧件名 feat_chain_arrows 随连珠矢退役;attack_segments 兑付通道保留泛用面) + var ct := _damage.open_ticket(DamageController.KIND_BOARD_TYPED, "fx_streak_segments", + "连击分段", "board", int(h.get("value", 0)), DamageController.TARGET_FRONT_ALIVE, ri, minesweeper.hero_pos(), "pierce") _damage.submit(ct) # 敌方行动(敌人技能池批——本拍动作开轮已摇定,此处按技能行兑现;行序 = 生成序)。 diff --git a/game/core/damage_controller.gd b/game/core/damage_controller.gd index 3e6102f4..12b49692 100644 --- a/game/core/damage_controller.gd +++ b/game/core/damage_controller.gd @@ -391,8 +391,9 @@ func _resolve_hero_attack(t: Dictionary) -> void: continue var next_target = units.default_target() if next_target != null: - var of_t := open_ticket(DamageController.KIND_BOARD_TYPED, "feat_pierce_shot", - "贯穿射击", "board", maxi(int(db.settlement.damage_floor), int(landed * int(h.get("value", 50)) / 100)), + # 迭代 20 T9——source_class 中性名(旧件名 feat_pierce_shot 随贯穿射击退役;overflow 通道保留泛用面) + var of_t := open_ticket(DamageController.KIND_BOARD_TYPED, "fx_overflow", + "贯穿弹射", "board", maxi(int(db.settlement.damage_floor), int(landed * int(h.get("value", 50)) / 100)), DamageController.TARGET_FRONT_ALIVE, int(t.round_index), t.origin_cell, "pierce") if policy == POLICY_SEGMENT: _queue.append(of_t) @@ -402,7 +403,8 @@ func _resolve_hero_attack(t: Dictionary) -> void: # 重复授予由状态容器自行守卫) for h in ac_hits: if String(h.get("kind", "")) == "apply_status": - effects.apply_effect(String(h.get("status_id", "")), {"source_class": "feat_armor_crack"}, -1) + # 迭代 20 T9——source_class 中性名(旧件名 feat_armor_crack 随碎甲震击退役;apply_status 通道保留泛用面) + effects.apply_effect(String(h.get("status_id", "")), {"source_class": "fx_apply_status"}, -1) payload["cracked"] = true var label := _attack_label(String(t.display), crit, discount) if hero_rider > 0: diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 41079223..6fd1cba9 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -2980,7 +2980,7 @@ func _smoke_settlement_segments() -> void: var rw: Dictionary = rows_r[i] var sc := String(rw.get("source_class", "")) var is_board_acct: bool = (String(rw.get("type", "")) == "damage" \ - and not ["hero_attack", "enemy_action", "feat_chain_arrows"].has(sc)) \ + and not ["hero_attack", "enemy_action", "fx_streak_segments"].has(sc)) \ or String(rw.get("forfeit", "")) == "hero_down" if not is_board_acct: continue