public override void Act(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        darkling.isAttacking = false;
        darkling.isChasing   = false;
    }
    void ChargeAtTarget(DarklingAirEnemy darkling, Vector3 target)
    {
        //charge into destination
        darkling.MoveToward(target, darkling.movementSpeed * 3);

        //if encounter player, hit it
        if (darkling.target && darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeAttack))
        {
            //get Hittable component
            Hittable h;
            if (
                (h = darkling.target.GetComponent <Hittable>()) &&
                darkling.isAllowedToAttack)
            {
                //attack target
                Debug.Log("Darkling: hit");
                darkling.StartMeleeAttackAnimation();
                h.Hit(darkling.attackDamage, darkling.attackType);
                darkling.isAllowedToAttack = false;
            }
        }


        //when reach destination, ready for next attack
        if (darkling.isCloseEnoughToTarget(darkling.destination, 5))
        {
            darkling.hasDoneAttacking = true;
            darkling.isAttacking      = false;
        }
    }
示例#3
0
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling       = (DarklingAirEnemy)controller.enemy;
        bool             targetDetected = Scan(darkling);

        return(targetDetected);
    }
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling            = (DarklingAirEnemy)controller.enemy;
        bool             hasFoundDestination = !darkling.destinationPending;

        return(hasFoundDestination);
    }
    private void Attack(DarklingAirEnemy darkling)
    {
        //set destination to charge right in
        if (!darkling.isAttacking)
        {
            darkling.isAttacking       = true;
            darkling.isAllowedToAttack = true;
            darkling.hasDoneAttacking  = false;

            //set destination for darkling to charge right in
            //careful with null ref
            if (darkling.target != null)
            {
                darkling.transform.LookAt(darkling.target);

                //make the destination further back, so it feels like darkling cannot stop ==
                darkling.destination =
                    darkling.target.position + darkling.transform.forward.normalized * darkling.distanceRunAfterAttack;
            }
            else
            {
                darkling.destination = darkling.transform.position;
            }
        }

        ChargeAtTarget(darkling, darkling.destination);
    }
    public override void Act(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        darkling.isChasing           = false;
        darkling.isAllowedToTeleport = false;
    }
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        bool isTargetInZone = detectTarget(darkling);

        return(isTargetInZone);
    }
示例#8
0
    /*
     * Handle moving and teleport
     */
    private void Wander(DarklingAirEnemy darkling)
    {
        //teleport
        if (darkling.isAllowedToTeleport)
        {
            //reset time for next teleport
            darkling.flyTimeElapsed      = 0;
            darkling.isAllowedToTeleport = false;

            //teleport
            darkling.StartTeleAnimationStart();
            darkling.isTeleporting   = true;
            darkling.teleTimeElapsed = 0;
            return;
        }

        //because animation is slow compared with CPU
        if (darkling.isTeleporting && darkling.CheckIfTeleCountDownElapsed(darkling.timeBeforeAppear))
        {
            //darkling.darklingModel.SetActive(false);
            //darkling.darklingModel.SetActive(true);
            darkling.transform.position = darkling.destination;
            darkling.StartTeleAnimationStop();
            darkling.isTeleporting = false;
            GameObject g =
                Instantiate(darkling.teleParticles, darkling.transform.position, Quaternion.identity);
            Destroy(g, 3);
        }

        //if darkling is in disappear mode, don't make it move
        if (darkling.isTeleporting)
        {
            return;
        }

        //if too low, increase height
        //if (darkling.GetFlyHeightFromGround() < darkling.flyHeight)
        //{
        //    darkling.transform.position = darkling.transform.position + Vector3.up * darkling.movementSpeed * Time.deltaTime;
        //    darkling.destination =
        //}

        //else move toward destination
        darkling.MoveToward(darkling.destination, darkling.movementSpeed);



        //count down time for next teleport
        //ex: fly 4 seconds, then Teleport
        if (darkling.CheckIfFlyCountDownElapsed(darkling.timeBetweenTele))
        {
            darkling.isAllowedToTeleport = true;
        }
    }
示例#9
0
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;


        if (darkling.isCloseEnoughToTarget(darkling.startTransform.position, 1))
        {
            return(true);
        }
        return(false);
    }
示例#10
0
    private void GoBack(DarklingAirEnemy darkling)
    {
        darkling.MoveToward(darkling.startTransform.position, darkling.movementSpeed);

        //if close enough, snap darkling to target
        if (darkling.isCloseEnoughToTarget(darkling.startTransform.position, 3))
        {
            darkling.transform.position = darkling.startTransform.position;
            darkling.transform.rotation = darkling.startTransform.rotation;
        }
    }
    private bool detectTarget(DarklingAirEnemy darkling)
    {
        if (darkling.target == null)
        {
            return(false);
        }

        bool isTargetInZone = darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeZone);

        return(isTargetInZone);
    }
