Example #1
0
File: GuardAI.cs Project: R-N/Skid
    void Update()
    {
        myPos   = myTrans.position;
        myV2Pos = myPos.xz();

        myRot = myTrans.rotation;
        myFwd = myRot * Vector3.forward;

        if (rotatingLookDir > 0)
        {
            if (rotatingLookDir == 1)
            {
                localLookDir = Vector3.RotateTowards(localLookDir, targetLookDir, lookAngularSpeedRad * Time.deltaTime, 0);
                if (localLookDir == targetLookDir)
                {
                    rotatingLookDir = 0;
                }
                worldLookDir = myRot * localLookDir;
            }
            else if (rotatingLookDir == 2)
            {
                worldLookDir = Vector3.RotateTowards(worldLookDir, targetLookDir, lookAngularSpeedRad * Time.deltaTime, 0);
                worldLookDir = Vector3.RotateTowards(myFwd, worldLookDir, MyExtensions.deg90inRad, 0);
                if (worldLookDir == targetLookDir)
                {
                    rotatingLookDir = 0;
                }
                localLookDir = myTrans.InverseTransformDirection(worldLookDir);
            }
        }
        else
        {
            worldLookDir = myRot * localLookDir;
            if (searching > 4)
            {
                if (!(ctrl.HasBuff(BuffIndex.blind) || ctrl.HasBuff(BuffIndex.stun)))
                {
                    if (searching == 5)
                    {
                        if (timer > 0)
                        {
                            timer -= Time.deltaTime;
                        }
                        else
                        {
                            searching++;
                        }
                    }
                    else if (searching == 6)
                    {
                        //TauntPos (myPos - 2 * myFwd);
                        LookTowards(Vector3.forward);
                        searching = 8;
                    }
                    else if (searching == 7)
                    {
                        if (timer > 0)
                        {
                            timer -= Time.deltaTime;
                        }
                        else
                        {
                            searching++;
                        }
                    }
                    else if (searching == 8)
                    {
                        LookTowards(nextLookTarget);
                        searching = 9;
                    }
                    else if (searching == 9)
                    {
                        if (timer > 0)
                        {
                            timer -= Time.deltaTime;
                        }
                        else
                        {
                            searching++;
                        }
                    }
                    else if (searching == 10)
                    {
                        LookTowards(Vector3.forward);
                        searching = 0;
                    }
                }
            }
        }


        worldV2LookDir = worldLookDir.xz();

        Debug.DrawLine(myPos, myPos + 5 * worldLookDir, Color.red);


        if (target == null)
        {
            if (searching > 0)
            {
                if (searching < 5 && !ctrl.hasPath)
                {
                    LookAround();
                }
            }
            else
            {
                if (patrolType > 0)
                {
                    if (!ctrl.hasPath || Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) < 0.1f)
                    {
                        if (currentPatrolPoint < maxPatrolPointsIndex)
                        {
                            currentPatrolPoint++;
                        }
                        else
                        {
                            if (patrolType == 1)
                            {
                                patrolType = -1;
                            }
                            else if (patrolType == 2)
                            {
                                currentPatrolPoint = 0;
                            }
                            else if (patrolType == 3)
                            {
                                currentPatrolPoint--;
                                patrolType = 4;
                            }
                        }
                    }
                    ctrl.MoveTo(patrolPoints [currentPatrolPoint]);
                }
                else if (patrolType == 4)
                {
                    if (!ctrl.hasPath || Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) < 0.1f)
                    {
                        if (currentPatrolPoint > 0)
                        {
                            currentPatrolPoint--;
                        }
                        else
                        {
                            currentPatrolPoint++;
                            patrolType = 3;
                        }
                    }
                    ctrl.MoveTo(patrolPoints [currentPatrolPoint]);
                }
                else if (patrolType == -1)
                {
                    if (!ctrl.hasPath && Vector3.Distance(patrolPoints [currentPatrolPoint], myPos) > 0.1f)
                    {
                        ctrl.MoveTo(patrolPoints [maxPatrolPointsIndex]);
                    }
                }
            }

            foreach (MyController c in CharManager.registeredChars)
            {
                if ((searching < 3 || searching > 4) && Vector3.Distance(c.transform.position, myPos) <= presenceDetectionRange)
                {
                    TauntPos(c.myTrans.position, false, 3);
                }
                float suspiciousness = 0;
                if (!ctrl.HasBuff(BuffIndex.blind))
                {
                    suspiciousness += SightCheck(c, Time.deltaTime);
                }
                if (!ctrl.HasBuff(BuffIndex.loudNoises))
                {
                    suspiciousness += 0.5f * HearCheck(c, Time.deltaTime);
                }

                if (suspiciousness > 0)
                {
                    if (targets.ContainsKey(c))
                    {
                        targets [c] += suspiciousness;
                    }
                    else
                    {
                        targets.Add(c, suspiciousness);
                    }
                }
                else if (targets.ContainsKey(c))
                {
                    if (onAlert)
                    {
                        targets [c] -= Time.deltaTime * 0.5f;
                    }
                    else
                    {
                        targets [c] -= Time.deltaTime;
                    }
                }
            }

            foreach (TauntingRock c in TauntingRock.rocks)
            {
                float suspiciousness = 0;
                if (!ctrl.HasBuff(BuffIndex.blind))
                {
                    suspiciousness += RockSight(c, Time.deltaTime);
                }
                Debug.Log("suspiciousness " + suspiciousness);

                if ((searching < 3 || searching > 4) && Vector3.Distance(c.transform.position, myPos) <= presenceDetectionRange)
                {
                    if (suspiciousness > 0)
                    {
                        TauntPos(c.nodes [0], true, 3);
                    }
                    else
                    {
                        TauntPos(c.myTrans.position, false, 3);
                    }
                }
                if (suspiciousness > 0)
                {
                    if (rocks.ContainsKey(c))
                    {
                        rocks [c] += suspiciousness;
                    }
                    else
                    {
                        rocks.Add(c, suspiciousness);
                    }
                }
                else if (rocks.ContainsKey(c))
                {
                    if (onAlert)
                    {
                        rocks [c] -= Time.deltaTime * 0.5f;
                    }
                    else
                    {
                        rocks [c] -= Time.deltaTime;
                    }
                }
            }
            if (!ctrl.HasBuff(BuffIndex.stun))
            {
                if (targets.Count > 0)
                {
                    IEnumerable <KeyValuePair <MyController, float> > targetsKnown = targets.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 1));
                    int count = targetsKnown.Count();
                    if (count > 0)
                    {
                        KeyValuePair <MyController, float> sighted;
                        if (count > 1)
                        {
                            sighted = targetsKnown.OrderByDescending(c => c.Value).First();
                        }
                        else
                        {
                            sighted = targetsKnown.First();
                        }
                        SetTarget(sighted.Key);
                    }
                    else if (searching < 2 || searching > 4)
                    {
                        IEnumerable <KeyValuePair <MyController, float> > targetsCheck = targets.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 0.5f));
                        count = targetsCheck.Count();
                        if (count > 0)
                        {
                            KeyValuePair <MyController, float> sighted;
                            if (count > 1)
                            {
                                sighted = targetsCheck.OrderByDescending(c => c.Value).First();
                            }
                            else
                            {
                                sighted = targetsCheck.First();
                            }
                            TauntPos(sighted.Key.myTrans.position, false, 2);
                        }
                    }
                }
                if ((searching < 2 || searching > 4) && rocks.Count > 0)
                {
                    IEnumerable <KeyValuePair <TauntingRock, float> > rocksCheck = rocks.Where(c => (c.Key.gameObject.activeInHierarchy && c.Value >= 0.5f));
                    int count = rocksCheck.Count();
                    if (count > 0)
                    {
                        KeyValuePair <TauntingRock, float> sighted;
                        if (count > 1)
                        {
                            sighted = rocksCheck.OrderByDescending(c => c.Value).First();
                        }
                        else
                        {
                            sighted = rocksCheck.First();
                        }
                        TauntPos(sighted.Key.nodes [0], true, 2);
                    }
                }
            }
        }
        else
        {
            float vis  = 0;
            float dist = Vector3.Distance(target.myTrans.position, myPos);
            if (!ctrl.HasBuff(BuffIndex.stun))
            {
                if (dist <= alertPresenceDetectionRange)
                {
                    vis = 1;
                }
                if (vis < 0.2f)
                {
                    vis = SightCheck(target, Time.deltaTime) + 0.5f * HearCheck(target, Time.deltaTime);
                }
            }
            if (vis < 0.2f)
            {
                if (ctrl.target != null)
                {
                    ctrl.target = null;
                }
                if (!(ctrl.HasBuff(BuffIndex.blind) || ctrl.HasBuff(BuffIndex.stun)))
                {
                    if (vis > 0 && dist <= sightRange)
                    {
                        ctrl.MoveTo(target.myTrans.position);
                        lastTargetSpeed = ctrl.lastSpeed;
                    }
                    else
                    {
                        ctrl.MoveTo(ctrl.targetPos + lastTargetSpeed * Time.deltaTime);
                    }
                    if (searching < 5 && vis == 0)
                    {
                        if (ctrl.nma.path.corners.Length < 3)
                        {
                            LookAround();
                        }
                    }
                    else
                    {
                        LookTowards(myTrans.InverseTransformDirection(ctrl.targetPos - myPos));
                        if (Vector3.Dot(targetLookDir, Vector3.forward) < 0)
                        {
                            if (targetLookDir.x > 0)
                            {
                                LookTowards(Vector3.right);
                            }
                            else
                            {
                                LookTowards(Vector3.left);
                            }
                        }
                    }
                }
                targetTime -= Time.deltaTime * (1 + (0.2f - vis) * 5);
                if (targetTime <= 0)
                {
                    target = null;
                    if (ctrl.hasPath)
                    {
                        searching = 2;
                    }
                }
            }
            else
            {
                searching = 4;
                LookTowards(ctrl.targetPos - myPos, false);
                lastTargetSpeed = target.lastSpeed;
                targetTime      = Mathf.Clamp(targetTime + vis, 0, 5);
                if (ctrl.target == null)
                {
                    ctrl.MoveTo(target.myTrans);
                }
            }
        }
    }
