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_waterskip, // Water skipping counter
|
||||
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_speedboost, // Boost value smoothing for max speed
|
||||
k_accelboost, // Boost value smoothing for acceleration
|
||||
|
|
|
|||
|
|
@ -8411,6 +8411,7 @@ static const char *const KARTSTUFF_LIST[] = {
|
|||
"BRAKESTOP",
|
||||
"WATERSKIP",
|
||||
"DASHPADCOOLDOWN",
|
||||
"NUMBOOSTS",
|
||||
"BOOSTPOWER",
|
||||
"SPEEDBOOST",
|
||||
"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 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
|
||||
{
|
||||
|
|
@ -2206,9 +2206,9 @@ static void K_GetKartBoostPower(player_t *player)
|
|||
boostpower = (4*boostpower)/5;
|
||||
|
||||
#define ADDBOOST(s,a) { \
|
||||
speedboost += (s) / boostfactor; \
|
||||
accelboost += (a) / boostfactor; \
|
||||
boostfactor++; \
|
||||
numboosts++; \
|
||||
speedboost += (s) / numboosts; \
|
||||
accelboost += (a) / numboosts; \
|
||||
}
|
||||
|
||||
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.
|
||||
// We'll see how to replace its design BEFORE v2 gets released.
|
||||
speedboost += (FRACUNIT/5); // + 20%
|
||||
//numboosts++; // Don't add any boost afterimages to Grow
|
||||
}
|
||||
|
||||
if (player->kartstuff[k_draftpower] > 0) // Drafting
|
||||
{
|
||||
speedboost += (player->kartstuff[k_draftpower]) / 3; // + 0-33.3%
|
||||
numboosts++; // (Drafting suffers no boost stack penalty!)
|
||||
}
|
||||
|
||||
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_accelboost] = accelboost;
|
||||
player->kartstuff[k_numboosts] = numboosts;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (player->mo && !P_MobjWasRemoved(player->mo)
|
||||
if (player->mo && !P_MobjWasRemoved(player->mo))
|
||||
finalspeed = FixedMul(finalspeed, player->mo->scale);
|
||||
|
||||
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
|
||||
{
|
||||
mobj_t *ghost;
|
||||
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
|
||||
{
|
||||
|
|
@ -4927,6 +4928,23 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
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
|
||||
if (player->kartstuff[k_boostcam] != 0 || player->kartstuff[k_destboostcam] != 0)
|
||||
{
|
||||
|
|
|
|||
81
src/p_mobj.c
81
src/p_mobj.c
|
|
@ -7953,8 +7953,8 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
else
|
||||
{
|
||||
fixed_t finalspeed = mobj->movefactor;
|
||||
|
||||
P_SpawnGhostMobj(mobj);
|
||||
mobj_t *ghost = P_SpawnGhostMobj(mobj);
|
||||
ghost->colorized = true; // already has color!
|
||||
|
||||
mobj->angle = R_PointToAngle2(0, 0, mobj->momx, mobj->momy);
|
||||
if (mobj->health <= 5)
|
||||
|
|
@ -7989,8 +7989,13 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
fixed_t topspeed = mobj->movefactor;
|
||||
fixed_t distbarrier = 512*mapobjectscale;
|
||||
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)
|
||||
mobj->threshold--;
|
||||
|
|
@ -8054,7 +8059,14 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
}
|
||||
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);
|
||||
P_InstaThrust(mobj, mobj->angle, mobj->movefactor);
|
||||
|
||||
|
|
@ -8079,14 +8091,25 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
case MT_BANANA:
|
||||
case MT_EGGMANITEM:
|
||||
mobj->friction = ORIG_FRICTION/4;
|
||||
|
||||
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)
|
||||
{
|
||||
S_StartSound(mobj, mobj->info->activesound);
|
||||
mobj->momx = mobj->momy = 0;
|
||||
mobj->health = 1;
|
||||
}
|
||||
|
||||
if (mobj->threshold > 0)
|
||||
mobj->threshold--;
|
||||
break;
|
||||
|
|
@ -8094,18 +8117,38 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
indirectitemcooldown = 20*TICRATE;
|
||||
/* FALLTHRU */
|
||||
case MT_BALLHOG:
|
||||
P_SpawnGhostMobj(mobj)->fuse = 3;
|
||||
if (mobj->threshold > 0)
|
||||
mobj->threshold--;
|
||||
{
|
||||
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)
|
||||
mobj->threshold--;
|
||||
}
|
||||
break;
|
||||
case MT_SINK:
|
||||
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))
|
||||
{
|
||||
S_StartSound(mobj, mobj->info->deathsound);
|
||||
P_SetMobjState(mobj, S_NULL);
|
||||
}
|
||||
|
||||
if (mobj->threshold > 0)
|
||||
mobj->threshold--;
|
||||
break;
|
||||
|
|
@ -8116,7 +8159,10 @@ void P_MobjThinker(mobj_t *mobj)
|
|||
mobj->color = SKINCOLOR_KETCHUP;
|
||||
|
||||
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]))
|
||||
{
|
||||
|
|
@ -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
|
||||
if (mobj->momx || mobj->momy)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9005,9 +9005,7 @@ void P_PlayerThink(player_t *player)
|
|||
|
||||
#if 1
|
||||
// "Blur" a bit when you have speed shoes and are going fast enough
|
||||
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
|
||||
if ((player->powers[pw_super] || player->powers[pw_sneakers])
|
||||
&& (player->speed + abs(player->mo->momz)) > FixedMul(20*FRACUNIT,player->mo->scale))
|
||||
{
|
||||
mobj_t *gmobj = P_SpawnGhostMobj(player->mo);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue