Esempio n. 1
0
        public static async Task <bool> runDayPhase(GamePlayerList g, DiscordClient _client)
        {
            EventHandler <MessageEventArgs> voteHandler = null;

            voteHandler              = new EventHandler <MessageEventArgs>((s, e) => VoteHandler(s, e, g, _client));
            _client.MessageReceived += voteHandler;

            await Task.Delay(TimeConverter.MinToMS((g.PhaseLengthInMin / 2)), g.Token.Token);

            VoteTallyCommand.countVotes(g);
            int           i = 0; string playerList = "";
            List <Player> SortedList = g.Objects.Where(x => x.Alive == true).OrderByDescending(o => o.VotesOn).ToList();

            foreach (var item in SortedList)
            {
                i++;
                try
                {
                    playerList += $"{i}. {item.User.Name} " + item.VotesOn + ": " + VoteTallyCommand.votedFor(SortedList, item) + "\n";
                }
                catch (Exception) { }
            }
            await g.GameChat.SendMessage($":warning: There are only {g.PhaseLengthInMin/2} minutes left in the day phase. :warning:\n\nMid day vote count:\n```{playerList}```");

            await Task.Delay(TimeConverter.MinToMS((g.PhaseLengthInMin / 2)), g.Token.Token);

            _client.MessageReceived -= voteHandler;
            return(true);
        }
Esempio n. 2
0
 public EventHandler <MessageEventArgs> PowerHandler(GamePlayerList g)
 {
     if (this.eventHandler == null)
     {
         this.eventHandler = new EventHandler <MessageEventArgs>((s, e) => powerHandler(s, e, g));
     }
     return(this.eventHandler);
 }
Esempio n. 3
0
 private static void handlePowerRoles(GamePlayerList g, DiscordClient _client)
 {
     g.Objects.ForEach(async x =>
     {
         if (x.Role.PowerRole && x.Alive)
         {
             await x.User.SendMessage(x.Role.Power);
             _client.MessageReceived += x.Role.PowerHandler(g);
         }
     });
 }
Esempio n. 4
0
        public async static void runGame(GamePlayerList g, DiscordClient _client)
        {
            do
            {
                if (g.Phase == Phases.Day)
                {
                    g.Token = new CancellationTokenSource();

                    try
                    {
                        if (await runDayPhase(g, _client))
                        {
                        }
                    } catch (Exception)
                    {
                    }
                    finally
                    {
                        await runDayRecap(g);
                    }
                }
                else if (g.Phase == Phases.Night)
                {
                    g.Token = new CancellationTokenSource();

                    try
                    {
                        if (await runNightPhase(g, _client))
                        {
                        }
                    }
                    catch (Exception)
                    {
                    }
                    finally
                    {
                        await runNightRecap(g, _client);
                    }
                }
                else
                {
                    await g.GameChat.SendMessage("Stopping game in 1 minute...");

                    await Task.Delay(TimeConverter.MinToMS(1));

                    g.Reset();
                }
            } while (g.gameRunning);
        }
 public static void countVotes(GamePlayerList game)
 {
     foreach (Player item in game.Objects)
     {
         item.VotesOn = 0;
     }
     foreach (Player item in game.Objects)
     {
         try
         {
             item.LynchTarget.VotesOn++;
         }
         catch (Exception)
         {
         }
     }
 }
Esempio n. 6
0
        public static async Task <bool> checkWinConditions(GamePlayerList g)
        {
            if (g.MafiaAlive <= 0)
            {
                g.Phase = Phases.EndPhase;
                await g.GameChat.SendMessage($"**__Congratulations Town! All Mafia Players are dead. You win the game!__**");

                return(true);
            }
            if (g.MafiaAlive >= g.TownAlive)
            {
                g.Phase = Phases.EndPhase;
                await g.GameChat.SendMessage($"**__Congratulations Mafia! You have outnumbered the town. You win the game!__**");

                return(true);
            }

            return(false);
        }
Esempio n. 7
0
        public static async Task <bool> runNightPhase(GamePlayerList g, DiscordClient _client)
        {
            handlePowerRoles(g, _client);

            g.NightkillHandler       = null;
            g.NightkillHandler       = new EventHandler <MessageEventArgs>((s, e) => NightkillHandler(s, e, g, _client));
            _client.MessageReceived += g.NightkillHandler;

            await g.MafiaChat.SendMessage($"Dear Scum, It is now Night {g.PhaseCounter}. Please select your Night Kill target by typing `KILL: playername`. ");



            await Task.Delay(TimeConverter.MinToMS((g.PhaseLengthInMin / 4)), g.Token.Token);

            await g.GameChat.SendMessage($":warning: There are only {g.PhaseLengthInMin / 4} minutes left in the night phase. :warning:");

            await Task.Delay(TimeConverter.MinToMS((g.PhaseLengthInMin / 4)), g.Token.Token);

            return(true);
        }
