diff --git a/src/game/chr.c b/src/game/chr.c index 63e795d4f..19459fe31 100644 --- a/src/game/chr.c +++ b/src/game/chr.c @@ -2218,8 +2218,8 @@ glabel var7f1a87a8 // // prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; // -// if (obj->hidden & OBJHFLAG_00000040) { -// mtx00015be4(sp104, (Mtxf *)&obj->projectile->speed, &sp80); +// if (obj->hidden & OBJHFLAG_HANGINGMONITOR) { +// mtx00015be4(sp104, &obj->monitormount->matrix, &sp80); // thing.matrix = &sp80; // } else if (CHRRACE(chr) == RACE_SKEDAR) { // // The skedar hand position is rotated weirdly, so compensate for it @@ -3135,7 +3135,7 @@ void chrDropConcealedItems(struct chrdata *chr) if (prop != chr->weapons_held[2] && prop != chr->weapons_held[1] && prop != chr->weapons_held[0] - && (prop->obj->hidden & OBJHFLAG_00000040) == 0 + && (prop->obj->hidden & OBJHFLAG_HANGINGMONITOR) == 0 && (prop->obj->flags & OBJFLAG_AIUNDROPPABLE) == 0) { objSetDropped(prop, DROPTYPE_DEFAULT); } diff --git a/src/game/propobj.c b/src/game/propobj.c index ab8284e38..698be92f5 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -116,7 +116,7 @@ struct hatobj *g_HatSlots; struct ammocrateobj *g_AmmoCrates; struct defaultobj *var8009ce64; struct projectile *g_Projectiles; -struct monitorthing *g_MonitorThings; +struct monitormount *g_MonitorMounts; u32 g_TintedGlassEnabled = 0; s32 g_AlarmTimer = 0; @@ -2145,7 +2145,7 @@ void projectileReset(struct projectile *projectile) projectile->unk018 = 0; projectile->unk01c = 0; - mtx4LoadIdentity((Mtxf *)&projectile->unk020); + mtx4LoadIdentity(&projectile->unk020); projectile->unk060 = 1; projectile->ownerprop = NULL; @@ -2175,7 +2175,7 @@ void projectileReset(struct projectile *projectile) projectile->unk0f0 = 0; } -struct projectile *projectileGetNew(void) +struct projectile *projectileAllocate(void) { s32 bestindex = -1; s32 i; @@ -2224,17 +2224,17 @@ void func0f0685e4(struct prop *prop) { struct defaultobj *obj = prop->obj; - if (obj->hidden & OBJHFLAG_00000040) { - if (obj->projectile->unk044) { - projectileReset(obj->projectile->unk044); + if (obj->hidden & OBJHFLAG_HANGINGMONITOR) { + if (obj->monitormount->projectile) { + projectileReset(obj->monitormount->projectile); } else { - obj->projectile->unk044 = projectileGetNew(); + obj->monitormount->projectile = projectileAllocate(); } } else if ((obj->hidden & OBJHFLAG_AIRBORNE) == 0) { if (obj->projectile) { projectileReset(obj->projectile); } else { - obj->projectile = projectileGetNew(); + obj->projectile = projectileAllocate(); } if (obj->projectile) { @@ -2248,8 +2248,8 @@ void objSetProjectileFlag4(struct prop *prop) struct defaultobj *obj = prop->obj; struct projectile *projectile = NULL; - if (obj->hidden & OBJHFLAG_00000040) { - projectile = obj->projectile->unk044; + if (obj->hidden & OBJHFLAG_HANGINGMONITOR) { + projectile = obj->monitormount->projectile; } else if (obj->hidden & OBJHFLAG_AIRBORNE) { projectile = obj->projectile; } @@ -2259,21 +2259,21 @@ void objSetProjectileFlag4(struct prop *prop) } } -void projectileSetFlag1(struct projectile *projectile) +void monitormountFree(struct monitormount *mount) { - projectile->flags |= PROJECTILEFLAG_00000001; + mount->flags |= MONITORMOUNTFLAG_FREE; } -struct monitorthing *monitorthingGetNew(void) +struct monitormount *monitormountAllocate(void) { s32 i; for (i = 0; i < g_MaxMonitorThings; i++) { - if (g_MonitorThings[i].flags & 0x00000001) { - g_MonitorThings[i].flags = 0; - g_MonitorThings[i].unk044 = NULL; + if (g_MonitorMounts[i].flags & MONITORMOUNTFLAG_FREE) { + g_MonitorMounts[i].flags = 0; + g_MonitorMounts[i].projectile = NULL; - return &g_MonitorThings[i]; + return &g_MonitorMounts[i]; } } @@ -6384,17 +6384,17 @@ void func0f06ac90(struct prop *prop) if (prop && prop->obj) { struct defaultobj *obj = prop->obj; - if (obj->hidden & OBJHFLAG_00000040) { - if (obj->projectile) { - if (obj->projectile->unk044) { - projectileFree(obj->projectile->unk044); + if (obj->hidden & OBJHFLAG_HANGINGMONITOR) { + if (obj->monitormount) { + if (obj->monitormount->projectile) { + projectileFree(obj->monitormount->projectile); } - projectileSetFlag1(obj->projectile); + monitormountFree(obj->monitormount); } - obj->projectile = NULL; - obj->hidden &= ~OBJHFLAG_00000040; + obj->monitormount = NULL; + obj->hidden &= ~OBJHFLAG_HANGINGMONITOR; } else if (obj->hidden & OBJHFLAG_AIRBORNE) { objEndFlight(obj); } @@ -13692,7 +13692,7 @@ glabel func0f06ef44 /* f06ef68: 31f80002 */ andi $t8,$t7,0x2 /* f06ef6c: 53000047 */ beqzl $t8,.L0f06f08c /* f06ef70: 00001025 */ or $v0,$zero,$zero -/* f06ef74: 0fc1a1bc */ jal monitorthingGetNew +/* f06ef74: 0fc1a1bc */ jal monitormountAllocate /* f06ef78: 8c900004 */ lw $s0,0x4($a0) /* f06ef7c: 10400042 */ beqz $v0,.L0f06f088 /* f06ef80: ae020048 */ sw $v0,0x48($s0) @@ -14153,7 +14153,7 @@ bool propExplode(struct prop *prop, s32 exptype) func0f065e74(&parent->pos, parent->rooms, &pos, rooms); result = explosionCreateComplex(NULL, &pos, rooms, exptype, playernum); - } else if ((obj->hidden & (OBJHFLAG_00000040 | OBJHFLAG_AIRBORNE | OBJHFLAG_00020000)) == OBJHFLAG_00020000) { + } else if ((obj->hidden & (OBJHFLAG_HANGINGMONITOR | OBJHFLAG_AIRBORNE | OBJHFLAG_00020000)) == OBJHFLAG_00020000) { struct coord sp5c; struct coord sp50; f32 ymin = modelBboxGetYMin(modelFindBboxRodata(obj->model)); @@ -17505,7 +17505,7 @@ glabel var7f1aa2c4 // // func0f0685e4(prop); // -// if (obj->hidden & OBJHFLAG_00000040) { +// if (obj->hidden & OBJHFLAG_HANGINGMONITOR) { // projectile = obj->projectile->unk044; // } else if (obj->hidden & OBJHFLAG_AIRBORNE) { // projectile = obj->projectile; @@ -17950,14 +17950,14 @@ void func0f07079c(struct prop *prop, bool fulltick) return; } - if (model->attachedtonode && (obj->hidden & OBJHFLAG_00000040)) { + if (model->attachedtonode && (obj->hidden & OBJHFLAG_HANGINGMONITOR)) { Mtxf *mtx = model0001a5cc(model->attachedtomodel, model->attachedtonode, 0); struct modelrenderdata renderdata = {NULL, true, 3}; u32 stack; Mtxf sp30; prop->flags |= PROPFLAG_ONTHISSCREENTHISTICK | PROPFLAG_ONANYSCREENTHISTICK; - mtx00015be4(mtx, &obj->monitorthing->matrix, &sp30); + mtx00015be4(mtx, &obj->monitormount->matrix, &sp30); renderdata.unk10 = gfxAllocate(model->filedata->nummatrices * sizeof(Mtxf)); renderdata.unk00 = &sp30; @@ -67975,8 +67975,8 @@ void objSetDropped(struct prop *prop, u32 droptype) func0f0685e4(prop); - if ((obj->hidden & OBJHFLAG_00000040) && obj->projectile->unk044) { - obj->projectile->unk044->droptype = droptype; + if ((obj->hidden & OBJHFLAG_HANGINGMONITOR) && obj->monitormount->projectile) { + obj->monitormount->projectile->droptype = droptype; } else if (obj->hidden & OBJHFLAG_AIRBORNE) { obj->projectile->droptype = droptype; } @@ -68856,13 +68856,13 @@ bool objDrop(struct prop *prop, bool lazy) struct coord spe4; s16 rooms[8]; - if ((obj->hidden & OBJHFLAG_00000040) && obj->projectile->unk044) { - struct projectile *projectile2 = obj->projectile->unk044; + if ((obj->hidden & OBJHFLAG_HANGINGMONITOR) && obj->monitormount->projectile) { + struct projectile *projectile2 = obj->monitormount->projectile; - projectileSetFlag1(obj->projectile); + monitormountFree(obj->monitormount); obj->projectile = projectile2; - obj->hidden &= ~OBJHFLAG_00000040; + obj->hidden &= ~OBJHFLAG_HANGINGMONITOR; obj->hidden |= OBJHFLAG_AIRBORNE; } @@ -78149,7 +78149,7 @@ struct weaponobj *weaponCreate(bool musthaveprop, bool musthavemodel, struct mod #endif { if (g_WeaponSlots[i].base.prop->parent) { - if (g_WeaponSlots[i].base.hidden & OBJHFLAG_00000040) { + if (g_WeaponSlots[i].base.hidden & OBJHFLAG_HANGINGMONITOR) { usable = true; } } else { diff --git a/src/game/setup.c b/src/game/setup.c index 51f8ab5da..d4dfe2dea 100644 --- a/src/game/setup.c +++ b/src/game/setup.c @@ -273,12 +273,12 @@ void propsReset(void) } if (g_MaxMonitorThings == 0) { - g_MonitorThings = 0; + g_MonitorMounts = 0; } else { - g_MonitorThings = mempAlloc(ALIGN16(g_MaxMonitorThings * sizeof(struct monitorthing)), MEMPOOL_STAGE); + g_MonitorMounts = mempAlloc(ALIGN16(g_MaxMonitorThings * sizeof(struct monitormount)), MEMPOOL_STAGE); for (i = 0; i < g_MaxMonitorThings; i++) { - g_MonitorThings[i].flags = 0x00000001; + g_MonitorMounts[i].flags = 0x00000001; } } @@ -1689,8 +1689,9 @@ void setupCreateSingleMonitor(struct singlemonitorobj *monitor, s32 cmdindex) monitor->screen = var8009ce98; tvscreenSetImageByNum(&monitor->screen, monitor->imagenum); - // The setup files never place any monitors on a -1 pad, so this code is - // unreachable. It appears to allow attaching monitors to other objects. + // In GE, monitors with a negative pad are hanging TVs which attach to a + // hangingmonitors object, which is actually just the mount. In PD, hanging + // monitors do not exist in the setup files so this code is unused. if (monitor->base.pad < 0 && (monitor->base.flags & OBJFLAG_INSIDEANOTHEROBJ) == 0) { s32 modelnum = monitor->base.modelnum; struct defaultobj *owner = (struct defaultobj *)setupGetCmdByIndex(cmdindex + monitor->owneroffset); @@ -1709,10 +1710,10 @@ void setupCreateSingleMonitor(struct singlemonitorobj *monitor, s32 cmdindex) } prop = objInitWithAutoModel(&monitor->base); - monitor->base.monitorthing = monitorthingGetNew(); + monitor->base.monitormount = monitormountAllocate(); - if (prop && monitor->base.monitorthing) { - monitor->base.hidden |= OBJHFLAG_00000040; + if (prop && monitor->base.monitormount) { + monitor->base.hidden |= OBJHFLAG_HANGINGMONITOR; modelSetScale(monitor->base.model, monitor->base.model->scale * scale); monitor->base.model->attachedtomodel = owner->model; @@ -1736,7 +1737,7 @@ void setupCreateSingleMonitor(struct singlemonitorobj *monitor, s32 cmdindex) spa4.z = -spa4.z; mtx4LoadTranslation(&spa4, &sp24); - mtx00015be4(&sp64, &sp24, &monitor->base.monitorthing->matrix); + mtx00015be4(&sp64, &sp24, &monitor->base.monitormount->matrix); } } else { setupCreateObject(&monitor->base, cmdindex); diff --git a/src/include/bss.h b/src/include/bss.h index f2cf345ae..fd4400968 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -110,7 +110,7 @@ extern struct hatobj *g_HatSlots; extern struct ammocrateobj *g_AmmoCrates; extern struct defaultobj *var8009ce64; extern struct projectile *g_Projectiles; -extern struct monitorthing *g_MonitorThings; +extern struct monitormount *g_MonitorMounts; extern u32 var8009ce70; extern u32 var8009ce74; extern u32 var8009ce78[4]; diff --git a/src/include/constants.h b/src/include/constants.h index 01d9a7cc3..c32dc1a18 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2468,6 +2468,9 @@ #define MODFILE_MPSETUP 2 #define MODFILE_BOSS 4 +// Might be the same flags as PROJECTILEFLAG +#define MONITORMOUNTFLAG_FREE 0x00000001 + #define MOVEMODE_WALK 0 #define MOVEMODE_BIKE 3 #define MOVEMODE_GRAB 4 @@ -3045,7 +3048,7 @@ #define OBJHFLAG_ISRETICK 0x00000008 #define OBJHFLAG_TAGGED 0x00000010 #define OBJHFLAG_00000020 0x00000020 // thrown knife -#define OBJHFLAG_00000040 0x00000040 +#define OBJHFLAG_HANGINGMONITOR 0x00000040 #define OBJHFLAG_AIRBORNE 0x00000080 #define OBJHFLAG_00000100 0x00000100 #define OBJHFLAG_00000200 0x00000200 diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 1d8748bdb..626c12e08 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -68,11 +68,11 @@ u32 func0f068218(void); void projectileFree(struct projectile *projectile); void projectilesUnrefOwner(struct prop *owner); void projectileReset(struct projectile *projectile); -struct projectile *projectileGetNew(void); +struct projectile *projectileAllocate(void); void func0f0685e4(struct prop *prop); void objSetProjectileFlag4(struct prop *prop); -void projectileSetFlag1(struct projectile *projectile); -struct monitorthing *monitorthingGetNew(void); +void monitormountFree(struct monitormount *mount); +struct monitormount *monitormountAllocate(void); s32 objGetDestroyedThird(struct defaultobj *obj); s32 objGetDestroyedValue(struct defaultobj *obj); struct modelnode *func0f0687e4(struct model *model); diff --git a/src/include/types.h b/src/include/types.h index c6e6bb9fe..9efb82969 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1471,22 +1471,7 @@ struct projectile { /*0x014*/ f32 unk014; /*0x018*/ f32 unk018; /*0x01c*/ f32 unk01c; - /*0x020*/ f32 unk020; - /*0x024*/ u32 unk024; - /*0x028*/ u32 unk028; - /*0x02c*/ u32 unk02c; - /*0x030*/ u32 unk030; - /*0x034*/ f32 unk034; - /*0x038*/ f32 unk038; - /*0x03c*/ f32 unk03c; - /*0x040*/ u32 unk040; - /*0x044*/ struct projectile *unk044; - /*0x048*/ u32 unk048; - /*0x04c*/ u32 unk04c; - /*0x050*/ u32 unk050; - /*0x054*/ u32 unk054; - /*0x058*/ u32 unk058; - /*0x05c*/ u32 unk05c; + /*0x020*/ Mtxf unk020; /*0x060*/ f32 unk060; /*0x064*/ u32 unk064; /*0x068*/ u32 unk068; @@ -1530,10 +1515,10 @@ struct projectile { /*0x108*/ struct prop *unk108; }; -struct monitorthing { +struct monitormount { /*0x000*/ u32 flags; /*0x004*/ Mtxf matrix; - /*0x044*/ struct projectile *unk044; + /*0x044*/ struct projectile *projectile; }; struct tvscreen { @@ -1618,7 +1603,7 @@ struct defaultobj { }; union { /*0x48*/ struct projectile *projectile; - /*0x48*/ struct monitorthing *monitorthing; + /*0x48*/ struct monitormount *monitormount; }; /*0x4c*/ s16 damage; /*0x4e*/ s16 maxdamage;