public void GameCommandRecieved(object sender, CommandEventArgs e)
        {
            Console.WriteLine("Game command received. data:{0} type:{1}", e.Command.Data, e.Command.CommandType);
            if (e.Command.CommandType == CommandType.GameStartInform)
            {
                if (e.Command.Data.ToLower() == "true")
                {
                    myTurn = true;
                    rtbLog.BeginInvoke((MethodInvoker) delegate() { rtbLog.AppendText(i18n.GetText("firstShotMe"));; });
                    btnFire.BackColor = System.Drawing.Color.Red;
                    btnFire.ForeColor = System.Drawing.Color.White;
                    //btnFire.Enabled = true;
                }
                else if (e.Command.Data.ToLower() == "false")
                {
                    myTurn          = false;
                    btnFire.Enabled = false;
                    rtbLog.BeginInvoke((MethodInvoker) delegate() { rtbLog.AppendText(i18n.GetText("firstShotEnemy"));; });
                }
            }
            if (e.Command.CommandType == CommandType.GameShotResult)
            {
                if (e.Command.Data.ToLower().Equals("hit"))
                {
                    //Deal with hits
                    // Don't block Thread with waiting until Sound finishs
                    new System.Threading.Thread(() =>
                    {
                        if (checkBoxSound.Checked)
                        {
                            spFlightBomb.PlaySync();
                        }

                        rtbLog.BeginInvoke((MethodInvoker) delegate()
                        {
                            rtbLog.AppendText(i18n.GetText("shotHit"));
                        });

                        pictureBox.BeginInvoke((MethodInvoker) delegate()
                        {
                            pictureBox       = (PictureBox)EnemyGrid.GetControlFromPosition(gridTarget.x, gridTarget.y);
                            pictureBox.Image = Properties.Resources.ShipHit;
                            pictureBox.Tag   = "ShipHit";
                        });

                        btnFire.BeginInvoke((MethodInvoker) delegate()
                        {
                            btnFire.Enabled = false;
                        });

                        myTurn = false;

                        rtbLog.BeginInvoke((MethodInvoker) delegate()
                        {
                            rtbLog.AppendText(i18n.GetText("waitEnemyShot"));;
                        });
                    }).Start();
                }
                else if (e.Command.Data.ToLower().Equals("miss"))
                {
                    //deal with misses
                    // Don't block Thread with waiting until Sound finishs
                    new System.Threading.Thread(() =>
                    {
                        if (checkBoxSound.Checked)
                        {
                            spFlightWater.PlaySync();
                        }

                        rtbLog.BeginInvoke((MethodInvoker) delegate()
                        {
                            rtbLog.AppendText(i18n.GetText("shotMissed"));
                        });

                        pictureBox.BeginInvoke((MethodInvoker) delegate()
                        {
                            pictureBox       = (PictureBox)EnemyGrid.GetControlFromPosition(gridTarget.x, gridTarget.y);
                            pictureBox.Image = Properties.Resources.WaterMiss;
                            pictureBox.Tag   = "WaterMiss";
                        });
                        btnFire.BeginInvoke((MethodInvoker) delegate() {
                            btnFire.Enabled = false;
                        });

                        myTurn = false;

                        rtbLog.BeginInvoke((MethodInvoker) delegate() {
                            rtbLog.AppendText(i18n.GetText("waitEnemyShot"));;
                        });
                    }).Start();
                }
            }
            if (e.Command.CommandType == CommandType.GameHitInform)
            {
                // Don't block Thread with waiting until Sound finishs
                new System.Threading.Thread(() =>
                {
                    if (checkBoxSound.Checked)
                    {
                        spFlightBomb.PlaySync();
                    }

                    rtbLog.BeginInvoke((MethodInvoker) delegate() {
                        rtbLog.AppendText(i18n.GetText("oneShipHit"));
                    });

                    gridTarget.x = int.Parse(e.Command.Data.Split(',')[0]);
                    gridTarget.y = int.Parse(e.Command.Data.Split(',')[1]);

                    pictureBox.BeginInvoke((MethodInvoker) delegate()
                    {
                        pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(gridTarget.x, gridTarget.y);
                        pictureBox.Image = Properties.Resources.ShipHit;
                    });

                    myTurn = true;

                    rtbLog.BeginInvoke((MethodInvoker) delegate() {
                        rtbLog.AppendText(i18n.GetText("turnToShot"));
                    });

                    btnFire.BeginInvoke((MethodInvoker) delegate()
                    {
                        btnFire.BackColor = System.Drawing.Color.Red;
                        btnFire.ForeColor = System.Drawing.Color.White;
                    });
                }).Start();
            }
            if (e.Command.CommandType == CommandType.GameMissInform)
            {
                // Don't block Thread with waiting until Sound finishs
                new System.Threading.Thread(() =>
                {
                    if (checkBoxSound.Checked)
                    {
                        spFlightWater.PlaySync();
                    }

                    rtbLog.BeginInvoke((MethodInvoker) delegate() {
                        rtbLog.AppendText(i18n.GetText("opponentMissedFleet"));
                    });

                    gridTarget.x = int.Parse(e.Command.Data.Split(',')[0]);
                    gridTarget.y = int.Parse(e.Command.Data.Split(',')[1]);

                    pictureBox.BeginInvoke((MethodInvoker) delegate()
                    {
                        pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(gridTarget.x, gridTarget.y);
                        pictureBox.Image = Properties.Resources.WaterMiss;
                    });

                    myTurn = true;

                    rtbLog.BeginInvoke((MethodInvoker) delegate() {
                        rtbLog.AppendText(i18n.GetText("turnToShot"));
                    });

                    btnFire.BeginInvoke((MethodInvoker) delegate()
                    {
                        btnFire.BackColor = System.Drawing.Color.Red;
                        btnFire.ForeColor = System.Drawing.Color.White;
                    });
                }).Start();
            }
            if (e.Command.CommandType == CommandType.GameOverInform)
            {
                if (e.Command.Data.ToLower() == "win")
                {
                    Command cmdInform = new Command(CommandType.GameOverInform, client.ServerIP, gameID + ":" + "win");
                    cmdInform.TargetPort = client.ServerPort;
                    cmdInform.SenderIP   = client.IP;
                    cmdInform.SenderPort = client.Port;
                    cmdInform.SenderName = client.Username;
                    client.Wins++;
                    client.SendCommand(cmdInform);
                    MessageBox.Show(i18n.GetText("wonCongratulations", client.Username), i18n.GetText("winner"), MessageBoxButtons.OK);
                    Close();
                }
                else if (e.Command.Data.ToLower() == "loss")
                {
                    Command cmdInform = new Command(CommandType.GameOverInform, client.ServerIP, gameID + ":" + "loss");
                    cmdInform.TargetPort = client.ServerPort;
                    cmdInform.SenderIP   = client.IP;
                    cmdInform.SenderPort = client.Port;
                    cmdInform.SenderName = client.Username;
                    client.Losses++;
                    client.SendCommand(cmdInform);
                    MessageBox.Show(i18n.GetText("lossGame", client.Username), i18n.GetText("gameLost"), MessageBoxButtons.OK);
                    Close();
                }
            }
        }
        private void PlayerGrid_Click(object sender, EventArgs e)
        {
            Control control = (Control)sender;

            switch (selectedShipType)
            {
                #region Destroyer
            case ShipType.Destroyer:
                if (shipPositions[0, 0] == null)
                {
                    shipPositions[0, 0] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                }
                else if (shipPositions[0, 1] == null)
                {
                    shipPositions[0, 1] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                    if (PlaceShip(ShipType.Destroyer) == false)
                    {
                        MessageBox.Show(i18n.GetText("invalidPlacement", i18n.GetText("shipName1")), i18n.GetText("invalidPlacementTitle"), MessageBoxButtons.OK);
                        shipPositions[0, 0] = null;
                        shipPositions[0, 1] = null;
                    }
                    else
                    {
                        for (int i = 0; i < destroyer.occupiedSquares.Length; i++)
                        {
                            pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(destroyer.occupiedSquares[i].x, destroyer.occupiedSquares[i].y);
                            pictureBox.Image = Properties.Resources.Ship;
                        }
                        btnDestroyer.Enabled = false;
                        btnDestroyer.Text    = i18n.GetText("shipPlaced");
                    }
                }
                break;

                #endregion
                #region Cruiser
            case ShipType.Cruiser:
                if (shipPositions[1, 0] == null)
                {
                    shipPositions[1, 0] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                }
                else if (shipPositions[1, 1] == null)
                {
                    shipPositions[1, 1] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                    if (PlaceShip(ShipType.Cruiser) == false)
                    {
                        MessageBox.Show(i18n.GetText("invalidPlacement", i18n.GetText("shipName2")), i18n.GetText("invalidPlacementTitle"), MessageBoxButtons.OK);
                        shipPositions[1, 0] = null;
                        shipPositions[1, 1] = null;
                    }
                    else
                    {
                        for (int i = 0; i < cruiser.occupiedSquares.Length; i++)
                        {
                            pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(cruiser.occupiedSquares[i].x, cruiser.occupiedSquares[i].y);
                            pictureBox.Image = Properties.Resources.Ship;
                        }
                        btnCruiser.Enabled = false;
                        btnCruiser.Text    = i18n.GetText("shipPlaced");
                    }
                }
                break;

                #endregion
                #region Submarine
            case ShipType.Submarine:
                if (shipPositions[2, 0] == null)
                {
                    shipPositions[2, 0] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                }
                else if (shipPositions[2, 1] == null)
                {
                    shipPositions[2, 1] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                    if (PlaceShip(ShipType.Submarine) == false)
                    {
                        MessageBox.Show(i18n.GetText("invalidPlacement", i18n.GetText("shipName3")), i18n.GetText("invalidPlacementTitle"), MessageBoxButtons.OK);
                        shipPositions[2, 0] = null;
                        shipPositions[2, 1] = null;
                    }
                    else
                    {
                        for (int i = 0; i < submarine.occupiedSquares.Length; i++)
                        {
                            pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(submarine.occupiedSquares[i].x, submarine.occupiedSquares[i].y);
                            pictureBox.Image = Properties.Resources.Ship;
                        }
                        btnSubmarine.Enabled = false;
                        btnSubmarine.Text    = i18n.GetText("shipPlaced");
                    }
                }
                break;

                #endregion
                #region Battleship
            case ShipType.Battleship:
                if (shipPositions[3, 0] == null)
                {
                    shipPositions[3, 0] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                }
                else if (shipPositions[3, 1] == null)
                {
                    shipPositions[3, 1] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                    if (PlaceShip(ShipType.Battleship) == false)
                    {
                        MessageBox.Show(i18n.GetText("invalidPlacement", i18n.GetText("shipName4")), i18n.GetText("invalidPlacementTitle"), MessageBoxButtons.OK);
                        shipPositions[3, 0] = null;
                        shipPositions[3, 1] = null;
                    }
                    else
                    {
                        for (int i = 0; i < battleship.occupiedSquares.Length; i++)
                        {
                            pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(battleship.occupiedSquares[i].x, battleship.occupiedSquares[i].y);
                            pictureBox.Image = Properties.Resources.Ship;
                        }
                        btnBattleship.Enabled = false;
                        btnBattleship.Text    = i18n.GetText("shipPlaced");
                    }
                }
                break;

                #endregion
                #region Carrier
            case ShipType.Carrier:
                if (shipPositions[4, 0] == null)
                {
                    shipPositions[4, 0] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                }
                else if (shipPositions[4, 1] == null)
                {
                    shipPositions[4, 1] = new GridPosition(PlayerGrid.GetPositionFromControl(control).Column, PlayerGrid.GetPositionFromControl(control).Row);
                    if (PlaceShip(ShipType.Carrier) == false)
                    {
                        MessageBox.Show(i18n.GetText("invalidPlacement", i18n.GetText("shipName5")), i18n.GetText("invalidPlacementTitle"), MessageBoxButtons.OK);
                        shipPositions[4, 0] = null;
                        shipPositions[4, 1] = null;
                    }
                    else
                    {
                        for (int i = 0; i < carrier.occupiedSquares.Length; i++)
                        {
                            pictureBox       = (PictureBox)PlayerGrid.GetControlFromPosition(carrier.occupiedSquares[i].x, carrier.occupiedSquares[i].y);
                            pictureBox.Image = Properties.Resources.Ship;
                        }
                        btnCarrier.Enabled = false;
                        btnCarrier.Text    = i18n.GetText("shipPlaced");;
                    }
                }
                break;
                #endregion
            }
            if (carrier != null && battleship != null && submarine != null && cruiser != null && destroyer != null)
            {
                btnSubmit.Enabled = true;
            }
        }