Example #1
0
 private void MakeDie(uPomelos vic)
 {
     vic.isDie = true;
     if (target.lives.Contains(vic))
     {
         target.lives.Remove(vic);
     }
     if (target.villagers.Contains(vic))
     {
         target.villagers.Remove(vic);
     }
     else if (target.hunters.Contains(vic))
     {
         target.hunters.Remove(vic);
     }
     else if (target.prophets.Contains(vic))
     {
         target.prophets.Remove(vic);
     }
     else if (target.witches.Contains(vic))
     {
         target.witches.Remove(vic);
     }
     else if (target.wolves.Contains(vic))
     {
         target.wolves.Remove(vic);
     }
 }
Example #2
0
 /// <summary>
 /// 等待玩家发言完毕
 /// </summary>
 /// <returns>The for speech.</returns>
 protected IEnumerator WaitForSpeech(uPomelos player, float facTime)
 {
     for (float timer = 0f; !player.endSpeech && timer <= facTime; timer += Time.deltaTime)
     {
         yield return(null);
     }
 }
Example #3
0
    private IEnumerator MoveSheriff(uPomelos player)
    {
        yield return(target.StartCoroutine(SendChat("你有 " + moveTime.ToString() + "s 的时间选择撕毁警徽或移交警徽,输入 -1 撕毁警徽,输入玩家编号进行移交。", player)));

        SetupPlayer(player, UnityEngine.UI.InputField.ContentType.IntegerNumber);
        player.isSheriff = false;                       // 移除警长身份
        target.sherif    = null;
        serverManager.SetReceivePlayer(player, null);

        yield return(target.StartCoroutine(WaitForSpeech(player, moveTime)));

        ResetPlayer(target.players);

        int      v   = player.inputValue;
        uPomelos tmp = serverManager.GetPlayer(v, target.lives);

        if (tmp == null || tmp.isDie)
        {
            // 撕毁警徽
            target.hasSheriff = false;
            target.sherif     = null;
            yield return(target.StartCoroutine(SendChat("玩家 " + player.playerName + " 撕毁了警徽。", target.players)));
        }
        else
        {
            tmp.isSheriff     = true;
            target.hasSheriff = true;
            yield return(target.StartCoroutine(SendChat("玩家将警徽移交给了 " + tmp.playerName + "。", target.players)));
        }
    }
Example #4
0
 protected void ResetPlayer(uPomelos player)
 {
     // 设置为无人接收信息
     serverManager.SetReceivePlayer(player, null);
     // 禁用玩家输入系统
     serverManager.TogglePlayerInput(false, UnityEngine.UI.InputField.ContentType.Standard, player);
 }
 /// <summary>
 /// Sets the type of the player input.
 /// </summary>
 /// <param name="type">Type.</param>
 /// <param name="players">Players.</param>
 public void SetPlayerInputType(UnityEngine.UI.InputField.ContentType type, uPomelos player)
 {
     if (player == null)
     {
         return;
     }
     player.RpcModifyInputType(type);
 }
    //============================================ 服务器通信函数=============================================

    /// <summary>
    /// 发送信息到客户端
    /// </summary>
    /// <param name="chat">信息.</param>
    /// <param name="recevier">接收玩家.</param>
    public void SendChat(Chat chat, uPomelos recevier)
    {
        if (recevier == null)
        {
            return;
        }
        recevier.RpcShowChat(chat);                     // 客户端进行信息显示
    }
 /// <summary>
 /// 发送信息到客户端
 /// </summary>
 /// <param name="chat">信息.</param>
 /// <param name="recevier">接收玩家.</param>
 public void SendSystemChat(string msg, uPomelos recevier)
 {
     if (recevier == null)
     {
         return;
     }
     recevier.RpcShowChat(new Chat(-1, "System", msg, ChatSkin.Default));                    // 客户端进行信息显示
 }
