Esempio n. 1
0
    public void ShowUpdate(StatusUpdateType type, string stat, Color color)
    {
        toMove.gameObject.SetActive(true);

        time = 0;

        DragonStatus ds = toMove.gameObject.GetComponent <DragonStatus>();

        if (ds != null)
        {
            ds.UpdateStatus(stat);
            ds.UpdateStatus(color);
        }

        if (type == StatusUpdateType.HEALTH)
        {
            toMove.Find("HeartUpdate")?.gameObject.SetActive(true);
            toMove.Find("StarUpdate")?.gameObject.SetActive(false);
            toMove.Find("SwordUpdate")?.gameObject.SetActive(false);
        }
        else if (type == StatusUpdateType.STAR)
        {
            toMove.Find("HeartUpdate")?.gameObject.SetActive(false);
            toMove.Find("StarUpdate")?.gameObject.SetActive(true);
            toMove.Find("SwordUpdate")?.gameObject.SetActive(false);
        }
        else if (type == StatusUpdateType.ATTACK)
        {
            toMove.Find("HeartUpdate")?.gameObject.SetActive(false);
            toMove.Find("StarUpdate")?.gameObject.SetActive(false);
            toMove.Find("SwordUpdate")?.gameObject.SetActive(true);
        }
    }
Esempio n. 2
0
 public void headHurt()
 {
     if (dragonStatus == DragonStatus.DOWN || dragonStatus == DragonStatus.FLY_UP || dragonStatus == DragonStatus.SLEEP)
     {
         return;
     }
     hp--;
     startStatusTime = System.DateTime.Now;
     dragonAnimator.SetBool("Die", true);
     dragonAnimator.SetBool("Run", false);
     dragonAnimator.SetBool("Fly", false);
     dragonAnimator.SetBool("Attack1", false);
     dragonAnimator.SetBool("Attack2", false);
     dragonController.m_headLook.weight = 0f;
     dragonStatus = DragonStatus.DOWN;
     if (hp == 2)
     {
         firstBroken();
     }
     else if (hp == 1)
     {
         secondBroken();
     }
     else if (hp <= 0)
     {
         dragonSound.playDie();
         player.win();
         dragonStatus = DragonStatus.DIE;
     }
 }
