Endings.cs

using Sandbox.Entities;

namespace CatHarvest;

public partial class HarvestGame
{
	public bool EndState { get; set; } = false;
	public int Ending { get; set; } = 0;
	public bool Jumpscare { get; set; } = false;
	public bool Snappening = false;

	public static readonly string[] EndingTitles = new string[]
	{
		"NEUTRAL ENDING",
		"PEACEFUL ENDING",
		"BALANCED ENDING",
		"GENOCIDE ENDING",
		"SECRET ENDING",
		"Thank you for playing"
	};

	public static readonly string[] EndingDescriptions = new string[]
	{
		"After a hard day of work, you went back home to sleep.",
		"The world has been restored - and everyone is much happier.",
		"Perfectly balanced, as all things should be.",
		"Run.",
		"You found El Wiwi. You passed out not long after.",
		"There are 5 total endings, will you find them all?"
	};

	public static void EndGame( HarvestPlayer ply, int harvested, bool secret = false )
	{
		if ( secret )
		{
			SecretEnding( ply );
			return;
		}

		switch ( harvested )
		{
			case 48:
				BalancedEnding( ply );
				break;

			case <= 0:
				PeacefulEnding( ply );
				break;

			case >= 96:
				GenocideEnding( ply );
				break;

			default:
				NeutralEnding( ply );
				break;
		}
	}

	public static async void BalancedEnding( HarvestPlayer ply )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();
		Sandbox.Services.Achievements.Unlock( "balanced_ending" );

		current.EndState = true;
		current.Ending = 2;

		await current.Task.Delay( 5000 );

		current.EndState = false;
		current.Finishing = true;

		Game.ActiveScene.Scene.GetComponentInChildren<EndingCam>().IsBalancedEnding = true;
		Game.ActiveScene.Scene.GetComponentInChildren<EndingCam>().tsCreated = 0;

		current.Snappening = true;

		ChangeMusic( "political" );

		await current.Task.Delay( 8000 );

		current.EndState = true;
		current.Ending = 5;

		await current.Task.Delay( 6000 );
		CloseGame( ply );
	}

	public static async void NeutralEnding( HarvestPlayer ply )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();
		Sandbox.Services.Achievements.Unlock( "neutral_ending" );

		current.EndState = true;
		current.Ending = 0;

		ChangeMusic( "bravo" );

		await current.Task.Delay( 4000 );

		current.EndState = false;
		current.Ending = 0;
		current.Finishing = true;

		await current.Task.Delay( 3000 );

		current.EndState = true;
		current.Ending = 5;
		await current.Task.Delay( 5000 );

		CloseGame( ply );
	}

	public static async void PeacefulEnding( HarvestPlayer ply )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();
		Sandbox.Services.Achievements.Unlock( "pacifist_ending" );

		current.EndState = true;
		current.Ending = 1;

		ChangeMusic( "sounds/silly.sound" );

		await current.Task.Delay( 5000 );

		int totCats = ply.CatsUprooted;
		current.Finishing = true;

		foreach ( var cat in current.AllCats )
		{
			cat.Destroy();
		}

		for ( int i = 0; i < totCats; i++ )
		{
			var cat = Sandbox.GameObject.Clone( "prefabs/walkingcat.prefab" );
			cat.WorldPosition =
				new Vector3( Game.Random.Float( 1500f ) - 800f, Game.Random.Float( 1500f ), 15f );
			cat.GetComponent<WalkingCat>().Passive = true;
		}

		Game.ActiveScene.Scene.GetComponentInChildren<EndingCam>().IsPeacefulEnding = true;
		Game.ActiveScene.Scene.GetComponentInChildren<EndingCam>().tsCreated = 0;

		current.EndState = false;

		await current.Task.Delay( 7000 );

		current.EndState = true;
		current.Ending = 5;
		await current.Task.Delay( 5000 );

		CloseGame( ply );
	}

	public static async void GenocideEnding( HarvestPlayer ply )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();
		Sandbox.Services.Achievements.Unlock( "genocide_ending" );
		int totCats = ply.CatsHarvested;

		current.EndState = true;
		current.Ending = 3;

		await current.Task.Delay( 5000 );

		current.EndState = false;
		ChangeMusic( "horror" );
		ply.WorldPosition = new Vector3( 0, 0, 30 );
		ply.GetComponent<ShrimpleWalker>().RunSpeed = 30f;
		ply.GetComponent<ShrimpleWalker>().WalkSpeed = 30f;

		for ( int i = 0; i < totCats; i++ )
		{
			var cat = Sandbox.GameObject.Clone( "prefabs/walkingcat.prefab" );
			cat.WorldPosition =
				ply.WorldPosition + new Vector3( Game.Random.Float( 1500f ) - 800f, Game.Random.Float( 1500f ) - 800f, 15f );
			cat.GetComponent<WalkingCat>().Aggressive = true;
			cat.GetComponent<WalkingCat>().Victim = ply;
		}

		for ( int i = 0; i < totCats; i++ )
		{
			ply.CatsHarvested--;
			ply.CatsUprooted--;

			await current.Task.Delay( 25 );
		}

		await current.Task.Delay( 4000 );

		current.EndState = true;
		current.Ending = 5;

		await current.Task.Delay( 6000 );

		CloseGame( ply );
	}

	public static async void SecretEnding( HarvestPlayer ply )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();

		ChangeMusic( "sounds/wonders.sound" );
		current.Finishing = true;

		await current.Task.Delay( 2000 );

		current.EndState = true;
		current.Ending = 4;

		await current.Task.Delay( 2200 );

		var sound = Sound.Play( "sad0", ply.WorldPosition );
		sound.Volume = 1f;
		sound.Pitch = 1.8f;

		await current.Task.Delay( 800 );

		Sound.Play( "munch", ply.WorldPosition ).Volume = 3;
		Sandbox.Services.Achievements.Unlock( "secret_ending" );

		await current.Task.Delay( 3000 );

		current.Jumpscare = true;
		Sound.Play( "angry0" ).Volume = 255f;
		ChangeMusic( "" );
		await current.Task.Delay( 4000 );

		//real funny
		if ( Game.IsEditor )
		{
			Game.Close();
			return;
		}
		while ( true )
		{
		}
	}
	public static void ChangeMusic( string music )
	{
		HarvestGame current = Game.ActiveScene.Scene.GetComponentInChildren<HarvestGame>();

		current.Music.Stop();
		var Song = Sound.Play( music );

	}

	public static void CloseGame( HarvestPlayer ply )
	{
		Game.Close();
	}

	float lastSnap = 0f;

	public void TheSnappening()
	{
		if ( Snappening && lastSnap <= Time.Now )
		{
			if ( AllCats.Count > 0 )
			{
				int randomCat = Game.Random.Int( AllCats.Count - 1 );
				GameObject cat = AllCats[randomCat];

				cat.GetComponent<WalkingCat>().Snap();
			}

			lastSnap = Time.Now + 0.3f;
		}
	}
}