diff --git a/src/d_player.h b/src/d_player.h index 91989279c..5675dfb5e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -584,6 +584,8 @@ typedef struct player_s UINT8 stairjank; + UINT8 shrinkLaserDelay; + #ifdef HWRENDER fixed_t fovadd; // adjust FOV for hw rendering #endif diff --git a/src/k_kart.c b/src/k_kart.c index 19a2dc3e6..cef0a644e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7545,6 +7545,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) comebackshowninfo = true; // client has already seen the message } + if (player->shrinkLaserDelay) + player->shrinkLaserDelay--; + if (player->ringdelay) player->ringdelay--; @@ -10041,7 +10044,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } // 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) { diff --git a/src/objects/shrink.c b/src/objects/shrink.c index 019f2db2a..a4717fb17 100644 --- a/src/objects/shrink.c +++ b/src/objects/shrink.c @@ -412,6 +412,7 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim) { mobj_t *pohbee = gun_pohbee(gun); mobj_t *owner = NULL; + INT32 prevTimer = 0; if (pohbee == NULL || P_MobjWasRemoved(pohbee) == true) { @@ -423,44 +424,60 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim) return true; } + if (victim->player->shrinkLaserDelay > 0) + { + victim->player->shrinkLaserDelay = TICRATE; + return true; + } + + victim->player->shrinkLaserDelay = TICRATE; + owner = pohbee_owner(pohbee); + prevTimer = victim->player->growshrinktimer; if (owner != NULL && victim == owner) { // Belongs to us. Give us Grow! - if (victim->player->growshrinktimer <= 0) + 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); - } - - // 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); + // Take away Shrink. + K_RemoveGrowShrink(victim->player); + } + else + { + victim->player->growshrinktimer += 5*TICRATE; 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 { - if (victim->player->growshrinktimer > 0) + if (prevTimer > 0) { // Take away Grow. K_RemoveGrowShrink(victim->player); @@ -468,18 +485,21 @@ boolean Obj_ShrinkLaserCollide(mobj_t *gun, mobj_t *victim) else { // Start shrinking! - K_DropItems(victim->player); - 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); - } - + victim->player->growshrinktimer -= 5*TICRATE; 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); + } + } } } diff --git a/src/p_saveg.c b/src/p_saveg.c index f35ddc305..e1a75248d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -367,6 +367,8 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].stairjank); + WRITEUINT8(save_p, players[i].shrinkLaserDelay); + // respawnvars_t WRITEUINT8(save_p, players[i].respawn.state); 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].shrinkLaserDelay = READUINT8(save_p); + // respawnvars_t players[i].respawn.state = READUINT8(save_p); players[i].respawn.wp = (waypoint_t *)(size_t)READUINT32(save_p);