BLASTER finalisation

- BLASTER >= 180% speed, smaller boost otherwise
- Flickers under 150%
- Invinc-coloured when invincibility
- Ketchup coloured when boosting, invisible otherwise
This commit is contained in:
toaster 2022-08-29 18:35:38 +01:00
parent b9e3bdff94
commit bdd786d8ab
4 changed files with 71 additions and 47 deletions

View file

@ -580,7 +580,8 @@ char sprnames[NUMSPRITES + 1][5] =
"BEXS", // Battle Bumper Explosion: Shell "BEXS", // Battle Bumper Explosion: Shell
"BDEB", // Battle Bumper Explosion: Debris "BDEB", // Battle Bumper Explosion: Debris
"BEXB", // Battle Bumper Explosion: Blast "BEXB", // Battle Bumper Explosion: Blast
"TWBT", // Tripwire Boost "TWBS", // Tripwire Boost
"TWBT", // Tripwire BLASTER
"DEZL", // DEZ Laser respawn "DEZL", // DEZ Laser respawn
// Additional Kart Objects // 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_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_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_TWBS, FF_FULLBRIGHT|FF_ADD|FF_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_TOP
{SPR_TWBT, FF_FULLBRIGHT|FF_ADD|1, 2, {NULL}, 0, 0, S_TRIPWIREBOOST_TOP3}, // S_TRIPWIREBOOST_TOP2 {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|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_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_ANIMATE, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_TOP
{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_ANIMATE|FF_VERTICALFLIP|FF_HORIZONTALFLIP, -1, {NULL}, 6, 2, S_NULL}, // S_TRIPWIREBOOST_BLAST_BOTTOM
{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_DEZL, FF_FULLBRIGHT|FF_PAPERSPRITE, 8, {NULL}, 0, 0, S_NULL}, // S_DEZLASER {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 {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 { // MT_TRIPWIREBOOST
-1, // doomednum -1, // doomednum
S_TRIPWIREBOOST_TOP1, // spawnstate S_TRIPWIREBOOST_TOP, // spawnstate
1000, // spawnhealth 1000, // spawnhealth
S_TRIPWIREBOOST_BOTTOM1, // seestate S_TRIPWIREBOOST_BOTTOM, // seestate
sfx_None, // seesound sfx_None, // seesound
8, // reactiontime 8, // reactiontime
sfx_None, // attacksound sfx_None, // attacksound
S_NULL, // painstate S_NULL, // painstate
0, // painchance 0, // painchance
sfx_None, // painsound sfx_None, // painsound
S_NULL, // meleestate S_TRIPWIREBOOST_BLAST_TOP, // meleestate
S_NULL, // missilestate S_TRIPWIREBOOST_BLAST_BOTTOM, // missilestate
S_NULL, // deathstate S_NULL, // deathstate
S_NULL, // xdeathstate S_NULL, // xdeathstate
sfx_None, // deathsound sfx_None, // deathsound

View file

@ -1126,7 +1126,8 @@ typedef enum sprite
SPR_BEXS, // Battle Bumper Explosion: Shell SPR_BEXS, // Battle Bumper Explosion: Shell
SPR_BDEB, // Battle Bumper Explosion: Debris SPR_BDEB, // Battle Bumper Explosion: Debris
SPR_BEXB, // Battle Bumper Explosion: Blast SPR_BEXB, // Battle Bumper Explosion: Blast
SPR_TWBT, // Tripwire Boost SPR_TWBS, // Tripwire Boost
SPR_TWBT, // Tripwire BLASTER
SPR_DEZL, // DEZ Laser respawn SPR_DEZL, // DEZ Laser respawn
// Additional Kart Objects // Additional Kart Objects
@ -4794,20 +4795,10 @@ typedef enum state
S_BATTLEBUMPER_EXBLAST9, S_BATTLEBUMPER_EXBLAST9,
S_BATTLEBUMPER_EXBLAST10, S_BATTLEBUMPER_EXBLAST10,
S_TRIPWIREBOOST_TOP1, S_TRIPWIREBOOST_TOP,
S_TRIPWIREBOOST_TOP2, S_TRIPWIREBOOST_BOTTOM,
S_TRIPWIREBOOST_TOP3, S_TRIPWIREBOOST_BLAST_TOP,
S_TRIPWIREBOOST_TOP4, S_TRIPWIREBOOST_BLAST_BOTTOM,
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,
// DEZ Laser respawn // DEZ Laser respawn
S_DEZLASER, S_DEZLASER,

View file

@ -7207,23 +7207,23 @@ static void K_LookForRings(mobj_t *pmo)
static void K_UpdateTripwire(player_t *player) 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 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--; player->tripwireLeniency--;
} if (goodSpeed == false && player->tripwireLeniency > 0)
{
if (goodSpeed == false && player->tripwireLeniency > 0) // Decrease at double speed when your speed is bad.
{ player->tripwireLeniency--;
// Decrease at double speed when your speed is bad. }
player->tripwireLeniency--;
} }
if (K_TripwirePassConditions(player) == true) 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 *front = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_TRIPWIREBOOST);
mobj_t *back = 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); P_SetTarget(&back->target, player->mo);
front->dispoffset = 1; front->dispoffset = 1;
front->old_angle = back->old_angle = K_MomentumAngle(player->mo);
back->dispoffset = -1; back->dispoffset = -1;
back->extravalue1 = 1; back->extravalue1 = 1;
P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM1); P_SetMobjState(back, S_TRIPWIREBOOST_BOTTOM);
} }
player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME); player->tripwireLeniency = max(player->tripwireLeniency, TRIPWIRETIME);

View file

@ -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; UINT8 trans = ((mobj->target->player->tripwireLeniency + 1) * (NUMTRANSMAPS+1)) / TRIPWIRETIME;
if (trans > NUMTRANSMAPS) if (trans > NUMTRANSMAPS)
@ -7189,18 +7190,58 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
trans = NUMTRANSMAPS - trans; 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; mobj->renderflags |= RF_DONTDRAW;
} }
else else
{ {
mobj->renderflags &= ~(RF_TRANSMASK); boolean blastermode = (convSpeed >= 180);
mobj->renderflags &= ~(RF_TRANSMASK|RF_DONTDRAW);
if (trans != 0) if (trans != 0)
{ {
mobj->renderflags |= (trans << RF_TRANSSHIFT); 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; break;
@ -9882,6 +9923,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
// Sprite rendering // Sprite rendering
mobj->spritexscale = mobj->spriteyscale = mobj->scale; mobj->spritexscale = mobj->spriteyscale = mobj->scale;
mobj->spritexoffset = mobj->spriteyoffset = 0; mobj->spritexoffset = mobj->spriteyoffset = 0;
mobj->dispoffset = info->dispoffset;
mobj->floorspriteslope = NULL; mobj->floorspriteslope = NULL;
// set subsector and/or block links // set subsector and/or block links