Park/Rides/BasicRide.Persistence.cs
using HC3.Persistence;
using System.Text.Json.Nodes;

namespace HC3;

/// <summary>
/// Handles persistence for a <see cref="BasicRide"/>
/// </summary>
partial class BasicRide
{
	protected override JsonObject GetPersistentMetadata()
	{
		var obj = base.GetPersistentMetadata();
		obj["MinimumLoad"] = MinimumLoad.ToString();
		obj["RideLength"] = RideLength;
		obj["MinimumLoadTime"] = MinimumLoadTime;
		obj["MaximumLoadtime"] = MaximumLoadTime;
		obj["GuestCost"] = GuestCost;
		obj["Durability"] = Durability;
		obj["IsBroken"] = IsBroken;
		obj["QueueTintData"] = Json.Serialize( queueColors );
		obj["Music"] = MusicPlayer.Track?.ResourcePath;

		return obj;
	}

	protected override void SetPersistentMetadata( JsonObject obj )
	{
		if ( obj == null )
			return;

		base.SetPersistentMetadata( obj );

		if ( obj.TryGetPropertyValue( "MinimumLoad", out var minRequired ) )
		{
			MinimumLoad = minRequired.GetValueEnum<LoadMode>();
		}

		if ( obj.TryGetPropertyValue( "RideLength", out var rideLength ) )
		{
			RideLength = rideLength.GetValue<float>();
		}

		if ( obj.TryGetPropertyValue( "MinimumLoadTime", out var minLoadTime ) )
		{
			MinimumLoadTime = minLoadTime.GetValue<float>();
		}

		if ( obj.TryGetPropertyValue( "MaximumLoadtime", out var maxLoadTime ) )
		{
			MaximumLoadTime = maxLoadTime.GetValue<float>();
		}

		if ( obj.TryGetPropertyValue( "GuestCost", out var guestCost ) )
		{
			GuestCost = guestCost.GetValue<int>();
		}

		if ( obj.TryGetPropertyValue( "Durability", out var durability ) )
		{
			Durability = durability.GetValue<float>();
		}

		if ( obj.TryGetPropertyValue( "IsBroken", out var isBroken ) )
		{
			IsBroken = isBroken.GetValue<bool>();
			MusicPlayer.IsBrokenDown = IsBroken;
		}

		if ( obj.TryGetPropertyValue( "QueueTintData", out var queueTintData ) )
		{
			queueColors = Json.Deserialize<Dictionary<TintChannel, Color>>( queueTintData!.ToString() );
			UpdateQueueColors();
		}

		if ( obj.TryGetPropertyValue( "Music", out var musicPath ) )
		{
			MusicPlayer.SetTrack( musicPath?.GetValue<string>() );
		}
	}

	async void UpdateQueueColors()
	{
		// Waits for everything else to load (persistence) before we update the queue colours
		await PersistenceManager.WaitForLoad();

		foreach ( var kv in queueColors )
		{
			UpdateQueueColor( kv.Value, kv.Key );
		}
	}
}