Esempio n. 8
0
 static async void VoteHandler(object s, MessageEventArgs e, GamePlayerList g, DiscordClient _client)
 {
     if (e.Channel.Id == g.GameChat.Id)
     {
         if (e.Message.RawText.StartsWith("VOTE: ") && e.Message.MentionedUsers.Count() != 0)
         {
             if (g.inGame(e.Message.MentionedUsers.FirstOrDefault()))
             {
                 g.Find(e.User).LynchTarget = g.Find(e.Message.MentionedUsers.FirstOrDefault());
                 await e.User.SendMessage("You're currently voting for: " + e.Message.MentionedUsers.FirstOrDefault());
             }
         }
         else if (e.Message.RawText.StartsWith("UNVOTE"))
         {
             try
             {
                 g.Find(e.User).LynchTarget = null;
             } catch (Exception) { }
         }
     }
 }
Esempio n. 9
0
 protected override async void powerHandler(object s, MessageEventArgs e, GamePlayerList g)
 {
     if (e.Message.RawText.StartsWith("SCAN: ") && e.Channel.Id == e.User.PrivateChannel.Id)
     {
         string target = e.Message.RawText.Replace("SCAN: ", "");
         if (g.inGame(g.Find(target)))
         {
             Target = g.Find(target);
             if (Target.User.Nickname != null)
             {
                 await e.User.SendMessage($"You will be scanning: {Target.User.Nickname} tonight. Use `SCAN: [playername]` to change your target.");
             }
             else
             {
                 await e.User.SendMessage($"You will be scanning: {Target.User.Name} tonight. Use `SCAN: [playername]` to change your target.");
             }
         }
         else
         {
             await e.User.SendMessage($"Your input was invalid. You inputted: {target}");
         }
     }
 }
Esempio n. 10
0
 private static async void NightkillHandler(object s, MessageEventArgs e, GamePlayerList g, DiscordClient _client)
 {
     if (e.Channel.Id == g.MafiaChat.Id && e.Message.RawText.StartsWith("KILL: "))
     {
         string target = e.Message.RawText.Replace("KILL: ", "");
         if (g.inGame(g.Find(target)))
         {
             g.MafiaKillTarget = g.Find(target);
             if (g.MafiaKillTarget.User.Nickname != null)
             {
                 await g.MafiaChat.SendMessage($"The current kill target is: {g.MafiaKillTarget.User.Nickname}. Use `KILL: [playername]` to change your target.");
             }
             else
             {
                 await g.MafiaChat.SendMessage($"The current kill target is: {g.MafiaKillTarget.User.Name}. Use `KILL: [playername]` to change your target.");
             }
         }
         else
         {
             await g.MafiaChat.SendMessage($"Your input was invalid. You inputted: {target}");
         }
     }
 }
