/** Called when the user hits play */
 @Override
 public ILauncher getLauncher() {
   // update local cache and write to disk before game starts
   final IForumPoster poster = (IForumPoster) m_forumPosterEditor.getBean();
   if (poster != null) {
     LocalBeanCache.INSTANCE.storeSerializable(poster.getClass().getCanonicalName(), poster);
   }
   final IEmailSender sender = (IEmailSender) m_emailSenderEditor.getBean();
   if (sender != null) {
     LocalBeanCache.INSTANCE.storeSerializable(sender.getClass().getCanonicalName(), sender);
   }
   final IWebPoster web = (IWebPoster) m_webPosterEditor.getBean();
   if (web != null) {
     LocalBeanCache.INSTANCE.storeSerializable(web.getClass().getCanonicalName(), web);
   }
   final IRemoteDiceServer server = (IRemoteDiceServer) m_diceServerEditor.getBean();
   LocalBeanCache.INSTANCE.storeSerializable(server.getDisplayName(), server);
   LocalBeanCache.INSTANCE.writeToDisk();
   // create local launcher
   final String gameUUID =
       (String) m_gameSelectorModel.getGameData().getProperties().get(GameData.GAME_UUID);
   final PBEMDiceRoller randomSource =
       new PBEMDiceRoller((IRemoteDiceServer) m_diceServerEditor.getBean(), gameUUID);
   final Map<String, String> playerTypes = new HashMap<>();
   final Map<String, Boolean> playersEnabled = new HashMap<>();
   for (final PBEMLocalPlayerComboBoxSelector player : m_playerTypes) {
     playerTypes.put(player.getPlayerName(), player.getPlayerType());
     playersEnabled.put(player.getPlayerName(), player.isPlayerEnabled());
   }
   // we don't need the playerToNode list, the
   // disable-able players, or the alliances
   // list, for a local game
   final PlayerListing pl =
       new PlayerListing(
           null,
           playersEnabled,
           playerTypes,
           m_gameSelectorModel.getGameData().getGameVersion(),
           m_gameSelectorModel.getGameName(),
           m_gameSelectorModel.getGameRound(),
           null,
           null);
   return new LocalLauncher(m_gameSelectorModel, randomSource, pl);
 }
 /**
  * Load the dice rollers from cache, if the game was a save game, the dice roller store is
  * selected
  *
  * @param data the game data
  */
 private void loadDiceServer(final GameData data) {
   final List<IRemoteDiceServer> diceRollers =
       new ArrayList<>(PropertiesDiceRoller.loadFromFile());
   diceRollers.add(new InternalDiceServer());
   for (final IRemoteDiceServer diceRoller : diceRollers) {
     final IRemoteDiceServer cached =
         (IRemoteDiceServer) LocalBeanCache.INSTANCE.getSerializable(diceRoller.getDisplayName());
     if (cached != null) {
       diceRoller.setCcAddress(cached.getCcAddress());
       diceRoller.setToAddress(cached.getToAddress());
       diceRoller.setGameId(cached.getGameId());
     }
   }
   m_diceServerEditor.setBeans(diceRollers);
   if (m_gameSelectorModel.isSavedGame()) {
     // get the dice roller from the save game, if any
     final IRemoteDiceServer roller = (IRemoteDiceServer) data.getProperties().get(DICE_ROLLER);
     if (roller != null) {
       m_diceServerEditor.setSelectedBean(roller);
     }
   }
 }