/// <summary> /// Removes NPC from the queue to the toilet. /// </summary> public void RemoveFromQueue(DAS.NPCMovement dasNpcMovement) { //Debug.Log(dasNpcMovement.name + " is being removed from queue"); s_npcAssignedToToilet[dasNpcMovement].occupier = null; s_npcAssignedToToilet[dasNpcMovement].toiletQueue.Remove(dasNpcMovement); s_npcAssignedToToilet.Remove(dasNpcMovement); dasNpcMovement.isQueued = false; }
/// <summary> /// NPCs destination becomes one of the toilets in the scene. /// </summary> public void GotoToilet(DAS.NPCMovement dasNpcMovement) { s_npcAssignedToToilet[dasNpcMovement].occupier = dasNpcMovement; dasNpcMovement.m_agentRef.destination = s_npcAssignedToToilet[dasNpcMovement].gameObject.transform.position; dasNpcMovement.isAtToilet = true; dasNpcMovement.timeInsideDestination = 0; dasNpcMovement.m_agentRef.isStopped = false; }
/// <summary> /// Checks if NPC is within 0.2 units within its' assigned toilet. /// </summary> public bool IsInsideToilet(DAS.NPCMovement dasNpcMovement) { if (Vector3.Distance(dasNpcMovement.m_agentRef.destination, s_npcAssignedToToilet[dasNpcMovement].gameObject.transform.position) < 0.2f) { return(true); } else { return(false); } }
/// <summary> /// NPCs destination becomes one of the toilets in the scene. /// </summary> private bool TryGotoToilet(DAS.NPCMovement dasNpcMovement) { if (s_npcAssignedToToilet.ContainsKey(dasNpcMovement)) { Debug.LogWarning("Something went bad"); } AddToQueue(dasNpcMovement, NextToilet); dasNpcMovement.timeInsideDestination = 0; StartCoroutine(StandInLine(dasNpcMovement)); return(false); }
/// <summary> /// Coroutine function for standing in line to the toilet. /// </summary> private IEnumerator StandInLine(DAS.NPCMovement dasNpcMovement) { dasNpcMovement.m_agentRef.isStopped = false; do { yield return(new WaitForSeconds(0.2f)); do { yield return(new WaitForSeconds(0.2f)); //1. if not first in queue and a queue exists. if (s_npcAssignedToToilet[dasNpcMovement].toiletQueue.IndexOf(dasNpcMovement) > 0 && s_npcAssignedToToilet[dasNpcMovement].toiletQueue.Count > 0) { //2. Which side of the toilets? if (s_npcAssignedToToilet[dasNpcMovement] == s_toiletPoints[0]) { dasNpcMovement.m_agentRef.destination = toiletObject1.queue.transform.position + toiletObject1.queue.transform.forward + (-toiletObject1.queue.transform.forward * s_npcAssignedToToilet[dasNpcMovement].toiletQueue.IndexOf(dasNpcMovement)); } else { dasNpcMovement.m_agentRef.destination = toiletObject2.queue.transform.position + toiletObject2.queue.transform.forward + (-toiletObject2.queue.transform.forward * s_npcAssignedToToilet[dasNpcMovement].toiletQueue.IndexOf(dasNpcMovement)); } } else //1. else if not first in queue and a queue exists. //2. Which side of the toilets? if (s_npcAssignedToToilet[dasNpcMovement] == s_toiletPoints[0]) { dasNpcMovement.m_agentRef.destination = toiletObject1.queue.transform.position + toiletObject1.queue.transform.forward; } else { dasNpcMovement.m_agentRef.destination = toiletObject2.queue.transform.position + toiletObject2.queue.transform.forward; } } while (s_npcAssignedToToilet[dasNpcMovement].toiletQueue[0] != dasNpcMovement); } while (s_npcAssignedToToilet[dasNpcMovement].broken); GotoToilet(dasNpcMovement); }
/// <summary> /// Called in Update. /// Random Chance of NPC wanting to go to the toilet. /// </summary> public void RandomGotoToiletChance(DAS.NPCMovement dasNpcMovement) { if (Random.Range(0f, 1000f) > 999.3f && dasNpcMovement.IsCurrentlyWorking && dasNpcMovement.workTimeStreak >= 100) { bool allowedToilet = true; if (s_npcAssignedToToilet.ContainsKey(dasNpcMovement) || dasNpcMovement.isQueued) { allowedToilet = false; } if (allowedToilet) { dasNpcMovement.isQueued = true; if (TryGotoToilet(dasNpcMovement)) { } } } }
/// <summary> /// Adds an NPC to the toilet queue. /// </summary> private void AddToQueue(DAS.NPCMovement dasNpcMovement, Toilet toiletToQueue) { //Debug.Log(dasNpcMovement.name + " is being added to queue"); s_npcAssignedToToilet.Add(dasNpcMovement, toiletToQueue); s_npcAssignedToToilet[dasNpcMovement].toiletQueue.Add(dasNpcMovement); }
private void Start() { /// Add ourself to list s_npcList.Add(this); /// Assign Values if (NPC.s_npcList.Count % 4 == 3) { myFeelings = new Feelings(0.2f, 0.2f); } else { myFeelings = new Feelings(1f, 1f); } Random.State oldState = Random.state; Random.InitState(name.Length); m_myHappinessDecay = Random.Range(150, 250); m_myMotivationDecay = Random.Range(140, 240); //Debug.Log(name.Length + ": mhd->" + myHappinessDecay + " mmd->" + myMotivationDecay); Random.state = oldState; /// Get Components foreach (var item in GetComponentsInChildren <Slider>()) { if (item.gameObject.name == "Happiness Slider") { happySlider = item; } else if (item.gameObject.name == "Motivation Slider") { motivationSlider = item; } } /// Add Components moveRef = gameObject.AddComponent <DAS.NPCMovement>(); m_modelChanger = gameObject.AddComponent <ModelChanger>(); buttonRef = gameObject.AddComponent <NpcButtons>(); buttonRef.InitNpcButtons(); buttonTogglerRef = gameObject.AddComponent <ButtonToggler>(); buttonTogglerRef.InitButtonToggler(); m_nameHolder = new GameObject("Name Holder"); m_nameHolder.transform.parent = gameObject.transform; m_myNameDisplay = m_nameHolder.AddComponent <TextMesh>(); /// Text if (m_myNameDisplay != null) { m_myNameDisplay.text = name; m_myNameDisplay.alignment = TextAlignment.Center; m_myNameDisplay.anchor = TextAnchor.MiddleCenter; m_myNameDisplay.transform.position = transform.position; m_myNameDisplay.transform.position += new Vector3(0, 3, 0); m_myNameDisplay.transform.forward = Camera.main.transform.forward; m_myNameDisplay.transform.Rotate(0, 180, 0); m_myNameDisplay.characterSize = 0.03f; m_myNameDisplay.fontSize = 155; } /// Material m_myMaterials = GetComponentInChildren <MeshRenderer>().materials; m_moneyMaterial = new Material(m_myMaterials[0]); m_moneyMaterial.color = Color.green; }