2015-12-18 17:05:31 -08:00
|
|
|
[actor_spawn]: 0x80025110
|
2015-12-22 06:35:50 -08:00
|
|
|
[object_spawn]: 0x800812F0
|
2015-12-18 17:05:31 -08:00
|
|
|
[max_actor_no]: 0x1D6
|
|
|
|
|
|
|
|
[global_context]: 0x801C84A0
|
|
|
|
[buttons_offset]: 0x14
|
|
|
|
[actor_spawn_offset]: 0x1C24
|
2015-12-22 06:35:50 -08:00
|
|
|
[object_spawn_offset]: 0x117A4
|
2015-12-18 17:05:31 -08:00
|
|
|
|
|
|
|
[link_actor]: 0x801DAA30
|
|
|
|
[actor_x]: 0x24
|
|
|
|
[actor_y]: 0x28
|
|
|
|
[actor_z]: 0x2C
|
|
|
|
[actor_horiz_angle]: 0x46
|
|
|
|
|
|
|
|
[link_save]: 0x8011A5D0
|
|
|
|
[rupees_offset]: 0x34
|
|
|
|
[upgrades_offset]: 0xA0
|
|
|
|
[upgrades_2_offset]: 0xA2
|
|
|
|
|
2015-12-18 23:46:30 -08:00
|
|
|
.include "spawn.asm"
|
2015-12-22 06:35:50 -08:00
|
|
|
|
|
|
|
actor_object_table:
|
|
|
|
.include "actor object table oot.asm"
|
|
|
|
|
|
|
|
load_object:
|
|
|
|
// args: a0 (actor number)
|
|
|
|
// returns v0 (0 if ok, 1 on error)
|
|
|
|
push 4, s0, ra
|
|
|
|
li v0, 1
|
|
|
|
la t0, actor_object_table
|
|
|
|
sll t1, a0, 1
|
|
|
|
addu t0, t0, t1
|
|
|
|
lhu s0, 0(t0) // object number
|
|
|
|
beq s0, r0, load_object_return
|
|
|
|
nop
|
|
|
|
bal is_object_loaded
|
|
|
|
mov a0, s0
|
|
|
|
bne v0, r0, load_object_return
|
|
|
|
cl v0
|
|
|
|
li t8, @global_context
|
|
|
|
li t9, @object_spawn_offset
|
|
|
|
add a0, t8, t9
|
|
|
|
mov a1, s0
|
|
|
|
jal @object_spawn
|
|
|
|
nop
|
|
|
|
load_object_return:
|
|
|
|
jpop 4, s0, ra
|
|
|
|
|
|
|
|
/*
|
|
|
|
we'll be dealing with structs like
|
|
|
|
typedef struct {
|
|
|
|
uint_ptr region_start; // ?
|
|
|
|
uint_ptr region_end; // ?
|
|
|
|
byte loaded_count; // only set in first item
|
|
|
|
byte loaded_count_alt; // usually fewer than the above
|
|
|
|
uint16 unknown;
|
|
|
|
uint16 object_number;
|
|
|
|
uint16 padding;
|
|
|
|
uint_ptr start;
|
|
|
|
uint32 size;
|
|
|
|
uint32 unknowns[11]; // more pointers and sizes
|
|
|
|
} loaded_object; // total size: 68 bytes
|
|
|
|
*/
|
|
|
|
|
|
|
|
is_object_loaded:
|
|
|
|
// args: a0 (object number)
|
|
|
|
// returns v0 (1 if loaded, 0 if not)
|
|
|
|
push 4
|
|
|
|
li t8, @global_context
|
|
|
|
li t9, @object_spawn_offset
|
|
|
|
add t0, t8, t9 // current item
|
|
|
|
lb t1, 8(t0) // remaining items
|
|
|
|
li v0, 1
|
|
|
|
is_object_loaded_loop:
|
|
|
|
lh t2, 12(t0) // item's object number
|
|
|
|
beq a0, t2, is_object_loaded_return
|
|
|
|
subi t1, t1, 1 // TODO: double check there's no off-by-one error
|
|
|
|
addi t0, t0, 68
|
|
|
|
bne t1, r0, is_object_loaded_loop
|
|
|
|
nop
|
|
|
|
cl v0
|
|
|
|
is_object_loaded_return:
|
|
|
|
jpop 4
|