// ------------------------------------------------------------------------------------------------
//
//   A version of PowerTimeFreezer which does not mute sound while in effect.
//
// ------------------------------------------------------------------------------------------------
// Credits: Blue Shadow & Kinsie, thank you!

class SMPowerTimeFreezerSound : PowerTimeFreezer
{
	override void InitEffect()
	{
		int freezemask;

		Powerup.InitEffect();

		if (Owner == null || Owner.player == null)
			return;

		CVar doomSMPauseMusicCvar = CVar.FindCVar("sm_pausemusic");
		CVar doomSMPauseSoundsCvar = CVar.FindCVar("sm_pausesounds");

		// When this powerup is in effect, pause the music.
		S_PauseSound(doomSMPauseMusicCvar, doomSMPauseSoundsCvar);

		// When this powerup is in effect, pause the music.
		//S_PauseSound(false, true);

		// Give the player and his teammates the power to move when time is frozen.
		freezemask = 1 << Owner.PlayerNumber();
		Owner.player.timefreezer |= freezemask;
		for (int i = 0; i < MAXPLAYERS; i++)
		{
			if (playeringame[i] &&
				players[i].mo != null &&
				players[i].mo.IsTeammate(Owner)
			   )
			{
				players[i].timefreezer |= freezemask;
			}
		}

		// [RH] The effect ends one tic after the counter hits zero, so make
		// sure we start at an odd count.
		EffectTics += !(EffectTics & 1);
		if ((EffectTics & 1) == 0)
		{
			EffectTics++;
		}
		// Make sure the effect starts and ends on an even tic.
		if ((level.time & 1) == 0)
		{
			Level.SetFrozen(true);
		}
		else
		{
			// Compensate for skipped tic, but beware of overflow.
			if(EffectTics < 0x7fffffff)
				EffectTics++;
		}
	}

	override void EndEffect()
	{
		Powerup.EndEffect();

		// If there is an owner, remove the timefreeze flag corresponding to
		// her from all players.
		if (Owner != null && Owner.player != null)
		{
			int freezemask = ~(1 << Owner.PlayerNumber());
			for (int i = 0; i < MAXPLAYERS; ++i)
			{
				players[i].timefreezer &= freezemask;
			}
		}

		// Are there any players who still have timefreezer bits set?
		for (int i = 0; i < MAXPLAYERS; ++i)
		{
			if (playeringame[i] && players[i].timefreezer != 0)
			{
				return;
			}
		}

		// No, so allow other actors to move about freely once again.
		Level.SetFrozen(false);

		// Also, turn the music back on.
		S_ResumeSound(true);
	}
}