Cooler afterimages

Players afterimages have been colorized & flicker, ala Sonic Advance 2. The number of afterimages you get extends with how many boosts you have stacked.

Item afterimages have also been given a basic colorization.
This commit is contained in:
TehRealSalt 2019-05-04 21:04:06 -04:00
parent e3c96c28c6
commit e087d18402
5 changed files with 101 additions and 22 deletions

View file

@ -304,6 +304,7 @@ typedef enum
k_brakestop, // Wait until you've made a complete stop for a few tics before letting brake go in reverse. k_brakestop, // Wait until you've made a complete stop for a few tics before letting brake go in reverse.
k_waterskip, // Water skipping counter k_waterskip, // Water skipping counter
k_dashpadcooldown, // Separate the vanilla SA-style dash pads from using pw_flashing k_dashpadcooldown, // Separate the vanilla SA-style dash pads from using pw_flashing
k_numboosts, // Count of how many boosts are being stacked, for after image spawning
k_boostpower, // Base boost value, for offroad k_boostpower, // Base boost value, for offroad
k_speedboost, // Boost value smoothing for max speed k_speedboost, // Boost value smoothing for max speed
k_accelboost, // Boost value smoothing for acceleration k_accelboost, // Boost value smoothing for acceleration

View file

@ -8411,6 +8411,7 @@ static const char *const KARTSTUFF_LIST[] = {
"BRAKESTOP", "BRAKESTOP",
"WATERSKIP", "WATERSKIP",
"DASHPADCOOLDOWN", "DASHPADCOOLDOWN",
"NUMBOOSTS",
"BOOSTPOWER", "BOOSTPOWER",
"SPEEDBOOST", "SPEEDBOOST",
"ACCELBOOST", "ACCELBOOST",

View file

@ -2189,7 +2189,7 @@ static void K_GetKartBoostPower(player_t *player)
{ {
fixed_t boostpower = FRACUNIT; fixed_t boostpower = FRACUNIT;
fixed_t speedboost = 0, accelboost = 0; fixed_t speedboost = 0, accelboost = 0;
UINT8 boostfactor = 1; UINT8 numboosts = 0;
if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] == 1) // Slow down after you've been bumped if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow] == 1) // Slow down after you've been bumped
{ {
@ -2206,9 +2206,9 @@ static void K_GetKartBoostPower(player_t *player)
boostpower = (4*boostpower)/5; boostpower = (4*boostpower)/5;
#define ADDBOOST(s,a) { \ #define ADDBOOST(s,a) { \
speedboost += (s) / boostfactor; \ numboosts++; \
accelboost += (a) / boostfactor; \ speedboost += (s) / numboosts; \
boostfactor++; \ accelboost += (a) / numboosts; \
} }
if (player->kartstuff[k_levelbooster]) // Level boosters if (player->kartstuff[k_levelbooster]) // Level boosters
@ -2234,10 +2234,14 @@ static void K_GetKartBoostPower(player_t *player)
// Grow's design is weird with booster stacking. // Grow's design is weird with booster stacking.
// We'll see how to replace its design BEFORE v2 gets released. // We'll see how to replace its design BEFORE v2 gets released.
speedboost += (FRACUNIT/5); // + 20% speedboost += (FRACUNIT/5); // + 20%
//numboosts++; // Don't add any boost afterimages to Grow
} }
if (player->kartstuff[k_draftpower] > 0) // Drafting if (player->kartstuff[k_draftpower] > 0) // Drafting
{
speedboost += (player->kartstuff[k_draftpower]) / 3; // + 0-33.3% speedboost += (player->kartstuff[k_draftpower]) / 3; // + 0-33.3%
numboosts++; // (Drafting suffers no boost stack penalty!)
}
player->kartstuff[k_boostpower] = boostpower; player->kartstuff[k_boostpower] = boostpower;
@ -2248,6 +2252,7 @@ static void K_GetKartBoostPower(player_t *player)
player->kartstuff[k_speedboost] += (speedboost - player->kartstuff[k_speedboost]) / (TICRATE/2); player->kartstuff[k_speedboost] += (speedboost - player->kartstuff[k_speedboost]) / (TICRATE/2);
player->kartstuff[k_accelboost] = accelboost; player->kartstuff[k_accelboost] = accelboost;
player->kartstuff[k_numboosts] = numboosts;
} }
fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower) fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower)
@ -2265,7 +2270,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower)
finalspeed = FixedMul(k_speed<<14, g_cc); finalspeed = FixedMul(k_speed<<14, g_cc);
if (player->mo && !P_MobjWasRemoved(player->mo) if (player->mo && !P_MobjWasRemoved(player->mo))
finalspeed = FixedMul(finalspeed, player->mo->scale); finalspeed = FixedMul(finalspeed, player->mo->scale);
if (doboostpower) if (doboostpower)
@ -4872,11 +4877,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
} }
else if (player->kartstuff[k_invincibilitytimer]) // setting players to use the star colormap and spawning afterimages else if (player->kartstuff[k_invincibilitytimer]) // setting players to use the star colormap and spawning afterimages
{ {
mobj_t *ghost;
player->mo->colorized = true; player->mo->colorized = true;
ghost = P_SpawnGhostMobj(player->mo);
ghost->fuse = 4;
ghost->frame |= FF_FULLBRIGHT;
} }
else if (player->kartstuff[k_growshrinktimer]) // Ditto, for grow/shrink else if (player->kartstuff[k_growshrinktimer]) // Ditto, for grow/shrink
{ {
@ -4927,6 +4928,23 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
player->kartstuff[k_dashpadcooldown]--; player->kartstuff[k_dashpadcooldown]--;
} }
if (player->kartstuff[k_numboosts] > 0) // Booating after images
{
mobj_t *ghost;
ghost = P_SpawnGhostMobj(player->mo);
ghost->extravalue1 = player->kartstuff[k_numboosts]+1;
ghost->extravalue2 = (leveltime % ghost->extravalue1);
ghost->fuse = ghost->extravalue1;
ghost->frame |= FF_FULLBRIGHT;
ghost->colorized = true;
//ghost->color = player->skincolor;
//ghost->momx = (3*player->mo->momx)/4;
//ghost->momy = (3*player->mo->momy)/4;
//ghost->momz = (3*player->mo->momz)/4;
if (leveltime & 1)
ghost->flags2 |= MF2_DONTDRAW;
}
// DKR style camera for boosting // DKR style camera for boosting
if (player->kartstuff[k_boostcam] != 0 || player->kartstuff[k_destboostcam] != 0) if (player->kartstuff[k_boostcam] != 0 || player->kartstuff[k_destboostcam] != 0)
{ {

View file

@ -7953,8 +7953,8 @@ void P_MobjThinker(mobj_t *mobj)
else else
{ {
fixed_t finalspeed = mobj->movefactor; fixed_t finalspeed = mobj->movefactor;
mobj_t *ghost = P_SpawnGhostMobj(mobj);
P_SpawnGhostMobj(mobj); ghost->colorized = true; // already has color!
mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy);
if (mobj->health <= 5) if (mobj->health <= 5)
@ -7989,8 +7989,13 @@ void P_MobjThinker(mobj_t *mobj)
fixed_t topspeed = mobj->movefactor; fixed_t topspeed = mobj->movefactor;
fixed_t distbarrier = 512*mapobjectscale; fixed_t distbarrier = 512*mapobjectscale;
fixed_t distaway; fixed_t distaway;
mobj_t *ghost = P_SpawnGhostMobj(mobj);
P_SpawnGhostMobj(mobj); if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
ghost->color = mobj->target->player->skincolor;
ghost->colorized = true;
}
if (mobj->threshold > 0) if (mobj->threshold > 0)
mobj->threshold--; mobj->threshold--;
@ -8054,7 +8059,14 @@ void P_MobjThinker(mobj_t *mobj)
} }
else else
{ {
P_SpawnGhostMobj(mobj); mobj_t *ghost = P_SpawnGhostMobj(mobj);
if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
ghost->color = mobj->target->player->skincolor;
ghost->colorized = true;
}
mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy); mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy);
P_InstaThrust(mobj, mobj->angle, mobj->movefactor); P_InstaThrust(mobj, mobj->angle, mobj->movefactor);
@ -8079,14 +8091,25 @@ void P_MobjThinker(mobj_t *mobj)
case MT_BANANA: case MT_BANANA:
case MT_EGGMANITEM: case MT_EGGMANITEM:
mobj->friction = ORIG_FRICTION/4; mobj->friction = ORIG_FRICTION/4;
if (mobj->momx || mobj->momy) if (mobj->momx || mobj->momy)
P_SpawnGhostMobj(mobj); {
mobj_t *ghost = P_SpawnGhostMobj(mobj);
if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
ghost->color = mobj->target->player->skincolor;
ghost->colorized = true;
}
}
if (P_IsObjectOnGround(mobj) && mobj->health > 1) if (P_IsObjectOnGround(mobj) && mobj->health > 1)
{ {
S_StartSound(mobj, mobj->info->activesound); S_StartSound(mobj, mobj->info->activesound);
mobj->momx = mobj->momy = 0; mobj->momx = mobj->momy = 0;
mobj->health = 1; mobj->health = 1;
} }
if (mobj->threshold > 0) if (mobj->threshold > 0)
mobj->threshold--; mobj->threshold--;
break; break;
@ -8094,18 +8117,38 @@ void P_MobjThinker(mobj_t *mobj)
indirectitemcooldown = 20*TICRATE; indirectitemcooldown = 20*TICRATE;
/* FALLTHRU */ /* FALLTHRU */
case MT_BALLHOG: case MT_BALLHOG:
P_SpawnGhostMobj(mobj)->fuse = 3; {
if (mobj->threshold > 0) mobj_t *ghost = P_SpawnGhostMobj(mobj);
mobj->threshold--; ghost->fuse = 3;
if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
ghost->color = mobj->target->player->skincolor;
ghost->colorized = true;
}
if (mobj->threshold > 0)
mobj->threshold--;
}
break; break;
case MT_SINK: case MT_SINK:
if (mobj->momx || mobj->momy) if (mobj->momx || mobj->momy)
P_SpawnGhostMobj(mobj); {
mobj_t *ghost = P_SpawnGhostMobj(mobj);
if (mobj->target && !P_MobjWasRemoved(mobj->target) && mobj->target->player)
{
ghost->color = mobj->target->player->skincolor;
ghost->colorized = true;
}
}
if (P_IsObjectOnGround(mobj)) if (P_IsObjectOnGround(mobj))
{ {
S_StartSound(mobj, mobj->info->deathsound); S_StartSound(mobj, mobj->info->deathsound);
P_SetMobjState(mobj, S_NULL); P_SetMobjState(mobj, S_NULL);
} }
if (mobj->threshold > 0) if (mobj->threshold > 0)
mobj->threshold--; mobj->threshold--;
break; break;
@ -8116,7 +8159,10 @@ void P_MobjThinker(mobj_t *mobj)
mobj->color = SKINCOLOR_KETCHUP; mobj->color = SKINCOLOR_KETCHUP;
if (mobj->momx || mobj->momy) if (mobj->momx || mobj->momy)
P_SpawnGhostMobj(mobj); {
mobj_t *ghost = P_SpawnGhostMobj(mobj);
ghost->colorized = true; // already has color!
}
if (P_IsObjectOnGround(mobj) && (mobj->state == &states[S_SSMINE_AIR1] || mobj->state == &states[S_SSMINE_AIR2])) if (P_IsObjectOnGround(mobj) && (mobj->state == &states[S_SSMINE_AIR1] || mobj->state == &states[S_SSMINE_AIR2]))
{ {
@ -9607,6 +9653,21 @@ void P_SceneryThinker(mobj_t *mobj)
} }
} }
// Sonic Advance 2 flashing afterimages
if (mobj->type == MT_GHOST && mobj->fuse > 0
&& mobj->extravalue1 > 0 && mobj->extravalue2 >= 2)
{
if (mobj->extravalue2 == 2) // I don't know why the normal logic doesn't work for this.
mobj->flags2 ^= MF2_DONTDRAW;
else
{
if (mobj->fuse == mobj->extravalue2)
mobj->flags2 &= ~MF2_DONTDRAW;
else
mobj->flags2 |= MF2_DONTDRAW;
}
}
// momentum movement // momentum movement
if (mobj->momx || mobj->momy) if (mobj->momx || mobj->momy)
{ {

View file

@ -9005,9 +9005,7 @@ void P_PlayerThink(player_t *player)
#if 1 #if 1
// "Blur" a bit when you have speed shoes and are going fast enough // "Blur" a bit when you have speed shoes and are going fast enough
if ((player->powers[pw_super] || player->powers[pw_sneakers] if ((player->powers[pw_super] || player->powers[pw_sneakers])
|| EITHERSNEAKER(player) || player->kartstuff[k_driftboost] || player->kartstuff[k_ringboost] || player->kartstuff[k_startboost])
&& !player->kartstuff[k_invincibilitytimer] // SRB2kart
&& (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale)) && (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale))
{ {
mobj_t *gmobj = P_SpawnGhostMobj(player->mo); mobj_t *gmobj = P_SpawnGhostMobj(player->mo);