public override float Execute(UrbAgent Instigator, UrbAgent Target, float Modifier = 0) { if (Instigator.WasDestroyed || Target.WasDestroyed) { return(0); } using (s_AttackAction_p.Auto()) { float Result = base.Execute(Instigator, Target, Modifier); if (!(Result > 0)) { return(Result); } //Instigator.CurrentTile.AddScent(UrbScentTag.Violence, Result); UrbAction DefenseAction = Target.PickAction(DefenseCategory, Result); if (DefenseAction != null) { Result -= DefenseAction.Execute(Target, Instigator); } if (Result > 0) { Result = DamageAction.Execute(Instigator, Target, Result); } return(Result); } }
public UrbAction PickAction(UrbTestCategory Test, float Result = 0, UrbTestCategory Exclude = UrbTestCategory.None) { if (mAgent.AvailableActions == null || mAgent.AvailableActions.Length == 0) { return(null); } s_PickAction_p.Begin(); UrbAction ChosenAction = null; float BestCost = float.MaxValue; for (int i = 0; i < mAgent.AvailableActions.Length; i++) { bool Valid = (Test & mAgent.AvailableActions[i].Category) == Test && (Exclude == UrbTestCategory.None || (Exclude & mAgent.AvailableActions[i].Category) == 0); if (!Valid) { continue; } float ActionCost = mAgent.AvailableActions[i].CostEstimate(mAgent); if (ActionCost > Result && ActionCost < BestCost) { BestCost = ActionCost; ChosenAction = mAgent.AvailableActions[i]; } } s_PickAction_p.End(); return(ChosenAction); }
public virtual float GiveTo(UrbAgent Target, UrbSubstanceTag Substance) { if (!Target.HasBody) { return(0); } float Amount = 0; UrbAction HoldAction = mAgent.PickAction(UrbTestCategory.Hold); if (HoldAction != null) { Amount = HoldAction.Execute(mAgent, Target); if (Target.IsGrasper) { Target.Grasper.TakeFrom(mAgent, Substance); } else if (Target.IsEater) { Amount = HeldComposition.TransferTo(Target.Eater.Stomach, Substance, Amount); } else { Amount = HeldComposition.TransferTo(Target.mBody.BodyComposition, Substance, Amount); } } return(Amount); }
public override float TaskCompletionCostEstimate(UrbAgent Instigator, UrbTile WorkTile) { if (NoTarget) { return(float.MaxValue); } if (Instigator.HasAction(UrbTestCategory.Hold)) { UrbAction Action = Instigator.PickAction(UrbTestCategory.Hold); float Estimate = Action.CostEstimate(Instigator); float CarryAmount = Action.Test(Instigator); float TargetAmount = GoalSubstance.SubstanceAmount - _TargetTile[GoalSubstance.Substance]; if (CarryAmount >= TargetAmount) { return(Estimate); } else { return(Estimate * (TargetAmount / CarryAmount)); } } return(float.MaxValue); }
public override float PerformTask(UrbAgent Instigator, UrbTile WorkTile) { if (NoTarget || WorkTile.Occupants.Count == 0) { return(0); } if (Instigator.HasAction(UrbTestCategory.Hold)) { UrbAction Action = Instigator.PickAction(UrbTestCategory.Hold); float CarryAmount = 0; if (WorkTile == TargetTile) { } else { for (int o = 0; o < WorkTile.Occupants.Count; o++) { } } } return(0); }
public float PerformTest(UrbTestCategory Test, float Modifier = 0, bool Execute = false) { UrbAction ChosenAction = PickAction(Test); if (ChosenAction == null) { return(0.0f); } return(ChosenAction.Test(mAgent, Modifier)); }
public virtual void AddAction(UrbAction Action) { ValidActionCategories = ValidActionCategories | Action.Category; if (AvailableActions == null) { AvailableActions = new [] { Action }; return; } UrbAction[] newActions = new UrbAction[AvailableActions.Length + 1]; AvailableActions.CopyTo(newActions, 1); newActions[0] = Action; }
public virtual void RemoveAction(UrbAction Action) { ValidActionCategories = ValidActionCategories & (~Action.Category); if (AvailableActions == null || AvailableActions.Length == 0) { return; } List <UrbAction> TempList = new List <UrbAction>(AvailableActions); if (TempList.Contains(Action)) { TempList.Remove(Action); AvailableActions = TempList.ToArray(); } }
public void QueueEffectDisplay(UrbAction Input, Vector3 Position, bool Immediate = false) { if (EffectDisplay == null || EffectQueue == null || EffectPositionQueue == null) { return; } if (Immediate) { EffectQueue.Clear(); EffectPositionQueue.Clear(); ScheduledDisplayChange = Time.unscaledTime; } EffectQueue.Add(Input); EffectPositionQueue.Add(Position); }