private async Task PreviewBoard(TaflConfiguration taflConfiguration) { TaflConfiguration = taflConfiguration; Board = new TaflBoard(taflConfiguration, this); _background = DrawBoard(); _boardIndex = DrawBoardIndex(); var board = Draw(); await _ch.SendFileAsync(board, $"Now previewing {taflConfiguration.Name}.").ConfigureAwait(false); }
internal TaflBoard(TaflConfiguration taflConfiguration, TaflService parent) { _parent = parent; Size = taflConfiguration.Size; WinOnCorner = taflConfiguration.WinOnCorner; StrongKing = taflConfiguration.StrongKing; Tiles = new List <List <Tile> >(); for (var i = 0; i < Size; ++i) { var row = new List <Tile>(); for (var j = 0; j < Size; ++j) { row.Add(new Tile()); } Tiles.Add(row); } Tiles[Size / 2][Size / 2].Restricted = true; Tiles[Size / 2][Size / 2].Piece = Piece.King; KingPosition = new Point(Size / 2, Size / 2); if (taflConfiguration.CornerRestricted) { Tiles[0][0].Restricted = true; Tiles[0][Size - 1].Restricted = true; Tiles[Size - 1][0].Restricted = true; Tiles[Size - 1][Size - 1].Restricted = true; } var blackPositions = taflConfiguration.BlackPositions; foreach (var blackPosition in blackPositions) { Tiles[blackPosition.Y][blackPosition.X].Piece = Piece.Black; } var whitePositions = taflConfiguration.WhitePositions; foreach (var whitePosition in whitePositions) { Tiles[whitePosition.Y][whitePosition.X].Piece = Piece.White; } }
public void Start() { Task.Run(async() => { var interactivity = _client.GetInteractivity(); TaflConfiguration = await PickBoard().ConfigureAwait(false); Board = new TaflBoard(TaflConfiguration, this); _background = DrawBoard(); _boardIndex = DrawBoardIndex(); var board = Draw(); await _ch.SendFileAsync(board, $"Tafl game has started!").ConfigureAwait(false); var startMsg = $"{_blackPlayer.DisplayName}(Black) goes first!\n"; startMsg += $"Type 'help' for help, or 'quit' to quit game.\n"; startMsg += $"For detailed rules, click here: <http://aagenielsen.dk/tafl_rules.php>"; await _ch.SendMessageAsync(startMsg).ConfigureAwait(false); CurrentPlayer = Piece.Black; var curPlayer = _blackPlayer; while (true) { var afk = false; var isMove = false; while (!isMove) { var response = await interactivity.WaitForMessageAsync(x => x.Author.Id == curPlayer.Id && x.ChannelId == _ch.Id).ConfigureAwait(false); if (response.TimedOut) { await _ch.SendMessageAsync($"This channel will be deleted soon unless there is activity.").ConfigureAwait(false); if (afk) { await Dispose().ConfigureAwait(false); } afk = true; continue; } isMove = await TryMove(response.Result.Content.ToLower()).ConfigureAwait(false); afk = false; } board = Draw(); await _ch.SendFileAsync(board).ConfigureAwait(false); var color = CurrentPlayer == Piece.Black ? "Black" : "White"; if (Board.HasWin()) { await _ch.SendMessageAsync($"{curPlayer.DisplayName}({color}) has won the game!").ConfigureAwait(false); break; } if (CurrentPlayer == Piece.Black) { CurrentPlayer = Piece.White; curPlayer = _whitePlayer; color = "White"; } else { CurrentPlayer = Piece.Black; curPlayer = _blackPlayer; color = "Black"; } await _ch.SendMessageAsync($"{curPlayer.DisplayName}({color})'s turn to move!").ConfigureAwait(false); } await Dispose().ConfigureAwait(false); }); }
private async Task <TaflConfiguration> PickBoard() { var json = string.Empty; using (var fs = File.OpenRead(Path.Combine(AppContext.BaseDirectory, "Data/Fun/taflConfig.json"))) { using (var sr = new StreamReader(fs, new UTF8Encoding(false))) { json = sr.ReadToEnd(); } } var configurations = JObject.Parse(json); var configurationsList = configurations["configurations"].ToString(); JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = new List <JsonConverter> { new PointConverter() } }; var taflConfigurations = JsonConvert.DeserializeObject <List <TaflConfiguration> >(configurationsList); var msg = $"A Tafl game has been created for {_blackPlayer.Mention} and {_whitePlayer.Mention}.\n"; msg += $"Select or preview one of the following configurations:\n"; for (var i = 0; i < taflConfigurations.Count; ++i) { msg += $"{i + 1}. {taflConfigurations.ElementAt(i).Name}\n"; } msg += $"Use the commands: select <index/name>, preview <index/name>"; await _ch.SendMessageAsync(msg).ConfigureAwait(false); var interactivity = _client.GetInteractivity(); while (true) { var response = await interactivity.WaitForMessageAsync(x => (x.Author.Id == _blackPlayer.Id || x.Author.Id == _whitePlayer.Id) && x.ChannelId == _ch.Id).ConfigureAwait(false); var result = response.Result.Content.ToLower(); var resultSplit = result.Split(" "); bool select = true; if (resultSplit.Length < 2) { continue; } var command = resultSplit[0]; if (command == "select") { select = true; } else if (command == "preview") { select = false; } else { continue; } var index = 0; bool isIndex = int.TryParse(resultSplit[1], out index); TaflConfiguration selected = null; if (isIndex) { if (index > 0 && index <= taflConfigurations.Count) { selected = taflConfigurations.ElementAt(index - 1); } else { await _ch.SendMessageAsync($"Please specify a valid index.").ConfigureAwait(false); continue; } } else { var resultName = string.Join(" ", resultSplit.Skip(1)); taflConfigurations.FirstOrDefault(x => x.Name.ToLower() == result.ToLower()); } if (selected == null) { await _ch.SendMessageAsync($"Please specify a valid name.").ConfigureAwait(false); continue; } if (select) { await _ch.SendMessageAsync($"{selected.Name} has been selected.").ConfigureAwait(false); return(selected); } else { await PreviewBoard(selected).ConfigureAwait(false); continue; } } }