GameVsJam/3d Prototyp/Assets/Scripts/GameManager.cs

108 lines
2.9 KiB
C#
Raw Normal View History

2024-04-04 15:26:31 +02:00
using System;
2024-04-04 12:14:58 +02:00
using System.Collections;
using System.Collections.Generic;
2024-04-04 15:26:31 +02:00
using System.Linq;
2024-04-04 12:14:58 +02:00
using UnityEngine;
using Utility;
2024-04-04 12:14:58 +02:00
public class GameManager : MonoBehaviourSingleton<GameManager>
2024-04-04 12:14:58 +02:00
{
2024-04-04 15:26:31 +02:00
[SerializeField]
private double _baseGameDurationSeconds = 10.0 * 60.0;
2024-04-04 15:26:31 +02:00
[SerializeField]
private double _remainingGameDurationSeconds = 0.0;
2024-04-04 15:26:31 +02:00
[SerializeField, ShowOnly]
private double _currentEfficiency = 0.0;
[SerializeField]
private List<Developer> _developers = new();
2024-04-04 18:05:27 +02:00
[SerializeField]
private MultiFalsableBool _gameRunning = new(false);
2024-04-04 15:26:31 +02:00
/// <summary>
2024-04-04 18:05:27 +02:00
/// Wie weit das Spiel bereits fortgeschritten ist.
2024-04-04 15:26:31 +02:00
/// </summary>
public double GameProgress => 1.0 - (_remainingGameDurationSeconds / _baseGameDurationSeconds);
2024-04-04 15:26:31 +02:00
/// <summary>
/// Wie Effizient das Team derzeit arbeitet.
/// </summary>
public double CurrentEfficiency => _currentEfficiency;
/// <summary>
2024-04-04 18:05:27 +02:00
/// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würde die Effizienz sich nicht verändern.
2024-04-04 15:26:31 +02:00
/// </summary>
public double ExpectedRemainingGameDuration => _remainingGameDurationSeconds / _currentEfficiency;
2024-04-04 18:05:27 +02:00
public bool IsGameRunning => _gameRunning.IsTrue;
2024-04-04 15:26:31 +02:00
private void Start()
2024-04-04 18:05:27 +02:00
{
StartGame();
}
/// <summary>
/// Startet ein neues Spiel.
/// </summary>
[ContextMenu("Start Game")]
private void StartGame()
{
_remainingGameDurationSeconds = _baseGameDurationSeconds;
2024-04-04 18:05:27 +02:00
ResumeGame();
}
2024-04-04 18:05:27 +02:00
/// <summary>
/// Hebt eine Pausierung auf und setzt das Spiel fort, wenn alle Pausierungen aufgehoben wurden.
/// </summary>
/// <remarks>Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden.</remarks>
[ContextMenu("Resume Game")]
public void ResumeGame()
{
if (_gameRunning.MakeTruer())
{
InvokeRepeating(nameof(UpdateProgress), 0.0f, 1.0f);
}
}
/// <summary>
/// Pausiert das Spiel. Ist Stapelbar.
/// </summary>
/// <remarks>Hinweis: Für jedes PauseGame muss ein ResumeGame aufgerufen werden.</remarks>
[ContextMenu("Pause Game")]
public void PauseGame()
{
_gameRunning.MakeFalslier();
CancelInvoke(nameof(UpdateProgress));
}
void UpdateProgress()
2024-04-04 12:14:58 +02:00
{
2024-04-04 15:26:31 +02:00
UpdateEfficiency();
UpdateGameDuration();
}
void UpdateEfficiency()
{
double developerEfficiency = 0.0f;
foreach (Developer developer in _developers)
{
developer.UpdateEfficiency();
developerEfficiency += developer.CurrentEfficiency;
}
_currentEfficiency = developerEfficiency;
2024-04-04 15:26:31 +02:00
}
void UpdateGameDuration()
{
// Entwickler Effizienz ist im Grunde wie viele Entwicklersekunden wir pro Sekunde verrichten können.
_remainingGameDurationSeconds -= _currentEfficiency;
2024-04-04 12:14:58 +02:00
}
}