From 44c804348a7f8c1084f99d7ca94cb067d7af940f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 22 Oct 2020 17:34:17 +1000 Subject: [PATCH] Attempt to decompile setupDoor --- src/game/game_00c490.c | 157 ++++++++++++++++++++++++++++++++++++ src/gvars/gvars.c | 2 +- src/include/constants.h | 2 + src/include/game/pad.h | 2 +- src/include/game/propobj.h | 4 +- src/include/gvars/gvars.h | 2 +- src/include/lib/lib_159b0.h | 6 +- src/include/types.h | 6 ++ 8 files changed, 173 insertions(+), 8 deletions(-) diff --git a/src/game/game_00c490.c b/src/game/game_00c490.c index 15d60da8f..6c2569f67 100644 --- a/src/game/game_00c490.c +++ b/src/game/game_00c490.c @@ -2146,6 +2146,163 @@ glabel var7f1a8064 /* f00e908: 00000000 */ nop ); +// Mismatch: +// 1. Floating point math near 41c is vastly different +// 2. Goal skips sp slots 164, 160 and 15c - related to the above +// 3. Goal seems to have rooms array as rooms[8] instead of rooms[2] but this +// causes too much stack usage, because of 4 +// 4. Mine allocates too many unused stack slots at the bottom +//void setupDoor(struct doorobj *door, s32 cmdindex) +//{ +// f32 mult; +// s32 modelnum = door->base.modelnum; // 1c0 +// s32 portalnum = -1; // 1bc +// struct pad pad; // 168 +// +// propLoad(modelnum); +// +// if (door->doorflags & DOORFLAG_0040) { +// func0f116068(door->base.pad); +// } +// +// if (door->base.flags & OBJFLAG_DOOR_HASPORTAL) { +// portalnum = func0f00e2b0(door->base.pad); +// } +// +// padUnpack(door->base.pad, PADFIELD_POS | PADFIELD_LOOK | PADFIELD_UP | PADFIELD_NORMAL | PADFIELD_BBOX | PADFIELD_ROOM, &pad); +// +// // 3f4 +// if (g_DoorScale != 1) { +// pad.bbox.xmin *= g_DoorScale; +// pad.bbox.xmax *= g_DoorScale; +// +// // 41c +// if (portalnum >= 0) { +// // Is this is adjusting the pad's bbox to match the portal's +// // dimensions? +// f32 f0 = pad.pos.x * var800a4ccc[portalnum].coord.x +// + pad.pos.y * var800a4ccc[portalnum].coord.y +// + pad.pos.z * var800a4ccc[portalnum].coord.z; +// struct coord sp150; +// f0 = (f0 - var800a4ccc[portalnum].unk0c) * (g_DoorScale - 1); +// +// sp150.x = var800a4ccc[portalnum].coord.x * f0; +// sp150.y = var800a4ccc[portalnum].coord.y * f0; +// sp150.z = var800a4ccc[portalnum].coord.z * f0; +// +// pad.bbox.xmin += pad.normal.x * sp150.x + pad.normal.y * sp150.y + pad.normal.z * sp150.z; +// pad.bbox.xmax += pad.normal.x * sp150.x + pad.normal.y * sp150.y + pad.normal.z * sp150.z; +// pad.bbox.ymin += pad.up.x * sp150.x + pad.up.y * sp150.y + pad.up.z * sp150.z; +// pad.bbox.ymax += pad.up.x * sp150.x + pad.up.y * sp150.y + pad.up.z * sp150.z; +// pad.bbox.zmin += pad.look.x * sp150.x + pad.look.y * sp150.y + pad.look.z * sp150.z; +// pad.bbox.zmax += pad.look.x * sp150.x + pad.look.y * sp150.y + pad.look.z * sp150.z; +// } +// +// // Write the modified bbox into the pad file data +// padCopyBboxFromPad(door->base.pad, &pad); +// } +// +// if (pad.room >= 1) { +// f32 sp110[16]; // 110 - 150 +// struct prop *prop; // 10c +// struct coord pos; // fc - 108 +// s16 rooms[2]; // ec - ? +// f32 spac[16]; // ac - ec +// struct coord spa0; // a0 - ac +// f32 sp60[16]; // 60 - a0 +// struct coord sp54; // 54 - 60 +// f32 sp50; +// f32 sp4c; +// f32 sp48; +// f32 *floats; // 44 +// +// floats = func0f06896c(g_Props[modelnum].filedata); +// +// func00016d58(sp110, 0, 0, 0, +// -pad.look.x, -pad.look.y, -pad.look.z, +// pad.up.x, pad.up.y, pad.up.z); +// func000162e8(1.5705462694168f, spac); +// func00016400(1.5705462694168f, sp60); +// func000159fc(sp60, spac); +// func000159fc(sp110, spac); +// +// padGetCentre(door->base.pad, &spa0); +// +// sp50 = (pad.bbox.ymax - pad.bbox.ymin) / (floats[2] - floats[1]); +// sp4c = (pad.bbox.zmax - pad.bbox.zmin) / (floats[4] - floats[3]); +// sp48 = (pad.bbox.xmax - pad.bbox.xmin) / (floats[6] - floats[5]); +// +// if (sp50 <= 0.00001f || sp4c <= 0.00001f || sp48 <= 0.00001f) { +// sp50 = 1; +// sp4c = 1; +// sp48 = 1; +// } +// +// func00015e24(sp50, spac); +// func00015e80(sp4c, spac); +// func00015edc(sp48, spac); +// +// pos.x = pad.pos.x; +// pos.y = pad.pos.y; +// pos.z = pad.pos.z; +// +// rooms[0] = pad.room; +// rooms[1] = -1; +// +// // 714 +// if (door->doortype == DOORTYPE_VERTICAL || door->doortype == DOORTYPE_8) { +// sp54.x = (pad.bbox.zmax - pad.bbox.zmin) * pad.look.x; +// sp54.y = (pad.bbox.zmax - pad.bbox.zmin) * pad.look.y; +// sp54.z = (pad.bbox.zmax - pad.bbox.zmin) * pad.look.z; +// } else { +// sp54.x = (pad.bbox.ymin - pad.bbox.ymax) * pad.up.x; +// sp54.y = (pad.bbox.ymin - pad.bbox.ymax) * pad.up.y; +// sp54.z = (pad.bbox.ymin - pad.bbox.ymax) * pad.up.z; +// } +// +// // 790 +// door->maxfrac = *(s32 *)&door->maxfrac / 65536.0f; +// door->perimfrac = *(s32 *)&door->perimfrac / 65536.0f; +// door->accel = *(s32 *)&door->accel / 65536000.0f; +// door->decel = *(s32 *)&door->decel / 65536000.0f; +// door->maxspeed = *(s32 *)&door->maxspeed / 65536.0f; +// +// if (door->sibling) { +// door->sibling = (struct doorobj *)setupGetPtrToCommandByIndex((s32)door->sibling + cmdindex); +// } +// +// prop = func0f08d540(door, &pos, spac, rooms, &sp54, &spa0); +// +// if (door->base.flags & OBJFLAG_DOOR_HASPORTAL) { +// door->portalnum = portalnum; +// +// if (door->portalnum >= 0 && door->frac == 0) { +// doorDeactivatePortal(door); +// } +// } +// +// // 898 +// if (door->base.model) { +// mult = sp50; +// +// if (sp4c > mult) { +// mult = sp4c; +// } +// +// if (sp48 > mult) { +// mult = sp48; +// } +// +// modelSetUnk14(door->base.model, door->base.model->unk14 * mult); +// } +// +// func0f0604bc(prop); +// propShow(prop); +// } else { +// door->base.prop = NULL; +// } +//} + void setupHov(struct defaultobj *obj, struct hov *hov) { hov->unk04 = 0; diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index 946be0bc5..c8669efa9 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -16205,7 +16205,7 @@ s16 var800a4bf8[100] = {0}; u32 var800a4cc0 = 0; struct var800a4cc4 *var800a4cc4 = NULL; struct portal *g_Portals = NULL; -u32 var800a4ccc = 0; +struct var800a4ccc *var800a4ccc = NULL; u8 *var800a4cd0 = NULL; struct portalcmd *g_PortalCommands = NULL; u8 *g_LightsFileData = NULL; diff --git a/src/include/constants.h b/src/include/constants.h index b3f80f0e1..f381c3dd5 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -544,6 +544,7 @@ #define DOORFLAG_0004 0x0004 #define DOORFLAG_0008 0x0008 // Changes the angle at which one-way doors can be opened #define DOORFLAG_0010 0x0010 // Rescue door bottoms, training doors in Defense +#define DOORFLAG_0040 0x0040 #define DOORFLAG_0200 0x0200 // dataDyne secret door near lobby elevator #define DOORFLAG_DAMAGEONCONTACT 0x0400 // Lasers #define DOORFLAG_0800 0x0800 // Non-CI lasers, and floor grates @@ -2114,6 +2115,7 @@ #define OBJFLAG_04000000 0x04000000 // Editor: "AI Sees Through Door/Object" #define OBJFLAG_08000000 0x08000000 // Not used in scripts #define OBJFLAG_DEACTIVATED 0x10000000 +#define OBJFLAG_DOOR_HASPORTAL 0x10000000 #define OBJFLAG_20000000 0x20000000 // Editor: "Door Opens Backwards/Special Function/Conceal Weapon" #define OBJFLAG_40000000 0x40000000 #define OBJFLAG_DOOR_KEEPOPEN 0x40000000 // Editor: "Door open by default/Empty weapon" diff --git a/src/include/game/pad.h b/src/include/game/pad.h index 653b258d7..76be1f26f 100644 --- a/src/include/game/pad.h +++ b/src/include/game/pad.h @@ -6,7 +6,7 @@ void padUnpack(s32 padnum, u32 fields, struct pad *pad); bool padHasBboxData(s32 padnum); void padGetCentre(s32 padnum, struct coord *coord); -u32 func0f116068(void); +void func0f116068(s32 padnum); void padCopyBboxFromPad(s32 padnum, struct pad *src); void padSetFlag(s32 padnum, u32 flag); void padUnsetFlag(s32 padnum, u32 flag); diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 641572198..c16193e5f 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -65,7 +65,7 @@ u32 func0f068760(void); u32 func0f0687b8(struct defaultobj *obj); u32 func0f0687e4(void); u32 func0f0688f4(void); -u32 func0f06896c(void); +f32 *func0f06896c(void *modelfiledata); u32 func0f068998(void); u32 func0f068aa8(void); u32 func0f068ad4(void); @@ -296,7 +296,7 @@ u32 func0f08d3dc(void); u32 func0f08d460(void); void doorActivatePortal(struct doorobj *door); void doorDeactivatePortal(struct doorobj *door); -u32 func0f08d540(void); +struct prop *func0f08d540(struct doorobj *door, struct coord *pos, f32 *matrix, s16 *rooms, struct coord *coord, struct coord *centre); void func0f08d784(s32 soundtype, struct prop *prop); void func0f08daa8(s32 soundtype, struct prop *prop); void func0f08dd44(s32 soundtype, struct prop *prop); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index 1c879f47c..e587ec200 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -730,7 +730,7 @@ extern s16 var800a4bf8[100]; extern u32 var800a4cc0; extern struct var800a4cc4 *var800a4cc4; extern struct portal *g_Portals; -extern u32 var800a4ccc; +extern struct var800a4ccc *var800a4ccc; // indexed by portalnum extern u8 *var800a4cd0; extern struct portalcmd *g_PortalCommands; extern u8 *g_LightsFileData; diff --git a/src/include/lib/lib_159b0.h b/src/include/lib/lib_159b0.h index d14c963a2..136f07f5e 100644 --- a/src/include/lib/lib_159b0.h +++ b/src/include/lib/lib_159b0.h @@ -18,11 +18,11 @@ void func00015d54(f32 *realrot, f32 *matrix); void func00015da0(f32 *arg0, f32 *arg1); void func00015dd4(struct coord *pos, f32 *matrix); u32 func00015df0(void); -u32 func00015e24(void); +void func00015e24(f32 mult, f32 *matrix); u32 func00015e4c(void); -u32 func00015e80(void); +void func00015e80(f32 mult, f32 *matrix); u32 func00015ea8(void); -u32 func00015edc(void); +void func00015edc(f32 mult, f32 *matrix); void func00015f04(f32 arg0, f32 *arg1); u32 func00015f4c(void); u32 func00015f88(void); diff --git a/src/include/types.h b/src/include/types.h index 5296bd3c5..63074e0b8 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -5092,6 +5092,12 @@ struct portalthing { u32 unk0c; }; +struct var800a4ccc { // related to portals + struct coord coord; + f32 unk0c; + u32 unk10; +}; + struct trainingdata { u8 intraining : 1; u8 failed : 1;