diff --git a/notes b/notes index abb7d32..a5fc43b 100644 --- a/notes +++ b/notes @@ -181,6 +181,10 @@ One dependency chain runs through this section: the decoration mechanism (a tile - **Ships with two doc edits and a changelog line.** `doc/user/hud-and-ui.md:10` spells the label out in its panel list; `LABEL_STABIL` (`hudLayout.ts:178`) is one string by design ("named so a rename moves one string"), and renaming the constant alongside it is optional. Leave `CHANGELOG.md:60` and `history.md` alone — those are records of what shipped, not current claims. This one *is* player-facing, so it earns a real changelog entry. - **Verification is visual, because nothing pins the string.** No test asserts `"STABIL"` — `hud.test.ts:892` only names it in a comment — so the check is a screenshot of the bar at **both** presets rather than the one that happens to be loaded, which is exactly how a marker shipped wrapping once before. +- [ ] **Spread a kill's drops across the tile — right now they stack and read as one item.** Every drop from a kill is pushed at exactly `enemy.x, enemy.y`: the guaranteed health pack (`engine.ts:6125`), the ammo/swap roll or its Toolchain consolation (`:6152`/`:6159`), the bonus-weapon roll (`:6164`), and both Elite pushes (`lootApply.ts:156`/`:158`/`:167`). So a regular kill can leave **three** drops on identical coordinates and an Elite **two**. The renderer applies no offset — `sprites.ts:778` projects raw `drop.x`/`drop.y` — so they draw as perfectly overlapping billboards and the player sees one pickup. + - **Cosmetic only, which is why it has gone unnoticed.** `collectLoot` walks every drop within `AMMO_PICKUP_RADIUS`, so the whole stack is picked up and nothing is lost; the bug is that you cannot tell there was anything to think about. It also makes the loot-drop screenshots misleading in the same way. + - **The trap for whoever implements it: do not spend an rng draw.** Jittering the position off the shared PRNG stream shifts every subsequent draw and re-rolls the layout of every level ever generated, invalidating stored replays — the same constraint that keeps the styleset on its own salted stream and `planAcidOverflows` at zero draws. Spread deterministically instead: the drops are pushed in a fixed order and already carry a per-enemy sequence number (`pushLootDrop`'s `dropSeq`), so an index-derived offset costs nothing and changes no existing map. + ### Multiplayer & backend The multiplayer *features* are still one-liners in the last section; this is the operational half.