using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEngine.Events; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Session : MonoBehaviour { public static Session main; [SerializeField] private PlayerConfig playerConfig; [SerializeField] private UnityEvent onVictory; [SerializeField] private UnityEvent onDefeat; [SerializeField] private UnityEvent onInventory; [SerializeField] private UnityEvent onNextLevel; [Header("Enemies")] [Space (3)] [SerializeField] private List enemyUIPositions = new List(); [SerializeField] private List enemyPrefabs; [Header("Player")] [Space] [SerializeField] private GameObject equipmentParent; [SerializeField] private GameObject player; [SerializeField] private Transform playerPosition; [HideInInspector] public GameObject playerLink; [Header("UI")] [Space] [SerializeField] private PhaseCounter phaseCounter; [SerializeField] private Transform incidentPosition; [Space(3)] [Header("For checking")] [SerializeField] private BattleConfig battleConfig; public int numberPhase = 1; public int quantityEnemies = 0; public bool waitingEndingRound = false; public List currentEnemies = new List(); public MissionConfig mission; public int missionChecker = 0; private void Awake() { if (main != null && main != this) { Debug.LogWarning("2 session on the scene"); Destroy(this); return; } main = this; mission = DataHolder.main.mission; battleConfig = SearchNextLevel(); if(battleConfig == null) { Incident(); battleConfig = SearchNextLevel(); } } public void Start() { phaseCounter.NewMaxPhase(battleConfig); CreatePlayer(); FirstPhase(); } public void FirstPhase() { var FP = battleConfig.battleCharacteristics.firstPhaseOptions; int quantity = Random.Range(FP.minimumQuantity, FP.maximumQuantity + 1); for (int i = 0; i < quantity; i++) { quantityEnemies++; EnemyConfig enemy = Randomizer(i, FP.enemies); currentEnemies.Add(CreateEnemies(enemy, i)); } } public void SecondPhase() { if (!battleConfig.battleCharacteristics.SecondPhase) { Victory(); return; } phaseCounter.NewPhase(); var SP = battleConfig.battleCharacteristics.SecondPhaseOptions; int quantity = Random.Range(SP.minimumQuantity, SP.maximumQuantity); for (int i = 0; i < quantity; i++) { quantityEnemies++; EnemyConfig enemy = Randomizer(i, SP.enemies); currentEnemies.Add(CreateEnemies(enemy, i)); } } public void ThirdPhase() { if (!battleConfig.battleCharacteristics.ThirdPhase) { Victory(); return; } phaseCounter.NewPhase(); var TP = battleConfig.battleCharacteristics.ThirdPhaseOptions; int quantity = Random.Range(TP.minimumQuantity, TP.maximumQuantity); for (int i = 0; i < quantity; i++) { quantityEnemies++; EnemyConfig enemy = Randomizer(i, TP.enemies); currentEnemies.Add(CreateEnemies(enemy, i)); } } //EventLogic public void Victory() { onVictory?.Invoke(); DeckManager.main.turn = 0; } public void Defeat() { onDefeat?.Invoke(); DeckManager.main.turn = 0; } public void Inventory() { onInventory?.Invoke(); } //EventLogic end // RandomBlock EnemyConfig Randomizer(int _position, List _enemyConfigs) { for (int i = 0; i < _enemyConfigs.Count; i++) { if (_enemyConfigs[i].enemyCharacteristics.minimumPosition < _position + 1 || _enemyConfigs[i].enemyCharacteristics.maximumPosition > _position + 1) { return RandomInRandomizer(_position, _enemyConfigs); } } Debug.LogError("WARNING! no config found for position" + _position.ToString()); return null; } EnemyConfig RandomInRandomizer(int _position, List _enemyConfigs) { int _numberEnemy; _numberEnemy = Random.Range(0, _enemyConfigs.Count); if (_enemyConfigs[_numberEnemy].enemyCharacteristics.minimumPosition > _position + 1 || _enemyConfigs[_numberEnemy].enemyCharacteristics.maximumPosition < _position + 1) { return Randomizer(_position, _enemyConfigs); } return _enemyConfigs[_numberEnemy]; } // RandomBlock end //EnemyBlock public GameObject CreateEnemies(EnemyConfig _config, int _position) { for (int i = 0; i < enemyPrefabs.Count; i++) { if (enemyPrefabs[i].GetComponent().enemyConfig == _config) { GameObject _enemy = Instantiate(enemyPrefabs[i], enemyUIPositions[_position]); _enemy.GetComponent().currentPosition = _position; return (_enemy); } } Debug.LogError("enemy prefab not found. Please, check battleConfig and enemyPrefabs"); return null; } public void SwitchEnemyPosition() { for (int i = 0; i < currentEnemies.Count; i++) { currentEnemies[i].GetComponent().currentPosition = i; currentEnemies[i].transform.position = enemyUIPositions[currentEnemies[i].GetComponent().currentPosition].position; } } public void EnemiesStep() { for (int i = 0; i < currentEnemies.Count; i++) { if (currentEnemies[i] != null) { currentEnemies[i].GetComponent().Turn(); } } } public void EnemyDeath(GameObject _deadEnemy) { quantityEnemies--; for (int i = 0; i < currentEnemies.Count; i++) { if (currentEnemies[i] == _deadEnemy) { Destroy(currentEnemies[i]); currentEnemies.RemoveAt(i); } } if (quantityEnemies == 0) { StartCoroutine(ChekingCoroutine()); } SwitchEnemyPosition(); } IEnumerator ChekingCoroutine() { waitingEndingRound = true; currentEnemies.Clear(); yield return new WaitForSeconds(0.2f); if (numberPhase == 1 && battleConfig.battleCharacteristics.SecondPhase) { numberPhase++; SecondPhase(); } else if (numberPhase == 2 && battleConfig.battleCharacteristics.ThirdPhase) { numberPhase++; ThirdPhase(); } else { Victory(); } waitingEndingRound = false; } //EnemyBlock end public void CreatePlayer() { Instantiate(player, playerPosition); Player.main.playerConfig = playerConfig; Player.main.NewInformation(); } public void LaunchNextLevel() { onNextLevel?.Invoke(); } public void LaunchMainMenu() { DataHolder.main.mission = null; DataHolder.main.ReturnInMainMenu(); } public void NextLevel() { battleConfig = SearchNextLevel() ; if (battleConfig == null) { DataHolder.main.mission = null; DataHolder.main.ReturnInMainMenu(); return; } phaseCounter.NewMaxPhase(battleConfig); FirstPhase(); } public BattleConfig SearchNextLevel() { if(mission != null) { return NextBattle(); } else { return DataHolder.main.RandomLevel(DataHolder.complexityLevels.all); } } public BattleConfig NextBattle() { missionChecker++; if (missionChecker > mission.missionItems.Count) { return null; } return mission.missionItems[missionChecker - 1].battle; } public void UseEquipment() { for (int i = 0; i < DataHolder.main.PlayerEquipment.Count; i++) { Instantiate(DataHolder.main.PlayerEquipment[i], equipmentParent.transform); } } public void Incident() { if (mission == null || missionChecker >= mission.missionItems.Count) return; Instantiate(mission.missionItems[missionChecker - 1].incident, incidentPosition); } }