public void Pickup(GameObject target)
 {
     currentState         = CivilianState.CARRY;
     navMeshAgent.enabled = false;
     transform.position   = target.transform.position;
     transform.SetParent(target.transform);
 }
Пример #2
0
        private void closeState(CivilianState state, CivilianState next)
        {
            switch (state)
            {
            case CivilianState.walkAround:
                Message("ToStopVisitingWaypoints");
                break;

            case CivilianState.follow:
                Message("ToStopFollowing");
                Message("ToStopFilming");
                Message("ToHidePhone");
                break;

            case CivilianState.call:
                if (next != CivilianState.follow)
                {
                    Message("ToHidePhone");
                }
                break;

            case CivilianState.flee:
                Message("ToStopFleeing");
                break;
            }
        }
 public void Donk()
 {
     navMeshAgent.destination = transform.position;
     myRenderer.material      = DonkedCivilianMaterial;
     currentState             = CivilianState.DONKED;
     SignalManager.Inst.FireSignal(Signal.CIVILIAN_DONKED, new CivilianDonkedArgs(this));
 }
Пример #4
0
    // Use this for initialization
    void Start()
    {
        foreach (Transform t in GameObject.FindGameObjectWithTag("targetPositions").transform)
        {
            if (t.name == "GeneratorRoom")
            {
                GeneratorRoom = t;
            }
            else if (t.name == "PrisonRoom")
            {
                Prison = t;
            }
            else if (t.name == "ExitRoom")
            {
                Exit = t;
            }
            else if (t.name == "RadiationRoom")
            {
                RadiationRoom = t;
            }
            else if (t.name == "Entrance")
            {
                Entrance = t;
            }
            else if (t.name == "HospitalRoom")
            {
                MedicalRoom = t;
            }
        }

        switch (currentCharacter)
        {
        case CharacterType.CIVILIAN:
            civState = CivilianState.IDLE;
            break;

        case CharacterType.RADIATED_PRISONER:
            rAttack = GetComponent <RadiatorAttack>();
            break;

        case CharacterType.RADIATED_PERSON:
            rAttack = GetComponent <RadiatorAttack>();
            break;

        case CharacterType.TECHNICIAN:
            break;

        case CharacterType.GUARD:
            gAttack = GetComponent <GuardAttack>();
            break;
        }
    }
Пример #5
0
        private void openState(CivilianState state, CivilianState previous)
        {
            switch (state)
            {
            case CivilianState.idle:
                if (Vector3.Distance(transform.position, StartingLocation) > 0.25f)
                {
                    Message("ToWalkTo", StartingLocation);
                    Message("ToFaceWalkDirection");
                }
                break;

            case CivilianState.walkAround:
                if (Actor.Cover != null)
                {
                    Message("ToLeaveCover");
                }

                _waypointCheck = false;
                Message("ToStartVisitingWaypoints");

                if (!_waypointCheck)
                {
                    setState(CivilianState.idle);
                }

                break;

            case CivilianState.follow:
                Message("ToStartFollowing", LastKnownThreatPosition);
                Message("ToTakePhone");
                Message("ToStartFilming");

                _wasThreatArmed = Threat.IsArmed;

                if (_wasThreatArmed || !OnlyAlarmedByWeapons)
                {
                    alarm();
                }
                break;

            case CivilianState.call:
                Message("ToTakePhone");
                Message("ToCall");
                break;

            case CivilianState.flee:
                Message("ToStartFleeing", LastKnownThreatPosition);
                alarm();
                break;
            }
        }
Пример #6
0
        private void Update()
        {
            if (Actor == null || !Actor.IsAlive)
            {
                return;
            }

            _stateTime += Time.deltaTime;

            if (Threat != null && CanSeeTheThreat)
            {
                SetThreat(Threat, Threat.transform.position, Threat.Cover);
            }

            if (_futureSetState != CivilianState.none)
            {
                var state = _futureSetState;
                _futureSetState = CivilianState.none;
                setState(state);
            }

            switch (_state)
            {
            case CivilianState.none:
                setState(CivilianState.walkAround);
                break;

            case CivilianState.walkAround:
                break;

            case CivilianState.follow:
                if (!_wasThreatArmed)
                {
                    _wasThreatArmed = Threat.IsArmed;

                    if (_wasThreatArmed)
                    {
                        alarm();
                    }
                }
                break;

            case CivilianState.flee:
                break;
            }
        }
Пример #7
0
 void OnCollisionEnter(Collision collider)
 {
     if (aiState.Equals(CivilianState.NORMAL))
     {
         if (collider.gameObject.GetComponent <Vehicle>() != null)
         {
             ;
             if (Random.Range(0, 5) == 0)
             {
                 aiState = CivilianState.FRENZIED;
             }
             else
             {
                 aiState = CivilianState.HALTED;
             }
         }
     }
 }
