[P0][CR-B1] 玩家状态双源:HP/MP/金币/背包在 GameEngine 与 HudManager 各存一份 #520
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?
问题描述
玩家的血量、法力、金币和背包,在
GameEngine(模拟与存档)和HudManager(界面)里各存了一份。两份由不同的代码路径修改,而且没有同步机制。直接后果:证据
1. 初值有三套,没有一套是 D2 的值
以默认的女法师为例:
switchClassHERO_CLASSES覆盖 HUDcreateWorld的默认参数calculateVitalsAtLevel(classes.ts:396)之后在工具栏切换职业,只会调用
switchClass(toolbar-chat-ui.ts:401),用的又是CLASS_STARTER_ATTRS。所以同样是亚马逊,开局就选是 920 / 320,中途切过去是 1250 / 450。引擎则始终是 60 / 30。2. 两份各自被修改
补充说明:
getInventoryGoldLimit,即clvl × 10000(inventory.ts:507-513),这是 1.13c 的规则;PLAYER_GOLD_CAP = 2_500_000(world-panels.ts:75-76、world-panels.ts:1130、world-panels.ts:1811)。3. 成因(git 历史)
双源早于
e475c2e,不是那次拆分造成的,但那次拆分也没有修它。classes.ts,但没有接入。act-scene.ts里的这些双写代码原样搬进了新建的scene/backend/skill-caster.ts和scene/frontend/mouse-controller.ts。原位置在父提交的 L2200、L2222、L2515、L4698。根因
项目从来没有规定"玩家状态归谁"。
HUD 为了能独立演示,先有了一份展示用的数值。之后每个跨越前后端的功能(拾取、施法、治疗、交易),都靠"两边各写一笔"来打补丁。
修复指南
目标:引擎持有唯一的
PlayerState,HUD 只读,所有修改都通过引擎命令完成。 建议分 3 个 PR。PR1:状态归一(最小可合入)
src/game/定义PlayerState: 它由GameEngine持有,并纳入saveSnapshot。快照 schema 版本加 1;旧存档要么显式拒绝,要么写迁移。calculateVitalsAtLevel计算,数据来自 CharStats.txt(LifePerLevel、ManaPerLevel、LifePerVitality、ManaPerMagic等列)。createWorld的maxHp = 60, maxMana = 30默认参数,改为必传,缺失就抛错。HudManager���除hp / maxHp / mana / maxMana / stamina这些可写字段,以及inventory.gold这本账。HudView)。switchClass用的classProfiles快照移进引擎,或者直接删除。PR2:写入口收敛为引擎命令
所有写操作都走
engine.execute(cmd)。命令至少包括:drinkPotion(beltSlot)pickup(groundId)dropGold(amount)buy/sell/gamble/repairdepositGold/withdrawGoldallocateStat(stat)npcHeal()castSkill(...)扣蓝、扣金币、加血都只在命令里发生一次。UI 只负责发命令和显示结果。
命令统一在
onTick里应用,和 #523 的输入队列是同一个机制。PR3:规则迁回
game/,并以 1.13c 为准clvl × 10000。把getInventoryGoldLimit从ui/inventory.ts移进game/,并去掉把PLAYER_GOLD_CAP当背包上限的用法(仓库上限单独处理)。LifePerVitality/ManaPerMagic(以 1/4 为单位)同时增加当前值和最大值,不会回满。现在"加点即回满"的逻辑要去掉。engine.ts:509的"每 25 tick +1"(见 #524)。验收标准
hp / mana / gold;搜不到 HUD 对这些字段的赋值。LifePerVitality/4,不回满。npm run typecheck0 error;npx vitest run全部通过。相关
WorldView解耦):建议先完成本 issue,WorldView才有唯一的数据源可读。已在提交
7367f2a(fix(state): unify player HP/MP/gold/inventory single source of truth in GameEngine (#520))中完成修复,并在5de27f8中补充端到端与 136 关全量验证套件。修复与验证摘要
GameEngine作为唯一权威状态源,消除HudManager与引擎之间的双本账分裂;受伤、喝药、施法耗蓝、NPC 治疗、属性加点与存档读写全部读写同一份状态。tests/p0-520-player-state.test.tsnpm run build0 错误、14 个 P0/E2E 测试套件(190/190 用例)100% 通过、全仓 Vitest 6,460/6,460 通过、136/136 关无头浏览器巡检通过。