示例#12
0
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        bool attackAgain = false;

        if (darkling.target != null && darkling.hasDoneAttacking)
        {
            attackAgain = true;
        }

        return(attackAgain);
    }
示例#13
0
    private bool Scan(DarklingAirEnemy darkling)
    {
        if (darkling.target == null)
        {
            return(false);
        }

        //see if target is alive
        StatsController stats;

        if (stats = darkling.target.GetComponent <StatsController>())
        {
            if (stats.GetHealth() <= 0)
            {
                return(false);
            }
        }


        return(true);
    }
示例#14
0
    private void ScanDestination(DarklingAirEnemy darkling)
    {
        //set darkling state to scanning destination
        if (!darkling.destinationPending)
        {
            darkling.destinationPending = true;
        }

        //pick a new destination for darkling
        if (!darkling.nextDestinationDirectionPick)
        {
            Quaternion randomDirection = Quaternion.Euler(0, Random.Range(0, 360), 0);
            darkling.transform.rotation           = randomDirection;
            darkling.nextDestinationDirectionPick = true;
        }

        //see if that destination is safe
        RaycastHit hit; //use later

        //if there is sth in the way, rotate a bit
        Debug.DrawRay(darkling.eyes.position, darkling.eyes.forward.normalized * darkling.distanceFlyMin, Color.green);

        if (Physics.Raycast(darkling.eyes.position, darkling.eyes.forward, darkling.distanceFlyMin))
        {
            darkling.transform.Rotate(0, darkling.turningSpeed * Time.deltaTime, 0);
        }

        //if found a destination
        else
        {
            Vector3 nextDestination =
                darkling.transform.position + darkling.transform.forward * darkling.distanceFlyMin;

            darkling.destination                  = nextDestination;
            darkling.destinationPending           = false;
            darkling.nextDestinationDirectionPick = false;
        }
    }
示例#15
0
    public override void Act(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        ScanDestination(darkling);
    }
示例#16
0
    void Chase(DarklingAirEnemy darkling)
    {
        //if this is first time enter attack-mode
        if (!darkling.isChasing)
        {
            darkling.isChasing           = true;
            darkling.flyTimeElapsed      = 0; //reset time to target
            darkling.teleTimeElapsed     = 0;
            darkling.isAllowedToTeleport = false;
            darkling.isTeleporting       = false;
        }

        //careful with null refence
        if (darkling.target == null)
        {
            return;
        }

        //because animation is slow compared with CPU
        if (darkling.isTeleporting && darkling.CheckIfTeleCountDownElapsed(darkling.timeBeforeAppear))
        {
            darkling.transform.position = darkling.destination;
            darkling.StartTeleAnimationStop();
            darkling.isTeleporting       = false;
            darkling.isAllowedToTeleport = false;
            GameObject g =
                Instantiate(darkling.teleParticles, darkling.transform.position, Quaternion.identity);
            Destroy(g, 3);
        }

        //if darkling is in teleport mode, don't move or count time
        if (darkling.isTeleporting)
        {
            return;
        }

        //if darkling has fly long enough, allow it to teleport
        if (darkling.CheckIfFlyCountDownElapsed(darkling.timeBetweenTele))
        {
            darkling.isAllowedToTeleport = true;
        }

        //if not close enough, narrow down distance
        if (!darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeAttack))
        {
            //move toward target
            darkling.MoveToward(darkling.target.position, darkling.movementSpeed * 2); //make it fly faster

            //give target some seconds to run before teleport
            if (darkling.isAllowedToTeleport)
            {
                //basically fly to front of target
                darkling.transform.LookAt(darkling.target);

                Vector3 newPos =
                    darkling.target.position + (-1) * darkling.transform.forward.normalized * darkling.distanceMeleeAttack * 2;

                //use this way so that target have sometime is run
                //before darkling pop up
                darkling.StartTeleAnimationStart();
                darkling.destination     = newPos;
                darkling.isTeleporting   = true;
                darkling.teleTimeElapsed = 0;

                //reset fly countdown
                darkling.flyTimeElapsed = 0;
            }
            return;
        }
    }
    public override bool Decide(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        return(darkling.isNearDestination(darkling.destination));
    }
    public override void Act(EnemyStateController controller)
    {
        DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy;

        Attack(darkling);
    }