public override OrderResult Execute(Unit executor) { Ability.AbilityResult result = executor.UseUntargetedAbility(m_ability); // We'll clear the Order regardless of whether it failed or succeeded because, with // untargeted Abilities, there is nothing the Unit can do by itself to fix the failure condition. Fail(executor, AbilityResultToOrderResult(result)); return(AbilityResultToOrderResult(result)); }
public override OrderResult Execute(Unit executor) { Ability.AbilityResult result = executor.UseUnitTargetedAbility(m_ability, m_targetUnit); if (result != Ability.AbilityResult.OK) { ResolveAbilityFailure(executor, m_ability, result, m_targetUnit.Position); } return(AbilityResultToOrderResult(result)); }
public OrderResult AbilityResultToOrderResult(Ability.AbilityResult result) { switch (result) { case Ability.AbilityResult.OK: return(OrderResult.OK); case Ability.AbilityResult.OutOfRange: return(OrderResult.OutOfRange); case Ability.AbilityResult.InsufficientMana: return(OrderResult.InsufficientMana); case Ability.AbilityResult.AbilityOnCooldown: return(OrderResult.AbilityOnCooldown); default: return(OrderResult.Unknown); } }
protected void ResolveAbilityFailure(Unit executor, Ability failingAbility, Ability.AbilityResult failureCondition, Vector3 locationOfTarget) { if (failureCondition == Ability.AbilityResult.OK) { return; // The ability activated successfully; nothing to be done. } // If we failed to activate the Ability because we're out of range but we're capable // of moving closer to the target, move toward the target and retry. if (failureCondition == Ability.AbilityResult.OutOfRange) { if (executor.CanReach(locationOfTarget, failingAbility.GetRange())) { executor.MoveToward(locationOfTarget); } else { Fail(executor, AbilityResultToOrderResult(failureCondition)); // If we can't move closer, give up. } } else // Ability failed for some reason other than range; nothing we can do about that. { Fail(executor, AbilityResultToOrderResult(failureCondition)); } }