From bdd786d8ab0c5554673f4424b5cf6149ec12e454 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 29 Aug 2022 18:35:38 +0100 Subject: [PATCH] BLASTER finalisation - BLASTER >= 180% speed, smaller boost otherwise - Flickers under 150% - Invinc-coloured when invincibility - Ketchup coloured when boosting, invisible otherwise --- src/info.c | 29 ++++++++++------------------- src/info.h | 21 ++++++--------------- src/k_kart.c | 22 +++++++++++----------- src/p_mobj.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 71 insertions(+), 47 deletions(-) diff --git a/src/info.c b/src/info.c index afd2db52a..8fd5f929c 100644 --- a/src/info.c +++ b/src/info.c @@ -580,7 +580,8 @@ char sprnames[NUMSPRITES + 1][5] = "BEXS", // Battle Bumper Explosion: Shell "BDEB", // Battle Bumper Explosion: Debris "BEXB", // Battle Bumper Explosion: Blast - "TWBT", // Tripwire Boost + "TWBS", // Tripwire Boost + "TWBT", // Tripwire BLASTER "DEZL", // DEZ Laser respawn // Additional Kart Objects @@ -4361,21 +4362,11 @@ state_t states[NUMSTATES] = {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS80, 2, {NULL}, 0, 0, S_BATTLEBUMPER_EXBLAST10}, // S_BATTLEBUMPER_EXBLAST9 {SPR_BEXB, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_TRANS90, 2, {NULL}, 0, 0, S_NULL}, // S_BATTLEBUMPER_EXBLAST10 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP2}, // S_TRIPWIREBOOST_TOP1 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP3}, // S_TRIPWIREBOOST_TOP2 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP4}, // S_TRIPWIREBOOST_TOP3 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP5}, // S_TRIPWIREBOOST_TOP4 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP6}, // S_TRIPWIREBOOST_TOP5 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP7}, // S_TRIPWIREBOOST_TOP6 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP1}, // S_TRIPWIREBOOST_TOP7 + {SPR_TWBS, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_TOP + {SPR_TWBS, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|FF_VERTICALFLIP|FF_HORIZONTALFLIP, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BOTTOM - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM2}, // S_TRIPWIREBOOST_BOTTOM1 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM3}, // S_TRIPWIREBOOST_BOTTOM2 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|2, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM4}, // S_TRIPWIREBOOST_BOTTOM3 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|3, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM5}, // S_TRIPWIREBOOST_BOTTOM4 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|4, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM6}, // S_TRIPWIREBOOST_BOTTOM5 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|5, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM7}, // S_TRIPWIREBOOST_BOTTOM6 - {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_VERTICALFLIP|FF_HORIZONTALFLIP|6, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_BOTTOM1}, // S_TRIPWIREBOOST_BOTTOM7 + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_TOP + {SPR_TWBT, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE|FF_VERTICALFLIP|FF_HORIZONTALFLIP, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_BOTTOM {SPR_DEZL, FF_FULLBRIGHT|FF_PAPERSPRITE, 8, {NULL}, 0, 0, S_NULL}, // S_DEZLASER {SPR_DEZL, FF_FULLBRIGHT|1, 2, {NULL}, 0, 0, S_DEZLASER_TRAIL2}, // S_DEZLASER_TRAIL1 @@ -24182,17 +24173,17 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = { // MT_TRIPWIREBOOST -1, // doomednum - S_TRIPWIREBOOST_TOP1, // spawnstate + S_TRIPWIREBOOST_TOP, // spawnstate 1000, // spawnhealth - S_TRIPWIREBOOST_BOTTOM1, // seestate + S_TRIPWIREBOOST_BOTTOM, // seestate sfx_None, // seesound 8, // reactiontime sfx_None, // attacksound S_NULL, // painstate 0, // painchance sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate + S_TRIPWIREBOOST_BLAST_TOP, // meleestate + S_TRIPWIREBOOST_BLAST_BOTTOM, // missilestate S_NULL, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound diff --git a/src/info.h b/src/info.h index 32f44df12..175de9cab 100644 --- a/src/info.h +++ b/src/info.h @@ -1126,7 +1126,8 @@ typedef enum sprite SPR_BEXS, // Battle Bumper Explosion: Shell SPR_BDEB, // Battle Bumper Explosion: Debris SPR_BEXB, // Battle Bumper Explosion: Blast - SPR_TWBT, // Tripwire Boost + SPR_TWBS, // Tripwire Boost + SPR_TWBT, // Tripwire BLASTER SPR_DEZL, // DEZ Laser respawn // Additional Kart Objects @@ -4794,20 +4795,10 @@ typedef enum state S_BATTLEBUMPER_EXBLAST9, S_BATTLEBUMPER_EXBLAST10, - S_TRIPWIREBOOST_TOP1, - S_TRIPWIREBOOST_TOP2, - S_TRIPWIREBOOST_TOP3, - S_TRIPWIREBOOST_TOP4, - S_TRIPWIREBOOST_TOP5, - S_TRIPWIREBOOST_TOP6, - S_TRIPWIREBOOST_TOP7, - S_TRIPWIREBOOST_BOTTOM1, - S_TRIPWIREBOOST_BOTTOM2, - S_TRIPWIREBOOST_BOTTOM3, - S_TRIPWIREBOOST_BOTTOM4, - S_TRIPWIREBOOST_BOTTOM5, - S_TRIPWIREBOOST_BOTTOM6, - S_TRIPWIREBOOST_BOTTOM7, + S_TRIPWIREBOOST_TOP, + S_TRIPWIREBOOST_BOTTOM, + S_TRIPWIREBOOST_BLAST_TOP, + S_TRIPWIREBOOST_BLAST_BOTTOM, // DEZ Laser respawn S_DEZLASER, diff --git a/src/k_kart.c b/src/k_kart.c index ed4510534..e05eab0c4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7207,23 +7207,23 @@ static void K_LookForRings(mobj_t *pmo) static void K_UpdateTripwire(player_t *player) { - fixed_t speedThreshold = K_GetKartSpeed(player, false) *3/4; + fixed_t speedThreshold = (3*K_GetKartSpeed(player, false, true))/4; boolean goodSpeed = (player->speed >= speedThreshold); + boolean boostExists = (player->tripwireLeniency > 0); // can't be checked later because of subtractions... - if (player->tripwireLeniency > 0) + if (boostExists) { player->tripwireLeniency--; - } - - if (goodSpeed == false && player->tripwireLeniency > 0) - { - // Decrease at double speed when your speed is bad. - player->tripwireLeniency--; + if (goodSpeed == false && player->tripwireLeniency > 0) + { + // Decrease at double speed when your speed is bad. + player->tripwireLeniency--; + } } if (K_TripwirePassConditions(player) == true) { - if (player->tripwireLeniency == 0) + if (!boostExists) { mobj_t *front = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); mobj_t *back = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST); @@ -7232,10 +7232,10 @@ static void K_UpdateTripwire(player_t *player) P_SetTarget(&back->target, player->mo); front->dispoffset = 1; - + front->old_angle = back->old_angle = K_MomentumAngle(player->mo); back->dispoffset = -1; back->extravalue1 = 1; - P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM1); + P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM); } player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME); diff --git a/src/p_mobj.c b/src/p_mobj.c index 6f7bb34b5..ee4b85059 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -7182,6 +7182,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } { + fixed_t convSpeed = (mobj->target->player->speed * 100) / K_GetKartSpeed(mobj->target->player, false, true); UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME; if (trans > NUMTRANSMAPS) @@ -7189,18 +7190,58 @@ static boolean P_MobjRegularThink(mobj_t *mobj) trans = NUMTRANSMAPS - trans; - if (trans >= NUMTRANSMAPS) + if ((trans >= NUMTRANSMAPS) // not a valid visibility + || (convSpeed < 150 && !(mobj->target->player->tripwireLeniency & 1)) // < 150% flickering + || (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash <= 0)) // flame shield but NOT boosting { mobj->renderflags |= RF_DONTDRAW; } else { - mobj->renderflags &= ~(RF_TRANSMASK); + boolean blastermode = (convSpeed >= 180); + mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW); if (trans != 0) { mobj->renderflags |= (trans << RF_TRANSSHIFT); } + mobj->renderflags |= (mobj->target->renderflags & RF_DONTDRAW); + + if (mobj->target->player->invincibilitytimer > 0) + { + if (mobj->target->player->invincibilitytimer > itemtime+(2*TICRATE)) + { + mobj->color = K_RainbowColor(leveltime / 2); + } + else + { + mobj->color = SKINCOLOR_INVINCFLASH; + } + mobj->colorized = true; + } + else if (mobj->target->player->curshield == KSHIELD_FLAME && mobj->target->player->flamedash > 0) + { + mobj->color = SKINCOLOR_KETCHUP; + mobj->colorized = true; + } + else + { + mobj->color = SKINCOLOR_NONE; + mobj->colorized = false; + } + + if (blastermode == !(mobj->flags2 & MF2_AMBUSH)) + { + mobj->flags2 ^= MF2_AMBUSH; + if (blastermode) + { + P_SetMobjState(mobj, (mobj->extravalue1) ? S_TRIPWIREBOOST_BLAST_BOTTOM : S_TRIPWIREBOOST_BLAST_TOP); + } + else + { + P_SetMobjState(mobj, (mobj->extravalue1) ? S_TRIPWIREBOOST_BOTTOM : S_TRIPWIREBOOST_TOP); + } + } } } break; @@ -9882,6 +9923,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) // Sprite rendering mobj->spritexscale = mobj->spriteyscale = mobj->scale; mobj->spritexoffset = mobj->spriteyoffset = 0; + mobj->dispoffset = info->dispoffset; mobj->floorspriteslope = NULL; // set subsector and/or block links