Пример #8
0
        private void openState(CivilianState state, CivilianState previous)
        {
            switch (state)
            {
            case CivilianState.none:
                break;

            case CivilianState.walkAround:
                if (Actor.Cover != null)
                {
                    Message("ToLeaveCover");
                }

                Message("ToStartVisitingWaypoints");
                break;

            case CivilianState.follow:
                Message("ToStartFollowing", LastKnownThreatPosition);
                Message("ToTakePhone");
                Message("ToStartFilming");

                _wasThreatArmed = Threat.IsArmed;

                if (_wasThreatArmed || !OnlyAlarmedByWeapons)
                {
                    alarm();
                }
                break;

            case CivilianState.call:
                Message("ToTakePhone");
                Message("ToCall");
                break;

            case CivilianState.flee:
                Message("ToStartFleeing", LastKnownThreatPosition);
                alarm();
                break;
            }
        }
Пример #9
0
        private void setState(CivilianState state, bool forceRestart = false)
        {
            if (_state == state && !forceRestart)
            {
                return;
            }

            if (_state != state)
            {
                _previousState = _state;
            }

            closeState(_state, state);
            _stateTime = 0;
            _state     = state;
            openState(_state, _previousState);

            if (!_wasAlerted && IsAlerted)
            {
                _wasAlerted = true;
                Message("OnAlerted");
            }
        }
