0x24 — character_virtual_24
Character command with one unresolved virtual call. The handler resolves a character through GetCharacterID/GetCharacterClass2, dispatches a character virtual method, and touches a character sub-manager. The vtable target still needs a dedicated trace before a higher-level label is safe.
proven— handler traced, and exercised by at least one shipped script.
At a glance
| Opcode | 0x24 (36) |
|---|---|
| Handler | CRadiScript::Command_24 |
| Signature | CRadiScript::Command_24(int,SCR_DATA*,unsigned int,unsigned int) |
| Translation unit | r_script_run2.cpp |
| Address | — debug build; click for all 3 |
| Handler size | 0x274 (628 bytes) |
| Engine name | character_virtual_24 |
| Family | Characters |
| Command size | 4 + extra_words * 4 bytes |
Handler behaviour
Character command with one unresolved virtual call. The handler resolves a character through GetCharacterID/GetCharacterClass2, dispatches a character virtual method, and touches a character sub-manager. The vtable target still needs a dedicated trace before a higher-level label is safe.
Encoding
The command header is one 32-bit word, as described in §3 Instruction encoding:
31 24 23 16 15 8 7 0
+----------------+----------------+----------------+----------------+
| flags | argument byte | extra words | 0x24 |
+----------------+----------------+----------------+----------------+Bits 8–15 give the number of 32-bit operand words that follow. Bits 16–23 are handed to the handler as a bitfield; on character commands bit 0 normally says whether a character selector word is present. Bit 31 is the keep-going bit.
Operand fields
6 documented fields. input fields are read from the command's operand words; derived fields are computed from other fields rather than stored separately.
| Field | Role | Meaning |
|---|---|---|
byte91_mode | input | Mode selector for byte91; the handler branches on it. |
character | input | The packed 32-bit character selector word. Its low half is the character id and byte 2 is a secondary class/variant input; see character_number and character_variant. |
mode | input | Handler path selector taken from the argument byte. The meaning is specific to each command. |
mode_float | input | Float parameter for mode. |
mode_float_word | input | Raw word behind mode_float, consumed by the mode path; its exact role in the virtual call is untraced. |
upper_mode | input | Mode selector for upper; the handler branches on it. |
Engine calls
Engine functions this handler was observed calling:
CCharacterManager::GetCharacterClass2(int,unsigned int,const CCharacter*,unsigned int)CCharacterManager::GetCharacterSubManager(int)CMotionSwitchData (sub-manager 0x16)CRadiScript::GetCharacterID(unsigned int&,unsigned int&,unsigned int*,SCR_DATA*,unsigned int)
Bit masks
Masks the handler applies to its argument byte or operand words:
0x0001 0x0003 0x0004