示例#1
0
 public InvocationContext(TargetSelectionContext targetSelection, ActiveTarget target)
 {
     Context         = targetSelection.Context;
     ActiveAttribute = targetSelection.ActiveAttribute;
     Target          = target;
     Doer            = targetSelection.Doer;
 }
示例#2
0
        //--------------------------------------------------

        public void EarlyUpdate()
        {
            Status.EarlyUpdate(Move.DesiredVelocity);
            Behaviour.EarlyUpdate(Status);

            if (ActiveTarget != null && ActiveTarget.IsValidAndReady)
            {
                ActiveTarget.EarlyUpdate(OwnerComponent);

                if (!Status.IsPerceptionForced && ActiveTarget.TargetMoveComplete)
                {
                    Status.IsPerceptionForced = true;
                }

                if (!Status.IsReactionForced && ActiveTarget.TargetMoveComplete)
                {
                    Status.IsReactionForced = true;
                }

                if (ActiveTarget.TargetMoveComplete)
                {
                    if (OnTargetMoveComplete != null)
                    {
                        OnTargetMoveComplete(Owner, ActiveTarget);
                    }
                }
            }

            SelectStandardBehaviour();
        }
示例#3
0
        //--------------------------------------------------
        public void FixedUpdate()
        {
            //TODO: obsolete
            if (Missions.Outpost.TargetReady())
            {
                Missions.Outpost.Target.FixedUpdate();
            }
            if (Missions.Escort.TargetReady())
            {
                Missions.Escort.Target.FixedUpdate();
            }
            if (Missions.Patrol.TargetReady())
            {
                Missions.Patrol.Target.FixedUpdate();
            }
            if (Interaction.TargetReady())
            {
                Interaction.FixedUpdate();
            }

            if (ActiveTarget != null && ActiveTarget.IsValid)
            {
                ActiveTarget.FixedUpdate();
            }

            if (Behaviour.BehaviourMode != null && Behaviour.BehaviourMode.Rule != null && Behaviour.BehaviourMode.Rule.Influences.Enabled)
            {
                Status.AddDamage(Behaviour.BehaviourMode.Rule.Influences.Damage);
                Status.AddStress(Behaviour.BehaviourMode.Rule.Influences.Stress);
                Status.AddDebility(Behaviour.BehaviourMode.Rule.Influences.Debility);
                Status.AddHunger(Behaviour.BehaviourMode.Rule.Influences.Hunger);
                Status.AddThirst(Behaviour.BehaviourMode.Rule.Influences.Thirst);
            }

            if (Environment.SurfaceHandler.ActiveSurface != null && Environment.SurfaceHandler.ActiveSurface.Influences.Enabled == true)
            {
                Status.AddDamage(Environment.SurfaceHandler.ActiveSurface.Influences.Damage);
                Status.AddStress(Environment.SurfaceHandler.ActiveSurface.Influences.Stress);
                Status.AddDebility(Environment.SurfaceHandler.ActiveSurface.Influences.Debility);
                Status.AddHunger(Environment.SurfaceHandler.ActiveSurface.Influences.Hunger);
                Status.AddThirst(Environment.SurfaceHandler.ActiveSurface.Influences.Thirst);
            }

            Status.FixedUpdate();

            if (Status.IsDead)
            {
                Behaviour.SetBehaviourModeByKey(Essentials.BehaviourModeDead);
                Status.RespawnRequest();
            }

            if (Status.IsRespawnTime)
            {
                Status.Respawn();
            }
        }
示例#4
0
        public ActiveTarget CalcTarget(ActiveTarget target, int month, ref double reservedSum)
        {
            double reserve = target.CurrentSum + month * target.Spend;

            if (reserve > target.TotalSum)
            {
                reserve = target.TotalSum;
            }
            target.CurrentSum = reserve;
            reservedSum      += reserve;
            return(target);
        }
示例#5
0
        public void LateUpdate()
        {
            if (!Status.LateUpdate())
            {
                return;
            }

            Essentials.Target.LateUpdate(Owner, Move.MoveSpeed);
            Missions.Outpost.Target.LateUpdate(Owner, Move.MoveSpeed);
            Missions.Escort.Target.LateUpdate(Owner, Move.MoveSpeed);
            Missions.Patrol.LateUpdate(Owner, Move.MoveSpeed);
            Interaction.LateUpdate(Owner, Move.MoveSpeed);

            if (ActiveTarget != null)
            {
                ActiveTarget.LateUpdate(Owner, Move.MoveSpeed);

                if (ActiveTarget.Influences.Update())
                {
                    UpdateStatusInfluences(ActiveTarget.Influences);
                }
            }

            Environment.SurfaceHandler.Update(this);

            if (Environment.SurfaceHandler.ActiveSurface != null)
            {
                if (Environment.SurfaceHandler.ActiveSurface.Influences.Update())
                {
                    UpdateStatusInfluences(Environment.SurfaceHandler.ActiveSurface.Influences);
                }

                if (Environment.SurfaceHandler.ActiveSurface.BehaviourModeKey != "")
                {
                    SetActiveBehaviourModeByKey(Environment.SurfaceHandler.ActiveSurface.BehaviourModeKey);
                }
            }

            if (Behaviour.LateUpdate(Status) && Behaviour.ActiveBehaviourModeRule.Influences.Update())
            {
                UpdateStatusInfluences(Behaviour.ActiveBehaviourModeRule.Influences);
            }
        }
