feat(m80-i28): promote the covered screen rows and assert screens lower damage

This commit is contained in:
2026-09-16 21:06:11 +08:00
parent af39684a2a
commit 6bbfdffa59
4 changed files with 30 additions and 4 deletions
+1
View File
@@ -17,6 +17,7 @@
| 2026-09-15 | M79-F 区域 6 内容(数据/本地化/立绘/音乐/战场)+ 推进门到第十一份合同 + 注册表测试 R6 计修正 | `feat(m79-f)` `c728a49a`/`a4de1565` | `m79-region6` `20260915T050042Z-16542` | runtime_verified | 240 装备/45 遗物/74 敌人/12 Boss/12 合同/461 本地化;`contracts=11 region=RG-06`;15 marker 各 1 次 |
| 2026-09-15 | M79-E 区域 5 内容(数据/本地化/立绘/音乐/战场)+ 推进门到第九份合同 + 注册表验证器修 13 敌人 | `feat(m79-e)` `aff0358b`/`6a9518e3` | `m79-region5` `20260915T023248Z-65213` | runtime_verified | 200 装备/37 遗物/61 敌人/10 Boss/10 合同/395 本地化;`contracts=9 region=RG-05`;15 marker 各 1 次 |
| 2026-09-15 | M79-D 区域 4 美术+音乐+接线(含 R2/R3 姿态回填;risk 选项轮询去 flake) | `feat(m79-d)` `5f9723d2` + `test(m79-d)` `c7abcb97` | `m79-region4` `20260915T022134Z-55448` | runtime_verified | 28 张 R4 立绘+卷根战场+`battle_r4`/`boss_r4`;R2/R3 42 条姿态接线回填;15 marker 各 1 次 |
| 2026-09-16 | M80-I28 减伤行回归真实站点 + 减伤断言 | `feat(m80-i28)` | runtime_verified | implemented 256→258 |
| 2026-09-16 | M80-I26 on_signature 定性 + 64 行 pending 全部登记理由 | `feat(m80-i26)` | runtime_verified | 装备门 `unclassified=0 battle_scoped=50 missing_system=8 out_of_battle=6`;13 门+探针绿 |
| 2026-09-16 | M80-I25 区域 1 五条签名 + 修 `pending_damage_bonus` 死账 | `feat(m80-i25)` | runtime_verified | 13 门+探针绿;`implemented=11 signature_events=13` |
| 2026-09-16 | M80-I24 装备 transfer 类(同伴间池转移) | `feat(m80-i24)` | runtime_verified | 新门 `ABG_M80_TRANSFER_OK moved=12 received=11`;implemented 252→256;17 门+探针绿 |
+3
View File
@@ -113,6 +113,9 @@ reach/目标选择、Guard/护盾、伤害公式(含暴击与标签化随机
条件 `enemy_major_windup`(major = ≥12 tick);门 `ABG_M80_WINDUP_OK` |
| `M80-I14` | RESOLVED(2026-09-15)| 链接落地:`link`/`relink` 字段、`link_id` 绑定、`link_broken` 条件随绑定单位倒下而成立、PF-B08 三行可跑;
门 `ABG_M80_LINK_OK`。**至此 23 个优先条件全部 enabled(pending=0)** |
| `M80-I28` | RESOLVED(2026-09-16)| 六种"站点不读"类里最便宜的一组:`damage_reduction` 的 4 行中,**EQ-047/EQ-306 早已被
`damage_preview` 的 before_damage 站点覆盖**,只是初版手工标成 false(零代码回升,implemented 256→258),并补断言
"减伤行必须让预览伤害真的变低";EQ-044(on_status_apply)/EQ-187(on_summon)需要"可存留的减伤池",两行共用一条原因登记 |
| `M80-I27` | RESOLVED(2026-09-16)| **纠正 M80-I26 的乐观判断**:`mark`/`status`/`delay` 那 15 行并非"只差扩站点"——
读原文后,它们多是跨单位标签机制(复制标签并反转符号 EQ-148、索引对位 EQ-119、跨阵营清洁 EQ-154、物品触发计数 EQ-273、
每受赠者标记 EQ-022、位置标签继承 EQ-297、职业标签互换 EQ-218、区域安全索引 EQ-243、Wind-up 互锁 EQ-108)。
+4 -4
View File
@@ -66,8 +66,8 @@ const EXPLICIT := {
"EQ-029": {"hook": "before_target", "kind": "targeting", "implemented": false},
"EQ-030": {"hook": "before_target", "kind": "targeting", "implemented": true, "rule": "dead_target_neighbor"},
"EQ-031": {"hook": "before_cast", "kind": "targeting", "implemented": false},
"EQ-044": {"hook": "on_status_apply", "kind": "damage_reduction", "implemented": false},
"EQ-047": {"hook": "before_damage", "kind": "damage_reduction", "implemented": false},
"EQ-044": {"hook": "on_status_apply", "kind": "damage_reduction", "implemented": false, "reason": "battle_scoped:screen_needs_a_banked_reduction_pool"},
"EQ-047": {"hook": "before_damage", "kind": "damage_reduction", "implemented": true},
"EQ-061": {"hook": "on_cast_complete", "kind": "haste", "implemented": true},
"EQ-062": {"hook": "on_interrupt", "kind": "interrupt", "implemented": false},
"EQ-066": {"hook": "before_cast", "kind": "haste", "implemented": true},
@@ -96,7 +96,7 @@ const EXPLICIT := {
"EQ-172": {"hook": "on_cast_complete", "kind": "targeting", "implemented": false},
"EQ-179": {"hook": "before_cast", "kind": "haste", "implemented": false},
"EQ-184": {"hook": "on_summon", "kind": "footprint", "implemented": false},
"EQ-187": {"hook": "on_summon", "kind": "damage_reduction", "implemented": false},
"EQ-187": {"hook": "on_summon", "kind": "damage_reduction", "implemented": false, "reason": "battle_scoped:screen_needs_a_banked_reduction_pool"},
"EQ-188": {"hook": "on_summon", "kind": "footprint", "implemented": false},
"EQ-190": {"hook": "on_summon", "kind": "cooldown_cut", "implemented": true},
"EQ-198": {"hook": "on_summon", "kind": "reach_bonus", "implemented": false},
@@ -136,7 +136,7 @@ const EXPLICIT := {
"EQ-295": {"hook": "on_signature", "kind": "planning", "implemented": false},
"EQ-297": {"hook": "after_collapse", "kind": "status", "implemented": false, "reason": "missing_system:position_tag_inherit"},
"EQ-300": {"hook": "on_signature", "kind": "delay", "implemented": false},
"EQ-306": {"hook": "before_damage", "kind": "damage_reduction", "implemented": false},
"EQ-306": {"hook": "before_damage", "kind": "damage_reduction", "implemented": true},
"EQ-308": {"hook": "on_status_expire", "kind": "heal_bonus", "implemented": false},
"EQ-310": {"hook": "on_advance", "kind": "footprint", "implemented": false, "reason": "battle_scoped:device_follows"},
"EQ-316": {"hook": "on_cast_complete", "kind": "repeat", "implemented": false, "reason": "battle_scoped:tag_three_repeat"},
@@ -55,6 +55,28 @@ func _verify_equipment_effect() -> void:
], [])
var actor: Dictionary = Array(simulation.allies)[0]
_expect(int(simulation._trait_effect(actor, "after_damage").get("guard_bonus", 0)) == 2, "an implemented equipment hook applies its guard bonus")
_verify_screen_reduces_damage()
func _verify_screen_reduces_damage() -> void:
# A screen row on the before_damage hook must lower the incoming preview.
var action := {"id": "strike", "base": 20, "coefficient": 1.0, "power_source": "physical_power",
"kind": "damage", "reach": 1, "target": "frontmost"}
var plain: ABGBattleSimulation = Simulation.new()
plain.setup("screen-plain", [
{"id": "ally-0", "position": 0, "profession_id": "PF-B01", "action": action},
{"id": "ally-1", "position": 1, "profession_id": "PF-B01"},
], [])
var screened: ABGBattleSimulation = Simulation.new()
screened.setup("screen-row", [
{"id": "ally-0", "position": 0, "profession_id": "PF-B01", "action": action},
{"id": "ally-1", "position": 1, "profession_id": "PF-B01",
"equipment_hooks": [{"hook": "before_damage", "effect": {"kind": "damage_reduction", "value": 3}, "implemented": true}]},
], [])
var open_preview: Dictionary = plain.damage_preview(plain.allies[0], plain.allies[1], action)
var row_preview: Dictionary = screened.damage_preview(screened.allies[0], screened.allies[1], action)
_expect(int(row_preview.amount) < int(open_preview.amount),
"a screen row lowers the incoming damage (open=%d screened=%d)" % [int(open_preview.amount), int(row_preview.amount)])
func _expect(condition: bool, label: String) -> void: