示例#1
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank t = (Tank)agent;

            workingMemory.SetValue((int)EBBKey.MovingTargetPos, Match.instance.GetRebornPos(t.Team));
            return(true);
        }
示例#2
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank       t = (Tank)agent;
            var        missiles = Match.instance.GetOppositeMissiles(t.Team);
            Missile    missile = Functions.GetLatestMissile(missiles, t.Team);
            Vector3    normal = Vector3.Cross(Vector3.up, missile.Velocity).normalized;
            RaycastHit hitInfo1, hitInfo2;
            float      hitDistance1 = 0, hitDistance2 = 0;

            if (Physics.Linecast(t.Position, t.Position + normal * 100, out hitInfo1, PhysicsUtils.LayerMaskScene))
            {
                hitDistance1 = hitInfo1.distance;
            }
            if (Physics.Linecast(t.Position, t.Position - normal * 100, out hitInfo2, PhysicsUtils.LayerMaskScene))
            {
                hitDistance2 = hitInfo2.distance;
            }
            if (Mathf.Max(hitDistance1, hitDistance2) < 3)
            {
                return(ERunningStatus.Failed);
            }
            if (hitDistance1 > hitDistance2)
            {
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, t.Position + Vector3.ClampMagnitude(normal, hitDistance1 - 1));
                return(ERunningStatus.Finished);
            }
            workingMemory.SetValue((int)EBBKey.MovingTargetPos, t.Position - Vector3.ClampMagnitude(normal, hitDistance2 - 1));
            return(ERunningStatus.Finished);
        }
示例#3
0
        public override void Update(BlackboardMemory sensorMemory)
        {
            Tank t = (Tank)Agent;
            //check if can see other tank
            int  targetOppKey = (int)EBBKey.TargetOppTank;
            Tank oppTank      = Match.instance.GetOppositeTank(t.Team);

            if (oppTank != null && oppTank.IsDead == false && TrySightingTest(oppTank.Position))
            {
                sensorMemory.SetValue(targetOppKey, oppTank);
            }
            else
            {
                sensorMemory.SetValue(targetOppKey, null);
            }
            //check if star still exists
            int cachedStarID = sensorMemory.GetValue <int>((int)EBBKey.CaredStar, -1);

            if (cachedStarID >= 0) //has star
            {
                //move to star position it heard
                Vector3 starPos = sensorMemory.GetValue <Vector3>((int)EBBKey.TargetStarPos, default(Vector3));
                if (TrySightingTest(starPos))
                {
                    Star cachedStar = Match.instance.GetStarByID(cachedStarID);
                    if (cachedStar == null)
                    {
                        sensorMemory.DelValue((int)EBBKey.CaredStar);
                        sensorMemory.DelValue((int)EBBKey.TargetStarPos);
                    }
                }
            }
        }
示例#4
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank    t              = (Tank)agent;
            bool    hasStar        = false;
            float   nearestDist    = float.MaxValue;
            Vector3 nearestStarPos = Vector3.zero;

            foreach (var pair in Match.instance.GetStars())
            {
                Star s = pair.Value;
                if (s.IsSuperStar)
                {
                    hasStar        = true;
                    nearestStarPos = s.Position;
                    break;
                }
                else if (!Functions.Vector3EqualTo(t.NextDestination, s.Position))
                {
                    float dist = Functions.CalculatePathLength(t.CaculatePath(s.Position), t.Position, s.Position);
                    if (dist < nearestDist)
                    {
                        hasStar        = true;
                        nearestDist    = dist;
                        nearestStarPos = s.Position;
                    }
                }
            }
            if (hasStar)
            {
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, nearestStarPos);
            }
            return(hasStar);
        }
示例#5
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank t = (Tank)agent;

            t.Move(workingMemory.GetValue <Vector3>((int)EBBKey.MovingTargetPos));
            return(ERunningStatus.Finished);
        }
示例#6
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemroy)
        {
            Tank t = (Tank)agent;

            t.Fire();
            return(ERunningStatus.Executing);
        }
示例#7
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank    t              = (Tank)agent;
            bool    hasStar        = false;
            float   nearestDist    = float.MaxValue;
            Vector3 nearestStarPos = Vector3.zero;

            foreach (var pair in Match.instance.GetStars())
            {
                Star s = pair.Value;
                if (s.IsSuperStar)
                {
                    hasStar        = true;
                    nearestStarPos = s.Position;
                    break;
                }
                else
                {
                    float dist = (s.Position - t.Position).sqrMagnitude;
                    if (dist < nearestDist)
                    {
                        hasStar        = true;
                        nearestDist    = dist;
                        nearestStarPos = s.Position;
                    }
                }
            }
            if (hasStar)
            {
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, nearestStarPos);
            }
            return(hasStar);
        }
