public IEnumerable <HexPosition> PossibleMoves() { switch (unit) { case UnitType.Sword: foreach (var option in position.Neighbors()) { if (Board.Get[option].unit == UnitType.Empty) { yield return(option); } } break; case UnitType.Arrow: foreach (var direction in ((HexDirection[])Enum.GetValues(typeof(HexDirection)))) { foreach (var tile in position.Neighbors(direction)) { yield return(tile); } } break; case UnitType.Shield: foreach (var direction in ((HexDirection[])Enum.GetValues(typeof(HexDirection)))) { var neighborPosition = position.Neighbor(direction); if (Board.Get[neighborPosition].Friendliness == Friendliness.Friendly) { var leapPosition = neighborPosition.Neighbor(direction); if (leapPosition.IsInBounds && Board.Get[leapPosition].unit == UnitType.Empty) { yield return(leapPosition); } } } break; } }
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); }