Esempio n. 3
0
    void handleAttack()
    {
        switch (dragonStatus)
        {
        case DragonStatus.ATTACK_FIRE:
        {
            moveCircle();
            player.attackByFire();
            if ((System.DateTime.Now - startStatusTime).TotalSeconds < 5)
            {
                break;
            }
            dragonController.m_headLook.weight = 0.6f;
            dragonController.m_fireIntensity   = 0;
            dragonSound.stopFire();
            dragonStatus = DragonStatus.FLY_CIRCLE;
        }
        break;

        case DragonStatus.ATTACK_NEAR:
        {
            Vector3    targetDirection = (playerTransform.position - transform.position).normalized;
            Quaternion direction       = Quaternion.identity;
            targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90;
            moveRotationToTarget();
            switch (attackStatus)
            {
            case AttackStatus.FLY_DOWN:
            {
                movePositionToTarget();
                if (transform.position.y < 0.2f)
                {
                    nearAttackCount = 0;
                    dragonAnimator.SetBool("Fly", false);
                    dragonController.m_headLook.weight = 0.6f;
                    attackStatus = AttackStatus.READY;
                }
            }
            break;

            case AttackStatus.READY:
            {
                if (nearAttackCount >= 3)
                {
                    if (nearAttackCount >= 5 || Random.Range(0, 2) == 0)
                    {
                        dragonAnimator.SetBool("Fly", true);
                        updateStartCirclePoint();
                        moveSpeedFactor = 0.5f;
                        dragonAnimator.SetBool("Attack1", false);
                        dragonAnimator.SetBool("Attack2", false);
                        dragonController.m_headLook.weight = 0f;
                        dragonStatus = DragonStatus.FLY_UP;
                        return;
                    }
                }
                int attackWay = Random.Range(0, 2);
                switch (attackWay)
                {
                case 0:
                    dragonAnimator.SetBool("Attack1", true);
                    break;

                case 1:
                    dragonAnimator.SetBool("Attack2", true);
                    break;
                }
                nearAttackCount++;
                animationStart = false;
                attackStatus   = AttackStatus.ATTACKING;
            }
            break;

            case AttackStatus.ATTACKING:
            {
                if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Attack_1"))
                {
                    animationStart = true;
                    dragonAnimator.SetBool("Attack1", false);
                }
                else if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Attack_2"))
                {
                    animationStart = true;
                    dragonAnimator.SetBool("Attack2", false);
                }
                else if (animationStart && dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Idle_1"))
                {
                    animationStart = false;
                    attackStatus   = AttackStatus.READY;
                }
            }
            break;
            }
        }
        break;

        case DragonStatus.ATTACK_TRAIN:
        {
            switch (attackStatus)
            {
            case AttackStatus.FLY_DOWN:
            {
                bool stillMoving = false;
                if (transform.position.y > 0)
                {
                    movePositionToTarget();
                    stillMoving = true;
                }
                if (!checkRotateFinish())
                {
                    moveRotationToTarget();
                    stillMoving = true;
                }
                if (!stillMoving)
                {
                    animationStart = false;
                    dragonAnimator.SetBool("Fly", false);
                    dragonAnimator.SetBool("Taunt", true);
                    dragonController.m_headLook.weight = 1f;
                    attackStatus = AttackStatus.TAUNT;
                }
            }
            break;

            case AttackStatus.TAUNT:
            {
                if (dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Taunt1"))
                {
                    animationStart = true;
                    dragonAnimator.SetBool("Taunt", false);
                }
                else if (animationStart && dragonAnimator.GetNextAnimatorStateInfo(0).IsName("Idle_1"))
                {
                    animationStart = false;
                    dragonAnimator.SetBool("Run", true);
                    attackStatus = AttackStatus.ATTACKING;
                }
            }
            break;

            case AttackStatus.ATTACKING:
            {
                if (Vector3.Distance(transform.position, playerTransform.position) < 35 || Vector3.Distance(transform.position, playerTransform.position) > 100)
                {
                    dragonController.m_headLook.weight = 0f;
                    attackStatus = AttackStatus.ATTACK_FINISH;
                }
            }
            break;

            case AttackStatus.ATTACK_FINISH:
            {
                // fly up when the overshot distance is larger than the fly radius
                float distance = Vector3.Distance(transform.position, playerTransform.position);
                if (distance > flyRadius)
                {
                    dragonAnimator.SetBool("Run", false);
                    dragonAnimator.SetBool("Fly", true);
                    updateStartCirclePoint();
                    dragonController.m_headLook.weight = 0f;
                    moveSpeedFactor = 0.5f;
                    dragonStatus    = DragonStatus.FLY_UP;
                }
            }
            break;
            }
            break;
        }

        case DragonStatus.ATTACK_FLY:
        {
            switch (attackStatus)
            {
            case AttackStatus.FLY_DOWN:
            {
                targetPosition   = playerTransform.position;
                targetPosition.y = 3;
                moveRotationToTarget();
                if (checkRotateFinish())
                {
                    moveSpeedFactor = 2.2f;
                    dragonAnimator.SetBool("Fly_plane", true);
                    attackStatus = AttackStatus.ATTACKING;
                }
            }
            break;

            case AttackStatus.ATTACKING:
            {
                movePositionToTarget();
                if (transform.position.y < 6)
                {
                    moveSpeedFactor = 1f;
                    dragonAnimator.SetBool("Fly_plane", false);
                    updateStartCirclePoint();
                    dragonController.m_headLook.weight = 0f;
                    dragonStatus = DragonStatus.FLY_UP;
                    player.attackByFly();
                }
            }
            break;
            }
        }
        break;
        }
    }
Esempio n. 4
0
    void Update()
    {
        // Scale the size of dragon depends on distance between Dragon and player.
        float distance = Vector3.Distance(playerTransform.position, transform.position);
        float factor   = 1f + 0.5f * distance / flyRadius;

        transform.localScale = factor * defaultScaled;

        if (dragonStatus == DragonStatus.SLEEP || dragonStatus == DragonStatus.DIE)
        {
            dustStorm.enableEmission = false;
        }
        else
        {
            // play dust storm effect when dragon is near to the ground.
            dustStorm.enableEmission = transform.position.y <= 50 ? true : false;
        }

        switch (dragonStatus)
        {
        case DragonStatus.SLEEP:
        {
            //TODO: tune sleep time
            if ((System.DateTime.Now - startStatusTime).TotalSeconds < 1)
            {
                Debug.Log("Exepction: time is less than start status");
                break;
            }
            if ((System.DateTime.Now - startStatusTime).TotalSeconds > 5)
            {
                dragonAnimator.SetBool("Sleep", false);
            }
            if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Idle_1"))
            {
                dragonAnimator.SetBool("Taunt", true);
                dragonController.m_headLook.weight = 1f;
                dragonStatus = DragonStatus.TAUNT;
            }
        }
        break;

        case DragonStatus.TAUNT:
        {
            if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Taunt1"))
            {
                animationStart = true;
                dragonAnimator.SetBool("Taunt", false);
            }
            else if (animationStart && dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Idle_1"))
            {
                animationStart  = false;
                moveSpeedFactor = 0.5f;
                updateStartCirclePoint();
                dragonAnimator.SetBool("Fly", true);
                dragonController.m_headLook.weight = 0.0f;
                dragonStatus = DragonStatus.FLY_UP;
            }
        }
        break;

        case DragonStatus.FLY_UP:
        {
            if (dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Fly_1") ||
                dragonAnimator.GetCurrentAnimatorStateInfo(0).IsName("Fly_3"))
            {
                movePositionToTarget();
            }
            if (checkRotateFinish() && Mathf.Abs(transform.position.y - targetPosition.y) < 0.5f)
            {
                moveSpeedFactor = 0.25f;
                startStatusTime = System.DateTime.Now;
                dragonController.m_headLook.weight = 0.6f;
                dragonStatus = DragonStatus.FLY_CIRCLE;
            }
            else if (Mathf.Abs(transform.position.y - targetPosition.y) < 1f)
            {
                moveRotationToTarget();
            }
        }
        break;

        case DragonStatus.FLY_CIRCLE:
        {
            moveCircle();
            int circleSec = (int)(System.DateTime.Now - startStatusTime).TotalSeconds;
            if (circleSec <= 5)
            {
                return;
            }
            int startAttackRandom = Random.Range(0, circleSec - 5);
            if (startAttackRandom == 0)
            {
                return;
            }
            startAttack();
        }
        break;

        case DragonStatus.ATTACK_FIRE:
        case DragonStatus.ATTACK_NEAR:
        case DragonStatus.ATTACK_FLY:
        case DragonStatus.ATTACK_TRAIN:
        {
            handleAttack();
        }
        break;

        case DragonStatus.DOWN:
        {
            if (hp <= 0)
            {
                return;
            }
            if ((System.DateTime.Now - startStatusTime).TotalSeconds > 5)
            {
                dragonAnimator.SetBool("Die", false);
                moveSpeedFactor = 0.5f;
                updateStartCirclePoint();
                dragonAnimator.SetBool("Fly", true);
                dragonController.m_headLook.weight = 0f;
                dragonStatus = DragonStatus.FLY_UP;
            }
        }
        break;

        case DragonStatus.DIE:
        {
            // TODO play wining BGM and do some wining animation.
            dragonController.m_closeEyes = eyesClosePercent;
            dragonController.m_blinkRate = 0f;
            if (eyesClosePercent < 1f)
            {
                eyesClosePercent += 0.008f;
            }
        }
        break;
        }
    }
Esempio n. 5
0
    void startAttack()
    {
        int nextAttackWay = Random.Range(0, 4);

        if (nextAttack >= 0 && nextAttack < 4)
        {
            nextAttackWay = nextAttack;
        }
        switch (nextAttackWay)
        {
        case 0:
        {
            //Fire
            startStatusTime = System.DateTime.Now;
            dragonController.m_headLook.weight = 1;
            dragonController.m_fireIntensity   = 1;
            dragonSound.startFire();
            dragonStatus = DragonStatus.ATTACK_FIRE;
        }
        break;

        case 1:
        {
            // near
            moveSpeedFactor = 1f;
            Vector3 diff = playerTransform.position - transform.position;
            diff.Normalize();
            targetPosition   = playerTransform.position - diff * 55;
            targetPosition.y = 0;
            Vector3    targetDirection = (playerTransform.position - transform.position).normalized;
            Quaternion direction       = Quaternion.identity;
            targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90;
            dragonController.m_headLook.weight = 1f;
            dragonStatus = DragonStatus.ATTACK_NEAR;
            attackStatus = AttackStatus.FLY_DOWN;
        }
        break;

        case 2:
        {
            // Fly attack
            targetPosition = playerTransform.position;
            Vector3    targetDirection = (playerTransform.position - transform.position).normalized;
            Quaternion direction       = Quaternion.identity;
            targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90;
            dragonStatus   = DragonStatus.ATTACK_FLY;
            attackStatus   = AttackStatus.FLY_DOWN;
        }
        break;

        case 3:
        {
            // train
            targetPosition   = transform.position;
            targetPosition.y = 0;
            Vector3    targetDirection = (playerTransform.position - transform.position).normalized;
            Quaternion direction       = Quaternion.identity;
            targetRotation = -Mathf.Atan2(targetDirection.z, targetDirection.x) * Mathf.Rad2Deg + 90;
            dragonController.m_headLook.weight = 0.2f;
            dragonStatus = DragonStatus.ATTACK_TRAIN;
            attackStatus = AttackStatus.FLY_DOWN;
        }
        break;
        }
    }