using System;
using System.Collections.Generic;
using System.Linq;
using LuckerGame.Minigames;
using Sandbox;
using Sandbox.UI;
namespace LuckerGame.Entities;
///
/// Manages minigames
///
public partial class MinigameManager : Entity
{
[Net] public Minigame LoadedMinigame { get; private set; }
private List AvailableMinigames { get; set; }
private List InvolvedPlayers { get; set; }
public override void Spawn()
{
base.Spawn();
FindMinigames();
}
public void StartMinigame(List players, string minigameName = null)
{
InvolvedPlayers = players.ToList();
if (CheckForMinigames())
{
LoadedMinigame = string.IsNullOrEmpty( minigameName ) ? AvailableMinigames.OrderBy( _ => Guid.NewGuid() ).FirstOrDefault() : TypeLibrary.Create( minigameName );
ChatBox.AddInformation( To.Everyone, $"Starting {LoadedMinigame.Name}" );
LoadedMinigame.Initialize( players );
}
}
private bool CheckForMinigames()
{
if ( (AvailableMinigames?.Count ?? 0) == 0 )
{
Log.Error( "Attempted to start minigame, but none available" );
return false;
}
return true;
}
private void FindMinigames()
{
AvailableMinigames = TypeLibrary.GetTypes()
.Where( type => !type.IsAbstract && !type.IsInterface )
.Select( td => TypeLibrary.Create( td.TargetType ) ).ToList();
}
[Event.Hotload]
private void Reload()
{
FindMinigames();
}
private void cleanupPlayerPawns()
{
InvolvedPlayers.ForEach( player =>
{
player.Pawn.Delete();
player.Pawn = null;
} );
}
///
/// Called once per tick by the RoundManager. Ticks any running minigame.
///
/// true if the current minigame has ended, else false
public bool Tick()
{
if ( LoadedMinigame is not { IsValid: true } )
{
return false;
}
var ended = LoadedMinigame.Tick();
if ( !ended )
{
return false;
}
LoadedMinigame.Cleanup();
LoadedMinigame = null;
return true;
}
}