IEnumerator SkillAttackCo()
        {
            ui.LogMessage(instigator._charName + " used " + skill._skillName + "!");

            instigator._magic.ChangeCurrentPoints(-skill._mpCost);

            ui.UpdateStats(instigator);

            bool hit = combat.SuccessfulHit(instigator, targets, skill);

            yield return(new WaitForSeconds(normalDelay));

            if (hit)
            {
                foreach (var target in targets)
                {
                    float effectiveness;    // >1 for weak, 0<x<1 for resist, 0 for immune
                    float critical;
                    int   damage;

                    bool dead;

                    BattlePortrait targetPortrait = battle.GetPortrait(target);

                    critical = combat.Critical(instigator);

                    effectiveness = combat.Effectiveness(skill, target);

                    damage = Damage(instigator, target, skill, effectiveness, critical);

                    dead = target.TakeDamage(damage);

                    LogMessageSkill(target, effectiveness, critical, damage);

                    ui.UpdateStats(target);

                    CreateDamageNumber(targetPortrait, effectiveness, damage);

                    yield return(battle.StartCoroutine(targetPortrait.ShakeCo(effectiveness, shakeTime)));

                    if (dead)
                    {
                        if (battle.InActiveEnemies(target))
                        {
                            battle.AddExpEarned(target._expReward);
                            battle.AddMoneyEarned(target._moneyReward);
                        }
                        yield return(battle.StartCoroutine(battle.RemoveBattlerCo(target, smallDelay)));
                    }
                }
            }
            else
            {
                ui.LogMessage("The attack missed!");
            }

            yield return(new WaitForSeconds(normalDelay));
        }
        IEnumerator ItemAttackCo()
        {
            float  delay;
            TypeID damageType = item._damageType;

            if (battle._autoMode)
            {
                delay = smallDelay;
            }
            else
            {
                delay = normalDelay;
            }

            if (StartsWithVowel(item._itemName))
            {
                ui.LogMessage(instigator._charName + " used an " + item._itemName + "!");
            }
            else
            {
                ui.LogMessage(instigator._charName + " used a " + item._itemName + "!");
            }

            yield return(new WaitForSeconds(2f * smallDelay));

            foreach (var target in targets)
            {
                float effectiveness;
                int   damage;

                bool dead;

                BattlePortrait targetPortrait = battle.GetPortrait(target);

                effectiveness = combat.Effectiveness(item._damageType, target);

                damage = Damage(item, effectiveness);

                dead = target.TakeDamage(damage);

                LogMessageItem(target, effectiveness, damage);

                ui.UpdateStats(target);

                CreateDamageNumber(targetPortrait, effectiveness, damage);

                yield return(battle.StartCoroutine(targetPortrait.ShakeCo(effectiveness, shakeTime)));

                if (dead)
                {
                    if (battle.InActiveEnemies(target))
                    {
                        battle.AddExpEarned(target._expReward);
                        battle.AddMoneyEarned(target._moneyReward);
                    }
                    yield return(battle.StartCoroutine(battle.RemoveBattlerCo(target, delay)));
                }
            }

            game._inventory.RemoveItem(item);

            yield return(new WaitForSeconds(delay));
        }