10 KiB
10 KiB
Editor/Helper Object Survey
This pass widened the renderer research beyond egg and NPC spawner objects and focused on editor/helper shapes that already carry useful classification data in the exported scene payload.
Evidence Base
- The renderer already exports
shapeDefinitions[*]entries withkind,family,dimensions,visibilityTags,traits, and the matching catalog entry. - The public catalogs already distinguish many non-gameplay helper families that are currently easy to miss in the UI.
- Representative catalog anchors in Remorse include:
0x005A,0x005B,0x005C,0x005D,0x0066-0x0069: invisible/editor wall objects0x01B8:camera0x0290,0x0336:LIGHT_BRIDGE_*0x0337,0x0361: placeholder cubes and placeholder UI/editor markers0x0108,0x0113,0x01B9,0x01BA,0x025F,0x0260,0x02F0,0x0373,0x0399,0x03A1,0x04C8:wallgun_shape_*helper cluster
0x0251 Frame 0: VALUEBOX
- The recovered usecode corpus now closes
0x0251directly asVALUEBOXin both retail games, not as a generic placeholder cube. - Current safest read is
local payload box, notworld prop: the object stores numeric or text-selection data for nearby authored controllers instead of behaving like a visible gameplay pickup. - The caller side is much clearer than
VALUEBOX.slot_20(...)itself. Checked bodies that explicitly scan nearbyshape=0x0251items include:MONITNS(0x0102) andMONITEW(0x0165)WALLMNS(0x0367) and RegretWALLMEW(0x0436)- Regret
SECURNS(0x03FB) andSECUREW(0x043D) - Regret
WATCHNS(0x04C6) andWATCHEW(0x04DE) KEYPAD(0x0A0Ein Remorse,0x0A0Din Regret)
- Those families usually match the box on shared
QLo, then callVALBOX.slot_20(valueBox)to recover the stored value. Monitor, wall-display, and security-terminal paths also feedItem.getQHi(valueBox)intoTEXTFILE.slot_23(...), soQHibehaves like a second text/value selector rather than dead metadata. VALUEBOX::cacheinalso hints at a small self-initialization lane: when the decoded value is zero it callsFREE.slot_20(0x0383)and writes a replacement throughVALUEBOX.slot_20(...). The slot-20 decompilation is still weak, so the conservative read ispossible value initialization, not a fully closed random-number claim.- Decompressed
.cachescenes back the helper role strongly:- Remorse retail caches currently expose
299frame-0 placements. The strongest nearby controller families in the local scan areMONITEW(90hits),MONITNS(65), andWATCHEW(18). - Regret retail caches currently expose
171frame-0 placements. The strongest nearby controller families areMONITEW(32),MONITNS(21),WATCHEW(20),SECURNS(11),SECUREW(6), andWALLMNS(6). - Most frame-0 boxes still carry
quality = 0, which is consistent with the commonQLo == 0default-link path in the callers. - Rare authored payloads do exist: Regret map
29has aVALUEBOXwithquality 23(QLo 23), and Remorse maps25,26, and141all contain a nonzero example at53118,30558,96withquality 828(QLo 60,QHi 3,npcNum 2). - Many placements occur in small chained local clusters through
nextItem, which fits a backing-store/helper role better than a standalone scene-prop interpretation.
- Remorse retail caches currently expose
- Practical renderer implication:
0x0251should be labeledVALUEBOX, should keepQLo,QHi, andnextItemvisible in tooltips, and should be treated as a local controller payload object rather than as a generic placeholder cube.
What This Means For The Renderer
- A lot of the useful information is already present without more reverse-engineering. The main problem was presentation, not raw data availability.
- Editor/helper objects often carry meaningful
mapNum,npcNum,quality, ornextItemvalues even when they are not DTABLE-backed NPC spawners. Those raw linkage values are worth exposing because they help separate placeholder geometry from logic markers. - Catalog names already identify several broad classes that deserve different handling in the UI:
- invisible walls/editor walls
- camera/helper markers
- light bridge / forcefield / editor-authored bridge surfaces
- placeholder cubes and placeholder UI markers
- auto-derived helper shapes tied to specific USECODE families like
WALLGUN
Focused Caution: Suspicious Map Objects Are Not Always Helpers
- The map-13 jump-start follow-up around the rare jump-through wall found one especially suspicious nearby placement:
fixed:4767, shape0x0135, frame0, at world47966,53598,97in the decoded retail cache. - That object looks tempting as an editor/helper candidate when viewed only from map placement, but the decoded reference data says otherwise:
0x0135isshape:309, aterrainitem with dimensions4 x 4 x 0and traitssolid,fixed, andland. - The useful classification came from USECODE rather than from the exported editor/helper buckets. In the extracted corpus, class
0x0135isFFFLOOR, an environmental hazard/controller family with livegotHit,equip, andunequipbodies. - The nearby map-13 companion object is not an editor wall flag or a hidden collision override either. The closest local trigger on the same upper platform is the family-4 egg
fixed:4770(shape 17, egg id37, subtype selectorQLo 4), which currently resolves toCHANGER, not to a direct wall-solidity helper. - Practical renderer implication: when a placement looks suspicious in map context, do not assume it belongs in the editor/helper bucket just because it sits beside editor markers.
0x0135is a good counterexample: it is a gameplay-side environmental floor tile that only becomes legible once the USECODE class is identified.
Implemented UI Enrichment
The tooltip now exposes generalized metadata for editor/helper objects instead of reserving extra detail almost entirely for NPC spawners:
Dimensions: shape dimensions from the exported shape definitionTags: exported visibility tags such aseditor,helper,egg,roof, andoobTraits: exported rendering/collision traits such asoccluding,translucent,solid,fixed, and nonzero animation typeRole hint: a cautious catalog-backed note for important helper families like invisible walls, cameras, light bridges, placeholders,WALLGUNhelper shapes,0x04D0NPC spawners, and0x024Fmonster eggsRaw linkage:map,npc,quality, andnextfields for editor/helper/egg objects so unresolved objects still expose their control data
Practical Next Targets
- Add dedicated filters or list views for helper subfamilies such as invisible walls, camera markers, light bridges, and placeholder cubes.
- Add shape-family frequency summaries so repeated helper markers can be audited across a map.
- Decode more shape-specific field semantics for the still-unresolved editor objects, especially the remaining non-promoted invisible-wall, camera/helper, music-controller, and secret-door-switch families, and keep folding any new results back into the dedicated USECODE-link note.
- Find the No Regret replacement for the Remorse
0x024Fmonster-egg workflow instead of assuming the same shape is reused.
Newly Promoted Regret-Only Controllers
0x0318is now promoted asCRUMORPH, not a blank placeholder cube. The recoveredequipbody scans nearby NPCs for a shared internal control key derived from the item'sQLo, temporarily transfers player control to the first live match, and then bracketsTRIGGER.slot_20with success or failure lanes.0x0366remainsNPC_ONLY, but the latest decompressed.cachesweep tightens its practical viewer behavior: actor-target arrows are still not justified, while cautious localNPC_ONLY -> 0x04B1same-QLoarrows are now strong enough to expose.0x04c6/0x04deare now promoted asWATCHNS/WATCHEW, not generic editor leftovers. Their recoveredslot_20bodies scan nearby0x0510posts by sharedQLoand then bracketTRIGGER.slot_20around a watcher-specific follow-up lane.0x0510is now better treated as aSECRET_DOOR_POSThelper target rather than an unresolved standalone controller. The strongest current viewer behavior is a cautious local arrow fromWATCHNS/WATCHEWplus tooltip decoding of itsQLo/QHibytes.0x05e1is closed asCRYOBOX, and nearby0x05df/0x05e0pressure-barrier faces are now promoted out of the unresolved bucket as local arrow targets keyed by sharedQLo.0x0451/0x05aeare now closed asCRAZYEW/CRAZYNS, small Regret-only hit-driven NPC wake-up relays rather than vague contextual map labels.0x056dis now closed asVIDEOBOX, a gated controller with a directequipbody, even though its higher-level gameplay meaning is still less explicit than the watcher and cryobox lanes.
Actor-Key Family Follow-Up
- The latest actor-link follow-up did not justify exporting a stable
NPC_ONLY -> actororCRUMORPH -> actoroverlay from static map/cache data alone. - Current best read is that the compared value is mutable actor field
0x63, not a DTABLE row and not a field that the current scene export already carries. - A direct Regret DTABLE row check at byte offset
0x63is not enough to rescue that idea: sampled rows still read as zero there, so the actor key is not simply a persistentNPCDatattribute that can be copied through the existing preview pipeline. - The same corpus also shows why the field is unstable:
TRIGGER.slot_29/slot_2Bcan rewrite actor field0x63on nearby matched NPCs, so the relevant actor-side link id can change after startup. - The broader family using this same hidden actor-key mechanism is now clearer though:
CRUMORPH,NPC_ONLY,WATCHNS,WATCHEW,THRMBCKN,THRMBCKE,SURCAMNS, andSURCAMEWall compare controller-local bytes against actor field0x63in one of their recovered lanes. - Practical renderer stance stays conservative: keep only the already-evidenced local helper arrows in the overlay, and surface the actor-key behavior in metadata/tooltips until a runtime or spawn-time export can close field
0x63directly.
0x04B1 now has a stable CMD_LINK -> TRIGGER.slot_20 viewer target, and 0x04E3 is already promoted as SKILLBOX::equip, so they no longer belong in the unresolved editor-object bucket here.