Esempio n. 11
0
        private static void redoneRoles(GamePlayerList g, List <MafiaRole> setup)
        {
            List <Player>    players = ListHelper.ShuffleList <Player>(g.Objects);
            List <MafiaRole> roles   = ListHelper.ShuffleList <MafiaRole>(setup);
            MafiaRole        role;

            Console.WriteLine("Starting to assign roles.");
            if (players.Count == roles.Count)
            {
                Console.WriteLine("Started to assign roles. Player count:" + players.Count);
                foreach (Player player in players)
                {
                    player.AssignRole(role = roles.FirstOrDefault());
                    Console.WriteLine($"{player.User.Name} received {role.Title}");
                    roles.Remove(role);
                }
                g.Objects = players;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
Esempio n. 12
0
        public static async void startGame(CommandEventArgs e, GamePlayerList g, DiscordClient _client)
        {
            //Create a chatroom in the server with all players in it.
            Channel channel = await e.Server.CreateChannel("Mafia-Game-Room", ChannelType.Text);

            await channel.AddPermissionsRule(e.Server.CurrentUser, new ChannelPermissionOverrides(readMessages : PermValue.Allow));

            await channel.AddPermissionsRule(e.Server.EveryoneRole, new ChannelPermissionOverrides(readMessages : PermValue.Deny));

            foreach (var item in g.Objects)
            {
                await channel.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Deny));
            }
            await channel.SendMessage("@everyone the game is starting up...");

            await Task.Delay(500);

            //Distribute Roles
            Message m1 = await channel.SendMessage("Distributing roles now...");

            await channel.SendIsTyping();

            //distributeRoles(g);

            try
            {
                List <MafiaRole> setup = handleSetup(g);
                redoneRoles(g, setup);
            }
            catch
            {
                await e.Channel.SendMessage("An error occured. Game setup has stalled. Please contact a moderator.");
            }

            await m1.Edit("Distributed roles! :white_check_mark:");

            await Task.Delay(500);

            //Send role PM's
            Message m2 = await channel.SendMessage("Sending role pm's...");

            foreach (var item in g.Objects)
            {
                item.Role.sendRolePM(item.User);
            }
            await m2.Edit("Sent role pm's! :white_check_mark:");

            await Task.Delay(500);

            //Create a chatroom with just the mafia members in it.
            Message m3 = await channel.SendMessage("Creating Mafia Chat...");

            Channel mafiaChat = await e.Server.CreateChannel("Mafia-Night-Chat", ChannelType.Text);

            await mafiaChat.AddPermissionsRule(e.Server.CurrentUser, new ChannelPermissionOverrides(readMessages : PermValue.Allow));

            await mafiaChat.AddPermissionsRule(e.Server.EveryoneRole, new ChannelPermissionOverrides(readMessages : PermValue.Deny));

            foreach (var item in g.Objects)
            {
                if (item.Role.Allignment == Roles.RoleUtil.Allignment.Mafia)
                {
                    await mafiaChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Allow));
                }
            }
            await mafiaChat.SendMessage($"Welcome scummy friends :smiling_imp:, You can freely discuss in this chat during both day & night phases.\nOnce night hits I will make an announcement for you to post your Night Kill Target.");

            await m3.Edit("Created Mafia Chat! :white_check_mark:");

            await Task.Delay(500);

            //Start day 1, and allow everyone to speak.
            await channel.SendMessage($":sunny: @everyone **It is now day 1.** Day 1 will end in {g.PhaseLengthInMin} minutes. :sunny:\nTo vote use `VOTE: @[username]`");

            await Task.Delay(100);

            foreach (var item in g.Objects)
            {
                await channel.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Allow));
            }

            //sets the channel in the game for refference from different objects
            g.setChats(channel, mafiaChat);
            g.Phase        = Util.Phases.Day;
            g.PhaseCounter = 1;
            //run the GameManager for continuation of the game.
            GameManager.runGame(g, _client);
        }
Esempio n. 13
0
        private static List <MafiaRole> handleSetup(GamePlayerList g)
        {
            List <MafiaRole> setup = new List <MafiaRole>();


            Console.WriteLine("Starting to handle setup");
            if (true) //change this later for default setup
            {
                int playerCount = g.Objects.Count;

                //int funFactor = ListHelper.r.Next(100);

                g.TownPlayers  = ((int)Math.Floor(playerCount * 0.75));
                g.MafiaPlayers = ((int)Math.Ceiling(playerCount * 0.25));

                if (playerCount == 5 && g.MafiaPlayers == 2)
                {
                    g.TownPlayers++;
                    g.MafiaPlayers--;
                }
                int i = g.TownPlayers;
                while (i >= 3)
                {
                    if (i >= 4 && g.Doctors == 0)
                    {
                        g.TownPlayers--;
                        g.Doctors++;
                        i--;
                    }
                    g.TownPlayers--;
                    g.Cops++;
                    i -= 3;
                }
                Console.WriteLine("Numbers Input.");
            }
            for (int i = 0; i < g.Doctors; i++)
            {
                setup.Add(new Doctor("Player"));
                g.TownAlive++;
            }
            for (int i = 0; i < g.Cops; i++)
            {
                setup.Add(new Cop("Player"));
                g.TownAlive++;
            }
            for (int i = 0; i < g.TownPlayers; i++)
            {
                setup.Add(new Vanilla(Allignment.Town, "Player"));
                g.TownAlive++;
            }
            for (int i = 0; i < g.Godfathers; i++)
            {
                setup.Add(new Vanilla("Godfather", "You are the leader of the mafia, and will show up as town when scanned by an investigative role like Cop.\nYou also have the power to vote in the Mafia Chat every night on whom to kill.", $"Dear **{players[i].User.Name}**,\n\nYou are the most basic of roles in existence,\nYou are the **Godfather**.\n\nYou are the leader of the mafia, and will show up as town when scanned by an investigative role like Cop.\nYou also have the power to vote in the Mafia Chat every night on whom to kill.\n\nYou win with the **Mafia** whose goal is to outnumber all members of the Town"));
            }
            for (int i = 0; i < g.MafiaPlayers; i++)
            {
                setup.Add(new Vanilla(Allignment.Mafia, "Player"));
                g.MafiaAlive++;
            }
            Console.WriteLine("Created Roles");


            return(setup);
        }
