From e087d184029a9a1a136a6a3b13944d399da84f1b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 4 May 2019 21:04:06 -0400 Subject: [PATCH] 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. --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 36 ++++++++++++++++------ src/p_mobj.c | 81 +++++++++++++++++++++++++++++++++++++++++++------- src/p_user.c | 4 +-- 5 files changed, 101 insertions(+), 22 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index cad1f06f0..3ade7e2d5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/dehacked.c b/src/dehacked.c index 17206bff6..a7f3ec7a9 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8411,6 +8411,7 @@ static const char *const KARTSTUFF_LIST[] = { "BRAKESTOP", "WATERSKIP", "DASHPADCOOLDOWN", + "NUMBOOSTS", "BOOSTPOWER", "SPEEDBOOST", "ACCELBOOST", diff --git a/src/k_kart.c b/src/k_kart.c index 84a536e4a..fc2a85296 100644 --- a/src/k_kart.c +++ b/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) { diff --git a/src/p_mobj.c b/src/p_mobj.c index c7a8c7d5d..250165b90 100644 --- a/src/p_mobj.c +++ b/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) { diff --git a/src/p_user.c b/src/p_user.c index 4b2e9bf1e..da990b600 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -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);