示例#1
0
    static void UpdatePlayerStatus(UdpClient client, uint pid, PlayerStatus status)
    {
        NetWerewolfPlayer ap = ConnectedPlayers.Find(p => p.PlayerID == pid);

        ap.Status = status;
        UpdatePlayerList.Invoke(pid, status == PlayerStatus.Dead);
    }
示例#2
0
    static void RemoteClientDisconnected(UdpClient client, uint pid)
    {
        if (LocalPlayer.PlayerID == pid)
        {
            CloseClientInstance();
        }

        if (ServerInstance == null)
        {
            ConnectedPlayers.Remove(ConnectedPlayers.Find(p => p.PlayerID == pid));
        }

        // TODO: GameInfo removal (Maybe make dead if alive, and then remove once spectator?)

        UpdatePlayerList.Invoke(pid, true);
    }
示例#3
0
        public void OnClose(IWebSocketConnection socket)
        {
            // Remove disconnected player from manager.
            var player = ConnectedPlayers.Find(x => x.Socket == socket);

            if (player != null)
            {
                ConnectedPlayers.Remove(player);

                Logger.Log(this, "Player {0} disconnected", player.Data.Name);

                NotifyPlayerEvent(player, PlayerAction.Disconnected);

                if (PlayerDisconnected != null)
                {
                    PlayerDisconnected(this, player);
                }
            }
        }
示例#4
0
 static void ReceivedChatMessage(UdpClient client, uint pid, string message)
 {
     ChatMessageReceived.Invoke(ConnectedPlayers.Find(p => p.PlayerID == pid), message);
 }
示例#5
0
    static void RequestActionOnPlayer(UdpClient sender, uint pid)
    {
        NetWerewolfPlayer player = sender.GetPlayer();
        NetWerewolfPlayer target = ConnectedPlayers.Find(p => p.PlayerID == pid);

        switch (player.Status)
        {
        case PlayerStatus.Dead:
            sender.Send(5, 0u, $"You are dead and cannot perform any more actions!");
            return;

        case PlayerStatus.Spectating:
            sender.Send(5, 0u, $"Spectators cannot perform in-game actions.");
            return;
        }

        if (target == null)
        {
            sender.Send(5, 0u, $"Targeted player with ID {pid} not found.");
            return;
        }

        if (CurrentDay == 0 && CurrentGameState == GameState.Discussion)
        {
            sender.Send(5, 0u, $"No votes for execution will be considered until the first night is over!");
            return;
        }

        switch (CurrentGameState)
        {
        case GameState.Dawn:
            sender.Send(5, 0u, $"Please wait until dawn is over to begin voting.");
            break;

        case GameState.Discussion:
            // TODO: Vote against player
            if (target.PlayerID == player.PlayerID)
            {
                sender.Send(5, 0u, $"You cannot vote yourself onto trial!");
                break;
            }

            if (player.TrialTargetPID != target.PlayerID)
            {
                player.TrialTargetPID = target.PlayerID;
                target.TrialVotes++;
                ServerInstance.Send(5, 0u, $"{player.Name} has voted to trial {target.Name}! ({target.TrialVotes}/2)");

                if (target.TrialVotes >= 2 && PlayerOnTrial == null)
                {
                    PlayerOnTrial    = target;
                    CurrentGameState = GameState.Trial;
                    StateChanged     = true;
                    StateTime        = 20;
                }
            }

            else if (player.TrialTargetPID == target.PlayerID)
            {
                player.TrialTargetPID = 0u;
                target.TrialVotes--;
                ServerInstance.Send(5, 0u, $"{player.Name} has revoked their vote to trial {target.Name}. ({target.TrialVotes}/2)");
            }

            break;

        case GameState.Trial:
            if (PlayerOnTrial != null && PlayerOnTrial.Status != PlayerStatus.Dead)
            {
                if (player.PlayerID == PlayerOnTrial.PlayerID)
                {
                    sender.Send(5, 0u, $"You are on trial and cannot vote to execute yourself!");
                    break;
                }

                player.VotedForKill = !player.VotedForKill;

                if (player.VotedForKill)
                {
                    sender.Send(5, 0u, $"You have voted to kill {PlayerOnTrial.Name}.");
                }
                else
                {
                    sender.Send(5, 0u, $"You have decided to revoke your vote to kill {PlayerOnTrial.Name}.");
                }
            }
            else
            {
                sender.Send(5, 0u, $"The player who was on trial can no longer be voted against.");
            }
            break;

        case GameState.Night:
            // TODO: Night abilities
            if (player.Role.NightEvent == null)
            {
                sender.Send(5, 0u, $"The {player.Role.Name} role does not have a night ability!");
                break;
            }

            if (player.Role.NightEvent.EventTargets == 0)
            {
                sender.Send(5, 0u, $"Your night ability is passive and does not require a target.");
                break;
            }

            if (player.Role.NightEvent.TargetPlayers[0] == null || player.Role.NightEvent.TargetPlayers[0].PlayerID != target.PlayerID)
            {
                player.Role.NightEvent.TargetPlayers[0] = target;
                sender.Send(5, 0u, $"You have decided to target {target.Name}.");     // TODO: custom action text
            }
            else
            {
                player.Role.NightEvent.TargetPlayers[0] = null;
                sender.Send(5, 0u, $"You have instead decided not to perform your night ability.");
            }

            break;

        case GameState.End:
            sender.Send(5, 0u, $"The game is already over!");
            break;
        }
    }
 // Return Player reference of invoker
 private Player GetCurrentPlayer()
 {
     return(ConnectedPlayers.Find(player => player.ConnectionId == Context.ConnectionId));
 }