[P0][CR-B4/B8] 生产路径中的自创规则与静默兜底 #524
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?
问题描述
AGENTS.md§1 要求严格以 1.13c 原版数据表和反汇编为准,§3 禁止"宽容吞错的伪 Fallback"。但单机的生产路径里仍有:后果是数值和原版对不上,而且出了问题不会报错,只会"看起来能跑"。
证据
1. 自创规则与数值
[0, 0, 20, 60, 140, 280]和[0, 0, 250, 700, 1500, 3000]。单机场景 import 的是联机那份DEMO_SKILLS、DEMO_QUESTS、playerDamage: 7、playerManaPerAttack: 2等ManaRegen列(7 个职业均为 120),加上 1.13c 的回蓝逻辑Monster上并不存在的isUndead字段(as any掩盖了类型错误),所以永远落到怪物名 / Id 的子串匹配lUndead/hUndead。仓库已经把它解析到了MonsterStats.isUndead(min + max) / 2Param1=25、Param2=35。代码没有读取这些列,也没有注明这些数值对应哪一列或哪个反汇编地址补充说明:
mummy1–mummy5、unraveler1–unraveler5。名字匹配能补回一部分,但 Dried Corpse、Hollow One 这类仍然会漏判。formulas.ts没有接入:它有 1.9k 行,包含calculateAttack、calculateHitChance等函数,但在 src 中没有任何引用。药水对照(Misc.txt 1.13c):
pSpell=3、state=healthpot、stat1=hpregen,calc1为 30 / 60 / 100 / 180 / 320,len为 192 / 160 / 171 / 192 / 256,持续回复pSpell=3、state=manapot、stat1=manarecovery,calc1为 20 / 40 / 80 / 150 / 250,len=128,持续回复pSpell=5,stat1=hitpoints、stat2=mana,calc为 35 / 100,即瞬间回复 35% / 100%pSpell=9、state=staminapot、len=750、staminarecoverybonus 5000,不回血pSpell=6、state=antidote、len=750、poisonresist 50、maxpoisonresist 10,不回血pSpell=6、state=thawing、len=750、coldresist 50、maxcoldresist 10,不回血另外,喝药只修改 HUD 的血量,不修改引擎里的真实血量(见 #520)。
2. 静默兜底
getSkillMana的取值顺序:1. 读 HUD 快捷键条目里的
manaCost;2. batch1 技能固定按 1 级计算;
3. 其余技能走写死的 switch;
4. 未知技能
default: return 10。fireexplode等)difficulty ?? 'normal'?? 0?? 75/?? 100wallHit.damage ?? 10import.meta.glob时,注册 0 个技能模块,也不报错根因
?? 默认值和catch {}让"数据缺失"不会报错,问题只能靠人眼发现。修复指南
requireRow/requireCell:按 key 取行,取不到就 throw,错误信息里带上表名和 key。用它替换掉?? 默认值和编造数据的分支。DEMO_EXPERIENCE,改用 Experience.txt。demo-data.ts和net-simulation.ts里的 DEMO 常量;playerDamage、playerManaPerAttack等改为由装备和技能数据计算。ManaRegen和 1.13c 的回蓝逻辑实现。和 #520 的PlayerState一起做。targetMonster.stats.isUndead,删除名字匹配,并去掉这里的as any。D2Rng(见 #523)。命中率等计算要么接入formulas.ts,要么删掉它(见 #525)。pSpell、state、len、stat1/calc1、stat2/calc2,按 1.13c 的药水逻辑实现持续回复和百分比回复。如果存在职业系数之类的特殊处理,以反汇编为准。parseMiscTable目前只解析了pSpell(misc-items.ts:203-204),需要补齐其余各列。getSkillMana:删除 switch 和default: return 10,统一使用 #525 选定的耗蓝函数。getMissileTxtData:查不到就 throw。src/game/**和src/scene/backend/**中的?? <数字字面量>。维护一份白名单,只允许缩小。验收标准
src/中不再有DEMO_EXPERIENCE,act-scene 不再 import DEMO 常量。新角色的升级阈值与 Experience.txt 一���(500 / 1500 / 3750 / 7875)。stats.isUndead。新增测试:mummy1、unraveler1判为亡灵,fallen1不是。len时间内持续回复共calc1点生命;npm run typecheck0 error;npx vitest run全部通过。相关
PlayerState。formulas.ts的去留。D2Rng。已在提交
462fdc7(fix(parity): enforce 1.13c table-driven stats and fail-fast invariants (#524))中完成修复,并在5de27f8中补充端到端与 136 关全量验证套件。修复与验证摘要
CharStats.txt(含 120s 回蓝公式与按职业加点收益,加点不再满血)、GameEngine.spawnMonster严格按MonStats.txt+MonLvl.txt计算血量/属性/移速(移除levelId * 25与硬编码移速4)、药水按Misc.txt结算、Level.dt1Mask记录真实加载掩码并移除tileLibrary ?? []等静默回退。tests/p0-524-parity.test.tsnpm run build0 错误、14 个 P0/E2E 测试套件(190/190 用例)100% 通过、全仓 Vitest 6,460/6,460 通过、136/136 关无头浏览器巡检通过。