mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
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:
parent
e3c96c28c6
commit
e087d18402
5 changed files with 101 additions and 22 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -8411,6 +8411,7 @@ static const char *const KARTSTUFF_LIST[] = {
|
||||||
"BRAKESTOP",
|
"BRAKESTOP",
|
||||||
"WATERSKIP",
|
"WATERSKIP",
|
||||||
"DASHPADCOOLDOWN",
|
"DASHPADCOOLDOWN",
|
||||||
|
"NUMBOOSTS",
|
||||||
"BOOSTPOWER",
|
"BOOSTPOWER",
|
||||||
"SPEEDBOOST",
|
"SPEEDBOOST",
|
||||||
"ACCELBOOST",
|
"ACCELBOOST",
|
||||||
|
|
|
||||||
36
src/k_kart.c
36
src/k_kart.c
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
77
src/p_mobj.c
77
src/p_mobj.c
|
|
@ -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;
|
{
|
||||||
|
mobj_t *ghost = P_SpawnGhostMobj(mobj);
|
||||||
|
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)
|
if (mobj->threshold > 0)
|
||||||
mobj->threshold--;
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue