Make shrink lasers add timer instead of resetting

This commit is contained in:
Sally Coolatta 2022-09-14 03:15:03 -04:00
parent 970add8b91
commit a4b63f3ffa
4 changed files with 68 additions and 39 deletions

View file

@ -584,6 +584,8 @@ typedef struct player_s
UINT8 stairjank; UINT8 stairjank;
UINT8 shrinkLaserDelay;
#ifdef HWRENDER #ifdef HWRENDER
fixed_t fovadd; // adjust FOV for hw rendering fixed_t fovadd; // adjust FOV for hw rendering
#endif #endif

View file

@ -7545,6 +7545,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
comebackshowninfo = true; // client has already seen the message comebackshowninfo = true; // client has already seen the message
} }
if (player->shrinkLaserDelay)
player->shrinkLaserDelay--;
if (player->ringdelay) if (player->ringdelay)
player->ringdelay--; player->ringdelay--;
@ -10041,7 +10044,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
} }
// TODO: gametyperules // TODO: gametyperules
player->growshrinktimer = (gametype == GT_BATTLE ? 8 : 12) * TICRATE; player->growshrinktimer = max(player->growshrinktimer, (gametype == GT_BATTLE ? 8 : 12) * TICRATE);
if (player->invincibilitytimer > 0) if (player->invincibilitytimer > 0)
{ {

View file

@ -412,6 +412,7 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim)
{ {
mobj_t *pohbee = gun_pohbee(gun); mobj_t *pohbee = gun_pohbee(gun);
mobj_t *owner = NULL; mobj_t *owner = NULL;
INT32 prevTimer = 0;
if (pohbee == NULL || P_MobjWasRemoved(pohbee) == true) if (pohbee == NULL || P_MobjWasRemoved(pohbee) == true)
{ {
@ -423,44 +424,60 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim)
return true; return true;
} }
if (victim->player->shrinkLaserDelay > 0)
{
victim->player->shrinkLaserDelay = TICRATE;
return true;
}
victim->player->shrinkLaserDelay = TICRATE;
owner = pohbee_owner(pohbee); owner = pohbee_owner(pohbee);
prevTimer = victim->player->growshrinktimer;
if (owner != NULL && victim == owner) if (owner != NULL && victim == owner)
{ {
// Belongs to us. Give us Grow! // Belongs to us. Give us Grow!
if (victim->player->growshrinktimer <= 0) if (prevTimer < 0)
{ {
victim->scalespeed = mapobjectscale/TICRATE; // Take away Shrink.
victim->destscale = FixedMul(mapobjectscale, GROW_SCALE); K_RemoveGrowShrink(victim->player);
}
if (K_PlayerShrinkCheat(victim->player) == true) else
{ {
victim->destscale = FixedMul(victim->destscale, SHRINK_SCALE); victim->player->growshrinktimer += 5*TICRATE;
}
// TODO: gametyperules
victim->player->growshrinktimer = (gametype == GT_BATTLE ? 8 : 12) * TICRATE;
if (victim->player->invincibilitytimer > 0)
{
; // invincibility has priority in P_RestoreMusic, no point in starting here
}
else if (P_IsLocalPlayer(victim->player) == true)
{
S_ChangeMusicSpecial("kgrow");
}
else //used to be "if (P_IsDisplayPlayer(victim->player) == false)"
{
S_StartSound(victim, (cv_kartinvinsfx.value ? sfx_alarmg : sfx_kgrow));
}
P_RestoreMusic(victim->player);
S_StartSound(victim, sfx_kc5a); S_StartSound(victim, sfx_kc5a);
if (prevTimer <= 0)
{
victim->scalespeed = mapobjectscale/TICRATE;
victim->destscale = FixedMul(mapobjectscale, GROW_SCALE);
if (K_PlayerShrinkCheat(victim->player) == true)
{
victim->destscale = FixedMul(victim->destscale, SHRINK_SCALE);
}
if (victim->player->invincibilitytimer > 0)
{
; // invincibility has priority in P_RestoreMusic, no point in starting here
}
else if (P_IsLocalPlayer(victim->player) == true)
{
S_ChangeMusicSpecial("kgrow");
}
else //used to be "if (P_IsDisplayPlayer(victim->player) == false)"
{
S_StartSound(victim, (cv_kartinvinsfx.value ? sfx_alarmg : sfx_kgrow));
}
P_RestoreMusic(victim->player);
}
} }
} }
else else
{ {
if (victim->player->growshrinktimer > 0) if (prevTimer > 0)
{ {
// Take away Grow. // Take away Grow.
K_RemoveGrowShrink(victim->player); K_RemoveGrowShrink(victim->player);
@ -468,18 +485,21 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim)
else else
{ {
// Start shrinking! // Start shrinking!
K_DropItems(victim->player); victim->player->growshrinktimer -= 5*TICRATE;
victim->player->growshrinktimer = -(15*TICRATE);
victim->scalespeed = mapobjectscale/TICRATE;
victim->destscale = FixedMul(mapobjectscale, SHRINK_SCALE);
if (K_PlayerShrinkCheat(victim->player) == true)
{
victim->destscale = FixedMul(victim->destscale, SHRINK_SCALE);
}
S_StartSound(victim, sfx_kc59); S_StartSound(victim, sfx_kc59);
if (prevTimer >= 0)
{
K_DropItems(victim->player);
victim->scalespeed = mapobjectscale/TICRATE;
victim->destscale = FixedMul(mapobjectscale, SHRINK_SCALE);
if (K_PlayerShrinkCheat(victim->player) == true)
{
victim->destscale = FixedMul(victim->destscale, SHRINK_SCALE);
}
}
} }
} }

View file

@ -367,6 +367,8 @@ static void P_NetArchivePlayers(void)
WRITEUINT8(save_p, players[i].stairjank); WRITEUINT8(save_p, players[i].stairjank);
WRITEUINT8(save_p, players[i].shrinkLaserDelay);
// respawnvars_t // respawnvars_t
WRITEUINT8(save_p, players[i].respawn.state); WRITEUINT8(save_p, players[i].respawn.state);
WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].respawn.wp)); WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].respawn.wp));
@ -654,6 +656,8 @@ static void P_NetUnArchivePlayers(void)
players[i].stairjank = READUINT8(save_p); players[i].stairjank = READUINT8(save_p);
players[i].shrinkLaserDelay = READUINT8(save_p);
// respawnvars_t // respawnvars_t
players[i].respawn.state = READUINT8(save_p); players[i].respawn.state = READUINT8(save_p);
players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save_p); players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save_p);