Esempio n. 1
0
    protected IEnumerator ArriveBathroom(Bathroom place)
    {
        UpdateHeader(" entering bathroom");

        // Get toilet.
        Waitpoint toilet = FindRandomWaitpoint(place.toilets, true);

        yield return(StartCoroutine(WaitpointQueue(toilet)));

        PlaySFX(fX.pee);
        yield return(StartCoroutine("UseHands"));

        toilet.IsBusy = false;

        // Get sink.
        Waitpoint sink = FindRandomWaitpoint(place.sinks, true);

        yield return(StartCoroutine(WaitpointQueue(sink)));

        PlaySFX(fX.tap);
        yield return(StartCoroutine("UseHands"));

        sink.IsBusy = false;

        isBusy = false;

        SetIdle();
    }
Esempio n. 2
0
 void CheckTrayPoints()
 {
     // Ensure waitpoints are assigned.
     if (!trayPickup || !trayDropoff || !foodPoint)
     {
         foreach (Waitpoint wp in GetComponentsInChildren <Waitpoint>())
         {
             if (wp.name == "TrayPickup")
             {
                 trayPickup = wp;
             }
             else if (wp.name == "TrayDropoff")
             {
                 trayDropoff = wp;
             }
             else if (wp.name == "FoodPickup")
             {
                 foodPoint = wp;
             }
         }
     }
 }
Esempio n. 3
0
    IEnumerator Task0(MissionTriggerNPC tt)
    {
        UpdateState(GuardState.guarding);
        tt.onoff = false;

        // Third trigger
        if (GameManager.instance.missionCheckpoints[1] == 2)
        {
            GameManager.instance.mission0Checkpoints[2].SetActive(true);
        }

        // Go to the sink.
        Waitpoint sink = FindRandomWaitpoint(Map.instance.bathroomCentre.sinks, true);

        yield return(StartCoroutine(WaitpointQueue(sink)));

        // Drop baton in sink.
        yield return(StartCoroutine("UseHands"));

        PlaySFX(fX.tap);
        GameObject bt = null;

        if (GameManager.instance.missionCheckpoints[1] == 2)
        {
            bt = Instantiate(baton, sink.transform.position + new Vector3(-0.5f, 0, 0), Quaternion.Euler(90, 0, 0));
        }
        sink.IsBusy = false;
        isBusy      = false;

        // Go to a toilet.
        Waitpoint toilet = FindRandomWaitpoint(Map.instance.bathroomCentre.toilets, true);

        yield return(StartCoroutine(WaitpointQueue(toilet)));

        StartCoroutine("UseHands");

        // Delay so player can retrieve baton.
        yield return(sec5);

        yield return(sec5);

        toilet.IsBusy = false;
        PlaySFX(fX.pee);

        // Retrieve baton from sink.
        yield return(StartCoroutine(WaitpointQueue(sink)));

        PlaySFX(fX.tap);
        yield return(StartCoroutine("UseHands"));

        sink.IsBusy = false;

        // If player retrieved baton.
        if (GameManager.instance.missionCheckpoints[1] == 3 && !bt)
        {
            PlaySFX(fX.whatTheHell);
            yield return(sec2);

            // Routine broken!
            GameManager.instance.Checkpoint(0);

            // Look for baton.
            navMeshAgent.SetDestination(toilet.transform.position);
            yield return(sec3);

            navMeshAgent.SetDestination(toilet.transform.position);
            yield return(sec3);

            // Move on
            UpdateState(GuardState.patrolling);
            yield break;
        }

        GameManager.instance.mission0Checkpoints[2].SetActive(false);

        // Go to cell.
        Vector3 target = Map.instance.cells[7].door.transform.position;

        navMeshAgent.SetDestination(target);
        yield return(new WaitUntil(() => Vector3.Distance(transform.position, target) <= 2));

        // Open door.
        Map.instance.cells[7].door.InteractHands();
        yield return(sec2);

        target = Map.instance.cells[7].transform.position;
        navMeshAgent.SetDestination(target);
        yield return(new WaitUntil(() => Vector3.Distance(transform.position, target) <= 1));

        // Lock door.
        Map.instance.cells[7].door.InteractHands();
        Map.instance.cells[7].door.isLocked = true;

        // First trigger.
        if (GameManager.instance.missionCheckpoints[1] == 0)
        {
            GameManager.instance.mission0Checkpoints[0].SetActive(true);
        }

        //// Beating event for 1min.
        //for (int i = 0; i < 12; i++)
        //{
        //    audioS.clip = fX.beating;
        //    audioS.loop = true;
        //    audioS.Play();
        //    //PlaySFX(fX.beating);
        //    yield return sec5;
        //}
        //audioS.loop = false;

        yield return(sec5);

        UpdateState(GuardState.patrolling);
        tt.onoff = true;

        if (GameManager.instance.missionCheckpoints[1] == 0)
        {
            GameManager.instance.mission0Checkpoints[0].SetActive(false);
        }

        // Second trigger
        if (GameManager.instance.missionCheckpoints[1] == 1)
        {
            GameManager.instance.mission0Checkpoints[1].SetActive(true);
            yield return(sec5);

            GameManager.instance.mission0Checkpoints[1].SetActive(false);
        }
    }
