/** * Gets current locale's resource bundle (UTF-8) * * @param baseName base name of the bundle * @return the resource bundle */ public static ResourceBundle getResourceBundle(String baseName) { File file = new File(AssetsConverter.getAssetsFolder()); try { URL[] urls = {file.toURI().toURL()}; ClassLoader loader = new URLClassLoader(urls); return ResourceBundle.getBundle(baseName, Locale.getDefault(), loader, new UTF8Control()); } catch (Exception e) { logger.log( Level.SEVERE, "Failed to locate the resource bundle " + baseName + " in " + file + "!", e); } // Works only from the IDE return ResourceBundle.getBundle(baseName, new UTF8Control()); }
@Override public void simpleInitApp() { // Distribution locator getAssetManager().registerLocator(AssetsConverter.getAssetsFolder(), FileLocator.class); // Initiate the title screen TitleScreenState gameLoader = new TitleScreenState() { @Override public Void onLoad() { try { long startTime = System.currentTimeMillis(); // Asset loaders // Sound getAssetManager().registerLoader(MP2Loader.class, "mp2"); // Camera sweep files getAssetManager() .registerLoader( CameraSweepDataLoader.class, CameraSweepDataLoader.CAMERA_SWEEP_DATA_FILE_EXTENSION); // Set the anisotropy asset listener setAnisotropy(); // Allow people to take screenshots ScreenshotAppState screenShotState = new ScreenshotAppState(SCREENSHOTS_FOLDER); stateManager.attach(screenShotState); // Recording video if (params.containsKey("record")) { float quality = (getUserSettings().getSettingFloat(Settings.Setting.RECORDER_QUALITY)); int frameRate = (getUserSettings().getSettingInteger(Settings.Setting.RECORDER_FPS)); getSettings().setFrameRate(frameRate); VideoRecorderAppState recorder = new VideoRecorderAppState(quality, frameRate); String folder = params.get("record"); if (folder == null) { folder = SCREENSHOTS_FOLDER; } if (!folder.endsWith(File.separator)) { folder = folder.concat(File.separator); } folder = folder .concat(getSettings().getTitle()) .concat("-") .concat(String.valueOf(System.currentTimeMillis() / 1000)) .concat(".avi"); recorder.setFile(new File(folder)); stateManager.attach(recorder); } // Nifty NiftyJmeDisplay niftyDisplay = getNifty(); // Validate the XML, great for debuging purposes List<String> guiXMLs = Arrays.asList("Interface/MainMenu.xml", "Interface/GameHUD.xml"); for (String xml : guiXMLs) { try { // niftyDisplay.getNifty().validateXml(xml); <-- // Amazingly buggy? } catch (Exception e) { throw new RuntimeException("GUI file " + xml + " failed to validate!", e); } } // Initialize persistent app states MainMenuState mainMenuState = new MainMenuState(!params.containsKey("level"), assetManager); mainMenuState.setEnabled(false); PlayerState playerState = new PlayerState(); playerState.setEnabled(false); stateManager.attach(mainMenuState); stateManager.attach(playerState); // Eventually we are going to use Nifty, the XML files take some time to parse niftyDisplay.getNifty().registerScreenController(mainMenuState, playerState); for (String xml : guiXMLs) { niftyDisplay.getNifty().addXml(xml); } // It is all a clever ruge, we don't actually load much here if (!params.containsKey("nomovies") && !params.containsKey("level")) { Thread.sleep(5000 - (System.currentTimeMillis() - startTime)); } } catch (InterruptedException ex) { // Doesn't matter } catch (Exception e) { logger.log(Level.SEVERE, "Failed to load the game!", e); app.stop(); } return null; } @Override public void onLoadComplete() { // FIXME: We need ambient light, but it may be different for different states. There // just seems to be a bug in BatchNodes concerning the removal of the light. So this is // temporary perhaps AmbientLight al = new AmbientLight(); al.setColor(ColorRGBA.White.multLocal(5f)); rootNode.addLight(al); if (params.containsKey("nomovies") || params.containsKey("level")) { startGame(); } else { // The fireworks! playIntro(); } } }; this.stateManager.attach(gameLoader); }
/** * Check that we have all we need to run this app * * @param app the app (we need asset managers etc.) * @return true if the app is ok for running! * @throws InterruptedException lots of threads waiting */ private static boolean checkSetup(final Main app) throws InterruptedException { boolean saveSetup = false; // First and foremost, the folder if (!checkDkFolder(dkIIFolder)) { logger.info("Dungeon Keeper II folder not found or valid! Prompting user!"); saveSetup = true; // Let the user select setLookNFeel(); DKFolderSelector frame = new DKFolderSelector() { @Override protected void continueOk(String path) { if (!path.endsWith(File.separator)) { dkIIFolder = path.concat(File.separator); } app.getSettings().putString(DKII_FOLDER_KEY, dkIIFolder); folderOk = true; } }; openFrameAndWait(frame); } else { folderOk = true; } // If the folder is ok, check the conversion if (folderOk && (AssetsConverter.conversionNeeded(app.getSettings()))) { logger.info("Need to convert the assets!"); saveSetup = true; // Convert setLookNFeel(); AssetManager assetManager = JmeSystem.newAssetManager( Thread.currentThread() .getContextClassLoader() .getResource( "com/jme3/asset/Desktop.cfg")); // Get temporary asset manager instance since // we not yet have one ourselves assetManager.registerLocator(AssetsConverter.getAssetsFolder(), FileLocator.class); DKConverter frame = new DKConverter(dkIIFolder, assetManager) { @Override protected void continueOk() { AssetsConverter.setConversionSettings(app.getSettings()); conversionOk = true; } }; openFrameAndWait(frame); } else if (folderOk) { conversionOk = true; } // If everything is ok, we might need to save the setup boolean result = (folderOk && conversionOk); if (result && saveSetup) { try { app.getSettings().save(new FileOutputStream(new File(SETTINGS_FILE))); } catch (IOException ex) { Logger.getLogger(Main.class.getName()) .log(Level.WARNING, "Settings file failed to save!", ex); } } return result; }