Trickpanels: I don't even know who I am anymore

This commit is contained in:
AJ Martinez 2023-11-13 16:41:09 -07:00
parent b946a66574
commit aad6795ba7
9 changed files with 58 additions and 51 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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)<<RF_TRANSSHIFT;
release->rollangle += ANG30;
if (release->tics < 36)
release->renderflags |= (9 - release->tics/4)<<RF_TRANSSHIFT;
release->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)<<RF_TRANSSHIFT;
if (extra->tics < 18)
extra->renderflags |= (9 - extra->tics/2)<<RF_TRANSSHIFT;
extra->rollangle += ANG30;
}

View file

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

View file

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

View file

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