[P1][CR-B5] 五套技能/战斗管线并存、四个耗蓝函数:收敛到数据驱动的 registry #525
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述
放一个技能、结算一次伤害、算一次耗蓝,这些事在代码里各有好几套实现,彼此的数值和行为并不一致。更麻烦的是,玩家实际走的路径和测试最多的路径不是同一条。
证据
1. 五条技能/战斗路径
skills.ts的castSkill/tickProjectilesDEMO_SKILLS)scene/backend/skill-caster.ts的castSkillskills/registry.ts的executeSkill113c,以及 MissileEngine / CombatPipeline / StateBus / AuraScanner / SummonManagerWorldArena中实例化,只能通过?arena=1进入combat.ts的近战与tickCombatMultiskills.ts的executeSkill2. 四个耗蓝函数
getSkillManadefault: return 10getSkillManaCostcalculateXxxStats(level).manaCostgetSkillMana的 batch1 分支;skills.ts的executeSkillcalculateManaCost(mana + lvlmana × (lvl − 1)) × 2^(manashift − 8),保留 1 位小数;manashift缺失时按 8 处理computeSkillManaCost256max(minmana << 8, (mana + lvlmana × (slvl − 1)) << manashift),对应 D2Common 的SKILLS_GetManaCost鼠标施法用的
getSkillMana会优先读 HUD 条目里的manaCost。没有 HUD 条目时:所以同一个技能在同一等级下,HUD 显示的耗蓝、实际扣的蓝和 arena 里的结果可能各不相同。
3. 桩代码、死代码与重复数据
转发桩:
skills/impl/下 221 个模块中,有 218 个是约 44 行的转发桩,只是把调用转给evaluateSkillCore113c/executeSkillCore113c。示例:skill-007-fire-arrow.ts:21-41。只被测试引用的模块:以下模块在 src 中没有任何 import,只被测试引用:
formulas.ts(1.9k 行)game/skill-tree.ts(4.9k 行)skills/assassin-traps.ts、skills/druid-summon.ts、skills/druid-elemental.ts、skills/paladin-*.ts等职业 helper重复数据:
skills.ts内嵌了约 3.2k 行手抄数据:CANONICAL_113C_MISSILES,约 1.3k 行(skills.ts:618)CANONICAL_113C_OVERLAYS,约 1.9k 行(skills.ts:2172)它们和 data-registry 从 MPQ 读到的 Missiles.txt / Overlay.txt 重复。
4. 后果
skillId === N式的分发(见 #527)出自路径 1 和路径 2。根因
数据驱动的新内核(registry / MissileEngine)写好之后,没有把 GameEngine 和联机切换过去,旧路径也没有删掉。之后每次修 bug,都是在玩家正在用的那条旧路径上打补丁。
修复指南
computeSkillManaCost256:getSkillMana、getSkillManaCost、calculateManaCost。如果一次删不完,先让它们转发到computeSkillManaCost256,再逐步删除。skill-caster.ts只保留输入解析,技能逻辑逐个删除。skills.ts的castSkill/tickProjectiles。tickCombatMulti(路径 4)切到同一内核。如果决定由 M20 取代 P2P 锁步,这一步可以跳过。executeSkill(路径 5)和只被测试引用的模块。对应的测试要么迁移到 registry,要么一起删除。srvstfunc/srvdofunc分发(见 #527),这样就不再需要 218 个转发桩。只有确实需要特殊逻辑的技能才写独立模块。skills.ts里的内嵌表改为从 data-registry 读取。验收标准
skill-caster.ts中不再有按skillId === N编写的技能逻辑。formulas.ts、executeSkill以及上面列出的仅测试使用的模块,都已接入生产路径或删除。skills/impl/中不再有纯转发桩。npm run typecheck0 error;npx vitest run全部通过。相关
getSkillMana的兜底、近战伤害。