From 79b846c1638c1db190a7d39bbb9237a2d252fbe0 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 28 Nov 2021 19:28:55 +1000 Subject: [PATCH] Attempt to decompile func0f08f604 --- src/game/game_00c490.c | 2 +- src/game/propobj.c | 121 +++++++++++++++++++++++++++++++++++++--- src/include/constants.h | 21 ++++--- 3 files changed, 126 insertions(+), 18 deletions(-) diff --git a/src/game/game_00c490.c b/src/game/game_00c490.c index 7234a1e2a..b48de32b3 100644 --- a/src/game/game_00c490.c +++ b/src/game/game_00c490.c @@ -2353,7 +2353,7 @@ glabel var7f1a8064 // rooms[1] = -1; // // // 714 -// if (door->doortype == DOORTYPE_VERTICAL || door->doortype == DOORTYPE_8) { +// if (door->doortype == DOORTYPE_VERTICAL || door->doortype == DOORTYPE_FALLAWAY) { // 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; diff --git a/src/game/propobj.c b/src/game/propobj.c index 016ad77dd..b7c6a5d68 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -33352,8 +33352,8 @@ void doorTick(struct prop *doorprop) } } - // DOORTYPE_8 is unused - if (door->doortype == DOORTYPE_8 && doorIsClosed(door) && doorIsPadlockFree(door)) { + // Open fall-away doors if padlock free (GE only) + if (door->doortype == DOORTYPE_FALLAWAY && doorIsClosed(door) && doorIsPadlockFree(door)) { doorsActivate(doorprop, false); } @@ -70636,11 +70636,11 @@ struct prop *doorInit(struct doorobj *door, struct coord *pos, Mtxf *mtx, s16 *r if (prop != NULL) { switch (door->doortype) { case DOORTYPE_SLIDING: - case DOORTYPE_1: - case DOORTYPE_2: - case DOORTYPE_3: + case DOORTYPE_FLEXI1: + case DOORTYPE_FLEXI2: + case DOORTYPE_FLEXI3: case DOORTYPE_VERTICAL: - case DOORTYPE_8: + case DOORTYPE_FALLAWAY: case DOORTYPE_LASER: door->doorflags |= DOORFLAG_0080; break; @@ -70954,7 +70954,7 @@ void doorStartOpen(struct doorobj *door) doorPlayOpeningSound(door->soundtype, door->base.prop); doorActivatePortal(door); - if (door->doortype == DOORTYPE_8) { + if (door->doortype == DOORTYPE_FALLAWAY) { struct tiletype3 *geo = door->base.geo3; door->base.flags |= OBJFLAG_CANNOT_ACTIVATE; door->perimfrac = 0; @@ -71000,7 +71000,7 @@ void doorFinishOpen(struct doorobj *door) { doorPlayOpenedSound(door->soundtype, door->base.prop); - if (door->doortype == DOORTYPE_8) { + if (door->doortype == DOORTYPE_FALLAWAY) { func0f0685e4(door->base.prop); if (door->base.hidden & OBJHFLAG_AIRBORNE) { @@ -72088,6 +72088,111 @@ glabel var7f1ab184 /* f08f964: 00000000 */ nop ); +/** + * Get some coordinates/distances related to activating doors. + */ +// Mismatch: Float instructions are in a different order +//void func0f08f604(struct doorobj *door, f32 *arg1, f32 *arg2, f32 *arg3, f32 *arg4, bool arg5) +//{ +// f32 spe4; +// f32 spe0; +// f32 spdc; +// f32 tmp; +// f32 spd4; +// f32 spd0; +// f32 spcc; +// f32 spc8; +// u32 stack[4]; +// struct prop *playerprop; // b4 +// f32 spb0; +// f32 spac; +// f32 spa8; +// f32 spa4; +// volatile struct coord playerpos; // 98 +// struct pad pad; // 44 +// f32 sp40; +// f32 sp3c; +// f32 sp38; +// f32 sp34; +// f32 sp30; +// f32 sp2c; +// f32 sp28; +// +// if (g_Vars.currentplayer->eyespy && g_Vars.currentplayer->eyespy->active) { +// playerprop = g_Vars.currentplayer->eyespy->prop; +// } else { +// playerprop = g_Vars.currentplayer->prop; +// } +// +// padUnpack(door->base.pad, PADFIELD_POS | PADFIELD_LOOK | PADFIELD_UP | PADFIELD_BBOX, &pad); +// +// playerpos.x = playerprop->pos.x; +// playerpos.y = playerprop->pos.y; +// playerpos.z = playerprop->pos.z; +// +// if (arg5) { +// spa8 = pad.bbox.xmin; +// spa4 = pad.bbox.xmax; +// spb0 = pad.up.y * pad.look.z - pad.look.y * pad.up.z; +// spac = pad.up.x * pad.look.y - pad.look.x * pad.up.y; +// } else { +// spa8 = pad.bbox.ymin; +// spa4 = pad.bbox.ymax; +// spb0 = pad.up.x; +// spac = pad.up.z; +// } +// +// spd4 = pad.pos.x + spb0 * spa8 - playerpos.x; +// spd0 = pad.pos.z + spac * spa8 - playerpos.z; +// spe4 = func0f08f538(spd4, spd0); +// spcc = pad.pos.x + spb0 * spa4 - playerpos.x; +// spc8 = pad.pos.z + spac * spa4 - playerpos.z; +// spe0 = func0f08f538(spcc, spc8); +// +// if (spe4 < spe0) { +// *arg1 = spe4; +// *arg2 = spe0; +// } else { +// *arg1 = spe0; +// *arg2 = spe4; +// } +// +// if (arg3 != NULL && arg4 != NULL) { +// if (door->doortype == DOORTYPE_SWINGING) { +// sp38 = door->frac * 0.017450513318181f; +// +// if (door->base.flags & OBJFLAG_DOOR_OPENTOFRONT) { +// sp38 = M_BADTAU - sp38; +// } +// +// spdc = spe4; +// sp34 = cosf(sp38); +// sp30 = sinf(sp38); +// tmp = func0f08f538( +// (pad.pos.x + spb0 * spa8 - playerpos.x) + (spa4 - spa8) * (spb0 * sp34 + spac * sp30), +// (pad.pos.z + spac * spa8 - playerpos.z) + (spa4 - spa8) * (-spb0 * sp30 + spac * sp34)); +// } else if (door->doortype == DOORTYPE_SLIDING +// || door->doortype == DOORTYPE_FLEXI1 +// || door->doortype == DOORTYPE_FLEXI2 +// || door->doortype == DOORTYPE_FLEXI3) { +// sp40 = door->unk98.x * door->frac; +// sp3c = door->unk98.z * door->frac; +// spdc = func0f08f538(spd4 + sp40, spd0 + sp3c); +// tmp = func0f08f538(spcc + sp40, spc8 + sp3c); +// } else { +// spdc = spe4; +// } +// +// if (spdc < tmp) { +// *arg3 = spdc; +// *arg4 = tmp; +// } else { +// *arg3 = tmp; +// *arg4 = spdc; +// } +// } +//} + bool func0f08f968(struct doorobj *door, bool arg1) { bool checkmore = true; diff --git a/src/include/constants.h b/src/include/constants.h index c925c061f..7258e6892 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -695,15 +695,18 @@ #define DOORSTATE_CLOSING 4 #define DOORSTATE_OPENING 8 -#define DOORTYPE_SLIDING 0 -#define DOORTYPE_1 1 -#define DOORTYPE_2 2 -#define DOORTYPE_3 3 -#define DOORTYPE_VERTICAL 4 -#define DOORTYPE_SWINGING 5 -#define DOORTYPE_8 8 -#define DOORTYPE_HULL 10 -#define DOORTYPE_LASER 11 +#define DOORTYPE_SLIDING 0 +#define DOORTYPE_FLEXI1 1 // GE only - Bunker flexi door +#define DOORTYPE_FLEXI2 2 +#define DOORTYPE_FLEXI3 3 +#define DOORTYPE_VERTICAL 4 +#define DOORTYPE_SWINGING 5 +#define DOORTYPE_EYE 6 // GE only - Caverns +#define DOORTYPE_IRIS 7 // GE only - Caverns +#define DOORTYPE_FALLAWAY 8 // GE only - Surface grate and Train floor panel +#define DOORTYPE_AZTECCHAIR 9 // GE only +#define DOORTYPE_HULL 10 // Attack Ship windows +#define DOORTYPE_LASER 11 #define DRCAROLLIMAGE_EYESDEFAULT 0 #define DRCAROLLIMAGE_HEARTRATE 1