package jrummikub.control.network; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import jrummikub.control.SettingsControl; import jrummikub.model.GameSettings; import jrummikub.model.PlayerSettings; import jrummikub.model.PlayerSettings.Type; import jrummikub.view.ISettingsPanel; import jrummikub.view.IView; /** * Settings for network games, entered by host */ public class NetworkSettingsControl extends SettingsControl { private String nickname; /** * Creates a new network settings control * * @param connectionControl * for gameOffers * @param view * for events and handlers * @param settings * for playerNumber, color... */ public NetworkSettingsControl(String nickname, IView view, GameSettings settings) { this.nickname = nickname; this.view = view; this.settings = settings; view.getSettingsPanel().enableNetworkMode(true); view.getSettingsPanel().setPlayerNamesEditable( Collections. emptyList()); addFirstPlayer(); addPlayer(); addListeners(); } @Override protected void update() { view.getSettingsPanel().enableAddPlayerButton( settings.getPlayerList().size() < ISettingsPanel.PLAYER_COLORS.length); checkSettings(); List> choices = new ArrayList>(); List enableRemoveButtons = new ArrayList(); List playerNamesEditable = new ArrayList(); for (int i = 0; i < settings.getPlayerList().size(); i++) { if (i == 0) { choices.add(Collections.singletonList(Type.HUMAN)); enableRemoveButtons.add(false); } else { choices.add(Arrays.asList(Type.NETWORK, Type.COMPUTER)); enableRemoveButtons.add(settings.getPlayerList().size() > 2); } playerNamesEditable .add(settings.getPlayerList().get(i).getType() == Type.COMPUTER); } view.getSettingsPanel().enableRemovePlayerButtons(enableRemoveButtons); view.getSettingsPanel().setPlayerNamesEditable(playerNamesEditable); view.getSettingsPanel().setPlayerTypeChoices(choices); view.getSettingsPanel().setGameSettings(settings); } @Override protected void setPlayerType(int i, Type type) { Type oldType = settings.getPlayerList().get(i).getType(); settings.getPlayerList().get(i).setType(type); if (type == Type.NETWORK) { settings.getPlayerList().get(i).setName("Offen"); } else if (oldType != Type.COMPUTER && type == Type.COMPUTER) { // Find unused player name int num = 0; nameLoop: while (true) { num++; String playerName = "Computer " + num; for (PlayerSettings player : settings.getPlayerList()) { if (player.getType() == Type.COMPUTER && playerName.equals(player.getName())) { continue nameLoop; } } break; } settings.getPlayerList().get(i).setName("Computer " + num); } update(); } private void addFirstPlayer() { PlayerSettings playerSettings = new PlayerSettings(nickname, findUnusedColor()); settings.getPlayerList().add(playerSettings); } @Override protected void addPlayer() { if (settings.getPlayerList().size() >= ISettingsPanel.PLAYER_COLORS.length) { return; } PlayerSettings playerSettings = new PlayerSettings("Offen", findUnusedColor()); playerSettings.setType(Type.NETWORK); settings.getPlayerList().add(playerSettings); update(); } }