void StartFight(NormalPersonAI otherPerson, bool makeLine, bool hatChange = true) { if (hatChange) { hat.enabled = true; hat.material.color = Color.black; } _wanderingLeftCD = _changeCD; _talkingSubject = otherPerson; _changeCD = Random.Range(1f, 4f); if (makeLine) { var newLine = Factory.Instance.GetTalkingLine(); var lat = newLine.GetComponent <LineAttachTo>(); lat.targetA = transform; lat.targetB = otherPerson.transform; var lr = newLine.GetComponent <LineRenderer>(); lr.material.color = Color.black; _fightingLine.Push(newLine); } ChangeState(State.Fighting); }
public List <NormalPersonAI> GetPeople() { Debug.Assert(_state == States.Occupied); colRego.inside.RemoveWhere(i => i == null); foreach (var fuckyou in _servredPeople) { if (fuckyou == null) { _servredPeople.Remove(null); } } var personList = colRego.inside.Except(_servredPeople); var result = new Stack <NormalPersonAI>(personList.Count()); foreach (var person in personList) { NormalPersonAI toAdd = person.GetComponent <NormalPersonAI>(); if (toAdd != null) { _servredPeople.Add(person); result.Push(toAdd); } } return(result.ToList()); }
void StopFighting() { if (_fightingLine != null) { while (_fightingLine.Count > 0) { var top = _fightingLine.Peek(); Factory.Instance.ReleaseTalkingLine(ref top); _fightingLine.Pop(); } } hat.enabled = false; _talkingSubject = null; }
//Detect collisions between the GameObjects with Colliders attached void OnTriggerEnter(Collider other) { if (other.gameObject.tag != "Person") { return; } var otherPerson = other.gameObject.GetComponent <NormalPersonAI>(); if (Vector3.Distance(otherPerson.transform.position, transform.position) > 3f) { return; } if (WantsToFight() && otherPerson.WantsToFight()) { if (beliefControler.LeftLeaning == otherPerson.beliefControler.LeftLeaning) { return; } StartFight(otherPerson, true); otherPerson.StartFight(this, false); } else if (CanTalk()) { if (!otherPerson.CanTalk()) { return; } var subject = beliefControler.CommonBelief(otherPerson.beliefControler); if (subject == null) { return; } if (_state == State.SeekingSocial) { StopSocialSeeking(); } if (otherPerson._state == State.SeekingSocial) { otherPerson.StopSocialSeeking(); } _wanderingLeftCD = _changeCD; otherPerson._wanderingLeftCD = otherPerson._changeCD; ChangeState(State.Talking); otherPerson.ChangeState(State.Talking); hat.enabled = true; hat.material.color = Color.white; otherPerson.hat.enabled = true; otherPerson.hat.material.color = Color.white; _talkingSubject = otherPerson; otherPerson._talkingSubject = this; for (int i = 0; i < 5; i++) { beliefControler.TalkTo(otherPerson.beliefControler, subject); } _talkingCD = 0f; otherPerson._talkingCD = 1f; _changeCD = Random.Range(4f, 8f); otherPerson._changeCD = _changeCD; _line = Factory.Instance.GetTalkingLine(); Debug.LogFormat("Frame:{2} {1} GETTING {0} ", _line.name, gameObject.name, Time.frameCount); var lat = _line.GetComponent <LineAttachTo>(); lat.targetA = transform; lat.targetB = otherPerson.transform; var lr = _line.GetComponent <LineRenderer>(); lr.material.color = Color.white; transform.LookAt(otherPerson.transform); } }
// Update is called once per frame void Update() { _changeCD -= Time.deltaTime; _talkingToOtherCD -= Time.deltaTime; _workingCD -= Time.deltaTime; switch (_state) { case State.Idling: if (_changeCD <= 0) { ChangeState(State.Wandering); } break; case State.Wandering: _talkingCD -= Time.deltaTime; bool eatChance = false; bool sleepAddres = false; bool socialAddress = false; if (DesperateForFood(_needs.FoodNeed)) { eatChance = true; } else if (DesperateForSleep(_needs.SleepingNeed)) { sleepAddres = true; } else if (DesperateForSocial(_needs.SocialNeed)) { socialAddress = true; } if (_changeCD <= 0 || eatChance || sleepAddres || socialAddress) { if (_needs.Die) { ChangeState(State.Dying); break; } State newState = State.Idling; if (eatChance || WantsFood(_needs.FoodNeed)) { if (StartFindFood()) { newState = State.FindingFood; } } else if (sleepAddres) { GoToBed(); newState = State.GoingToBed; } else if (socialAddress) { FindSocialInteraction(); _changeCD = SOCIAL_NEEDING_COOLDOWN; newState = State.SeekingSocial; } else if (_workingCD <= 0) { //CheckKeepJob(); if (_worker.CurrentState == Worker.State.Jobless) { FindJob(); } if (_worker.CurrentState == Worker.State.HasJob) { if (_worker.Job.JobReady()) { StartWork(); newState = State.Working; } else { newState = State.Wandering; } } } ChangeState(newState); } break; case State.SeekingSocial: if (ReachedTarget(0.2f)) { FindSocialInteraction(); } if (_changeCD < 0 && _worker.CurrentState == Worker.State.Jobless) { GiveFollowerJob(); _changeCD = SOCIAL_NEEDING_COOLDOWN; if (_worker.CurrentState == Worker.State.HasJob) { StartWork(); ChangeState(State.Working); } { StopSocialSeeking(); ChangeState(State.Wandering); } } else if (_needs.SocialNeed.Value >= SocialNeed.MAX_VALUE * 0.8f) { StopSocialSeeking(); ChangeState(State.Wandering); } break; case State.Talking: _talkingCD -= Time.deltaTime; if (_talkingCD <= 0) { CreateTalkingText(); _talkingCD = 2f; } if (_changeCD <= 0) { _needs.SocialNeed.Value += SPEECH_SOCIAL_BENFIT; ChangeState(State.FinshedTalking); } break; case State.FinshedTalking: if (_talkingSubject._state == State.FinshedTalking || _talkingSubject._talkingSubject != this) { if (_line != null) { Debug.LogFormat("Frame:{2} {1} RETURNING {0} ", _line.name, gameObject.name, Time.frameCount); Factory.Instance.ReleaseTalkingLine(ref _line); } _talkingToOtherCD = TALKING_COOLDOWN; hat.enabled = false; hat.material.color = Color.white; _talkingSubject = null; ChangeState(State.Wandering); _changeCD = _wanderingLeftCD; } break; case State.RevSpeach: if (_changeCD <= 0) { beliefControler.ReceiveSpeechBelief(_speaker.beliefControler, _speaker.FactionCom.Faction); _changeCD = Random.Range(0f, 2f); } break; case State.Working: _workingTimer += Time.deltaTime; if (_worker.CurrentState == Worker.State.Jobless) { RemoveWorkingHat(); ChangeState(State.Wandering); break; } if (_needs.Die) { DieWhileWorking(); } _worker.Job.Step(); if (_workingTimer > _worker.Job.Length) { ChangeState(State.Wandering); } break; case State.FindingFood: if (_needs.Die) { Die(); } if (ReachedTarget(0.5f)) { if (_targetMarket.ConsumeFood(_needs.FoodNeed)) { _talkingCD = 5f; hat.material.color = new Color32() { a = byte.MaxValue, g = 255, b = 255 }; ChangeState(State.ConsumingFood); } else { if (!StartFindFood()) { hat.enabled = false; ChangeState(State.Wandering); } } } break; case State.ConsumingFood: _talkingCD -= Time.deltaTime; if (_needs.Die) { Die(); } if (_talkingCD <= 0) { if (_needs.FoodNeed.Value > _needs.FoodNeed.MaxValue * 0.9) { hat.enabled = false; ChangeState(State.Wandering); } else { if (StartFindFood()) { ChangeState(State.FindingFood); } else { hat.enabled = false; ChangeState(State.Wandering); } } } break; case State.GoingToBed: if (!agent.pathPending && agent.remainingDistance <= 0.5) { StartSleeping(); ChangeState(State.Sleeping); } break; case State.Sleeping: _talkingCD -= Time.deltaTime; _needs.SleepingNeed.Value += 6 * Time.deltaTime; if (_talkingCD <= 0) { Helper.CreateTalkingText(camera, new Color32 { a = 50 }, Home.SleepTalkingPostion(), "zzzzz".Substring(Random.Range(1, 5))); _talkingCD = 5f; } if (_needs.SleepingNeed.Value >= _needs.SleepingNeed.MaxValue) { WakeUp(); ChangeState(State.Wandering); } break; case State.Dying: Die(); break; case State.Fighting: if (Vector3.Distance(_talkingSubject.transform.position, transform.position) > 1.5f) { agent.SetDestination(_talkingSubject.transform.position); } else if (_changeCD < 0) { if (Random.Range(0, 100) > 80) { _talkingSubject.ChangeState(State.Dying); _talkingSubject.StopFighting(); StopFighting(); ChangeState(State.Wandering); } else { var talkingText = beliefControler.LeftLeaning ? "optimatium caput stercore" : "purgamentum init populist"; var color = new Color32() { a = byte.MaxValue }; Helper.CreateTalkingText(camera, color, transform, talkingText); _changeCD = Random.Range(1f, 4f); } } break; } }