public void UseAbility(string p_ability) { AbilityWrapper wrapper = m_abilities.Find(a => a.AbilityName == p_ability); if (wrapper == null && wrapper.Learned) { return; } Ability ability = wrapper.GetAbility(); int cost = ability.m_manaCosts.Find(m => m.TrainingLevel == wrapper.TrainingLevel).Value; int leftoverMana = m_stats.GetStat(Stats.MP) - cost; if (leftoverMana >= 0 && wrapper.Use()) { m_stats.AddModifier(Stats.MP, -cost, 0); ability.Use(this, wrapper.TrainingLevel); if (wrapper.ChainedAbilities != null && wrapper.ChainedAbilities.Count > 0) { foreach (string chain in wrapper.ChainedAbilities) { AbilityWrapper chainWrapper = m_abilities.Find(a => a.AbilityName == chain); if (chainWrapper == null && chainWrapper.Learned) { continue; } Ability chainAbility = Ability.Get(chain); cost = chainAbility.m_manaCosts.Find(m => m.TrainingLevel == chainWrapper.TrainingLevel).Value; leftoverMana = m_stats.GetStat(Stats.MP) - cost; if (leftoverMana >= 0 && chainWrapper.Use()) { m_stats.AddModifier(Stats.MP, -cost, 0); chainAbility.Use(this, chainWrapper.TrainingLevel); } } } } }