Example #1
0
 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);
 }
Example #2
0
            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;
                }
            }
Example #3
0
        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);
            });
        }
Example #4
0
        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;
                }
            }
        }