public override State Next()
        {
            State          res = this;
            AgentSpectator a   = _stateMachine.Agent as AgentSpectator;

            if (a.inQueue)
            {
                res = new StateSpectatorFollowQueue(_stateMachine, _target);
            }
            a.inQueue = false;
            return(res);
        }
예제 #2
0
        public override void Action()
        {
            AgentSpectator spectator = _stateMachine.Agent as AgentSpectator;

            if (spectator.inQueue)
            {
                _stateMachine.Agent.Body.MoveToDestination(spectator.queuePosition);
            }
            else if (_himSelf.isChecked)
            {
                _stateMachine.Agent.Body.MoveToDestination(spectator.ticket.position);
            }
        }
        public override State Next()
        {
            AgentSpectator agent = _stateMachine.Agent as AgentSpectator;
            State          res   = this;

            if (!_askedForTicket && _ticketOffice.queue.First() == agent)
            {
                if (Vector3.Distance(agent.Position, _ticketOffice.Position) < 2f)
                {
                    //First demand
                    if (agent.ticketRefused == null)
                    {
                        int askForDoor = 0;
                        askForDoor = agent.GetCategory();// Utils.PseudoGaussRandom(1,  Environment.GetInstance().CategoriesNumber);
                        agent.SendMessage(_ticketOffice, new MessageAskForTicket(askForDoor));
                        _askedForTicket = true;
                    }
                    //Second demand, he get a list with available category, he ask
                    else
                    {
                        Debug.Log("new try");
                        int askForDoor =
                            agent.ticketRefused.stillAvailableCategories[Random.Range(0, agent.ticketRefused.stillAvailableCategories.Count - 1)]; // ILLEGAL : if between there a no ticket in this category
                        agent.SendMessage(_ticketOffice, new MessageAskForTicket(askForDoor));
                        _askedForTicket = true;
                    }
                }
            }

            if (agent.ticketRefused != null && agent.notifiedTicketRefused)
            {
                _askedForTicket             = false;
                agent.notifiedTicketRefused = false;
            }

            if (agent.ticket != null)
            {
                _ticketOffice.times.Add(Time.time - agent.timeEnterTicketOfficeQueue);
                res = new SpectatorStateEnterStadium(_stateMachine);
            }

            if (agent.noTicketAvailable)
            {
                res = new SpectatorStateGoOut(_stateMachine);
            }
            return(res);
        }
예제 #4
0
        public SpectatorStateEnterStadium(StateMachine stateMachine) : base(stateMachine)
        {
            _himSelf = stateMachine.Agent as AgentSpectator;
            List <AgentSecurity> securityAgents =
                (_stateMachine.Agent.Body as AgentSpectatorBody).securityInLineOfVision;

            int           minAgents        = -1;
            AgentSecurity selectedSecurity = null;

            foreach (AgentSecurity ags in securityAgents)
            {
                int agents = ags.queue.agents.Count;
                if (agents < minAgents || minAgents == -1)
                {
                    selectedSecurity = ags;
                    minAgents        = agents;
                }
            }
            _target = selectedSecurity;
            _stateMachine.Agent.SendMessage(_target, new MessageAskForQueue());
        }
 public SpectatorExitStadium(StateMachine stateMachine) : base(stateMachine)
 {
     isMoving  = false;
     spectator = stateMachine.Agent as AgentSpectator;
 }