[P0][CR-B1a] 从 HUD 丢金币再捡回,引擎账(存档)凭空增加金币 #521
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?
问题描述
金币有两本账:
engine.bag.gold:进存档;hudManager.inventory.gold:界面上显示的数。从背包面板丢金币时,只扣了 HUD 的账,引擎却在地上凭空生成了一堆金币。捡回来时,两本账又各加一笔。
结果:HUD 显示的数字不变,引擎账(也就是存档里的那本)每丢一次,就多出一次丢掉的金额。玩家只要反复"丢 → 捡",就能让存档里的金币一直涨到背包上限(
clvl × 10000)。证据(调用链)
this.inventory.dropGold(amt)扣 HUD 的账,然后回调onDropGoldToGround(hud-manager.ts:1118-1122)。engine.dropGold(...)(toolbar-chat-ui.ts:605-607)。engine.dropGold只在地上创建金币堆,不扣engine.bag.gold(engine.ts:1530)。engine.pickupGold(engine.ts:1573)给engine.bag记账(入账在 engine.ts:1587、engine.ts:1616),调用方再给 HUD 记一笔(mouse-controller.ts:458-464、skill-caster.ts:373-379)。engine.bag(engine.ts:1178-1182)。复现
复现脚本 probe-gold-mint.mts(点击展开)
把脚本保存为仓库根目录下的
probe-gold-mint.mts,然后执行npx tsx probe-gold-mint.mts。脚本直接调用 HUD 丢金币路径里引擎侧的两步:
engine.dropGold,然后engine.pickupGold。输出:
afterDrop始终等于before,说明丢金币没有扣引擎的账;每轮净增 1000。根因
#520:金币没有唯一的归属方。"丢金币"这个跨越前后端的功能,只在 HUD 一侧扣了账。
修复指南
根治要靠 #520,让金币只存在于引擎。在那之前可以先止血:
GameEngine.dropGold(amount, x, y)改为先从this.bag.gold扣款。null或抛错。engine.dropGold,数字从引擎读取;不再调用inventory.dropGold自己扣账。bag.gold加上地面金币总额不变。给这类入口加上断言。验收标准
engine.bag.gold仍等于初始值。bag.gold加地面金币总额不变。npm run typecheck0 error;npx vitest run全部通过。相关
已在提交
206b59e(fix(gold): prevent HUD drop-gold and world pickup gold duplication (#521))中完成修复,并在5de27f8中补充端到端与 136 关全量验证套件。修复与验证摘要
GameEngine唯一金库(dropPlayerGold/dropGold与pickupGold),严格保证initialGold - N + N === initialGold守恒,并按 1.13cclvl * 10,000(getInventoryGoldLimit)执行背包金币上限与超额余量落盘。tests/p0-521-gold-duplication.test.tsnpm run build0 错误、14 个 P0/E2E 测试套件(190/190 用例)100% 通过、全仓 Vitest 6,460/6,460 通过、136/136 关无头浏览器巡检通过。