← 1.20 ReplayEntropic Dev

REPLAY 1.20 · RESEARCH NOTES

The asset brain

A linked map of loading, rendering, and collision evidence.

34 notes · Latest source update
SOURCE NOTE · Updated 2026-09-28 03:21:17 UTC
On this page

Engine Integration

Asset brain · GfxWorld and Brush Models · Transient Zones · CModels and Clipmaps · XModels and Surfaces · XModel Fastfile to DObj Flow

This page connects verified Replay fastfile dispatch, phase loaders, zone/pool management, and native engine consumer evidence. It is a static cross-build map, not a trace of a running game. The edges below are graded individually: a matched function name or parent call does not establish type identity, serialized schema, or runtime behavior by itself.

Build boundary

The source reference is Game-Test E:\1-game-test\1_game_test.exe (SHA-256 269D6137A465DA9D5F5DF68961000D683B9A868FDE5E7800743177C05D059E99). Replay is E:\IW8\Builds\1.20-replay\game_dx12_ship_replay.exe (SHA-256 68FB1CBCB2924182724004039DE55A4C50152BB6561803C4898B7930B38132F0). The Replay SQLite program MD5 is 1C238FE327F2ECC3B0DB924C5B425439; it identifies the database input, not the executable. The canonical database is E:\IW8\Builds\1.20-replay\game_dx12_ship_replay.exe.sqlite.

Addresses, function extents, switch cases, globals, pool IDs, element sizes, prototypes, and root fields stay tied to their own build. The source PDB is a behavior/name oracle; it does not supply the Replay ABI or disk format.

End-to-end example: GfxWorld and transient zones

The strongest current sample joins multiple independent routes. The diagram uses solid arrows for directly reported static edges and labels changed or unjoined edges explicitly.

Game-Test XAssetHeader case 0x1B
  -> Load_GfxWorldPtr -> Load_GfxWorldAsset / Load_GfxWorld
  -> Load_GfxWorldDraw
  -> 0x600 transient-zone pointers (8-byte entries)
  -> Load_GfxWorldTransientZonePtr -> Load_GfxWorldTransientZone
  -> source registration type 0x1C

Replay Load_XAssetHeader case 0x1F
  -> Load_GfxWorldPtr (ID 18189) -> Load_GfxWorldAsset (ID 24711)
  -> Load_GfxWorld (ID 18182) -> Load_GfxWorldDraw (ID 18186)
  -> 0x600 pointer entries (8-byte stride)
  -> Load_GfxWorldTransientZonePtr (ID 18191)
  -> Load_GfxWorldTransientZone (ID 18190)
  -> Replay registration type 0x20 / pool "gfx_map_trzone" / element size 0x148
  -> DB_ReleaseXAsset type-0x20 callback (ID 24649), deferred-zone release behavior

The XAssetHeader phases are named in the live Replay SQLite as Load_XAssetHeader (ID 18573, RVA 0xDBDCC0), Preload_XAssetHeader (ID 18730, RVA 0xDCBFD0), and Postload_XAssetHeader (ID 18669, RVA 0xDC65F0). Their structural crosswalks have 100 common numeric case values, but equal ordinals are not identity proof. For GfxWorld specifically, source type/case 0x1B maps to Replay type/case 0x1F: Replay's type-0x1F load arm calls ID 18189, which reaches the named asset callback and GfxWorld root. The target Load_GfxWorldAsset has matching 54-byte source/Replay extents, but its type immediate differs (0x1B vs 0x1F). Replay's q_Postload_GfxWorldPtr ID 18335 reaches q-prefixed q_Postload_GfxWorld ID 18328 on the corresponding Replay type-0x1F path. This does not equate the Postload body, type enum, or root schema across builds.

In Replay, Load_GfxWorldDraw ID 18186 points the transient-zone current-pointer context at the parent field, reserves 0x3000 bytes, then loops 0x600 pointers at stride 8 through ID 18191. ID 18191 calls ID 18190. Source PDB evidence has the same 0x600-entry / 8-byte pointer walk from Load_GfxWorldDraw through Load_GfxWorldTransientZonePtr to its root. That repeated consumer shape, together with independent pool metadata and release behavior, supports a GfxWorld transient-zone family correspondence.

