Crusader_Decomp/docs/usecode-event-slots-combine-cast-fast-area.md
2026-04-07 17:16:44 +02:00

5.1 KiB

combine, cast, and fast area in Crusader usecode

This note checks whether the suspicious inherited event labels combine (slot 0x0C) and cast (slot 0x11) are actually used by shipped Crusader usecode, and tightens the current explanation for enterFastArea / leaveFastArea.

Summary

  • combine survives in the inherited event vocabulary, but current shipped Crusader exports do not show any recovered slot_0C handler bodies.
  • cast is used in Crusader, but the live behaviors look like explicit scripted activation/dispatch lanes, not a classic RPG spell system.
  • fast area in Crusader is best read as an authored proximity/trigger region around an object or controller. Entering or leaving that region fires usecode callbacks.

Evidence Scope

Primary evidence for this note comes from the generated pseudocode exports in Crusader-Map-Viewer/map_renderer/site/data/usecode/*, the local crusader-disasm corpus, and existing Crusader notes on trigger/controller families.

combine (slot 0x0C)

What is actually present

  • The inherited Crusader/U8 event table still names event C as combine.
  • Current generated usecode exports show zero slot_0C_combine.txt files in these shipped corpora:
    • remorse
    • remorse-101
    • remorse-demo
    • regret
  • The same exported pseudocode search also found zero .combine( callsites.
  • The disasm corpus still exposes a separate item helper named Item::I_setQAndCombine(Item *, int16 q).
  • In the local MISS1EGG disassembly, that helper is called immediately after item creation to stamp item state before the created item is positioned and added to inventory.
  • That is evidence that Crusader still retained some item-side combine-related helper semantics in native/intrinsic code, but it is not evidence of a shipped usecode slot 0x0C event body.

Best current read

combine should stay treated as a historical or compatibility label in the decompiler, not as a confirmed active Crusader event family. The name likely came forward from the inherited Ultima-style event vocabulary, while the shipped Crusader usecode corpus no longer exposes recovered slot-0x0C handlers.

cast (slot 0x11)

No Remorse usage

  • In the No Remorse exported corpora, slot_11_cast.txt appears exactly once per build variant examined:
    • remorse: AVATAR/slot_11_cast.txt
    • remorse-101: AVATAR/slot_11_cast.txt
    • remorse-demo: AVATAR/slot_11_cast.txt
  • AVATAR::cachein directly spawns AVATAR.cast(0, arg_06).
  • The recovered AVATAR::cast body does not look like spellcasting. It:
    • excludes the process
    • waits 10 ticks
    • reads the avatar map id
    • selects a music track based on odd-numbered map ids (1, 3, 5, ... 29)

Regret usage

  • Regret exposes a wider slot_11_cast set: CARD_EW, CARD_NS, CONT_FL, CRUSADER, KEYPADEW, KEYPADNS, SECUREW, and SECURNS.
  • Representative Regret cast bodies such as CARD_NS::cast and KEYPADNS::cast behave like controller/trigger activators:
    • create a local sprite effect
    • play SFX
    • wait/suspend through helper slots
    • dispatch into TRIGGER.slot_20

Best current read

In Crusader, cast is a real event slot, but the live evidence does not support reading it as a general magic or spell lane. The stronger read is explicit scripted activation/dispatch callback, with behavior chosen per class:

  • No Remorse AVATAR.cast is a delayed map-music dispatch hook.
  • Regret CARD_* / KEYPAD* cast is a controller activation path that fans out into trigger logic.

enterFastArea / leaveFastArea

What the current evidence rules out

  • The Crusader evidence does not fit a fast movement zone or generic speed-boost interpretation.

What the current evidence supports

  • MONSTER::enterFastArea is the verified automatic activation lane for frame-0 0x04D0 NPC spawners.
  • TIMER::enterFastArea / leaveFastArea only arm a worker lane; the real delayed work happens later in TIMER.slot_20.
  • SPECIAL::enterFastArea / leaveFastArea use their entry/exit callbacks as phase/control inputs rather than as locomotion modifiers.
  • BRO_BOOT::enterFastArea and related controller families use the same event pair as proximity-trigger hooks for nearby scripted behavior.

Best current read

A fast area in Crusader is best described as an authored proximity/activation region associated with an item or controller class. When an actor crosses into or out of that region, the corresponding usecode slot fires so the object can arm, disarm, spawn, gate, or route scripted behavior.

That explanation fits the current environmental/controller families much better than movement speed area, and it matches the existing evidence for spawners, timers, specials, boots, cameras, and other trigger-like objects.

Practical naming guidance

  • Keep combine as a compatibility/historical hint only.
  • Keep cast as the slot label for compatibility, but document it as a scripted activation/dispatch hook in Crusader.
  • Prefer proximity/activation region when explaining enterFastArea / leaveFastArea.