Ejemplo n.º 1
0
    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);
        }
    }
Ejemplo n.º 2
0
    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);
    }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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);
    }
Ejemplo n.º 5
0
    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);
    }
Ejemplo n.º 6
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));
    }
Ejemplo n.º 7
0
    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;
    }
Ejemplo n.º 8
0
    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();
        }
    }
Ejemplo n.º 9
0
    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);
    }