public GameState Clone()
        {
            var gameState = new GameState();

            gameState.VictoryPoints         = VictoryPoints;
            gameState.Money                 = Money;
            gameState.NumberOfRounds        = NumberOfRounds;
            gameState.ResidualMoney         = ResidualMoney;
            gameState.RemainingBonusActions = RemainingBonusActions;
            gameState.Round                 = Round;

            gameState.Hand = Hand.Clone() as Hand;

            gameState.VineDeck          = VineDeck.Clone();
            gameState.OrderDeck         = OrderDeck.Clone();
            gameState.AutomaDeck        = AutomaDeck.Clone();
            gameState.SummerVisitorDeck = SummerVisitorDeck.Clone();
            gameState.WinterVisitorDeck = WinterVisitorDeck.Clone();

            gameState.Yoke         = Yoke.Clone() as Yoke;
            gameState.Trellis      = Trellis.Clone() as Trellis;
            gameState.Cottage      = Cottage.Clone() as Cottage;
            gameState.Windmill     = Windmill.Clone() as Windmill;
            gameState.Irigation    = Irigation.Clone() as Irigation;
            gameState.LargeCellar  = LargeCellar.Clone() as LargeCellar;
            gameState.TastingRoom  = TastingRoom.Clone() as TastingRoom;
            gameState.MediumCellar = MediumCellar.Clone() as MediumCellar;

            gameState.Field1 = Field1.Clone() as Field;
            gameState.Field2 = Field2.Clone() as Field;
            gameState.Field3 = Field3.Clone() as Field;

            gameState.Grande        = Grande.Clone() as Grande;
            gameState.NeutralWorker = NeutralWorker.Clone() as Worker;

            gameState._workers = new List <Worker>();
            for (var i = 0; i < 5; i++)
            {
                gameState._workers.Add(_workers[i].Clone() as Worker);
            }

            gameState._redGrapes = new List <Grape>();
            foreach (var redGrape in _redGrapes)
            {
                gameState._redGrapes.Add(redGrape.Clone() as Grape);
            }

            gameState._whiteGrapes = new List <Grape>();
            foreach (var whiteGrape in _whiteGrapes)
            {
                gameState._whiteGrapes.Add(whiteGrape.Clone() as Grape);
            }

            gameState._redWines = new List <Wine>();
            foreach (var redWine in _redWines)
            {
                gameState._redWines.Add(redWine.Clone() as Wine);
            }

            gameState._whiteWines = new List <Wine>();
            foreach (var whiteWine in _whiteWines)
            {
                gameState._whiteWines.Add(whiteWine.Clone() as Wine);
            }

            gameState._blushWines = new List <Wine>();
            foreach (var blushWine in _blushWines)
            {
                gameState._blushWines.Add(blushWine.Clone() as Wine);
            }

            gameState._sparklingWines = new List <Wine>();
            foreach (var sparklingWine in _sparklingWines)
            {
                gameState._sparklingWines.Add(sparklingWine.Clone() as Wine);
            }

            return(gameState);
        }