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; } } }
void StartIdle(MeleeAttackStates previousState) { currentState = Attack.AttackStates.IDLE; if (previousState != MeleeAttackStates.ATTACKING) { idleTimer = timeToAwakeFromIdle; } }
public override void onEndAttack() { if (character is BasicEnemy) { currentMeleeState = MeleeAttackStates.IDLE; } base.onEndAttack(); }
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); }
//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); }
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); }
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; } }
void StartAttacking(MeleeAttackStates previousState) { currentState = Attack.AttackStates.ATTACKING; }
void LeaveSwitchingTails(MeleeAttackStates nextState) { }
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; } } } } } }
//following void StartFollowing(MeleeAttackStates previousState) { currentState = Attack.AttackStates.RUNNING; }