Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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());
    }
Exemplo n.º 3
0
    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;
    }
Exemplo n.º 4
0
    //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);
        }
    }
Exemplo n.º 5
0
    // 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;
        }
    }