private void ProcessChangeForBuffsAndDebuffs(int rawDamage, evoTypes attackerType, evoTypes targetType)
 {
     //Separate from Abilites so buffs and debuffs Stack/Cancel out or are calculated Simultaneously
     ProcessChangeForAttackerType(rawDamage, attackerType, targetType);
     ProcessChangeForHoly(rawDamage, targetType);
     ProcessChangeForMagical(rawDamage);
     ProcessChangeForBlessing(rawDamage);
 }
    public void ApplyDamageReduction(float rawDamage, evoTypes attackerType, DamageModifier attacker)
    {
        processedDamage = rawDamage;
        evoTypes myType = GetComponent <UISelectionDescription>().GetMyType();

        ApplyStatusEffect(attacker);
        ProcessChangeForStatusEffect(processedDamage);
        ProcessChangeForType(processedDamage, attackerType, myType);
        GetComponent <Health>().TakeDamage(Mathf.RoundToInt(processedDamage));
    }
 private float ProcessBeastAttack(float rawDamage, evoTypes targetType)
 {
     if (targetType == evoTypes.Undead)
     {
         return(rawDamage + (rawDamage * half));
     }
     else
     {
         return(rawDamage);
     }
 }
 private void ProcessChangeForHoly(int rawDamage, evoTypes targetType)
 {
     foreach (AbilitiesAndStatusEffects ability in activeAbilities)
     {
         if (ability.GetAbility() == abilities.Holy)
         {
             if (targetType == evoTypes.Undead)
             {
                 processedDamage += rawDamage * ability.GetDamageMultiplier();
             }
         }
     }
 }
 private float ProcessUndeadAttack(float rawDamage, evoTypes targetType)
 {
     if (targetType == evoTypes.Human)
     {
         return(rawDamage + (rawDamage * quarter));
     }
     if (targetType == evoTypes.Goblinkin)
     {
         return(rawDamage + (rawDamage * quarter));
     }
     else
     {
         return(rawDamage);
     }
 }
 private void ProcessChangeForType(float rawDamage, evoTypes attackerType, evoTypes myType)
 {
     if (myType == evoTypes.Human)
     {
         processedDamage = ProcessHumanDef(rawDamage, attackerType);
     }
     else if (myType == evoTypes.Beast)
     {
         processedDamage = ProcessBeastDef(rawDamage, attackerType);
     }
     else if (myType == evoTypes.Undead)
     {
         processedDamage = ProcessUndeadDef(rawDamage, attackerType);
     }
     else if (myType == evoTypes.Goblinkin)
     {
         processedDamage = ProcessGoblinkinDef(rawDamage, attackerType);
     }
     else
     {
         processedDamage = rawDamage;
     }
 }
 private void ProcessChangeForAttackerType(int rawDamage, evoTypes attackerType, evoTypes targetType)
 {
     if (attackerType == evoTypes.Human)
     {
         processedDamage = ProcessHumanAttack(rawDamage, targetType);
     }
     else if (attackerType == evoTypes.Beast)
     {
         processedDamage = ProcessBeastAttack(rawDamage, targetType);
     }
     else if (attackerType == evoTypes.Undead)
     {
         processedDamage = ProcessUndeadAttack(rawDamage, targetType);
     }
     else if (attackerType == evoTypes.Goblinkin)
     {
         processedDamage = ProcessGoblinkinAttack(rawDamage, targetType);
     }
     else
     {
         processedDamage = rawDamage;
     }
 }
 private float ProcessGoblinkinDef(float rawDamage, evoTypes attackerType)
 {
     return(rawDamage);
 }
 private float ProcessUndeadDef(float rawDamage, evoTypes attackerType)
 {
     return(rawDamage);
 }
 private float ProcessBeastDef(float rawDamage, evoTypes attackerType)
 {
     return(rawDamage - (rawDamage * quarter));
 }
 private float ProcessHumanDef(float rawDamage, evoTypes attackerType)
 {
     return(rawDamage + (rawDamage * quarter));
 }
 public void SetParentType(evoTypes type)
 {
     parentType = type;
 }
 private void ProcessChangeForAbilities(evoTypes attackerType, evoTypes targetType)
 {
     ProcessChangeForRange();
     ProcessChangeForCrit();
     ProcessChangeForRelentless();
 }
 private float ProcessGoblinkinAttack(float rawDamage, evoTypes targetType)
 {
     return(rawDamage);
 }
 public float CalculateDamageForProjectile(int rawDamage, evoTypes attackerType, evoTypes targetType)
 {
     ProcessChangeForBuffsAndDebuffs(rawDamage, attackerType, targetType);
     ProcessChangeForAbilities(attackerType, targetType);
     return(processedDamage);
 }
 private float ProcessHumanAttack(float rawDamage, evoTypes targetType)
 {
     return(rawDamage - (rawDamage * quarter));
 }