Files
VOIDRPG/Assets/90 - Scripts/Lobby/LobbyGameStarterManager.cs
T
2026-07-09 21:33:33 +02:00

77 lines
2.9 KiB
C#

using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
using VOID.Generic;
using VOID.Generic.Objects.Unit;
using VOID.Generic.Objects.Unit.Actions;
using VOID.Generic.Objects.Usable;
using VOID.Generic.Objects.Usable.Events;
using VOID.Generic.Player;
using VOID.Generic.Util;
using VOID.ScriptableObjects;
using VOID.UserInterface.Generic.Lobby;
namespace VOID.Lobby
{
public class LobbyGameStarterManager : MonoBehaviour
{
[SerializeField, Required] private UsableObject _startObject;
[SerializeField, RequiredListLength(MinLength = 1)] private List<UnitGenerator> _unitGenerators = new();
[SerializeField, RequiredListLength(MinLength = 1)] private List<Transform> _generatePositions = new();
[SerializeField] private int _generateCount = 3;
private Dictionary<UnitObject, Transform> _generatedUnits = new();
private void Start()
{
if (_generateCount > _generatePositions.Count)
{
_generateCount = _generatePositions.Count;
Debug.LogWarning($"Not enough position ({_generatePositions.Count}) to generate {_generateCount} units");
}
// Initialize units
RandomUtil.RandomElements(_generatePositions, _generateCount).ForEach(position =>
{
var unit = RandomUtil.RandomElement(_unitGenerators).Generate();
unit.transform.SetPositionAndRotation(position.position, position.rotation);
_generatedUnits.Add(unit, position);
LobbyGameStarterUI.current.AddUnit(unit, SelectUnit);
});
// 1. Check if game start is possible
// 2. Start game
_startObject.usableEvents.onUsedBefore.AddListener(CanStartGame);
_startObject.usableEvents.onUsedAfter.AddListener(StartGame);
}
private void SelectUnit(UnitObject unit)
{
// Make previous unit go back to its original position and wait
var previousUnit = PlayerController.current.mainUnit;
if (previousUnit)
{
previousUnit.OrderStop();
previousUnit.OrderChain(new List<AbstractAction>()
{
new MoveAction(previousUnit, _generatedUnits[previousUnit].position),
new RotateAction(previousUnit, _generatedUnits[previousUnit].rotation.y)
});
}
PlayerController.current.SetMainUnit(unit);
PlayerController.current.SetMainUnitActive();
}
private void CanStartGame(UseEvent useEvent)
{
// Trying to start game without selecting avatar
if (!PlayerController.current.mainUnit) useEvent.prevented = true;
}
private void StartGame(UseEvent useEvent)
{
GameLoopManager.current.LoadGenerator(PlayerController.current.mainUnit);
}
}
}