package games.strategy.engine.framework.startup.launcher; import java.awt.Component; import java.util.HashMap; import java.util.Set; import java.util.logging.Logger; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import games.strategy.debug.ClientLogger; import games.strategy.engine.framework.ServerGame; import games.strategy.engine.framework.message.PlayerListing; import games.strategy.engine.framework.startup.mc.GameSelectorModel; import games.strategy.engine.gamePlayer.IGamePlayer; import games.strategy.engine.random.IRandomSource; import games.strategy.engine.random.ScriptedRandomSource; import games.strategy.net.HeadlessServerMessenger; import games.strategy.net.Messengers; import games.strategy.util.ThreadUtil; public class LocalLauncher extends AbstractLauncher { private static final Logger s_logger = Logger.getLogger(ILauncher.class.getName()); private final IRandomSource m_randomSource; private final PlayerListing m_playerListing; public LocalLauncher(final GameSelectorModel gameSelectorModel, final IRandomSource randomSource, final PlayerListing playerListing) { super(gameSelectorModel); m_randomSource = randomSource; m_playerListing = playerListing; } @Override protected void launchInNewThread(final Component parent) { Exception exceptionLoadingGame = null; ServerGame game = null; try { m_gameData.doPreGameStartDataModifications(m_playerListing); final Messengers messengers = new Messengers(new HeadlessServerMessenger()); final Set<IGamePlayer> gamePlayers = m_gameData.getGameLoader().createPlayers(m_playerListing.getLocalPlayerTypes()); game = new ServerGame(m_gameData, gamePlayers, new HashMap<>(), messengers); game.setRandomSource(m_randomSource); // for debugging, we can use a scripted random source if (ScriptedRandomSource.useScriptedRandom()) { game.setRandomSource(new ScriptedRandomSource()); } m_gameData.getGameLoader().startGame(game, gamePlayers, m_headless); } catch (final MapNotFoundException e) { exceptionLoadingGame = e; } catch (final Exception ex) { ClientLogger.logQuietly(ex); exceptionLoadingGame = ex; } finally { m_gameLoadingWindow.doneWait(); } try { if (exceptionLoadingGame == null) { s_logger.fine("Game starting"); game.startGame(); s_logger.fine("Game over"); } } finally { // todo(kg), this does not occur on the swing thread, and this notifies setupPanel observers // having an oddball issue with the zip stream being closed while parsing to load default game. might be caused // by closing of stream while unloading map resources. ThreadUtil.sleep(100); m_gameSelectorModel.loadDefaultGame(parent); SwingUtilities.invokeLater(() -> JOptionPane.getFrameForComponent(parent).setVisible(true)); } } }