235 lines
6.2 KiB
C#
235 lines
6.2 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using MyTypes;
|
|
using TMPro;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
public class GameManager : MonoBehaviour
|
|
{
|
|
static GameManager _instance;
|
|
public static GameManager Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null)
|
|
{
|
|
_instance = GameObject.FindObjectOfType<GameManager>();
|
|
|
|
if (_instance == null)
|
|
{
|
|
GameObject container = new GameObject("GameManager");
|
|
_instance = container.AddComponent<GameManager>();
|
|
}
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//game references
|
|
private MyTypes.MyGrid grid;
|
|
public MyTypes.MyGrid Grid
|
|
{
|
|
get
|
|
{
|
|
return grid;
|
|
}
|
|
}
|
|
|
|
[System.NonSerialized]
|
|
public GameObject player;
|
|
public List<GameObject> enemies;
|
|
public List<GameObject> spikes;
|
|
|
|
public GameObject scoreCanvas;
|
|
private ScoreSystem scoreSys;
|
|
public ScoreSystem ScoreSys { get { return scoreSys; } }
|
|
public Animator fade;
|
|
public LevelGeneration levelGeneration;
|
|
|
|
public bool autoStart = false;
|
|
//Testing
|
|
public bool hardStart = false;
|
|
private int round = 0;
|
|
|
|
private bool gameActive = false;
|
|
|
|
|
|
private void Start()
|
|
{
|
|
CreateGrid();
|
|
InitializeScore();
|
|
if (SceneManager.GetActiveScene().buildIndex == 1)
|
|
{
|
|
Debug.Log(SceneManager.GetActiveScene().buildIndex);
|
|
StartGame();
|
|
}else if (hardStart){
|
|
StartGame();
|
|
}
|
|
|
|
AudioManager.instance.Play("MainMusic");
|
|
}
|
|
|
|
public void Lose(){
|
|
AudioManager.instance.Play("GameOver");
|
|
PlayerPrefs.SetInt("Score", scoreSys.Score);
|
|
StartCoroutine(Lose(2f));
|
|
}
|
|
IEnumerator Lose(float delay){
|
|
yield return new WaitForSeconds(delay);
|
|
fade.SetTrigger("FadeIn");
|
|
yield return new WaitForSeconds(1f);
|
|
Loader.Load(4);
|
|
}
|
|
|
|
private float timeSinceStart = 0;
|
|
private void Update()
|
|
{
|
|
if (gameActive) {
|
|
timeSinceStart += (Time.deltaTime*(round+1));
|
|
if (timeSinceStart>=1)
|
|
{
|
|
timeSinceStart = 0;
|
|
scoreSys.AddScore(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void InitializeScore()
|
|
{
|
|
scoreSys = scoreCanvas.GetComponentInChildren<ScoreSystem>();
|
|
}
|
|
private void CreateGrid()
|
|
{
|
|
|
|
//grid initialization
|
|
grid = new MyTypes.MyGrid(MyVars.gridWidth, MyVars.gridHeight);
|
|
|
|
//grid population
|
|
for (int i = 0; i < MyVars.gridWidth; ++i)
|
|
{
|
|
for (int j = 0; j < MyVars.gridHeight; ++j)
|
|
{
|
|
grid.grid[i, j] = new MyCell(i, j);
|
|
grid.AddAvailableCell(grid.grid[i, j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void StopGame()
|
|
{
|
|
GameManager.Instance.gameActive = false;
|
|
}
|
|
public void StartGame(){
|
|
|
|
GameManager.Instance.player = Spawner.Instance.SpawnPlayer();
|
|
GameManager.Instance.spikes = new List<GameObject>(Spawner.Instance.SpawnSpike((int)MyVars.spikeAmount));
|
|
GameManager.Instance.enemies = new List<GameObject>(Spawner.Instance.SpawnEnemy((int)MyVars.minEnemyAmount)); //add the enemies last since it is relevant for grid cell purposes
|
|
|
|
GameManager.Instance.scoreCanvas.SetActive(true);
|
|
|
|
GameManager.Instance.gameActive = true;
|
|
|
|
if(levelGeneration!=null)
|
|
levelGeneration.StartGeneration();
|
|
}
|
|
public void movePawn(MyPawn pawn, MyCell targetCell)
|
|
{
|
|
grid.movePawn(pawn, targetCell);
|
|
}
|
|
public void movePawn(MyPawn pawn, MyDirection dir)
|
|
{
|
|
Vector2Int pawnPos = pawn.CurrentCell.position;
|
|
|
|
//prevent movement if you are on the edge of the screen
|
|
if (pawnPos.x == MyVars.gridWidth - 1 && dir == MyDirection._RIGHT)
|
|
return;
|
|
else if (pawnPos.x == 0 && dir == MyDirection._LEFT)
|
|
return;
|
|
else if (pawnPos.y == MyVars.gridHeight - 1 && dir == MyDirection._UP)
|
|
return;
|
|
else if (pawnPos.y == 0 && dir == MyDirection._DOWN)
|
|
return;
|
|
|
|
|
|
//look up destination cell
|
|
MyCell targetCell;
|
|
switch (dir)
|
|
{
|
|
default:
|
|
case MyDirection._UP:
|
|
targetCell = grid.grid[pawn.CurrentCell.position.x, pawn.CurrentCell.position.y+1];
|
|
break;
|
|
case MyDirection._DOWN:
|
|
targetCell = grid.grid[pawn.CurrentCell.position.x, pawn.CurrentCell.position.y - 1];
|
|
break;
|
|
case MyDirection._RIGHT:
|
|
targetCell = grid.grid[pawn.CurrentCell.position.x+1, pawn.CurrentCell.position.y];
|
|
break;
|
|
case MyDirection._LEFT:
|
|
targetCell = grid.grid[pawn.CurrentCell.position.x-1, pawn.CurrentCell.position.y];
|
|
break;
|
|
}
|
|
|
|
|
|
//if cell is empty, proceed
|
|
if (targetCell.Pawn == null)
|
|
{
|
|
grid.movePawn(pawn, targetCell);
|
|
}
|
|
}
|
|
|
|
public void SlowTime(bool slowmo)
|
|
{
|
|
if (slowmo)
|
|
Time.timeScale = MyVars.slowTime;
|
|
else
|
|
Time.timeScale = MyVars.defaultTime;
|
|
}
|
|
|
|
public void nextRound()
|
|
{
|
|
round++;
|
|
enemies.AddRange(Spawner.Instance.SpawnEnemy((int)Mathf.Min(MyVars.minEnemyAmount+round*MyVars.enemyAmountGrowth, MyVars.maxEnemyAmount), Mathf.Min(MyVars.enemyMaxSpeed, round* MyVars.enemySpeedGrowth)));
|
|
}
|
|
|
|
private void ClearGame()
|
|
{
|
|
foreach (GameObject go in enemies)
|
|
Destroy(go);
|
|
enemies.Clear();
|
|
|
|
foreach (GameObject go in spikes)
|
|
Destroy(go);
|
|
spikes.Clear();
|
|
|
|
scoreSys.Score = 0;
|
|
|
|
Destroy(player);
|
|
|
|
CreateGrid();
|
|
}
|
|
|
|
public void PlayAgain()
|
|
{
|
|
ClearGame();
|
|
StartGame();
|
|
round = 0;
|
|
}
|
|
public void Exit()
|
|
{
|
|
#if UNITY_STANDALONE
|
|
//Quit the application
|
|
Application.Quit();
|
|
#endif
|
|
|
|
//If we are running in the editor
|
|
#if UNITY_EDITOR
|
|
//Stop playing the scene
|
|
UnityEditor.EditorApplication.isPlaying = false;
|
|
#endif
|
|
}
|
|
}
|