public static GameState Deserialize(string s)
{
string[] ss = s.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
GameState gs = new GameState(GameType.Match);
gs.board = Board.Deserialize(ss[1]);
ss = ss[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
int i = 0;
gs.crawford = bool.Parse(ss[i]);
i++;
gs.cube.Owner = int.Parse(ss[i]);
i++;
gs.cube.Value = int.Parse(ss[i]);
i++;
gs.dice[0] = int.Parse(ss[i]);
i++;
gs.dice[1] = int.Parse(ss[i]);
i++;
gs.game_type = (GameType)Enum.Parse(typeof(GameType), ss[i]);
i++;
gs.limit = int.Parse(ss[i]);
i++;
gs.match_to = int.Parse(ss[i]);
i++;
gs.offer = (OfferType)Enum.Parse(typeof(OfferType), ss[i]);
i++;
gs.player_on_roll = int.Parse(ss[i]);
i++;
gs.player_on_turn = int.Parse(ss[i]);
i++;
gs.resign_offer_value = (ResignValue)Enum.Parse(typeof(ResignValue), ss[i]);
i++;
gs.score[0] = int.Parse(ss[i]);
i++;
gs.score[1] = int.Parse(ss[i]);
i++;
gs.stake = int.Parse(ss[i]);
return(gs);
}