ui/Hud.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent

@{
	var manager = Manager.Instance;
}

<root style="cursor: @manager.GetCursor(); pointer-events: @(manager.IsMoveResolving ? "all" : "none");">
	@if(manager.ShouldShowOverlayColor)
	{
		var opacity = Utils.Map(manager.TimeSinceOverlayStart, 0f, 0.1f, 0f, 1f, EasingType.SineOut) * Utils.Map(manager.TimeSinceOverlayStart, 0f, manager.OverlayTime, 1f, 0f, EasingType.SineIn);
		<div class="overlay" style="background-color: @(manager.OverlayColor.Rgba); opacity:@opacity;"></div>
	}

	<SettingsButton />	

	@if(manager.IsMuted)
	{
		<MuteButton />
	}

	@if(manager.GameState == GameState.Menu)
	{
		if(manager.IsSettingsOpen)
		{
			<SettingsPanel2 />
		}
		else if(manager.IsLeaderboardOpen)
		{
			<LeaderboardPanel />
		}
		else
		{
			<MainMenuPanel />
		}
	}
	else
	{
		<HealthBar />
		<TimeBar />
		<MoneyPanel />

		<div class="upper_row">
			<RelicPanel />

			@if(manager.GameState != GameState.Victory && manager.GameState != GameState.Failure)
			{
				<LevelLabel />	
			}
		</div>
		
		@if(manager.GameState != GameState.Victory && manager.GameState != GameState.Failure)
		{
			<RunTimerLabel />	
		}

		if(manager.IsSettingsOpen)
		{
			<SettingsPanel2 />
		}
		else
		{
			@if(manager.GameState == GameState.Victory || manager.GameState == GameState.Failure)
			{
				<FinalScorePanel />	
			}
	
			@if(manager.GameState == GameState.BuyPhase)
			{
				<BuyPhasePanel />
			}
		}
	}

	@if(manager.IsLevelActive)
	{
		<CardTypePanel />

		@if(manager.HoveredPanelType != CardType.None)
		{
			if(manager.IsHoveringBounty)
			{
				<BountyTooltip [email protected] style="left:@(Mouse.Position.x * Panel.ScaleFromScreen - 250)px; top:@(Math.Min(Mouse.Position.y, Screen.Height - 200f * Panel.ScaleToScreen) * Panel.ScaleFromScreen - 10f)px;" />
			}
			else
			{
				<CardTypeTooltip [email protected] style="left:@(Mouse.Position.x * Panel.ScaleFromScreen - 335)px; top:@(Math.Min(Mouse.Position.y, Screen.Height - 240f * Panel.ScaleToScreen) * Panel.ScaleFromScreen - 10f)px;" />	
			}
		}

		@if(manager.EventMessageStack.Count > 0)
		{
			<MessageContainerPanel></MessageContainerPanel>
		}
	}

	@if(manager.HoveredRelicType != RelicType.None)
	{
		var relic = Manager.Instance.GetRelic(manager.HoveredRelicType);
		if( relic != null)
		{
			<RelicTooltip [email protected] [email protected] [email protected] style="left:@(Mouse.Position.x * Panel.ScaleFromScreen + 20)px; top:@(Math.Min(Mouse.Position.y, Screen.Height - 175f * Panel.ScaleToScreen) * Panel.ScaleFromScreen + 20f)px;" />	
		}
	}

	@if(manager.ForceCursor)
	{
		<div class="cursor-forcer"></div>
	}

	@if(manager.IsFadingIn)
	{
		<div class="fader" style="opacity:@(Utils.Map(manager.TimeSinceStartFadingIn, 0f, Manager.FADE_IN_TIME, 1f, 0f));"></div>	
	}
</root>

@code
	{
	protected override int BuildHash()
	{
		var manager = Manager.Instance;

		var overlayHash = manager.ShouldShowOverlayColor ? manager.TimeSinceOverlayStart.Relative : 0f;
		var fadeInHash = manager.IsFadingIn ? manager.TimeSinceStartFadingIn.Relative : 0f;

		return HashCode.Combine(
			Mouse.Position, // todo: only needed if a tooltip is showing
			manager.GameState,
			overlayHash,
			HashCode.Combine(manager.IsMoveResolving, manager.ForceCursor, manager.CursorClockNum),
			fadeInHash,
			manager.IsSettingsOpen,
			manager.IsMuted
		);
	}
}