diff --git a/src/mightypork/gamecore/audio/DeferredAudio.java b/src/mightypork/gamecore/audio/DeferredAudio.java index c7dbcb0..d605b06 100644 --- a/src/mightypork/gamecore/audio/DeferredAudio.java +++ b/src/mightypork/gamecore/audio/DeferredAudio.java @@ -86,7 +86,7 @@ public class DeferredAudio extends BaseDeferredResource { @Override - protected synchronized final void loadResource(String resource) throws IOException + protected void loadResource(String resource) throws IOException { final String ext = FileUtils.getExtension(resource); diff --git a/src/mightypork/gamecore/audio/JointVolume.java b/src/mightypork/gamecore/audio/JointVolume.java index 9ea90b4..d07d237 100644 --- a/src/mightypork/gamecore/audio/JointVolume.java +++ b/src/mightypork/gamecore/audio/JointVolume.java @@ -2,7 +2,6 @@ package mightypork.gamecore.audio; import mightypork.utils.math.Calc; -import mightypork.utils.objects.Mutable; /** @@ -12,7 +11,7 @@ import mightypork.utils.objects.Mutable; */ public class JointVolume extends Volume { - private final Mutable[] volumes; + private final Volume[] volumes; /** @@ -34,7 +33,7 @@ public class JointVolume extends Volume { public Double get() { double d = super.get(); - for (final Mutable v : volumes) + for (final Volume v : volumes) d *= v.get(); return Calc.clampd(d, 0, 1); diff --git a/src/mightypork/gamecore/audio/SoundSystem.java b/src/mightypork/gamecore/audio/SoundSystem.java index d374999..9b54626 100644 --- a/src/mightypork/gamecore/audio/SoundSystem.java +++ b/src/mightypork/gamecore/audio/SoundSystem.java @@ -84,7 +84,7 @@ public class SoundSystem extends RootBusNode implements Updateable { @Override - public final void deinit() + public void deinit() { for (final DeferredAudio r : resources) { r.destroy(); diff --git a/src/mightypork/gamecore/control/AppAdapter.java b/src/mightypork/gamecore/control/AppAdapter.java index 035d070..4b00d34 100644 --- a/src/mightypork/gamecore/control/AppAdapter.java +++ b/src/mightypork/gamecore/control/AppAdapter.java @@ -53,7 +53,7 @@ public class AppAdapter implements AppAccess { @Override - public void shutdown() + public final void shutdown() { app.shutdown(); } diff --git a/src/mightypork/gamecore/control/BaseApp.java b/src/mightypork/gamecore/control/BaseApp.java index aef0820..5b5dfc8 100644 --- a/src/mightypork/gamecore/control/BaseApp.java +++ b/src/mightypork/gamecore/control/BaseApp.java @@ -15,7 +15,6 @@ import mightypork.gamecore.gui.screens.ScreenRegistry; import mightypork.gamecore.input.InputSystem; import mightypork.gamecore.loading.AsyncResourceLoader; import mightypork.gamecore.render.DisplaySystem; -import mightypork.rogue.util.SlickLogRedirector; import mightypork.utils.files.InstanceLock; import mightypork.utils.logging.Log; import mightypork.utils.logging.LogInstance; diff --git a/src/mightypork/gamecore/control/GameLoop.java b/src/mightypork/gamecore/control/GameLoop.java index 0fd8df5..6145f8e 100644 --- a/src/mightypork/gamecore/control/GameLoop.java +++ b/src/mightypork/gamecore/control/GameLoop.java @@ -22,7 +22,7 @@ public abstract class GameLoop extends AppModule implements MainLoopTaskRequest. private final Queue taskQueue = new ConcurrentLinkedQueue<>(); private TimerDelta timer; private Renderable rootRenderable; - private boolean running = true; + private volatile boolean running = true; /** @@ -85,14 +85,14 @@ public abstract class GameLoop extends AppModule implements MainLoopTaskRequest. @Override - protected final void deinit() + protected void deinit() { running = false; } @Override - public final synchronized void queueTask(Runnable request) + public synchronized void queueTask(Runnable request) { taskQueue.add(request); } diff --git a/src/mightypork/rogue/util/SlickLogRedirector.java b/src/mightypork/gamecore/control/SlickLogRedirector.java similarity index 85% rename from src/mightypork/rogue/util/SlickLogRedirector.java rename to src/mightypork/gamecore/control/SlickLogRedirector.java index bfbd343..9c2d066 100644 --- a/src/mightypork/rogue/util/SlickLogRedirector.java +++ b/src/mightypork/gamecore/control/SlickLogRedirector.java @@ -1,4 +1,4 @@ -package mightypork.rogue.util; +package mightypork.gamecore.control; import mightypork.utils.logging.LogInstance; @@ -6,6 +6,11 @@ import mightypork.utils.logging.LogInstance; import org.newdawn.slick.util.LogSystem; +/** + * Used to redirect slick log into main logger. + * + * @author MightyPork + */ public class SlickLogRedirector implements LogSystem { LogInstance l; diff --git a/src/mightypork/gamecore/control/bus/EventBus.java b/src/mightypork/gamecore/control/bus/EventBus.java index 623ae58..821bb7e 100644 --- a/src/mightypork/gamecore/control/bus/EventBus.java +++ b/src/mightypork/gamecore/control/bus/EventBus.java @@ -44,6 +44,7 @@ final public class EventBus implements Destroyable { */ public EventBus() { busThread = new QueuePollingThread(); + busThread.setDaemon(true); busThread.start(); } diff --git a/src/mightypork/gamecore/input/Action.java b/src/mightypork/gamecore/gui/Action.java similarity index 64% rename from src/mightypork/gamecore/input/Action.java rename to src/mightypork/gamecore/gui/Action.java index 9cef075..0be2efe 100644 --- a/src/mightypork/gamecore/input/Action.java +++ b/src/mightypork/gamecore/gui/Action.java @@ -1,4 +1,4 @@ -package mightypork.gamecore.input; +package mightypork.gamecore.gui; /** @@ -16,14 +16,23 @@ public abstract class Action implements Runnable { * * @param enable true to enable */ - public final void enable(boolean enable) + public void setEnabled(boolean enable) { this.enabled = enable; } + /** + * @return true if this action is enabled. + */ + public boolean isEnabled() + { + return enabled; + } + + @Override - public final void run() + public void run() { if (enabled) execute(); } diff --git a/src/mightypork/gamecore/gui/ActionTrigger.java b/src/mightypork/gamecore/gui/ActionTrigger.java new file mode 100644 index 0000000..b9a624b --- /dev/null +++ b/src/mightypork/gamecore/gui/ActionTrigger.java @@ -0,0 +1,12 @@ +package mightypork.gamecore.gui; + + +/** + * Element that can be assigned an action (ie. button); + * + * @author MightyPork + */ +public interface ActionTrigger { + + void setAction(Action action); +} diff --git a/src/mightypork/gamecore/gui/renderers/ElementHolder.java b/src/mightypork/gamecore/gui/renderers/ElementHolder.java index 3ad5dee..7395e3d 100644 --- a/src/mightypork/gamecore/gui/renderers/ElementHolder.java +++ b/src/mightypork/gamecore/gui/renderers/ElementHolder.java @@ -34,14 +34,14 @@ public abstract class ElementHolder extends BusNode implements PluggableRenderab @Override - public final void setContext(RectConstraint context) + public void setContext(RectConstraint context) { this.context = context; } @Override - public final void render() + public void render() { for (final Renderable element : elements) { element.render(); @@ -50,7 +50,7 @@ public abstract class ElementHolder extends BusNode implements PluggableRenderab @Override - public final Rect getRect() + public Rect getRect() { return context.getRect(); } @@ -70,7 +70,7 @@ public abstract class ElementHolder extends BusNode implements PluggableRenderab * * @param elem element; it's context will be set to the constraint. */ - public final void attach(PluggableRenderable elem) + public void attach(PluggableRenderable elem) { if (elem == null) return; diff --git a/src/mightypork/gamecore/gui/renderers/TextPainter.java b/src/mightypork/gamecore/gui/renderers/TextPainter.java index 327d7b7..0d68bd3 100644 --- a/src/mightypork/gamecore/gui/renderers/TextPainter.java +++ b/src/mightypork/gamecore/gui/renderers/TextPainter.java @@ -63,25 +63,25 @@ public class TextPainter extends PluggableRenderer { } - public final void setColor(RGB color) + public void setColor(RGB color) { this.color = color; } - public final void setAlign(Align align) + public void setAlign(Align align) { this.align = align; } - public final void setText(String text) + public void setText(String text) { this.text = new StringWrapper(text); } - public final void setText(StringProvider text) + public void setText(StringProvider text) { this.text = text; } diff --git a/src/mightypork/gamecore/gui/screens/Screen.java b/src/mightypork/gamecore/gui/screens/Screen.java index 7af498c..925b397 100644 --- a/src/mightypork/gamecore/gui/screens/Screen.java +++ b/src/mightypork/gamecore/gui/screens/Screen.java @@ -24,8 +24,8 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind private final KeyBindingPool keybindings = new KeyBindingPool(); - private boolean active; - private boolean needSetupViewport = false; + private volatile boolean active; + private volatile boolean needSetupViewport = false; public Screen(AppAccess app) { @@ -81,45 +81,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind /** - * Called when the screen becomes active - */ - @NoImpl - protected void onScreenEnter() - { - // - } - - - /** - * Called when the screen is no longer active - */ - @NoImpl - protected void onScreenLeave() - { - // - } - - - /** - * Update GUI for new screen size - * - * @param size screen size - */ - @NoImpl - protected void onSizeChanged(Coord size) - { - // - } - - - /** - * Render screen contents (context is ready for 2D rendering) - */ - protected abstract void renderScreen(); - - - /** - * @return true if screen is the curretn screen + * @return true if screen is the current screen */ public final boolean isActive() { @@ -128,7 +90,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @Override - public final void receive(ScreenChangeEvent event) + public void receive(ScreenChangeEvent event) { if (!isActive()) return; @@ -139,7 +101,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @Override - public final Rect getRect() + public Rect getRect() { return getDisplay().getRect(); } @@ -160,8 +122,46 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind } + /** + * Called when the screen becomes active + */ + @NoImpl + protected void onScreenEnter() + { + // + } + + + /** + * Called when the screen is no longer active + */ + @NoImpl + protected void onScreenLeave() + { + // + } + + + /** + * Update GUI for new screen size + * + * @param size screen size + */ + @NoImpl + protected void onSizeChanged(Coord size) + { + // + } + + + /** + * Render screen contents (context is ready for 2D rendering) + */ + protected abstract void renderScreen(); + + /** * @return screen identifier to be used for requests. */ - public abstract String getId(); + public abstract String getName(); } diff --git a/src/mightypork/gamecore/gui/screens/ScreenLayer.java b/src/mightypork/gamecore/gui/screens/ScreenLayer.java index cffc919..deaa8fc 100644 --- a/src/mightypork/gamecore/gui/screens/ScreenLayer.java +++ b/src/mightypork/gamecore/gui/screens/ScreenLayer.java @@ -51,7 +51,7 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable screens = new HashMap<>(); - private Screen active = null; + private volatile Screen active = null; public ScreenRegistry(AppAccess app) { @@ -22,9 +27,14 @@ public class ScreenRegistry extends AppModule implements ScreenRequestEvent.List } + /** + * Add a screen + * + * @param screen added screen + */ public void add(Screen screen) { - screens.put(screen.getId(), screen); + screens.put(screen.getName(), screen); addChildClient(screen); } diff --git a/src/mightypork/gamecore/input/ActionTrigger.java b/src/mightypork/gamecore/input/ActionTrigger.java deleted file mode 100644 index afc0e38..0000000 --- a/src/mightypork/gamecore/input/ActionTrigger.java +++ /dev/null @@ -1,7 +0,0 @@ -package mightypork.gamecore.input; - - -public interface ActionTrigger { - - void setAction(Action action); -} diff --git a/src/mightypork/gamecore/loading/AsyncResourceLoader.java b/src/mightypork/gamecore/loading/AsyncResourceLoader.java index e5f3a7f..38eb0c3 100644 --- a/src/mightypork/gamecore/loading/AsyncResourceLoader.java +++ b/src/mightypork/gamecore/loading/AsyncResourceLoader.java @@ -21,13 +21,15 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L public static void launch(BusAccess app) { - (new AsyncResourceLoader(app)).start(); + Thread loader = new AsyncResourceLoader(app); + loader.setDaemon(true); + loader.start(); } private final ExecutorService exs = Executors.newCachedThreadPool(); private final LinkedBlockingQueue toLoad = new LinkedBlockingQueue<>(); - private boolean stopped; + private volatile boolean stopped; private final BusAccess app; diff --git a/src/mightypork/gamecore/loading/BaseDeferredResource.java b/src/mightypork/gamecore/loading/BaseDeferredResource.java index 9040119..4532e04 100644 --- a/src/mightypork/gamecore/loading/BaseDeferredResource.java +++ b/src/mightypork/gamecore/loading/BaseDeferredResource.java @@ -17,8 +17,8 @@ import mightypork.utils.logging.LoggedName; public abstract class BaseDeferredResource implements DeferredResource, Destroyable { private final String resource; - private boolean loadFailed = false; - private boolean loadAttempted = false; + private volatile boolean loadFailed = false; + private volatile boolean loadAttempted = false; public BaseDeferredResource(String resource) { diff --git a/src/mightypork/gamecore/render/DisplaySystem.java b/src/mightypork/gamecore/render/DisplaySystem.java index 13df80b..d7a836a 100644 --- a/src/mightypork/gamecore/render/DisplaySystem.java +++ b/src/mightypork/gamecore/render/DisplaySystem.java @@ -6,7 +6,9 @@ import static org.lwjgl.opengl.GL11.*; import java.nio.ByteBuffer; import mightypork.gamecore.control.AppAccess; +import mightypork.gamecore.control.AppModule; import mightypork.gamecore.control.bus.clients.RootBusNode; +import mightypork.gamecore.control.bus.events.DestroyEvent; import mightypork.gamecore.control.bus.events.ScreenChangeEvent; import mightypork.gamecore.control.timing.FpsMeter; import mightypork.utils.logging.Log; @@ -21,7 +23,7 @@ import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; -public class DisplaySystem extends RootBusNode implements RectConstraint { +public class DisplaySystem extends AppModule implements RectConstraint { private DisplayMode windowDisplayMode; private int targetFps; @@ -204,7 +206,7 @@ public class DisplaySystem extends RootBusNode implements RectConstraint { /** * @return current FPS */ - public final long getFps() + public long getFps() { return fpsMeter.getFPS(); } diff --git a/src/mightypork/rogue/App.java b/src/mightypork/rogue/App.java index 15f6e73..62aee6c 100644 --- a/src/mightypork/rogue/App.java +++ b/src/mightypork/rogue/App.java @@ -89,6 +89,7 @@ public class App extends BaseApp { log.setSysoutLevel(Level.ALL); log.enable(Config.LOGGING_ENABLED); log.enableSysout(Config.LOG_TO_STDOUT); + return log; } @@ -182,6 +183,8 @@ public class App extends BaseApp { // custom channels bus.addChannel(ActionRequest.class, ActionRequest.Listener.class); + + bus.detailedLogging = true; } } diff --git a/src/mightypork/rogue/MainLoop.java b/src/mightypork/rogue/MainLoop.java index cdfe1a1..d8cd8ac 100644 --- a/src/mightypork/rogue/MainLoop.java +++ b/src/mightypork/rogue/MainLoop.java @@ -1,12 +1,21 @@ package mightypork.rogue; +import java.io.File; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + import mightypork.gamecore.control.BaseApp; import mightypork.gamecore.control.GameLoop; -import mightypork.gamecore.input.Action; +import mightypork.gamecore.gui.Action; +import mightypork.gamecore.render.DisplaySystem; +import mightypork.gamecore.render.Screenshot; import mightypork.rogue.events.ActionRequest; import mightypork.rogue.events.ActionRequest.RequestType; import mightypork.rogue.util.Utils; +import mightypork.utils.logging.Log; public class MainLoop extends GameLoop implements ActionRequest.Listener { @@ -33,7 +42,7 @@ public class MainLoop extends GameLoop implements ActionRequest.Listener { } } - /** Take a screenshot */ + /* Take a screenshot */ private final Action taskScreenshot = new Action() { @Override @@ -44,7 +53,7 @@ public class MainLoop extends GameLoop implements ActionRequest.Listener { } }; - /** Shutdown the application */ + /* Shutdown the application */ private final Action taskShutdown = new Action() { @Override @@ -54,7 +63,7 @@ public class MainLoop extends GameLoop implements ActionRequest.Listener { } }; - /** Toggle fullscreen */ + /* Toggle fullscreen */ private final Action taskFullscreen = new Action() { @Override @@ -63,4 +72,42 @@ public class MainLoop extends GameLoop implements ActionRequest.Listener { getDisplay().switchFullscreen(); } }; + + private class TaskTakeScreenshot implements Runnable { + + private final Screenshot scr; + + + public TaskTakeScreenshot() { + scr = DisplaySystem.takeScreenshot(); + } + + + @Override + public void run() + { + final DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + final String fname = df.format(new Date()); + + // generate unique filename + File file; + int index = 0; + while (true) { + file = new File(Paths.SCREENSHOTS, fname + (index > 0 ? "-" + index : "") + ".png"); + if (!file.exists()) break; + index++; + } + + Log.f3("Saving screenshot to file: " + file); + + // save to disk + try { + scr.save(file); + } catch (final IOException e) { + Log.e("Failed to save screenshot.", e); + } + } + + } + } diff --git a/src/mightypork/rogue/TaskTakeScreenshot.java b/src/mightypork/rogue/TaskTakeScreenshot.java deleted file mode 100644 index 24756a0..0000000 --- a/src/mightypork/rogue/TaskTakeScreenshot.java +++ /dev/null @@ -1,56 +0,0 @@ -package mightypork.rogue; - - -import java.io.File; -import java.io.IOException; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -import mightypork.gamecore.render.DisplaySystem; -import mightypork.gamecore.render.Screenshot; -import mightypork.utils.logging.Log; - - -public class TaskTakeScreenshot implements Runnable { - - private final Screenshot scr; - - - public TaskTakeScreenshot() { - scr = DisplaySystem.takeScreenshot(); - } - - - @Override - public void run() - { - final String fname = getUniqueScreenshotName(); - - // generate unique filename - File file; - int index = 0; - while (true) { - file = new File(Paths.SCREENSHOTS, fname + (index > 0 ? "-" + index : "") + ".png"); - if (!file.exists()) break; - index++; - } - - Log.f3("Saving screenshot to file: " + file); - - // save to disk - try { - scr.save(file); - } catch (final IOException e) { - Log.e("Failed to save screenshot.", e); - } - } - - - private static String getUniqueScreenshotName() - { - final DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); - return df.format(new Date()); - } - -} diff --git a/src/mightypork/rogue/screens/test_bouncyboxes/ScreenTestBouncy.java b/src/mightypork/rogue/screens/test_bouncyboxes/ScreenTestBouncy.java index 92077d4..dce9db8 100644 --- a/src/mightypork/rogue/screens/test_bouncyboxes/ScreenTestBouncy.java +++ b/src/mightypork/rogue/screens/test_bouncyboxes/ScreenTestBouncy.java @@ -35,7 +35,7 @@ public class ScreenTestBouncy extends LayeredScreen { @Override - public String getId() + public String getName() { return "test.bouncy"; } diff --git a/src/mightypork/rogue/screens/test_cat_sound/ScreenTestCat.java b/src/mightypork/rogue/screens/test_cat_sound/ScreenTestCat.java index bec4400..26bdb5b 100644 --- a/src/mightypork/rogue/screens/test_cat_sound/ScreenTestCat.java +++ b/src/mightypork/rogue/screens/test_cat_sound/ScreenTestCat.java @@ -57,7 +57,7 @@ public class ScreenTestCat extends LayeredScreen { @Override - public String getId() + public String getName() { return "test.cat"; } diff --git a/src/mightypork/rogue/screens/test_font/ScreenTestFont.java b/src/mightypork/rogue/screens/test_font/ScreenTestFont.java index 2c8638c..d23800c 100644 --- a/src/mightypork/rogue/screens/test_font/ScreenTestFont.java +++ b/src/mightypork/rogue/screens/test_font/ScreenTestFont.java @@ -36,7 +36,7 @@ public class ScreenTestFont extends Screen { @Override - public String getId() + public String getName() { return "test.font"; }