- Introduced new file `vm_mask_ladder.tsv` containing detailed mappings for Crusader USECODE VM masks and their associated descriptors. - Added comprehensive documentation in `scummvm-crusader-reference.md` outlining the structure, findings, and implications for reverse-engineering the Crusader engine within ScummVM. - Created `usecode-roundtrip-ir.md` to document the plan for converting Crusader USECODE bytes into a human-readable format, detailing the container layout, event names, and intrinsic tables. - Implemented a PowerShell script `temp_usecode_sample.ps1` for extracting and analyzing USECODE data from the Crusader FLX files, providing insights into class and event structures.
9.3 KiB
9.3 KiB
| 1 | template_id | section | center_index | center_label | attach_labels | callback_labels | neighbor_labels | event_families | runtime_ops | mask_pairs | owner_source | mirror_write | selector_status | bridge_note |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | jelyhack_anchor_attachment | JELYHACK anchor lane | 277 | JELYHACK | REE_BOOT,SFXTRIG | SURCAMNS,SURCAMEW | BASEGUN,TIMER,SPECIAL,TRIGPAD,MONSTER,ELITE,D_ESTORM,DATALINK,SLIDEFLR,JELYH2,HOFFMAN,D_HOFFMA | callback-eventtrigger,boot-event-core,minimal-event-core | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | indirect-only active-event-biased ladder; no direct anchor-specific mask proven | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Referent-only anchors are now readable as payload owners, but the current mask ladder still correlates more strongly with active-event descriptors than with anchor-only rows. |
| 3 | jelyhack_anchor_attachment | JELYHACK anchor lane | 280 | JELYH2 | REE_BOOT,SFXTRIG | SURCAMEW | SPECIAL,TRIGPAD,MONSTER,ELITE,D_ESTORM,JELYHACK,DATALINK,SLIDEFLR,HOFFMAN,D_HOFFMA,SKILLBOX,D_GURDSQ,VETRON | boot-event-core,callback-eventtrigger,minimal-event-core | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | indirect-only active-event-biased ladder; no direct anchor-specific mask proven | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Referent-only anchors are now readable as payload owners, but the current mask ladder still correlates more strongly with active-event descriptors than with anchor-only rows. |
| 4 | event_hub_cluster | EVENT hub lane | 189 | COR_BOOT | EVENT,NPCTRIG | GRENADE,SCIENTIS,ROLL_NS,REB_COUP,MEDIKIT,K,CRUZTRIG,NPC_ONLY | event-hub,npc-trigger | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | This is the strongest current descriptor-side bridge into the active event runtime lane: the neighborhood contains explicit event cores and matches the proven payload-chain plus link-matrix VM behavior. | |
| 5 | event_hub_cluster | EVENT hub lane | 190 | EVENT | COR_BOOT,NPCTRIG | SCIENTIS,ROLL_NS,REB_COUP,MEDIKIT,K,CRUZTRIG,NPC_ONLY,VMAIL | boot-event-core,npc-trigger | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | This is the strongest current descriptor-side bridge into the active event runtime lane: the neighborhood contains explicit event cores and matches the proven payload-chain plus link-matrix VM behavior. | |
| 6 | event_hub_cluster | EVENT hub lane | 191 | NPCTRIG | COR_BOOT,EVENT | ROLL_NS,REB_COUP,MEDIKIT,K,CRUZTRIG,NPC_ONLY,VMAIL,STORMTRO | boot-event-core,event-hub | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | This is the strongest current descriptor-side bridge into the active event runtime lane: the neighborhood contains explicit event cores and matches the proven payload-chain plus link-matrix VM behavior. | |
| 7 | environmental_event_cluster | Environmental event lane | 229 | FLAMEBOX | WVENTNS,WVENTEW,REBEL_TV,SDOOR_N,SDOOR_E,EBRIDGE2,MCRATE,COPY_EW,COPY_NS | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Environmental descriptors share the same active event field grammar, so they likely ride the same generic VM event lane even though no hazard-specific opcode split is proven yet. | |||
| 8 | environmental_event_cluster | Environmental event lane | 237 | NOSTRIL | COPY_EW,COPY_NS,FLAME1,REB_PAD,VARDESK,BLASER1,REB_BOOT,UPPLATE,KEYPADNS | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Environmental descriptors share the same active event field grammar, so they likely ride the same generic VM event lane even though no hazard-specific opcode split is proven yet. | |||
| 9 | environmental_event_cluster | Environmental event lane | 296 | STEAMBOX | BOUNCBOX,HOVER1,STEAM1,FADE,PHIR,FLAME2,STEAM2,FLAMELP,BBOX,GBOX_NS | APPEND_UNIQUE_INLINE,APPEND_UNIQUE_INDIRECT,REMOVE_MATCHING_INDIRECT,REMOVE_MATCHING_INLINE,MATERIALIZE_OR_FORWARD_VALUE,PREPEND_INLINE_PAYLOAD,BUILD_ENTITY_LINK_MATRIX,EMIT_OR_PUSHBACK_RESULT,FINALIZE_MIXED_VALUE_TO_OUTPTR | 0x0001:0000,0x0002:0001,0x0004:0002,0x0010:0004,0x0020:0005,0x0200:0009,0x0400:000a,0x0800:000b,0x1000:000c,0x2000:0015,0x4000:000e,0x8000:0007,0x8000:000f | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Environmental descriptors share the same active event field grammar, so they likely ride the same generic VM event lane even though no hazard-specific opcode split is proven yet. | |||
| 10 | callback_trigger_cluster | Callback trigger lane | 269 | SURCAMNS | D_SOLD,D_VARG,D_COUR,D_SUSAN,D_THERM,BASEGUN,TIMER,SPECIAL,TRIGPAD,MONSTER | MATERIALIZE_OR_FORWARD_VALUE,PUSH_FRAME_WORD_LITERAL,COMPARE_STREAM_DWORD_AND_PUSH_BOOL,FINALIZE_MIXED_VALUE_TO_OUTPTR | no callback-specific mask pair proven; current ladder favors active event carriers | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Callback/eventTrigger descriptors are structurally distinct from the active event lane, so the runtime bridge is still generic slot-backed context flow rather than a callback-specific opcode family. | |||
| 11 | callback_trigger_cluster | Callback trigger lane | 284 | SURCAMEW | REE_BOOT,SFXTRIG | SLIDEFLR,JELYH2,HOFFMAN,D_HOFFMA,SKILLBOX,D_GURDSQ,VETRON,DEATHBOX | boot-event-core,minimal-event-core | MATERIALIZE_OR_FORWARD_VALUE,PUSH_FRAME_WORD_LITERAL,COMPARE_STREAM_DWORD_AND_PUSH_BOOL,FINALIZE_MIXED_VALUE_TO_OUTPTR | no callback-specific mask pair proven; current ladder favors active event carriers | 000d:44df -> 000d:4c99 -> 000d:7000 -> (+0x10/+0x12) + 0x0d*slot + 4 | entity_vm_context_create_from_slot_index writes the same source pair to 0x39ca[context_slot] | 0x19/0x1a/0x1b proven in 000d:0988; 0x18 implied; upstream [BP-0x32] seed unresolved | Callback/eventTrigger descriptors are structurally distinct from the active event lane, so the runtime bridge is still generic slot-backed context flow rather than a callback-specific opcode family. |