Example #8
0
 protected void SetupPlayer(uPomelos player, UnityEngine.UI.InputField.ContentType type)
 {
     // 禁用所有玩家输入系统
     serverManager.TogglePlayerInput(false, type, target.players);
     // 设置玩家发言的接收列表为本身
     serverManager.SetReceivePlayer(player, target.players);
     // 启用玩家输入系统
     serverManager.TogglePlayerInput(true, type, player);
 }
    public override void OnLobbyServerSceneLoadedForPlayer(NetworkManager manager, GameObject lobbyPlayer, GameObject gamePlayer)
    {
        LobbyPlayer lobby  = lobbyPlayer.GetComponent <LobbyPlayer>();
        uPomelos    player = gamePlayer.GetComponent <uPomelos>();

        // 在此处进行初始化
        player.behaviourName = lobby.playerName;                        // 更新角色命名
        //player.behaviourId = m_Manager.AddPlayer (player);		// 添加至服务器列表
        // ServerManager.instance.SendSystemChat ("正在等待其他玩家...", player);
    }
Example #10
0
    /// <summary>
    /// Setups the new game.
    /// </summary>
    /// <returns>The new game.</returns>
    private IEnumerator SetupNewGame()
    {
        // 为了防止一些玩家连接超时,在这里特判一下
        for (float timer = 0; timer < 30f; timer += Time.deltaTime)
        {
            if (FindObjectsOfType <uPomelos> ().Length == playersCount)
            {
                break;
            }
            yield return(null);
        }
        // 添加所有角色
        uPomelos[] pls = FindObjectsOfType <uPomelos> ();
        foreach (var p in pls)
        {
            AddPlayer(p);
        }
        // 因为 Client Rpc 需要在所有客户端初始化后才能调用,在这里判断是否客户端已经初始化。
        float checkTime = 1f, lsTime = 0f;              // 为了减少资源占用。

        for (float timer = 0; timer < 30f; timer += Time.deltaTime)
        {
            bool allready = true;
            if (timer - lsTime >= checkTime)
            {
                foreach (var p in players)
                {
                    allready &= p.hasStart;
                }
                if (allready)
                {
                    break;
                }
                lsTime = timer;
            }
            yield return(null);
        }


        if (players.Count < playersCount)
        {
            // 有玩家未加入
            m_ServerManager.SendSystemChat("一些玩家连接失败,他们将加入游戏但不进行操作。", players);
            int rmCount = playersCount - players.Count;
            for (int i = 0; i < rmCount; i++)
            {
                uPomelos dis = new uPomelos();
                dis.isRobot = true;
                AddPlayer(dis);
            }
        }
        StartNewGame();
    }
Example #11
0
    private IEnumerator Kill()
    {
        // 回合等待
        yield return(new WaitForSeconds(waitTime));

        if (save == false)
        {
            foreach (var p in target.witches)
            {
                serverManager.SendSystemChat("输入要投毒的玩家编号使用毒药,不输入或输入错误视为不使用。你拥有 " + p.poisonCount.ToString() + " 瓶毒药。", p);
            }

            SetupPlayer(target.witches, UnityEngine.UI.InputField.ContentType.IntegerNumber);

            // 投票类环节无人接收信息。
            serverManager.SetReceivePlayer(target.witches, null);

            // 等待一定时间,判断所有女巫玩家是否过麦
            float facTime = target.witches.Count > 0 ? killTime : Random.Range(0f, robotRandomTime);

            yield return(target.StartCoroutine(WaitForSpeech(target.witches, facTime)));

            ResetPlayer(target.witches);

            uPomelos kill = null;
            foreach (var p in target.witches)
            {
                // 有药水
                kill = serverManager.GetPlayer(p.inputValue, target.players);
                if (kill != null && kill.isDie == false && p.poisonCount > 0)
                {
                    p.poisonCount--;                                    // 减去一瓶药水
                    serverManager.SendSystemChat("您使用一瓶毒药杀死了该玩家。", p);
                    kill.killBy = 2;
                    if (kill.behaviourClass == uPomelos.PlayerClasses.Hunter)
                    {
                        serverManager.SendSystemChat("女巫将毒药投给了你,这表示你死亡后将不能使用技能。", kill);
                    }
                    target.victims.Add(kill);
                    break;
                }
            }

            serverManager.SendSystemChat((kill == null ? "没有女巫使用毒药。" : "某个女巫使用毒药杀死了 " + kill.playerName + " 玩家"), target.witches);
        }
        else
        {
            serverManager.SendSystemChat("由于有女巫使用了解药,所以今晚无法使用毒药。", target.witches);
        }
    }
