UI/Cardiophile/Ecghud.razor

A Razor UI component for an ECG HUD that displays heart rate, cookie clicker stats, multiplier and controls to adjust them. It reads/syncs state from HeartOrgan and AnCookieClicker components, updates display strings on OnUpdate, and invokes methods on those components in response to button clicks.

Native Interop
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Sandbox

<root>
	<div class="Rudimentary">
		<p>@HrSay BPM @LubSay</p>
		<p>🍪 @CookiesSay (x @MultiplierSay )</p>
		<!--<p><input type="number"></p>-->
		<p><a class="button" onClick=@DecreaseHeartRate>-</a> <label>💓</label> <a class="button" onClick=@AddHeartRate>+</a> | <a class="button" onClick=@ResetHeartRate>🔄️</a></p>
		<p>PRESET:
			<a class="button" onClick=@(()=>PresetHeartRate(0))>5</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(1))>30</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(2))>50</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(3))>70</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(4))>120</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(5))>200</a>|
			<a class="button" onClick=@(()=>PresetHeartRate(6))>300</a>|
		</p>
		<p><a class="button" onClick=@DecreaseMultiplier>-</a> <label>MULTI</label> <a class="button" onClick=@IncreaseMultiplier>+</a> | <a class="button" onClick=@ResetMultiplier>🔄️</a></p>
		<p>Internal <a class="Checkbox" id="InternalSpeakerToggle" onClick=@ToggleSound>@SpeakerSay</a></p>
	</div>
</root>

@code
{
	[Property, TextArea] public string MyStringValue { get; set; } = "Waaaaa";
	[Property] public HeartOrgan HeartOrgan {get;set;}
	[Property] public AnCookieClicker CookieClicker {get;set;}

	[Property] public float HeartRate {get;set;} = 70f;
	[Property] public double CookiesNow {get;set;} = 0;
	[Property] public float Multiplier {get;set;} = 1f;
	[Property] bool Clicked = false;

	[Property] string LubSay {get;set;} = "♥️";
	[Property] string HrSay {get;set;} = "---";
	[Property] string CookiesSay {get;set;} = "---";
	[Property] string MultiplierSay {get;set;} = "???";
	[Property] string SpeakerSay {get;set;} = "❓";

	protected void AddHeartRateBy(float whatIsIt = 1)
	{
		if(HeartOrgan.IsValid())
		{
			Log.Info($"Add Heart Rate By {whatIsIt}");
			HeartOrgan.AddHeartRate(whatIsIt);
		}
	}

	protected void AddHeartRate()
	{
		AddHeartRateBy(1);
	}

	protected void DecreaseHeartRate()
	{
		AddHeartRateBy(-1);
	}

	protected void PresetHeartRate(int whichOne = 3)
	{
		if(HeartOrgan.IsValid())
			switch(whichOne)
			{
				case 0:
					HeartOrgan.SetHeartRate(5);
					break;
				case 1:
					HeartOrgan.SetHeartRate(30);
					break;
				case 2:
					HeartOrgan.SetHeartRate(50);
					break;
				case 3:
					HeartOrgan.SetHeartRate(70);
					break;
				case 4:
					HeartOrgan.SetHeartRate(120);
					break;
				case 5:
					HeartOrgan.SetHeartRate(200);
					break;
				case 6:
					HeartOrgan.SetHeartRate(300);
					break;
				default:
					break;
			}
	}

	protected void ResetHeartRate()
	{
		if(HeartOrgan.IsValid())
		{
			//HeartOrgan.SetHeartRate(70);
			HeartOrgan.ResetHeartRate();
		}
	}

	protected void IncreaseMultiplier()
	{
		if(CookieClicker.IsValid())
		{
			CookieClicker.AddMultiplierBy(.1f);
		}
	}

	protected void DecreaseMultiplier()
	{
		if(CookieClicker.IsValid())
		{
			CookieClicker.AddMultiplierBy(-.1f);
		}
	}

	protected void ResetMultiplier()
	{
		if(CookieClicker.IsValid())
		{
			CookieClicker.ResetMultiplier();
		}
	}

	protected void ToggleSound()
	{
		if(HeartOrgan.IsValid())
		{
			HeartOrgan.ToggleInternalSound();
		}
	}

	protected override void OnUpdate()
	{
		if(HeartOrgan.IsValid())
		{
			HeartRate = HeartOrgan.HeartRate;
			LubSay = HeartOrgan.Lub? "♥️" : " ";
			HrSay = $"{HeartRate}";
			SpeakerSay = HeartOrgan.EnableSound? "🔊" : "🔇";
		} else
		{
			LubSay = "❓";
			HrSay = "---";
			SpeakerSay = "❓";
		}

		if(CookieClicker.IsValid())
		{
			if(HeartOrgan.IsValid())
			{
				if(HeartOrgan.Lub)
					{
						if(!Clicked)
						{
							CookieClicker.ClickTheCookie();

						}
						Clicked = true;
					}
				else
					Clicked = false;
			}

			CookiesNow = CookieClicker.Cookies;
			CookiesSay = $"{Math.Floor(CookiesNow)}";
			Multiplier = CookieClicker.Multiplier;
			MultiplierSay = $"{Math.Floor(Multiplier*100)/100}";
		} else
		{
			CookiesSay = "---";
			MultiplierSay = "???";
		}
	}

	/// <summary>
	/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
	/// </summary>
	protected override int BuildHash() => System.HashCode.Combine(
	MyStringValue,
	LubSay,
	CookiesNow,
	Clicked,
	CookiesSay,
	HeartRate
	);
}