/// <summary>
    /// Auxiliar method used from ModeDB through BroadcastMessage. Handles the reception of new ModeDB information in the pedestrian knowledge.
    /// </summary>
    /// <param name="information">Tuple containing the ModeInfo object and an integer indicating the mode.</param>
    public void NewMessagefromModeDBReceived(Tuple <ModeInfo, int> information)
    {
        if (tellMeWhatYouAreDoing)
        {
            Debug.Log("Got a message!");
        }

        if (suscribedToModeDB && information.Item2 == mode)
        {
            ModeInfo mInfo = information.Item1;

            foreach (var m in currentModeInfoKnowledge)
            {
                if (mInfo.GetId().Equals(m.GetId()) && !mInfo.Equals(m) && mInfo.GetTimeCreated() > m.GetTimeCreated())
                {
                    if (tellMeWhatYouAreDoing)
                    {
                        Debug.Log("Message received from mode db: " + mInfo.ToString());
                    }

                    //Copy mode (not referencing!)
                    currentModeInfoKnowledge[m.index] = new ModeInfo(mInfo.GetId(), mInfo.GetTimeOfArrival());
                    currentModeInfoKnowledge[m.index].SetStatus(mInfo.GetStatus());
                    currentModeInfoKnowledge[m.index].index = m.index;
                }
            }

            RumourInfo rInfo = new RumourInfo("rumour" + mInfo.GetId(), mInfo, 1.0f);
            rumour = new Tuple <RumourInfo, int>(rInfo, information.Item2);

            InvokeRepeating("SpreadRumour", 1, 1.0f + Random.Range(0.0f, 1.0f));

            newKnowledgeToBeCheckedbyController = true;
        }
    }
    /// <summary>
    /// Auxiliar method used from ModeDB through BroadcastMessage. Handles the reception of a new rumour in the pedestrian knowledge.
    /// </summary>
    /// <param name="information">Tuple containing the RumourInfo object and an integer indicating the mode.</param>
    public void NewRumourReceived(Tuple <RumourInfo, int> information)
    {
        if (information.Item2 == mode)
        {
            RumourInfo newRumour = information.Item1;

            if (!newRumour.GetId().Equals(rumour.Item1.GetId()) &&
                rumourSusceptibility > Random.Range(0.0f, 1.0f) &&
                newRumour.GetCredibility() > Random.Range(0.0f, 1.0f))
            {
                ModeInfo mInfo = (ModeInfo)newRumour.GetRumour();

                foreach (var m in currentModeInfoKnowledge)
                {
                    if (mInfo.GetId().Equals(m.GetId()) && !mInfo.Equals(m) && mInfo.GetTimeCreated() > m.GetTimeCreated())
                    {
                        //Copy mode (not referencing!)
                        currentModeInfoKnowledge[m.index] = new ModeInfo(mInfo.GetId(), mInfo.GetTimeOfArrival());
                        currentModeInfoKnowledge[m.index].SetStatus(mInfo.GetStatus());
                        currentModeInfoKnowledge[m.index].index = m.index;
                    }
                }

                // Spread message around
                float rumourCredibility = newRumour.GetCredibility() - 0.1f;

                if (rumourCredibility > 0.0f)
                {
                    RumourInfo rInfo = new RumourInfo(newRumour.GetId(), newRumour.GetRumour(), rumourCredibility);
                    rumour = new Tuple <RumourInfo, int>(rInfo, information.Item2);
                    InvokeRepeating("SpreadRumour", 1, 1.0f + Random.Range(0.0f, 1.0f));
                }

                newKnowledgeToBeCheckedbyController = true;
            }
        }
    }
    /// <summary>
    /// Implements the behaviour when the finite state machine exits a certain state.
    /// </summary>
    /// <param name="stateName">Name of the state that the FSM is exiting.</param>
    public void onStateExit(string stateName)
    {
        switch (stateName)
        {
        case "Bus":
        case "Metro":
        {
            if (CurrentState == "End")
            {
                //Reads ModeDB information at the station
                knowledge.UpdateKnowledgeFromModeDB();

                //Takes the next available mode
                ModeInfo m = knowledge.NextAvailableMode();

                // Decide if the pedestrian takes the next mode or leaves the station
                if (m != null)
                {
                    //Check if there is a mode available soon
                    bool modeAvailableSoon = IsModeAvailableSoon();
                    animator.SetBool("modeAvailableSoon", modeAvailableSoon);

                    if (tellMeWhatYouAreDoing)
                    {
                        Debug.Log("My decision to stay at the station: " + modeAvailableSoon);
                    }

                    //If there is no mode available soon, spread the rumour around
                    if (!modeAvailableSoon)
                    {
                        RumourInfo rInfo = new RumourInfo("rumour" + m.GetId(), m, 1.0f);
                        knowledge.rumour = new Tuple <RumourInfo, int>(rInfo, knowledge.mode);
                        knowledge.InvokeRepeating("SpreadRumour", 1, 1.0f + Random.Range(0.0f, 1.0f));
                    }
                    else
                    {
                        this.transform.FindChild("bike").gameObject.SetActive(false);

                        //Stay at the station, put in pedestrian cache for reuse
                        pedestrianCache.Enqueue(this.gameObject);

                        //Send the pedestrian model away from the end point
                        steering.SendToLimbo();
                    }
                }
                else
                {
                    if (tellMeWhatYouAreDoing)
                    {
                        Debug.Log("I lost the last mode...");
                    }

                    //I lost the last mode! Go to the library then...
                    animator.SetBool("modeAvailableSoon", false);
                }
            }
            break;
        }

        case "Walk":
        case "ToBikeStation":     // added by furkan
        case "Bicycle":
        {
            this.transform.FindChild("bike").gameObject.SetActive(false);

            //Stay there, put in pedestrian cache for reuse
            pedestrianCache.Enqueue(this.gameObject);

            //Send the pedestrian model away from the end point
            steering.SendToLimbo();

            break;
        }

        case "End":
        {
            //It is not the end of the trip for this pedestrian
            animator.SetBool("endReached", false);
            break;
        }

        default:
        {
            //Do nothing
            break;
        }
        }
    }