Example #2
0
File: GuardAI.cs Project: R-N/Skid
    public float HearCheck(MyController c, float dt)
    {
        if (ctrl.HasBuff(BuffIndex.loudNoises) || ctrl.HasBuff(BuffIndex.stun))
        {
            return(0);
        }
        if (c.state == StateIndex.hidden)
        {
            return(0);
        }


        Vector3 tPos    = c.myTrans.position;
        Vector3 delta   = tPos - myPos;
        Vector3 v2Delta = delta.xz();
        float   v2Dist  = v2Delta.magnitude;

        if (v2Dist > farHearRange)
        {
            return(0);
        }
        Vector2 v2Dir = v2Delta / v2Dist;
        float   mul   = 0;
        bool    hear  = false;

        if (tPos != c.prevPos)
        {
            if (c.HasBuff(BuffIndex.water))
            {
                hear = true;
            }
            else if (c.state != 1 || (v2Dist <= nearHearRange && !ctrl.HasBuff(BuffIndex.hazy)))
            {
                hear = true;
            }
        }
        if (hear)
        {
            mul = 1 - hearRolloff(v2Dist);
        }
        else
        {
            return(0);
        }


        int hitCount = Physics.SphereCastNonAlloc(myPos, 1, delta.normalized, hits, delta.magnitude, mask, QueryTriggerInteraction.Collide);

        if (hitCount > 0)
        {
            for (int i = 0; i < hitCount; i++)
            {
                if (Obstacle.obstaclesByCollider.ContainsKey(hits [i].collider))
                {
                    Obstacle o = Obstacle.obstaclesByCollider [hits [i].collider];
                    if (c.state == 1)
                    {
                        mul *= o.hearMulCrouch;
                    }
                    else
                    {
                        mul *= o.hearMul;
                    }
                }
            }
        }
        if (c != target)
        {
            mul *= dt;
            if (onAlert)
            {
                mul *= 5;
            }
        }
        if (ctrl.HasBuff(BuffIndex.hazy))
        {
            mul *= 0.5f;
        }
        return(mul);
    }