Exemplo n.º 1
0
    //Normal Update checks
    void CheckConditions()
    {
        //Fix!-------------
        if (!PetIsAttacking.initialBool)
        {
            EnemyLOS = EnemyIsInLOS.initialBool;             //Only updates if pet stops attacking
        }
        PetTransform.initialPos = transform.position;

        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            path.StopFollowPath();
            if (!AttackMode)
            {
                AttackMode = true;
            }
            else
            {
                AttackMode   = false;
                currentState = PetStatev2.Idle;
            }
        }

        if (FollowPath)
        {
            currentState = PetStatev2.PathFollow;
        }
        else
        {
            currentState = PetStatev2.Idle;             //CHECK IF THIS WORKS WHILE ATTACKING AN ENEMY
        }
    }
Exemplo n.º 2
0
    //When a path can't be created to the enemy...
    private IEnumerator CantReachEnemyDelay()
    {
        CanReachEnemy = false;
        currentState  = PetStatev2.Wait;
        //Debug.Log("Entered wait state");
        yield return(CustomTimer.Timer(.75f));

        currentState = PetStatev2.Idle;
    }
Exemplo n.º 3
0
    //Hitstun coroutine
    public IEnumerator HitstunCo()
    {
        PetStatev2 lastState = currentState;

        currentState = PetStatev2.Hitstun;
        yield return(CustomTimer.Timer(.075f));

        currentState = lastState;
    }
Exemplo n.º 4
0
 void ResetAttack()
 {
     CanAttackDelay    = true;
     JumpMomentum      = 0;
     JumpMomentumScale = 0;
     currentState      = PetStatev2.EnemyFollow;
     Attacking         = false;
     CanSetRandPos     = true;
 }
Exemplo n.º 5
0
 //Health
 void CheckHealth()
 {
     Health.initialValue = CurrentHealth;
     if (CurrentHealth <= 0)
     {
         currentState = PetStatev2.Dead;
         Debug.Log("Pet has died");
     }
 }
Exemplo n.º 6
0
 void Start()
 {
     currentState = PetStatev2.Idle;
     TargetTransform.initialPos = PlayerTransform.initialPos;
     CanFollowPath.initialBool  = true;
     PetIsAttacking.initialBool = false;
     EnemyIsInLOS.initialBool   = false;
     Attacking = false;
     PetTransform.initialPos = transform.position;
     CanAttackDelay          = true;
     CanSetRandPos           = true;
 }
Exemplo n.º 7
0
 void Start()
 {
     currentState = PetStatev2.Idle;
     TargetTransform.initialPos = PlayerTransform.initialPos;
     CanFollowPath.initialBool  = true;
     PetIsAttacking.initialBool = false;
     EnemyIsInLOS.initialBool   = false;
     Attacking = false;
     PetTransform.initialPos = transform.position;
     CanAttackDelay          = true;
     CanSetRandPos           = true;
     controller  = gameObject.GetComponent <CharacterController>();
     petCollider = gameObject.GetComponent <Collider>();
 }
Exemplo n.º 8
0
    private IEnumerator AttackEnemy()
    {
        Attacking    = true;
        currentState = PetStatev2.AttackAnticipation;
        yield return(CustomTimer.Timer(.3f)); //Leap forward

        PetAnim.SetAttack(true);              //Temp anim
        difference   = enemyPos.initialPos - transform.position;
        currentState = PetStatev2.AttackJump;
        yield return(CustomTimer.Timer(.5f));        //Leap back

        currentState = PetStatev2.AttackJumpBack;
        PetAnim.SetAttack(false);         //Temp anim
        JumpMomentum      = 0;
        JumpMomentumScale = 0;
        yield return(CustomTimer.Timer(1f));

        ResetAttack();
    }
Exemplo n.º 9
0
    private IEnumerator IdleWaitTime()     //*Fix this to only run once
    {
        yield return(new WaitForSeconds(.75f));

        currentState = PetStatev2.Walk;
    }
