From a85de5033656d47e5f934bbe6fda26f7f1f3329a Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 01:43:00 +0800 Subject: [PATCH] =?UTF-8?q?T3=E6=A0=87=E6=97=97=E6=B5=81=E5=9B=9B=E4=BB=B6?= =?UTF-8?q?+=E6=97=97=E4=BC=A4=E5=BC=80=E5=8D=95=E7=82=B9=EF=BC=88?= =?UTF-8?q?=E8=BF=AD=E4=BB=A312=E2=80=94=E2=80=94=E6=95=B4=E5=90=88?= =?UTF-8?q?=E5=AE=9A=E7=A8=BFS5=EF=BC=89=EF=BC=9Arelics.tres=E5=A1=ABflag?= =?UTF-8?q?=E5=9B=9B=E8=A1=8C=EF=BC=88=E9=9B=B7=E5=8C=BA=E5=9B=BE=E8=B0=B1?= =?UTF-8?q?common=C2=B7=E6=A0=87=E4=B8=AD=E9=A2=9D=E5=A4=96=E6=A0=BC?= =?UTF-8?q?=E9=9D=A2=E8=B5=84=E6=BA=90/=E7=8C=8E=E5=B7=A2=E4=BA=BArare?= =?UTF-8?q?=C2=B7=E6=8E=A7=E5=88=B6=E5=B7=A2=E7=A9=B4=E4=BC=A4=E5=AE=B3?= =?UTF-8?q?=E5=85=89=E7=8E=AF/=E5=AE=8C=E7=BE=8E=E5=B8=83=E9=98=B2rare?= =?UTF-8?q?=C2=B7=E5=90=8C=E8=BD=AE=E5=85=A8=E4=B8=AD=E6=97=97=E4=BC=A4?= =?UTF-8?q?=C3=972/=E6=88=98=E6=97=97=E5=86=9B=E8=A7=84rarest=E9=94=9A?= =?UTF-8?q?=E7=82=B9=C2=B7=E6=97=97=E4=BC=A42=E5=A4=8D=E7=94=A8board=5Ftyp?= =?UTF-8?q?ed=E9=9B=B6=E6=96=B0=E9=85=8D=E6=96=B9=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E6=97=97=E5=88=A4=E5=AE=9A=E6=89=B9=E5=90=8E=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=BC=80=E5=8D=95=E6=AE=B5=EF=BC=88=E6=88=98=E6=97=97=E5=86=9B?= =?UTF-8?q?=E8=A7=84=E6=AF=8Fhit=E6=97=97=E4=B8=80=E5=BC=A0+=E5=AE=8C?= =?UTF-8?q?=E7=BE=8E=E5=B8=83=E9=98=B2=E6=9C=AC=E8=BD=AE=E5=85=A8=E4=B8=AD?= =?UTF-8?q?=E5=80=8D=E7=8E=87=E2=80=94=E2=80=94hit/miss=E8=BD=AE=E6=9C=AB?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=EF=BC=89=EF=BC=9B=E7=8C=8E=E5=B7=A2=E4=BA=BA?= =?UTF-8?q?=3Dweaken=E5=AE=9E=E4=BE=8B=E6=95=B0=E5=8A=A8=E6=80=81rider?= =?UTF-8?q?=EF=BC=88=E5=85=AB=E5=9E=8B=E6=89=B9side-wide=E6=89=BF=E8=BD=BD?= =?UTF-8?q?=E2=80=94=E2=80=94=E3=80=8C=E5=AF=B9=E5=85=B6=E4=B8=AD=E6=95=8C?= =?UTF-8?q?=E3=80=8D=E7=AE=80=E5=8C=96=E5=85=A8=E4=BD=93=E5=85=88=E6=89=8B?= =?UTF-8?q?=E9=99=84=E5=8A=A0=E5=80=BC=E6=8A=AB=E9=9C=B2=E5=BE=85=E8=BF=BD?= =?UTF-8?q?=E8=AE=A4=EF=BC=89=EF=BC=9B=E6=B1=82=E5=80=BC=E5=9B=9B=E6=97=97?= =?UTF-8?q?+=E9=9B=B7=E5=8C=BA=E5=9B=BE=E8=B0=B1=E9=A2=9D=E5=A4=96grant?= =?UTF-8?q?=EF=BC=9B=E5=86=92=E7=83=9F+1=E6=96=AD=E8=A8=80=E8=A1=A8?= =?UTF-8?q?=E6=8D=A2=E4=BB=A38=E8=A1=8C=E2=86=92689/0+run=5Fall=E5=85=A8?= =?UTF-8?q?=E7=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/battle_orchestrator.gd | 38 ++++++++++++++++++++++++++++++++ game/core/damage_controller.gd | 8 +++++++ game/data/tables/relics.tres | 36 ++++++++++++++++++++++++++++++ game/smoke/smoke_all.gd | 15 +++++++++---- 4 files changed, 93 insertions(+), 4 deletions(-) diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index 16a06682..d040dede 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -114,6 +114,14 @@ func _relic_flags_for(relic_ids: Array) -> void: "first_dig_spell": flags["first_dig_spell"] = true flags["spell_value"] = int(fx.get("value", 0)) + "flag_resource": + flags["flag_resource_extra"] = int(fx.get("value", 0)) + "nest_aura": + flags["nest_aura_value"] = int(fx.get("value", 0)) + "flag_all_hit": + flags["flag_all_hit_mult"] = int(fx.get("value", 0)) + "flag_strike": + flags["flag_strike_value"] = int(fx.get("value", 0)) var mt := int(tiers.get("magic", 0)) if mt >= 1: flags["rider_flat"] = int(flags.get("rider_flat", 0)) + 1 # 档一质变(≥2 件):rider +1(provisional) @@ -407,6 +415,30 @@ func _settle() -> void: _damage.submit(vt) for evt in _facts_flags: _judge_flag(evt, ri) + # 战旗军规开单段(迭代 12 T3 标旗流——flag_judged 批后统一开单:轮末每面标中旗对最前存活敌 + # 结算 board_typed 必中伤害〔复用零新配方;「旗所在巢穴敌」简化为 default_target 最前存活敌—— + # 台账披露待追认〕;完美布防=本轮旗批全中(hit>0 且 miss==0)时旗伤 ×mult——全对推理奖励)。 + # 扫雷结算触发点=flag_strike/flag_all_hit/nest_aura 挂点承载红线①。 + if int(_damage.relic_flags.get("flag_strike_value", 0)) > 0: + var hits := 0 + var misses := 0 + for fevt in _facts_flags: + if bool(fevt.get("hit", false)): + hits += 1 + else: + misses += 1 + if hits > 0: + var mult := int(_damage.relic_flags.get("flag_all_hit_mult", 1)) + var strike_value := int(_damage.relic_flags.get("flag_strike_value", 0)) + if misses == 0 and mult > 1: + strike_value *= mult # 完美布防:同轮全中旗伤倍增(全对推理奖励) + for fevt in _facts_flags: + if not bool(fevt.get("hit", false)): + continue + var st_t := _damage.open_ticket(DamageController.KIND_BOARD_TYPED, "relic_flag_strike", + "战旗军规", "board", strike_value, DamageController.TARGET_FRONT_ALIVE, ri, + fevt.cell, "normal") + _damage.submit(st_t) if _facts_path == "cleared": _grant_clear_reward(ri) _damage.flush() # 授予段界结账(B 模式——段内开单攒批到此统一兑现;A 模式 no-op;清图批前另有同步结账点) @@ -627,6 +659,12 @@ func _judge_flag(evt: Dictionary, ri: int) -> void: var fbt := _damage.open_ticket(DamageController.KIND_BOARD_BLAST, "attune_flag_burst", "标中殉爆", "board", _attune_mag("flag_burst"), DamageController.TARGET_ALL_ALIVE, ri, cell, "", 0, "highlight", {}) _submit(fbt, false) + # 雷区图谱(迭代 12 T3 标旗流——标中雷额外获得一份格面资源:插旗开始产出对标开格; + # 复用 grant 单点,额外兑付走同一 _grant_routed 正向路由) + if int(_damage.relic_flags.get("flag_resource_extra", 0)) > 0: + var extra_snap = _reward_economy.grant(cell) + if extra_snap is Dictionary: + _grant_routed(extra_snap, "positive", "flag_hit", cell, ri, "", "(雷区图谱)") var snap = _reward_economy.grant(cell) if not (snap is Dictionary): return diff --git a/game/core/damage_controller.gd b/game/core/damage_controller.gd index ad2e0dc3..2db2e5e4 100644 --- a/game/core/damage_controller.gd +++ b/game/core/damage_controller.gd @@ -219,6 +219,14 @@ func _resolve_hero_attack(t: Dictionary) -> void: # 与乘区(奥术余烬「普攻命中后恒定结算」语义);档二(magic 4 件)rider 可暴击=当次 crit 时 # rider 值乘暴击倍率。rider 不改变下限语义(landed 含 rider 后不再过 floor)。 var hero_rider := int(relic_flags.get("rider_flat", 0)) + # 猎巢人(迭代 12 T3 标旗流——巢穴控制数转伤害光环):控制数 = 敌方 weaken(削弱)实例数 + # 〔八型批 side-wide 状态行——标中旗控制巢穴的既有承载;原设计「对其中敌伤害」简化为全体 + # 先手攻击附加值——台账披露待追认〕,每控制 1 巢 rider +Z。 + var nest_aura := int(relic_flags.get("nest_aura_value", 0)) + if nest_aura > 0: + for eff in effects.query_active("enemy"): + if String(eff.effect_id) == "weaken": + hero_rider += nest_aura if hero_rider > 0: if crit and bool(relic_flags.get("rider_crit", false)): hero_rider = int(round(float(hero_rider) * float(db.settlement.crit_multiplier))) diff --git a/game/data/tables/relics.tres b/game/data/tables/relics.tres index 2f363539..0c07a881 100644 --- a/game/data/tables/relics.tres +++ b/game/data/tables/relics.tres @@ -42,6 +42,42 @@ rows = [{ "effects": { "value": 2 } +}, { +"relic_id": "mine_atlas", +"display_name": "雷区图谱", +"rarity": "common", +"archetype": "flag", +"hook": "flag_resource", +"effects": { +"value": 1 +} +}, { +"relic_id": "nest_hunter", +"display_name": "猎巢人", +"rarity": "rare", +"archetype": "flag", +"hook": "nest_aura", +"effects": { +"value": 1 +} +}, { +"relic_id": "perfect_defense", +"display_name": "完美布防", +"rarity": "rare", +"archetype": "flag", +"hook": "flag_all_hit", +"effects": { +"value": 2 +} +}, { +"relic_id": "war_banner", +"display_name": "战旗军规", +"rarity": "rarest", +"archetype": "flag", +"hook": "flag_strike", +"effects": { +"value": 2 +} }] ; 双层 BD 实施批(2026-10-04):机制件表——行 = 流派件定义 diff --git a/game/smoke/smoke_all.gd b/game/smoke/smoke_all.gd index 4df22e04..e1d041ae 100644 --- a/game/smoke/smoke_all.gd +++ b/game/smoke/smoke_all.gd @@ -602,8 +602,8 @@ func _smoke_adventure() -> void: func _smoke_relics() -> void: print("--- 机制件基建(relic_table · 档位激活引擎 · 机制件带接线)---") - # ① 现行表牌库构成:T2 magic 四件入池——98 数值令牌+4 relic 令牌(投放档 rare×3/rarest×1) - check(_db.relics != null and (_db.relics.rows as Array).size() == 4, "relic_table 已加载(T2 魔法流四件在池——T3-T6 逐流派续填)") + # ① 现行表牌库构成:T2 magic 四件+T3 flag 四件入池——98 数值令牌+8 relic 令牌(投放档 rare×6/rarest×2) + check(_db.relics != null and (_db.relics.rows as Array).size() == 8, "relic_table 已加载(T2 magic 4+T3 flag 4 在池——T4-T6 逐流派续填)") var a_r0 = load("res://core/adventure_runner.gd").new(_db, _fresh_rng(71)) check(a_r0.start_adventure(71, {"first_script": true}), "机制件带场景:冒险启动(seed 71)") var relic_tokens := 0 @@ -613,8 +613,8 @@ func _smoke_relics() -> void: relic_tokens += 1 if String((t as Dictionary).get("tier", "")) == "rarest": rarest_tokens += 1 - check(relic_tokens == 4 and rarest_tokens == 1 and a_r0._bonus_deck.size() == 102, - "机制件带入池:magic 4 件(rare 档 3 + rarest 锚点 1)——牌库 98+4=102") + check(relic_tokens == 8 and rarest_tokens == 2 and a_r0._bonus_deck.size() == 106, + "机制件带入池:8 件(rare 档 6 + rarest 锚点 2)——牌库 98+8=106") check(_db.relics.validate().is_empty(), "relic_table.validate 零违例(有行流派扫雷端铁律——magic first_dig_spell 在案)") # ② 档位激活引擎(纯函数直测——构造表 4 件 magic + 1 件 flag + 1 件 rarest 锚点) var rt := RelicTable.new() @@ -684,6 +684,13 @@ func _smoke_relics() -> void: check(int(rf.get("clamp_magic_magic", -1)) == 1 and int(rf.get("clamp_magic_heavy", -1)) == 1 and bool(rf.get("first_dig_spell", false)) and int(rf.get("spell_value", -1)) == 2, "魔法流求值:魔网织者 magic-vs-magic 罚修正 +1 · 湛蓝誓约 magic-vs-heavy +1 · 魔能共鸣奥术矢 value 2") + # ⑤ T3 标旗流求值面(现行表 magic 4+flag 4——混合持有:flag 档一 4 件成型) + orch._relic_flags_for(["arcane_ember", "mana_weaver", "azure_oath", "mana_resonance", + "mine_atlas", "nest_hunter", "perfect_defense", "war_banner"]) + var rf8: Dictionary = orch._damage.relic_flags + check(int(rf8.get("flag_resource_extra", -1)) == 1 and int(rf8.get("nest_aura_value", -1)) == 1 + and int(rf8.get("flag_all_hit_mult", -1)) == 2 and int(rf8.get("flag_strike_value", -1)) == 2, + "标旗流求值:雷区图谱额外资源 1 · 猎巢人光环 +1/巢 · 完美布防 ×2 · 战旗军规旗伤 2(复用 board_typed 零新配方)") var orch0 = load("res://core/battle_orchestrator.gd").new(_db, _fresh_rng(74)) orch0._relic_flags_for([]) check((orch0._damage.relic_flags as Dictionary).is_empty(),