public void StartMatch(bool isWhitePlayer, string matchToken, ChessCom.VisionRules rules, ChessCom.TimeRules timeRules)
        {
            WriteTextNonInvoke("Starting match: " + matchToken + ", you are " + (isWhitePlayer?"white":"black"));
            WriteTextNonInvoke("Opponent username: "******"", To = ""
            };
            _lastMoveFrom = null;
            _lastMoveTo   = null;
            _killedPices.Clear();
            ClearBoard();
            var vr = new VisionRules
            {
                Enabled          = rules.Enabled,
                ViewMoveFields   = rules.ViewMoveFields,
                ViewRange        = rules.ViewRange,
                ViewCaptureField = rules.ViewCaptureField,
                PiceOverwrite    = new Dictionary <Pices, VisionRules>()
            };

            foreach (var keyValOR in rules.PiceOverwriter)
            {
                vr.PiceOverwrite.Add((Pices)keyValOR.Key, new VisionRules {
                    Enabled = keyValOR.Value.Enabled, ViewMoveFields = keyValOR.Value.ViewMoveFields, ViewRange = keyValOR.Value.ViewRange
                });
            }
            _whiteStaticTimeLeft       = new TimeSpan(0, timeRules.PlayerTime.Minutes, timeRules.PlayerTime.Seconds);
            _whiteTimeSpan             = _whiteStaticTimeLeft;
            lbWhiteTimeLeft.Content    = _whiteTimeSpan.ToString(@"mm\:ss");
            lbWhiteTimePerMove.Content = $"+{timeRules.SecondsPerMove}s";
            _blackStaticTimeLeft       = new TimeSpan(0, timeRules.PlayerTime.Minutes, timeRules.PlayerTime.Seconds);
            _blackTimeSpan             = _whiteStaticTimeLeft;
            lbBlackTimeLeft.Content    = _whiteTimeSpan.ToString(@"mm\:ss");
            lbBlackTimePerMove.Content = $"+{timeRules.SecondsPerMove}s";
            _timeRules = timeRules;

            _globalState = GlobalState.CreateStartState(vr);
            UpdateBoardFromGlobalState();
        }
        private void Field_PreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            //sender
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                Grid  fieldGrid  = (Grid)sender;
                Field clickState = _globalState.GetFieldAt(fieldGrid.Name);
                //Early escape not player pice
                if (_globalState.Selected == null)
                {
                    if (_globalState.WhiteTurn ? _clientIsPlayer == ClientIsPlayer.Black : _clientIsPlayer == ClientIsPlayer.White)
                    {
                        return;
                    }
                    if ((_globalState.WhiteTurn && Field.HasWhitePice(clickState)) || (!_globalState.WhiteTurn && Field.HasBlackPice(clickState)))
                    {
                        _globalState.Selected = fieldGrid.Name;
                        //_legalMoves = GameRules.GetLegalMoves(_globalState, new FieldState(_globalState.Selected, clickState));
                        ClearBoard();
                        UpdateBoardFromGlobalState();
                    }
                }
                else
                {
                    if (_globalState.IsLegalMove(fieldGrid.Name))
                    {
                        //(var name, var extraFieldList) = _legalMoves.Find((a) => a.Item1 == fieldGrid.Name);
                        WriteTextNonInvoke("I did move!");
                        //Pices killedPice = _globalState.DoMoveTo(fieldGrid.Name);
                        //if (killedPice != Pices.Non) _killedPices.Add(killedPice);
                        ChessCom.MatchEvent matchEvent = ChessCom.MatchEvent.Non;
                        //if (killedPice == Pices.WhiteKing) { matchEvent = ChessCom.MatchEvent.BlackWin;  }
                        //if (killedPice == Pices.BlackKing) { matchEvent = ChessCom.MatchEvent.WhiteWin;  }

                        if (_matchStream?.RequestStream != null)
                        {
                            int timespan;
                            if (_globalState.WhiteTurn)
                            {
                                timespan = (int)(_whiteStaticTimeLeft - _whiteTimeSpan).TotalSeconds;
                            }
                            else
                            {
                                //WriteTextInvoke($"_blackTimeSpan {_blackTimeSpan.TotalSeconds}, _blackStaticTimeLeft {_blackStaticTimeLeft.TotalSeconds}, diff sec {(_blackStaticTimeLeft + _blackTimeSpan).Seconds}");
                                timespan = (int)(_blackStaticTimeLeft - _blackTimeSpan).TotalSeconds;
                            }
                            _myLastMove = new ChessCom.Move {
                                From = _globalState.Selected, To = fieldGrid.Name, Timestamp = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow), SecSpent = timespan
                            };
                            _matchStream.RequestStream.WriteAsync(new ChessCom.MovePacket
                            {
                                AskingForDraw   = false,
                                CheatMatchEvent = matchEvent,
                                DoingMove       = true,
                                MatchToken      = _matchToken,
                                UserToken       = _userToken,
                                Move            = _myLastMove,
                            });
                        }

                        //_legalMoves.Clear();
                        _globalState.Selected = null;
                        //ClearBoard();
                        //UpdateBoardFromGlobalState();
                    }
                    //
                }
            }
            else if (e.RightButton == MouseButtonState.Pressed)
            {
                //_legalMoves.Clear();
                _globalState.Selected = null;
                ClearBoard();
                UpdateBoardFromGlobalState();
            }
        }