示例#8
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemroy)
        {
            Tank t       = (Tank)agent;
            Tank oppTank = Match.instance.GetOppositeTank(t.Team);

            //Vector3 targetPos;
            float distance;

            distance = (oppTank.Position - lastPos).sqrMagnitude;
            if (oppTank != null && oppTank.IsDead == false)
            {
                if (distance < 400)
                {
                    t.TurretTurnTo(oppTank.Position);
                }
                else if (distance < 2000)
                {
                    //targetPos = 5 * oppTank.Position - lastPos;
                    t.TurretTurnTo(oppTank.Position);
                }
                else
                {
                    //targetPos = 10 * oppTank.Position - lastPos;
                    t.TurretTurnTo(oppTank.Position);
                }
                lastPos = oppTank.Position;
            }
            else
            {
                t.TurretTurnTo(Match.instance.GetRebornPos(oppTank.Team));
            }
            return(ERunningStatus.Executing);
        }
示例#9
0
 protected override void OnReset(IAgent agent, BlackboardMemory workingMemory)
 {
     if (m_LastRunningNode != null)
     {
         m_LastRunningNode.Reset(agent, workingMemory);
     }
     m_LastRunningNode = null;
 }
示例#10
0
 protected override void OnReset(IAgent agent, BlackboardMemory workingMemory)
 {
     if (m_ActionStatus == ACTION_Running)
     {
         OnExit(agent, workingMemory);
     }
     m_ActionStatus = ACTION_Ready;
 }
示例#11
0
 public ERunningStatus Update(IAgent agent, BlackboardMemory workingMemory)
 {
     if (m_Precondition != null && m_Precondition.IsTrue(agent) == false)
     {
         return(ERunningStatus.Failed);
     }
     return(OnUpdate(agent, workingMemory));
 }
示例#12
0
 protected override void OnReset(IAgent agent, BlackboardMemory workingMemory)
 {
     for (int i = 0; i < m_Children.Count; ++i)
     {
         m_Children[i].Reset(agent, workingMemory);
     }
     m_ChildrenRunning.Clear();
 }
示例#13
0
 protected override void OnReset(IAgent agent, BlackboardMemory workingMemory)
 {
     if (m_CurrentNodeIndex >= 0 && m_CurrentNodeIndex < m_Children.Count)
     {
         m_Children[m_CurrentNodeIndex].Reset(agent, workingMemory);
     }
     m_CurrentNodeIndex = -1;
 }
示例#14
0
        public static void Exec(Node root, IAgent agent, BlackboardMemory workingMemory)
        {
            ERunningStatus runningStatus = root.Update(agent, workingMemory);

            if (runningStatus != ERunningStatus.Executing)
            {
                root.Reset(agent, workingMemory);
            }
        }
示例#15
0
        public override void StimulusReceived(Stimulus stim, BlackboardMemory sensorMemory)
        {
            Tank    t        = (Tank)Agent;
            Vector3 toTarget = stim.EmitterPos - t.Position;

            if (toTarget.sqrMagnitude > m_HearingRadius * m_HearingRadius)
            {
                return;
            }
            //star jingle
            if (stim.StimulusType == (int)EStimulusType.StarJingle)
            {
                bool needUpdateCachedStar = false;
                int  cachedStarKey        = (int)EBBKey.CaredStar;
                Star star         = (Star)stim.TargetObject;
                int  cachedStarID = sensorMemory.GetValue <int>(cachedStarKey, -1);
                if (cachedStarID < 0)
                {
                    needUpdateCachedStar = true;
                }
                else
                {
                    Star cachedStar = Match.instance.GetStarByID(cachedStarID);
                    if (cachedStar == null) //no star found, use current
                    {
                        needUpdateCachedStar = true;
                    }
                    else
                    {
                        //check if need update cached star
                        if ((cachedStar.Position - t.Position).sqrMagnitude > toTarget.sqrMagnitude)
                        {
                            needUpdateCachedStar = true;
                        }
                    }
                }
                if (needUpdateCachedStar)
                {
                    //update target to nearer one
                    sensorMemory.SetValue(cachedStarKey, star.ID);
                    sensorMemory.SetValue((int)EBBKey.TargetStarPos, star.Position);
                }
            }
            else if (stim.StimulusType == (int)EStimulusType.StarTaken)
            {
                //if hears star taken, remove it from memory
                int  cachedStarKey = (int)EBBKey.CaredStar;
                Star star          = (Star)stim.TargetObject;
                int  cachedStarID  = sensorMemory.GetValue <int>(cachedStarKey, -1);
                if (star.ID == cachedStarID)
                {
                    sensorMemory.DelValue(cachedStarKey);
                    sensorMemory.DelValue((int)EBBKey.TargetStarPos);
                }
            }
        }