Esempio n. 14
0
 #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
 protected virtual async void powerHandler(object s, MessageEventArgs e, GamePlayerList g)
 {
 }
Esempio n. 15
0
        public static async Task <bool> runNightRecap(GamePlayerList g, DiscordClient _client)
        {
            g.Phase = Phases.Day; g.PhaseCounter++;

            await g.GameChat.SendMessage(":night_with_stars: @everyone the Night phase has ended! Recapping now... :night_with_stars:");

            try
            {
                foreach (var item in g.Objects.Where(x => x.Alive == true))
                {
                    await g.GameChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Deny));
                }
            } catch (Exception)
            {
            }

            _client.MessageReceived -= g.NightkillHandler;
            g.Objects.ForEach(async x =>
            {
                _client.MessageReceived -= x.Role.PowerHandler(g);
                await x.Role.powerResult(x.User, x.Role.Target);
            });

            if (g.MafiaKillTarget != null && g.MafiaKillTarget != g.Objects.Where(x => x.Role.Title == "Doctor" && x.Role.Alive).FirstOrDefault().Role.Target)
            {
                await g.GameChat.SendMessage($"When everyone woke up in the morning, they found out someone was missing: {g.MafiaKillTarget.User.Name}\nOnce they arived at their home, they were found death on the ground.\n\n**{g.MafiaKillTarget.User.Name} was killed by the Mafia. They were:**");

                await g.GameChat.SendMessage($"**Role PM:**\n```{g.MafiaKillTarget.Role.RolePM}```\n");

                g.MafiaKillTarget.Alive = false;
                if (g.MafiaKillTarget.Role.Allignment == Roles.RoleUtil.Allignment.Mafia)
                {
                    g.MafiaAlive--;
                }
                else if (g.MafiaKillTarget.Role.Allignment == Roles.RoleUtil.Allignment.Town)
                {
                    g.TownAlive--;
                }
                g.MafiaKillTarget = null;
            }
            else
            {
                if (g.MafiaKillTarget != null)
                {
                    await g.MafiaChat.SendMessage($"__Your kill on {g.MafiaKillTarget.User.Mention} was unsuccesful.__");
                }
                await g.GameChat.SendMessage($"Tonight has been a quiet night... Nothing happened...");
            }

            if (await checkWinConditions(g))
            {
                return(true);
            }

            await g.GameChat.SendMessage($":sunny: It is now Day {g.PhaseCounter}. The phase will end in {g.PhaseLengthInMin} minutes. :sunny:");

            foreach (var item in g.Objects)
            {
                if (item.Alive == true)
                {
                    await g.GameChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Allow));
                }
                else
                {
                    if (item.Role.Allignment == Roles.RoleUtil.Allignment.Mafia)
                    {
                        await g.MafiaChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Deny));
                    }
                }
            }
            return(true);
        }
