From 628ac7c5d58e5d6985898156a9f940f43a7de43c Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 8 Sep 2024 21:24:06 +1000 Subject: [PATCH] Identify matmot and gs_float1 properties --- src/game/bondgun.c | 193 ++++++++++++++++++++++---------------------- src/game/gset.c | 2 +- src/game/gunfx.c | 4 +- src/include/types.h | 24 +++++- 4 files changed, 120 insertions(+), 103 deletions(-) diff --git a/src/game/bondgun.c b/src/game/bondgun.c index cc8b54efc..dca320706 100644 --- a/src/game/bondgun.c +++ b/src/game/bondgun.c @@ -1631,23 +1631,22 @@ s32 bgun0f09a3f8(struct hand *hand, struct funcdef *func) if ((func->type & 0xff00) == 0x100) { struct funcdef_shootauto *autofunc = (struct funcdef_shootauto *) func; - if (autofunc->turretaccel > 0) { - if (hand->gs_float1 < 1) { - hand->gs_float1 += LVUPDATE60FREAL() / autofunc->turretaccel; + if (autofunc->turretaccel > 0) { // reaper + if (hand->gs_barrelspeedfrac < 1) { + hand->gs_barrelspeedfrac += LVUPDATE60FREAL() / autofunc->turretaccel; - if (hand->gs_float1 > 1) { - hand->gs_float1 = 1; - return 1; + if (hand->gs_barrelspeedfrac > 1) { + hand->gs_barrelspeedfrac = 1; } } } else { - hand->gs_float1 = 1; + hand->gs_barrelspeedfrac = 1; } return 1; } - hand->gs_float1 = 1; + hand->gs_barrelspeedfrac = 1; if (smallburst) { if (hand->burstbullets > 0) { @@ -1687,19 +1686,19 @@ s32 bgun0f09a3f8(struct hand *hand, struct funcdef *func) if ((func->type & 0xff00) == (INVENTORYFUNCTYPE_SHOOT_AUTOMATIC & 0xff00)) { struct funcdef_shootauto *autofunc = (struct funcdef_shootauto *) func; - if (autofunc->turretdecel > 0) { - if (hand->gs_float1 > 0) { - hand->gs_float1 -= LVUPDATE60FREAL() / autofunc->turretdecel; + if (autofunc->turretdecel > 0) { // reaper + if (hand->gs_barrelspeedfrac > 0) { + hand->gs_barrelspeedfrac -= LVUPDATE60FREAL() / autofunc->turretdecel; - if (hand->gs_float1 < 0) { - hand->gs_float1 = 0; + if (hand->gs_barrelspeedfrac < 0) { + hand->gs_barrelspeedfrac = 0; return -1; } return 1; } } else { - hand->gs_float1 = 0; + hand->gs_barrelspeedfrac = 0; } return -1; @@ -1725,7 +1724,7 @@ void bgun0f09a6f8(struct handweaponinfo *info, s32 handnum, struct hand *hand, s f32 tmp; f32 tmp2; - tmp = autofunc->initialrpm + (autofunc->maxrpm - autofunc->initialrpm) * hand->gs_float1; + tmp = autofunc->initialrpm + (autofunc->maxrpm - autofunc->initialrpm) * hand->gs_barrelspeedfrac; tmp2 = tmp / 60.0f * (LVUPDATE60FREAL() / 60.0f) + hand->shotremainder; hand->shotstotake = tmp2; @@ -1827,9 +1826,9 @@ void bgun0f09a6f8(struct handweaponinfo *info, s32 handnum, struct hand *hand, s hand->lastshootframe60 = g_Vars.lvframe60; if (hand->gset.weaponnum == WEAPON_MAULER && handle) { - s32 matmot = hand->matmot1; + s32 charge = hand->mm_maulercharge; f32 tmp; - f32 frac = matmot / 3.0f; + f32 frac = charge / 3.0f; if (frac > 1.0f) { frac = 1.0f; @@ -2026,7 +2025,7 @@ bool bgun_tick_inc_attacking_shoot(struct handweaponinfo *info, s32 handnum, str main_override_variable("gkef", &var80070128); if (hand->statecycles == 0) { - hand->gs_float1 = 0; + hand->gs_barrelspeedfrac = 0; if (func->fire_animation) { bgun_start_animation(func->fire_animation, handnum, hand); @@ -2044,7 +2043,7 @@ bool bgun_tick_inc_attacking_shoot(struct handweaponinfo *info, s32 handnum, str hand->stateminor = HANDSTATEMINOR_ATTACK_SHOOT_1; } - hand->matmot2 = hand->gs_float1; + hand->mm_reaperspeedaim = hand->gs_barrelspeedfrac; } if (hand->stateminor == HANDSTATEMINOR_ATTACK_SHOOT_1) { @@ -2055,7 +2054,7 @@ bool bgun_tick_inc_attacking_shoot(struct handweaponinfo *info, s32 handnum, str f32 floats[12]; if (autofunc->vibrationstart != NULL && autofunc->vibrationmax != NULL) { - func0f097b64(autofunc->vibrationstart, autofunc->vibrationmax, hand->gs_float1, floats); + func0f097b64(autofunc->vibrationstart, autofunc->vibrationmax, hand->gs_barrelspeedfrac, floats); func0f097b40(hand->upgrademult, floats, hand->finalmult); } } @@ -2068,10 +2067,10 @@ bool bgun_tick_inc_attacking_shoot(struct handweaponinfo *info, s32 handnum, str hand->stateminor = HANDSTATEMINOR_ATTACK_SHOOT_2; } - hand->matmot2 = hand->gs_float1; + hand->mm_reaperspeedaim = hand->gs_barrelspeedfrac; - if (hand->triggeron && hand->matmot2 < 0.4f) { - hand->matmot2 = 0.4f; + if (hand->triggeron && hand->mm_reaperspeedaim < 0.4f) { + hand->mm_reaperspeedaim = 0.4f; } if (hand->triggerreleased) { @@ -2092,14 +2091,14 @@ bool bgun_tick_inc_attacking_shoot(struct handweaponinfo *info, s32 handnum, str canfireagain = false; } - hand->matmot2 = hand->gs_float1; + hand->mm_reaperspeedaim = hand->gs_barrelspeedfrac; if (canfireagain && !hand->triggeron) { - hand->matmot2 = 0; + hand->mm_reaperspeedaim = 0; } if (hand->gset.weaponnum == WEAPON_MAULER) { - hand->matmot1 = 0; + hand->mm_maulercharge = 0; } return canfireagain; @@ -2230,7 +2229,7 @@ bool bgun_tick_inc_attacking_melee(s32 handnum, struct hand *hand) if (hand->gset.weaponnum == WEAPON_REAPER) { if (hand->statecycles == 0) { - hand->matmot2 = 0.1f; + hand->mm_reaperspeedaim = 0.1f; hand->burstbullets = 0; } @@ -2239,13 +2238,13 @@ bool bgun_tick_inc_attacking_melee(s32 handnum, struct hand *hand) hand->burstbullets++; if (hand->triggeron) { - hand->matmot2 += 0.01f * LVUPDATE60FREAL(); + hand->mm_reaperspeedaim += 0.01f * LVUPDATE60FREAL(); - if (hand->matmot2 > 1) { - hand->matmot2 = 1; + if (hand->mm_reaperspeedaim > 1) { + hand->mm_reaperspeedaim = 1; } } else { - hand->matmot2 = 0; + hand->mm_reaperspeedaim = 0; return true; } @@ -5298,7 +5297,7 @@ void bgun_tick_switch2(void) } if (weaponnum == WEAPON_RCP120) { - s32 amount = player->hands[HAND_RIGHT].matmot1; + s32 amount = player->hands[HAND_RIGHT].mm_rcpremainder; if (amount > player->ammoheldarr[ctrl->ammotypes[0]]) { amount = player->ammoheldarr[ctrl->ammotypes[0]]; @@ -6734,7 +6733,7 @@ void bgun_update_lasersight(struct hand *hand, struct modeldef *modeldef, s32 ha } /** - * Increment the main barrel spinning, play sounds and (probably) fire shots. + * Increment the barrel spinning and play sounds. */ void bgun_update_reaper(struct hand *hand, struct modeldef *modeldef) { @@ -6745,59 +6744,64 @@ void bgun_update_reaper(struct hand *hand, struct modeldef *modeldef) node = model_get_part(modeldef, MODELPART_REAPER_002C); - if (hand->matmot3 <= hand->matmot2) { - if (hand->matmot2 < 0.0f) { - hand->matmot2 += 0.01f * LVUPDATE60FREAL(); + if (hand->mm_reaperspeedcur <= hand->mm_reaperspeedaim) { + // The barrel is stopped, is accelerating, is at full speed, + // or is going in reverse after decelerating past the zero point. + if (hand->mm_reaperspeedaim < 0.0f) { + // The barrel is in reverse, so manually move the aim speed up towards zero. + hand->mm_reaperspeedaim += 0.01f * LVUPDATE60FREAL(); - if (hand->matmot2 > 0.0f) { - hand->matmot2 = 0.0f; + if (hand->mm_reaperspeedaim > 0.0f) { + hand->mm_reaperspeedaim = 0.0f; } } - hand->matmot3 = hand->matmot2; + hand->mm_reaperspeedcur = hand->mm_reaperspeedaim; } else { - f12 = LVUPDATE60FREAL() * 0.005; + // The barrel is decelerating. + f12 = LVUPDATE60FREAL() * (1.0 / 200.0); - if (hand->matmot2 < 0.0000001f) { - hand->matmot2 = -0.14f; + if (hand->mm_reaperspeedaim < 0.0000001f) { + // Make the barrel go backwards + hand->mm_reaperspeedaim = -0.14f; - if (hand->matmot3 < 0.15f) { + if (hand->mm_reaperspeedcur < 0.15f) { f12 *= 4.0f; } } - f2 = hand->matmot3 - hand->matmot2; + f2 = hand->mm_reaperspeedcur - hand->mm_reaperspeedaim; if (f12 < f2) { f2 = f12; } - hand->matmot3 -= f2; + hand->mm_reaperspeedcur -= f2; } - if (hand->matmot3 < 0.0f) { - hand->matmot1 = hand->matmot1 - (1.0f - cosf(hand->matmot3 * DTOR(180))) * 0.5f * LVUPDATE60FREAL() * 0.2f; + if (hand->mm_reaperspeedcur < 0.0f) { + hand->mm_reaperrot = hand->mm_reaperrot - (1.0f - cosf(hand->mm_reaperspeedcur * DTOR(180))) * 0.5f * LVUPDATE60FREAL() * 0.2f; } else { - hand->matmot1 = hand->matmot1 + (1.0f - cosf(hand->matmot3 * DTOR(180))) * 0.5f * LVUPDATE60FREAL() * 0.2f; + hand->mm_reaperrot = hand->mm_reaperrot + (1.0f - cosf(hand->mm_reaperspeedcur * DTOR(180))) * 0.5f * LVUPDATE60FREAL() * 0.2f; } - tmp = hand->matmot1 / 6.2831802368164f; - hand->matmot1 -= tmp * 6.2831802368164f; - var8009d140 = hand->matmot1; + tmp = hand->mm_reaperrot / (3.14159f * 2); + hand->mm_reaperrot -= tmp * (3.14159f * 2); + var8009d140 = hand->mm_reaperrot; - if (hand->audiohandle == NULL && hand->matmot3 > 0.1f && g_Vars.lvupdate240 != 0) { + if (hand->audiohandle == NULL && hand->mm_reaperspeedcur > 0.1f && g_Vars.lvupdate240 != 0) { snd_start(var80095200, SFX_805E, &hand->audiohandle, -1, -1, -1.0f, -1, -1); } if (hand->audiohandle != NULL) { - f32 sp34 = hand->matmot3 / 0.50f + 0.4f; + f32 sp34 = hand->mm_reaperspeedcur / 0.50f + 0.4f; s32 volume = AL_VOL_FULL; - if (hand->matmot3 < 0.1f) { + if (hand->mm_reaperspeedcur < 0.1f) { audioStop(hand->audiohandle); } else { - if (hand->matmot3 < 0.6f) { - volume = (hand->matmot3 - 0.1f) * AL_VOL_FULL / 0.5f; + if (hand->mm_reaperspeedcur < 0.6f) { + volume = (hand->mm_reaperspeedcur - 0.1f) * AL_VOL_FULL / 0.5f; } audioPostEvent(hand->audiohandle, AL_SNDP_VOL_EVT, volume); @@ -6913,18 +6917,18 @@ void bgun_update_devastator(struct hand *hand, u8 *allocation, struct modeldef * void bgun_update_shotgun(struct hand *hand, u8 *allocation, bool *arg2, struct modeldef *modeldef) { if (hand->flashon) { - hand->matmot1 = 1.0f; + hand->mm_shotgunfrac = 1.0f; } - if (hand->matmot1 > 0.0f) { - hand->matmot1 -= LVUPDATE60FREAL() / 6.0f; + if (hand->mm_shotgunfrac > 0.0f) { + hand->mm_shotgunfrac -= LVUPDATE60FREAL() / 6.0f; - if (hand->matmot1 < 0.01f) { - hand->matmot1 = 0.0f; + if (hand->mm_shotgunfrac < 0.01f) { + hand->mm_shotgunfrac = 0.0f; } } - if (hand->matmot1 > 0.0f) { + if (hand->mm_shotgunfrac > 0.0f) { s32 sp34; s32 sp28[3] = {0, 0, 0}; struct modelnode *node = model_get_part(modeldef, MODELPART_SHOTGUN_0050); @@ -6934,9 +6938,9 @@ void bgun_update_shotgun(struct hand *hand, u8 *allocation, bool *arg2, struct m if (node) { sp34 = model_find_node_mtx_index(node, 0); - mtx00015ea8((1.0f - hand->matmot1) * 8.0f + 0.5f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); - mtx00015df0((1.0f - hand->matmot1) * 3.0f + 1.0f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); - mtx00015e4c((1.0f - hand->matmot1) * 3.0f + 1.0f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); + mtx00015ea8((1.0f - hand->mm_shotgunfrac) * 8.0f + 0.5f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); + mtx00015df0((1.0f - hand->mm_shotgunfrac) * 3.0f + 1.0f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); + mtx00015e4c((1.0f - hand->mm_shotgunfrac) * 3.0f + 1.0f, (Mtxf *)((uintptr_t)allocation + sp34 * sizeof(Mtxf))); } } } @@ -6948,12 +6952,9 @@ void bgun_update_laser(struct hand *hand) snd_start(var80095200, SFX_LASER_STREAM, &hand->audiohandle, -1, -1, -1, -1, -1); } - hand->matmot1 = 1; - return; - } - - if (hand->matmot1 > 0) { - hand->matmot1 -= LVUPDATE60FREAL() / 10.0f; + hand->mm_lasertype = 1; + } else if (hand->mm_lasertype > 0) { + hand->mm_lasertype -= LVUPDATE60FREAL() / 10.0f; } else if (hand->audiohandle != NULL && sndGetState(hand->audiohandle) != AL_STOPPED) { audioStop(hand->audiohandle); } @@ -7893,32 +7894,32 @@ void bgun_tick_mauler_charge(void) if (hand->inuse) { if (bgun_is_reloading(hand)) { // Reloading - reset charge amount - hand->matmot1 = 0; + hand->mm_maulercharge = 0; } else if (hand->gset.weaponfunc == FUNC_SECONDARY) { // Charging or fully charged - s32 oldvalue = hand->matmot1; + s32 oldvalue = hand->mm_maulercharge; s32 newvalue; - if (hand->loadedammo[0] >= 2 && hand->matmot1 < 5) { + if (hand->loadedammo[0] >= 2 && hand->mm_maulercharge < 5) { charging = true; - hand->matmot1 += g_Vars.lvupdate60freal * 0.05f; + hand->mm_maulercharge += g_Vars.lvupdate60freal * 0.05f; } - if (hand->matmot1 > 5) { - hand->matmot1 = 5; + if (hand->mm_maulercharge > 5) { + hand->mm_maulercharge = 5; } - newvalue = hand->matmot1; + newvalue = hand->mm_maulercharge; if (oldvalue != newvalue && hand->loadedammo[0] >= 2) { hand->loadedammo[0]--; } } else { // Using primary function - make the charge wear off slowly - hand->matmot1 -= g_Vars.lvupdate60freal * 0.005f; + hand->mm_maulercharge -= g_Vars.lvupdate60freal * 0.005f; - if (hand->matmot1 < 0) { - hand->matmot1 = 0; + if (hand->mm_maulercharge < 0) { + hand->mm_maulercharge = 0; } } @@ -7939,16 +7940,16 @@ void bgun_tick_mauler_charge(void) * This is not yet confirmed. */ if (hand->audiohandle == NULL - && hand->matmot1 > 0.1f + && hand->mm_maulercharge > 0.1f && charging && g_Vars.lvupdate240 != 0) { snd_start(var80095200, SFX_MAULER_CHARGE, &hand->audiohandle, -1, -1, -1, -1, -1); } if (hand->audiohandle) { - f32 speed = 0.5f + hand->matmot1 / 3.0f + sinf(g_20SecIntervalFrac * DTOR(180) * 32.0f) * 0.03f; + f32 speed = 0.5f + hand->mm_maulercharge / 3.0f + sinf(g_20SecIntervalFrac * DTOR(180) * 32.0f) * 0.03f; - if (hand->matmot1 < 0.1f || !charging) { + if (hand->mm_maulercharge < 0.1f || !charging) { audioStop(hand->audiohandle); } else { audioPostEvent(hand->audiohandle, AL_SNDP_PITCH_EVT, *(s32 *)&speed); @@ -8052,21 +8053,21 @@ void bgun_tick_gameplay2(void) // Handle RCP120 cloak ammo usage if ((chr->hidden & CHRHFLAG_CLOAKED) && chr->cloakfadefinished == true) { hand = &player->hands[HAND_RIGHT]; - hand->matmot1 += LVUPDATE60FREAL() * 0.4f; + hand->mm_rcpremainder += LVUPDATE60FREAL() * 0.4f; - if (hand->matmot1 > 1.0f) { - s32 usedqty = hand->matmot1; + if (hand->mm_rcpremainder > 1.0f) { + s32 usedqty = hand->mm_rcpremainder; if (usedqty > hand->loadedammo[0]) { usedqty = hand->loadedammo[0]; } - hand->matmot1 -= usedqty; + hand->mm_rcpremainder -= usedqty; hand->loadedammo[0] -= usedqty; // If out of ammo, turn off cloak if (hand->loadedammo[0] == 0 && hand->state != HANDSTATE_RELOAD) { - s32 stilltogo = hand->matmot1; + s32 stilltogo = hand->mm_rcpremainder; if (stilltogo > player->ammoheldarr[player->gunctrl.ammotypes[0]]) { g_Vars.currentplayer->devicesactive &= ~DEVICE_CLOAKRCP120; @@ -8084,25 +8085,25 @@ void bgun_tick_gameplay2(void) // I think this is handling situations where the player has turned off // RCP120 cloak but there's still a bit of ammo to be subtracted on // this tick. - if (hand->matmot1 > 1.0f) { - s32 usedqty = hand->matmot1; + if (hand->mm_rcpremainder > 1.0f) { + s32 usedqty = hand->mm_rcpremainder; if (usedqty > hand->loadedammo[0]) { usedqty = hand->loadedammo[0]; } - hand->matmot1 -= usedqty; + hand->mm_rcpremainder -= usedqty; hand->loadedammo[0] -= usedqty; - if (hand->matmot1 > 1.0f) { - s32 usedqty = hand->matmot1; + if (hand->mm_rcpremainder > 1.0f) { + s32 usedqty = hand->mm_rcpremainder; if (usedqty > player->ammoheldarr[player->gunctrl.ammotypes[0]]) { usedqty = player->ammoheldarr[player->gunctrl.ammotypes[0]]; } player->ammoheldarr[player->gunctrl.ammotypes[0]] -= usedqty; - hand->matmot1 = 0; + hand->mm_rcpremainder = 0; } } } @@ -8294,7 +8295,7 @@ void bgun_render(Gfx **gdlptr) colour = renderdata.envcolour; if (hand->gset.weaponnum == WEAPON_MAULER) { - u32 weight = hand->matmot1 * 50.0f; + u32 weight = hand->mm_maulercharge * 50.0f; renderdata.envcolour = colour_blend(0xff00007f, renderdata.envcolour, weight); } } diff --git a/src/game/gset.c b/src/game/gset.c index 97956608b..39e2a3d9c 100644 --- a/src/game/gset.c +++ b/src/game/gset.c @@ -415,7 +415,7 @@ void gset_populate(s32 handnum, struct gset *gset) gset->upgradewant = g_Vars.currentplayer->hands[handnum].gset.upgradewant; if (gset->weaponnum == WEAPON_MAULER) { - gset->maulercharge = g_Vars.currentplayer->hands[handnum].matmot1 * 10.0f; + gset->maulercharge = g_Vars.currentplayer->hands[handnum].mm_maulercharge * 10.0f; } if (gset->weaponnum == WEAPON_LASER) { diff --git a/src/game/gunfx.c b/src/game/gunfx.c index ab29d27f4..77e53023e 100644 --- a/src/game/gunfx.c +++ b/src/game/gunfx.c @@ -125,7 +125,7 @@ void beam_create_for_hand(s32 handnum) beam_create(beam, weaponnum, &hand->muzzlepos, &hand->hitpos); if (beam->weaponnum == WEAPON_MAULER) { - beam->weaponnum = -3 - (s32)player->hands[handnum].matmot1; + beam->weaponnum = -3 - (s32) player->hands[handnum].mm_lasertype; } if (player->prop->chr && PLAYERCOUNT() >= 2) { @@ -157,7 +157,7 @@ void beam_create_for_hand(s32 handnum) beam_create(&g_Fireslots[chr->fireslots[handnum]].beam, weaponnum, &player->chrmuzzlelastpos[handnum], &hand->hitpos); if (g_Fireslots[chr->fireslots[handnum]].beam.weaponnum == WEAPON_MAULER) { - g_Fireslots[chr->fireslots[handnum]].beam.weaponnum = -3 - (s32)player->hands[handnum].matmot1; + g_Fireslots[chr->fireslots[handnum]].beam.weaponnum = -3 - (s32) player->hands[handnum].mm_lasertype; } } } diff --git a/src/include/types.h b/src/include/types.h index dad4ab660..d1dd28934 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -2128,9 +2128,22 @@ struct hand { /*0x0868*/ f32 angledamper; /*0x086c*/ f32 lastrotangx; /*0x0870*/ f32 lastrotangy; - /*0x0874*/ f32 matmot1; - /*0x0878*/ f32 matmot2; - /*0x087c*/ f32 matmot3; + union { + /*0x0874*/ f32 matmot1; + /*0x0874*/ f32 mm_lasertype; + /*0x0874*/ f32 mm_maulercharge; // 0 to 5 + /*0x0874*/ f32 mm_rcpremainder; + /*0x0874*/ f32 mm_reaperrot; // radians, 0 - 6.28 + /*0x0874*/ f32 mm_shotgunfrac; + }; + union { + /*0x0878*/ f32 matmot2; + /*0x0878*/ f32 mm_reaperspeedaim; // -0.1 to 1.0 + }; + union { + /*0x087c*/ f32 matmot3; + /*0x087c*/ f32 mm_reaperspeedcur; // -0.1 to 1.0 + }; /*0x0880*/ u32 unk0880; /*0x0884*/ u32 unk0884; /*0x0888*/ f32 loadslide; @@ -2191,7 +2204,10 @@ struct hand { /*0x0c50*/ s32 statecycles; /*0x0c54*/ s32 statelastframe; /*0x0c58*/ Mtxf muzzlemat; - /*0x0c98*/ f32 gs_float1; + union { + /*0x0c98*/ f32 gs_float1; + /*0x0c98*/ f32 gs_barrelspeedfrac; + }; /*0x0c9c*/ f32 gs_float2; /*0x0ca0*/ f32 gs_float3; /*0x0ca4*/ f32 gs_float4;