using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : Unit { public Coroutine battle; public void Fight(bool defending) { battle = StartCoroutine(BeginBattle(defending)); } public IEnumerator BeginBattle(bool defending) { Roster playerRoster = ScriptableObject.CreateInstance<Roster>(); Roster enemyRoster = ScriptableObject.CreateInstance<Roster>(); int startingHealth = 0; int enemyStartingHealth = CurrentHealth; enemyRoster.units.Add(UnitStats); foreach (var (u, pos) in GetUnitsInMoveRange<Unit>()) { if (u as Enemy) { //When NPCs are attacking, and have already attacked - skip battle if (!defending && !u.CanAttack) continue; enemyRoster.units.Add(u.UnitStats); enemyStartingHealth += u.CurrentHealth; } else if (u.CanAttack || !defending) { playerRoster.units.Add(u.UnitStats); startingHealth += u.CurrentHealth; } } if (playerRoster.units.Count > 0) { BattleControl.LoadBattleScene(); GameObject.Find("Music Audio").GetComponent<AudioSource>().Stop(); yield return new WaitUntil(() => BattleControl.Instance); BattleControl.Instance.SetBattleStatsForCombat(playerRoster, enemyRoster, startingHealth, enemyStartingHealth); yield return new WaitUntil(() => BattleControl.Instance.BattleOver); var unitHealthLost = Mathf.CeilToInt((startingHealth - BattleControl.Instance.unitHealthSlider.value) / playerRoster.units.Count); var enemyHealthLost = enemyStartingHealth - (int)BattleControl.Instance.enemyUnitHealthSlider.value; //Check damage for self int damage = Mathf.Min(CurrentHealth, enemyHealthLost); enemyHealthLost -= damage; Damage(damage); foreach (var (u, pos) in GetUnitsInMoveRange<Unit>()) { //Kill off remaining enemy units if (u as Enemy) { damage = Mathf.Min(u.CurrentHealth, enemyHealthLost); enemyHealthLost -= damage; u.Damage(damage); u.CanAttack = defending; } //Spread damage to player's units else if (u.CanAttack) { u.Damage(unitHealthLost); u.CanAttack = false; u.CanAttack = !defending; } } BattleControl.UnloadBattleScene(); GameObject.Find("Music Audio").GetComponent<AudioSource>().Play(); } battle = null; } }