From aad6795ba7cae8186cfa9bfabfc915451b8a5f65 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Mon, 13 Nov 2023 16:41:09 -0700 Subject: [PATCH] Trickpanels: I don't even know who I am anymore --- src/d_player.h | 1 + src/info.c | 4 ++-- src/k_kart.c | 46 ++++++++++++++++++++++++++------------------ src/k_objects.h | 2 -- src/lua_playerlib.c | 4 ++++ src/objects/charge.c | 39 ++++++++++++++++++++----------------- src/p_mobj.c | 10 ---------- src/p_saveg.c | 2 ++ src/p_user.c | 1 + 9 files changed, 58 insertions(+), 51 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 8a0b1d9b0..a49ccb8ad 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -648,6 +648,7 @@ struct player_t respawnvars_t respawn; // Respawn info mobj_t *ringShooter; // DEZ respawner object tic_t airtime; // Used to track just air time, but has evolved over time into a general "karted" timer. Rename this variable? + tic_t lastairtime; UINT8 startboost; // (0 to 125) - Boost you get from start of race UINT8 dropdashboost; // Boost you get when holding A while respawning diff --git a/src/info.c b/src/info.c index 67f1001df..e777c2784 100644 --- a/src/info.c +++ b/src/info.c @@ -23333,7 +23333,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SCENERY, // flags S_NULL // raisestate }, @@ -23360,7 +23360,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/k_kart.c b/src/k_kart.c index c50ffd6cd..a4a2db32e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3243,11 +3243,6 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(8*FRACUNIT/10, 4*FRACUNIT, 2*SLIPTIDEHANDLING/5); // + 80% top speed, + 400% acceleration, +20% handling } - if (player->trickcharge) - { - ADDBOOST(0, FRACUNIT, 2*SLIPTIDEHANDLING/10); // 0% speed 100% accel 20% handle - } - if (player->spindashboost) // Spindash boost { const fixed_t MAXCHARGESPEED = K_GetSpindashChargeSpeed(player); @@ -3313,6 +3308,13 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(6*FRACUNIT/20, FRACUNIT, 0); // + 30% top speed, + 100% acceleration, +0% handling } + if (player->trickcharge) + { + // NB: This is an acceleration-only boost. + // If this is applied earlier in the chain, it will diminish real speed boosts. + ADDBOOST(0, FRACUNIT, 2*SLIPTIDEHANDLING/10); // 0% speed 100% accel 20% handle + } + if (player->draftpower > 0) // Drafting { // 30% - 44%, each point of speed adds 1.75% @@ -5218,16 +5220,14 @@ void K_SpawnDriftElectricSparks(player_t *player, int color, boolean shockwave) fixed_t sparkspeed = mobjinfo[MT_DRIFTELECTRICSPARK].speed; fixed_t sparkradius = 2 * shockscale * mobjinfo[MT_DRIFTELECTRICSPARK].radius; - if (player->trickcharge) + if (player->trickcharge && !shockwave) { mobj_t *release = P_SpawnMobjFromMobj(mo, 0, 0, 0, MT_CHARGERELEASE); - release->momx = mo->momx/2; - release->momy = mo->momy/2; - release->momz = mo->momz/2; - release->angle = K_MomentumAngleReal(mo); + P_SetTarget(&release->target, mo); + release->tics = 40; release->scale /= 5; - release->scalespeed = release->scale; - release->tics = 10; + release->destscale *= 2; + release->scalespeed = release->scale/2; } for (hdir = -1; hdir <= 1; hdir += 2) @@ -5259,9 +5259,14 @@ void K_SpawnDriftElectricSparks(player_t *player, int color, boolean shockwave) P_SetScale(spark, shockscale * spark->scale); if (shockwave) + { spark->frame |= FF_ADD; + } else if (player->trickcharge) - spark->tics = 10; + { + spark->tics = 20; + } + sparkangle += ANGLE_90; K_ReduceVFX(spark, player); @@ -8554,7 +8559,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->dotrickfx && !player->mo->hitlag) { int i; - S_StartSound(player->mo, sfx_trick1); + S_StartSoundAtVolume(player->mo, sfx_trick1, 255/2); if (!player->trickcharge) { @@ -8567,6 +8572,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) aura->extravalue2 = 1; else aura->renderflags |= RF_TRANS50; + aura->cvmem = leveltime; } } @@ -10003,6 +10009,7 @@ static void K_KartDrift(player_t *player, boolean onground) // And take away wavedash properties: advanced cornering demands advanced finesse player->wavedash = 0; player->wavedashboost = 0; + player->trickcharge = 0; } else if ((player->pflags & PF_DRIFTINPUT) && player->drift != 0) { @@ -12306,7 +12313,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) #define TRICKTHRESHOLD (KART_FULLTURN/4) if (aimingcompare < -TRICKTHRESHOLD) // side trick { - S_StartSound(player->mo, sfx_trick0); + S_StartSoundAtVolume(player->mo, sfx_trick0, 255/2); player->dotrickfx = true; // Calculate speed boost decay: @@ -12345,7 +12352,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } else if (aimingcompare > TRICKTHRESHOLD) // forward/back trick { - S_StartSound(player->mo, sfx_trick0); + S_StartSoundAtVolume(player->mo, sfx_trick0, 255/2); player->dotrickfx = true; // Calculate speed boost decay: @@ -12495,7 +12502,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { P_InstaThrust(player->mo, player->mo->angle, 2*abs(player->fastfall)/3 + 15*FRACUNIT); player->mo->hitlag = 3; - S_StartSound(player->mo, sfx_gshba); // TODO + S_StartSound(player->mo, sfx_gshba); player->fastfall = 0; // intentionally skip bounce player->trickcharge = 0; @@ -12510,12 +12517,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else { S_StartSound(player->mo, sfx_s23c); - K_SpawnDashDustRelease(player); UINT8 award = TICRATE - player->trickboostdecay; player->trickboost = award; - K_AwardPlayerRings(player, award, true); + K_AwardPlayerRings(player, + (TICRATE-player->trickboostdecay) * player->lastairtime/3 / TICRATE, // Scale ring award by same amount as trickboost + true); if (player->trickpanel == TRICKSTATE_FORWARD) player->trickboostpower /= 18; diff --git a/src/k_objects.h b/src/k_objects.h index 1dc774f4f..4a1dec35c 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -128,8 +128,6 @@ void Obj_GuardBreakThink(mobj_t *fx); void Obj_ChargeAuraThink(mobj_t *aura); void Obj_ChargeFallThink(mobj_t *charge); -void Obj_ChargeFlickerThink(mobj_t *flicker); -void Obj_ChargeSparkThink(mobj_t *spawk); void Obj_ChargeReleaseThink(mobj_t *release); void Obj_ChargeExtraThink(mobj_t *extra); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index e8e928d63..ec5aeaad4 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -233,6 +233,8 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->lastpickuptype); else if (fastcmp(field,"airtime")) lua_pushinteger(L, plr->airtime); + else if (fastcmp(field,"lastairtime")) + lua_pushinteger(L, plr->lastairtime); else if (fastcmp(field,"flashing")) lua_pushinteger(L, plr->flashing); else if (fastcmp(field,"spinouttimer")) @@ -725,6 +727,8 @@ static int player_set(lua_State *L) plr->airtime = luaL_checkinteger(L, 3); else if (fastcmp(field,"airtime")) plr->airtime = luaL_checkinteger(L, 3); + else if (fastcmp(field,"lastairtime")) + plr->lastairtime = luaL_checkinteger(L, 3); else if (fastcmp(field,"flashing")) plr->flashing = luaL_checkinteger(L, 3); else if (fastcmp(field,"spinouttimer")) diff --git a/src/objects/charge.c b/src/objects/charge.c index 0ca6acda4..b4124343a 100644 --- a/src/objects/charge.c +++ b/src/objects/charge.c @@ -11,6 +11,7 @@ // xval1: destruction timer // xval2: master (spawns other visuals) +// cvmem: spawn time (used to offset flash) void Obj_ChargeAuraThink (mobj_t *aura) { if (P_MobjWasRemoved(aura->target) || !aura->target->player || (aura->extravalue1 >= CHARGEAURA_BURSTTIME)) @@ -50,7 +51,7 @@ void Obj_ChargeAuraThink (mobj_t *aura) aura->renderflags |= RF_PAPERSPRITE|RF_ADD; // fuck - boolean forceinvisible = !!!(leveltime % 8); + boolean forceinvisible = !!!((leveltime - aura->cvmem) % 4); if (aura->extravalue1 || !(player->driftcharge > K_GetKartDriftSparkValueForStage(player, 3))) forceinvisible = false; @@ -67,6 +68,7 @@ void Obj_ChargeAuraThink (mobj_t *aura) mo->scale*P_RandomRange(PR_DECORATION, -1*CHARGEAURA_SPARKRADIUS, CHARGEAURA_SPARKRADIUS), MT_CHARGESPARK); spark->frame = P_RandomRange(PR_DECORATION, 1, 5); + spark->renderflags |= RF_FULLBRIGHT|RF_ADD; P_SetTarget(&spark->target, aura); P_SetScale(spark, 15*aura->scale/10); } @@ -90,7 +92,6 @@ void Obj_ChargeFallThink (mobj_t *charge) else { mobj_t *mo = charge->target; - player_t *player = mo->player; // Follow player charge->flags &= ~(MF_NOCLIPTHING); @@ -116,29 +117,31 @@ void Obj_ChargeFallThink (mobj_t *charge) } } -void Obj_ChargeFlickerThink (mobj_t *flicker) -{ - // xd -} - -void Obj_ChargeSparkThink (mobj_t *spark) -{ - // xd - spark->renderflags |= RF_FULLBRIGHT|RF_ADD; -} - +// xval1: lifetime (used to offset from tracked player) void Obj_ChargeReleaseThink (mobj_t *release) { release->renderflags &= ~RF_TRANSMASK; - if (release->tics < 10) - release->renderflags |= (9 - release->tics)<rollangle += ANG30; + if (release->tics < 36) + release->renderflags |= (9 - release->tics/4)<rollangle += ANG15/2; + + if (P_MobjWasRemoved(release->target) || !release->target->player) + return; + + release->extravalue1++; + + fixed_t off = 8 * release->extravalue1 * release->target->scale; + angle_t ang = K_MomentumAngle(release->target) + ANGLE_180; + fixed_t xoff = FixedMul(off, FINECOSINE(ang >> ANGLETOFINESHIFT)); + fixed_t yoff = FixedMul(off, FINESINE(ang >> ANGLETOFINESHIFT)); + + P_MoveOrigin(release, release->target->x + xoff, release->target->y + yoff, release->target->z + release->target->height/2); } void Obj_ChargeExtraThink (mobj_t *extra) { extra->renderflags &= ~RF_TRANSMASK; - if (extra->tics < 10) - extra->renderflags |= (9 - extra->tics)<tics < 18) + extra->renderflags |= (9 - extra->tics/2)<rollangle += ANG30; } \ No newline at end of file diff --git a/src/p_mobj.c b/src/p_mobj.c index 4305f6cb7..715970404 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8861,16 +8861,6 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_ChargeFallThink(mobj); break; } - case MT_CHARGEFLICKER: - { - Obj_ChargeFlickerThink(mobj); - break; - } - case MT_CHARGESPARK: - { - Obj_ChargeSparkThink(mobj); - break; - } case MT_CHARGERELEASE: { Obj_ChargeReleaseThink(mobj); diff --git a/src/p_saveg.c b/src/p_saveg.c index 3ccab24d5..a733ab159 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -401,6 +401,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].currentwaypoint)); WRITEUINT32(save->p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); WRITEUINT32(save->p, players[i].airtime); + WRITEUINT32(save->p, players[i].lastairtime); WRITEUINT8(save->p, players[i].startboost); WRITEUINT8(save->p, players[i].dropdashboost); @@ -936,6 +937,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].currentwaypoint = (waypoint_t *)(size_t)READUINT32(save->p); players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save->p); players[i].airtime = READUINT32(save->p); + players[i].lastairtime = READUINT32(save->p); players[i].startboost = READUINT8(save->p); players[i].dropdashboost = READUINT8(save->p); diff --git a/src/p_user.c b/src/p_user.c index a73a8124a..2c36e7f97 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4084,6 +4084,7 @@ void P_PlayerThink(player_t *player) if (P_IsObjectOnGround(player->mo) && !P_PlayerInPain(player)) // This isn't airtime, but it's control loss all the same. { + player->lastairtime = player->airtime; player->airtime = 0; } else