SOUP property descriptors
Script property operands (Object.name, for example Player.hide or Me.pos.vx) are resolved through an engine descriptor table. Each descriptor names one property and gives the byte offset of its field and the field’s width. The [refs] names of SOUP386.DEF select descriptors by name, case-insensitively.
The table has 226 descriptors in the order below. Offsets are hexadecimal byte offsets from the start of the actor record. The tag column is the descriptor’s type letter: b, w and d are one-, two- and four-byte values. An uppercase tag (or x, o, A) marks a field that holds a pointer to, or the body of, a sub-record. The dotted names that follow such an entry (anim.*, size.*) address fields inside that sub-record, and their offsets are relative to the sub-record rather than the actor.
Several descriptors name state that other documents describe by function: fall_flag is the falling-state byte, extra_flag the living-state byte, torch_timer the burning-torch byte, id the low-word runtime identifier, attribute the pointer to the 256-byte attribute table, origin the retained fall origin Y, under_surface the support surface code, and pos.vx, pos.vy and pos.vz the local Q8 position. grip[0], grip[1], scabbard[0] and scabbard[1] are the four signed words the loader copies from RAEX before attachment queries.
| Name | Offset | Tag | Width |
|---|---|---|---|
address | 0x0 | x | 4 |
next | 0x0 | O | 4 |
list | 0x4 | O | 4 |
parent | 0x8 | O | 4 |
linked | 0xc | O | 4 |
grid | 0x10 | d | 4 |
id | 0x14 | w | 2 |
name | 0x16 | A | 4 |
ftype | 0x1a | b | 1 |
sflags | 0x1b | b | 1 |
runtime_local_list | 0x1c | D | 4 |
runtime_locals | 0xc1 | b | 1 |
extra | 0x21 | D | 4 |
object_data | 0x25 | o | 156 |
static_data | 0xc1 | b | 1 |
loaded_matrix | 0xc2 | b | 1 |
data | 0xc3 | B | 4 |
header | 0xc7 | B | 4 |
pos.vx | 0xcb | d | 4 |
pos.vy | 0xcf | d | 4 |
pos.vz | 0xd3 | d | 4 |
slave_pos.vx | 0xd7 | d | 4 |
slave_pos.vy | 0xdb | d | 4 |
slave_pos.vz | 0xdf | d | 4 |
last_slave_pos.vx | 0xe3 | d | 4 |
last_slave_pos.vy | 0xe7 | d | 4 |
last_slave_pos.vz | 0xeb | d | 4 |
start_pos.vx | 0xef | d | 4 |
start_pos.vy | 0xf3 | d | 4 |
start_pos.vz | 0xf7 | d | 4 |
last_pos.vx | 0xfb | d | 4 |
last_pos.vy | 0xff | d | 4 |
last_pos.vz | 0x103 | d | 4 |
last_valid_flag | 0x107 | b | 1 |
last_valid_pos.vx | 0x108 | d | 4 |
last_valid_pos.vy | 0x10c | d | 4 |
last_valid_pos.vz | 0x110 | d | 4 |
angle.vx | 0x120 | d | 4 |
angle.vy | 0x124 | d | 4 |
angle.vz | 0x128 | d | 4 |
slave_angle.vx | 0x12c | d | 4 |
slave_angle.vy | 0x130 | d | 4 |
slave_angle.vz | 0x134 | d | 4 |
last_slave_angle.vx | 0x138 | d | 4 |
last_slave_angle.vy | 0x13c | d | 4 |
last_slave_angle.vz | 0x140 | d | 4 |
start_angle.vx | 0x144 | d | 4 |
start_angle.vy | 0x148 | d | 4 |
start_angle.vz | 0x14c | d | 4 |
last_angle.vx | 0x150 | d | 4 |
last_angle.vy | 0x154 | d | 4 |
last_angle.vz | 0x158 | d | 4 |
move.vx | 0x15c | d | 4 |
move.vy | 0x160 | d | 4 |
move.vz | 0x164 | d | 4 |
ov.vx | 0x168 | d | 4 |
ov.vy | 0x16c | d | 4 |
ov.vz | 0x170 | d | 4 |
size | 0x174 | Z | 4 |
location | 0x1a5 | D | 4 |
yangle_change | 0x1a9 | w | 2 |
rope | 0x1ab | R | 4 |
rope_id | 0x1af | b | 1 |
rope_wait | 0x1b0 | b | 1 |
slide_flag | 0x1b1 | b | 1 |
fall_flag | 0x1b2 | b | 1 |
jump_flag | 0x1b3 | b | 1 |
extra_flag | 0x1b4 | b | 1 |
extra_time | 0x1b5 | b | 1 |
action_flag | 0x1b6 | d | 4 |
action | 0x1ba | d | 4 |
action_time | 0x1be | b | 1 |
arms_time | 0x1bf | b | 1 |
jump_time | 0x1c0 | b | 1 |
jump_height | 0x1c1 | b | 1 |
origin | 0x1c2 | d | 4 |
origin_time | 0x1c6 | b | 1 |
origin_accum | 0x1c7 | d | 4 |
last_direction | 0x1cb | b | 1 |
move_counter | 0x1cc | b | 1 |
last_collide | 0x1cd | b | 1 |
last_collide_count | 0x1d1 | b | 1 |
under_object | 0x1d4 | O | 4 |
under_surface | 0x1dc | b | 1 |
surface_time | 0x1dd | b | 1 |
ai_type | 0x1de | b | 1 |
ai_mode | 0x1df | b | 1 |
ai_delay | 0x1e0 | b | 1 |
ai_var1 | 0x1e1 | w | 2 |
ai_var2 | 0x1e3 | w | 2 |
ai_length | 0x1e5 | d | 4 |
node_map | 0x1e9 | N | 4 |
node | 0x1ed | d | 4 |
dnode | 0x1f1 | d | 4 |
fdnode | 0x1f9 | d | 4 |
weapon_drawn | 0x1fd | b | 1 |
torch_timer | 0x1fe | b | 1 |
hand_item | 0x200 | b | 1 |
hand_pos.vx | 0x201 | d | 4 |
hand_pos.vy | 0x205 | d | 4 |
hand_pos.vz | 0x209 | d | 4 |
hand_angle.vx | 0x20d | d | 4 |
hand_angle.vy | 0x211 | d | 4 |
hand_angle.vz | 0x215 | d | 4 |
grip[0] | 0x219 | w | 2 |
grip[1] | 0x21b | w | 2 |
scabbard[0] | 0x21d | w | 2 |
scabbard[1] | 0x21f | w | 2 |
sphere_object | 0x221 | S | 4 |
fsphere_heap | 0x229 | D | 4 |
fspheres | 0x22d | w | 2 |
active | 0x237 | b | 1 |
hide | 0x238 | b | 1 |
dead | 0x239 | b | 1 |
invisible | 0x23a | b | 1 |
combat | 0x23b | C | 4 |
light | 0x23f | L | 4 |
flat | 0x243 | F | 4 |
anim | 0x247 | M | 4 |
anim_list | 0x24b | W | 4 |
frame | 0x24f | w | 2 |
handle | 0x251 | w | 2 |
last_frame | 0x253 | w | 2 |
last_handle | 0x255 | w | 2 |
panic_group | 0x257 | w | 2 |
message_index | 0x259 | b | 1 |
broadcast_index | 0x25a | b | 1 |
anchor | 0x25b | b | 1 |
hook_data | 0x25c | B | 4 |
script_data | 0x260 | B | 4 |
script_int | 0x264 | B | 4 |
script_pc | 0x268 | B | 4 |
script_return | 0x26c | B | 4 |
script_rv | 0x270 | b | 1 |
script_ret_rv | 0x271 | b | 1 |
attribute | 0x272 | B | 4 |
local_index | 0x276 | d | 4 |
string_index | 0x27a | d | 4 |
disable_script | 0x27e | b | 1 |
task[0] | 0x27f | B | 4 |
task[1] | 0x283 | B | 4 |
task[2] | 0x287 | B | 4 |
task[3] | 0x28b | B | 4 |
task[4] | 0x28f | B | 4 |
task[5] | 0x293 | B | 4 |
task_variable[0] | 0x297 | d | 4 |
task_variable[1] | 0x29b | d | 4 |
task_variable[2] | 0x29f | d | 4 |
task_variable[3] | 0x2a3 | d | 4 |
task_variable[4] | 0x2a7 | d | 4 |
task_variable[5] | 0x2ab | d | 4 |
task_status[0] | 0x2af | b | 1 |
task_status[1] | 0x2b0 | b | 1 |
task_status[2] | 0x2b1 | b | 1 |
task_status[3] | 0x2b2 | b | 1 |
task_status[4] | 0x2b3 | b | 1 |
task_status[5] | 0x2b4 | b | 1 |
task_pause[0] | 0x2b5 | b | 1 |
task_pause[1] | 0x2b6 | b | 1 |
task_pause[2] | 0x2b7 | b | 1 |
task_pause[3] | 0x2b8 | b | 1 |
task_pause[4] | 0x2b9 | b | 1 |
task_pause[5] | 0x2ba | b | 1 |
task_timer[0] | 0x2bb | w | 2 |
task_timer[1] | 0x2bd | w | 2 |
task_timer[2] | 0x2bf | w | 2 |
task_timer[3] | 0x2c1 | w | 2 |
task_timer[4] | 0x2c3 | w | 2 |
task_timer[5] | 0x2c5 | w | 2 |
task_variable2[0] | 0x2c7 | d | 4 |
task_variable2[1] | 0x2cb | d | 4 |
task_variable2[2] | 0x2cf | d | 4 |
task_variable2[3] | 0x2d3 | d | 4 |
task_variable2[4] | 0x2d7 | d | 4 |
task_variable2[5] | 0x2db | d | 4 |
task_variable3[0] | 0x2df | d | 4 |
task_variable3[1] | 0x2e3 | d | 4 |
task_variable3[2] | 0x2e7 | d | 4 |
task_variable3[3] | 0x2eb | d | 4 |
task_variable3[4] | 0x2ef | d | 4 |
task_variable3[5] | 0x2f3 | d | 4 |
task_variable4[0] | 0x2f7 | d | 4 |
task_variable4[1] | 0x2fb | d | 4 |
task_variable4[2] | 0x2ff | d | 4 |
task_variable4[3] | 0x303 | d | 4 |
task_variable4[4] | 0x307 | d | 4 |
task_variable4[5] | 0x30b | d | 4 |
anim.address | 0x0 | M | 4 |
anim.current | 0x0 | M | 2 |
anim.next | 0x2 | M | 2 |
anim.next_speed | 0x4 | M | 1 |
anim.frame | 0x5 | M | 2 |
anim.speed | 0x7 | M | 1 |
anim.speed_count | 0x8 | M | 1 |
anim.stop_flag | 0xa | M | 1 |
anim.halt_flag | 0xb | M | 1 |
anim.hold_flag | 0xc | M | 1 |
anim.rep_count | 0xd | M | 1 |
anim.rewind_flag | 0xe | M | 1 |
anim.loop_count | 0xf | M | 1 |
anim.sound_handle | 0x10 | M | 1 |
anim.real_frame | 0x11 | M | 1 |
anim.max_group | 0x12 | M | 1 |
anim.pos.vx | 0x13 | M | 2 |
anim.pos.vy | 0x15 | M | 2 |
anim.pos.vz | 0x17 | M | 2 |
anim.angle.vx | 0x19 | M | 2 |
anim.angle.vy | 0x1b | M | 2 |
anim.angle.vz | 0x1d | M | 2 |
anim.last_angle.vx | 0x1f | M | 2 |
anim.last_angle.vy | 0x21 | M | 2 |
anim.last_angle.vz | 0x23 | M | 2 |
size.address | 0x0 | Z | 4 |
size.orientation | 0x0 | Z | 1 |
size.size.vx | 0x1 | Z | 4 |
size.size.vy | 0x5 | Z | 4 |
size.size.vz | 0x9 | Z | 4 |
size.pos.vx | 0xd | Z | 4 |
size.pos.vy | 0x11 | Z | 4 |
size.pos.vz | 0x15 | Z | 4 |
size.psize.vx | 0x19 | Z | 4 |
size.psize.vy | 0x1d | Z | 4 |
size.psize.vz | 0x21 | Z | 4 |
size.msize.vx | 0x25 | Z | 4 |
size.msize.vy | 0x29 | Z | 4 |
size.msize.vz | 0x2d | Z | 4 |