33 KiB
33 KiB
M80 · 战斗模拟(脚本演示 → 真模拟)
Owner 决定(2026-09-15):选 B 继续——把战斗从"固定 9 拍脚本"变成读取内容规则的真模拟 (320 装备/100 敌人/60 遗物/36 特质/职业基础行动真正起作用),先做最小可玩循环。
Player-visible stopping point
一场战斗由 02_GAMEPLAY_AND_BALANCE.md 的规则决定:100ms tick 与固定优先级、Ready/Tempo 节奏、
reach/目标选择、Guard/护盾、伤害公式(含暴击与标签化随机)、击倒与线列收缩、目标/胜负判定;
玩家能看到的结果由内容决定(敌人规则、装备触发、职业基础行动、特质),而不是固定剧情演出。
表现层(战场/节拍/音效)继续由事件流驱动,视觉方向不变。
Authority
docs/02_GAMEPLAY_AND_BALANCE.md:§8 时间/事件/随机、§9 属性、§10 Ready 与自动行动、§11 目标/reach、 §13 治疗与保护、§14 移动/推拉、§15 伤害、§16 状态、§17 装备钩子、§18 死亡与替换、§19 控制/撤退/超时/胜负、§24 固定测试向量。docs/05_CONTENT_CATALOG.md:职业基础行动与资源、特质、装备效果、敌人规则(逐行)。- 现有表现层事件契约(
battle_live_art的 kind/actor/target/amount 与 BAT 音效)保持不变。
Ordered steps(每步一个提交 + 一个窄门)
- B1(COMPLETE)战斗内核:
runtime/domain/battle_simulation.gd—— tick 循环与优先级、 属性→派生(§9 公式)、Ready/Tempo、基础行动、reach/目标、Guard、§15 伤害(含暴击与标签化掷骰)、 击倒/线列收缩、胜负与日志;runtime/tests/battle/battle_core_test.gd(公式抽查 + 同种子逐字节一致 + 不同种子只改对应标签流 + 击倒→收缩→胜负)。 - B2(职业 COMPLETE)职业与特质:12 基础职业的行动表已就位——
runtime/domain/profession_actions.gd(12 表 × 3 优先级行 = 36 行、12 个本地资源、reach 1/2/line 与 projectile/area/restore 语义,出处为05_CONTENT_CATALOG.md的 rules/cadence 与02_GAMEPLAY_AND_BALANCE.md§5/§10),模拟按优先级行从下往上扫描:ABG_M80_PROFESSION_ACTIONS_OK tables=12 rows=36 resources=12 reach=2-line healing=true deterministic=true。 B2b(COMPLETE)特质:runtime/domain/trait_hooks.gd覆盖全部 36 条特质——每行声明一个 §17 合法钩子 (before_target/after_damage/after_heal/on_*…)+ 源自benefit的声明式效果,并标记implemented; 当前 6 条已实现(TR-001/017 reach、TR-010 治疗、TR-022 Guard、TR-025 资源、TR-018 加速等),其余待其系统 (construct/summon/sound/装备冷却/区域危害)在 B3/B4 落地后逐行启用(见M80-I03)。 门:ABG_M80_TRAIT_HOOKS_OK traits=36 hooks=legal implemented=6 effect=measurable deterministic=true - B3 装备与敌人:320 装备按触发类别实现(首次受击/换位联动/护卫转移/治疗联动/冷却…); 区域 1 的 12 条敌人规则;Boss 规则最小集。
- B4 合同结构与区域语法:12 回合制(
round_count)、区域 1 的遭遇语法(reach/保护/推/弹幕屏)、 难度参数只改数值不改隐藏规则(§20)。 4b. B5-lite(IN_PROGRESS)数值作者化 + 接线:- 已补:
runtime/domain/battle_stat_authoring.gd—— 12 基础职业的基础数值(在文档带内:BaseHP 140-420 / BaseTempo 24-55 / BaseInitiative 0-45)与普通/精英/Boss 三档敌人基础数值 + 区域压力 ×1.00-1.45; 门ABG_M80_STAT_AUTHORING_OK professions=12 classes=3 bands=declared deterministic=true。 - 已补:
runtime/entry/battle_sim_bridge.gd—— 真实远征团(职业/特质/等级/属性)+ 敌人报价 + 区域压力 → 模拟演员行 → 运行 → 九拍呈现事件(开场 / 7 个节拍 / 结果)与击倒列表。 - 已接线(COMPLETE):
battle_service在开战时跑一次模拟并把结果存为sim_events(计划)+sim_outcome/sim_knockouts;_event_for_phase优先返回计划中的对应相位事件(仍保持"每次推进追加一条"的 不变量 ✓),因此观察/结算校验与回执/快照/结果锁全部保持不变 ✓。首版曾预填phase_events从而破坏 该不变量(实测战斗停住)——已改为计划式取用 ✓。 - 全流程门:34 步 0 阻断 ✓ 首通事实/声望 ✓ 图鉴 ✓ 战斗场/墨迹/节拍 ✓ 音频族 ✓(音频门已按"真战斗内容可变" 改为:开战 + 战斗族 + ≥1 个映射节拍,不再要求固定出现远程/治疗拍)。
- 已补:
- B5 接线与门:用模拟事件流驱动现有战场表现/节拍/BAT 音效;全流程驱动换到真模拟; 双档双语探针 + 源绑定 attempt;真机可玩性由 Owner 验收。
Frozen scope
- 表现层、页面、音频与内容数据不改(只改战斗的"规则来源")。
- 不新增内容行;不实现设计文档之外的自创机制;数值一律取自文档公式。
- 登录/联机、付费、语音等内容不在本里程碑。
B1 产出(2026-09-15)
runtime/domain/battle_simulation.gd:纯净、无引擎依赖的 tick 模拟(100ms/优先级简化、§9 派生(1/100 向下取整)、 §10 Ready/Tempo 与溢出保留、§11 side→reach→protection→frontmost 与target_tie、§15 伤害与暴击、 Guard 吸收、§18 Fallen→线列收缩、§19 胜负、标签化掷骰与日志)。runtime/tests/battle/battle_core_test.gd:派生/伤害公式抽查、同种子日志逐字节一致、跨种子 "首个目标一致 + 暴击流不同"、结果/收缩断言 →ABG_M80_BATTLE_CORE_OK derived=formula damage=formula deterministic=true labels=independent outcome=victory ticks=224。
Acceptance checks
- B1:公式抽查与文档一致;同种子两次运行日志逐字节一致;标签化掷骰只影响自己的流; 0 HP → Fallen → 线列收缩 → 目标判定;无随机伤害方差、无隐藏命中率。
- B2-B4:每条实现的规则可在
05_CONTENT_CATALOG.md找到出处,且有对应断言。 - B5:既有 30 个 marker 不回归;战斗探针(墨迹/尺度/节拍/音频)继续全绿。
Issue register
| ID | 状态 | 说明 |
|---|---|---|
M80-I01 |
RESOLVED(2026-09-18,M99) | 旧 battle_service 9 拍脚本的事件来源已被模拟计划替换:battle_service.gd:79-82 从 _run_simulation 写入 battle["sim_events"],_event_for_phase(:1104-1113)对 phase 0..8 优先返回计划事件并重算 event_hash;旧脚本仅作为无计划快照/回执的 fallback 保留边界,不再驱动正式战斗。证据 attempt:见 M99 行 |
M80-I04 |
RESOLVED(2026-09-15) | 目录只有规则文本、无逐条战斗数值(文档只给职业数值带与敌人 rank 语义)→ 新增 |
battle_stat_authoring.gd 在一个可复核处作者化数值并带带内校验;round_count/敌人 rank 的表值仍待设计补全 |
||
M80-I06 |
RESOLVED(2026-09-18,M99) | 12 条敌人签名已全部落地并被真实战斗观测:M92 门 ABG_M80_ENEMY_ACTIONS_OK enemies=12 ... implemented=12 signature_events=13 enr1_09=18 deterministic=true(attempt m92-en-r1-09/20260918T090154Z-60806 @ 304fc6bb)——过期条件证伪 |
| (投射屏反射、标签吞噬、带位延迟、双足印旋转…)仍需 B3 后续把它实现为效果类而非仅声明 | ||
M80-I05 |
RESOLVED(2026-09-15) | 320/320 行全部声明 §17 合法钩子 + 效果类(230 行关键词分类 + 90 行逐行点名; |
| 233 行落在模拟已实现的效果类,其余按未实现效果类登记,绝不猜);后续把未实现效果类逐类落地即可 | ||
M80-I10 |
OPEN((a)-(d) 均已落地,曲线仍偏易) | (b) 温和版已落地:Guard 吸收上限 35%/击、治疗每场限 2 次、消耗在选行时结算; |
| (a) 轻度版:第 7 回合起 +1 敌、第 10 回合起再 +1(上限队伍+2)。实测(1/8 区):时长 28-40 s → 后期 59 s, | ||
| 第 8 区后期生还 3.7/10、通关率 0.90;探针改为走容量/等级阶梯后 12/12 + Boss 击破(0 重试)。仍差目标: | ||
| 后期 60-90 s、通关率 0.4-0.7。下一杠杆:遭遇敌方总量再上调(队伍+3~+4)或敌人 rank HP 再乘系数;需实机试玩判断手感 | ||
M80-I10b |
DONE(记录) | (d) 回合间 HP 延续(有文档依据:§5"晋升保留 HP 百分比"、§9"MaxHP 变化保留 HP 百分比且不治疗")已进领域层 |
(ContractRun.apply_carry/carry_from/casualties)+ 桥读取 + 扫描使用;(c) 敌人 tempo/initiative +4。实测:第 1/8 区时长 28-34 s、 |
||
| 仍 100% 通关 → (d)+(c) 不足以拉开难度。剩余杠杆均为产品决策:(a) 敌方总量超容量;(b) 削弱满编职业组合的治疗/护卫/资源循环 | ||
M80-I10a |
DONE(记录) | 第一版加强已落地(敌人规模上限=队伍人数;rank HP 150/260/520→260/420/780、power 10/16/22→13/20/26): |
| 时长 20-27 s → 28-34 s,仍 100% 通关、几乎无伤亡。结论:满容量 12 职业队对同数敌人是碾压, | ||
| 继续加数值收益递减。需要 owner 定调的是产品选择:(a) 遭遇敌方总量显著超过我方容量(可读性风险); | ||
| (b) 削弱满编强度(职业/治疗/护卫的资源循环太强);(c) 提高敌方行动频率(tempo/initiative); | ||
(d) 合同层面加压(连续回合损耗、Market 后不自动回复)。测量方法已就绪:tools/m80_balance_sweep.gd -- <region> <from> <to> <attempts> |
||
M80-I10x |
SUPERSEDED | 修正夹具后实测:完整 12 职业队(容量 4→10 + 等级阶梯 + 装备 + 已启用条件行)对现遭遇 100% 通关、20-27 s、几乎无伤亡。 |
早期"曲线"作废——两处夹具缺陷已被抓出并修掉:(1) 桥按 recruit_id 匹配而扫描/探针夹具用 id → 整队退化为默认 PF-B01;桥已改为兼容匹配; |
||
| (2) 敌人属性固定 8(不随等级成长)→ 已改为按档位偏移 + 每级同斜率成长。下一步(数值工作):遭遇规模/档位/HP 总量按公司容量重排,战斗时长向 §13 的 90 s 区间靠拢 | ||
M80-I09 |
RESOLVED(2026-09-15) | §14.1 强制位移已落地:push/pull 相邻换位、Immovable 与边界阻挡、 |
被挡一次碰撞伤害 max(1, floor(0.08 * PhysicalPower))、footprint/rooted 字段已进演员行;门 ABG_M80_MOVEMENT_OK。 |
||
| 尚未实现:多足印整块移动、同时意图优先级仲裁(DESTINATION_RESERVED)、summon/return | ||
M80-I11 |
RESOLVED(2026-09-15) | 状态系统落地(§15 的施加/抵抗判定 + 目标选择器 ally_status/enemy_status + 动作字段 cleanse/extend_status/apply_hindered, |
已在 PF-B10 与 EN-R1-04/EN-R1-09 上接线):时钟逐 tick 递减、到期触发 on_status_expire 钩子、新增 status/status_expired/status_resisted 日志。 |
||
门 ABG_M80_STATUS_OK;优先条件 enabled 14→18(剩 5 个 PENDING 依赖召唤/设备/链接/蓄力) |
||
M80-I12 |
RESOLVED(2026-09-15) | 召唤/设备落地(§14.2):committed + 2 足印配额、越额拒绝记 NO_SUMMON_SPACE 且不消耗、 |
插入在源旁并重排位置、召唤钟到期移除并计入设备损失;deploy/summon_footprint/summon_ticks 动作字段接上 PF-B09 三行。 |
||
条件 enabled 18→21(剩 link_broken/enemy_major_windup);门 ABG_M80_SUMMON_OK |
||
M80-I13 |
RESOLVED(2026-09-15) | 蓄力/施法落地:windup 单位 ×4 tick(steady 0.8 s / slow 2.0 s,落在文档 0.3-4.0 s 通道带内)、 |
cast_start/cast_resolve/cast_cancelled(TARGET_FALLEN)、interrupt 取消记 AO_INTERRUPTED、目标选择器 active_cast、 |
||
条件 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-I34 |
RESOLVED(2026-09-16) | EQ-276 跨战先手(本轮最有产品价值的一条,接合同推进):新效果类 ready_carry—— |
M80-I35 |
RESOLVED(2026-09-18,M92) | EN-R1-09 Crosswind Scribe 签名(on_advance:在敌方最前/最后之间画线;下一次跨线换位 → hindered;窗口 CROSSWIND_WINDOW_TICKS=30 未跨线 → 一次弱范围命中 floor(base×coefficient×0.5) 打全员。窗口时长文档未给,取既有 status 默认档 30 并记录在案):门 ABG_M80_ENEMY_ACTIONS_OK ... implemented=12 enr1_09=%d |
M80-I36 |
RESOLVED(2026-09-18,M93) | EQ-310 Wandering Engine(device-follows):设备记录 owner_id;穿戴者每次移动后设备跟到其后位并立即获得行动准备("acts after arriving");设备每次行动summon_ticks -= 1(文档未给数值,取与逐 tick 递减同单位=1 并记录在案)。footprint 待定原因改写为剩余 on_summon 行 |
M80-I37 |
RESOLVED(2026-09-18,M94) | EQ-316 Item Chorus Frame(最小 repeat scheduler):战斗中记录不同的友方已应用触发标签(tag=hook 名,首个命中者计一次);累计 3 个 → 立即非伤害重复最旧标签的可复用效果子集(guard_bonus/movement_bonus/damage_reduction;damage_bonus 结构性排除)。绑定采用 A 案:声明 hook 为 on_cast_complete,因此改由穿戴者完成施法时检查本战累计标签并调度(_check_chorus_frame 只认带 on_cast_complete/repeat 的穿戴者;_log_equipment_trigger 不再自行触发)——理由:与装备声明 hook 一致,且无 EQ-316 的队伍不会白拿。三个贡献者各 readiness -= tempo*0.1("gain cooldown",与 M80-I23 的退还单位对称)。"non-damaging" 与 "oldest" 的读法按目录原文取最小一致解 |
M80-I38 |
REJECTED(语义保真,2026-09-18) | M95 曾把 EQ-010 / EQ-155 / EQ-319 误标 implemented 并统一接成 before_target+marked;经 PM 语义复核驳回,三行已回滚 pending 并精确化理由(EQ-010 first_becomes_foremost_window;EQ-155 step_direction_preserves_mark;EQ-319 region_tag_choice_marks_source)。驳回理由:三行散文各需自己的触发/窗口,通用 marked 不能替代。修正规则(M80-I27 口径):①只有散文触发点在引擎里已存在才允许换点名位;②触发点不存在的行保持 pending 并给出精确理由;③不得用同一通用效果替代不同散文。回滚 attempt:m95-mark-status-repoint/20260918T100622Z-5954(误标)→ 回滚后重跑同 label。后续:EQ-010 需"首次居前窗口"(M96 待确认)、EQ-155 需移动方向跟踪、EQ-319 需区域标签选择(可能同 EQ-317 属 UI/战外决策) |
M80-I39 |
RESOLVED(2026-09-18,M96) | EQ-010 Forward Claim 真实机制:穿戴者首次移动到最前位(position 0)时,对当时最前敌人施加 marked(每战一次,forward_claim 记档);穿戴者后移离开最前位时移除该 marked 并记 ended。窗口形态复用 crosswind 的"移动后检查"位(_forced_swap 尾部)。观测:真实战斗断言 applied==1、后移后状态被移除、再回最前不重复;负对照(无该行)0 事件。最小读法:起始即在最前不算"become",只认移动进入最前位 |
M80-I40 |
RESOLVED(2026-09-18,M97) | EQ-155 Marked Route Map 真实机制:在移动原语上判定步向/步离(最小读法:position 减小=步向敌方队列,增大=步离;"Marked enemy"取敌方队列中带 marked 的最前单位)。步向 → 将该 marked 的 ticks 重置为不少于作者值(40);步离 → 用 _remove_status 移除并记事件。关系歧义:目录未写"谁的 mark",选择作用在敌人当前的 marked 状态上、不引入所有权系统(最小一致读法);负对照(无该行)0 事件 |
M80-I41 |
RESOLVED(2026-09-18,M98) | EQ-273 Triggerless Knife(自选切片,选 ①):新增战斗级equipment_trigger_events 计数(排除本行自身)与每 actor triggerless_basics;穿戴者的基础动作(action id == 默认 action id)无任何装备触发时计数 +1,第 3 次对目标施加 exposed;任一触发清零。signature:"EQ-273" phase:"exposed",测试断言"第 3 个基础后首次触发"+负对照。被评估但推后:windup_delay 三行 EQ-251/257/291(需"选定的停靠/档期/条款"=选择 UI,无最小读法)、EQ-020(需暴露评估 + 下一物品机会的消耗)、targeting 组(需窗口)、EQ-022(按接收者标记)。跳过(按规则):EQ-317/EQ-319 与 out_of_battle 组 |
M80-I42 |
RESOLVED(2026-09-18,M100) | targeting 组切片(逐行评估后取 EQ-029)。评估:EQ-029「Debuffs prefer enemy with shortest next-action time;时长少 1 tick」可用既有原语(目标选择 + status 时钟)落地 → 已实现并绑定穿戴者(scope 行),真实战斗断言"重取最快敌人 + ticks-1",负对照默认最前策略。推后(精确理由):EQ-031/EQ-256/EQ-275/EQ-088 需 Prepare/玩家选择(同 EQ-317 类,待 owner 决策);EQ-172 需 widened-cast/ground-resolve;EQ-217 需 enable-action 复制系统;EQ-248 需敌方规则复制系统;EQ-259 需 boss 阶段阈值与保留目标。以上保持 pending,不新造系统 |
M80-I43 |
AUDIT(2026-09-18,M101) | targeting 组剩余 8 行审计:既有原语上无可保真落地者。 逐行窗口需求——EQ-031「Choose one neighbor in Prepare」、EQ-256「assigned to counter either named grammar in Prepare」、EQ-275「Choose profession, trait, or enemy as only legal source」、EQ-088「actions may choose either line end」:均需 Prepare/战内玩家选择(与 EQ-317/319 同批,待 owner 决策);EQ-172「Widened cast may ground-resolve if target dies」:需 widened-cast/ground-resolve 语义(模拟仅有普通 cast/windup);EQ-217「Enable action … also gives shorter version to rear」:需 enable-action 复制系统;EQ-248「First enemy copy of wearer's target rule」:需敌方规则复制系统;EQ-259「At phase threshold … disclosed form change」:需 boss 阶段阈值/形态变化。代码核实:bands/phase_threshold/form_change/rule copy/enable_action 在模拟中均不存在(grep 为空)。本包不改产品代码;一致性 attempt 见 M101 行 |
M80-I44 |
RESOLVED(2026-09-19,M80-P1) | 展示桥的未知 journal kind 静默降级已修复。 battle_sim_bridge.gd 现在只把声明的 player-facing action 记录投影到七个节拍,collision 的真实伤害仍映射为 damage;cast/status/movement/signature 等 bookkeeping 明确跳过,未分类 kind 通过 beat_diagnostics + push_error 暴露,不再猜成 damage。选择器按实际 journal family 做确定性、最多七槽覆盖,九相位事件形状保持不变。聚焦源绑定 attempt m80-p1-bridge-focused-v2 与全流程 m80-presentation-bridge-v2 均 PASS;全流程 marker 观察到 damage,guard,knockout,magic,result,telegraph,另一次 beat-capture 观察到 damage,guard,healing,knockout,ranged,result,telegraph。这解决的是错误投影/门诚实性,不等同于 Owner 对 Q3/Q6 的可读性验收;签名/status/movement 仍不产生独立展示词汇。 |
M80-I46 |
OPEN(2026-09-18,current-HEAD visual audit) | 公司线立绘多样性与机器门不一致。 当前 M87 音频复录 attempt 的 ABG_M77_BATTLE_FIELD_OK 仍为 allies=4 enemies=2 ... ally_art=3(此前 M87 handoff 归档为 ally_art=2),而 M77 书面验收要求 4 名公司成员使用 4 张不同立绘。关键帧显示重复的同伴立绘;这会削弱单位识别,且现有 marker 只报告数量、不把重复数判失败。先登记为 Owner 试玩/表现问题,若需要修复应单独开 UI 包。 |
M80-I45 |
OPEN(2026-09-18,audio evidence audit) | 交接视频不能证明实际听感。 M87 的 Dummy 录制与一次 CoreAudio 复录都生成 AAC 48kHz 立体声轨,但 volumedetect 均为 mean=-91.0 dB、max=-91.0 dB,EBU R128 为 -70.0 LUFS(数字静音)。运行时音频路由机器门仍通过(ABG_M77_BATTLE_AUDIO_OK / ABG_M76_AUDIO_CYCLE_OK),但正常播放设备上的音量/舒适度仍未验证;不把静音影片误判为音频通过。 |
战斗结束时,若该同伴一次/每战触发(引擎已有的三种"已用"标记:标签镜像、共享清洁、打断守卫)全都未用,则 ready_with_priority=true; |
||
carry_from/apply_carry 把它随 HP 一起带进下一战;桥 _ally_row 透传;仿真里以该标记进场者 开局准备度=阈值 100(第一拍即可行动)。 |
||
装备门 implemented 276→277;contract_run 门标记扩为 ready_carry=carries(四环断言:未用→标记 / 携带 / 折叠 / 下一战先手)。 |
||
另:本轮又抓到一次静默替换失败(totals 字典没插进去,脚本却打印了成功),此后我的补丁脚本一律 assert 校验锚点与新文本 |
||
M80-I33 |
RESOLVED(2026-09-16) | EQ-165/EQ-246 转正(on_resource_gain 现在在任何入账时触发,不再需要别的资源行先跑);同时修掉三处自身缺陷: |
① 资源增益被重复计算(旧内联行未删);② 装备门减伤断言的键写错(amount 应为 final),脚本错误会中止函数却不置失败, |
||
| 于是那条断言此前从未真正执行、门却打了 OK —— 这是门的设计漏洞,已把断言修正并让批处理必须显示 ERROR 行; | ||
| ③ 上一轮 battle_core "挂死 600s" 的真相是解析错误导致脚本加载失败、Godot 空转不退出(不是性能问题)。 | ||
| implemented 274→276 | ||
M80-I32 |
RESOLVED(2026-09-16) | 跨单位标签机制前两条(2 行):EQ-148 tag_copy(戴者身上落下的第一个标签,以相反符号镜像给最近敌人,每战一次; |
递归保护=先置"已用"再镜像,两侧都带此件也不会无限回声)、EQ-154 cleanse_share(敌方清洁时,对面戴者同步脱落最老的一条妨碍,每战一次)。 |
||
implemented 272→274;状态门标记扩为 mirror=once cleanse=shared(含"用过后不再触发"的反向断言) |
||
M80-I31 |
RESOLVED(2026-09-16) | 装备效果类 ⑦ 打断与防护(3 行):EQ-090 interrupt_strike(施法前声明的打断能力在下一次命中生效—— |
注意顺序陷阱:攻击记录构造时取值并清零,早清零会让记录读到 false,我已按此修正)、EQ-062 interrupt_guard(被守卫的蓄力首次被打断改为 |
||
cast_delayed/INTERRUPT_GUARD 并延长一个 MAJOR 窗口)、EQ-222 movement_immunity(倒下时让下一名同伴获得不可位移)。 |
||
implemented 269→272;windup 门标记扩为 row_interrupt=true guard=delays,装备门加"倒下→同伴不可位移"断言。 |
||
| EQ-020(防止暴露低血同伴的换位)需"暴露评估"规则,登记待定 | ||
M80-I30 |
RESOLVED(2026-09-16) | 六种"站点不读"类的第二批(9 行):before_cast 现在就送准备度(haste 行 EQ-104/EQ-179 改点 cooldown_cut)、 |
on_summon 与 on_fallen 送 reach(新 _apply_reach_gain,EQ-097/198/234)、on_status_expire 送 heal(EQ-308)、 |
||
| EQ-071/247(before_cast + tempo_bonus)与 EQ-095(before_target + reach_bonus)本就由现有站点覆盖、只是初版标错。implemented 260→269; | ||
装备门新增三条站点断言(伸到 reach / 施法前退准备度 / 到期治疗)。EQ-165/EQ-246 挂在 on_resource_gain 却是资源类,语义自指,登记为待定 |
||
M80-I29 |
RESOLVED(2026-09-16) | "可存留减伤池"落地(一条机制吃 2 行):on_status_apply/on_status_expire 与 on_summon 上声明的减伤 |
先存入 pending_reduction,由下一次命中在伤害预览里扣除并清零;EQ-044/EQ-187 转正,implemented 258→260; |
||
装备门新增断言"池化减伤与声明式减伤等效"。注意:预览被多次调用时不消耗,只有真实命中(_resolve_attack)才清零 |
||
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)。 | ||
| 只有 EQ-010(首次成为前排时标记敌方前排)与 EQ-155(带标记前进时延长标记)理论上可用现有原语实现; | ||
我为两者写了机制与端到端断言,没调通(applied=0),于是撤回代码、撤掉断言、把两行退回 pending 并写明原因—— |
||
不留红门,也不留未验证的机制。最终:implemented=256 unclassified=0 battle_scoped=38 missing_system=20 out_of_battle=6。 |
||
| 给下一次的经验:位置规则要用"变化前/后对比 + 事件证据",别用终局状态(标记会到期) | ||
M80-I26 |
RESOLVED(2026-09-16) | on_signature 调查结论:它不是一种机制而是混合钩子——9 行里 4 行属战斗外(结算/商店/快照), |
| 3 行需要不存在的系统(隐蔽/偷窃/压力阀),只有 EQ-276(跨战先手)、EQ-310(设备随行)、EQ-316(三标签排程)、EQ-317(倒塌方向)是真战斗机制。 | ||
| 因此不做通用的"signature 时钟"(那等于给战斗外效果伪造触发窗口)。改为逐行/逐类登记理由: | ||
新增 DECLARED_PENDING_KINDS(21 类)与 pending_report(),装备门现在输出 |
||
implemented=256 unclassified=0 battle_scoped=50 missing_system=8 out_of_battle=6 —— 64 行 pending 全部有据可查,零沉默 |
||
M80-I25 |
RESOLVED(2026-09-16) | 区域 1 签名 ②:五条从声明变为真机制——EN-R1-01 二次撕咬削邻位护盾(新效果类 neighbor_guard_chip)、 |
EN-R1-02 射击后前压(on_cast_complete 位移站点)、EN-R1-04 标签消耗后永久 +1 reach(on_status_expire 站点)、 |
||
EN-R1-08 前压时给身后同伴护盾(rear_guard)、EN-R1-10 跃前后下一击加伤 + EN-R1-11 目标宣告加伤(消费 pending_damage_bonus)。 |
||
顺带修掉一个真缺陷:pending_damage_bonus 只写不读(死账),现在被下一击消费。敌人门 implemented=11 signature_events=13。 |
||
| EN-R1-09 继续 pending:它需要"任意换位"窗口,当前没有 | ||
M80-I24 |
RESOLVED(2026-09-16) | 装备效果类 ⑥ 传承(transfer):transfer 把携带池交给资源最低的幸存同伴 |
(资源为 0 时按护盾兜底);站点=行动完成(on_cast_complete)、资源获得(on_resource_gain)、倒下(on_fallen)。 |
||
4 行改点(EQ-237/265/274/282),implemented 252→256;新门 ABG_M80_TRANSFER_OK moved=12 received=11 |
||
(差额 1 = 第一条按设计走护盾兜底,非丢数据)。economy/planning 两类全部挂在 on_signature,无站点,继续 pending |
||
M80-I23 |
RESOLVED(2026-09-16) | 装备效果类 ⑤ 冷却(cooldown):cooldown_cut 退还准备度(value × tempo × 0.1, |
单位=十分之一秒);站点=行动完成(after_target/on_cast_complete)、前进(on_advance)、召唤成功(on_summon)、 |
||
蓄力被打断(on_interrupt)。9 行改点(EQ-015/016/018/070/190/200/214/260/286),implemented 243→252; |
||
新门 ABG_M80_COOLDOWN_OK plain=736 cooled=642(同一场仗快 13%)。EQ-078/276(on_signature)仍 pending |
||
M80-I21 |
RESOLVED(2026-09-16) | 装备效果类 ④ 目标规则(targeting):_target_rules() 读取已应用行的 rule, |
| EQ-025 平手改判(按作者线序取末位,替换随机掷)、EQ-030 原目标倒下后追其最近幸存邻居;新门 | ||
ABG_M80_TARGETING_OK tie=rearmost neighbour=continues;implemented 241→243 |
||
M80-I22 |
OPEN(2026-09-16) | 发现:战斗开始时会规范化位置,平手在日常战斗中不可达,因此 EQ-025 的决策改动目前只存在于决策函数层。 |
需要产品决策:要么让位置真能并列(如双足印/夹击占位),要么把这行改点成别的机制。targeting 类其余 11 行(EQ-029/031/088/172/199/217/248/254/256/259/275) |
||
仍 implemented: false,原因是它们需要尚不存在的窗口(施法前后重取目标、状态到期重取、敌人复制穿戴者目标规则) |
||
M80-I20 |
RESOLVED(2026-09-16) | 装备效果类 ③ 位移:movement 类落地——推/拉距离 + 前进后蓄势(momentum_bonus 下一次位移消耗) |
与命中后前压(after_damage);8 行改点(EQ-005/006/017/101/103/112/114/118),implemented 233→241; |
||
位移门新增断言 bonus=applied(带 movement_bonus 的推击实测多走一步)。EQ-317(after_collapse)维持未实现 |
||
M80-I19 |
RESOLVED(2026-09-16) | 钩子站点再补两个:on_critical(暴击为该次攻击加值)、on_barrier_break(护盾池被一次打空时回填)。 |
剩余未接站点均为无声明行的钩子(on_signature/on_summon/on_withdraw 等) |
||
M80-I18 |
RESOLVED(2026-09-16) | 钩子站点补齐:on_fallen / after_collapse(倒下时对幸存者结算并记 death_trigger)、 |
on_advance(被拉向阵前时触发)。§17 的 23 个钩子中,未接站点的只剩 on_signature/on_summon/on_withdraw/ |
||
on_critical/before_heal/on_barrier_break/on_resource_gain 等无声明行的钩子 |
||
M80-I17 |
RESOLVED(2026-09-16) | 敌人签名机制接入:钩子站点补 before_target(标记)与 on_protection_change(护屏),on_push 触发推击者的护盾; |
6 条区域 1 档案(EN-R1-03/05/06/07/12 等)从"声明"变为可触发;EN-R1-09 的 on_advance 如实退回未实现(其 action 已带妨碍)。 |
||
门 ABG_M80_ENEMY_ACTIONS_OK … signature_events=12 —— 签名在真实战斗中被观测到 |
||
M80-I16 |
RESOLVED(2026-09-16) | 装备效果类第二批:新增 减伤护屏(damage_reduction,在伤害预览里生效) |
与 节奏加成(tempo_bonus,施法行生效)两类;8 行从"声明类"改点到这两类;implemented 现在严格由 |
||
"核心是否应用该效果类"推导(不再依赖逐行标记);门 ABG_M80_EQUIPMENT_HOOKS_OK 保持绿 |
||
M80-I15 |
RESOLVED(2026-09-16) | 正式 attempt m80-battle-rules 通过:13 个战斗门 + 全流程 18 个 marker 各恰好一次,rc=0,证据已归档 |
M80-I03 |
RESOLVED(2026-09-18,M99) | 审计:职业表 12 表 36 行、22 个条件全部有系统;M99 补上测试已声明但模拟缺失的四个臂(summon_present/device_ready/device_destroyed_and_parts_ready/link_broken,复用 _has_living_summon/summons_lost/_resource_ready/_link_is_broken)并刷新陈旧注释。门 ABG_M80_CONDITION_ROWS_OK enabled=22 pending=0、职业门 tables=12 rows=36;条件行真实战斗 fired>=3 |
M80-I08 |
RESOLVED(2026-09-15) | 两个真缺陷已修:(1) 桥的 _ally_row 合并短键 hp/tempo/initiative,模拟读 profession_base_* → 职业基础值从未生效; |
(2) kind: "guard" 的动作用了伤害路径(自伤且 Guard 池不恢复)→ self_guard_below_half 永真,角色整场循环 refresh_guard 不再攻击。 |
||
| 修复后合同探针 6→12/12 全清 + Boss 击破(4 次重试);平衡扫描重出(无断崖) | ||
M80-I08x |
RESOLVED(历史记录) | 装备数值不改变战斗:桥构建的友军行确实带上了装备数值(实测 wp=10 guard=8),但同一 seed/同一敌人下 |
item="" / EQ-002 / EQ-001 三种配置的 tick 完全相同(305)→ 模拟未按 §9/§15 消费 weapon_power/armor_guard(或消费路径与行字段不一致)。 |
||
| 复现脚本已在本轮记录;修复前所有平衡跑数(M80-I02/I07)无效 | ||
M80-I07 |
OPEN(曲线已校准) | I08 修复后按 §17 容量向量(4→10)重扫全区 8 区 ×12 回合 ×8 次: |
| 通关率 1.00(区1) → 0.33(区8 后段),时长 34→102 s(趋近文档 90 s 区间),生还 4.5→2.2;Boss 集合带 4 护卫后 | ||
| 第 8 区为最难战(38%)。仍需:Boss/精英顺序的人工试玩确认;时长区间逐区对齐 | ||
M80-I02 |
OPEN | 12 回合 × 16 合同的完整跑量平衡需在 B4 后用模拟批量跑数(经济/时长)复核 |