feat(combat): 主角增益只续时不叠层批——attack_up/ac_up stack→refresh(2026-09-20 用户拍板,台账 101)

用户裁决:主角增益与减益统一『只续时不叠层』(对齐削弱 2026-09-18 续时定案),
变相削弱主角性能已知悉接受。

- status_effects.tres:attack_up/ac_up 两行 stack_policy stack→refresh
  (duration=1/max_stack=2 表值不动——refresh 下 max_stack 不消费,weaken 先例)
- 容器/池/AC 消费侧零代码改动(refresh 容器既有)
- 行为影响:增伤不再 +100%、护甲强化不再 +2 AC(局内可达 AC 上限 11)
- 增益状态 v0.11:合并策略表/例子表/调参表/联动纪律/验收条同步
- registry 两行 + 06「叠层不续命的读感」解决移除(44→43 条)
- 冒烟 355 项 0 失败三闸全过(AC12 采样探针随行降 AC11)
This commit is contained in:
DKChan committed 2026-09-20 04:09:44 +08:00
1 parent 6a9f5901c1
commit 0ffb1de6f2
6 files changed
+34 -33

No files matched your search

@@ -11,7 +11,7 @@ rows = [{
"magnitude": 50,
"unit": "percent",
"duration_settlements": 1,
"stack_policy": "stack",
"stack_policy": "refresh",
"max_stack": 2
}, {
"effect_id": "ac_up",
@@ -20,7 +20,7 @@ rows = [{
"magnitude": 1,
"unit": "ac",
"duration_settlements": 1,
"stack_policy": "stack",
"stack_policy": "refresh",
"max_stack": 2
}, {
"effect_id": "ambush",
@@ -120,3 +120,7 @@ rows = [{
; weaken(削弱)叠层改续时:stack_policy stack→refresh、duration_settlements 1→2(同名重复授予
; 只刷新剩余结算数、层数恒 1——结构性消饱和,×2 叠满池触底 ×0 免伤轮从根杜绝;refresh 实现与
; empower/fortify 同款零代码)。duration 终值、off_guard N 值、当量锚复算全部归 状态层重设计批。
; 主角增益只续时不叠层批(2026-09-20 用户拍板「主角的其实也一样,都是按照叙事的方式,不要有叠层;只续时不叠层」——
; 对齐削弱 2026-09-18 续时定案):attack_up / ac_up 两行 stack_policy stack→refresh;
; duration_settlements=1 与 max_stack=2 表值不动(refresh 下层数恒 1、max_stack 不消费——weaken 先例;
; dur=1 下续时表现为重复拿重置当轮倒数,跨轮延续随将来 duration 拉长自然显形——数值归状态层重设计批)。
@@ -229,7 +229,7 @@ func _smoke_level() -> void:
# ---- 护甲等级掷点批·换装护栏(2026-09-16 用户拍板:百分比减伤行整体退役换装 AC,无双轨)----
# ① 换装在位:defense_up 状态行/池映射/奖励行三处全无残留,ac_up 三处就位(unit=ac ×2 层);
# ① 换装在位:defense_up 状态行/池映射/奖励行三处全无残留,ac_up 三处就位(unit=ac,2026-09-20 改只续时不叠层);
# ② 免伤墙归零护栏泛化保留(BUG-0003 事故类永久免疫):hero_defense 池任何 percent 行
# magnitude × max_stack > pool_clamp_lo——单效果叠满不可触池底(off_guard 已于 2026-09-18
# 结构修复批退离 hero_defense 池换装 AC 轴,池内现无 percent 行——本断言防未来负向行回归时静默造墙);
@@ -243,8 +243,8 @@ func _smoke_ac_swap_guard() -> void:
var ac_row: Dictionary = _db.status_effect_row("ac_up")
check(not ac_row.is_empty() and String(ac_row.get("target_side", "")) == "hero" \
and String(ac_row.get("unit", "")) == "ac" and int(ac_row.get("magnitude", 0)) == 1 \
and int(ac_row.get("max_stack", 0)) == 2 and String(ac_row.get("stack_policy", "")) == "stack",
"ac_up 行在位(hero · +1 ac · ×2 层 · stack——AC 阈值轴新量纲)")
and String(ac_row.get("stack_policy", "")) == "refresh",
"ac_up 行在位(hero · +1 ac · 只续时不叠层——2026-09-20 主角增益续时批)")
var ac_reward := {}
for row in _db.reward.rows:
if String(row.get("cell_type", "")) == "defense" and String(row.get("polarity", "")) == "positive":
@@ -327,16 +327,17 @@ func _smoke_armor_roll() -> void:
"削弱重复授予 → 层数保持 1、剩余结算数重置 2(续时语义——结构性消饱和)")
check(int(weaken_probe.get("pool", -999)) == int(_db.status_effect_row("weaken").magnitude),
"削弱单层池读数 = 行值(enemy_output 池单层贡献——×2 叠满触底 ×0 不可达,免伤轮根治)")
# ④ AC12 折扣档分布(行为面):ac_up ×2 逐轮授给(时效 1)→ Boss 行攻击拍逐拍判定
var tiers := _ac12_tier_samples()
# ④ AC11 折扣档分布(行为面):ac_up 逐轮授给(时效 1)→ Boss 行攻击拍逐拍判定
# (2026-09-20 主角增益续时批后 ac_up 层数恒 1——局内可达 AC 上限 10+1=11,探针随行下调)
var tiers := _ac11_tier_samples()
var tier_distinct := {}
var tiers_valid := true
for t in tiers:
tier_distinct[int(t)] = true
if not [100, 75, 50, 25].has(int(t)):
tiers_valid = false
check(tiers_valid and tiers.size() >= 3, "AC12 攻击拍逐拍判定(×%d 拍全部落档域 {100,75,50,25})" % tiers.size())
check(tier_distinct.size() >= 2, "折扣档实际流动(AC12 实测档位 %s——≥2 档可见)" % str(tier_distinct.keys()))
check(tiers_valid and tiers.size() >= 3, "AC11 攻击拍逐拍判定(×%d 拍全部落档域 {100,75,50,25})" % tiers.size())
check(tier_distinct.size() >= 2, "折扣档实际流动(AC11 实测档位 %s——≥2 档可见)" % str(tier_distinct.keys()))
# ⑤ 棋盘来源必中 + 吃掷点行留档(全战斗流扫描)
var run = _run_battle(1, 0)
var board_ok := true
@@ -399,9 +400,10 @@ func _weaken_refresh_probe() -> Dictionary:
return {}
# AC12 折扣档采样:每停手轮前直授 ac_up ×2(时效 1 逐轮衰减)——敌拍逐拍判定留档。
# 敌人技能池批:拍序改为摇号制,原 AC 批定影种子不再保证档位多样性——扫描种子取首个 ≥2 档样本集。
func _ac12_tier_samples() -> Array:
# AC11 折扣档采样:每停手轮前直授 ac_up ×1(时效 1 逐轮衰减)——敌拍逐拍判定留档。
# (2026-09-20 主角增益续时批:ac_up 只续时不叠层、层数恒 1——原 ×2 授给达 AC12 的采样随批降为 AC11;
# 敌人技能池批:拍序改为摇号制,原 AC 批定影种子不再保证档位多样性——扫描种子取首个 ≥2 档样本集。)
func _ac11_tier_samples() -> Array:
for seed_offset in range(20):
var rng = load("res://core/rng_service.gd").new()
rng.set_master_seed(20260917 + seed_offset)
@@ -413,8 +415,7 @@ func _ac12_tier_samples() -> Array:
var guard := 12
while settlement.battle_result == "" and guard > 0:
guard -= 1
for i in range(2):
settlement._status_effects.apply_effect("ac_up", {"source_class": "safe_cell", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index})
settlement._status_effects.apply_effect("ac_up", {"source_class": "safe_cell", "origin_cell": Vector2i(0, 0), "round_index": settlement.round_index})
settlement.minesweeper.settle_batch([{"action": "stop"}])
var tiers: Array = []
for row in rows: