示例#1
0
    void UpdateSwitchingTails()
    {
        if (character is BasicEnemy)
        {
            swCurrentTime += Time.deltaTime;
            swCurrentTime  = Mathf.Min(swCurrentTime, swTotalTime);

            Vector3 newPos = CuadraticBezierPoint(swCurrentTime / swTotalTime, swp0, swp1, swp2) - character.getFeet().transform.localPosition;

            float dx = newPos.x - character.transform.position.x;

            SoulAvenger.Character.FACING facing = (dx <= 0.0f)?SoulAvenger.Character.FACING.LEFT:SoulAvenger.Character.FACING.RIGHT;

            if (character.currentFacing != facing)
            {
                character.currentFacing = facing;
            }

            newPos.z = character.transform.position.z;

            character.transform.position = newPos;

            if (swCurrentTime >= swTotalTime)
            {
                currentMeleeState = MeleeAttackStates.IDLE;
            }

            Hero hero = character.currentTarget as Hero;

            if (hero.isMoving() && Vector3.Distance(hero.transform.position, swHeroPos) > 0.2f)
            {
                currentMeleeState = MeleeAttackStates.IDLE;
            }
        }
    }
示例#2
0
 void StartIdle(MeleeAttackStates previousState)
 {
     currentState = Attack.AttackStates.IDLE;
     if (previousState != MeleeAttackStates.ATTACKING)
     {
         idleTimer = timeToAwakeFromIdle;
     }
 }
示例#3
0
 public override void onEndAttack()
 {
     if (character is BasicEnemy)
     {
         currentMeleeState = MeleeAttackStates.IDLE;
     }
     base.onEndAttack();
 }
示例#4
0
 bool tryToSwapTail()
 {
     if (!character.currentTarget.isFirstInTail(character) && character.currentTarget.otherTailIsEmpty(character) && character.getSpeed() > 0.0f)
     {
         character.currentTarget.swapTail(character);
         currentMeleeState = MeleeAttackStates.SWITCHING_TAILS;
         return(true);
     }
     return(false);
 }
示例#5
0
    //attacking
    bool tryToAttack()
    {
        if (rechargeTimer <= 0.0f && currentMeleeState != MeleeAttackStates.ATTACKING)
        {
            float dx = character.currentTarget.getFeetPosition().x - character.getFeetPosition().x;

            SoulAvenger.Character.FACING facing = (dx <= 0.0f)?SoulAvenger.Character.FACING.LEFT:SoulAvenger.Character.FACING.RIGHT;

            if (character.currentFacing != facing)
            {
                character.currentFacing = facing;
            }

            currentMeleeState = MeleeAttackStates.ATTACKING;
            return(true);
        }
        return(false);
    }
示例#6
0
    bool tryToFollowTail()
    {
        if (isInTailPosition(character.currentTarget as Hero, character as BasicEnemy))
        {
            return(false);
        }

        if (!character.currentTarget.isMoving())
        {
            currentMeleeState = MeleeAttackStates.FOLLOWING_TAIL;
            return(true);
        }
        else
        {
            if (!characterIsGettingCloseTo(character.currentTarget, character))
            {
                currentMeleeState = MeleeAttackStates.FOLLOWING_TAIL;
                return(true);
            }
        }

        return(false);
    }
示例#7
0
    void StartSwitchingTails(MeleeAttackStates previousState)
    {
        if (character is BasicEnemy)
        {
            float v = (Random.Range(0, 2) == 0)?-1.0f:1.0f;
            swAxis = new Vector3(0, v, 0);

            BasicEnemy enemy = character as BasicEnemy;
            Hero       hero  = character.currentTarget as Hero;

            swp0      = enemy.getFeetPosition();
            swp2      = hero.getPosInTail(enemy) - Vector3.down * 0.01f;
            swp1      = hero.getFeetPosition() + swAxis;
            swHeroPos = hero.transform.position;

            float curveLen = arcLengthByIntegral(swp0, swp1, swp2);
            float speed    = 2 * enemy.getSpeed();
            swTotalTime   = curveLen / speed;
            swCurrentTime = 0.0f;

            currentState = Attack.AttackStates.RUNNING;
        }
    }
示例#8
0
 void StartAttacking(MeleeAttackStates previousState)
 {
     currentState = Attack.AttackStates.ATTACKING;
 }
示例#9
0
 void LeaveSwitchingTails(MeleeAttackStates nextState)
 {
 }
示例#10
0
    void UpdateFollowing()
    {
        if (character is BasicEnemy)
        {
            BasicEnemy enemy  = character as BasicEnemy;
            Hero       hero   = character.currentTarget as Hero;
            float      speed  = character.getSpeed();
            Vector3    myTail = hero.getPosInTail(enemy);

            if (!isInTailPosition(hero, enemy))
            {
                Vector3 eFeet = enemy.getFeetPosition();
                Vector3 hFeet = hero.getFeetPosition();

                if (hero.otherTailIsEmpty(enemy))
                {
                    if (!hero.isFirstInTail(enemy))
                    {
                        //try to swap tail if able
                        float myDiffX   = Mathf.Abs(hFeet.x - eFeet.x);
                        float tailDiffX = Mathf.Abs(myTail.x - eFeet.x);

                        if (tailDiffX > myDiffX)
                        {
                            hero.swapTail(enemy);
                            myTail = hero.getPosInTail(enemy);
                        }
                    }
                    else if (hero.getMyTailDistance(enemy) > hero.getOtherTailDistance(enemy))
                    {
                        hero.swapTail(enemy);
                        myTail = hero.getPosInTail(enemy);
                    }
                }
                else if (hero.currentTarget == character && !hero.isFirstInTail(character))
                {
                    hero.moveToTailTip(character);
                    myTail = hero.getPosInTail(enemy);
                }

                float distanceToTail = Vector3.Distance(eFeet, myTail);

                if (distanceToTail < tailTolerance || (canAttackByContact && IsInAttackRange()))
                {
                    if (!(canAttackHero() && tryToAttack()))
                    {
                        currentMeleeState = MeleeAttackStates.IDLE;
                    }
                }
                else
                {
                    //move to the tail's position
                    enemy.moveToTarget(myTail, speed, false);
                }
            }
            else
            {
                if (hero.isFirstInTail(enemy))
                {
                    if (!(canAttackHero() && tryToAttack()))
                    {
                        currentMeleeState = MeleeAttackStates.IDLE;
                    }
                }
                else
                {
                    if (hero.otherTailIsEmpty(enemy))
                    {
                        hero.swapTail(enemy);
                        currentMeleeState = MeleeAttackStates.SWITCHING_TAILS;
                    }
                    else
                    {
                        if (!(canAttackHero() && tryToAttack()))
                        {
                            currentMeleeState = MeleeAttackStates.IDLE;
                        }
                    }
                }
            }
        }
    }
示例#11
0
 //following
 void StartFollowing(MeleeAttackStates previousState)
 {
     currentState = Attack.AttackStates.RUNNING;
 }