From bf5c1a5b93ecf07752be148d6948bf21e9d97f4b Mon Sep 17 00:00:00 2001 From: ondra Date: Mon, 19 May 2014 12:33:13 +0200 Subject: [PATCH] Refactoring; improved quit event; Merged KeyConfig and Config --- src/mightypork/gamecore/Config.java | 111 +++++++++++++- src/mightypork/gamecore/core/BaseApp.java | 62 ++++---- .../core/{ => events}/MainLoopRequest.java | 3 +- .../core/{ => events}/ShudownRequest.java | 7 +- .../gamecore/core/events/UserQuitRequest.java | 32 ++++ .../core/events/UserQuitRequestListener.java | 18 +++ .../gui/screens/impl/CrossfadeOverlay.java | 2 +- .../gamecore/input/InputSystem.java | 5 +- src/mightypork/gamecore/input/KeyConfig.java | 138 ------------------ .../resources/AsyncResourceLoader.java | 2 +- src/mightypork/rogue/Launcher.java | 4 +- src/mightypork/rogue/RogueApp.java | 12 +- src/mightypork/rogue/RogueKeys.java | 9 +- src/mightypork/rogue/screens/RogueScreen.java | 25 ++++ .../rogue/screens/game/ScreenGame.java | 14 +- .../layout_testing/LayoutTestScreen.java | 59 -------- .../rogue/screens/menu/ScreenMainMenu.java | 3 +- .../select_world/ScreenSelectWorld.java | 3 +- ...dListener.java => PlayerDeathHandler.java} | 2 +- .../rogue/world/events/PlayerKilledEvent.java | 4 +- .../rogue/world/gen/ScratchMap.java | 1 - .../rogue/world/gen/WorldCreator.java | 28 ++-- 22 files changed, 276 insertions(+), 268 deletions(-) rename src/mightypork/gamecore/core/{ => events}/MainLoopRequest.java (87%) rename src/mightypork/gamecore/core/{ => events}/ShudownRequest.java (62%) create mode 100644 src/mightypork/gamecore/core/events/UserQuitRequest.java create mode 100644 src/mightypork/gamecore/core/events/UserQuitRequestListener.java delete mode 100644 src/mightypork/gamecore/input/KeyConfig.java create mode 100644 src/mightypork/rogue/screens/RogueScreen.java delete mode 100644 src/mightypork/rogue/screens/layout_testing/LayoutTestScreen.java rename src/mightypork/rogue/world/events/{PlayerKilledListener.java => PlayerDeathHandler.java} (63%) diff --git a/src/mightypork/gamecore/Config.java b/src/mightypork/gamecore/Config.java index 800e278..3ed1afd 100644 --- a/src/mightypork/gamecore/Config.java +++ b/src/mightypork/gamecore/Config.java @@ -2,7 +2,12 @@ package mightypork.gamecore; import java.io.File; +import java.util.HashMap; +import java.util.Map; +import mightypork.gamecore.input.KeyStroke; +import mightypork.gamecore.input.Keys; +import mightypork.gamecore.util.files.config.Property; import mightypork.gamecore.util.files.config.PropertyManager; @@ -21,6 +26,79 @@ public class Config { void addOptions(PropertyManager prop); } + /** + * Key configurator access + */ + public static class KeyOpts { + + public void add(String cfgKey, String dataString) + { + KeyProperty kprop = new KeyProperty(prefixKey(cfgKey), KeyStroke.createFromDataString(dataString), null); + strokes.put(prefixKey(cfgKey), kprop); + cfg.putProperty(kprop); + } + } + + /** + * Key configurator + */ + public static interface KeySetup { + + public void addKeys(KeyOpts keys); + } + + /** + * Key property.
+ * The stored value must be invariant ({@link KeyStroke} is mutable). + * + * @author MightyPork + */ + public static class KeyProperty extends Property { + + public KeyProperty(String key, KeyStroke defaultValue, String comment) + { + super(key, defaultValue, comment); + } + + + @Override + public KeyStroke decode(String string, KeyStroke defval) + { + if (string != null) { + // keep it invariant + + final int backup_key = getValue().getKey(); + final int backup_mod = getValue().getMod(); + + getValue().fromDataString(string); + if (getValue().getKey() == Keys.NONE) { + getValue().setTo(backup_key, backup_mod); + } + } + + return getValue(); + } + + + @Override + public String encode(KeyStroke value) + { + return value.toDataString(); + } + + + @Override + public void setValue(Object value) + { + // keep it invariant + getValue().setTo(((KeyStroke) value).getKey(), ((KeyStroke) value).getMod()); + } + } + + + public static Config.KeyOpts keyOpts = new Config.KeyOpts(); + public static Map strokes = new HashMap<>(); + private static PropertyManager cfg; @@ -29,6 +107,13 @@ public class Config { cfg = new PropertyManager(file, comment); } + + public static void registerKeys(KeySetup layout) + { + layout.addKeys(keyOpts); + } + + public static void registerOptions(ConfigSetup cfgl) { @@ -48,15 +133,37 @@ public class Config { } - public static T get(String key) + public static T getOption(String key) { return cfg.getValue(key); } - public static void set(String key, T value) + public static void setOption(String key, T value) { cfg.setValue(key, value); } + + private static String prefixKey(String cfgKey) + { + return "key." + cfgKey; + } + + + public static KeyStroke getKey(String cfgKey) + { + final Config.KeyProperty kp = strokes.get(prefixKey(cfgKey)); + if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey); + return kp.getValue(); + } + + + public static void setKey(String cfgKey, int key, int mod) + { + final Config.KeyProperty kp = strokes.get(prefixKey(cfgKey)); + if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey); + + kp.getValue().setTo(key, mod); + } } diff --git a/src/mightypork/gamecore/core/BaseApp.java b/src/mightypork/gamecore/core/BaseApp.java index 2ac6dfc..8a5f618 100644 --- a/src/mightypork/gamecore/core/BaseApp.java +++ b/src/mightypork/gamecore/core/BaseApp.java @@ -11,6 +11,7 @@ import javax.swing.JOptionPane; import mightypork.gamecore.Config; import mightypork.gamecore.Config.ConfigSetup; +import mightypork.gamecore.Config.KeySetup; import mightypork.gamecore.WorkDir; import mightypork.gamecore.WorkDir.RouteSetup; import mightypork.gamecore.eventbus.EventBus; @@ -18,8 +19,6 @@ import mightypork.gamecore.eventbus.events.DestroyEvent; import mightypork.gamecore.gui.screens.ScreenRegistry; import mightypork.gamecore.gui.screens.impl.CrossfadeOverlay; import mightypork.gamecore.input.InputSystem; -import mightypork.gamecore.input.KeyConfig; -import mightypork.gamecore.input.KeyConfig.KeySetup; import mightypork.gamecore.logging.Log; import mightypork.gamecore.logging.SlickLogRedirector; import mightypork.gamecore.logging.writers.LogWriter; @@ -51,19 +50,25 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { private String logDir = "log"; private String logFilePrefix = "runtime"; + private String screenshotDir = "screenshots"; + private int logArchiveCount = 0; private boolean busLogging = false; + private String configFile = "settings.cfg"; private String configComment = "Main config file"; + public String lockFile = ".lock"; + private final List resourceLists = new ArrayList<>(); - private final List keyLists = new ArrayList<>(); + private final List keyLists = new ArrayList<>(); private final List configLists = new ArrayList<>(); private final List routeLists = new ArrayList<>(); private ResourceLoader resourceLoader = new AsyncResourceLoader(); private Level logLevel = Level.ALL; + public boolean sigleInstance; public void setConfigFile(BaseApp baseApp, String filename, String comment) @@ -79,7 +84,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { } - public void addKeys(KeySetup keys) + public void addKeys(Config.KeySetup keys) { keyLists.add(keys); } @@ -122,6 +127,12 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { { this.screenshotDir = path; } + + + public void setLockFile(String lockFile) + { + this.lockFile = lockFile; + } } // modules @@ -132,6 +143,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { private MainLoop gameLoop; private ScreenRegistry screenRegistry; private boolean started = false; + private boolean lockObtained = false; // init opt holder private final AppInitOptions opt = new AppInitOptions(); @@ -152,13 +164,12 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { } - public BaseApp(File workdir, boolean singleInstance) - { + public BaseApp(File workdir, boolean singleInstance) { WorkDir.init(workdir); Log.i("Using workdir: " + WorkDir.getWorkDir()); - if (singleInstance) initLock(); + opt.sigleInstance = singleInstance; } @@ -184,10 +195,8 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { */ protected void initialize() { - WorkDir.addPath("screenshots", opt.screenshotDir); - WorkDir.addPath("config", opt.configFile); - WorkDir.addPath("logs", opt.logDir); - + if (opt.sigleInstance) initLock(); + lockObtained = true; for (final RouteSetup rs : opt.routeLists) { WorkDir.registerRoutes(rs); @@ -195,18 +204,18 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { // apply configurations Config.init(WorkDir.getFile(opt.configFile), opt.configComment); + + // add keys to config for (final KeySetup l : opt.keyLists) { - KeyConfig.registerKeys(l); + Config.registerKeys(l); } - // add keys to config - Config.registerOptions(KeyConfig.inst()); - for (final ConfigSetup cfgl : opt.configLists) { - Config.registerOptions(cfgl); + // add options to config + for (final ConfigSetup c : opt.configLists) { + Config.registerOptions(c); } Config.load(); - /* * Setup logging */ @@ -215,15 +224,12 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { Log.setMainLogger(log); org.newdawn.slick.util.Log.setLogSystem(new SlickLogRedirector(log)); - Log.i("=== Starting initialization sequence ==="); - // pre-init hook Log.f2("Calling pre-init hook..."); preInit(); - /* * Event bus */ @@ -235,10 +241,9 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { /* * Ionizables */ - Log.f3("initializing ION..."); + Log.f3("Initializing ION save system..."); registerIonizables(); - /* * Display */ @@ -246,7 +251,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { displaySystem = new DisplaySystem(this); initDisplay(displaySystem); - /* * Audio */ @@ -254,7 +258,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { soundSystem = new SoundSystem(this); initSoundSystem(soundSystem); - /* * Input */ @@ -262,7 +265,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { inputSystem = new InputSystem(this); initInputSystem(inputSystem); - /* * Prepare main loop */ @@ -271,7 +273,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { gameLoop = createMainLoop(); gameLoop.setRootRenderable(screenRegistry); - /* * Load resources * @@ -288,7 +289,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { Res.load(rl); } - /* * Screen registry * @@ -381,7 +381,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { */ private void initLock() { - final File lock = WorkDir.getFile(".lock"); + final File lock = WorkDir.getFile(opt.lockFile); if (!InstanceLock.onFile(lock)) { onLockError(); return; @@ -399,6 +399,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { * Triggered when lock cannot be obtained.
* App should terminate gracefully. */ + protected void onLockError() { Log.e("Could not obtain lock file.\nOnly one instance can run at a time."); @@ -406,7 +407,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { //@formatter:off JOptionPane.showMessageDialog( null, - "Another instance is already running.", + "Another instance is already running.\n(Delete the "+opt.lockFile +" file in the working directory to override)", "Lock Error", JOptionPane.ERROR_MESSAGE ); @@ -444,9 +445,9 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { } - @DefaultImpl protected void beforeShutdown() { + if (lockObtained) Config.save(); } @@ -457,7 +458,6 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler { } - @DefaultImpl protected void onCrash(Throwable e) { Log.e("The game has crashed.", e); diff --git a/src/mightypork/gamecore/core/MainLoopRequest.java b/src/mightypork/gamecore/core/events/MainLoopRequest.java similarity index 87% rename from src/mightypork/gamecore/core/MainLoopRequest.java rename to src/mightypork/gamecore/core/events/MainLoopRequest.java index b251272..c6a9bae 100644 --- a/src/mightypork/gamecore/core/MainLoopRequest.java +++ b/src/mightypork/gamecore/core/events/MainLoopRequest.java @@ -1,6 +1,7 @@ -package mightypork.gamecore.core; +package mightypork.gamecore.core.events; +import mightypork.gamecore.core.MainLoop; import mightypork.gamecore.eventbus.BusEvent; import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent; diff --git a/src/mightypork/gamecore/core/ShudownRequest.java b/src/mightypork/gamecore/core/events/ShudownRequest.java similarity index 62% rename from src/mightypork/gamecore/core/ShudownRequest.java rename to src/mightypork/gamecore/core/events/ShudownRequest.java index 82e9667..bb848b3 100644 --- a/src/mightypork/gamecore/core/ShudownRequest.java +++ b/src/mightypork/gamecore/core/events/ShudownRequest.java @@ -1,17 +1,20 @@ -package mightypork.gamecore.core; +package mightypork.gamecore.core.events; +import mightypork.gamecore.core.MainLoop; import mightypork.gamecore.eventbus.BusEvent; +import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent; import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent; /** - * Shutdown request. Shutdown needs to execute on GL thread for display to + * Shutdown request, non-interactive. Shutdown needs to execute on GL thread for display to * deinit properly. * * @author MightyPork */ @SingleReceiverEvent +@NonConsumableEvent public class ShudownRequest extends BusEvent { @Override diff --git a/src/mightypork/gamecore/core/events/UserQuitRequest.java b/src/mightypork/gamecore/core/events/UserQuitRequest.java new file mode 100644 index 0000000..ba571b3 --- /dev/null +++ b/src/mightypork/gamecore/core/events/UserQuitRequest.java @@ -0,0 +1,32 @@ +package mightypork.gamecore.core.events; + + +import mightypork.gamecore.eventbus.BusEvent; +import mightypork.gamecore.eventbus.EventBus; + + +/** + * User quit request. This event is triggered when user clicks the "close" + * titlebar button, and if no client consumes it, the application will be shut + * down. + * + * @author MightyPork + */ +public class UserQuitRequest extends BusEvent { + + @Override + protected void handleBy(UserQuitRequestListener handler) + { + handler.onQuitRequest(this); + } + + + @Override + public void onDispatchComplete(EventBus bus) + { + if (!isConsumed()) { + bus.send(new ShudownRequest()); + } + } + +} diff --git a/src/mightypork/gamecore/core/events/UserQuitRequestListener.java b/src/mightypork/gamecore/core/events/UserQuitRequestListener.java new file mode 100644 index 0000000..358a08f --- /dev/null +++ b/src/mightypork/gamecore/core/events/UserQuitRequestListener.java @@ -0,0 +1,18 @@ +package mightypork.gamecore.core.events; + + +/** + * Quit request listener; implementing client can abort shutdown. + * + * @author MightyPork + */ +public interface UserQuitRequestListener { + + /** + * Intercept quit request.
+ * Consume the event to abort shutdown (ie. ask user to save) + * + * @param event quit request event. + */ + void onQuitRequest(UserQuitRequest event); +} diff --git a/src/mightypork/gamecore/gui/screens/impl/CrossfadeOverlay.java b/src/mightypork/gamecore/gui/screens/impl/CrossfadeOverlay.java index 89ca07a..b96020e 100644 --- a/src/mightypork/gamecore/gui/screens/impl/CrossfadeOverlay.java +++ b/src/mightypork/gamecore/gui/screens/impl/CrossfadeOverlay.java @@ -2,7 +2,7 @@ package mightypork.gamecore.gui.screens.impl; import mightypork.gamecore.core.AppAccess; -import mightypork.gamecore.core.ShudownRequest; +import mightypork.gamecore.core.events.ShudownRequest; import mightypork.gamecore.gui.components.painters.QuadPainter; import mightypork.gamecore.gui.events.ScreenRequest; import mightypork.gamecore.gui.screens.Overlay; diff --git a/src/mightypork/gamecore/input/InputSystem.java b/src/mightypork/gamecore/input/InputSystem.java index b1efb62..20a5d01 100644 --- a/src/mightypork/gamecore/input/InputSystem.java +++ b/src/mightypork/gamecore/input/InputSystem.java @@ -2,7 +2,8 @@ package mightypork.gamecore.input; import mightypork.gamecore.core.AppAccess; -import mightypork.gamecore.core.ShudownRequest; +import mightypork.gamecore.core.events.ShudownRequest; +import mightypork.gamecore.core.events.UserQuitRequest; import mightypork.gamecore.eventbus.clients.RootBusNode; import mightypork.gamecore.eventbus.events.Updateable; import mightypork.gamecore.input.KeyStroke.Edge; @@ -139,7 +140,7 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder { } if (Display.isCloseRequested()) { - getEventBus().send(new ShudownRequest()); + getEventBus().send(new UserQuitRequest()); } } diff --git a/src/mightypork/gamecore/input/KeyConfig.java b/src/mightypork/gamecore/input/KeyConfig.java deleted file mode 100644 index 2eab30f..0000000 --- a/src/mightypork/gamecore/input/KeyConfig.java +++ /dev/null @@ -1,138 +0,0 @@ -package mightypork.gamecore.input; - - -import java.util.HashMap; -import java.util.Map; - -import mightypork.gamecore.Config.ConfigSetup; -import mightypork.gamecore.util.files.config.Property; -import mightypork.gamecore.util.files.config.PropertyManager; - - -public class KeyConfig implements ConfigSetup { - - /** - * Key configurator - */ - public static interface KeySetup { - - public void addKeys(KeyOpts keys); - } - - /** - * Key configurator access - */ - public static class KeyOpts { - - public void add(String cfgKey, String dataString) - { - strokes.put(prefixKey(cfgKey), new KeyProperty(prefixKey(cfgKey), KeyStroke.createFromDataString(dataString), null)); - } - } - - - /** - * Key property.
- * The stored value must be invariant ({@link KeyStroke} is mutable). - * - * @author MightyPork - */ - private static class KeyProperty extends Property { - - public KeyProperty(String key, KeyStroke defaultValue, String comment) - { - super(key, defaultValue, comment); - } - - - @Override - public KeyStroke decode(String string, KeyStroke defval) - { - if (string != null) { - // keep it invariant - - final int backup_key = getValue().getKey(); - final int backup_mod = getValue().getMod(); - - getValue().fromDataString(string); - if (getValue().getKey() == Keys.NONE) { - getValue().setTo(backup_key, backup_mod); - } - } - - return getValue(); - } - - - @Override - public String encode(KeyStroke value) - { - return value.toDataString(); - } - - - @Override - public void setValue(Object value) - { - // keep it invariant - getValue().setTo(((KeyStroke) value).getKey(), ((KeyStroke) value).getMod()); - } - } - - - private static KeyConfig inst = new KeyConfig(); - public static KeyOpts keyOpts = new KeyOpts(); - - private static Map strokes = new HashMap<>(); - private static PropertyManager prop; - - - public static void registerKeys(KeySetup layout) - { - layout.addKeys(keyOpts); - } - - - public static String prefixKey(String cfgKey) - { - return "key." + cfgKey; - } - - - /** - * Add key options to a config manager - */ - @Override - public void addOptions(PropertyManager prop) - { - for (final KeyProperty kp : strokes.values()) { - prop.putProperty(kp); - } - - this.prop = prop; - } - - - public static KeyStroke get(String cfgKey) - { - final KeyProperty kp = strokes.get(prefixKey(cfgKey)); - if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey); - return kp.getValue(); - } - - - public static void set(String cfgKey, int key, int mod) - { - final KeyProperty kp = strokes.get(prefixKey(cfgKey)); - if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey); - - kp.getValue().setTo(key, mod); - prop.save(); - } - - - public static KeyConfig inst() - { - return inst; - } -} diff --git a/src/mightypork/gamecore/resources/AsyncResourceLoader.java b/src/mightypork/gamecore/resources/AsyncResourceLoader.java index 37b7730..c54bf62 100644 --- a/src/mightypork/gamecore/resources/AsyncResourceLoader.java +++ b/src/mightypork/gamecore/resources/AsyncResourceLoader.java @@ -5,7 +5,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; -import mightypork.gamecore.core.MainLoopRequest; +import mightypork.gamecore.core.events.MainLoopRequest; import mightypork.gamecore.eventbus.BusAccess; import mightypork.gamecore.eventbus.events.Destroyable; import mightypork.gamecore.logging.Log; diff --git a/src/mightypork/rogue/Launcher.java b/src/mightypork/rogue/Launcher.java index 19652da..bd24347 100644 --- a/src/mightypork/rogue/Launcher.java +++ b/src/mightypork/rogue/Launcher.java @@ -35,9 +35,9 @@ public class Launcher { } if (!localWorkdir) { - workdir = OsUtils.getHomeWorkDir(lwdDir); + workdir = OsUtils.getHomeWorkDir(".rogue-save"); } else { - workdir = new File(".rogue-save"); + workdir = new File(lwdDir); } } catch (final ArrayIndexOutOfBoundsException e) { diff --git a/src/mightypork/rogue/RogueApp.java b/src/mightypork/rogue/RogueApp.java index b6c0a08..d88109b 100644 --- a/src/mightypork/rogue/RogueApp.java +++ b/src/mightypork/rogue/RogueApp.java @@ -5,11 +5,11 @@ import java.io.File; import mightypork.gamecore.Config; import mightypork.gamecore.core.BaseApp; -import mightypork.gamecore.core.MainLoopRequest; +import mightypork.gamecore.core.events.MainLoopRequest; +import mightypork.gamecore.core.events.UserQuitRequest; import mightypork.gamecore.eventbus.BusEvent; import mightypork.gamecore.gui.screens.ScreenRegistry; import mightypork.gamecore.input.InputSystem; -import mightypork.gamecore.input.KeyConfig; import mightypork.gamecore.input.KeyStroke.Edge; import mightypork.gamecore.render.DisplaySystem; import mightypork.gamecore.render.events.FullscreenToggleRequest; @@ -20,7 +20,6 @@ import mightypork.rogue.events.RogueStateRequest; import mightypork.rogue.screens.FpsOverlay; import mightypork.rogue.screens.LoadingOverlay; import mightypork.rogue.screens.game.ScreenGame; -import mightypork.rogue.screens.layout_testing.LayoutTestScreen; import mightypork.rogue.screens.menu.ScreenMainMenu; import mightypork.rogue.screens.select_world.ScreenSelectWorld; import mightypork.rogue.world.Inventory; @@ -62,7 +61,7 @@ public final class RogueApp extends BaseApp { @Override protected void initDisplay(DisplaySystem display) { - display.createMainWindow(Const.WINDOW_W, Const.WINDOW_H, true, Config. get("opt.fullscreen"), Const.TITLEBAR); + display.createMainWindow(Const.WINDOW_W, Const.WINDOW_H, true, Config. getOption("opt.fullscreen"), Const.TITLEBAR); display.setTargetFps(Const.FPS_RENDER); } @@ -80,7 +79,6 @@ public final class RogueApp extends BaseApp { screens.addScreen("main_menu", new ScreenMainMenu(this)); screens.addScreen("select_world", new ScreenSelectWorld(this)); screens.addScreen("game", new ScreenGame(this)); - screens.addScreen("test.layout", new LayoutTestScreen(this)); screens.addOverlay(new FpsOverlay(this)); screens.addOverlay(new LoadingOverlay(this)); @@ -94,14 +92,14 @@ public final class RogueApp extends BaseApp { bindEventToKey(new FullscreenToggleRequest(), "global.fullscreen"); bindEventToKey(new ScreenshotRequest(), "global.screenshot"); - bindEventToKey(new RogueStateRequest(RogueState.EXIT), "global.quit"); + bindEventToKey(new UserQuitRequest(), "global.quit"); bindEventToKey(new RogueStateRequest(RogueState.MAIN_MENU), "global.menu"); } private void bindEventToKey(final BusEvent event, String strokeName) { - getInput().bindKey(KeyConfig.get(strokeName), Edge.RISING, new Runnable() { + getInput().bindKey(Config.getKey(strokeName), Edge.RISING, new Runnable() { @Override public void run() diff --git a/src/mightypork/rogue/RogueKeys.java b/src/mightypork/rogue/RogueKeys.java index f5415de..67bbfe6 100644 --- a/src/mightypork/rogue/RogueKeys.java +++ b/src/mightypork/rogue/RogueKeys.java @@ -1,14 +1,15 @@ package mightypork.rogue; -import mightypork.gamecore.input.KeyConfig.KeyOpts; -import mightypork.gamecore.input.KeyConfig.KeySetup; +import mightypork.gamecore.Config; +import mightypork.gamecore.Config.KeyOpts; +import mightypork.gamecore.Config.KeySetup; -public class RogueKeys implements KeySetup { +public class RogueKeys implements Config.KeySetup { @Override - public void addKeys(KeyOpts keys) + public void addKeys(Config.KeyOpts keys) { keys.add("global.quit", "CTRL+Q"); keys.add("global.menu", "CTRL+M"); diff --git a/src/mightypork/rogue/screens/RogueScreen.java b/src/mightypork/rogue/screens/RogueScreen.java new file mode 100644 index 0000000..d737e18 --- /dev/null +++ b/src/mightypork/rogue/screens/RogueScreen.java @@ -0,0 +1,25 @@ +package mightypork.rogue.screens; + +import mightypork.gamecore.core.AppAccess; +import mightypork.gamecore.core.events.UserQuitRequest; +import mightypork.gamecore.core.events.UserQuitRequestListener; +import mightypork.gamecore.gui.screens.LayeredScreen; +import mightypork.gamecore.util.annot.DefaultImpl; +import mightypork.rogue.RogueStateManager.RogueState; +import mightypork.rogue.events.RogueStateRequest; + + +public class RogueScreen extends LayeredScreen implements UserQuitRequestListener { + + public RogueScreen(AppAccess app) { + super(app); + } + + @Override + @DefaultImpl + public void onQuitRequest(UserQuitRequest event) + { + getEventBus().send(new RogueStateRequest(RogueState.EXIT)); + event.consume(); + } +} diff --git a/src/mightypork/rogue/screens/game/ScreenGame.java b/src/mightypork/rogue/screens/game/ScreenGame.java index 501b0d2..03aea5f 100644 --- a/src/mightypork/rogue/screens/game/ScreenGame.java +++ b/src/mightypork/rogue/screens/game/ScreenGame.java @@ -4,6 +4,7 @@ package mightypork.rogue.screens.game; import java.io.File; import mightypork.gamecore.core.AppAccess; +import mightypork.gamecore.core.events.UserQuitRequest; import mightypork.gamecore.gui.Action; import mightypork.gamecore.gui.ActionGroup; import mightypork.gamecore.gui.screens.LayeredScreen; @@ -15,14 +16,15 @@ import mightypork.gamecore.util.math.color.Color; import mightypork.rogue.Const; import mightypork.rogue.RogueStateManager.RogueState; import mightypork.rogue.events.RogueStateRequest; +import mightypork.rogue.screens.RogueScreen; import mightypork.rogue.world.PlayerFacade; import mightypork.rogue.world.WorldProvider; -import mightypork.rogue.world.events.PlayerKilledListener; +import mightypork.rogue.world.events.PlayerDeathHandler; import mightypork.rogue.world.events.WorldPauseRequest; import mightypork.rogue.world.events.WorldPauseRequest.PauseAction; -public class ScreenGame extends LayeredScreen implements PlayerKilledListener { +public class ScreenGame extends RogueScreen implements PlayerDeathHandler { public static final Color COLOR_BTN_GOOD = Color.fromHex(0x28CB2D); public static final Color COLOR_BTN_BAD = Color.fromHex(0xCB2828); @@ -252,7 +254,6 @@ public class ScreenGame extends LayeredScreen implements PlayerKilledListener { bindKey(new KeyStroke(Keys.L, Keys.MOD_CONTROL), Edge.RISING, actionLoad); bindKey(new KeyStroke(Keys.S, Keys.MOD_CONTROL), Edge.RISING, actionSave); - bindKey(new KeyStroke(Keys.Q, Keys.MOD_CONTROL), Edge.RISING, actionQuit); bindKey(new KeyStroke(Keys.ESCAPE), Edge.RISING, actionMenu); // add as actions - enableables. @@ -307,4 +308,11 @@ public class ScreenGame extends LayeredScreen implements PlayerKilledListener { { setState(GScrState.DEATH); } + + @Override + public void onQuitRequest(UserQuitRequest event) + { + actionQuit.run(); + event.consume(); + } } diff --git a/src/mightypork/rogue/screens/layout_testing/LayoutTestScreen.java b/src/mightypork/rogue/screens/layout_testing/LayoutTestScreen.java deleted file mode 100644 index 0b2384d..0000000 --- a/src/mightypork/rogue/screens/layout_testing/LayoutTestScreen.java +++ /dev/null @@ -1,59 +0,0 @@ -package mightypork.rogue.screens.layout_testing; - - -import mightypork.gamecore.core.AppAccess; -import mightypork.gamecore.gui.AlignX; -import mightypork.gamecore.gui.components.layout.linear.LinearGap; -import mightypork.gamecore.gui.components.layout.linear.LinearLayout; -import mightypork.gamecore.gui.components.layout.linear.LinearSquare; -import mightypork.gamecore.gui.components.painters.QuadPainter; -import mightypork.gamecore.gui.components.painters.TextPainter; -import mightypork.gamecore.gui.screens.LayeredScreen; -import mightypork.gamecore.gui.screens.Screen; -import mightypork.gamecore.gui.screens.ScreenLayer; -import mightypork.gamecore.resources.Res; -import mightypork.gamecore.util.math.color.pal.RGB; -import mightypork.gamecore.util.math.constraints.rect.Rect; - - -public class LayoutTestScreen extends LayeredScreen { - - class Layer1 extends ScreenLayer { - - public Layer1(Screen screen) - { - super(screen); - - final Rect testRect = root.shrink(root.width().perc(10), root.height().perc(45)); - - final LinearLayout ll = new LinearLayout(root, AlignX.CENTER); - ll.setRect(testRect); - root.add(ll); - - ll.add(new LinearSquare(new QuadPainter(RGB.RED))); - ll.add(new LinearGap(50)); - ll.add(new LinearSquare(new QuadPainter(RGB.ORANGE))); - ll.add(new LinearGap(100)); - ll.add(new LinearSquare(new QuadPainter(RGB.YELLOW))); - ll.add(new TextPainter(Res.getFont("tiny"), RGB.WHITE, "Text qjf'\"^")); - ll.add(new LinearSquare(new QuadPainter(RGB.GREEN))); - } - - - @Override - public int getZIndex() - { - return 10; - } - - } - - - public LayoutTestScreen(AppAccess app) - { - super(app); - - addLayer(new Layer1(this)); - } - -} diff --git a/src/mightypork/rogue/screens/menu/ScreenMainMenu.java b/src/mightypork/rogue/screens/menu/ScreenMainMenu.java index 504474a..254b4f2 100644 --- a/src/mightypork/rogue/screens/menu/ScreenMainMenu.java +++ b/src/mightypork/rogue/screens/menu/ScreenMainMenu.java @@ -23,6 +23,7 @@ import mightypork.gamecore.util.math.constraints.num.Num; import mightypork.gamecore.util.math.constraints.rect.Rect; import mightypork.rogue.RogueStateManager.RogueState; import mightypork.rogue.events.RogueStateRequest; +import mightypork.rogue.screens.RogueScreen; /** @@ -30,7 +31,7 @@ import mightypork.rogue.events.RogueStateRequest; * * @author MightyPork */ -public class ScreenMainMenu extends LayeredScreen { +public class ScreenMainMenu extends RogueScreen { public ScreenMainMenu(AppAccess app) diff --git a/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java b/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java index 95a18b5..36c555e 100644 --- a/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java +++ b/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java @@ -20,6 +20,7 @@ import mightypork.gamecore.util.math.color.pal.RGB; import mightypork.gamecore.util.math.constraints.rect.Rect; import mightypork.rogue.RogueStateManager.RogueState; import mightypork.rogue.events.RogueStateRequest; +import mightypork.rogue.screens.RogueScreen; /** @@ -27,7 +28,7 @@ import mightypork.rogue.events.RogueStateRequest; * * @author MightyPork */ -public class ScreenSelectWorld extends LayeredScreen { +public class ScreenSelectWorld extends RogueScreen { public ScreenSelectWorld(AppAccess app) diff --git a/src/mightypork/rogue/world/events/PlayerKilledListener.java b/src/mightypork/rogue/world/events/PlayerDeathHandler.java similarity index 63% rename from src/mightypork/rogue/world/events/PlayerKilledListener.java rename to src/mightypork/rogue/world/events/PlayerDeathHandler.java index 226e445..dc3da48 100644 --- a/src/mightypork/rogue/world/events/PlayerKilledListener.java +++ b/src/mightypork/rogue/world/events/PlayerDeathHandler.java @@ -1,7 +1,7 @@ package mightypork.rogue.world.events; -public interface PlayerKilledListener { +public interface PlayerDeathHandler { void onPlayerKilled(); } diff --git a/src/mightypork/rogue/world/events/PlayerKilledEvent.java b/src/mightypork/rogue/world/events/PlayerKilledEvent.java index 12ae850..4d4ea63 100644 --- a/src/mightypork/rogue/world/events/PlayerKilledEvent.java +++ b/src/mightypork/rogue/world/events/PlayerKilledEvent.java @@ -4,10 +4,10 @@ package mightypork.rogue.world.events; import mightypork.gamecore.eventbus.BusEvent; -public class PlayerKilledEvent extends BusEvent { +public class PlayerKilledEvent extends BusEvent { @Override - protected void handleBy(PlayerKilledListener handler) + protected void handleBy(PlayerDeathHandler handler) { handler.onPlayerKilled(); } diff --git a/src/mightypork/rogue/world/gen/ScratchMap.java b/src/mightypork/rogue/world/gen/ScratchMap.java index 0d96027..f4c3fb7 100644 --- a/src/mightypork/rogue/world/gen/ScratchMap.java +++ b/src/mightypork/rogue/world/gen/ScratchMap.java @@ -682,7 +682,6 @@ public class ScratchMap { public boolean addItemInMap(Item item, int tries) { - Log.f3("gen bounds: " + genMin + " -> " + genMax); return addItemInArea(item, genMin, genMax, tries); } diff --git a/src/mightypork/rogue/world/gen/WorldCreator.java b/src/mightypork/rogue/world/gen/WorldCreator.java index dfac5cd..aafebd5 100644 --- a/src/mightypork/rogue/world/gen/WorldCreator.java +++ b/src/mightypork/rogue/world/gen/WorldCreator.java @@ -26,6 +26,9 @@ public class WorldCreator { public static World createWorld(long seed) { synchronized (rand) { + + Log.f2("Generating a new world..."); + rand.setSeed(seed); final MapTheme theme = new ThemeBrick(); @@ -36,12 +39,15 @@ public class WorldCreator { // build the level rooms for (int floor = 1; floor <= 7; floor++) { + + Log.f3("Placing rooms for level: " + floor); + final LevelBuilder lb = prepareFloor(rand.nextLong(), floor, theme, floor == 7); levelBuilders[floor - 1] = lb; } - + Log.f3("Placing items..."); final List weaponsBasic = new ArrayList<>(); weaponsBasic.add(Items.ROCK); weaponsBasic.add(Items.BONE); @@ -85,8 +91,7 @@ public class WorldCreator { randomFood.add(Items.CHEESE); randomFood.add(Items.MEAT); - for (int level = 1; level <= 7; level++) { - + for (int level = 1; level <= 7; level++) { final LevelBuilder lb = levelBuilders[level - 1]; final Range amount = Range.make(1, level); @@ -96,7 +101,9 @@ public class WorldCreator { } - // place monsters + // place monsters + + Log.f3("Placing monsters..."); for (int level = 1; level <= 7; level++) { final LevelBuilder lb = levelBuilders[level - 1]; @@ -118,22 +125,25 @@ public class WorldCreator { // compile levels + Log.f3("Building levels..."); + int i=1; for (final LevelBuilder lb : levelBuilders) { + Log.f3("Building level "+i); w.addLevel(lb.build(w)); - } - + i++; + } w.createPlayer(); + Log.f2("World generation finished."); + return w; } } public static LevelBuilder prepareFloor(long seed, int floor, MapTheme theme, boolean lastLevel) throws WorldGenError - { - Log.f3("Generating level: " + floor); - + { final LevelBuilder lb = new LevelBuilder(128, theme, seed); lb.addRoom(Rooms.ENTRANCE, BuildOrder.FIRST, true);