Example #12
0
    /// <summary>
    /// 统计预言家的验人信息
    /// </summary>
    private IEnumerator CountProphetCheck()
    {
        List <uPomelos> check = serverManager.GetMaxCountInputPlayer(target.prophets);

        // 没有检验的玩家
        if (check.Count < 1)
        {
            yield return(target.StartCoroutine(SendChat("本回合你们没有查验玩家。", target.prophets)));
        }
        else
        {
            uPomelos test = check [Random.Range(0, check.Count)];
            yield return(target.StartCoroutine(SendChat("你们检验的玩家 " + test.playerName + " 的身份是 " + (test.behaviourClass == uPomelos.PlayerClasses.Wolf ? "坏人" : "好人"), target.prophets)));
        }
    }
 /// <summary>
 /// 设置信息发送者的接收者
 /// </summary>
 /// <param name="sender">Sender.</param>
 /// <param name="receiver">Receiver.</param>
 public void SetReceivePlayer(uPomelos sender, List <uPomelos> receiver)
 {
     if (sender == null)
     {
         return;
     }
     if (receiver == null)
     {
         receiver = new List <uPomelos> ()
         {
             sender
         }
     }
     ;
     sender.canReceiveChatList = receiver;
 }
    /// <summary>
    /// Gets the max count input player.
    /// </summary>
    /// <returns>The max count input player.</returns>
    /// <param name="players">Players.</param>
    public List <uPomelos> GetMaxCountInputPlayer(List <uPomelos> players, bool sheriffAdv = false)
    {
        if (players == null)
        {
            return(null);
        }
        RemoveEmpty(players);

        int maxCount = -1;
        Dictionary <int, int> dic = new Dictionary <int, int> ();

        foreach (var p in players)
        {
            int      input = p.inputValue;              // 得到 input value
            uPomelos up    = GetPlayer(input, GameManager.instance.players);
            if (up == null || up.isDie)
            {
                continue;
            }
            if (!dic.ContainsKey(input))
            {
                dic.Add(input, 0);
            }
            // 因为警长有1.5票 等价于 警长有3票,其他人2票
            if (sheriffAdv == true && p.isSheriff)
            {
                ++dic [input];                          // 警长特殊票
            }
            dic [input] += 2;                           // 普通投票
            if (++dic [input] > maxCount)
            {
                maxCount = dic [input];
            }
        }

        List <uPomelos> res = new List <uPomelos> ();

        foreach (var d in dic)
        {
            if (d.Value == maxCount)
            {
                res.Add(GetPlayer(d.Key, GameManager.instance.lives));
            }
        }
        RemoveEmpty(res);
        return(res);
    }
Example #15
0
    private IEnumerator HandleBySheriff()
    {
        uPomelos sheriff = target.sherif;

        firstIdx       = 0;
        offset         = 1;
        startBehaviour = target.lives.Count - 1;

        if (sheriff != null)
        {
            yield return(target.StartCoroutine(SendChat("你有 " + thinkTime.ToString() + "s 的时间决定发言顺序,输入 1 从警右发言,输入 -1 从警左发言。", sheriff)));

            SetupPlayer(sheriff, UnityEngine.UI.InputField.ContentType.IntegerNumber);

            serverManager.SetReceivePlayer(sheriff, null);

            yield return(target.StartCoroutine(WaitForSpeech(sheriff, thinkTime)));

            ResetPlayer(target.players);

            int v = sheriff.inputValue;

            startBehaviour = target.lives.IndexOf(sheriff);

            if (v == -1)
            {
                // 警左发言
                yield return(target.StartCoroutine(SendChat("警长决定由警左开始发言。", target.players)));

                firstIdx = (startBehaviour - 1 + target.lives.Count) % target.lives.Count;
                offset   = -1;
            }
            else
            {
                //警右发言
                yield return(target.StartCoroutine(SendChat("警长决定由警右开始发言。", target.players)));

                firstIdx = ((startBehaviour + 1) % target.lives.Count);
                offset   = 1;
            }
        }
    }
