Separate projectile struct into monitormount and projectile

This commit is contained in:
Ryan Dwyer 2022-04-05 19:26:14 +10:00
parent 7b7631fb43
commit f9896d6dc4
7 changed files with 61 additions and 72 deletions

View File

@ -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);
}

View File

@ -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 {

View File

@ -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);

View File

@ -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];

View File

@ -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

View File

@ -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);

View File

@ -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;