Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

NameOffsetTagWidth
address0x0x4
next0x0O4
list0x4O4
parent0x8O4
linked0xcO4
grid0x10d4
id0x14w2
name0x16A4
ftype0x1ab1
sflags0x1bb1
runtime_local_list0x1cD4
runtime_locals0xc1b1
extra0x21D4
object_data0x25o156
static_data0xc1b1
loaded_matrix0xc2b1
data0xc3B4
header0xc7B4
pos.vx0xcbd4
pos.vy0xcfd4
pos.vz0xd3d4
slave_pos.vx0xd7d4
slave_pos.vy0xdbd4
slave_pos.vz0xdfd4
last_slave_pos.vx0xe3d4
last_slave_pos.vy0xe7d4
last_slave_pos.vz0xebd4
start_pos.vx0xefd4
start_pos.vy0xf3d4
start_pos.vz0xf7d4
last_pos.vx0xfbd4
last_pos.vy0xffd4
last_pos.vz0x103d4
last_valid_flag0x107b1
last_valid_pos.vx0x108d4
last_valid_pos.vy0x10cd4
last_valid_pos.vz0x110d4
angle.vx0x120d4
angle.vy0x124d4
angle.vz0x128d4
slave_angle.vx0x12cd4
slave_angle.vy0x130d4
slave_angle.vz0x134d4
last_slave_angle.vx0x138d4
last_slave_angle.vy0x13cd4
last_slave_angle.vz0x140d4
start_angle.vx0x144d4
start_angle.vy0x148d4
start_angle.vz0x14cd4
last_angle.vx0x150d4
last_angle.vy0x154d4
last_angle.vz0x158d4
move.vx0x15cd4
move.vy0x160d4
move.vz0x164d4
ov.vx0x168d4
ov.vy0x16cd4
ov.vz0x170d4
size0x174Z4
location0x1a5D4
yangle_change0x1a9w2
rope0x1abR4
rope_id0x1afb1
rope_wait0x1b0b1
slide_flag0x1b1b1
fall_flag0x1b2b1
jump_flag0x1b3b1
extra_flag0x1b4b1
extra_time0x1b5b1
action_flag0x1b6d4
action0x1bad4
action_time0x1beb1
arms_time0x1bfb1
jump_time0x1c0b1
jump_height0x1c1b1
origin0x1c2d4
origin_time0x1c6b1
origin_accum0x1c7d4
last_direction0x1cbb1
move_counter0x1ccb1
last_collide0x1cdb1
last_collide_count0x1d1b1
under_object0x1d4O4
under_surface0x1dcb1
surface_time0x1ddb1
ai_type0x1deb1
ai_mode0x1dfb1
ai_delay0x1e0b1
ai_var10x1e1w2
ai_var20x1e3w2
ai_length0x1e5d4
node_map0x1e9N4
node0x1edd4
dnode0x1f1d4
fdnode0x1f9d4
weapon_drawn0x1fdb1
torch_timer0x1feb1
hand_item0x200b1
hand_pos.vx0x201d4
hand_pos.vy0x205d4
hand_pos.vz0x209d4
hand_angle.vx0x20dd4
hand_angle.vy0x211d4
hand_angle.vz0x215d4
grip[0]0x219w2
grip[1]0x21bw2
scabbard[0]0x21dw2
scabbard[1]0x21fw2
sphere_object0x221S4
fsphere_heap0x229D4
fspheres0x22dw2
active0x237b1
hide0x238b1
dead0x239b1
invisible0x23ab1
combat0x23bC4
light0x23fL4
flat0x243F4
anim0x247M4
anim_list0x24bW4
frame0x24fw2
handle0x251w2
last_frame0x253w2
last_handle0x255w2
panic_group0x257w2
message_index0x259b1
broadcast_index0x25ab1
anchor0x25bb1
hook_data0x25cB4
script_data0x260B4
script_int0x264B4
script_pc0x268B4
script_return0x26cB4
script_rv0x270b1
script_ret_rv0x271b1
attribute0x272B4
local_index0x276d4
string_index0x27ad4
disable_script0x27eb1
task[0]0x27fB4
task[1]0x283B4
task[2]0x287B4
task[3]0x28bB4
task[4]0x28fB4
task[5]0x293B4
task_variable[0]0x297d4
task_variable[1]0x29bd4
task_variable[2]0x29fd4
task_variable[3]0x2a3d4
task_variable[4]0x2a7d4
task_variable[5]0x2abd4
task_status[0]0x2afb1
task_status[1]0x2b0b1
task_status[2]0x2b1b1
task_status[3]0x2b2b1
task_status[4]0x2b3b1
task_status[5]0x2b4b1
task_pause[0]0x2b5b1
task_pause[1]0x2b6b1
task_pause[2]0x2b7b1
task_pause[3]0x2b8b1
task_pause[4]0x2b9b1
task_pause[5]0x2bab1
task_timer[0]0x2bbw2
task_timer[1]0x2bdw2
task_timer[2]0x2bfw2
task_timer[3]0x2c1w2
task_timer[4]0x2c3w2
task_timer[5]0x2c5w2
task_variable2[0]0x2c7d4
task_variable2[1]0x2cbd4
task_variable2[2]0x2cfd4
task_variable2[3]0x2d3d4
task_variable2[4]0x2d7d4
task_variable2[5]0x2dbd4
task_variable3[0]0x2dfd4
task_variable3[1]0x2e3d4
task_variable3[2]0x2e7d4
task_variable3[3]0x2ebd4
task_variable3[4]0x2efd4
task_variable3[5]0x2f3d4
task_variable4[0]0x2f7d4
task_variable4[1]0x2fbd4
task_variable4[2]0x2ffd4
task_variable4[3]0x303d4
task_variable4[4]0x307d4
task_variable4[5]0x30bd4
anim.address0x0M4
anim.current0x0M2
anim.next0x2M2
anim.next_speed0x4M1
anim.frame0x5M2
anim.speed0x7M1
anim.speed_count0x8M1
anim.stop_flag0xaM1
anim.halt_flag0xbM1
anim.hold_flag0xcM1
anim.rep_count0xdM1
anim.rewind_flag0xeM1
anim.loop_count0xfM1
anim.sound_handle0x10M1
anim.real_frame0x11M1
anim.max_group0x12M1
anim.pos.vx0x13M2
anim.pos.vy0x15M2
anim.pos.vz0x17M2
anim.angle.vx0x19M2
anim.angle.vy0x1bM2
anim.angle.vz0x1dM2
anim.last_angle.vx0x1fM2
anim.last_angle.vy0x21M2
anim.last_angle.vz0x23M2
size.address0x0Z4
size.orientation0x0Z1
size.size.vx0x1Z4
size.size.vy0x5Z4
size.size.vz0x9Z4
size.pos.vx0xdZ4
size.pos.vy0x11Z4
size.pos.vz0x15Z4
size.psize.vx0x19Z4
size.psize.vy0x1dZ4
size.psize.vz0x21Z4
size.msize.vx0x25Z4
size.msize.vy0x29Z4
size.msize.vz0x2dZ4