Ejemplo n.º 1
0
 protected virtual void Signalling()
 {
     signalTimer -= Time.deltaTime;
     if (signalTimer <= 0f)
     {
         for (int i = 0; i < hive.childBots.Count; i++)
         {
             GatherBot sibling = hive.childBots[i];
             sibling.enemies = enemies;
             if (IsInCombat)
             {
                 sibling.SetState(AIState.Escaping);
             }
             else
             {
                 sibling.SetState(AIState.Attacking);
             }
             for (int j = 0; j < enemies.Count; j++)
             {
                 ICombat enemy = enemies[j];
                 enemy.EngageInCombat(sibling);
             }
         }
     }
 }
Ejemplo n.º 2
0
    public override bool TakeDamage(float damage, Vector2 damagePos,
                                    Entity destroyer, float dropModifier, bool flash)
    {
        bool dead = base.TakeDamage(damage, damagePos, destroyer, dropModifier, flash);

        if (dead)
        {
            return(true);
        }
        //cannot be hit by projectiles from self or siblings
        if (!IsSibling(destroyer) && destroyer != hive)
        {
            ICombat enemy = destroyer.GetICombat();
            if (flash)
            {
                colorReplacement?.Flash(0.5f, Color.white);
            }
            if (enemy != null)
            {
                if (enemy.EngageInCombat(this))
                {
                    AlertAll(enemy);
                }
            }
        }
        return(false);
    }
Ejemplo n.º 3
0
    public override bool TakeDamage(float damage, Vector2 damagePos,
                                    Entity destroyer, float dropModifier, bool flash)
    {
        bool dead = base.TakeDamage(damage, damagePos, destroyer, dropModifier, flash);

        if (dead)
        {
            return(true);
        }
        ICombat threat = destroyer.GetICombat();

        if (threat != null && threat.EngageInCombat(this))
        {
            EngageInCombat(threat);
        }
        return(false);
    }
Ejemplo n.º 4
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;
    }