Esempio n. 16
0
        //Randomly distribute the roles.
        private static void distributeRoles(GamePlayerList g)
        {
            //75% of the players are town, 25% are mafia (rounded up and down respectively)
            int playerCount = g.Objects.Count;

            g.TownPlayers  = ((int)Math.Floor(playerCount * 0.75));
            g.MafiaPlayers = ((int)Math.Ceiling(playerCount * 0.25));
            //In the case of a 5 player game (where there'd be no mafia) remove 1 town add 1 mafia.
            if (playerCount == 5 && g.MafiaPlayers == 2)
            {
                g.TownPlayers++;
                g.MafiaPlayers--;
            }
            int i = g.TownPlayers;

            while (i >= 3)
            {
                if (i >= 4 && g.Doctors == 0)
                {
                    g.TownPlayers--;
                    g.Doctors++;
                    i--;
                }
                g.TownPlayers--;
                g.Cops++;
                i -= 3;
            }

            g.TownAlive  = 0;
            g.MafiaAlive = 0;

            Player[] players = ListHelper.ShuffleList <Player>(g.Objects).ToArray();
            i = 0;
            do
            {
                players[i].AssignRole(new Vanilla(Roles.RoleUtil.Allignment.Town, players[i].User.Name));
                g.TownAlive++;
                i++;
            } while (g.TownAlive < g.TownPlayers);
            do
            {
                if (g.MafiaPlayers > 1 && g.Godfathers == 0)
                {
                    players[i].AssignRole(new Vanilla("Godfather", "You are the leader of the mafia, and will show up as town when scanned by an investigative role like Cop.\nYou also have the power to vote in the Mafia Chat every night on whom to kill.", $"Dear **{players[i].User.Name}**,\n\nYou are the most basic of roles in existence,\nYou are the **Godfather**.\n\nYou are the leader of the mafia, and will show up as town when scanned by an investigative role like Cop.\nYou also have the power to vote in the Mafia Chat every night on whom to kill.\n\nYou win with the **Mafia** whose goal is to outnumber all members of the Town"));
                    g.MafiaAlive++;
                    g.Godfathers++;
                    i++;
                }
                players[i].AssignRole(new Vanilla(Allignment.Mafia, players[i].User.Name));
                g.MafiaAlive++;
                i++;
            } while (g.MafiaAlive < g.MafiaPlayers);
            while (g.Cops > 0)
            {
                players[i].AssignRole(new Cop(players[i].User.Name));
                g.Cops--;
                g.TownAlive++;
                i++;
            }
            while (g.Doctors > 0)
            {
                players[i].AssignRole(new Doctor(players[i].User.Name));
                g.Doctors--;
                g.TownAlive++;
                i++;
            }

            g.Objects = players.ToList();

            //Old randomize method, above method should however be smoother and easier to edit. But needs testing

            /*foreach (var item in g.Objects)
             * {
             *  if (g.TownAlive < g.TownPlayers && g.MafiaAlive < g.MafiaPlayers && g.Cops > 0)
             *  {
             *      switch (random.Next(1, 4))
             *      {
             *          case 1:
             *              item.AssignRole(new Vanilla(Roles.RoleUtil.Allignment.Town, item.User.Name));
             *              g.TownAlive++;
             *              break;
             *          case 2:
             *              item.AssignRole(new Vanilla(Roles.RoleUtil.Allignment.Mafia, item.User.Name));
             *              g.MafiaAlive++;
             *              break;
             *          case 3:
             *              item.AssignRole(new Cop(item.User.Name));
             *              g.TownAlive++;
             *              g.Cops--;
             *              break;
             *      }
             *  } else if (g.Cops > 0)
             *  {
             *      item.AssignRole(new Cop(item.User.Name));
             *      g.TownAlive++;
             *      g.Cops--;
             *  }
             *  else if (g.TownAlive < g.TownPlayers)
             *  {
             *      item.AssignRole(new Vanilla(Roles.RoleUtil.Allignment.Town, item.User.Name));
             *      g.TownAlive++;
             *  }
             *  else
             *  {
             *      item.AssignRole(new Vanilla(Roles.RoleUtil.Allignment.Mafia, item.User.Name));
             *      g.MafiaAlive++;
             *  }
             * }*/
        }
Esempio n. 17
0
        public static async Task <bool> runDayRecap(GamePlayerList g)
        {
            g.Phase = Phases.Night;

            await g.GameChat.SendMessage(":city_sunset: @everyone the Day phase has ended! Recapping now... :city_sunset: ");

            foreach (var item in g.Objects.Where(x => x.Alive == true))
            {
                await g.GameChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Deny));
            }

            VoteTallyCommand.countVotes(g);

            Player[] list = g.Objects.OrderByDescending(x => x.VotesOn).ToArray();

            if (list.Where(x => x.VotesOn == list[0].VotesOn).Count() > 1)
            {
                await g.GameChat.SendMessage("It seems like everyone was very indecisive today,\nand because of there being no majority, nobody got lynched.");
            }
            else
            {
                list[0].Alive = false;
                if (list[0].Role.Allignment == Roles.RoleUtil.Allignment.Mafia)
                {
                    g.MafiaAlive--;
                }
                else if (list[0].Role.Allignment == Roles.RoleUtil.Allignment.Town)
                {
                    g.TownAlive--;
                }

                await g.GameChat.SendMessage($"It seems like all of you have decided on your lynch target, **{list[0].User.Name}**, so let's see what they are!");

                await g.GameChat.SendMessage($"**Role PM:**\n```{list[0].Role.RolePM}```\n");
            }

            if (await checkWinConditions(g))
            {
                return(true);
            }

            await g.GameChat.SendMessage($":full_moon: It is now Night {g.PhaseCounter}. The phase will end in {g.PhaseLengthInMin/2} minutes. :full_moon:");

            foreach (var item in g.Objects)
            {
                if (item.Alive == true)
                {
                    await g.GameChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Allow));
                }
                else
                {
                    if (item.Role.Allignment == Roles.RoleUtil.Allignment.Mafia)
                    {
                        await g.MafiaChat.AddPermissionsRule(item.User, new ChannelPermissionOverrides(readMessages : PermValue.Allow, sendMessages : PermValue.Deny));
                    }
                }

                item.LynchTarget = null;
            }
            return(true);
        }