Example #16
0
    /// <summary>
    /// 统计狼人的杀人信息
    /// </summary>
    private IEnumerator CountWolfKill()
    {
        List <uPomelos> kill = serverManager.GetMaxCountInputPlayer(target.wolves);

        // 空刀
        if (kill.Count < 1)
        {
            yield return(target.StartCoroutine(SendChat("本回合你们进行了空刀,你们没有杀害玩家。", target.wolves)));
        }
        else
        {
            uPomelos die = kill [Random.Range(0, kill.Count)];
            yield return(target.StartCoroutine(SendChat("你们在本回合中你们杀害了" + die.behaviourId.ToString() + "号玩家", target.wolves)));

            if (!target.victims.Contains(die))
            {
                target.victims.Add(die);                                                        // 将玩家添加入死亡列表
            }
        }
    }
Example #17
0
    private IEnumerator LastWord(uPomelos vic)
    {
        // 猎人死亡
        if (vic.behaviourClass == uPomelos.PlayerClasses.Hunter && vic.killBy != 2)
        {
            yield return(target.StartCoroutine(ShootPlayer(vic)));
        }

        yield return(target.StartCoroutine(SendChat("你需要留下遗言,按下结束停止发言。", vic)));

        SetupPlayer(vic, UnityEngine.UI.InputField.ContentType.Standard);

        float facTime = vic.isRobot ? 3f : lastWdTime;

        yield return(target.StartCoroutine(WaitForSpeech(vic, facTime)));

        ResetPlayer(target.players);

        if (vic.isSheriff == true)
        {
            yield return(MoveSheriff(vic));
        }
    }
Example #18
0
    private IEnumerator ShootPlayer(uPomelos hunter)
    {
        yield return(target.StartCoroutine(SendChat("你拥有 " + skillTime.ToString() + "s 的时间输入你要杀死的玩家编号,输入错误视为不发动技能。", hunter)));

        SetupPlayer(hunter, UnityEngine.UI.InputField.ContentType.IntegerNumber);

        yield return(target.StartCoroutine(WaitForSpeech(hunter, skillTime)));

        ResetPlayer(target.players);

        uPomelos kill = serverManager.GetPlayer(hunter.inputValue, target.players);

        if (kill == null || kill.isDie)
        {
            // 空刀
            yield return(target.StartCoroutine(SendChat("玩家选择不发动英雄技能。", target.players)));
        }
        else
        {
            yield return(target.StartCoroutine(SendChat("猎人使用技能击杀了玩家:" + kill.playerName, target.players)));

            target.victims.Add(kill);
        }
    }
Example #19
0
    /// <summary>
    /// 以系统身份发送消息
    /// </summary>
    /// <param name="msg">Message.</param>
    protected IEnumerator SendChat(string msg, uPomelos receiver)
    {
        yield return(new WaitForSeconds(waitTime));

        serverManager.SendSystemChat(msg, receiver);
    }
Example #20
0
 //
 public void AddPlayer(uPomelos player)
 {
     players.Add(player);
     lives.Add(player);
     player.behaviourId = players.Count;
 }
 /// <summary>
 /// 启用/禁用玩家输入
 /// </summary>
 /// <param name="active">If set to <c>true</c> active.</param>
 /// <param name="players">Players.</param>
 public void TogglePlayerInput(bool active, UnityEngine.UI.InputField.ContentType type, uPomelos player)
 {
     if (player == null)
     {
         return;
     }
     if (player.isDie)
     {
         player.RpcToggleInput(false, type);
     }
     else
     {
         player.RpcToggleInput(active, type);
     }
 }