From c99b49351ec6be9adec0b9f72fd0cd8fe28fc367 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 4 Oct 2026 04:07:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=B1=E6=8C=96=E9=92=BB=E5=A4=B4v2=E6=94=B6?= =?UTF-8?q?=E7=9B=8A=E9=87=8D=E6=8A=95+=E5=85=A8=E6=B5=81=E6=B4=BE?= =?UTF-8?q?=E5=8D=A1=E7=89=87=E6=95=88=E6=9E=9C=E6=91=98=E8=A6=81=EF=BC=88?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=AE=9E=E6=B5=8B=E3=80=8C=E4=BB=982AP?= =?UTF-8?q?=E6=97=A0=E5=8F=AF=E8=A7=81=E6=8F=90=E5=8D=87=E7=BA=AF=E6=8C=A8?= =?UTF-8?q?=E6=89=93=E3=80=8D=E4=BA=8C=E8=BF=9E=E5=8F=8D=E9=A6=88=E2=80=94?= =?UTF-8?q?=E2=80=94v1=E9=85=8D=E9=A2=9D=E5=88=B6=E5=87=80=E8=B4=9F?= =?UTF-8?q?=E6=9C=9F=E6=9C=9B=E8=AE=A4=E8=B4=A6=E8=BF=94=E5=B7=A5=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E2=91=A0=E6=94=B6=E7=9B=8A=E6=94=B9=E6=9C=AC=E6=A0=BC?= =?UTF-8?q?=E5=8F=8C=E4=BB=BD=E5=88=B6=EF=BC=88=E4=BB=98=E8=B4=B9=E6=8C=96?= =?UTF-8?q?=E6=8E=98=E7=9A=84=E6=9C=AC=E6=A0=BC=E8=B5=84=E6=BA=90=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E5=8F=8C=E4=BB=BD=E2=80=94=E2=80=94=E5=A4=9A=E8=8A=B1?= =?UTF-8?q?1AP=E4=B9=B0=E5=A4=9A=E4=B8=80=E4=BB=BD=E5=90=8C=E6=A0=BC?= =?UTF-8?q?=E4=BA=A7=E5=87=BA=E8=B4=A6=E7=9B=AE=E7=9B=B4=E7=99=BD=E6=9C=9F?= =?UTF-8?q?=E6=9C=9B=E5=BE=AE=E6=AD=A3=EF=BC=9B=E5=BA=9F=E9=99=A4=E3=80=8C?= =?UTF-8?q?=E6=AF=8F4=E6=AC=A1=E4=BB=98=E8=B4=B9=E5=85=911=E4=BB=BD?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E8=B5=84=E6=BA=90=E3=80=8D=E6=9A=97=E8=B4=A6?= =?UTF-8?q?=EF=BC=9Av1=3D8AP=E6=8D=A22-4GP=E5=BD=93=E9=87=8F=E5=87=80?= =?UTF-8?q?=E8=B4=9F=E4=B8=94=E5=85=91=E4=BB=98=E5=9F=8B=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E5=B8=A6=E4=B8=8D=E5=8F=AF=E6=84=9F=E7=9F=A5=E2=80=94=E2=80=94?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=B8=A4=E6=AC=A1=E5=90=8C=E5=85=B3=E5=80=92?= =?UTF-8?q?=E4=B8=8B=E7=9A=84=E6=95=B0=E5=AD=A6=E6=A0=B9=E6=BA=90=E8=AE=A4?= =?UTF-8?q?=E8=B4=A6=EF=BC=89+=E8=BD=AE=E5=88=9D=E4=BB=98=E8=B4=B9?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=E6=BB=9A=E5=8A=A8=EF=BC=88=E6=9C=AC=E8=BD=AE?= =?UTF-8?q?=E4=BB=98=E8=B4=B9=E6=AC=A1=E6=95=B0=3Ddeep=5Fpaid=5Fcount?= =?UTF-8?q?=E2=88=92=E8=BD=AE=E5=88=9D=E5=BF=AB=E7=85=A7=EF=BC=9Bsettle?= =?UTF-8?q?=E5=B0=BE=E6=BB=9A=E5=8A=A8=EF=BC=89+safe=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=8C=89=E4=BB=98=E8=B4=B9=E6=95=B0=E4=B8=8A=E9=99=90=E9=80=90?= =?UTF-8?q?=E6=A0=BC=E8=BF=BD=E5=8A=A0=E3=80=8C=EF=BC=88=E6=B7=B1=E6=8C=96?= =?UTF-8?q?=EF=BC=89=E3=80=8D=E7=AC=AC=E4=BA=8C=E4=BB=BD=EF=BC=9B=E2=91=A1?= =?UTF-8?q?27=E4=BB=B6=E5=8D=A1=E7=89=87=E6=95=88=E6=9E=9C=E6=91=98?= =?UTF-8?q?=E8=A6=81=EF=BC=88relic=5Fcard=5Ftext=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E8=A1=8C=3Dhook=E9=9D=99=E6=80=81=E6=98=A0=E5=B0=84=E3=80=8C?= =?UTF-8?q?=E6=B7=B1=E6=8C=96=E9=92=BB=E5=A4=B4=20=C2=B7=20=E5=BC=80?= =?UTF-8?q?=E6=A0=BC\n=E5=BC=80=E6=A0=BC2AP=C2=B7=E4=BA=A7=E5=87=BA?= =?UTF-8?q?=E5=8F=8C=E4=BB=BD=E3=80=8D=E5=BC=8F=E2=80=94=E2=80=94=E3=80=8C?= =?UTF-8?q?=E4=B8=8D=E7=9F=A5=E9=81=93=E4=BB=B6=E6=98=AF=E5=B9=B2=E5=98=9B?= =?UTF-8?q?=E7=9A=84=E3=80=8D=E7=BC=BA=E5=8F=A3=E6=89=BF=E8=BD=BD=EF=BC=8C?= =?UTF-8?q?provisional=E6=96=87=E6=A1=88=E5=BD=92=E4=BB=A3=E6=8B=8D?= =?UTF-8?q?=E6=9D=BF=E7=99=BD=E5=90=8D=E5=8D=95=E4=BB=B6=E6=96=87=E6=A1=88?= =?UTF-8?q?=E5=BE=AE=E8=B0=83=EF=BC=89=EF=BC=9B=E5=86=92=E7=83=9F718/0?= =?UTF-8?q?=E4=B8=89=E9=97=B8=EF=BC=88=E6=97=A2=E6=9C=89=E6=96=AD=E8=A8=80?= =?UTF-8?q?=E5=85=A8=E8=BF=87=E2=80=94=E2=80=94=E5=8F=8C=E4=BB=BD=E5=88=B6?= =?UTF-8?q?=E4=B8=8E=E9=85=8D=E9=A2=9D=E5=88=B6=E5=9C=A8MC=E8=B4=A6?= =?UTF-8?q?=E9=9D=A2=E7=AD=89=E4=BB=B7=E6=8D=A2=E7=AE=97=EF=BC=89+formed?= =?UTF-8?q?=E9=87=8D=E9=94=9AN=3D20=E5=90=8C=E5=B8=A610/75/20=EF=BC=88?= =?UTF-8?q?=E5=88=86=E5=B2=94=E7=A8=B3=E5=AE=9A=EF=BC=89=E2=80=94=E2=80=94?= =?UTF-8?q?=E9=94=9Arunsum=5Fm4iter12=5Fdeepdigv2=5Fformed=5Fn20=5F2026100?= =?UTF-8?q?4=E6=8D=A2=E4=BB=A3=E7=8E=B0=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/core/battle_orchestrator.gd | 23 +++++++++++++-------- game/presentation/battle_narrator.gd | 31 +++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/game/core/battle_orchestrator.gd b/game/core/battle_orchestrator.gd index b39b43f3..f5ba6acc 100644 --- a/game/core/battle_orchestrator.gd +++ b/game/core/battle_orchestrator.gd @@ -76,7 +76,8 @@ var _attune_safe_seen := 0 # 掘进蓄能 battle 域安全开格 # 魔矢每战首次计数 battle 域。空集=零扰动) var _relic_first_dig_used := false var _relic_combo := 0 # 矿脉直觉连击计数(battle 域——safe +1/mine 清零) -var _relic_deep_given := 0 # 深挖钻头深层已兑付份数(battle 域——付费配额制:quota=付费次数/cap) +var _relic_deep_given := 0 # 深挖钻头本轮已追加份数(battle 域——v2 本格双份制:safe 事件按付费数上限) +var _relic_paid_at_round_start := 0 # 轮初付费计数快照(v2——本轮付费次数=当前值−快照) var _relic_magma_layers := 0 # 熔火之躯积层(battle 域——受地形伤 +1,轮末反打清零) @@ -252,6 +253,7 @@ func begin_battle(enc: Dictionary) -> bool: _relic_first_dig_used = false _relic_combo = 0 _relic_deep_given = 0 + _relic_paid_at_round_start = 0 _relic_magma_layers = 0 # 树 rule 键消费(迭代 12 T10——Fork 激活侧 effects;真实接线首期两键:先手压制=战斗首轮 # AP+1(queue_ap_delta——先手压制语义)/稳健拓荒=敌方攻击减 1(伤害控制器 flags bulwark); @@ -442,17 +444,18 @@ func _settle() -> void: # 开格流连击/深层产出(迭代 12 T5):矿脉直觉连击 = safe +1(mine 清零在负向分支); # 深挖钻头深层产出 = 每 cap 格额外 grant 一份(收益面补偿额外 AP 成本——R4 甲非信息税对价) _relic_combo += 1 - # 深挖钻头深层产出(2026-10-04 缺陷修复——付费开掘配额制):深层资源只兑付给**付了全价** - # 的挖掘(action_economy.deep_paid_count 每 AP 富余挖格 +1);每 cap 次付费兑一份。 - # AP 不足降级的普通挖格照常开格但不积配额——持有钻头永不锁死挖格(散件保底 B-2)。 - var dd_cap := int(_damage.relic_flags.get("deep_dig_cap", 0)) - if dd_cap > 0: - var quota := int(action_economy.deep_paid_count) / dd_cap - while _relic_deep_given < quota: + # 深挖钻头 v2(2026-10-04 二次修正——用户实测「付 2AP 无可见提升纯挨打」:v1 配额制 + # 4 次付费 8AP 换 1 份随机资源=净负期望+收益埋明细带不可感知):改**本格双份**—— + # 付费挖掘的本格资源直接双份(多花 1AP 买多一份同格产出,账目直白期望微正)。 + # 本轮付费次数 N=deep_paid_count−轮初快照;safe 事件按 N 上限逐格追加第二份(「深挖」)。 + var dd_cost := int(_damage.relic_flags.get("deep_dig_cost", 0)) + if dd_cost > 0: + var paid_this_round := int(action_economy.deep_paid_count) - _relic_paid_at_round_start + if paid_this_round > 0 and _relic_deep_given < paid_this_round: _relic_deep_given += 1 var dd_snap = _reward_economy.grant(evt.cell) if dd_snap is Dictionary: - _grant_routed(dd_snap, "positive", "safe_cell", evt.cell, ri, "", "(深层资源)") + _grant_routed(dd_snap, "positive", "safe_cell", evt.cell, ri, "", "(深挖)") # 魔能共鸣·每战首次开安全格追加魔法矢(迭代 12 T2——relic 件「每关首次开格必出魔法矢」 # 落地为每战首次〔战斗域单事务无跨战状态——「每关」字面改「每战」台账披露待追认〕; # board_typed magic 必中,扫雷结算触发点=relic 挂 first_dig_spell 承载红线①) @@ -563,6 +566,8 @@ func _settle() -> void: return _emit_row("verdict", "", Vector2i(-1, -1), ri, "下一轮次", 0, {}, "") _exit_distribution() + # 深挖钻头 v2 轮初快照滚动(本轮付费次数已消费——下一轮 N=当前值−新快照) + _relic_paid_at_round_start = int(action_economy.deep_paid_count) _settling = false diff --git a/game/presentation/battle_narrator.gd b/game/presentation/battle_narrator.gd index e3179231..f0d917e5 100644 --- a/game/presentation/battle_narrator.gd +++ b/game/presentation/battle_narrator.gd @@ -131,13 +131,42 @@ static func bonus_result_text(result: Dictionary) -> String: return "已选择:%s\n其余选项已丢弃(不可反悔)" % name -# 流派件卡片文案(迭代 12 T1——「流派件 · 流派名」形制+件名;空行 = 防御通用文案) +# 流派件卡片文案(迭代 12 T1;2026-10-04 呈现补强——第三行=hook 效果摘要,用户反馈「不知道件是 +# 干嘛的」缺口承载;摘要=静态映射表 provisional 文案归代拍板白名单「件文案微调」) static func relic_card_text(row: Dictionary) -> String: if row.is_empty() or String(row.get("relic_id", "")) == "": return "流派件\n???" var arch_names := {"magic": "魔法", "pierce": "穿刺", "normal": "普攻", "dig": "开格", "flag": "标旗", "charge": "蓄力", "devour": "吞噬"} var arch := String(arch_names.get(String(row.get("archetype", "")), "流派")) + var summaries := { + "hero_attack_rider": "普攻附加必中伤害", + "clamp_modifier": "克制面强化", + "first_dig_spell": "首格追加奥术矢", + "kill_overflow": "击杀半额弹射", + "dig_count_segments": "开格积穿刺矢", + "roll_discount": "打轻甲更易命中", + "round_dig_bonus": "开格越多打得越疼", + "hit_trade": "加伤换命中", + "armor_roll_rewrite": "攻击恒75%折扣", + "heavy_debuff": "打重甲附加破防", + "dig_yield_mult": "开格产出放大", + "deep_dig": "开格2AP·产出双份", + "flag_resource": "标中雷额外得资源", + "nest_aura": "控巢攻击光环", + "flag_all_hit": "全中标旗伤加倍", + "flag_strike": "标中旗必中打敌", + "ap_carry": "剩AP转下轮攻击", + "charge_shield": "蓄力转减伤", + "charge_spike": "蓄满下轮爆发", + "terrain_refund": "吃地形伤返资源", + "terrain_dig_double": "挖伤害格双产出", + "flag_neutralize": "标旗中和伤害格", + "variant_counter": "吃地形伤反打全体", + } + var summary := String(summaries.get(String(row.get("hook", "")), "")) + if summary != "": + return "%s · %s\n%s" % [String(row.get("display_name", row.get("relic_id", ""))), arch, summary] return "流派件 · %s\n%s" % [arch, String(row.get("display_name", row.get("relic_id", "")))]