コード例 #1
0
    protected override AttackViability EvaluateScan(Scan sc)
    {
        AttackViability scanResult = base.EvaluateScan(sc);

        switch (scanResult)
        {
        case AttackViability.SignalForHelp:
            scanResult = AttackViability.Escape;
            break;
        }
        return(scanResult);
    }
コード例 #2
0
    protected virtual void Suspicious()
    {
        if (nearbySuspects.Count == 0)
        {
            SetState(AIState.Scanning);
            return;
        }
        targetEntity = (Entity)nearbySuspects[0];
        //if target is too far away then return to exploring
        if (targetEntity == null ||
            Vector2.Distance(targetEntity.transform.position, transform.position) > suspiciousChaseRange)
        {
            intenseScanTimer = 0f;
            nearbySuspects.RemoveAt(0);
            suspicionMeter.gameObject.SetActive(false);
            suspicionMeter.material.SetFloat("_ArcAngle", 0);
            return;
        }

        //follow entity
        GoToLocation(targetEntity.transform.position, true, intenseScanRange, true, targetEntity.transform.position);
        if (Vector2.Distance(transform.position, targetEntity.transform.position) <= intenseScanRange)
        {
            //scan entity if close enough
            intenseScanTimer += Time.deltaTime;

            //draw scanner particles
            if (!intenseScanner.isPlaying)
            {
                intenseScanner.Play();
            }
            float angle = -Vector2.SignedAngle(Vector2.up, targetEntity.transform.position - transform.position);
            intenseScanner.transform.eulerAngles = Vector3.forward * -angle;
            intenseScanner.transform.localScale  = Vector3.one *
                                                   Vector2.Distance(transform.position, targetEntity.transform.position);

            //draw suspicion meter
            suspicionMeter.gameObject.SetActive(true);
            suspicionMeter.material.SetFloat("_ArcAngle", intenseScanTimer / intenseScanDuration * 360f);

            //check if scan is complete
            if (intenseScanTimer >= intenseScanDuration)
            {
                intenseScanner.Stop();
                suspicionMeter.gameObject.SetActive(false);
                suspicionMeter.material.SetFloat("_ArcAngle", 0);
                //scan complete
                intenseScanTimer = 0f;
                //assess threat level and make a decision
                AttackViability threatLevel = EvaluateScan(targetEntity.ReturnScan());
                switch (threatLevel)
                {
                case AttackViability.AttackAlone:
                    ICombat enemy = targetEntity.GetICombat();
                    if (!(bool)enemy?.EngageInCombat(this))
                    {
                        break;
                    }
                    EngageInCombat(enemy);
                    SetState(AIState.Attacking);
                    break;

                case AttackViability.SignalForHelp:
                    enemy = targetEntity.GetICombat();
                    if (!(bool)enemy?.EngageInCombat(this))
                    {
                        break;
                    }
                    EngageInCombat(enemy);
                    SetState(AIState.Signalling);
                    break;

                case AttackViability.Escape:
                    hive?.MarkCoordAsEmpty(targetEntity.GetCoords());
                    scaryEntities.Add(targetEntity);
                    SetState(AIState.Exploring);
                    break;

                case AttackViability.Ignore:
                    unsuspiciousEntities.Add((Entity)nearbySuspects[0]);
                    nearbySuspects.RemoveAt(0);
                    break;
                }
            }
        }
        else
        {
            intenseScanner.Stop();
        }
        suspicionMeter.transform.position = (Vector2)transform.position + meterRelativePosition;
    }