Type identity and type ID are separate. Source registration uses type 0x1C; Replay's 0x1C route is a distinct tacgraph pool with a 0x18-byte root. Replay type 0x20 is named gfx_map_trzone, uses a 0x148-byte pool entry, is allocated by ID 18190, is registered by a callback passing 0x20, and has deferred-zone release behavior. A Replay helper at ID 24770 still carries the stored name Load_GfxWorldTransientZoneAsset in the separate type-0x1C route; that label must not override the type-name/size/consumer evidence. Current SQLite names for IDs 18189–18191 are unprefixed, while their linked reports retain the promotion history and the per-build extent caveats.

The table above is an integration map, not proof of one continuous runtime execution. It joins static function calls, type-table reads, pool metadata, and release dispatch findings. It does not show a live fastfile being loaded or a zone activated in-game.

Evidence: XAssetHeader phase-dispatch manifest, Replay phase-parent naming manifest, GfxWorld pointer cross-reference, GfxWorld asset callback cross-reference, GfxWorld transient-zone pointer cross-reference, GfxWorld transient-zone root cross-reference, type-1C/type-20 registration comparison, and type-20 pool-name and release-consumer audit.

Zone and stream management

Zone-name helpers operate on zone-name/load policy and are a different layer from asset-type dispatch. The live Replay database has DB_Zones_IsLocalizedZoneName ID 25000, DB_Zones_IsRegionalZoneName ID 25004, and q_DB_Zones_IsOptionalSubZone ID 25001. ID 25007 retains a signature-like stored name for DB_Zones_IsTransientZoneName; its _tr string behavior is the principal source/Replay identity anchor. The optional-subzone function has a 513-byte Replay .pdata range although its SQLite scalar size is 228; the actual string-reference instruction is owned by ID 25001. Preserve that boundary caveat.

The zone-name routines and ShouldConsiderForLoadBar caller evidence show zone naming and load-selection policy. They do not directly prove that a particular GfxWorld child pool entry is activated by a particular filename. Separately, DB_ReleaseXAsset ID 24668 dispatches a type-indexed release callback table; the type-0x20 entry selects ID 24649, whose body handles nested pointers and a deferred-zone queue. This is code-level lifetime evidence, not proof of when or whether the game invokes it in a live session.

Evidence: zone name-family audit, optional-subzone boundary and owner audit, and type-20 pool/release audit.

Load, Preload, Postload, Mark, and asset handlers

  • Load_XAssetHeader, Preload_XAssetHeader, and Postload_XAssetHeader are separate large dispatchers. Their Replay names and source PDB starts are anchored, but each child and type case must be cross-referenced per phase.
  • Pointer wrappers perform phase-specific pointer-state handling and route to root or callback functions. Keep Load pointer resolution, Preload traversal, Postload fixups, and Mark reachability as separate graph edges.
  • Asset handler labels such as DB_Create* and DB_Release* are callback/registration leads. Equal names, case values, or nearby table entries alone do not resolve a callback's asset type. Review current row, direct table slot, argument value, and full owners before relying on it.
  • Game-Test and Replay can assign different numeric IDs to the same semantic type. GfxWorld uses 0x1B in the source and 0x1F in Replay; Replay type 0x20 transient-zone metadata maps back to source type 0x1C even though Replay type 0x1C is TacGraph.

The broad handler-root scan contains proposals and holds, not an authoritative dispatch schema. In particular, its direct helper-root candidate method does not independently establish all type identities, and its generic proposals are not claims about serialized layouts. See handler root-discriminator review, handler label displacement audit, and Mark XAssetHeader candidate review.

From parsed assets to native consumers

The family pages connect selected parser outputs to code that uses or releases them:

These pages provide static code/call/table evidence. They do not claim that a converter output has passed the target's runtime loading/rendering/collision gates.

Safe implementation rules

  1. Track source PDB name/signature, source UDT, Replay row/prototype, Replay memory accesses, pool/type tables, serialized stream evidence, and runtime consumers separately.
  2. Preserve phase-specific pointer handling, stream selector, alignment, counts, strides, fixups, and callback arguments. Do not infer them from matching names.
  3. Treat any case number as local to its exact build and dispatcher. Resolve asset semantic identity through independent roots, helper bodies, pool names/sizes, registration values, and consumer edges.
  4. Keep q_ or hold status when a target boundary, competing owner, source alias, or type-index conflict remains. Preserve live SQLite size/prototype and annotate PDATA/chunk extents separately.
  5. Do not turn PDB offsets or source type sizes into Replay ABI, and do not turn a pool element size into a serialized stream size.
  6. Keep live-game loading, zone activation, rendering, and collision checks as independent validation gates; static references are not runtime proof.

Current reference examples

  • The symbol methodology and current register are linked in symbol mapping guide, three-agent session plan, and cross-reference symbol register.