void Start() { anim = GetComponent <Animator>(); var player = GameObject.FindGameObjectWithTag("Player"); if (this.tag == "Red") { tower = GameObject.FindGameObjectWithTag("BlueTeam"); enemy = GameObject.FindGameObjectWithTag("Blue"); } if (this.tag == "Blue") { tower = GameObject.FindGameObjectWithTag("RedTeam"); enemy = GameObject.FindGameObjectWithTag("Red"); } if (minionWay == 0) { point = GameObject.FindGameObjectWithTag("Minion_Bot"); } else if (minionWay == 1) { point = GameObject.FindGameObjectWithTag("Minion_Mid"); } else if (minionWay == 2) { point = GameObject.FindGameObjectWithTag("Minion_Top"); } target = point; if (player != null) { playerTr = player.GetComponent <Transform>(); } if (tower != null) { towerTr = tower.GetComponent <Transform>(); } if (enemy != null) { enemyTr = enemy.GetComponent <Transform>(); } targetTr = target.GetComponent <Transform>(); moveAgent = GetComponent <MinionMove>(); StartCoroutine(checkType()); StartCoroutine(Action()); }
bool TryMove(MinionMove moveState, Point moveTo) { if (!minions.ContainsKey(moveTo)) { minions.Remove(moveState.minion.position); minions[moveTo] = moveState.minion; moveState.minion.position = moveTo; return true; } return false; }
public void MoveEnemies(MinionAnimationSequence animation) { List<MinionMove> minionMoves = new List<MinionMove>(); HashSet<Minion> minionsStillMoving = new HashSet<Minion>(); MinionAnimationBatch stepBatch = animation.AddBatch(this, Game1.WALK_ANIM_DURATION); // enemies walk forward Point levelSize = levelScript.levelSize; for (int x = 0; x < levelSize.X; x++) //NB processing these in ascending X order - this matters { for (int y = levelSize.Y - 1; y >= 0; y--) { Minion m = getMinionAt(new Point(x, y)); if(m == null) continue; if(m.isEnemy && m.stats.move > 0) { HandleTriggers(new TriggerEvent(TriggerType.beforeMove, m)); Vector2 oldDrawPos = m.drawPos; if (m.stats.move == 1 && m.stats.hasKeyword(Keyword.slow) && !m.slow_movedHalfWay) { m.slow_movedHalfWay = true; stepBatch.AddAnimation(m, oldDrawPos, m.drawPos); } else { MinionMove mmove = new MinionMove(m); minionMoves.Add(mmove); minionsStillMoving.Add(m); } } } } CleanUp(animation); bool hasMoreMoves = true; bool firstPass = true; while(hasMoreMoves) { foreach (MinionMove mmove in minionMoves) { if (mmove.movesLeft <= 0) continue; if (levelScript.Blocks(mmove.moveTo, TargetType.empty)) { mmove.movesLeft = 0; mmove.moveSpent = true; minionsStillMoving.Remove(mmove.minion); } else if (minions.ContainsKey(mmove.moveTo) && !minionsStillMoving.Contains(getMinionAt(mmove.moveTo))) { // If I'm blocked: if (mmove.minion.stats.hasKeyword(Keyword.unstoppable) || getMinionAt(mmove.moveTo).stats.hasKeyword(Keyword.intangible)) { Destroyed(mmove.moveTo, mmove.minion); } mmove.moveSpent = true; } } CleanUp(animation); hasMoreMoves = false; foreach (MinionMove mmove in minionMoves) { if (mmove.movesLeft > 0) { if (TryMove(mmove, mmove.moveTo)) { mmove.moveSpent = true; mmove.minion.slow_movedHalfWay = false; stepBatch.AddAnimation(mmove.minion, mmove.currentAnimPos, mmove.minion.drawPos); mmove.currentAnimPos = mmove.minion.drawPos; } if (mmove.moveSpent) { mmove.movesLeft--; mmove.moveSpent = false; } if (mmove.movesLeft > 0) { hasMoreMoves = true; } else { minionsStillMoving.Remove(mmove.minion); } } } if (firstPass) { levelScript.Apply(this, stepBatch); firstPass = false; } stepBatch.SetInitialGameState(new GameState(this)); stepBatch = animation.AddBatch(this, Game1.WALK_ANIM_DURATION); } }