Esempio n. 4
0
    // NPCs start queuing as soon as they enter.
    protected IEnumerator WaitpointQueue(Waitpoint waitpoint)
    {
        bool wasBusy = false; // Loop control variable.
        bool imFirst = false;

        navMeshAgent.stoppingDistance = 0.5f;
        navMeshAgent.autoBraking      = true;
        Vector3 destination = new Vector3(waitpoint.transform.position.x, transform.position.y, waitpoint.transform.position.z);

        // Check if waitpoint is free and move to them.
        if (!waitpoint.IsBusy && waitpoint.queue.Count == 0)
        {
            imFirst          = true;
            waitpoint.IsBusy = true;
            navMeshAgent.SetDestination(destination);

            // If there is no queue, create one;
            if (!wasBusy)
            {
                waitpoint.current = this.gameObject;
            }
        }

        // Continue checking if someone else is picking up a tray until close.
        do
        {
            // If someone reaches point before self:
            if (waitpoint.IsBusy && !imFirst || !waitpoint.IsBusy && waitpoint.queue.Count != 0 && !imFirst)
            {
                wasBusy = true;
                // Prevent AI pushing.
                navMeshAgent.stoppingDistance = 0.8f;
                navMeshAgent.radius           = 0.3f;
                // Queue behind them.
                currentQueue = waitpoint.current;
                // Set queue point to self.
                waitpoint.current = this.gameObject;
                // Add self to queue.
                waitpoint.queue.Enqueue(this.gameObject);
                waitpoint.queueLenght = waitpoint.queue.Count;

                while (true)
                {
                    // Wait until waitpoint is free, keep in queue.
                    if (waitpoint.IsBusy)
                    {
                        // If self is first in queue and there is a queuepoint, move to queuepoint.
                        if (waitpoint.queue.Peek() == this.gameObject && waitpoint.queuePoint != null)
                        {
                            navMeshAgent.SetDestination(waitpoint.queuePoint.transform.position);
                        }
                        // Else move behind queue
                        else
                        {
                            navMeshAgent.SetDestination(currentQueue.transform.position);
                        }
                    }
                    // If free and self is next in queue, dequeue self, set waitpoint as busy and break.
                    else if (!waitpoint.IsBusy && waitpoint.queue.Peek() == this.gameObject)
                    {
                        UpdateHeader(" going to " + waitpoint.name);

                        waitpoint.queue.Dequeue();
                        waitpoint.queueLenght = waitpoint.queue.Count;
                        waitpoint.IsBusy      = true;
                        navMeshAgent.SetDestination(destination);
                        navMeshAgent.stoppingDistance = 0.5f;
                        navMeshAgent.radius           = 0.4f;
                        break;
                    }
                    yield return(sec025);
                }
                break;
            }
            navMeshAgent.autoBraking = false;
            yield return(1);
        } while (Vector3.Distance(transform.position, destination) > 0.55f);

        Vector3 target = new Vector3(waitpoint.transform.parent.position.x, transform.position.y, waitpoint.transform.parent.position.z);

        if (waitpoint.waitTime > 0)
        {
            yield return(new WaitForSeconds(waitpoint.waitTime));
        }
    }
Esempio n. 5
0
    protected IEnumerator WaitForWaitpoint(Waitpoint waitpoint)
    {
        yield return(waitpoint.IsBusy = false);

        yield return(StartCoroutine(WaitpointQueue(waitpoint)));
    }