示例#16
0
 protected override void OnStart()
 {
     base.OnStart();
     m_WorkingMemory = new BlackboardMemory();
     m_BTNode        = new ParallelNode(1).AddChild(
         new TurnTurret(),
         new Fire().SetPrecondition(new ConditionCanSeeEnemy()),
         new SequenceNode().AddChild(
             new SelectorNode().AddChild(
                 new BackToHome(),
                 new GetStarMove(),
                 new RandomMove()),
             new MoveTo()));
 }
示例#17
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemroy)
        {
            Tank t       = (Tank)agent;
            Tank oppTank = Match.instance.GetOppositeTank(t.Team);

            if (oppTank != null && oppTank.IsDead == false)
            {
                t.TurretTurnTo(oppTank.Position);
            }
            else
            {
                t.TurretTurnTo(t.Position + t.Forward);
            }
            return(ERunningStatus.Executing);
        }
示例#18
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Vector3 targetPos;

            if (workingMemory.TryGetValue((int)EBBKey.MovingTargetPos, out targetPos))
            {
                Tank t = (Tank)agent;
                if (Vector3.Distance(targetPos, t.Position) >= 1f)
                {
                    return(false);
                }
            }
            workingMemory.SetValue((int)EBBKey.MovingTargetPos, GetNextDestination());
            return(true);
        }
示例#19
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank t       = (Tank)agent;
            Tank oppTank = Match.instance.GetOppositeTank(t.Team);

            if (oppTank != null && oppTank.IsDead == false)
            {
                t.TurretTurnTo(oppTank.Position);
            }
            else
            {
                Vector3 oppHomeZonePos = Match.instance.GetRebornPos(oppTank.Team);
                t.TurretTurnTo(oppHomeZonePos);
            }
            return(ERunningStatus.Executing);
        }
示例#20
0
        protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
        {
            if (OnEvaluate(agent, workingMemory) == false)
            {
                return(ERunningStatus.Failed);
            }
            ERunningStatus runningStatus = ERunningStatus.Finished;

            if (m_ActionStatus == ACTION_Ready)
            {
                OnEnter(agent, workingMemory);
                m_ActionStatus = ACTION_Running;
            }
            if (m_ActionStatus == ACTION_Running)
            {
                runningStatus = OnExecute(agent, workingMemory);
            }
            return(runningStatus);
        }
        protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
        {
            float rate = workingMemory.GetValue <float>((int)rateType);
            // TODO Test the certainty rate
            Node           c             = rate > 50 || true ? m_Children[0] : m_Children[1];
            ERunningStatus runningStatus = c.Update(agent, workingMemory);
            Node           previousNode  = m_LastRunningNode;

            m_LastRunningNode = null;
            if (runningStatus != ERunningStatus.Failed)
            {
                m_LastRunningNode = c;
            }
            if (previousNode != m_LastRunningNode && previousNode != null)
            {
                previousNode.Reset(agent, workingMemory);
            }
            return(runningStatus);
        }
示例#22
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            //Tank t = (Tank)agent;
            foreach (var pair in Match.instance.GetStars())
            {
                Star s = pair.Value;
                if (s.IsSuperStar)
                {
                    workingMemory.SetValue((int)EBBKey.MovingTargetPos, Vector3.zero);
                    return(true);
                }
            }
            if (Time.time + 7 > 0.5f * Match.instance.GlobalSetting.MatchTime && Time.time - 1 < 0.5f * Match.instance.GlobalSetting.MatchTime)
            {
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, Vector3.zero);
                return(true);
            }

            return(false);
        }
示例#23
0
        protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
        {
            if (m_Children.Count == 0)
            {
                return(ERunningStatus.Finished);
            }
            m_RequestFinishedCount = Mathf.Clamp(m_RequestFinishedCount, 1, m_Children.Count);
            if (m_ChildrenRunning.Count != m_Children.Count)
            {
                m_ChildrenRunning.AddRange(Enumerable.Repeat(ERunningStatus.Executing, m_Children.Count));
            }
            int failedCount   = 0;
            int finishedCount = 0;

            for (int i = 0; i < m_Children.Count; ++i)
            {
                ERunningStatus status = m_ChildrenRunning[i];
                if (status == ERunningStatus.Executing)
                {
                    status = m_Children[i].Update(agent, workingMemory);
                }
                if (status == ERunningStatus.Finished)
                {
                    finishedCount++;
                    m_ChildrenRunning[i] = status;
                    if (finishedCount == m_RequestFinishedCount)
                    {
                        return(ERunningStatus.Finished);
                    }
                }
                else if (status == ERunningStatus.Failed)
                {
                    failedCount++;
                    if (failedCount > m_Children.Count - m_RequestFinishedCount)
                    {
                        return(ERunningStatus.Failed);
                    }
                }
            }
            return(ERunningStatus.Executing);
        }
