From bd009f72908d017a514a0b6bb91960b0ca6d1fe0 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 16 Nov 2022 19:31:58 +1000 Subject: [PATCH] Move every-tick logic from propsTick into backgroundable logic in propsTickPlayer where possible --- src/game/bot.c | 8 +++++ src/game/chr.c | 8 ----- src/game/explosions.c | 28 ++++++++++++----- src/game/prop.c | 16 ++++++++++ src/game/propobj.c | 32 +++++++++----------- src/game/proptick.c | 61 +++++++++++++------------------------- src/game/smoke.c | 28 ++++++++++++----- src/include/game/propobj.h | 2 +- 8 files changed, 102 insertions(+), 81 deletions(-) diff --git a/src/game/bot.c b/src/game/bot.c index c6a40a56a..ead6b22cc 100644 --- a/src/game/bot.c +++ b/src/game/bot.c @@ -780,6 +780,14 @@ s32 botTick(struct prop *prop) updateable = (prop->flags & PROPFLAG_NOTYETTICKED) && g_Vars.lvupdate240; if (aibot) { + if (updateable && aibot->unk058 > 0) { + if (aibot->unk058 > g_Vars.lvupdate60) { + aibot->unk058 -= g_Vars.lvupdate60; + } else { + aibot->unk058 = 0; + } + } + if (updateable && g_Vars.lvframe60 >= 145) { botTickUnpaused(chr); diff --git a/src/game/chr.c b/src/game/chr.c index f92c38fc5..23e706a68 100644 --- a/src/game/chr.c +++ b/src/game/chr.c @@ -2071,14 +2071,6 @@ bool chrTickBeams(struct prop *prop) beamTick(&g_Fireslots[chr->fireslots[1]].beam); } - if (chr->aibot && chr->aibot->unk058 > 0) { - if (chr->aibot->unk058 > g_Vars.lvupdate60) { - chr->aibot->unk058 -= g_Vars.lvupdate60; - } else { - chr->aibot->unk058 = 0; - } - } - return false; } diff --git a/src/game/explosions.c b/src/game/explosions.c index 0a95dccd4..99ad432bc 100644 --- a/src/game/explosions.c +++ b/src/game/explosions.c @@ -1189,17 +1189,31 @@ u32 explosionTick(struct prop *prop) u32 explosionTickPlayer(struct prop *prop) { - Mtxf *matrix = camGetWorldToScreenMtxf(); + s32 tickop; - prop->z = -(matrix->m[0][2] * prop->pos.x + matrix->m[1][2] * prop->pos.y + matrix->m[2][2] * prop->pos.z + matrix->m[3][2]); + if (prop->flags & PROPFLAG_NOTYETTICKED) { + prop->flags &= ~PROPFLAG_NOTYETTICKED; - if (prop->z < 100) { - prop->z *= 0.5f; - } else { - prop->z -= 100; + tickop = explosionTick(prop); + + if (tickop == TICKOP_FREE) { + return tickop; + } } - prop->flags |= PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONTHISSCREENTHISTICK; + { + Mtxf *matrix = camGetWorldToScreenMtxf(); + + prop->z = -(matrix->m[0][2] * prop->pos.x + matrix->m[1][2] * prop->pos.y + matrix->m[2][2] * prop->pos.z + matrix->m[3][2]); + + if (prop->z < 100) { + prop->z *= 0.5f; + } else { + prop->z -= 100; + } + + prop->flags |= PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONTHISSCREENTHISTICK; + } return TICKOP_NONE; } diff --git a/src/game/prop.c b/src/game/prop.c index cba1ccd77..4d9456857 100644 --- a/src/game/prop.c +++ b/src/game/prop.c @@ -1775,6 +1775,10 @@ void propsTickPlayer(bool islastplayer) splatTickChr(prop); + if (prop->flags & PROPFLAG_NOTYETTICKED) { + chrTickBeams(prop); + } + if (chr1 && chr1->aibot) { op = botTick(prop); } else { @@ -1792,6 +1796,10 @@ void propsTickPlayer(bool islastplayer) } else if (prop->type == PROPTYPE_SMOKE) { op = smokeTickPlayer(prop); } else if (prop->type == PROPTYPE_PLAYER) { + if (prop->flags & PROPFLAG_NOTYETTICKED) { + playerTickBeams(prop); + } + splatTickChr(prop); op = playerTickThirdPerson(prop); } @@ -1837,6 +1845,10 @@ void propsTickPlayer(bool islastplayer) splatTickChr(prop); + if (prop->flags & PROPFLAG_NOTYETTICKED) { + chrTickBeams(prop); + } + if (chr2 && chr2->aibot) { op = botTick(prop); } else { @@ -1863,6 +1875,10 @@ void propsTickPlayer(bool islastplayer) } else if (prop->type == PROPTYPE_SMOKE) { op = smokeTickPlayer(prop); } else if (prop->type == PROPTYPE_PLAYER) { + if (prop->flags & PROPFLAG_NOTYETTICKED) { + playerTickBeams(prop); + } + splatTickChr(prop); op = playerTickThirdPerson(prop); } diff --git a/src/game/propobj.c b/src/game/propobj.c index 2a1c20436..e9c3f4f50 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -10017,7 +10017,7 @@ void objInitMatrices(struct prop *prop) } } -u32 objTick(struct prop *prop) +void objTick(struct prop *prop) { struct defaultobj *obj = prop->obj; bool silent = false; @@ -10093,23 +10093,6 @@ u32 objTick(struct prop *prop) } } } - - if (obj->type == OBJTYPE_AUTOGUN) { - struct autogunobj *autogun = (struct autogunobj *)prop->obj; - - if (autogun->beam) { - beamTick(autogun->beam); - } - } else if (obj->type == OBJTYPE_CHOPPER) { - struct chopperobj *chopper = (struct chopperobj *)prop->obj; - beamTick(chopper->fireslotthing->beam); - } else if (obj->type == OBJTYPE_LIFT) { - liftTick(prop); - } else if (obj->type == OBJTYPE_ESCASTEP) { - escastepTick(prop); - } - - return TICKOP_NONE; } /** @@ -10176,6 +10159,19 @@ s32 objTickPlayer(struct prop *prop) prop->flags &= ~PROPFLAG_NOTYETTICKED; } + if (fulltick) { + if (obj->type == OBJTYPE_AUTOGUN) { + struct autogunobj *autogun = (struct autogunobj *)prop->obj; + + if (autogun->beam) { + beamTick(autogun->beam); + } + } else if (obj->type == OBJTYPE_CHOPPER) { + struct chopperobj *chopper = (struct chopperobj *)prop->obj; + beamTick(chopper->fireslotthing->beam); + } + } + if (obj->hidden & OBJHFLAG_PROJECTILE) { struct projectile *projectile = obj->projectile; diff --git a/src/game/proptick.c b/src/game/proptick.c index 77b5ddb5b..de36accb9 100644 --- a/src/game/proptick.c +++ b/src/game/proptick.c @@ -49,10 +49,6 @@ void propsTick(void) { s32 i; struct prop *prop; - struct prop *next; - struct prop *next2; - s32 done; - s32 tickop; for (i = 0; i < PLAYERCOUNT(); i++) { g_Vars.players[i]->bondextrapos.x = 0; @@ -63,44 +59,29 @@ void propsTick(void) shieldhitsTick(); chraTickBg(); - prop = g_Vars.activeprops; + for (i = 0; g_Lifts[i] != NULL; i++) { + liftTick(g_Lifts[i]); + } - do { - next = prop->next; - done = next == g_Vars.pausedprops; - tickop = TICKOP_NONE; + if (g_Vars.stagenum == STAGE_AIRBASE) { + prop = g_Vars.activeprops; - if (prop->type == PROPTYPE_CHR) { - tickop = chrTickBeams(prop); - } else if (prop->type & (PROPTYPE_OBJ | PROPTYPE_WEAPON | PROPTYPE_DOOR)) { - tickop = objTick(prop); - } else if (prop->type == PROPTYPE_EXPLOSION) { - tickop = explosionTick(prop); - } else if (prop->type == PROPTYPE_SMOKE) { - tickop = smokeTick(prop); - } else if (prop->type == PROPTYPE_PLAYER) { - tickop = playerTickBeams(prop); - } - - if (tickop == TICKOP_CHANGEDLIST) { - next2 = next; - } else { - next2 = prop->next; - done = next2 == g_Vars.pausedprops; - - if (tickop == TICKOP_RETICK) { - propDelist(prop); - propActivateThisFrame(prop); - - if (done) { - next2 = prop; - done = false; - } - } else { - propExecuteTickOperation(prop, tickop); + do { + if (prop->type == PROPTYPE_OBJ && prop->obj->type == OBJTYPE_ESCASTEP) { + escastepTick(prop); } - } - prop = next2; - } while (!done); + prop = prop->next; + } while (prop != g_Vars.pausedprops); + } else if (g_Vars.normmplayerisrunning) { + prop = g_Vars.activeprops; + + do { + if (prop->type & (PROPTYPE_OBJ | PROPTYPE_WEAPON)) { + objTick(prop); + } + + prop = prop->next; + } while (prop != g_Vars.pausedprops); + } } diff --git a/src/game/smoke.c b/src/game/smoke.c index 934114165..d6a892150 100644 --- a/src/game/smoke.c +++ b/src/game/smoke.c @@ -580,17 +580,31 @@ u32 smokeTick(struct prop *prop) u32 smokeTickPlayer(struct prop *prop) { - Mtxf *matrix = camGetWorldToScreenMtxf(); + s32 tickop; - prop->z = -(matrix->m[0][2] * prop->pos.x + matrix->m[1][2] * prop->pos.y + matrix->m[2][2] * prop->pos.z + matrix->m[3][2]); + if (prop->flags & PROPFLAG_NOTYETTICKED) { + prop->flags &= ~PROPFLAG_NOTYETTICKED; - if (prop->z < 100) { - prop->z *= 0.5f; - } else { - prop->z -= 100; + tickop = smokeTick(prop); + + if (tickop == TICKOP_FREE) { + return tickop; + } } - prop->flags |= PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONTHISSCREENTHISTICK; + { + Mtxf *matrix = camGetWorldToScreenMtxf(); + + prop->z = -(matrix->m[0][2] * prop->pos.x + matrix->m[1][2] * prop->pos.y + matrix->m[2][2] * prop->pos.z + matrix->m[3][2]); + + if (prop->z < 100) { + prop->z *= 0.5f; + } else { + prop->z -= 100; + } + + prop->flags |= PROPFLAG_ONANYSCREENTHISTICK | PROPFLAG_ONTHISSCREENTHISTICK; + } return TICKOP_NONE; } diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 82bdd8071..663874ea9 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -197,7 +197,7 @@ void weaponInitMatrices(struct prop *weapon); void hangingmonitorInitMatrices(struct prop *hangingmonitors); void objInitMatrices(struct prop *prop); bool propCanRegen(struct prop *prop); -u32 objTick(struct prop *prop); +void objTick(struct prop *prop); s32 objTickPlayer(struct prop *prop); Gfx *propsRenderBeams(Gfx *gdl); void tvscreenSetCmdlist(struct tvscreen *screen, u32 *cmdlist);