# 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` - Generated retail dtable dump: `Crusader_Decomp/tools/dump_dtable_names.py` -> `Crusader_Decomp/out/dtable_get_name_dump.json` plus companion CSVs - Generated Regret dtable dump: `Crusader_Decomp/tools/dump_dtable_names.py regret` -> `Crusader_Decomp/out/regret_dtable_get_name_dump.json` plus companion CSVs ## 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: the verified retail dump from `tools/dump_dtable_names.py` shows `1478:22BC` is a `char *[41]` table whose global slots `0`, `14`, `26`, and `32` all point to the same `INVALID` string. The removed grenade names then occupy bomb-family slots `33..40` as `GRENADE`, `CONCUSSION GRENADE`, `NERVE GAS GRENADE`, `EMP GRENADE`, `SPIDER BOMB`, `LAND MINE`, `BLAST PAC`, and `FUSION PAC`. - 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`. - The verified dump also closes one open point: `0x0548` does **not** appear in the resolved dtable category tables at all. Its visible in-game `Invalid` label is therefore best explained as a plain `DTable_GetNameForShapeNo` fallback for an unmapped shape, not as a dedicated `0548` name-table entry. 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. ### Reusable dump status - The retail `DTable_GetNameForShapeNo` mapping is now exported in reusable form for downstream tooling: - `out/dtable_get_name_dump.json` - `out/dtable_global_name_slots.csv` - `out/dtable_category_entries.csv` - `out/dtable_resolved_shapes.csv` - That dump is generated by `tools/dump_dtable_names.py` directly from retail `CRUSADER.EXE` bytes plus `exports/CRUSADER.EXE.xml` relocations, so it is suitable for feeding the map renderer and shape catalogs without keeping the mapping only in prose notes. ### Regret-side DTable comparison - The same dumper now also supports live `REGRET.EXE`, with the recovered helper at `1130:056a` and the Regret dtable island in segment `1480`. - The Regret dump closes the shifted layout directly from raw bytes even without a local `REGRET.EXE.xml` export: pointer table `1480:2856`, string pool `1480:2926`, and category tables at `1480:2590` (ammo), `1480:2614` (weapons), `1480:2792` (misc items), and `1480:27DE` (bombs). - Regret also repeats a single `INVALID` string through four global slots, but at a different expanded layout: indices `0`, `17`, `36`, and `44` all point back to `1480:2926`. - That expanded Regret table preserves several names that do not appear in the earlier Remorse dump, including weapons `BK-16`, `LNR-81`, `XP-5`; items `IONIC SHIELD`, `PLASMA SHIELD`, `DISRUPTER`, `SPIDER MINE`, `DATA PICK`, `MINE DET`, `PORTABLE BETTY`, `RADIATION SHIELD`, and `VIR IMAGER`; and ammo `BK-16 CLIP`, `LNR-81 CLIP`. - The resolved Regret bomb rows are also narrower than a naive string scan suggests: `0x0343` = `GRENADE`, `0x0350` = `EMP GRENADE`, `0x0560` = `SPIDER BOMB`, `0x039A` = `LAND MINE`, and `0x039C` = `FUSION PAC`. - `BLAST PAC` is notably absent from the recovered Regret dtable output. In other words, the Regret executable still carries `LAND MINE` and `FUSION PAC`, but not a `BLAST PAC` bomb-table slot analogous to the Remorse block. Current best read: the Regret comparison strengthens the claim that these explosive names come from a real retail inventory/display lookup family rather than renderer-only catalog text, but it also shows that the two games do not preserve the exact same bomb/item naming inventory. ### 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 - `0x0251` no longer fits the generic placeholder bucket well. Current best read is `VALUEBOX`, a local data/helper box used by monitors, watcher panels, security displays, and keypads. - `0x0318` also no longer belongs in the generic placeholder-cube bucket. The older Remorse catalog label `PLACEHOLDER_CUBE` is now weaker than the extracted usecode evidence: both Remorse and Regret name class `0x0318` as `CRUMORPH`, and the recovered `equip` body is a control-transfer pad that compares local `QLo` against mutable actor field `0x63` before bracketing `TRIGGER.slot_20`. - The strongest remaining placeholder-cube entries from the catalog/scene pass are: - `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 code path allows `0548` and similar bad/unmapped shapes to reach the inventory/display UI if they are not direct entries in the retail `1478:22BC` dtable mapping? 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?