
Added graphics options and rendering quality level settings Added new movement patterns to the dumb enemy AI Added chance for Coward Enemies to drop a random Added method to correctly reset the game variables on death and win screens Updated the UI to work on different resolutions without breaking Moved Sprites into a sprites folder Fixed issue where score would overflow the int because the multiplier was too high Fixed issue where new lives gained from the score breakpoints were not being calculated correctly Fixed issue where clicking off a menu element then trying to control the menu with the controller did not correctly reselect a menu item Fixed issue where enemies colliding with the outer boundary too much would break the sfx and music (i assume from a buffering issue)
328 lines
8.8 KiB
C#
328 lines
8.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Audio;
|
|
using UnityEngine.SceneManagement;
|
|
using UnityEngine.UI;
|
|
|
|
public enum EnemyTypeName
|
|
{
|
|
ENEMYDUMB,
|
|
ENEMYCOWARD,
|
|
ENEMYCHASE,
|
|
ENEMYDROP
|
|
}
|
|
|
|
public enum GameState
|
|
{
|
|
MAINMENU,
|
|
RULESMENU,
|
|
GAME,
|
|
DEATHMENU,
|
|
WINMENU
|
|
}
|
|
|
|
public class GameManager : MonoBehaviour
|
|
{
|
|
private static GameManager _instance;
|
|
public static GameManager Instance
|
|
{
|
|
get
|
|
{
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
// Dictionary to hold the enemy counts and type
|
|
public Dictionary<EnemyTypeName, EnemyType> enemyList = new Dictionary<EnemyTypeName, EnemyType>();
|
|
|
|
public AudioMixer currentAudioMixer;
|
|
|
|
public bool godMode = false;
|
|
|
|
private HiddenValueInt _startingLives = new HiddenValueInt(5);
|
|
private HiddenValueInt _lives = new HiddenValueInt(0);
|
|
|
|
private int _firstLevel = 0;
|
|
private HiddenValueInt _level = new HiddenValueInt(0);
|
|
|
|
public int blackHoleSize = 0;
|
|
|
|
private int _startCores = 0;
|
|
private HiddenValueInt _coreCount = new HiddenValueInt(0);
|
|
private List<HiddenValueInt> _coresNeeded = new List<HiddenValueInt>();
|
|
|
|
private HiddenValueInt _score = new HiddenValueInt(0);
|
|
|
|
public bool boss = false;
|
|
public bool isGameOver = false;
|
|
|
|
public GameState currentGameState;
|
|
public bool warmStart = false;
|
|
|
|
private int _versionMajor = 0;
|
|
private int _versionMinor = 2;
|
|
private int _versionRevision = 0;
|
|
|
|
public string CurrentVersion
|
|
{
|
|
get
|
|
{
|
|
return _versionMajor.ToString() + "." + _versionMinor.ToString() + "." + _versionRevision.ToString();
|
|
}
|
|
}
|
|
|
|
public int CurrentLevel
|
|
{
|
|
get
|
|
{
|
|
return _level.Value;
|
|
}
|
|
}
|
|
|
|
public int CurrentLives
|
|
{
|
|
get
|
|
{
|
|
return _lives.Value;
|
|
}
|
|
}
|
|
|
|
public int CurrentCores
|
|
{
|
|
get
|
|
{
|
|
return _coreCount.Value;
|
|
}
|
|
}
|
|
|
|
public int CurrentScore
|
|
{
|
|
get
|
|
{
|
|
return _score.Value;
|
|
}
|
|
}
|
|
|
|
public int CurrentNeededCores
|
|
{
|
|
get
|
|
{
|
|
int result;
|
|
|
|
if (CurrentLevel == 5)
|
|
{
|
|
result = _coreCount.Value;
|
|
}
|
|
|
|
if (CurrentLevel == -1)
|
|
{
|
|
result = -1;
|
|
}
|
|
else if (_coresNeeded.Count <= CurrentLevel)
|
|
{
|
|
result = _coresNeeded[_coresNeeded.Count - 1].Value;
|
|
}
|
|
else
|
|
{
|
|
result = _coresNeeded[CurrentLevel].Value;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
if (_instance != null && _instance != this)
|
|
{
|
|
Destroy(gameObject);
|
|
}
|
|
else
|
|
{
|
|
_instance = this;
|
|
DontDestroyOnLoad(gameObject);
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
// Load the saved audio levels into the mixer
|
|
if (PlayerPrefs.HasKey("currentMasterVol"))
|
|
{
|
|
float currentMasterVol = PlayerPrefs.GetFloat("currentMasterVol");
|
|
float currentMusicVol = PlayerPrefs.GetFloat("currentMusicVol");
|
|
float currentSFXVol = PlayerPrefs.GetFloat("currentSFXVol");
|
|
|
|
currentAudioMixer.SetFloat("masterVol", SharedMethods.ConvertToDecibels(currentMasterVol));
|
|
currentAudioMixer.SetFloat("musicVol", SharedMethods.ConvertToDecibels(currentMusicVol));
|
|
currentAudioMixer.SetFloat("sfxVol", SharedMethods.ConvertToDecibels(currentSFXVol));
|
|
}
|
|
else
|
|
{
|
|
float currentMasterVol = 1.0f;
|
|
float currentMusicVol = 0.5f;
|
|
float currentSFXVol = 0.8f;
|
|
|
|
currentAudioMixer.SetFloat("masterVol", SharedMethods.ConvertToDecibels(currentMasterVol));
|
|
currentAudioMixer.SetFloat("musicVol", SharedMethods.ConvertToDecibels(currentMusicVol));
|
|
currentAudioMixer.SetFloat("sfxVol", SharedMethods.ConvertToDecibels(currentSFXVol));
|
|
|
|
PlayerPrefs.SetFloat("currentMasterVol", currentMasterVol);
|
|
PlayerPrefs.SetFloat("currentMusicVol", currentMusicVol);
|
|
PlayerPrefs.SetFloat("currentSFXVol", currentSFXVol);
|
|
}
|
|
|
|
}
|
|
|
|
public void ResetStats()
|
|
{
|
|
_lives.Value = _startingLives.Value;
|
|
_coreCount.Value = _startCores;
|
|
_level.Value = _firstLevel;
|
|
_score.Value = 0;
|
|
isGameOver = false;
|
|
}
|
|
|
|
public void SetupLevel()
|
|
{
|
|
if (warmStart)
|
|
{
|
|
ResetStats();
|
|
warmStart = false;
|
|
}
|
|
|
|
if (_coresNeeded.Count == 0)
|
|
{
|
|
_coresNeeded.Add(new HiddenValueInt(4));
|
|
_coresNeeded.Add(new HiddenValueInt(6));
|
|
_coresNeeded.Add(new HiddenValueInt(12));
|
|
_coresNeeded.Add(new HiddenValueInt(16));
|
|
_coresNeeded.Add(new HiddenValueInt(20));
|
|
}
|
|
|
|
if (enemyList.Count == 0)
|
|
{
|
|
// Set up the enemy level and count dictionaries
|
|
EnemyType enemyDumbSetup = new EnemyType();
|
|
EnemyType enemyCowardSetup = new EnemyType();
|
|
EnemyType enemyChaseSetup = new EnemyType();
|
|
EnemyType enemyDropSetup = new EnemyType();
|
|
|
|
// Level 1 numbers
|
|
enemyDumbSetup.AddLevelStats(0, 15, 500, 300.0f, 10.0f);
|
|
enemyCowardSetup.AddLevelStats(0, 1, 1500, 300.0f, 10.0f);
|
|
enemyChaseSetup.AddLevelStats(0, 0, 0, 0.0f, 0.0f);
|
|
enemyDropSetup.AddLevelStats(0, 0, 0, 0.0f, 0.0f);
|
|
|
|
// Level 2 numbers
|
|
enemyDumbSetup.AddLevelStats(1, 20, 450, 240.0f, 20.0f);
|
|
enemyCowardSetup.AddLevelStats(1, 5, 1000, 300.0f, 10.0f);
|
|
enemyChaseSetup.AddLevelStats(1, 0, 0, 0.0f, 0.0f);
|
|
enemyDropSetup.AddLevelStats(1, 0, 0, 0.0f, 0.0f);
|
|
|
|
// Level 3 numbers
|
|
enemyDumbSetup.AddLevelStats(2, 20, 200, 180.0f, 40.0f);
|
|
enemyCowardSetup.AddLevelStats(2, 8, 500, 240.0f, 20.0f);
|
|
enemyChaseSetup.AddLevelStats(2, 2, 1500, 360.0f, 5.0f);
|
|
enemyDropSetup.AddLevelStats(2, 0, 0, 0.0f, 0.0f);
|
|
|
|
// Level 4 numbers
|
|
enemyDumbSetup.AddLevelStats(3, 25, 150, 180.0f, 50.0f);
|
|
enemyCowardSetup.AddLevelStats(3, 10, 500, 240.0f, 30.0f);
|
|
enemyChaseSetup.AddLevelStats(3, 5, 1000, 300.0f, 20.0f);
|
|
enemyDropSetup.AddLevelStats(3, 2, 2000, 300.0f, 10.0f);
|
|
|
|
// Add the counts to the enemy type dictionaries
|
|
enemyList.Add(EnemyTypeName.ENEMYDUMB, enemyDumbSetup);
|
|
enemyList.Add(EnemyTypeName.ENEMYCOWARD, enemyCowardSetup);
|
|
enemyList.Add(EnemyTypeName.ENEMYCHASE, enemyChaseSetup);
|
|
enemyList.Add(EnemyTypeName.ENEMYDROP, enemyDropSetup);
|
|
}
|
|
}
|
|
|
|
public EnemyType.EnemyTypeStat GetCurrentLevelEnemyStats(EnemyTypeName enemyType)
|
|
{
|
|
if (enemyList[enemyType][CurrentLevel] == null)
|
|
{
|
|
// Get the "last" levels numbers
|
|
return enemyList[enemyType][enemyList[enemyType].Count - 1];
|
|
}
|
|
else
|
|
{
|
|
return enemyList[enemyType][CurrentLevel];
|
|
}
|
|
}
|
|
|
|
public int GetCurrentLevelEnemyTypeCount(EnemyTypeName enemyType)
|
|
{
|
|
int result;
|
|
// Check if the current level is higher than the max we have set up (we should probs cap it)
|
|
if (enemyList[enemyType][CurrentLevel] == null)
|
|
{
|
|
// Get the "last" levels numbers
|
|
result = enemyList[enemyType][enemyList[enemyType].Count - 1].SpawnCount;
|
|
}
|
|
else
|
|
{
|
|
// Get the current levels numbers
|
|
result = enemyList[enemyType][CurrentLevel].SpawnCount;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void LateUpdate()
|
|
{
|
|
if (currentGameState == GameState.GAME)
|
|
{
|
|
if (CurrentCores >= CurrentNeededCores)
|
|
{
|
|
_coreCount.Value = 0;
|
|
_level += 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddScore(int amount)
|
|
{
|
|
_score.Value = Mathf.Clamp(CurrentScore + amount, 0, 999999999);
|
|
}
|
|
|
|
public void SetScore(int amount)
|
|
{
|
|
_score.Value = Mathf.Clamp(amount, 0, 999999999);
|
|
}
|
|
|
|
public void WarpLevels(int amount)
|
|
{
|
|
_level += amount;
|
|
}
|
|
|
|
public void LostLife()
|
|
{
|
|
_lives -= 1;
|
|
}
|
|
|
|
public void AddCore(int amount = 1)
|
|
{
|
|
_coreCount += amount;
|
|
}
|
|
|
|
public void AddLife(int amount = 1)
|
|
{
|
|
_lives.Value = Mathf.Clamp(CurrentLives + amount, -1, 99);
|
|
}
|
|
public void DoGameOver()
|
|
{
|
|
isGameOver = true;
|
|
SceneManager.LoadSceneAsync("Dead");
|
|
}
|
|
|
|
public void DoGameWon()
|
|
{
|
|
isGameOver = true;
|
|
SceneManager.LoadSceneAsync("Win");
|
|
}
|
|
}
|