public bool CheckCombatConditionMethod(ConditionCriteraTypes conditions = ConditionCriteraTypes.All, CacheUnit unit = null)
{
//Order in which tests are conducted..
//Units in Range (Not Cluster)
//Clusters
//Single Target
//If all are null or any of them are successful, then we test Custom Conditions
//Custom Condition
//Reset Last Condition
LastConditionPassed = ConditionCriteraTypes.None;
bool TestCustomConditions = false;
bool FailedCondition = false;
if (conditions.HasFlag(ConditionCriteraTypes.Cluster) && ClusterConditions.Count > 0)
{
foreach (var condition in ClusterConditions)
{
FailedCondition = false;
foreach (Func<bool> item in condition.Criteria.GetInvocationList())
{
if (!item())
{
FailedCondition = true;
break;
}
}
//Last Condition did not fail.. (Success!)
if (!FailedCondition)
{
LastConditionPassed = ConditionCriteraTypes.Cluster;
LastClusterConditionSuccessful=condition;
TestCustomConditions = true;
break;
}
}
}
if ((!TestCustomConditions || FailedCondition) && conditions.HasFlag(ConditionCriteraTypes.SingleTarget) && SingleUnitCondition.Count > 0)
{
//We iterate each condition in the list and test the criteria.
foreach (var condition in SingleUnitCondition)
{
FailedCondition = false;
foreach (Func<CacheUnit,bool> item in condition.Criteria.GetInvocationList())
{
if (!item(unit))
{
FailedCondition = true;
break;
}
}
//Last Condition did not fail.. (Success!)
if (!FailedCondition)
{
LastConditionPassed = ConditionCriteraTypes.SingleTarget;
TestCustomConditions = true;
break;
}
}
}
//If TestCustomCondtion failed, and FailedCondition is true.. then we tested a combat condition.
//If FailedCondition is false, then we never tested a condition.
if (!TestCustomConditions && !TestCustomCombatConditions) return false; //&&FailedCondition
foreach (Func<CacheUnit, bool> item in FcriteriaCombat.GetInvocationList())
if (!item(unit)) return false;
return true;
}