Exemplo n.º 10
0
    //Distance and state checking
    void CheckDistance()
    {
        //If pet is too far, teleport
        float WarpRadius = 18f;

        if (Vector3.Distance(PlayerTransform.initialPos, transform.position) > WarpRadius)
        {
            OutOfRange();
        }

        //Fix!-------------
        if (AttackMode && EnemyExists.initialBool && EnemyLOS && CanReachEnemy && EnemyIsInRadius)         //If attackmode is enabled and an enemy target exists...
        {
            //Attack check
            TargetTransform.initialPos = enemyPos.initialPos;
            PetIsAttacking.initialBool = true;

            float AttackRadius     = 2f;
            float RepositionRadius = 1.75f;
            float PlayerRadius     = 4f;
            if (!Attacking)
            {
                if (Vector3.Distance(enemyPos.initialPos, transform.position) <= AttackRadius &&
                    Vector3.Distance(enemyPos.initialPos, transform.position) > RepositionRadius)
                {
                    AttackCoroutine = StartCoroutine(AttackEnemy());
                    //Debug.Log("Attack");
                }
                else
                {
                    if (Vector3.Distance(enemyPos.initialPos, transform.position) <= RepositionRadius)
                    {
                        if (CanSetRandPos)
                        {
                            CanSetRandPos = false;
                            currentState  = PetStatev2.EnemyRepos;                            //Runs once from here
                            if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= PlayerRadius)
                            {
                                randX = UnityEngine.Random.Range(-1, 1);                                 //Avoid .net conflict by using UnityEngine
                                randY = UnityEngine.Random.Range(-1, 1);
                                if (randX == 0)
                                {
                                    randX = 1f;
                                }
                                if (randY == 0)
                                {
                                    randY = 1f;
                                }
                                RepositionDir = new Vector3(transform.position.x + randX, transform.position.y + randY);
                            }
                            else
                            {
                                RepositionDir = PlayerTransform.initialPos;                                 //Reposition towards the player
                            }
                        }
                        else
                        {
                            //Do nothing until an attack
                        }

                        if (CanAttackDelay)                         //Keeping for now
                        {
                            CanAttackDelay = false;
                            AttackDelay    = StartCoroutine(AttackEnemyDelay());
                        }
                    }
                    else
                    {
                        currentState  = PetStatev2.EnemyFollow;
                        RepositionDir = enemyPos.initialPos;                         //Enemy
                    }
                }
            }
            else
            {
                if (AttackDelay != null)
                {
                    StopCoroutine(AttackDelay);
                }
            }
        }
        else                //FOLLOW PLAYER CHECKS
        {
            if (!Attacking) //Lets the attack finish before switching back
            {
                TargetTransform.initialPos = PlayerTransform.initialPos;
                PetIsAttacking.initialBool = false;
                if (AttackCoroutine != null)
                {
                    ResetAttack();
                    StopCoroutine(AttackCoroutine);
                }

                if (AttackDelay != null)
                {
                    StopCoroutine(AttackDelay);
                }

                if (!FollowPath)
                {
                    float ChaseRadius = 18f;
                    float WalkRadius  = 3f;
                    float StopRadius  = 2.5f;
                    if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= ChaseRadius &&
                        Vector3.Distance(PlayerTransform.initialPos, transform.position) > WalkRadius)
                    {
                        currentState = PetStatev2.Run;
                    }

                    if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= WalkRadius &&
                        Vector3.Distance(PlayerTransform.initialPos, transform.position) > StopRadius)
                    {
                        if (currentState == PetStatev2.Idle)
                        {
                            StartCoroutine(IdleWaitTime());                             //Wait a bit before walking
                        }
                        else
                        {
                            currentState = PetStatev2.Walk;
                        }
                    }

                    if (Vector3.Distance(PlayerTransform.initialPos, transform.position) <= StopRadius)
                    {
                        currentState = PetStatev2.Idle;
                    }
                }
            }
        }

        //How far the pet can keep attacking before returning to the player
        float DetectionRadiusX = 10f;
        float DetectionRadiusY = 6f;

        if (Mathf.Abs(enemyPos.initialPos.x - PlayerTransform.initialPos.x) <= DetectionRadiusX &&
            Mathf.Abs(enemyPos.initialPos.y - PlayerTransform.initialPos.y) <= DetectionRadiusY)
        {
            EnemyIsInRadius = true;
        }
        else
        {
            //Debug.Log("Not within radius");
            EnemyIsInRadius = false;
        }
    }