feat(ground): 怪物死亡战利品与金币地面实体生成、等距散落与抛物线弹跳 (Monster Loot & Gold Ground Spawning, Isometric Scatter & Flippy Bounce) #406

Closed
opened 2026-09-24 03:22:49 +00:00 by troytt · 1 comment
Owner

问题背景与现状分析

  1. 金币掉落未生成地面实体:在 src/game/engine.ts 第 885–886 行中,当怪物掉落金币(drop.base.id === "gold" || drop.code?.trim() === "gld")时,代码直接执行了 this.bag.add(drop),既没有在地面上生成金币堆实体(GroundItemEntity),也没有同步到 hudManager.inventory.gold,导致玩家打怪掉钱在地上完全看不见、也无法点击拾取。
  2. 多物品散落坐标与网格坐标同步:怪物(尤其是 Champion / Unique / Boss)一次死亡往往掉落多件战利品(如 1 件装备 + 2 瓶药水 + 金币堆),在调用 groundItems.add 时 cellX, cellY 被硬编码传为 0, 0,未与实际散落的世界等距网格坐标同步。

原版 Diablo II v1.13c 核心机制规范(Ground Truth)

1. 金币与战利品统一落地实体化 (D2Game.dll D2GAME_DropItem)

  • 怪物死亡掉落的所有物品——包括金币堆(gld)、武器、防具、首饰、药水、卷轴、箭矢、宝石、符文、护身符——必须全部作为 GroundItemEntity 掉落在怪物死亡位置的地面上,绝不直接静默塞入背包。
  • 金币实体记录精确的金币数量 amount(由 1.13c 金币公式与怪物等级/TC 倍率算出),地面渲染时根据数额自动匹配小堆(< 100)、中堆(100 ~ 4999)、大堆(>= 5000)金币贴图。

2. 2:1 等距菱形网格螺旋散落与防卡墙 (D2Common.dll ITEM_Drop @ 0x6FD40000)

  • 以被击杀怪物的世界坐标 (monster.x, monster.y) 为中心,通过 findIsometricDropPosition / findSafeDropPosition 沿 2:1 等距子网格向外螺旋寻址。
  • 严格校验地形碰撞掩码:严禁落入 COLLIDE_WALL、COLLIDE_BLANK 或 COLLIDE_MASK_INVALID 阻挡区,且同一怪掉落的多件战利品之间保持最小间距不重叠堆叠,准确记录每件掉落物的 (cellX, cellY) 与 (x, y)。

3. 掉落抛物线弹跳动画 (triggerFlippyBounce)

  • 怪物死亡爆出物品瞬间,每件地面实体立即激活原版 flippy 抛物线腾空弹跳动画(主阶段 + 二次衰减弹跳),落地后进入周期性星芒闪烁(Glint/Sparkle)。

改造与验收标准

  1. 怪物掉落的金币与各类物品 100% 在地面生成 GroundItemEntity(含正确的 isGold: true, amount, cellX, cellY, x, y 及 bounceState)。
  2. 精英怪/Boss 一次爆出多件物品时,在怪物尸体周围呈等距网格自然散开,绝不重叠在同一点,也绝不落入墙壁或虚空。
  3. 地面金币与装备按住 Alt 键均可正确显示浮动标签(如 "128 金币"、魔法蓝字、稀有黄字、暗金字等),标签自动阶梯避让。
  4. 自动化构建与单测 100% 通过。
