Add initial game systems and input handling for player interactions
This commit is contained in:
97
Assets/Scripts/Core/GameSession.cs
Normal file
97
Assets/Scripts/Core/GameSession.cs
Normal file
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
|
||||
namespace Core
|
||||
{
|
||||
public class GameSession
|
||||
{
|
||||
public GameMode GameMode { get; private set; }
|
||||
public int Score { get; private set; }
|
||||
public int Lives { get; private set; }
|
||||
public float TimeRemaining { get; private set; }
|
||||
public bool IsGameOver { get; private set; }
|
||||
public int HighScore { get; private set; }
|
||||
|
||||
public event Action<int> OnScoreChanged;
|
||||
public event Action<int> OnLivesChanged;
|
||||
public event Action<float> OnTimeChanged;
|
||||
public event Action OnGameOver;
|
||||
|
||||
private readonly int _initialTimeOrLives;
|
||||
|
||||
public GameSession(GameMode gameMode, int initialValue, int currentHighScore)
|
||||
{
|
||||
GameMode = gameMode;
|
||||
Score = 0;
|
||||
IsGameOver = false;
|
||||
HighScore = currentHighScore;
|
||||
|
||||
switch (gameMode)
|
||||
{
|
||||
case GameMode.TimeAttack:
|
||||
TimeRemaining = initialValue;
|
||||
Lives = 1;
|
||||
break;
|
||||
case GameMode.Arcade:
|
||||
Lives = initialValue;
|
||||
TimeRemaining = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void Tick(float deltaTime)
|
||||
{
|
||||
if (IsGameOver || GameMode != GameMode.TimeAttack) return;
|
||||
|
||||
TimeRemaining -= deltaTime;
|
||||
OnTimeChanged?.Invoke(TimeRemaining);
|
||||
|
||||
if (TimeRemaining <= 0)
|
||||
{
|
||||
TimeRemaining = 0;
|
||||
EndGame();
|
||||
}
|
||||
}
|
||||
|
||||
public void AddScore(int points)
|
||||
{
|
||||
if (IsGameOver) return;
|
||||
|
||||
Score += points;
|
||||
OnScoreChanged?.Invoke(Score);
|
||||
}
|
||||
|
||||
public void LoseLife()
|
||||
{
|
||||
if (IsGameOver) return;
|
||||
|
||||
if (GameMode == GameMode.Arcade)
|
||||
{
|
||||
Lives--;
|
||||
OnLivesChanged?.Invoke(Lives);
|
||||
}
|
||||
else
|
||||
{
|
||||
TimeRemaining -= _initialTimeOrLives;
|
||||
OnTimeChanged?.Invoke(TimeRemaining);
|
||||
}
|
||||
|
||||
if (Lives <= 0)
|
||||
{
|
||||
Lives = 0;
|
||||
EndGame();
|
||||
}
|
||||
}
|
||||
|
||||
private void EndGame()
|
||||
{
|
||||
IsGameOver = true;
|
||||
|
||||
if (Score > HighScore)
|
||||
{
|
||||
HighScore = Score;
|
||||
}
|
||||
|
||||
OnGameOver?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user