示例#24
0
 protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
 {
     if (m_Children.Count == 0)
     {
         return(ERunningStatus.Finished);
     }
     if (m_CurrentNodeIndex < 0)
     {
         m_CurrentNodeIndex = 0;
     }
     for (int i = m_CurrentNodeIndex; i < m_Children.Count; ++i)
     {
         ERunningStatus status = m_Children[i].Update(agent, workingMemory);
         if (status != ERunningStatus.Finished)
         {
             return(status);
         }
         m_CurrentNodeIndex++;
     }
     return(ERunningStatus.Finished);
 }
示例#25
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank  t         = (Tank)agent;
            Tank  oppTank   = Match.instance.GetOppositeTank(t.Team);
            float SleepTime = 2f;
            float LastTime  = 0.2f;

            if (CanExecute() == false)
            {
                return(false);
            }
            else
            {
                lastExecuteTime = Time.time + SleepTime;
                nextExecuteTime = Time.time + LastTime;
                Vector3 link   = oppTank.Position - t.Position;
                Vector3 result = (Quaternion.AngleAxis(90, Vector3.up) * link).normalized * 5;
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, t.Position + result);
                return(true);
            }
        }
示例#26
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank  t           = (Tank)agent;
            float nearestDist = float.MaxValue;

            foreach (var pair in Match.instance.GetStars())
            {
                Star s = pair.Value;

                float dist = (s.Position - t.Position).sqrMagnitude;
                if (dist < nearestDist)
                {
                    nearestDist = dist;
                }
            }
            if (t.HP <= 30 && nearestDist > 300)
            {
                workingMemory.SetValue((int)EBBKey.MovingTargetPos, Match.instance.GetRebornPos(t.Team));
                return(true);
            }
            return(false);
        }
示例#27
0
        protected override ERunningStatus OnExecute(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank t       = (Tank)agent;
            Tank oppTank = Match.instance.GetOppositeTank(t.Team);

            if (oppTank != null && oppTank.IsDead == false)
            {
                if (oppTank.Velocity.magnitude >= 3f)
                {
                    t.TurretTurnTo(Functions.CalculatePredictivePosition(t.FirePos, oppTank.Position, oppTank.Velocity));
                }
                else
                {
                    t.TurretTurnTo(oppTank.Position);
                }
            }
            else
            {
                Vector3 oppHomeZonePos = Match.instance.GetRebornPos(oppTank.Team);
                t.TurretTurnTo(oppHomeZonePos);
            }
            return(ERunningStatus.Executing);
        }
示例#28
0
        protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
        {
            ERunningStatus runningStatus = ERunningStatus.Finished;
            Node           previousNode  = m_LastRunningNode;

            //select running node
            m_LastRunningNode = null;
            foreach (Node c in m_Children)
            {
                runningStatus = c.Update(agent, workingMemory);
                if (runningStatus != ERunningStatus.Failed)
                {
                    m_LastRunningNode = c;
                    break;
                }
            }
            //clear last running node
            if (previousNode != m_LastRunningNode && previousNode != null)
            {
                previousNode.Reset(agent, workingMemory);
            }
            return(runningStatus);
        }
示例#29
0
 protected override ERunningStatus OnUpdate(IAgent agent, BlackboardMemory workingMemory)
 {
     while (true)
     {
         ERunningStatus status = Child.Update(agent, workingMemory);
         if (status == ERunningStatus.Failed)
         {
             return(ERunningStatus.Failed);
         }
         else if (status == ERunningStatus.Executing)
         {
             break;
         }
         else
         {
             if (++m_RepeatIndex == m_RepeatCount)
             {
                 return(ERunningStatus.Finished);
             }
             Child.Reset(agent, workingMemory);
         }
     }
     return(ERunningStatus.Executing);
 }
示例#30
0
        protected override bool OnEvaluate(IAgent agent, BlackboardMemory workingMemory)
        {
            Tank t        = (Tank)agent;
            var  missiles = Match.instance.GetOppositeMissiles(t.Team);

            if (missiles.Count == 0)
            {
                return(false);
            }
            Missile missile = Functions.GetLatestMissile(missiles, t.Team);
            float   dist    = (missile.Position - t.Position).magnitude;

            if (dist < 8)
            {
                return(false);
            }
            float cos = Vector3.Dot(missile.Velocity, t.Velocity) / missile.Velocity.magnitude / t.Velocity.magnitude;

            if (Mathf.Abs(cos) < 0.5)
            {
                return(false);
            }
            return(true);
        }