Esempio n. 1
0
        void ToggleDuelState(bool duelStarted)
        {
            btnGood.SetPropertyThreadSafe(() => btnGood.Visible, duelStarted);
            btnGood.SetPropertyThreadSafe(() => btnGood.Enabled, false);
            btnBad.SetPropertyThreadSafe(() => btnBad.Visible, duelStarted);
            btnBad.SetPropertyThreadSafe(() => btnBad.Enabled, false);

            btnStartDuel.SetPropertyThreadSafe(() => btnStartDuel.Visible, !duelStarted);
            btnGetStat.SetPropertyThreadSafe(() => btnGetStat.Enabled, !duelStarted);
            if (!duelStarted)
            {
                lblEnemyHealth.SetPropertyThreadSafe(() => lblEnemyHealth.Text, "");
                lblEnemyName.SetPropertyThreadSafe(() => lblEnemyName.Text, "");
                TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Clear());
            }
        }
Esempio n. 2
0
        void ReadClientMsg()
        {
            string serverIp;

            try
            {
                GrpcChannel channel = Connection.GetDispatcherChannel();
                var         client  = new GodvilleServiceClient(channel);
                serverIp = client.StartDuel(new ClientId {
                    Id = Program.Client.Id
                }).Ip;
            }
            catch (Exception e)
            {
                //Выбранный диспетчер вдруг умер после проверки на активность
                Logger.AddErrorMessage(e.Message);
                MessageBox.Show("Дуэль не может быть начата");
                return;
            }

            //заглушка
            serverIp = "127.0.0.1:8017";

            var    lines  = serverIp.Split(":");
            int    port   = int.Parse(lines[1]);
            string server = lines[1];

            try
            {
                using (TcpClient tcpClient = new TcpClient(lines[0], port))
                {
                    NetworkStream networkStream = tcpClient.GetStream();
                    StreamReader  sr            = new StreamReader(networkStream);
                    StreamWriter  sw            = new StreamWriter(networkStream);
                    WriteStream.WriteNetworkStream = networkStream;
                    sr.BaseStream.ReadTimeout      = 20 * 1000;
                    sw.WriteLine(Program.Client.Id.ToString());
                    sw.Flush();

                    string input;
                    ToggleDuelState(true);
                    while (true)
                    {
                        Model.ClientMsg clientMsg;
                        try
                        {
                            if ((input = sr.ReadLine()) != null)
                            {
                                clientMsg = JsonConvert.DeserializeObject <Model.ClientMsg>(input);
                            }
                            else
                            {
                                continue;
                            }
                        }
                        catch (IOException e)
                        {
                            MessageBox.Show("Дуэль была прервана обстоятельствами, теперь вы можете найти ее в статистике");
                            Logger.AddErrorMessage(e.Message);
                            ToggleDuelState(false);
                            return;
                        }
                        if (clientMsg != null)
                        {
                            bool isHodEven = clientMsg.HodNum % 2 == 0;

                            if (clientMsg.Type != 4)
                            {
                                ToggleMyHod(isHodEven);
                            }

                            if (clientMsg.Type == 4)
                            {
                                lblEnemyName.SetPropertyThreadSafe(() => lblEnemyName.Text, clientMsg.EnemyName);
                            }

                            TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Add(clientMsg.Phrase));
                            if (clientMsg.Glas != -1 && clientMsg.Type != 4)
                            {
                                string glasMsg;
                                if (isHodEven) // в ход клиента приходит глас от противника
                                {
                                    glasMsg = clientMsg.Glas == 0 ?
                                              "Противник сделал плохо. Ваше здоровье уменьшилось" :
                                              "Противник сделал хорошо. Его герой вылечился";
                                }
                                else // в ход противника видим глас с нашего прошлого хода (если сработал)
                                {
                                    glasMsg = clientMsg.Glas == 0 ?
                                              "Вы сделали плохо. Здоровье противника уменьшилось" :
                                              "Вы сделали хорошо. Ваш герой подлатал раны";
                                }
                                TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.Items.Add(glasMsg));
                                TestFormControlHelper.ControlInvoke(
                                    lvDuelHistory,
                                    () => lvDuelHistory.Items[lvDuelHistory.Items.Count - 1].BackColor = Color.PeachPuff);
                            }

                            TestFormControlHelper.ControlInvoke(lvDuelHistory, () => lvDuelHistory.EnsureVisible(lvDuelHistory.Items.Count - 1));
                            lblEnemyHealth.SetPropertyThreadSafe(() => lblEnemyHealth.Text, clientMsg.EnemyLives.ToString());
                            lblYourHealth.SetPropertyThreadSafe(() => lblYourHealth.Text, clientMsg.Lives.ToString());
                            if (clientMsg.Type == 0)
                            {
                                MessageBox.Show("Дуэль завершена, теперь вы можете найти ее в статистике");
                                ToggleDuelState(false);
                                return;
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Дуэль закончилась, не начавшись: ваш противник внезано провалился сквозь землю");
                Logger.AddErrorMessage(e.Message);
                return;
            }
        }