package mightypork.rogue; import java.io.File; import java.util.Locale; import java.util.logging.Level; import mightypork.gamecore.audio.SoundSystem; import mightypork.gamecore.control.BaseApp; import mightypork.gamecore.control.GameLoop; import mightypork.gamecore.control.bus.EventBus; import mightypork.gamecore.gui.screens.ScreenRegistry; import mightypork.gamecore.input.InputSystem; import mightypork.gamecore.input.KeyStroke; import mightypork.gamecore.input.Keys; import mightypork.gamecore.render.DisplaySystem; import mightypork.rogue.events.ActionRequest; import mightypork.rogue.events.ActionRequest.RequestType; import mightypork.rogue.screens.test_bouncyboxes.ScreenTestBouncy; import mightypork.rogue.screens.test_cat_sound.ScreenTestCat; import mightypork.rogue.screens.test_font.ScreenTestFont; import mightypork.utils.logging.Log; import mightypork.utils.logging.LogInstance; /** * Main class * * @author MightyPork */ public class App extends BaseApp { /** instance pointer */ private static BaseApp inst; /** * @param args */ public static void main(String[] args) { Config.init(); Config.save(); Thread.setDefaultUncaughtExceptionHandler(new CrashHandler()); inst = new App(); try { inst.start(); } catch (final Throwable t) { onCrash(t); } } /** * Handle a crash * * @param error */ public static void onCrash(Throwable error) { if (Log.ready()) { Log.e("The game has crashed!", error); } else { System.err.println("The game has crashed!"); error.printStackTrace(); } if (inst != null) inst.shutdown(); } @Override protected void preInit() { // to get dot instead of comma in floats Locale.setDefault(Locale.ENGLISH); } @Override protected LogInstance createLog() { final LogInstance log = Log.create("runtime", Paths.LOGS, 10); log.setFileLevel(Level.WARNING); log.setSysoutLevel(Level.ALL); log.enable(Config.LOGGING_ENABLED); log.enableSysout(Config.LOG_TO_STDOUT); return log; } @Override protected void initDisplay(DisplaySystem display) { display.createMainWindow(Const.WINDOW_W, Const.WINDOW_H, true, Config.START_IN_FS, Const.TITLEBAR); display.setTargetFps(Const.FPS_RENDER); } @Override protected void initSoundSystem(SoundSystem audio) { audio.setMasterVolume(1); } @Override protected void initKeystrokes(InputSystem input) { // Go fullscreen getInput().bindKeyStroke(new KeyStroke(Keys.KEY_F11), new Runnable() { @Override public void run() { getEventBus().send(new ActionRequest(RequestType.FULLSCREEN)); } }); // Take screenshot getInput().bindKeyStroke(new KeyStroke(Keys.KEY_F2), new Runnable() { @Override public void run() { getEventBus().send(new ActionRequest(RequestType.SCREENSHOT)); } }); // Exit getInput().bindKeyStroke(new KeyStroke(Keys.KEY_LCONTROL, Keys.KEY_Q), new Runnable() { @Override public void run() { getEventBus().send(new ActionRequest(RequestType.SHUTDOWN)); } }); } @Override protected GameLoop createLoop() { return new MainLoop(this); } @Override protected void initResources() { Res.load(this); } @Override protected void initScreens(ScreenRegistry screens) { screens.add(new ScreenTestBouncy(this)); screens.add(new ScreenTestCat(this)); screens.add(new ScreenTestFont(this)); screens.showScreen("test.bouncy"); } @Override protected File getLockFile() { return Paths.LOCK; } @Override protected void initChannels(EventBus bus) { super.initChannels(bus); // custom channels bus.addChannel(ActionRequest.class, ActionRequest.Listener.class); } }