package jrummikub.control.network; import java.util.Iterator; import java.util.List; import java.util.UUID; import jrummikub.model.GameSettings; import jrummikub.model.PlayerSettings; import jrummikub.model.PlayerSettings.Type; import jrummikub.util.Event1; import jrummikub.util.GameData; import jrummikub.util.IEvent1; import jrummikub.util.IListener; import jrummikub.util.IListener1; import jrummikub.view.ISettingsPanel.SettingsError; import jrummikub.view.ISettingsPanel.SettingsMode; import jrummikub.view.IView; /** * Control for network game host */ public class GameOfferControl extends AbstractGameBeginControl { private Event1 gameStartEvent = new Event1(); /** * Creates new game offer control * * @param connectionControl * for events (listening and handling) * @param settings * the game settings for player list, colors, names * @param view * the view */ public GameOfferControl(final IConnectionControl connectionControl, final GameSettings settings, final IView view) { super(connectionControl, view, new GameData(UUID.randomUUID(), settings), SettingsMode.NETWORK_OFFER); addConnectionControlListeners(connectionControl, settings); connections.add(view.getSettingsPanel().getStartGameEvent() .add(new IListener() { @Override public void handle() { gameData.getGameSettings().getPlayerList(); if (checkPlayers()) { startGame(); } } })); checkPlayers(); } private boolean checkPlayers() { for (PlayerSettings s : gameData.getGameSettings().getPlayerList()) { if (s.getType() == Type.NETWORK) { view.getSettingsPanel().setError(SettingsError.NO_ERROR); view.getSettingsPanel().enableStartGameButton(true); return true; } } view.getSettingsPanel().setError(SettingsError.WAITING_FOR_PLAYERS); view.getSettingsPanel().enableStartGameButton(false); return false; } private void addConnectionControlListeners( final IConnectionControl connectionControl, final GameSettings settings) { connections.add(connectionControl.getGameJoinEvent().add( new IListener1() { @Override public void handle(String sender) { for (PlayerSettings player : settings.getPlayerList()) { if (player.getType() == Type.VACANT) { player.setName(sender); player.setType(Type.NETWORK); updateSettingsPanel(); checkPlayers(); connectionControl.ackJoinGame(sender, true); connectionControl.offerGame(gameData); return; } } connectionControl.ackJoinGame(sender, false); } })); connections.add(connectionControl.getGameLeaveEvent().add( new IListener1() { @Override public void handle(String sender) { handleLeave(sender); } })); connections.add(connectionControl.getParticipantLeftEvent().add( new IListener1() { @Override public void handle(String nickname) { handleLeave(nickname); } })); } private void handleLeave(String nickname) { List players = gameData.getGameSettings().getPlayerList(); for (PlayerSettings s : players) { if (s.getName().equals(nickname) && s.getType() == Type.NETWORK) { s.setType(Type.VACANT); s.setName("Offen"); updateSettingsPanel(); checkPlayers(); connectionControl.offerGame(gameData); return; } } } /** * The event that is emitted when the game is started * * @return the event */ public IEvent1 getStartGameEvent() { return gameStartEvent; } private void startGame() { abort(); connectionControl.startGame(); GameSettings settings = gameData.getGameSettings(); removeVacant(settings); gameStartEvent.emit(settings); } private void removeVacant(GameSettings settings) { Iterator it = settings.getPlayerList().iterator(); while (it.hasNext()) { if (it.next().getType() == Type.VACANT) { it.remove(); } } } /** * sends the game offer and starts the settings panel for host using network * offer type */ public void startGameOffer() { connectionControl.offerGame(gameData); view.showSettingsPanel(true); } @Override protected void goBack() { abort(); connectionControl.withdrawGame(); backEvent.emit(); } }