Пример #10
0
    // Update is called once per frame
    void Update()
    {
        //temp for test
        navMeshAgent.stoppingDistance = stopDist;
        //---------------------------------------

        primaryTargetForRadiator   = null;
        secondaryTargetForRadiator = null;
        runFromObj     = null;
        targetForGuard = null;

        if (rAttack != null)
        {
            rAttack.mainTarget = null;
            rAttack.sideTarget = null;
        }

        if (CharacterType.RADIATED_PERSON == currentCharacter)
        {
            if (timeElapsed >= BigRadDelay && bigRadState == BigRadState.INACTIVE)
            {
                bigRadState = BigRadState.MOVING_TO_HELP_OTHERS;
                GetComponent <Brain>().isFree = true;
                target = Prison.transform.position;
            }
            else if (timeElapsed < BigRadDelay && bigRadState == BigRadState.INACTIVE)
            {
                timeElapsed += Time.deltaTime;
            }

            if (bigRadState == BigRadState.MOVING_TO_HELP_OTHERS && target != Prison.transform.position)
            {
                target = Prison.transform.position;
            }

            // Free the prisoners.
            if (bigRadState == BigRadState.HELPING_OTHERS)
            {
                // Get the prison free triggers in his vicinity.
                tempColliders = Physics.OverlapSphere(transform.position, rAttack.attackRange * 4, PrisonFreeTriggerLayer);
                if (tempColliders.Length > 0)
                {
                    if ((target != tempColliders[0].transform.position))
                    {
                        target = tempColliders[0].gameObject.transform.position;
                    }
                }
                else
                {
                    bigRadState = BigRadState.ESCAPING;
                }
            }

            if (bigRadState == BigRadState.ESCAPING)
            {
                target = Exit.position;
            }

            if (escaped && (bigRadState == BigRadState.HELPING_OTHERS))
            {
                target      = Exit.position;
                bigRadState = BigRadState.ESCAPING;
            }
        }

        if (CharacterType.RADIATED_PRISONER == currentCharacter && isFree)
        {
            if (bigRadState == BigRadState.ESCAPING)
            {
                target = Exit.position;
            }
        }

        // Logic for running away.
        if ((CharacterType.CIVILIAN == currentCharacter && civState == CivilianState.IDLE) || (CharacterType.TECHNICIAN == currentCharacter && techState == TechnicianState.IDLE))
        {
            tempColliders = Physics.OverlapSphere(transform.position, CivilianRadius, RadiatedLayerMask);
            if (tempColliders.Length >= 1)
            {
                foreach (Collider tempCollider in tempColliders)
                {
                    shootDirection = (tempCollider.transform.position - transform.position).normalized;
                    distance       = Vector3.Distance(transform.position, tempCollider.transform.position);
                    hits           = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray();

                    // Loop until you find a rad with no obstruction in the middle.

                    if (hits.Length <= 0 || ((RadiatedLayerMask & 1 << hits[0].transform.gameObject.layer) == 0))
                    {
                        runFromObj = null;
                        continue;
                    }

                    // Target only free rads.
                    if (tempCollider.gameObject.GetComponent <Brain>().isFree)
                    {
                        runFromObj = tempCollider.gameObject;
                        break;
                    }
                }

                if (null != runFromObj && null != runFromObj.transform)
                {
                    target    = transform.position + (-2 * shootDirection * distance);
                    techState = TechnicianState.RUN;
                    civState  = CivilianState.RUN;
                }
            }
        }

        // Guard Attack
        if (CharacterType.GUARD == currentCharacter)
        {
            // Check for the surroundings to see any idiots radiated and running around.
            tempColliders = Physics.OverlapSphere(transform.position, gAttack.attackRange, RadiatedLayerMask);
            if (tempColliders.Length >= 1)
            {
                foreach (Collider tempCollider in tempColliders)
                {
                    shootDirection = (tempCollider.transform.position - transform.position).normalized;
                    distance       = Vector3.Distance(transform.position, tempCollider.transform.position);
                    hits           = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray();

                    // Loop until you find a rad with no obstruction in the middle.

                    if (hits.Length <= 0 || (hits[0].transform.gameObject != tempCollider.gameObject))
                    {
                        targetForGuard = null;
                        continue;
                    }

                    // Target only free rads.
                    if (tempCollider.gameObject.GetComponent <Brain>().isFree)
                    {
                        targetForGuard = tempCollider.gameObject;
                    }
                }

                if (null != targetForGuard && null != targetForGuard.GetComponent <GeneralRadiator>())
                {
                    // Check if the object still exists.
                    if (null != targetForGuard.transform)
                    {
                        gAttack.target = targetForGuard.GetComponent <GeneralRadiator>();
                        if (gAttack.IsReadyToAttack)
                        {
                            gAttack.Attack();
                        }
                    }
                }
            }
        }

        // Radiators Attack.
        if ((CharacterType.RADIATED_PERSON == currentCharacter && bigRadState != BigRadState.INACTIVE) || (CharacterType.RADIATED_PRISONER == currentCharacter && bigRadState != BigRadState.INACTIVE))
        {
            tempColliders = Physics.OverlapSphere(transform.position, rAttack.attackRange, NormalPeopleLayerMask);

            if (tempColliders.Length >= 1)
            {
                foreach (Collider tempCollider in tempColliders)
                {
                    shootDirection = (tempCollider.transform.position - transform.position).normalized;
                    distance       = Vector3.Distance(transform.position, tempCollider.transform.position);
                    hits           = Physics.RaycastAll(transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray();

                    // Loop until you find a rad with no obstruction in the middle.
                    if (hits.Length <= 0 || (hits[0].transform.gameObject != tempCollider.gameObject))
                    {
                        rayHitFirstObj           = hits[0].transform.gameObject;
                        primaryTargetForRadiator = null;
                        continue;
                    }

                    rayHitFirstObj           = hits[0].transform.gameObject;
                    primaryTargetForRadiator = tempCollider.gameObject;
                    isRadShooting            = true;

                    // Banking on the fact that this doesn't happen usually when the player is playing.
                    break;
                }

                if (null != primaryTargetForRadiator && null != primaryTargetForRadiator.transform)
                {
                    newTempColliders = Physics.OverlapSphere(primaryTargetForRadiator.transform.position, rAttack.attackRange, NormalPeopleLayerMask);

                    if (newTempColliders.Length >= 1)
                    {
                        foreach (Collider newTempCollider in newTempColliders)
                        {
                            shootDirection = -1 * (primaryTargetForRadiator.transform.position - newTempCollider.transform.position).normalized;
                            distance       = Vector3.Distance(primaryTargetForRadiator.transform.position, newTempCollider.transform.position);
                            hits           = Physics.RaycastAll(primaryTargetForRadiator.transform.position, shootDirection, distance).OrderBy(h => h.distance).ToArray();

                            if (hits.Length <= 0 || (hits[0].transform.gameObject != newTempCollider.gameObject))
                            {
                                continue;
                            }

                            secondaryTargetForRadiator = newTempCollider.gameObject;
                            break;
                        }
                    }

                    if (null != primaryTargetForRadiator && null != primaryTargetForRadiator.GetComponent <GeneralPeople>())
                    {
                        rAttack.mainTarget = primaryTargetForRadiator.GetComponent <GeneralPeople>();
                        if (null != secondaryTargetForRadiator && null != secondaryTargetForRadiator.GetComponent <GeneralPeople>())
                        {
                            rAttack.sideTarget = secondaryTargetForRadiator.GetComponent <GeneralPeople>();
                        }
                        if (rAttack.IsReadyToAttack)
                        {
                            rAttack.Attack();
                        }
                    }
                }
            }

            if (null == primaryTargetForRadiator || null == primaryTargetForRadiator.transform)
            {
                isRadShooting = false;
            }
        }

        if ((currentCharacter == CharacterType.RADIATED_PERSON || currentCharacter == CharacterType.RADIATED_PRISONER) && isRadShooting)
        {
            navMeshAgent.speed = 0;
        }
        else
        {
            navMeshAgent.speed = bigRadSpeed;
        }

        navMeshDestination = navMeshAgent.destination;

        distance = Vector3.Distance(target, new Vector3(0.0f, 0.0f, 0.0f));
        if (target != null && (distance != 0) && (target.x != navMeshAgent.destination.x && target.z != navMeshAgent.destination.z))
        {
            navMeshAgent.SetDestination(target);
        }
    }
 public void DropOff()
 {
     currentState             = CivilianState.DROPOFF;
     navMeshAgent.enabled     = true;
     navMeshAgent.destination = Jail.Inst.transform.position;
 }
Пример #12
0
 public void SetAiStateToNormal()
 {
     aiState = CivilianState.NORMAL;
 }
Пример #13
0
 public void Halt()
 {
     aiState = CivilianState.HALTED;
 }