@Override
	public GameDescription createGame(CreateGameRequest request) throws InvalidGamesRequest {
		if(request == null || !request.validate()) {
			throw new InvalidGamesRequest("Error: invalid create game request");
		}
		
		//
		// Update gameDescriptionsList
		//
		
		GameDescription newGameDescription = new GameDescription(request.getName(), this.gameDescriptionsList.size(), new ArrayList<PlayerDescription>(4));
		gameDescriptionsList.add(newGameDescription);
		
		
		//
		// Update gameModelsList
		//
		
		// Randomize as Requested
		ArrayList<Hex> hexes = (ArrayList<Hex>) ((request.isRandomTiles()) ? this.getRandomTiles(ModelDefaults.getDefualtHexes()) : ModelDefaults.getDefualtHexes());
		hexes = (ArrayList<Hex>) ((request.isRandomNumbers()) ? this.getRandomChits(hexes) : hexes);
		ArrayList<Port> ports = (ArrayList<Port>) ((request.isRandomPorts()) ? this.getRandomPorts(ModelDefaults.getDefaultPorts()) : ModelDefaults.getDefaultPorts());

		// Update Robber Location
		HexLocation robberLocation = new HexLocation(0, -2);
		for(Hex h: hexes) {
			if(h.getResourceType() == null) {
				robberLocation = new HexLocation(h.getLocation().getX(), h.getLocation().getY());
				break;
			}
		}
		
		Map newGameMap = new Map(hexes, ports, robberLocation.getX(), robberLocation.getY());
		@SuppressWarnings("serial")
		ArrayList<Player> newGamePlayers = new ArrayList<Player>(4) {{
			add(null);
			add(null);
			add(null);
			add(null);
		}};
		
		this.gameModelsList.add(new ServerModel(newGameMap, newGamePlayers));
		
		return newGameDescription;
	}