## 问题背景与现状分析 1. **金币掉落未生成地面实体**:在 [`src/game/engine.ts`](https://git.projectdiablo2.cn/troytt/diablo2-web/src/branch/main/src/game/engine.ts) 第 885–886 行中,当怪物掉落金币(`drop.base.id === "gold" || drop.code?.trim() === "gld"`)时,代码直接执行了 `this.bag.add(drop)`,既没有在地面上生成金币堆实体(`GroundItemEntity`),也没有同步到 `hudManager.inventory.gold`,导致玩家打怪掉钱在地上完全看不见、也无法点击拾取。 2. **多物品散落坐标与网格坐标同步**:怪物(尤其是 Champion / Unique / Boss)一次死亡往往掉落多件战利品(如 1 件装备 + 2 瓶药水 + 金币堆),在调用 `groundItems.add` 时 `cellX, cellY` 被硬编码传为 `0, 0`,未与实际散落的世界等距网格坐标同步。 --- ## 原版 Diablo II v1.13c 核心机制规范(Ground Truth) ### 1. 金币与战利品统一落地实体化 (`D2Game.dll` `D2GAME_DropItem`) - 怪物死亡掉落的所有物品——包括**金币堆(`gld`)**、武器、防具、首饰、药水、卷轴、箭矢、宝石、符文、护身符——必须全部作为 `GroundItemEntity` 掉落在怪物死亡位置的地面上,绝不直接静默塞入背包。 - 金币实体记录精确的金币数量 `amount`(由 1.13c 金币公式与怪物等级/TC 倍率算出),地面渲染时根据数额自动匹配小堆(`< 100`)、中堆(`100 ~ 4999`)、大堆(`>= 5000`)金币贴图。 ### 2. 2:1 等距菱形网格螺旋散落与防卡墙 (`D2Common.dll` `ITEM_Drop` @ `0x6FD40000`) - 以被击杀怪物的世界坐标 `(monster.x, monster.y)` 为中心,通过 `findIsometricDropPosition` / `findSafeDropPosition` 沿 2:1 等距子网格向外螺旋寻址。 - 严格校验地形碰撞掩码:严禁落入 `COLLIDE_WALL`、`COLLIDE_BLANK` 或 `COLLIDE_MASK_INVALID` 阻挡区,且同一怪掉落的多件战利品之间保持最小间距不重叠堆叠,准确记录每件掉落物的 `(cellX, cellY)` 与 `(x, y)`。 ### 3. 掉落抛物线弹跳动画 (`triggerFlippyBounce`) - 怪物死亡爆出物品瞬间,每件地面实体立即激活原版 `flippy` 抛物线腾空弹跳动画(主阶段 + 二次衰减弹跳),落地后进入周期性星芒闪烁(Glint/Sparkle)。 --- ## 改造与验收标准 1. 怪物掉落的金币与各类物品 100% 在地面生成 `GroundItemEntity`(含正确的 `isGold: true`, `amount`, `cellX`, `cellY`, `x`, `y` 及 `bounceState`)。 2. 精英怪/Boss 一次爆出多件物品时,在怪物尸体周围呈等距网格自然散开,绝不重叠在同一点,也绝不落入墙壁或虚空。 3. 地面金币与装备按住 `Alt` 键均可正确显示浮动标签(如 `"128 金币"`、魔法蓝字、稀有黄字、暗金字等),标签自动阶梯避让。 4. 自动化构建与单测 100% 通过。
troytt added this to the 实现打怪掉落物品 milestone 2026-09-24 03:22:49 +00:00
Author
Owner

Milestone M11.3 (Issue #406) Gate 2 Verification: 100% PASS

All 5 Gate subagents voted unanimously APPROVE / CLEAN:

  • Reviewer 1: APPROVE (Ground entity creation for all loot, silent bag add elimination, 2:1 isometric scatter and flippy bounce verified)
  • Reviewer 2: APPROVE (Simulation clock domain synchronization in live scene verified, calculateBounceHeight defensive guard verified)
  • Challenger 1: APPROVE (85/85 adversarial assertions pass across wall boundaries, anti-stacking, flippy bounce, and sparkle glints)
  • Challenger 2: APPROVE (18/18 new tests, 76/76 ground tests, 252/252 related tests passed, clean build)
  • Forensic Auditor: CLEAN (Strict worktree isolation, main repository 100% clean, zero leaks)

Merged to main at commit cef09db and pushed to origin/main.
Worktree .worktrees/issue-406 pruned cleanly.

### Milestone M11.3 (Issue #406) Gate 2 Verification: 100% PASS All 5 Gate subagents voted unanimously **APPROVE** / **CLEAN**: - **Reviewer 1**: APPROVE (Ground entity creation for all loot, silent bag add elimination, 2:1 isometric scatter and flippy bounce verified) - **Reviewer 2**: APPROVE (Simulation clock domain synchronization in live scene verified, calculateBounceHeight defensive guard verified) - **Challenger 1**: APPROVE (85/85 adversarial assertions pass across wall boundaries, anti-stacking, flippy bounce, and sparkle glints) - **Challenger 2**: APPROVE (18/18 new tests, 76/76 ground tests, 252/252 related tests passed, clean build) - **Forensic Auditor**: CLEAN (Strict worktree isolation, main repository 100% clean, zero leaks) Merged to `main` at commit `cef09db` and pushed to `origin/main`. Worktree `.worktrees/issue-406` pruned cleanly.
Sign in to join this conversation.
No Label
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#406
No description provided.