108 lines
2.9 KiB
C#
108 lines
2.9 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEngine;
|
|
using Utility;
|
|
|
|
public class GameManager : MonoBehaviourSingleton<GameManager>
|
|
{
|
|
[SerializeField]
|
|
private double _baseGameDurationSeconds = 10.0 * 60.0;
|
|
|
|
[SerializeField]
|
|
private double _remainingGameDurationSeconds = 0.0;
|
|
|
|
[SerializeField, ShowOnly]
|
|
private double _currentEfficiency = 0.0;
|
|
|
|
[SerializeField]
|
|
private List<Developer> _developers = new();
|
|
|
|
[SerializeField]
|
|
private MultiFalsableBool _gameRunning = new(false);
|
|
|
|
/// <summary>
|
|
/// Wie weit das Spiel bereits fortgeschritten ist.
|
|
/// </summary>
|
|
public double GameProgress => 1.0 - (_remainingGameDurationSeconds / _baseGameDurationSeconds);
|
|
|
|
/// <summary>
|
|
/// Wie Effizient das Team derzeit arbeitet.
|
|
/// </summary>
|
|
public double CurrentEfficiency => _currentEfficiency;
|
|
|
|
/// <summary>
|
|
/// Wie viele Sekunden das Spiel voraussichtlich noch dauern wird, würde die Effizienz sich nicht verändern.
|
|
/// </summary>
|
|
public double ExpectedRemainingGameDuration => _remainingGameDurationSeconds / _currentEfficiency;
|
|
|
|
public bool IsGameRunning => _gameRunning.IsTrue;
|
|
|
|
private void Start()
|
|
{
|
|
StartGame();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Startet ein neues Spiel.
|
|
/// </summary>
|
|
[ContextMenu("Start Game")]
|
|
private void StartGame()
|
|
{
|
|
_remainingGameDurationSeconds = _baseGameDurationSeconds;
|
|
|
|
ResumeGame();
|
|
}
|
|
|
|
/// <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()
|
|
{
|
|
UpdateEfficiency();
|
|
UpdateGameDuration();
|
|
}
|
|
|
|
void UpdateEfficiency()
|
|
{
|
|
double developerEfficiency = 0.0f;
|
|
|
|
foreach (Developer developer in _developers)
|
|
{
|
|
developer.UpdateEfficiency();
|
|
developerEfficiency += developer.CurrentEfficiency;
|
|
}
|
|
|
|
_currentEfficiency = developerEfficiency;
|
|
}
|
|
|
|
void UpdateGameDuration()
|
|
{
|
|
// Entwickler Effizienz ist im Grunde wie viele Entwicklersekunden wir pro Sekunde verrichten können.
|
|
_remainingGameDurationSeconds -= _currentEfficiency;
|
|
}
|
|
}
|