diff --git a/src/game/chr/chr.c b/src/game/chr/chr.c index f915d0293..62cda753f 100644 --- a/src/game/chr/chr.c +++ b/src/game/chr/chr.c @@ -48250,7 +48250,7 @@ f32 chrGetDistanceToPad(struct chrdata *chr, s32 pad_id) pad_id = chrResolvePadId(chr, pad_id); if (pad_id >= 0) { - padUnpack(pad_id, 2, &pad); + padUnpack(pad_id, PADFIELD_POS, &pad); xdiff = pad.pos.x - prop->pos.x; ydiff = pad.pos.y - prop->pos.y; zdiff = pad.pos.z - prop->pos.z; @@ -48324,7 +48324,7 @@ glabel chrGetSameFloorDistanceToPad // f32 ret; // // pad_id = chrResolvePadId(chr, pad_id); -// padUnpack(pad_id, 2, &pad); +// padUnpack(pad_id, PADFIELD_POS, &pad); // xdiff = pad.pos.x - prop->pos.x; // ydiff = pad.pos.y - prop->pos.y; // zdiff = pad.pos.z - prop->pos.z; @@ -48370,7 +48370,7 @@ f32 chrGetLateralDistanceToPad(struct chrdata *chr, s32 pad_id) pad_id = chrResolvePadId(chr, pad_id); if (pad_id >= 0) { - padUnpack(pad_id, 2, &pad); + padUnpack(pad_id, PADFIELD_POS, &pad); xdiff = pad.pos.x - prop->pos.x; zdiff = pad.pos.z - prop->pos.z; distance = sqrtf(xdiff * xdiff + zdiff * zdiff); @@ -48407,7 +48407,7 @@ s32 chrGetPadRoom(struct chrdata *chr, s32 pad_id) s32 resolved_pad_id = chrResolvePadId(chr, pad_id - 10000); if (resolved_pad_id >= 0) { - padUnpack(resolved_pad_id, 0x40, &pad); + padUnpack(resolved_pad_id, PADFIELD_ROOM, &pad); ret = pad.room; } } else { @@ -48949,7 +48949,7 @@ f32 chrGetDistanceFromTargetToPad(struct chrdata *chr, s32 pad_id) pad_id = chrResolvePadId(chr, pad_id); if (pad_id >= 0) { - padUnpack(pad_id, 2, &pad); + padUnpack(pad_id, PADFIELD_POS, &pad); xdiff = pad.pos.x - prop->pos.x; ydiff = pad.pos.y - prop->pos.y; zdiff = pad.pos.z - prop->pos.z; @@ -50535,7 +50535,7 @@ bool chrSpawnAtPad(struct chrdata *basechr, s32 body, s32 head, s32 pad_id, u8 * struct pad pad; s16 room[2]; f32 fvalue; - padUnpack(resolved_pad_id, 0x46, &pad); + padUnpack(resolved_pad_id, PADFIELD_POS | PADFIELD_LOOK | PADFIELD_ROOM, &pad); fvalue = func0f096750(pad.look.x, pad.look.z); room[0] = pad.room; room[1] = -1; diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index d8eb7de09..21f2b203e 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -12462,7 +12462,7 @@ glabel aiIfObjectDistanceToPadLessThan // pad_id = chrResolvePadId(g_Vars.chrdata, pad_id); // // if (pad_id >= 0) { -// padUnpack(pad_id, 2, &pad); +// padUnpack(pad_id, PADFIELD_POS, &pad); // xdiff = obj->prop->pos.x - pad.pos.x; // ydiff = obj->prop->pos.y - pad.pos.y; // zdiff = obj->prop->pos.z - pad.pos.z; diff --git a/src/game/game_0125a0.c b/src/game/game_0125a0.c index 39a8dc15f..9fdff0f56 100644 --- a/src/game/game_0125a0.c +++ b/src/game/game_0125a0.c @@ -356,8 +356,8 @@ glabel func0f012aa0 /* f012aac: 26b5d030 */ addiu $s5,$s5,%lo(g_StageSetup) /* f012ab0: 8ea2001c */ lw $v0,0x1c($s5) /* f012ab4: 3c04800a */ lui $a0,%hi(var800a2350) -/* f012ab8: 3c07800a */ lui $a3,%hi(var800a2354) -/* f012abc: 24e72354 */ addiu $a3,$a3,%lo(var800a2354) +/* f012ab8: 3c07800a */ lui $a3,%hi(g_PadOffsets) +/* f012abc: 24e72354 */ addiu $a3,$a3,%lo(g_PadOffsets) /* f012ac0: 24842350 */ addiu $a0,$a0,%lo(var800a2350) /* f012ac4: 244e0014 */ addiu $t6,$v0,0x14 /* f012ac8: afbf004c */ sw $ra,0x4c($sp) @@ -385,8 +385,8 @@ glabel func0f012aa0 /* f012b20: 27b60090 */ addiu $s6,$sp,0x90 /* f012b24: 27b300c8 */ addiu $s3,$sp,0xc8 .L0f012b28: -/* f012b28: 3c07800a */ lui $a3,%hi(var800a2354) -/* f012b2c: 24e72354 */ addiu $a3,$a3,%lo(var800a2354) +/* f012b28: 3c07800a */ lui $a3,%hi(g_PadOffsets) +/* f012b2c: 24e72354 */ addiu $a3,$a3,%lo(g_PadOffsets) /* f012b30: 8cef0000 */ lw $t7,0x0($a3) /* f012b34: 8eb9001c */ lw $t9,0x1c($s5) /* f012b38: 02402025 */ or $a0,$s2,$zero diff --git a/src/game/game_066310.c b/src/game/game_066310.c index c765ec216..2b55a5d7a 100644 --- a/src/game/game_066310.c +++ b/src/game/game_066310.c @@ -13536,7 +13536,7 @@ void liftActivate(struct prop *prop, u8 liftnum) struct prop *liftFindByPad(s16 padnum) { struct pad pad; - padUnpack(padnum, 0x100, &pad); + padUnpack(padnum, PADFIELD_LIFT, &pad); if (pad.liftnum <= 0 || pad.liftnum > MAX_LIFTS) { return NULL; diff --git a/src/game/game_115ab0.c b/src/game/game_115ab0.c index 4157a4a7b..9ca9d513b 100644 --- a/src/game/game_115ab0.c +++ b/src/game/game_115ab0.c @@ -714,6 +714,124 @@ glabel padUnpack /* f115efc: 00000000 */ sll $zero,$zero,0x0 ); +// Mismatch because the ROM moves `fields` from a1 to a3 then uses a1 for other +// purposes, while the below just keeps a1 where it is. +//void padUnpack(s32 padnum, u32 fields, struct pad *pad) +//{ +// u32 *ibuffer = (u32 *)&g_StageSetup.padfiledata[g_PadOffsets[padnum]]; +// f32 *fbuffer = (f32 *)ibuffer; +// +// // flags, room and liftnum +// // ffffffff ffffffff ffrrrrrr rrrrllll +// +// if (fields & PADFIELD_ROOM) { +// pad->room = (s32)(*ibuffer << 18) >> 22; +// } +// +// if (fields & PADFIELD_LIFT) { +// pad->liftnum = *ibuffer & 0x0000000f; +// } +// +// fbuffer++; +// +// if ((*ibuffer >> 14) & PADFLAG_INTPOS) { +// if (fields & PADFIELD_POS) { +// s16 *sbuffer = (s16 *)fbuffer; +// pad->pos.x = sbuffer[0]; +// pad->pos.y = sbuffer[1]; +// pad->pos.z = sbuffer[2]; +// } +// fbuffer += 2; +// } else { +// if (fields & PADFIELD_POS) { +// pad->pos.x = fbuffer[0]; +// pad->pos.y = fbuffer[1]; +// pad->pos.z = fbuffer[2]; +// } +// fbuffer += 3; +// } +// +// if ((*ibuffer >> 14) & (PADFLAG_UPALIGNTOX | PADFLAG_UPALIGNTOY | PADFLAG_UPALIGNTOZ)) { +// if (fields & (PADFIELD_UP | PADFIELD_NORMAL)) { +// if ((*ibuffer >> 14) & PADFLAG_UPALIGNTOX) { +// pad->up.x = ((*ibuffer >> 14) & PADFLAG_UPALIGNINVERT) ? -1 : 1; +// pad->up.y = 0; +// pad->up.z = 0; +// } else if ((*ibuffer >> 14) & PADFLAG_UPALIGNTOY) { +// pad->up.x = 0; +// pad->up.y = ((*ibuffer >> 14) & PADFLAG_UPALIGNINVERT) ? -1 : 1; +// pad->up.z = 0; +// } else { +// pad->up.x = 0; +// pad->up.y = 0; +// pad->up.z = ((*ibuffer >> 14) & PADFLAG_UPALIGNINVERT) ? -1 : 1; +// } +// } +// } else { +// if (fields & (PADFIELD_UP | PADFIELD_NORMAL)) { +// pad->up.x = fbuffer[0]; +// pad->up.y = fbuffer[1]; +// pad->up.z = fbuffer[2]; +// } +// fbuffer += 3; +// } +// +// if ((*ibuffer >> 14) & (PADFLAG_LOOKALIGNTOX | PADFLAG_LOOKALIGNTOY | PADFLAG_LOOKALIGNTOZ)) { +// if (fields & (PADFIELD_LOOK | PADFIELD_NORMAL)) { +// if ((*ibuffer >> 14) & PADFLAG_LOOKALIGNTOX) { +// pad->look.x = ((*ibuffer >> 14) & PADFLAG_LOOKALIGNINVERT) ? -1 : 1; +// pad->look.y = 0; +// pad->look.z = 0; +// } else if ((*ibuffer >> 14) & PADFLAG_LOOKALIGNTOY) { +// pad->look.x = 0; +// pad->look.y = ((*ibuffer >> 14) & PADFLAG_LOOKALIGNINVERT) ? -1 : 1; +// pad->look.z = 0; +// } else { +// pad->look.x = 0; +// pad->look.y = 0; +// pad->look.z = ((*ibuffer >> 14) & PADFLAG_LOOKALIGNINVERT) ? -1 : 1; +// } +// } +// } else { +// if (fields & (PADFIELD_LOOK | PADFIELD_NORMAL)) { +// pad->look.x = fbuffer[0]; +// pad->look.y = fbuffer[1]; +// pad->look.z = fbuffer[2]; +// } +// fbuffer = fbuffer + 3; +// } +// +// if (fields & PADFIELD_NORMAL) { +// pad->normal.x = pad->up.y * pad->look.z - pad->look.y * pad->up.z; +// pad->normal.y = pad->up.z * pad->look.x - pad->look.z * pad->up.x; +// pad->normal.z = pad->up.x * pad->look.y - pad->look.x * pad->up.y; +// } +// +// if ((*ibuffer >> 14) & PADFLAG_HASBBOXDATA) { +// if (fields & PADFIELD_BBOX) { +// pad->bbox.xmin = fbuffer[0]; +// pad->bbox.xmax = fbuffer[1]; +// pad->bbox.ymin = fbuffer[2]; +// pad->bbox.ymax = fbuffer[3]; +// pad->bbox.zmin = fbuffer[4]; +// pad->bbox.zmax = fbuffer[5]; +// } +// } else { +// if (fields & PADFIELD_BBOX) { +// pad->bbox.xmin = -100; +// pad->bbox.ymin = -100; +// pad->bbox.zmin = -100; +// pad->bbox.xmax = 100; +// pad->bbox.ymax = 100; +// pad->bbox.zmax = 100; +// } +// } +// +// if (fields & PADFIELD_FLAGS) { +// pad->flags = (*ibuffer >> 14); +// } +//} + GLOBAL_ASM( glabel func0f115f00 /* f115f00: 3c0e800a */ lui $t6,0x800a diff --git a/src/game/game_176d70.c b/src/game/game_176d70.c index 63762bd40..4fdeefdaa 100644 --- a/src/game/game_176d70.c +++ b/src/game/game_176d70.c @@ -10926,7 +10926,7 @@ void scenarioKohReset(void) g_ScenarioData.koh.hillindex = 0; } - padUnpack(pad_id, 0x42, &pad); + padUnpack(pad_id, PADFIELD_POS | PADFIELD_ROOM, &pad); g_ScenarioData.koh.hillroom = pad.room; g_ScenarioData.koh.unk10 = -1; g_ScenarioData.koh.hillpos.x = pad.pos.x; diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index b1da890c6..bce19c918 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -20289,7 +20289,7 @@ u32 var800a2344 = 0; u32 var800a2348 = 0; u32 var800a234c = 0; u32 var800a2350 = 0; -u32 var800a2354 = 0; +u16 *g_PadOffsets = NULL; u32 var800a2358 = 0; u32 var800a235c = 0; u32 var800a2360 = 0; diff --git a/src/include/constants.h b/src/include/constants.h index 9551c303e..feb560349 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -833,6 +833,31 @@ #define PADEFFECT_SMOKE 0x04 #define PADEFFECT_SMOKE_TEMPORARY 0x05 +#define PADFIELD_POS 0x0002 +#define PADFIELD_LOOK 0x0004 +#define PADFIELD_UP 0x0008 +#define PADFIELD_NORMAL 0x0010 +#define PADFIELD_BBOX 0x0020 +#define PADFIELD_ROOM 0x0040 +#define PADFIELD_FLAGS 0x0080 +#define PADFIELD_LIFT 0x0100 + +#define PADFLAG_INTPOS 0x0001 +#define PADFLAG_UPALIGNTOX 0x0002 +#define PADFLAG_UPALIGNTOY 0x0004 +#define PADFLAG_UPALIGNTOZ 0x0008 +#define PADFLAG_UPALIGNINVERT 0x0010 +#define PADFLAG_LOOKALIGNTOX 0x0020 +#define PADFLAG_LOOKALIGNTOY 0x0040 +#define PADFLAG_LOOKALIGNTOZ 0x0080 +#define PADFLAG_LOOKALIGNINVERT 0x0100 +#define PADFLAG_HASBBOXDATA 0x0200 +#define PADFLAG_AIWAITLIFT 0x0400 +#define PADFLAG_AIONLIFT 0x0800 +#define PADFLAG_AIWALKDIRECT 0x1000 +#define PADFLAG_AIDROP 0x2000 +#define PADFLAG_AIDUCK 0x4000 + #define PATHTYPE_BACKANDFORTH 0 #define PATHTYPE_CIRCULAR 1 #define PATHTYPE_FLYING 2 diff --git a/src/include/game/game_115ab0.h b/src/include/game/game_115ab0.h index bb5016887..c4417a4f3 100644 --- a/src/include/game/game_115ab0.h +++ b/src/include/game/game_115ab0.h @@ -147,6 +147,6 @@ u32 func0f11e78c(void); u32 func0f11e7f0(void); u32 func0f11e844(void); u32 func0f11ea34(void); -void padUnpack(s32 pad_id, u32 flags, struct pad *dst); +void padUnpack(s32 padnum, u32 fields, struct pad *pad); #endif diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index d99d1cd36..1b347c4af 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -701,7 +701,7 @@ extern u8 g_AltTitle; extern u32 var800a2330; extern u32 var800a2344; extern u32 var800a2350; -extern u32 var800a2354; +extern u16 *g_PadOffsets; extern u32 var800a2360; extern u32 var800a2364; extern u32 var800a2368; diff --git a/src/include/types.h b/src/include/types.h index 0f0b62ee0..c504cc563 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -11,6 +11,15 @@ struct coord { f32 z; }; +struct bbox { + f32 xmin; + f32 xmax; + f32 ymin; + f32 ymax; + f32 zmin; + f32 zmax; +}; + struct weaponobj; struct prop; @@ -65,15 +74,9 @@ struct pad { /*0x0c*/ struct coord look; /*0x18*/ struct coord up; /*0x24*/ struct coord normal; - /*0x30*/ f32 xmin; - /*0x34*/ f32 xmax; - /*0x38*/ f32 ymin; - /*0x3c*/ f32 ymax; - /*0x40*/ f32 zmin; - /*0x44*/ f32 zmax; + /*0x24*/ struct bbox bbox; /*0x48*/ s32 room; - /*0x4c*/ s16 unk4c; - /*0x4e*/ s16 unk4e; + /*0x4c*/ u32 flags; /*0x50*/ u8 liftnum; // 1-10, 0 indicates no lift /*0x52*/ s16 unk52; }; @@ -2726,7 +2729,7 @@ struct stagesetup { /*0x10*/ u8 *props; /*0x14*/ struct path *paths; /*0x18*/ struct ailist *ailists; - /*0x1c*/ void *unk1c; + /*0x1c*/ s8 *padfiledata; }; struct inventory_menupos {