EscapeShooter/My project/Assets/Project Files/Game/Scripts/Characters/CharactersController.cs

158 lines
5.0 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Watermelon.SquadShooter
{
public class CharactersController : MonoBehaviour
{
public static int BasePower { get; private set; }
private static CharacterData selectedCharacter;
public static CharacterData SelectedCharacter => selectedCharacter;
public static CharacterData LastUnlockedCharacter => database.GetLastUnlockedCharacter();
public static CharacterData NextCharacterToUnlock => database.GetNextCharacterToUnlock();
private static CharacterGlobalSave characterSave;
public static event CharacterCallback OnCharacterSelectedEvent;
public static event CharacterCallback OnCharacterUpgradedEvent;
private static List<CharacterUpgrade> keyUpgrades;
private static CharactersDatabase database;
public void Init(CharactersDatabase database)
{
CharactersController.database = database;
// Initialise characters database
database.Init();
// Get global save
characterSave = SaveController.GetSaveObject<CharacterGlobalSave>("characters");
CharacterData saveCharacter = GetCharacter(characterSave.SelectedCharacterID);
keyUpgrades = new List<CharacterUpgrade>();
for (int i = 0; i < database.Characters.Length; i++)
{
CharacterData character = database.Characters[i];
for (int j = 0; j < character.Upgrades.Length; j++)
{
if (character.Upgrades[j].Stats.KeyUpgradeNumber != -1)
{
keyUpgrades.Add(character.Upgrades[j]);
if (character.Upgrades[j].Stats.KeyUpgradeNumber == 0)
{
BasePower = character.Upgrades[j].Stats.Power;
}
}
}
}
keyUpgrades.OrderBy(u => u.Stats.KeyUpgradeNumber);
// Check if character from save is unlocked
if (IsCharacterUnlocked(saveCharacter))
{
// Load selected character from save
selectedCharacter = saveCharacter;
}
else
{
// Select default character
selectedCharacter = database.GetDefaultCharacter();
}
}
private void OnDestroy()
{
BasePower = 0;
selectedCharacter = null;
characterSave = null;
keyUpgrades = null;
database = null;
OnCharacterSelectedEvent = null;
OnCharacterUpgradedEvent = null;
}
public static bool IsCharacterUnlocked(CharacterData character)
{
if (character != null)
return character.IsUnlocked();
return false;
}
public static void SelectCharacter(CharacterData character)
{
if (selectedCharacter == character)
return;
if (character != null)
{
selectedCharacter = character;
characterSave.SelectedCharacterID = character.ID;
CharacterBehaviour characterBehaviour = CharacterBehaviour.GetBehaviour();
if(characterBehaviour != null)
{
CharacterStageData characterStage = character.GetCurrentStage();
CharacterUpgrade characterUpgrade = character.GetCurrentUpgrade();
characterBehaviour.SetStats(characterUpgrade.Stats);
characterBehaviour.SetGraphics(characterStage.Prefab, false, false);
}
// Invoke select character callback
OnCharacterSelectedEvent?.Invoke(selectedCharacter);
}
}
public static void OnCharacterUpgraded(CharacterData character)
{
AudioController.PlaySound(AudioController.GetClip("upgrade"));
OnCharacterUpgradedEvent?.Invoke(character);
}
public static CharactersDatabase GetDatabase()
{
return database;
}
public static CharacterData GetCharacter(string characterID)
{
return database.GetCharacter(characterID);
}
public static int GetCharacterIndex(CharacterData character)
{
return System.Array.FindIndex(database.Characters, x => x == character);
}
public static int GetCeilingUpgradePower(int currentKeyUpgrade)
{
for (int i = keyUpgrades.Count - 1; i >= 0; i--)
{
if (keyUpgrades[i].Stats.KeyUpgradeNumber <= currentKeyUpgrade)
{
return keyUpgrades[i].Stats.Power;
}
}
return keyUpgrades[0].Stats.Power;
}
public delegate void CharacterCallback(CharacterData character);
}
}