public static IEnumerator TakeAITurn() { foreach (var state in TileState.AllTiles() .Where(x => x.Friendliness == Friendliness.Hostile) .OrderBy(x => - x.playOrder)) { if (state.Friendliness == Friendliness.Hostile) { yield return(TakeTurn(state)); if (state.unit != UnitType.Fire && state.alerted) { yield return(new WaitForSeconds(0.6f)); } } } foreach (var state in TileState.AllTiles()) { if (state.fireIncoming) { state.unit = UnitType.Fire; state.alerted = true; if (!Generator.isRunning) { SFXController.PlayFire(); yield return(new WaitForSeconds(0.1f)); } } } yield return(YieldFast.Get); }
protected static IEnumerator DoBehavior(TileState state) { Selector.SelectEnemy(state); int range = GetInteractionRange(state.unit); var neighbors = state.position.Neighbors(maxDistance: range).Select(Board.ToState); state.alerted = false; switch (state.unit) { case UnitType.Bomb: yield return(DestroyController.Destroy(state)); break; case UnitType.Fire: foreach (var neighborState in neighbors) { if (!neighborState.fireIncoming && neighborState.unit != UnitType.Fire && neighborState.unit != UnitType.Hole) { yield return(DestroyController.Destroy(neighborState)); SFXController.PlayFire(); neighborState.fireIncoming = true; if (!Generator.isRunning) { yield return(new WaitForSeconds(0.05f)); } } } break; case UnitType.Fang: yield return(new WaitForSeconds(0.7f)); var enemies = neighbors.Where(x => x.Friendliness == Friendliness.Friendly) .OrderBy(x => - x.moveOrder * 1000 + x.playOrder); if (enemies.Any()) { var target = enemies.First(); SFXController.PlayFire(); if (target.unit != UnitType.Shield) { yield return(DestroyController.Destroy(enemies.First())); } else { yield return(DestroyController.Destroy(state)); } // TODO: strike animation yield return(new WaitForSeconds(0.6f)); } break; } Selector.DeselectEnemy(state); yield return(YieldFast.Get); }
public IEnumerator ExecuteMove(HexPosition target) { switch (unit) { case UnitType.Sword: SFXController.PlayMove(); Board.Get[target].unit = unit; Board.Get[target].alerted = false; unit = UnitType.Empty; alerted = false; AlertNeighbors(target); var directions = ((HexDirection[])Enum.GetValues(typeof(HexDirection))).Where(x => { var neighbor = position.Neighbor(x); return(neighbor.Equals(target)); }); yield return(new WaitForSeconds(0.3f)); if (directions.Any()) { var stabTile = Board.Get[target.Neighbor(directions.Single())]; if (stabTile.Friendliness != Friendliness.Neutral) { SFXController.PlayFire(); yield return(DestroyController.Destroy(stabTile)); yield return(new WaitForSeconds(0.3f)); } } break; case UnitType.Arrow: SFXController.PlayFire(); yield return(new WaitForSeconds(0.3f)); var direction = ((HexDirection[])Enum.GetValues(typeof(HexDirection))) .Where(x => position.Neighbors(x).Contains(target)) .Single(); var tile = Board.Get[position.Neighbor(direction)]; while (tile.position.IsInBounds && tile.Friendliness == Friendliness.Neutral) { tile = Board.Get[tile.position.Neighbor(direction)]; } if (tile.position.IsInBounds) { yield return(DestroyController.Destroy(tile)); } yield return(new WaitForSeconds(0.5f)); alerted = true; break; case UnitType.Shield: SFXController.PlayMove(); Board.Get[target].unit = unit; Board.Get[target].alerted = true; unit = UnitType.Empty; alerted = false; AlertNeighbors(target); yield return(new WaitForSeconds(0.3f)); break; } yield return(YieldFast.Get); }