From f6a5155675fbab29129b61f89b0f88e89a754fec Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Sun, 29 Mar 2026 13:47:42 +0200 Subject: [PATCH] Removed items doc --- docs/removed_items.md | 152 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 docs/removed_items.md diff --git a/docs/removed_items.md b/docs/removed_items.md new file mode 100644 index 0000000..e0a94f9 --- /dev/null +++ b/docs/removed_items.md @@ -0,0 +1,152 @@ +# Removed And Suspicious Item Shapes + +This note collects the current evidence for several old or suspicious No Remorse item shapes that still appear in map data. + +The working split is: + +- `0343` is a real surviving Remorse usecode class with limited behavior. +- `034E`, `034F`, and `0350` are strongly evidenced as leftover grenade-family map/catalog entries, and the retail executable still preserves their exact display names. +- `0548` is now tied to the live inventory UI fallback path: retail `DTable_GetNameForShapeNo` returns the `INVALID` string for unmapped entries, and `Weasel_OnPaint` uses that same lookup. +- `0110` and `0112` are present in old maps, but are not yet tied to any confirmed Remorse pickup/use behavior. +- The broader retail explosive-name table also contains `LAND MINE`, `BLAST PAC`, and `FUSION PAC`, but those are not newly found removed items in Remorse; they line up with live Remorse explosive classes. + +## Primary Sources + +- Remorse shape catalog: `Crusader_Decomp_Public/map_renderer/Catalogs/usecode_shape_catalog_remorse.csv` +- Remorse cached scene exports: `Crusader_Decomp_Public/map_renderer/.cache/scene-cache/remorse/**/scene.json` +- Remorse usecode export: `Crusader_Decomp_Public/USECODE_REMORSE/**` +- Regret usecode export: `Crusader_Decomp_Public/USECODE_REGRET/**` for comparison only +- Retail disassembly export: `Crusader_Decomp/exports/CRUSADER.EXE.xml` + +## High-Level Conclusions + +### `0x0343` - old grenade + +- The Remorse shape catalog already labels `0x0343` as `ITEM_GRENADE_REMOVED_0343` with description `Old grenade, cannot be picked up`. +- Cached Remorse scene exports show `0343` placed on multiple maps including `2`, `6`, `26`, `64`, `69`, `116`, `170`, `245`, `246`, `251`, and `255`. +- The cached shape metadata for those map instances marks it as `kind: terrain`, `solid: true`, `land: true`, `draw: false`, `invitem: false`. +- Unlike the other removed grenade-family shapes, `0343` is a real Remorse usecode class: `GRENADE`, class id `0x0343`. +- The recovered `GRENADE` class does not currently expose meaningful `look`, `use`, or inventory-facing handlers. The only non-empty exported handlers are `hit` and `gotHit`. +- `GRENADE::hit` writes info `0x020B` and excludes the process; `GRENADE::gotHit` writes info `0x020C` and excludes the process. +- Two Pepsi dispenser families in Remorse still explicitly try to create shape `0x0343`, so this is not just dead catalog metadata. `PEPSINS::use` and `PEPSIEW::use` both call `Item.legalCreateAtPoint(..., 0x0343, item)`. + +Current best read: `0343` is a surviving but heavily stripped grenade-family object. It is still known to the Remorse scripting layer, but not as a normal player-facing inventory grenade. + +### `0x034E`, `0x034F`, `0x0350` - removed grenade variants + +- The Remorse shape catalog labels them as: + - `0x034E` = `UNUSED_GRENADE_CONCUSSION_034E` + - `0x034F` = `UNUSED_GRENADE_NERVE_034F` + - `0x0350` = `UNUSED_GRENADE_EMP_0350` +- Cached scene exports show these shapes placed on old Remorse maps alongside `0343`, especially on `245` and `246`, and workspace-wide scene-cache searches also turned up placements across several other maps. +- The cached map metadata for these shapes matches `0343`: terrain-like placement, `solid`, `land`, `draw: false`, `invitem: false`. +- Exact Remorse usecode searches did not recover separate classes for `034E`, `034F`, or `0350`. +- That matters because it separates them from `0343`: they still exist in map/catalog data, but they do not currently have the same direct evidence of a surviving scripted class in Remorse. +- The retail executable evidence is now stronger too. Live `CRUSADER.EXE` segment `1118` contains the already-named `DTable_GetNameForShapeNo`, and its backing name array at `1478:22BC` includes the exact explosive strings: + - `GRENADE` + - `CONCUSSION GRENADE` + - `NERVE GAS GRENADE` + - `EMP GRENADE` + - `SPIDER BOMB` + - `LAND MINE` + - `BLAST PAC` + - `FUSION PAC` +- The repeated `INVALID` placeholders inside that same array are also informative: `1478:22BC` is a `char *[41]` table, and slots `0`, `15`, `27`, and `33` all point to the same `INVALID` string. The removed grenade names live immediately after one of those placeholder boundaries. +- This means the removed grenade family is not just a renderer/catalog naming artifact. The retail executable still knows those display strings even though the distinct Remorse scripted classes appear to be gone. + +Current best read: these are old grenade-family placements left in maps and editor-era data whose exact inventory/display names still survive in the retail executable, but whose distinct Remorse behavior has likely been removed or collapsed away before retail. The user-observed behavior where some can be forced into inventory but do nothing is consistent with a leftover shape/name path surviving after the actual item logic was cut. + +### `0x0548` - `Invalid` + +- The Remorse shape catalog labels `0x0548` as `ITEM_INVALID_0548` with description `Cannot be picked up with S but can be picked with G, shows up a Medkit icon with text "Invalid"`. +- Cached scene searches found `0548` on at least map `255`. +- The executable-side confirmation is now materially stronger than the first pass suggested: + - retail `1118:056A` is already identified as `DTable_GetNameForShapeNo` + - its fallback branch at `1118:05D5` returns `DS:238C`, which is the string `INVALID` + - `Weasel_OnPaint` at `13E0:0932` calls `DTable_GetNameForShapeNo`, so this is a real inventory/display UI path rather than an isolated dead string helper +- The backing data segment confirms the same model. In segment `1478`, the item-name table at `1478:22BC` is a `char *[41]` array whose placeholder slots point at the `INVALID` string at `1478:238C`. +- I still have not closed the exact shape-to-table-index mapping for `0548`, but the retail executable evidence now cleanly supports the user report that at least some bad/unmapped inventory entries resolve to visible label text `Invalid` in-game. + +Current best read: `0548` is a real leftover item-like record that still resolves through at least one executable-side text/name path, but no meaningful use behavior has been recovered yet. + +### `0x0110` and `0x0112` - suspicious non-pickup shapes + +- The Remorse shape catalog labels them only generically: + - `0x0110` = `ITEM_UNKNOWN_REMOVED_0110` + - `0x0112` = `ITEM_UNKNOWN_REMOVED_0112` +- Cached scene searches found `0110` on old Remorse maps including `64` and `255`. +- Cached scene searches found `0112` on old Remorse maps including `47`, `69`, and `255`. +- No direct Remorse usecode class for `0110` or `0112` was recovered in this pass. +- The class-event index does contain many incidental `0110` and `0112` hits, but those are body offsets or event-window bounds in unrelated classes, not proof that either shape is a real scripted item class. +- Regret comparison material does show many incidental `0110`/`0112` hits too, which reinforces that numeric grep matches for these IDs are noisy and should not be promoted into behavioral claims. + +Current best read: `0110` and `0112` are present in map data, but they remain unidentified map objects rather than recovered cut inventory items. + +## Additional DTable Findings + +The retail name table behind `DTable_GetNameForShapeNo` was useful beyond the original target list because it shows which explosive-family names are still present in the executable and which ones are only suspicious if you stop at the catalog layer. + +### Active explosive items, not newly found cut items + +- `LAND MINE`, `BLAST PAC`, and `FUSION PAC` all appear in the same retail name table block as the removed grenade variants. +- In Remorse usecode, these are not dead names: + - `LANDMINE` is a live class with class id `0x039A` + - `BLASTPAC` is a live class with class id `0x039B` + - `FUSPAC` is a live class with class id `0x039C` +- The map-renderer catalog still underlabels two of those shapes: + - `0x039A` is currently unlabeled in the Remorse catalog + - `0x039B` is labeled `ITEM_BLASTPACK_039B` + - `0x039C` is currently unlabeled in the Remorse catalog +- Cached Remorse scenes place `039A/039B/039C` on normal gameplay maps including `1`, `2`, `14`, `64`, `170`, `246`, `251`, and `255`. + +Current best read: these are active explosive inventory objects, not additional removed-item discoveries. The current catalog simply does not label all of them clearly. + +### Spider bomb: stronger Regret-side evidence than Remorse-side evidence + +- The same retail name table includes `SPIDER BOMB`. +- I have not yet recovered a matching Remorse catalog entry, Remorse scene placement, or Remorse usecode class for that name. +- Comparative Regret evidence is real, though: `REGRET` has a concrete `CSPID` class with class id `0x0584`, and existing Regret-side notes already identify that as `spider bomb`. + +Current best read: `SPIDER BOMB` is probably a legitimate series-level explosive item name rather than random dtable noise, but in this batch it remains a Regret-backed comparative lead, not a closed Remorse removed-item finding. + +## Other Unused-Looking Remorse Shapes + +The broader Remorse catalog does contain more unused-looking or obviously non-retail shapes, but most of them are not good fits for the same "pickup-able inert item" bucket as the removed grenade family. + +### Placeholder cube family + +- The strongest additional item-adjacent candidates from the catalog/scene pass are placeholder cube entries: + - `0x0251` = `PLACEHOLDER_KEY_CUBE` + - `0x0318` = `PLACEHOLDER_CUBE` + - `0x0337` = `PLACEHOLDER_CUBE_BIG` + - `0x0361` = `PLACEHOLDER_CUBE_RED_BLACK` +- Cached Remorse scenes place these on multiple maps, so they are not catalog-only artifacts. +- Their current labels and kinds point more toward editor/UI/test content than toward cut inventory explosives. + +Current best read: these are real leftover placeholder objects worth a future dedicated note, but they are a separate category from the grenade/inventory leftovers. + +### Editor-only and invisible-wall leftovers + +- The same scan found many `Editor Object` and invisible-wall entries such as `005A/005B/005C`, `0066..0069`, `0290`, `0336`, and many later one-off editor shapes. +- These are clearly useful for understanding old map construction and hidden geometry, but they do not currently look like removed inventory items. + +### Regret comparison note for `0548` + +- A useful cross-game contrast showed up too: in the current Regret catalog, `0x0548` is labeled as an editor/invisible-wall shape, not as an `Invalid` pickup-like leftover. +- That makes the Remorse-side `0548` behavior more interesting, because it suggests this shape slot drifted significantly between the two games rather than preserving one stable item identity. + +## Evidence Notes + +- The strongest positive Remorse evidence in this batch is for `0343`: it has a named exported class (`GRENADE`) and explicit spawn attempts from two other live Remorse classes. +- The strongest positive executable-side evidence in this batch is the now-closed `DTable_GetNameForShapeNo` path: retail `Weasel_OnPaint` uses the same lookup family that falls back to `INVALID`, and the backing `1478:22BC` name array preserves the removed grenade names inline. +- The grenade-family map metadata (`draw: false`, `invitem: false`) is important because it suggests these were no longer treated as normal visible inventory pickups by the map/render metadata layer, even though alternate pickup/debug paths may still pull some of them into inventory. +- Ghidra database notes were added in the live `CRUSADER.EXE` session at `1118:056A` and `1118:05D5` to preserve the `DTable_GetNameForShapeNo` / `INVALID` fallback interpretation. + +## Open Questions + +1. What exact shape or category values land on the four `INVALID` placeholder slots in the retail `1478:22BC` dtable array, and is `0548` one of them directly? +2. Do `034E`, `034F`, and `0350` still have dead executable-side item-definition records even though no separate Remorse usecode classes were recovered? +3. Is the observed forced-pickup behavior using a generic item acquisition path that bypasses normal `invitem` rules and therefore reaches the `DTable_GetNameForShapeNo` fallback path? +4. What are `0110` and `0112` visually or functionally in the old maps, beyond being non-pickup leftovers? +5. Does Remorse still contain a spider-bomb shape or handler that has simply not been recognized yet, or is `SPIDER BOMB` dtable-only in Remorse while remaining live in Regret (`CSPID`)? +6. Are there raw-build, beta, Pentagram, or ScummVM sources that preserve a cleaner shape-to-dtable mapping for the removed grenade family?