From f7be1f47c4420394c118c88cbd78c9e647aaf3f9 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Tue, 20 Oct 2026 07:39:30 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E6=95=88=E6=9E=9C=E5=BC=95=E6=93=8E?= =?UTF-8?q?=E6=97=A0=E7=8A=B6=E6=80=81=E5=8C=96=C2=B7=E5=86=99=E5=8D=A1?= =?UTF-8?q?=E8=A1=A5=E4=B8=81):=20grilling=20=E5=AE=A1=E6=9F=A5=E8=BD=AE?= =?UTF-8?q?=E4=BA=8B=E5=AE=9E=E4=BF=AE=E6=AD=A3=E2=80=94=E2=80=94T3=20?= =?UTF-8?q?=E8=A1=A5=20:390=20=E5=9B=9E=E7=81=8C=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=88=A0=E9=99=A4=EF=BC=88=E6=BC=8F=E5=88=97=E5=8D=B3=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E6=96=AD=E8=A3=82=E9=9D=A2=EF=BC=89=EF=BC=9BT2/T1=20?= =?UTF-8?q?=E8=A1=A5=20run=5Fledger=20=E5=A4=B4=E6=B3=A8=E4=B8=8E=20level?= =?UTF-8?q?=5Frunner=20:630=20=E8=BF=87=E6=9C=9F=E5=A5=91=E7=BA=A6?= =?UTF-8?q?=E5=8F=A5=E6=B8=85=E7=90=86=E9=9D=A2=EF=BC=88=E3=80=8C=E6=88=98?= =?UTF-8?q?=E6=96=97=E4=BE=A7=E5=8F=AA=E8=B5=B0=20read/append=20=E5=8E=9F?= =?UTF-8?q?=E8=AF=AD=E3=80=8D=E9=9A=8F=20ctx=20=E7=9B=B4=E5=86=99=E5=AD=97?= =?UTF-8?q?=E9=9D=A2=E5=A4=B1=E4=B9=89=EF=BC=89=EF=BC=9BT5=20counter=5Fid?= =?UTF-8?q?=5Flegal=20=E4=BF=AE=E5=9B=9E=E6=8F=90=E6=A1=88=20=C2=A73.3=20?= =?UTF-8?q?=E5=AD=97=E9=9D=A2=EF=BC=88=E4=BB=85=20meta=5F=20=E9=9D=9E?= =?UTF-8?q?=E6=B3=95=E2=80=94=E2=80=94=E3=80=8C=E5=85=B6=E4=BD=99=E6=9C=AA?= =?UTF-8?q?=E7=9F=A5=E5=89=8D=E7=BC=80=E9=9D=9E=E6=B3=95=E3=80=8D=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E4=B8=8D=E5=8F=AF=E5=88=A4=E5=AE=9A=EF=BC=8C=E6=AE=8B?= =?UTF-8?q?=E5=89=A9=E9=A3=8E=E9=99=A9=E5=BD=92=20V10=20=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E4=B8=8E=E8=AF=84=E5=AE=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reports/需求卡片-效果引擎无状态化批-2026-10-20.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reports/需求卡片-效果引擎无状态化批-2026-10-20.md b/reports/需求卡片-效果引擎无状态化批-2026-10-20.md index e7099b8a..7e8fcc1e 100644 --- a/reports/需求卡片-效果引擎无状态化批-2026-10-20.md +++ b/reports/需求卡片-效果引擎无状态化批-2026-10-20.md @@ -143,7 +143,7 @@ - [ ] 新建 `game/core/effect_context.gd`:`class_name EffectContext extends RefCounted`;四字段 `var round_bucket: Dictionary[Variant, Variant] = {}`(battle_bucket/level_bucket/adventure_bucket 同型);文件头注 ≤8 行两类白名单;跑一次编辑器扫描刷新全局类缓存(code-conventions §4.5) - [ ] `BattleOrchestrator` 增三公开成员:`fx_counters_round`/`fx_counters_battle`(`Dictionary[Variant, Variant]`)+`counters_ctx: EffectContext`;`_init` 内构造 ctx 并挂自有两桶引用 -- [ ] `LevelRunner` 增公开成员 `level_counters: Dictionary[Variant, Variant]`;`_start_battle` enc 增 `"level_counters": level_counters`(`"ledger"` 行 :471 后) +- [ ] `LevelRunner` 增公开成员 `level_counters: Dictionary[Variant, Variant]`;`_start_battle` enc 增 `"level_counters": level_counters`(`"ledger"` 行 :471 后);:630 过期契约注释(「战斗侧只走账类原语,战末 export/开局 seed」)随批改写 - [ ] `begin_battle` :373 后挂载:`counters_ctx.adventure_bucket = _ledger.adventure_counters`;`enc.get("level_counters")` 为 Dictionary 时 `counters_ctx.level_bucket = enc["level_counters"]`(缺省=调试/单场空桶,与 `_ledger` 缺省新账同式) - [ ] `set_fx` 三处扩参:`func set_fx(fx: EffectEngine, ctx: EffectContext) -> void`(action_economy.gd:48/damage_controller.gd:70/reward_economy.gd:23),三协同件各增 `_ctx` 成员;`battle_orchestrator.gd:280-282` 调用点同步 - [ ] 删 `adventure_runner.gd:838-841` `_reset_tree_limited_counters` 与 `:845` 调用点(同批摘除冒烟 `:6125` 直呼——F2 面随 T7 断言同轮) @@ -159,7 +159,7 @@ - [ ] `counter(ctx: EffectContext, counter_id: String) -> int`(读 `bucket_of(ctx, counter_id)`) - [ ] 新增 `static func bucket_of(ctx: EffectContext, counter_id: String) -> Dictionary[Variant, Variant]`:`round_`→round_bucket/`lvl_`→level_bucket/`adv_`→adventure_bucket/其余→battle_bucket(前缀规则唯一出处) - [ ] 新增静态 `counter_add`/`counter_spend`(签名见产出块;算术与阈值闸语义从现役 :228-242 逐字保留);删实例版两方法与 `counters_export`/`counters_seed`(:246-257) -- [ ] `run_ledger.gd` 删 `counters_seed_snapshot`(:36-37)与 `counters_merge_export`(:40-45) +- [ ] `run_ledger.gd` 删 `counters_seed_snapshot`(:36-37)与 `counters_merge_export`(:40-45);头注契约句「战斗侧只走 read/append 两族原语」同步改写(ctx 直写后字面失义、签名可见显式引用的立意由 EffectContext 承接) - [ ] `DO_KEYS` 删 `"domain"`/`"reset_at"`(:72-75) - [ ] 孤立验证:裸引擎 rig `EffectEngine.new(null)`+自建 ctx,合成一行 counter_add 行 dispatch→静态写口→counter 读回一致 @@ -171,7 +171,7 @@ - [ ] `damage_controller.gd`::78 dispatch 加 ctx;:345 读改 `EffectEngine.counter(_ctx, ...)`;:351/:464 写口静态化 - [ ] `reward_economy.gd`::65 dispatch 加 ctx - [ ] `grant_segment.gd`::103/:205 读口 ctx 化(经 `oc.counters_ctx`);:327 `_apply_counter_hit` 内写口改静态(调用点 :66/:122/:156/:215/:264 零改动);:54/:61/:62 `combo_cap` 收集与实参删除 -- [ ] `battle_orchestrator.gd`::88 `_fx_emit` 加 `counters_ctx`;:714 受理闸改 `EffectEngine.counter_spend(counters_ctx, ...)`;:635-647 删 `dig_combo` 死读数+combo 加成分支+`_feat_yield_adjust` 第五参(§7.10.14,零行为差);:1122-1123 战末导出两行删除(:1118-1121 bonus_delta 汇入保留——那是 N6 留编排器的运行态,不是计数器) +- [ ] `battle_orchestrator.gd`::88 `_fx_emit` 加 `counters_ctx`;:714 受理闸改 `EffectEngine.counter_spend(counters_ctx, ...)`;:390 回灌调用 `_fx.counters_seed(_ledger.counters_seed_snapshot())` 连同 :389 注释行删除;:635-647 删 `dig_combo` 死读数+combo 加成分支+`_feat_yield_adjust` 第五参(§7.10.14,零行为差);:1122-1123 战末导出两行删除(:1118-1121 bonus_delta 汇入保留——那是 N6 留编排器的运行态,不是计数器) - [ ] 孤立验证:单场编排 rig begin_battle→request_dig 一次→`run_ledger.adventure_counters` 立即可见写入(无战末时点依赖) ### T4 round 泛化+宿主清零确认(0.25d) @@ -186,7 +186,7 @@ **取用**:T2 的 `bucket_of` 前缀规则。**产出**:加载期前缀致命通道(V9)。 -- [ ] 新增静态判定函数 `static func counter_id_legal(counter_id: String) -> bool`(名字锁定):无前缀=true(battle);`round_`/`lvl_`/`adv_` 前缀=true;其余带前缀形态(`meta_` 等)=false——前缀规则与 `bucket_of` 同源(bucket_of 解析为 battle 而 id 首段含 `_` 即非法,单一规则表) +- [ ] 新增静态判定函数 `static func counter_id_legal(counter_id: String) -> bool`(名字锁定;规则=提案 §3.3 字面):`round_`/`lvl_`/`adv_` 前缀=true;`meta_` 前缀=false(引擎不接存档级);其余=true(无前缀落 battle——「其余未知前缀也非法」在语法上不可判定:一切 snake_case id 都以「词_」形态开头,禁自造封闭词表=第二事实源红线;自造新前缀静默落 battle 的残余风险由 V10 扫描与评审承担) - [ ] `validate_trigger_row` 增分支:`do` 含 `counter_id` 时校验,非法→errs 追加 `{"category": "enum", ...}` 违例 - [ ] `_push_trigger` 增 assert:`do` 含 `counter_id` 时同规则 assert(树合成行路径,写错调试期致命;assert 消息以 `[效果引擎]` 前缀起头,供孤立验证扫描) - [ ] 孤立验证(V9 assert 侧):`--headless --script` 最小驱动 rebuild 带「counter_id 带非法前缀」的合成行——输出扫到 `[效果引擎]` assert 签名=拦截在位(debug 通道;assert 不改退出码,判据=输出签名扫描)