示例#6
0
        /// <summary>
        /// Sets the active target.
        /// </summary>
        /// <param name="_target">_target.</param>
        public void SetActiveTarget(TargetObject _target)
        {
            if (Status.IsDead || Status.IsSpawning)
            {
                return;
            }

            if (Move.Deadlock.Deadlocked)
            {
                Move.Deadlock.Reset(Owner.transform);
                if (Move.Deadlock.Action == DeadlockActionType.BEHAVIOUR)
                {
                    SetActiveBehaviourModeByKey(Move.Deadlock.Behaviour);
                    return;
                }
                else if (Move.Deadlock.Action == DeadlockActionType.UPDATE && m_ActiveTarget != null)
                {
                    m_ActiveTarget.Move.UpdateRandomOffset();
                }
                else
                {
                    Status.Kill();
                    return;
                }
            }

            if (_target == null || !_target.IsValidAndReady || Status.RecreationRequired)
            {
                _target = Essentials.PrepareTarget(OwnerComponent);
            }

            if (_target == null || !_target.IsValidAndReady)
            {
                if (DebugLogIsEnabled)
                {
                    PrintDebugLog(this, "Sorry, the creature have no valid target!");
                }
                return;
            }

            m_TargetChanged = false;
            if (IsTargetUpdatePermitted(_target))
            {
                // update target
                if (!_target.CompareTarget(m_ActiveTarget, m_ActiveTargetID))
                {
                    // handle previous target
                    ResetActiveTarget();

                    // handle new target
                    m_ActiveTarget           = _target;
                    m_ActiveTargetGameObject = _target.TargetGameObject;
                    m_ActiveTargetID         = _target.TargetID;
                    m_ActiveTargetName       = _target.TargetName;
                    m_ActiveTargetKey        = _target.TargetName + _target.TargetID.ToString();

                    if (m_ActiveTarget != null)
                    {
                        m_ActiveTarget.SetActive(OwnerComponent);

                        if (m_ActiveTarget.EntityComponent != null)
                        {
                            m_ActiveTarget.EntityComponent.AddActiveCounterpart(OwnerComponent as ICECreatureEntity);
                        }

                        if (m_ActiveTarget.GroupMessage.Type != BroadcastMessageType.NONE)
                        {
                            /*
                             * BroadcastMessageDataObject _data = new BroadcastMessageDataObject();
                             *
                             * _data.Type = m_ActiveTarget.GroupMessage.Type;
                             * _data.TargetGameObject = m_ActiveTarget.TargetGameObject;
                             * _data.Command = m_ActiveTarget.GroupMessage.Command;*/

                            ICECreatureEntity _entity = OwnerComponent as ICECreatureEntity;
                            if (_entity != null)
                            {
                                _entity.Message.SendGroupMessage(new BroadcastMessageDataObject(m_ActiveTarget.GroupMessage.Type, m_ActiveTarget.TargetGameObject, m_ActiveTarget.GroupMessage.Command));
                            }
                        }
                    }

                    if (DebugLogIsEnabled)
                    {
                        string _previus = (m_PreviousTargetName != "" ? m_PreviousTargetName + " (" + m_PreviousTargetID + ")": "unknown");
                        string _active  = (m_ActiveTargetName != "" ? m_ActiveTargetName + " (" + m_ActiveTargetID + ")": "unknown");

                        PrintDebugLog(this, "SetActiveTarget - creature changed active target from " + _previus + " to " + _active + ".");
                    }

                    Move.UpdateTargets(m_ActiveTarget, Essentials.Target);

                    m_TargetChanged = true;
                }


                // update target behaviour
                if (m_ActiveTarget != null)
                {
                    string _key = ActiveTarget.Behaviour.CurrentBehaviourModeKey;

                    if (string.IsNullOrEmpty(_key))
                    {
                        // if the active target is not a HOME or if the creature outside the max range it have to travel to reach its target
                        if (!ActiveTarget.TargetInMaxRange(Owner.transform.position))
                        {
                            _key = Essentials.BehaviourModeRun;
                        }

                        // if the creature reached the TargetMovePosition it should do the rendezvous behaviour
                        else if (ActiveTarget.TargetMoveComplete)
                        {
                            _key = Essentials.BehaviourModeIdle;
                        }

                        // in all other case the creature should be standby and do some leisure activities
                        else                         //if( Target.TargetRandomRange > 0 )
                        {
                            _key = Essentials.BehaviourModeWalk;
                        }
                    }

                    SetActiveBehaviourModeByKey(_key);
                }
            }
        }