UnityGameProjectsCode / DiceAndMenGame / Enemy.cs
Enemy.cs
Raw
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;
    }
}