Huge frameworkization, config system rewrite

v5stable
Ondřej Hruška 10 years ago
parent 93cb73588f
commit c991523d0e
  1. 12
      src/mightypork/gamecore/Config.java
  2. 10
      src/mightypork/gamecore/ConfigSetup.java
  3. 50
      src/mightypork/gamecore/WorkDir.java
  4. 17
      src/mightypork/gamecore/app/MainLoopRequestListener.java
  5. 2
      src/mightypork/gamecore/core/AppAccess.java
  6. 6
      src/mightypork/gamecore/core/AppAccessAdapter.java
  7. 2
      src/mightypork/gamecore/core/AppModule.java
  8. 2
      src/mightypork/gamecore/core/AppSubModule.java
  9. 224
      src/mightypork/gamecore/core/BaseApp.java
  10. 14
      src/mightypork/gamecore/core/MainLoop.java
  11. 6
      src/mightypork/gamecore/core/MainLoopRequest.java
  12. 29
      src/mightypork/gamecore/core/ShudownRequest.java
  13. 11
      src/mightypork/gamecore/eventbus/BusEvent.java
  14. 7
      src/mightypork/gamecore/eventbus/EventBus.java
  15. 2
      src/mightypork/gamecore/eventbus/event_flags/DirectEvent.java
  16. 4
      src/mightypork/gamecore/eventbus/events/DestroyEvent.java
  17. 4
      src/mightypork/gamecore/eventbus/events/UpdateEvent.java
  18. 4
      src/mightypork/gamecore/gui/components/LayoutComponent.java
  19. 2
      src/mightypork/gamecore/gui/components/layout/ColumnLayout.java
  20. 2
      src/mightypork/gamecore/gui/components/layout/ConstraintLayout.java
  21. 2
      src/mightypork/gamecore/gui/components/layout/FlowColumnLayout.java
  22. 2
      src/mightypork/gamecore/gui/components/layout/FlowRowLayout.java
  23. 2
      src/mightypork/gamecore/gui/components/layout/GridLayout.java
  24. 2
      src/mightypork/gamecore/gui/components/layout/RowLayout.java
  25. 2
      src/mightypork/gamecore/gui/components/layout/linear/LinearLayout.java
  26. 4
      src/mightypork/gamecore/gui/events/LayoutChangeEvent.java
  27. 26
      src/mightypork/gamecore/gui/events/ViewportChangeEvent.java
  28. 2
      src/mightypork/gamecore/gui/screens/LayeredScreen.java
  29. 4
      src/mightypork/gamecore/gui/screens/Overlay.java
  30. 4
      src/mightypork/gamecore/gui/screens/Screen.java
  31. 4
      src/mightypork/gamecore/gui/screens/ScreenRegistry.java
  32. 7
      src/mightypork/gamecore/gui/screens/impl/CrossfadeOverlay.java
  33. 7
      src/mightypork/gamecore/input/InputSystem.java
  34. 48
      src/mightypork/gamecore/input/KeyConfig.java
  35. 7
      src/mightypork/gamecore/input/KeySetup.java
  36. 15
      src/mightypork/gamecore/logging/Log.java
  37. 20
      src/mightypork/gamecore/render/DisplaySystem.java
  38. 6
      src/mightypork/gamecore/render/Render.java
  39. 53
      src/mightypork/gamecore/render/TaskTakeScreenshot.java
  40. 2
      src/mightypork/gamecore/render/events/DisplayReadyEvent.java
  41. 2
      src/mightypork/gamecore/render/events/DisplayReadyListener.java
  42. 17
      src/mightypork/gamecore/render/events/FullscreenToggleRequest.java
  43. 15
      src/mightypork/gamecore/render/events/ScreenshotRequest.java
  44. 7
      src/mightypork/gamecore/render/events/ScreenshotRequestListener.java
  45. 2
      src/mightypork/gamecore/resources/AsyncResourceLoader.java
  46. 20
      src/mightypork/gamecore/resources/Res.java
  47. 2
      src/mightypork/gamecore/resources/ResourceLoader.java
  48. 12
      src/mightypork/gamecore/resources/ResourceSetup.java
  49. 8
      src/mightypork/gamecore/resources/audio/SoundRegistry.java
  50. 2
      src/mightypork/gamecore/resources/audio/SoundSystem.java
  51. 8
      src/mightypork/gamecore/resources/fonts/FontRegistry.java
  52. 8
      src/mightypork/gamecore/resources/textures/TextureRegistry.java
  53. 11
      src/mightypork/rogue/Launcher.java
  54. 36
      src/mightypork/rogue/RogueApp.java
  55. 2
      src/mightypork/rogue/RogueConfig.java
  56. 22
      src/mightypork/rogue/RogueKeys.java
  57. 123
      src/mightypork/rogue/RogueMainLoop.java
  58. 12
      src/mightypork/rogue/RogueResources.java
  59. 18
      src/mightypork/rogue/RogueRoutes.java
  60. 4
      src/mightypork/rogue/RogueStateManager.java
  61. 52
      src/mightypork/rogue/events/ActionRequest.java
  62. 4
      src/mightypork/rogue/events/RogueStateRequest.java
  63. 2
      src/mightypork/rogue/screens/FpsOverlay.java
  64. 2
      src/mightypork/rogue/screens/LoadingOverlay.java
  65. 4
      src/mightypork/rogue/screens/game/DeathLayer.java
  66. 2
      src/mightypork/rogue/screens/game/IngameNav.java
  67. 8
      src/mightypork/rogue/screens/game/ScreenGame.java
  68. 2
      src/mightypork/rogue/screens/layout_testing/LayoutTestScreen.java
  69. 10
      src/mightypork/rogue/screens/menu/ScreenMainMenu.java
  70. 14
      src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java
  71. 2
      src/mightypork/rogue/screens/select_world/WorldSlot.java

@ -13,6 +13,14 @@ import mightypork.gamecore.util.files.config.PropertyManager;
*/
public class Config {
/**
* Config setup. Used to populate the config file.
*/
public static interface ConfigSetup {
void addOptions(PropertyManager prop);
}
private static PropertyManager cfg;
@ -22,9 +30,9 @@ public class Config {
}
public static PropertyManager getProp()
public static void registerOptions(ConfigSetup cfgl)
{
return cfg;
cfgl.addOptions(cfg);
}

@ -1,10 +0,0 @@
package mightypork.gamecore;
import mightypork.gamecore.util.files.config.PropertyManager;
public interface ConfigSetup {
void addOptions(PropertyManager prop);
}

@ -2,6 +2,8 @@ package mightypork.gamecore;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import mightypork.gamecore.logging.Log;
@ -13,7 +15,28 @@ import mightypork.gamecore.logging.Log;
*/
public class WorkDir {
/**
* Route configurator.
*/
public static interface RouteSetup {
public void addRoutes(RouteOpts routeOpts);
}
/**
* Route configurator access
*/
public static class RouteOpts {
public void addPath(String alias, String path)
{
WorkDir.addPath(alias, path);
}
}
public static RouteOpts routeOpts = new RouteOpts();
private static File workdir;
private static Map<String, String> namedPaths = new HashMap<>();
public static void init(File workdir)
@ -22,6 +45,18 @@ public class WorkDir {
}
public static void addPath(String alias, String path)
{
namedPaths.put(alias, path);
}
public static void registerRoutes(RouteSetup rs)
{
rs.addRoutes(routeOpts);
}
/**
* Get workdir folder, create if not exists.
*
@ -30,9 +65,13 @@ public class WorkDir {
*/
public static File getDir(String path)
{
if (namedPaths.containsKey(path)) path = namedPaths.get(path);
final File f = new File(workdir, path);
if (!f.exists() && !f.mkdirs()) {
Log.w("Could not create a directory: " + f);
if (!f.exists()) {
if (!f.mkdirs()) {
Log.w("Could not create a directory: " + f + " (path: " + path + ")");
}
}
return f;
@ -47,10 +86,14 @@ public class WorkDir {
*/
public static File getFile(String path)
{
if (namedPaths.containsKey(path)) path = namedPaths.get(path);
final File f = new File(workdir, path);
// create the parent dir
getDir(f.getParent());
if (!f.getParent().equals(workdir)) {
f.getParentFile().mkdirs();
}
return f;
@ -61,4 +104,5 @@ public class WorkDir {
{
return workdir;
}
}

@ -1,17 +0,0 @@
package mightypork.gamecore.app;
/**
* {@link MainLoopRequest} listener
*
* @author MightyPork
*/
public interface MainLoopRequestListener {
/**
* Perform the requested action
*
* @param request
*/
void queueTask(Runnable request);
}

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.BusAccess;

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.EventBus;
@ -12,7 +12,7 @@ import mightypork.gamecore.resources.audio.SoundSystem;
*
* @author MightyPork
*/
public class LightAppModule implements AppAccess {
public class AppAccessAdapter implements AppAccess {
private final AppAccess app;
@ -20,7 +20,7 @@ public class LightAppModule implements AppAccess {
/**
* @param app app access
*/
public LightAppModule(AppAccess app)
public AppAccessAdapter(AppAccess app)
{
if (app == null) throw new NullPointerException("AppAccess instance cannot be null.");

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.clients.RootBusNode;

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.clients.BusNode;

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import java.io.File;
@ -10,15 +10,16 @@ import java.util.logging.Level;
import javax.swing.JOptionPane;
import mightypork.gamecore.Config;
import mightypork.gamecore.ConfigSetup;
import mightypork.gamecore.Config.ConfigSetup;
import mightypork.gamecore.WorkDir;
import mightypork.gamecore.WorkDir.RouteSetup;
import mightypork.gamecore.eventbus.EventBus;
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.KeySetup;
import mightypork.gamecore.input.KeyConfig.KeySetup;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.logging.SlickLogRedirector;
import mightypork.gamecore.logging.writers.LogWriter;
@ -43,6 +44,86 @@ import mightypork.gamecore.util.math.algo.Move;
*/
public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
/**
* Init options holder class
*/
public class AppInitOptions {
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";
private final List<ResourceSetup> resourceLists = new ArrayList<>();
private final List<KeySetup> keyLists = new ArrayList<>();
private final List<ConfigSetup> configLists = new ArrayList<>();
private final List<RouteSetup> routeLists = new ArrayList<>();
private ResourceLoader resourceLoader = new AsyncResourceLoader();
private Level logLevel = Level.ALL;
public void setConfigFile(BaseApp baseApp, String filename, String comment)
{
configFile = filename;
configComment = comment;
}
public void addConfig(ConfigSetup cfg)
{
configLists.add(cfg);
}
public void addKeys(KeySetup keys)
{
keyLists.add(keys);
}
public void addRoutes(RouteSetup keys)
{
routeLists.add(keys);
}
public void addResources(ResourceSetup res)
{
resourceLists.add(res);
}
public void setBusLogging(boolean yes)
{
busLogging = yes;
}
public void setLogOptions(String logDir, String filePrefix, int archivedCount, Level logLevel)
{
this.logDir = logDir;
this.logFilePrefix = filePrefix;
this.logArchiveCount = archivedCount;
this.logLevel = logLevel;
}
public void setResourceLoader(ResourceLoader resLoader)
{
resourceLoader = resLoader;
}
public void setScreenshotDir(String path)
{
this.screenshotDir = path;
}
}
// modules
private InputSystem inputSystem;
private DisplaySystem displaySystem;
@ -50,71 +131,34 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
private EventBus eventBus;
private MainLoop gameLoop;
private ScreenRegistry screenRegistry;
private boolean started = false;
private String logDirName = "log";
private String logFilePrefix = "runtime";
private int logArchiveCount = 0;
private boolean busLogging = false;
private String configFile = "settings.cfg";
private String configComment = "Main config file";
private final List<ResourceSetup> resourcesToLoad = new ArrayList<>();
private final List<KeySetup> keysToLoad = new ArrayList<>();
private final List<ConfigSetup> cfgsToLoad = new ArrayList<>();
private ResourceLoader resourceLoader = new AsyncResourceLoader();
private Level logLevel = Level.ALL;
// init opt holder
private final AppInitOptions opt = new AppInitOptions();
public BaseApp(File workdir, boolean singleInstance)
/**
* Get init options
*
* @return opt holder
*/
public AppInitOptions opt()
{
WorkDir.init(workdir);
if (started) {
throw new IllegalStateException("Cannot alter init options after starting the App.");
}
if (singleInstance) initLock();
}
public void setConfigFile(String filename, String comment)
{
this.configFile = filename;
this.configComment = comment;
return opt;
}
public void setLogOptions(String logDir, String filePrefix, int archived, Level logLevel)
{
this.logDirName = logDir;
this.logFilePrefix = filePrefix;
this.logArchiveCount = archived;
this.logLevel = logLevel;
}
public void setBusLogging(boolean yes)
{
this.busLogging = yes;
}
public void addResources(ResourceSetup res)
{
this.resourcesToLoad.add(res);
}
public void addKeys(KeySetup keys)
{
this.keysToLoad.add(keys);
}
public void addConfig(ConfigSetup cfg)
{
this.cfgsToLoad.add(cfg);
}
public void setResourceLoader(ResourceLoader resLoader)
public BaseApp(File workdir, boolean singleInstance)
{
this.resourceLoader = resLoader;
WorkDir.init(workdir);
Log.i("Using workdir: " + WorkDir.getWorkDir());
if (singleInstance) initLock();
}
@ -125,13 +169,12 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
{
Thread.setDefaultUncaughtExceptionHandler(this);
Log.i("Using workdir: " + WorkDir.getWorkDir());
initialize();
Log.i("Starting main loop...");
// open first screen
// open first screen
started = true;
gameLoop.start();
}
@ -141,13 +184,25 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
*/
protected void initialize()
{
Config.init(WorkDir.getFile(configFile), configComment);
for (final KeySetup l : keysToLoad) {
KeyConfig.addKeyLayout(l);
WorkDir.addPath("screenshots", opt.screenshotDir);
WorkDir.addPath("config", opt.configFile);
WorkDir.addPath("logs", opt.logDir);
for (final RouteSetup rs : opt.routeLists) {
WorkDir.registerRoutes(rs);
}
KeyConfig.inst().addOptions(Config.getProp());
for (final ConfigSetup cfgl : cfgsToLoad) {
cfgl.addOptions(Config.getProp());
// apply configurations
Config.init(WorkDir.getFile(opt.configFile), opt.configComment);
for (final KeySetup l : opt.keyLists) {
KeyConfig.registerKeys(l);
}
// add keys to config
Config.registerOptions(KeyConfig.inst());
for (final ConfigSetup cfgl : opt.configLists) {
Config.registerOptions(cfgl);
}
Config.load();
@ -155,8 +210,8 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
/*
* Setup logging
*/
final LogWriter log = Log.create(logFilePrefix, new File(WorkDir.getDir(logDirName), logFilePrefix + ".log"), logArchiveCount);
log.setLevel(logLevel);
final LogWriter log = Log.create(opt.logFilePrefix, new File(WorkDir.getDir(opt.logDir), opt.logFilePrefix + ".log"), opt.logArchiveCount);
log.setLevel(opt.logLevel);
Log.setMainLogger(log);
org.newdawn.slick.util.Log.setLogSystem(new SlickLogRedirector(log));
@ -164,16 +219,18 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
Log.i("=== Starting initialization sequence ===");
// hook
// pre-init hook
Log.f2("Calling pre-init hook...");
preInit();
/*
* Event bus
*/
Log.f2("Starting Event Bus...");
eventBus = new EventBus();
eventBus.detailedLogging = busLogging;
eventBus.subscribe(this);
eventBus.detailedLogging = opt.busLogging;
/*
* Ionizables
@ -181,6 +238,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
Log.f3("initializing ION...");
registerIonizables();
/*
* Display
*/
@ -188,6 +246,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
displaySystem = new DisplaySystem(this);
initDisplay(displaySystem);
/*
* Audio
*/
@ -195,6 +254,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
soundSystem = new SoundSystem(this);
initSoundSystem(soundSystem);
/*
* Input
*/
@ -202,6 +262,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
inputSystem = new InputSystem(this);
initInputSystem(inputSystem);
/*
* Prepare main loop
*/
@ -210,18 +271,24 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
gameLoop = createMainLoop();
gameLoop.setRootRenderable(screenRegistry);
/*
* Load resources
*
* Resources should be registered to banks, and AsyncResourceLoader will load them.
* Resources should be registered to registries, and AsyncResourceLoader will load them.
*/
Log.f1("Loading resources...");
resourceLoader.init(this);
if (opt.resourceLoader != null) {
opt.resourceLoader.init(this);
}
Res.init(this);
for (final ResourceSetup rl : resourcesToLoad) {
for (final ResourceSetup rl : opt.resourceLists) {
Res.load(rl);
}
/*
* Screen registry
*
@ -303,7 +370,10 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
*
* @return the game loop.
*/
protected abstract MainLoop createMainLoop();
protected MainLoop createMainLoop()
{
return new MainLoop(this);
}
/*
@ -408,7 +478,7 @@ public abstract class BaseApp implements AppAccess, UncaughtExceptionHandler {
getEventBus().destroy();
}
} catch (final Exception e) {
// ignore it
Log.e(e);
}
Log.i("Terminating...");

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import java.util.Queue;
@ -7,6 +7,8 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import mightypork.gamecore.eventbus.events.UpdateEvent;
import mightypork.gamecore.gui.screens.ScreenRegistry;
import mightypork.gamecore.render.Renderable;
import mightypork.gamecore.render.TaskTakeScreenshot;
import mightypork.gamecore.render.events.ScreenshotRequestListener;
import mightypork.gamecore.util.annot.DefaultImpl;
import mightypork.gamecore.util.math.timing.TimerDelta;
@ -16,7 +18,7 @@ import mightypork.gamecore.util.math.timing.TimerDelta;
*
* @author MightyPork
*/
public abstract class MainLoop extends AppModule implements MainLoopRequestListener {
public class MainLoop extends AppModule implements ScreenshotRequestListener {
private final Queue<Runnable> taskQueue = new ConcurrentLinkedQueue<>();
private TimerDelta timer;
@ -102,10 +104,16 @@ public abstract class MainLoop extends AppModule implements MainLoopRequestListe
}
@Override
public synchronized void queueTask(Runnable request)
{
taskQueue.add(request);
}
@Override
public void onScreenshotRequest()
{
queueTask(new TaskTakeScreenshot());
}
}

@ -1,4 +1,4 @@
package mightypork.gamecore.app;
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.BusEvent;
@ -11,7 +11,7 @@ import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
* @author MightyPork
*/
@SingleReceiverEvent
public class MainLoopRequest extends BusEvent<MainLoopRequestListener> {
public class MainLoopRequest extends BusEvent<MainLoop> {
private final Runnable task;
@ -26,7 +26,7 @@ public class MainLoopRequest extends BusEvent<MainLoopRequestListener> {
@Override
public void handleBy(MainLoopRequestListener handler)
public void handleBy(MainLoop handler)
{
handler.queueTask(task);
}

@ -0,0 +1,29 @@
package mightypork.gamecore.core;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
/**
* Shutdown request. Shutdown needs to execute on GL thread for display to
* deinit properly.
*
* @author MightyPork
*/
@SingleReceiverEvent
public class ShudownRequest extends BusEvent<MainLoop> {
@Override
public void handleBy(final MainLoop handler)
{
handler.queueTask(new Runnable() {
@Override
public void run()
{
handler.shutdown();
}
});
}
}

@ -2,7 +2,7 @@ package mightypork.gamecore.eventbus;
import mightypork.gamecore.eventbus.event_flags.DelayedEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.DirectEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
@ -14,7 +14,7 @@ import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
* </p>
* <p>
* Can be annotated as {@link SingleReceiverEvent} to be delivered once only,
* and {@link DelayedEvent} or {@link ImmediateEvent} to specify default sending
* and {@link DelayedEvent} or {@link DirectEvent} to specify default sending
* mode. When marked as {@link NotLoggedEvent}, it will not appear in detailed
* bus logging (useful for very frequent events, such as UpdateEvent).
* </p>
@ -111,4 +111,11 @@ public abstract class BusEvent<HANDLER> {
consumed = false;
}
/**
* Called after all clients have received the event.
*/
public void onDispatchComplete(EventBus bus)
{
}
}

@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit;
import mightypork.gamecore.eventbus.clients.DelegatingClient;
import mightypork.gamecore.eventbus.event_flags.DelayedEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.DirectEvent;
import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.eventbus.events.Destroyable;
import mightypork.gamecore.logging.Log;
@ -183,7 +183,7 @@ final public class EventBus implements Destroyable, BusAccess {
return;
}
if (Utils.hasAnnotation(event, ImmediateEvent.class)) {
if (Utils.hasAnnotation(event, DirectEvent.class)) {
sendDirect(event);
return;
}
@ -342,7 +342,10 @@ final public class EventBus implements Destroyable, BusAccess {
assertLive();
clients.setBuffering(true);
doDispatch(clients, event);
event.onDispatchComplete(this);
clients.setBuffering(false);
}

@ -13,4 +13,4 @@ import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Inherited
@Documented
public @interface ImmediateEvent {}
public @interface DirectEvent {}

@ -2,7 +2,7 @@ package mightypork.gamecore.eventbus.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.DirectEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
@ -11,7 +11,7 @@ import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
*
* @author MightyPork
*/
@ImmediateEvent
@DirectEvent
@NonConsumableEvent
public class DestroyEvent extends BusEvent<Destroyable> {

@ -2,7 +2,7 @@ package mightypork.gamecore.eventbus.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.DirectEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
@ -13,7 +13,7 @@ import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
* @author MightyPork
*/
@NotLoggedEvent
@ImmediateEvent
@DirectEvent
@NonConsumableEvent
public class UpdateEvent extends BusEvent<Updateable> {

@ -4,8 +4,8 @@ package mightypork.gamecore.gui.components;
import java.util.Collection;
import java.util.LinkedList;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppSubModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppSubModule;
import mightypork.gamecore.eventbus.EventBus;
import mightypork.gamecore.eventbus.clients.ClientHub;
import mightypork.gamecore.input.InputSystem;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.gui.components.LayoutComponent;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.gui.components.LayoutComponent;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignY;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.gui.components.LayoutComponent;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.gui.components.LayoutComponent;
import mightypork.gamecore.util.math.constraints.rect.builders.TiledRect;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.components.Component;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;

@ -1,7 +1,7 @@
package mightypork.gamecore.gui.components.layout.linear;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.DynamicWidthComponent;
import mightypork.gamecore.gui.components.LayoutComponent;

@ -2,7 +2,7 @@ package mightypork.gamecore.gui.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.DirectEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
@ -12,7 +12,7 @@ import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
*
* @author MightyPork
*/
@ImmediateEvent
@DirectEvent
@NonConsumableEvent
public class LayoutChangeEvent extends BusEvent<LayoutChangeListener> {

@ -16,39 +16,15 @@ import mightypork.gamecore.util.math.constraints.vect.Vect;
@NotLoggedEvent
public class ViewportChangeEvent extends BusEvent<ViewportChangeListener> {
private final boolean fullscreen;
private final Vect screenSize;
private final boolean fsChanged;
/**
* @param fsChanged fullscreen change triggered the event
* @param fullscreen is now fullscreen
* @param size new screen size
*/
public ViewportChangeEvent(boolean fsChanged, boolean fullscreen, Vect size)
public ViewportChangeEvent(Vect size)
{
this.fullscreen = fullscreen;
this.screenSize = size;
this.fsChanged = fsChanged;
}
/**
* @return true if screen is now fullscreen
*/
public boolean isFullscreen()
{
return fullscreen;
}
/**
* @return true if event was triggered by fullscreen toggle
*/
public boolean fullscreenChanged()
{
return fsChanged;
}

@ -5,7 +5,7 @@ import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.eventbus.clients.DelegatingClient;

@ -4,8 +4,8 @@ package mightypork.gamecore.gui.screens;
import java.util.Collection;
import java.util.LinkedHashSet;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppSubModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppSubModule;
import mightypork.gamecore.eventbus.events.Updateable;
import mightypork.gamecore.gui.Enableable;
import mightypork.gamecore.gui.Hideable;

@ -1,8 +1,8 @@
package mightypork.gamecore.gui.screens;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppSubModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppSubModule;
import mightypork.gamecore.gui.events.LayoutChangeEvent;
import mightypork.gamecore.gui.events.LayoutChangeListener;
import mightypork.gamecore.input.KeyBinder;

@ -6,8 +6,8 @@ import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppModule;
import mightypork.gamecore.gui.events.LayoutChangeEvent;
import mightypork.gamecore.gui.events.ScreenRequestListener;
import mightypork.gamecore.gui.events.ViewportChangeEvent;

@ -1,7 +1,8 @@
package mightypork.gamecore.gui.screens.impl;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.ShudownRequest;
import mightypork.gamecore.gui.components.painters.QuadPainter;
import mightypork.gamecore.gui.events.ScreenRequest;
import mightypork.gamecore.gui.screens.Overlay;
@ -9,8 +10,6 @@ import mightypork.gamecore.util.math.Easing;
import mightypork.gamecore.util.math.color.pal.RGB;
import mightypork.gamecore.util.math.constraints.num.mutable.NumAnimated;
import mightypork.gamecore.util.math.timing.TimedTask;
import mightypork.rogue.events.ActionRequest;
import mightypork.rogue.events.ActionRequest.RequestType;
public class CrossfadeOverlay extends Overlay {
@ -27,7 +26,7 @@ public class CrossfadeOverlay extends Overlay {
public void run()
{
if (requestedScreenName == null) {
getEventBus().send(new ActionRequest(RequestType.SHUTDOWN));
getEventBus().send(new ShudownRequest());
} else {
getEventBus().send(new ScreenRequest(requestedScreenName));
}

@ -1,7 +1,8 @@
package mightypork.gamecore.input;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.ShudownRequest;
import mightypork.gamecore.eventbus.clients.RootBusNode;
import mightypork.gamecore.eventbus.events.Updateable;
import mightypork.gamecore.input.KeyStroke.Edge;
@ -11,8 +12,6 @@ import mightypork.gamecore.input.events.MouseButtonEvent;
import mightypork.gamecore.input.events.MouseMotionEvent;
import mightypork.gamecore.util.math.constraints.vect.Vect;
import mightypork.gamecore.util.math.constraints.vect.mutable.VectVar;
import mightypork.rogue.events.ActionRequest;
import mightypork.rogue.events.ActionRequest.RequestType;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
@ -140,7 +139,7 @@ public class InputSystem extends RootBusNode implements Updateable, KeyBinder {
}
if (Display.isCloseRequested()) {
getEventBus().send(new ActionRequest(RequestType.SHUTDOWN));
getEventBus().send(new ShudownRequest());
}
}

@ -4,14 +4,32 @@ package mightypork.gamecore.input;
import java.util.HashMap;
import java.util.Map;
import mightypork.gamecore.ConfigSetup;
import mightypork.gamecore.Config.ConfigSetup;
import mightypork.gamecore.util.files.config.Property;
import mightypork.gamecore.util.files.config.PropertyManager;
public class KeyConfig implements ConfigSetup {
private static KeyConfig inst = new KeyConfig();
/**
* 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.<br>
@ -62,16 +80,28 @@ public class KeyConfig implements ConfigSetup {
}
private static KeyConfig inst = new KeyConfig();
public static KeyOpts keyOpts = new KeyOpts();
private static Map<String, KeyProperty> strokes = new HashMap<>();
private static PropertyManager prop;
public static void addKeyLayout(KeySetup layout)
public static void registerKeys(KeySetup layout)
{
layout.addKeys(keyOpts);
}
public static String prefixKey(String cfgKey)
{
layout.addKeys(inst);
return "key." + cfgKey;
}
/**
* Add key options to a config manager
*/
@Override
public void addOptions(PropertyManager prop)
{
@ -83,15 +113,9 @@ public class KeyConfig implements ConfigSetup {
}
public void add(String cfgKey, String dataString)
{
strokes.put(cfgKey, new KeyProperty(cfgKey, KeyStroke.createFromDataString(dataString), null));
}
public static KeyStroke get(String cfgKey)
{
final KeyProperty kp = strokes.get(cfgKey);
final KeyProperty kp = strokes.get(prefixKey(cfgKey));
if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey);
return kp.getValue();
}
@ -99,7 +123,7 @@ public class KeyConfig implements ConfigSetup {
public static void set(String cfgKey, int key, int mod)
{
final KeyProperty kp = strokes.get(cfgKey);
final KeyProperty kp = strokes.get(prefixKey(cfgKey));
if (kp == null) throw new IllegalArgumentException("No such stroke: " + cfgKey);
kp.getValue().setTo(key, mod);

@ -1,7 +0,0 @@
package mightypork.gamecore.input;
public interface KeySetup {
public void addKeys(KeyConfig keys);
}

@ -292,15 +292,18 @@ public class Log {
public static String formatMessage(Level level, String message, Throwable throwable, long start_ms)
{
if (message == null) message = "";
final String nl = System.getProperty("line.separator");
if (message.equals("\n")) {
return nl;
}
if (message.charAt(0) == '\n') {
message = nl + message.substring(1);
if (message.length() > 0) {
if (message.equals("\n")) {
return nl;
}
if (message.charAt(0) == '\n') {
message = nl + message.substring(1);
}
}
final long time_ms = (System.currentTimeMillis() - start_ms);

@ -5,10 +5,11 @@ import static org.lwjgl.opengl.GL11.*;
import java.nio.ByteBuffer;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppModule;
import mightypork.gamecore.gui.events.ViewportChangeEvent;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.render.events.DisplayReadyEvent;
import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;
import mightypork.gamecore.util.math.constraints.vect.Vect;
@ -30,6 +31,7 @@ public class DisplaySystem extends AppModule implements RectBound {
private DisplayMode windowDisplayMode;
private int targetFps;
private FpsMeter fpsMeter;
private boolean fullscreenSwitchRequested;
/** Current screen size */
private static final Vect screenSize = new Vect() {
@ -116,6 +118,12 @@ public class DisplaySystem extends AppModule implements RectBound {
* Toggle FS if possible
*/
public void switchFullscreen()
{
fullscreenSwitchRequested = true;
}
private void doSwitchFullscreen()
{
try {
@ -133,7 +141,7 @@ public class DisplaySystem extends AppModule implements RectBound {
Display.update();
}
getEventBus().send(new ViewportChangeEvent(true, Display.isFullscreen(), getSize()));
getEventBus().send(new ViewportChangeEvent(getSize()));
} catch (final Throwable t) {
Log.e("Failed to toggle fullscreen mode.", t);
@ -153,7 +161,7 @@ public class DisplaySystem extends AppModule implements RectBound {
*
* @return screenshot object
*/
public Screenshot takeScreenshot()
public static Screenshot prepareScreenshot()
{
glReadBuffer(GL_FRONT);
final int width = Display.getWidth();
@ -235,9 +243,11 @@ public class DisplaySystem extends AppModule implements RectBound {
{
// handle resize
if (Display.wasResized()) {
getEventBus().send(new ViewportChangeEvent(false, Display.isFullscreen(), getSize()));
getEventBus().send(new ViewportChangeEvent(getSize()));
}
if (fullscreenSwitchRequested) doSwitchFullscreen();
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
fpsMeter.frame();

@ -241,7 +241,7 @@ public class Render {
{
pushed++;
if (pushed >= 20) {
if (pushed >= 100) {
Log.w("Suspicious number of state pushes: " + pushed);
}
@ -528,14 +528,14 @@ public class Render {
public static void enterBatchTexturedQuadMode(GLTexture texture)
{
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
glBegin(GL11.GL_QUADS);
batchTexturedQuadMode = true;
}
public static void leaveBatchTexturedQuadMode()
{
GL11.glEnd();
glEnd();
batchTexturedQuadMode = false;
}
}

@ -0,0 +1,53 @@
package mightypork.gamecore.render;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import mightypork.gamecore.WorkDir;
import mightypork.gamecore.logging.Log;
import org.newdawn.slick.opengl.GLUtils;
public class TaskTakeScreenshot implements Runnable {
private final Screenshot scr;
public TaskTakeScreenshot()
{
GLUtils.checkGLContext();
scr = DisplaySystem.prepareScreenshot();
}
@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(WorkDir.getDir("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);
}
}
}

@ -1,4 +1,4 @@
package mightypork.gamecore.render;
package mightypork.gamecore.render.events;
import mightypork.gamecore.eventbus.BusEvent;

@ -1,4 +1,4 @@
package mightypork.gamecore.render;
package mightypork.gamecore.render.events;
public interface DisplayReadyListener {

@ -0,0 +1,17 @@
package mightypork.gamecore.render.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
import mightypork.gamecore.render.DisplaySystem;
@SingleReceiverEvent
public class FullscreenToggleRequest extends BusEvent<DisplaySystem> {
@Override
protected void handleBy(DisplaySystem handler)
{
handler.switchFullscreen();
}
}

@ -0,0 +1,15 @@
package mightypork.gamecore.render.events;
import mightypork.gamecore.eventbus.BusEvent;
public class ScreenshotRequest extends BusEvent<ScreenshotRequestListener> {
@Override
protected void handleBy(ScreenshotRequestListener handler)
{
handler.onScreenshotRequest();
}
}

@ -0,0 +1,7 @@
package mightypork.gamecore.render.events;
public interface ScreenshotRequestListener {
public void onScreenshotRequest();
}

@ -5,7 +5,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import mightypork.gamecore.app.MainLoopRequest;
import mightypork.gamecore.core.MainLoopRequest;
import mightypork.gamecore.eventbus.BusAccess;
import mightypork.gamecore.eventbus.events.Destroyable;
import mightypork.gamecore.logging.Log;

@ -1,14 +1,14 @@
package mightypork.gamecore.resources;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.resources.audio.SoundBank;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.resources.audio.SoundRegistry;
import mightypork.gamecore.resources.audio.players.EffectPlayer;
import mightypork.gamecore.resources.audio.players.LoopPlayer;
import mightypork.gamecore.resources.fonts.FontBank;
import mightypork.gamecore.resources.fonts.FontRegistry;
import mightypork.gamecore.resources.fonts.GLFont;
import mightypork.gamecore.resources.textures.GLTexture;
import mightypork.gamecore.resources.textures.TextureBank;
import mightypork.gamecore.resources.textures.TextureRegistry;
import mightypork.gamecore.resources.textures.TxQuad;
import mightypork.gamecore.resources.textures.TxSheet;
@ -20,9 +20,9 @@ import mightypork.gamecore.resources.textures.TxSheet;
*/
public final class Res {
private static TextureBank textures;
private static SoundBank sounds;
private static FontBank fonts;
private static TextureRegistry textures;
private static SoundRegistry sounds;
private static FontRegistry fonts;
private static boolean initialized = false;
@ -37,9 +37,9 @@ public final class Res {
if (initialized) return;
initialized = true;
textures = new TextureBank(app);
sounds = new SoundBank(app);
fonts = new FontBank(app);
textures = new TextureRegistry(app);
sounds = new SoundRegistry(app);
fonts = new FontRegistry(app);
}

@ -20,7 +20,7 @@ public interface ResourceLoader {
/**
* Initialize the loader (async loader may start a stread)
* Initialize the loader (Join the bus, start a stread etc)
*
* @param app app the loader works for. The event bus must already be
* initialized.

@ -1,9 +1,9 @@
package mightypork.gamecore.resources;
import mightypork.gamecore.resources.audio.SoundBank;
import mightypork.gamecore.resources.fonts.FontBank;
import mightypork.gamecore.resources.textures.TextureBank;
import mightypork.gamecore.resources.audio.SoundRegistry;
import mightypork.gamecore.resources.fonts.FontRegistry;
import mightypork.gamecore.resources.textures.TextureRegistry;
/**
@ -18,7 +18,7 @@ public interface ResourceSetup {
*
* @param fonts font registry
*/
void addFonts(FontBank fonts);
void addFonts(FontRegistry fonts);
/**
@ -26,7 +26,7 @@ public interface ResourceSetup {
*
* @param sounds sound registry
*/
void addSounds(SoundBank sounds);
void addSounds(SoundRegistry sounds);
/**
@ -34,5 +34,5 @@ public interface ResourceSetup {
*
* @param textures texture registry
*/
void addTextures(TextureBank textures);
void addTextures(TextureRegistry textures);
}

@ -4,8 +4,8 @@ package mightypork.gamecore.resources.audio;
import java.util.HashMap;
import java.util.Map;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.LightAppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppAccessAdapter;
import mightypork.gamecore.resources.audio.players.EffectPlayer;
import mightypork.gamecore.resources.audio.players.LoopPlayer;
@ -15,7 +15,7 @@ import mightypork.gamecore.resources.audio.players.LoopPlayer;
*
* @author MightyPork
*/
public class SoundBank extends LightAppModule {
public class SoundRegistry extends AppAccessAdapter {
private final Map<String, EffectPlayer> effects = new HashMap<>();
private final Map<String, LoopPlayer> loops = new HashMap<>();
@ -24,7 +24,7 @@ public class SoundBank extends LightAppModule {
/**
* @param app app access
*/
public SoundBank(AppAccess app)
public SoundRegistry(AppAccess app)
{
super(app);
if (getSoundSystem() == null) throw new NullPointerException("SoundSystem cannot be null.");

@ -5,7 +5,7 @@ import java.nio.FloatBuffer;
import java.util.HashSet;
import java.util.Set;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.eventbus.clients.RootBusNode;
import mightypork.gamecore.eventbus.events.Updateable;
import mightypork.gamecore.resources.ResourceLoadRequest;

@ -3,8 +3,8 @@ package mightypork.gamecore.resources.fonts;
import java.util.HashMap;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.LightAppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppAccessAdapter;
import mightypork.gamecore.resources.ResourceLoadRequest;
import mightypork.gamecore.resources.fonts.impl.DeferredFont;
@ -16,12 +16,12 @@ import org.newdawn.slick.opengl.Texture;
*
* @author MightyPork
*/
public class FontBank extends LightAppModule {
public class FontRegistry extends AppAccessAdapter {
/**
* @param app app access
*/
public FontBank(AppAccess app)
public FontRegistry(AppAccess app)
{
super(app);
}

@ -4,8 +4,8 @@ package mightypork.gamecore.resources.textures;
import java.util.HashMap;
import java.util.Map;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.LightAppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppAccessAdapter;
import mightypork.gamecore.resources.ResourceLoadRequest;
import mightypork.gamecore.util.error.KeyAlreadyExistsException;
import mightypork.gamecore.util.math.constraints.rect.Rect;
@ -17,7 +17,7 @@ import mightypork.gamecore.util.math.constraints.rect.Rect;
*
* @author MightyPork
*/
public class TextureBank extends LightAppModule {
public class TextureRegistry extends AppAccessAdapter {
private final Map<String, GLTexture> textures = new HashMap<>();
private final Map<String, TxSheet> sheets = new HashMap<>();
@ -26,7 +26,7 @@ public class TextureBank extends LightAppModule {
/**
* @param app app access
*/
public TextureBank(AppAccess app)
public TextureRegistry(AppAccess app)
{
super(app);
}

@ -4,7 +4,7 @@ package mightypork.rogue;
import java.io.File;
import java.util.Arrays;
import mightypork.gamecore.app.BaseApp;
import mightypork.gamecore.core.BaseApp;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.util.files.OsUtils;
@ -46,13 +46,8 @@ public class Launcher {
final BaseApp app = new RogueApp(workdir, true);
app.addResources(new RogueResources());
app.addKeys(new RogueKeys());
app.addConfig(new RogueConfig());
app.setBusLogging(false);
app.setConfigFile("config.ini", "Rogue config file");
app.setLogOptions("/", "runtime", 5, java.util.logging.Level.ALL);
// configure the app
app.opt().setBusLogging(true);
app.start();
}

@ -4,20 +4,19 @@ package mightypork.rogue;
import java.io.File;
import mightypork.gamecore.Config;
import mightypork.gamecore.app.BaseApp;
import mightypork.gamecore.app.MainLoop;
import mightypork.gamecore.app.MainLoopRequest;
import mightypork.gamecore.core.BaseApp;
import mightypork.gamecore.core.MainLoopRequest;
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;
import mightypork.gamecore.render.events.ScreenshotRequest;
import mightypork.gamecore.util.ion.Ion;
import mightypork.rogue.RogueStateManager.RogueState;
import mightypork.rogue.events.ActionRequest;
import mightypork.rogue.events.ActionRequest.RequestType;
import mightypork.rogue.events.GameStateRequest;
import mightypork.rogue.events.RogueStateRequest;
import mightypork.rogue.screens.FpsOverlay;
import mightypork.rogue.screens.LoadingOverlay;
import mightypork.rogue.screens.game.ScreenGame;
@ -39,6 +38,14 @@ public final class RogueApp extends BaseApp {
public RogueApp(File workdir, boolean singleInstance)
{
super(workdir, singleInstance);
opt().addRoutes(new RogueRoutes());
opt().addResources(new RogueResources());
opt().addKeys(new RogueKeys());
opt().addConfig(new RogueConfig());
opt().setConfigFile(this, "config.ini", "Rogue config file");
opt().setLogOptions("/", "runtime", 5, java.util.logging.Level.ALL);
}
@ -84,11 +91,11 @@ public final class RogueApp extends BaseApp {
protected void initInputSystem(InputSystem input)
{
// this will work only with reusable events (such as requests)
bindEventToKey(new ActionRequest(RequestType.FULLSCREEN), "key.global.fullscreen");
bindEventToKey(new ActionRequest(RequestType.SCREENSHOT), "key.global.screenshot");
bindEventToKey(new FullscreenToggleRequest(), "global.fullscreen");
bindEventToKey(new ScreenshotRequest(), "global.screenshot");
bindEventToKey(new GameStateRequest(RogueState.EXIT), "key.global.quit");
bindEventToKey(new GameStateRequest(RogueState.MAIN_MENU), "key.global.menu");
bindEventToKey(new RogueStateRequest(RogueState.EXIT), "global.quit");
bindEventToKey(new RogueStateRequest(RogueState.MAIN_MENU), "global.menu");
}
@ -105,13 +112,6 @@ public final class RogueApp extends BaseApp {
}
@Override
protected MainLoop createMainLoop()
{
return new RogueMainLoop(this);
}
@Override
protected void postInit()
{
@ -120,7 +120,7 @@ public final class RogueApp extends BaseApp {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.MAIN_MENU));
getEventBus().send(new RogueStateRequest(RogueState.MAIN_MENU));
//getEventBus().send(new CrossfadeRequest("test.layout", true));
}
}));

@ -1,7 +1,7 @@
package mightypork.rogue;
import mightypork.gamecore.ConfigSetup;
import mightypork.gamecore.Config.ConfigSetup;
import mightypork.gamecore.util.files.config.PropertyManager;

@ -1,23 +1,23 @@
package mightypork.rogue;
import mightypork.gamecore.input.KeyConfig;
import mightypork.gamecore.input.KeySetup;
import mightypork.gamecore.input.KeyConfig.KeyOpts;
import mightypork.gamecore.input.KeyConfig.KeySetup;
public class RogueKeys implements KeySetup {
@Override
public void addKeys(KeyConfig keys)
public void addKeys(KeyOpts keys)
{
keys.add("key.global.quit", "CTRL+SHIFT+Q");
keys.add("key.global.menu", "CTRL+SHIFT+M");
keys.add("key.global.screenshot", "F2");
keys.add("key.global.fullscreen", "F11");
keys.add("global.quit", "CTRL+Q");
keys.add("global.menu", "CTRL+M");
keys.add("global.screenshot", "F2");
keys.add("global.fullscreen", "F11");
keys.add("key.general.cancel", "ESC");
keys.add("key.general.confirm", "ENTER");
keys.add("key.general.yes", "Y");
keys.add("key.general.no", "N");
keys.add("general.cancel", "ESC");
keys.add("general.confirm", "ENTER");
keys.add("general.yes", "Y");
keys.add("general.no", "N");
}
}

@ -1,123 +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.WorkDir;
import mightypork.gamecore.app.BaseApp;
import mightypork.gamecore.app.MainLoop;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.render.Screenshot;
import mightypork.gamecore.resources.Res;
import mightypork.gamecore.util.Utils;
import mightypork.rogue.events.ActionRequest;
import mightypork.rogue.events.ActionRequest.RequestType;
public final class RogueMainLoop extends MainLoop implements ActionRequest.Listener {
public RogueMainLoop(BaseApp app)
{
super(app);
}
@Override
public void requestAction(RequestType request)
{
switch (request) {
case FULLSCREEN:
queueTask(taskFullscreen);
break;
case SCREENSHOT:
queueTask(taskScreenshot);
break;
case SHUTDOWN:
queueTask(taskShutdown);
}
}
/*
* Take a screenshot
*/
private final Action taskScreenshot = new Action() {
@Override
public void execute()
{
Res.getSoundEffect("gui.shutter").play(1);
Utils.runAsThread(new TaskTakeScreenshot());
}
};
/*
* Shutdown the application
*/
private final Action taskShutdown = new Action() {
@Override
public void execute()
{
shutdown();
}
};
/*
* Toggle fullscreen
*/
private final Action taskFullscreen = new Action() {
@Override
public void execute()
{
getDisplay().switchFullscreen();
}
};
// TODO factor into gamecore
private class TaskTakeScreenshot implements Runnable {
private final Screenshot scr;
public TaskTakeScreenshot()
{
scr = getDisplay().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(WorkDir.getDir("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);
}
}
}
}

@ -2,14 +2,14 @@ package mightypork.rogue;
import mightypork.gamecore.resources.ResourceSetup;
import mightypork.gamecore.resources.audio.SoundBank;
import mightypork.gamecore.resources.fonts.FontBank;
import mightypork.gamecore.resources.audio.SoundRegistry;
import mightypork.gamecore.resources.fonts.FontRegistry;
import mightypork.gamecore.resources.fonts.Glyphs;
import mightypork.gamecore.resources.fonts.impl.DeferredFont;
import mightypork.gamecore.resources.textures.FilterMode;
import mightypork.gamecore.resources.textures.GLTexture;
import mightypork.gamecore.resources.textures.QuadGrid;
import mightypork.gamecore.resources.textures.TextureBank;
import mightypork.gamecore.resources.textures.TextureRegistry;
import mightypork.gamecore.resources.textures.WrapMode;
import mightypork.gamecore.util.math.constraints.rect.Rect;
@ -18,7 +18,7 @@ public class RogueResources implements ResourceSetup {
@Override
public void addFonts(FontBank fonts)
public void addFonts(FontRegistry fonts)
{
DeferredFont font;
@ -39,14 +39,14 @@ public class RogueResources implements ResourceSetup {
@Override
public void addSounds(SoundBank sounds)
public void addSounds(SoundRegistry sounds)
{
sounds.addEffect("gui.shutter", "/res/audio/shutter.ogg", 1, 1);
}
@Override
public void addTextures(TextureBank textures)
public void addTextures(TextureRegistry textures)
{
GLTexture texture;
QuadGrid grid;

@ -0,0 +1,18 @@
package mightypork.rogue;
import mightypork.gamecore.WorkDir.RouteOpts;
import mightypork.gamecore.WorkDir.RouteSetup;
public class RogueRoutes implements RouteSetup {
@Override
public void addRoutes(RouteOpts routeOpts)
{
routeOpts.addPath("slot1", "saves/slot_1.ion");
routeOpts.addPath("slot2", "saves/slot_2.ion");
routeOpts.addPath("slot3", "saves/slot_3.ion");
}
}

@ -1,8 +1,8 @@
package mightypork.rogue;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppModule;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.core.AppModule;
import mightypork.gamecore.gui.events.CrossfadeRequest;
import mightypork.gamecore.logging.Log;

@ -1,52 +0,0 @@
package mightypork.rogue.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
/**
* Request for a global action to be done in the main loop.
*
* @author MightyPork
*/
@SingleReceiverEvent
public class ActionRequest extends BusEvent<ActionRequest.Listener> {
private final RequestType type;
public ActionRequest(RequestType request)
{
type = request;
}
@Override
public void handleBy(Listener handler)
{
handler.requestAction(type);
}
public interface Listener {
/**
* Perform the requested action
*
* @param request
*/
void requestAction(RequestType request);
}
@Override
public String toString()
{
return "ActionRequest(" + type + ")";
}
public static enum RequestType
{
FULLSCREEN, SCREENSHOT, SHUTDOWN;
}
}

@ -11,12 +11,12 @@ import mightypork.rogue.RogueStateManager.RogueState;
*
* @author MightyPork
*/
public class GameStateRequest extends BusEvent<RogueStateManager> {
public class RogueStateRequest extends BusEvent<RogueStateManager> {
final private RogueState requested;
public GameStateRequest(RogueState requested)
public RogueStateRequest(RogueState requested)
{
this.requested = requested;
}

@ -1,7 +1,7 @@
package mightypork.rogue.screens;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.painters.TextPainter;

@ -1,7 +1,7 @@
package mightypork.rogue.screens;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.painters.QuadPainter;
import mightypork.gamecore.gui.components.painters.TextPainter;

@ -19,7 +19,7 @@ import mightypork.gamecore.resources.fonts.GLFont;
import mightypork.gamecore.util.math.color.pal.RGB;
import mightypork.gamecore.util.math.constraints.num.Num;
import mightypork.rogue.RogueStateManager.RogueState;
import mightypork.rogue.events.GameStateRequest;
import mightypork.rogue.events.RogueStateRequest;
import mightypork.rogue.screens.game.ScreenGame.GScrState;
import mightypork.rogue.world.WorldProvider;
@ -84,7 +84,7 @@ public class DeathLayer extends ScreenLayer {
@Override
protected void execute()
{
getEventBus().send(new GameStateRequest(RogueState.MAIN_MENU));
getEventBus().send(new RogueStateRequest(RogueState.MAIN_MENU));
}
});
}

@ -1,7 +1,7 @@
package mightypork.rogue.screens.game;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.LayoutComponent;
import mightypork.gamecore.gui.components.layout.FlowColumnLayout;

@ -3,7 +3,7 @@ package mightypork.rogue.screens.game;
import java.io.File;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.ActionGroup;
import mightypork.gamecore.gui.screens.LayeredScreen;
@ -14,7 +14,7 @@ import mightypork.gamecore.logging.Log;
import mightypork.gamecore.util.math.color.Color;
import mightypork.rogue.Const;
import mightypork.rogue.RogueStateManager.RogueState;
import mightypork.rogue.events.GameStateRequest;
import mightypork.rogue.events.RogueStateRequest;
import mightypork.rogue.world.PlayerFacade;
import mightypork.rogue.world.WorldProvider;
import mightypork.rogue.world.events.PlayerKilledListener;
@ -198,7 +198,7 @@ public class ScreenGame extends LayeredScreen implements PlayerKilledListener {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.MAIN_MENU));
getEventBus().send(new RogueStateRequest(RogueState.MAIN_MENU));
}
});
@ -212,7 +212,7 @@ public class ScreenGame extends LayeredScreen implements PlayerKilledListener {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.EXIT));
getEventBus().send(new RogueStateRequest(RogueState.EXIT));
}
});

@ -1,7 +1,7 @@
package mightypork.rogue.screens.layout_testing;
import mightypork.gamecore.app.AppAccess;
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;

@ -1,7 +1,7 @@
package mightypork.rogue.screens.menu;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.input.TextButton;
@ -22,7 +22,7 @@ import mightypork.gamecore.util.math.color.pal.PAL16;
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.GameStateRequest;
import mightypork.rogue.events.RogueStateRequest;
/**
@ -84,7 +84,7 @@ public class ScreenMainMenu extends LayeredScreen {
@Override
protected void execute()
{
getEventBus().send(new GameStateRequest(RogueState.SELECT_WORLD));
getEventBus().send(new RogueStateRequest(RogueState.SELECT_WORLD));
}
});
rows.add(btn, 2);
@ -112,7 +112,7 @@ public class ScreenMainMenu extends LayeredScreen {
@Override
protected void execute()
{
getEventBus().send(new GameStateRequest(RogueState.EXIT));
getEventBus().send(new RogueStateRequest(RogueState.EXIT));
}
});
rows.add(btn, 2);
@ -123,7 +123,7 @@ public class ScreenMainMenu extends LayeredScreen {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.EXIT));
getEventBus().send(new RogueStateRequest(RogueState.EXIT));
}
});
}

@ -2,7 +2,7 @@ package mightypork.rogue.screens.select_world;
import mightypork.gamecore.WorkDir;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.layout.RowLayout;
import mightypork.gamecore.gui.components.painters.QuadPainter;
@ -19,7 +19,7 @@ import mightypork.gamecore.util.math.color.pal.PAL16;
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.GameStateRequest;
import mightypork.rogue.events.RogueStateRequest;
/**
@ -72,13 +72,13 @@ public class ScreenSelectWorld extends LayeredScreen {
tp.setVPaddingPercent(20);
tp.setShadow(RGB.BLACK_50, tp.height().mul(0.6 / 8D).toVectXY());
slot1 = new WorldSlot(root, WorkDir.getFile("save/slot_1.ion"));
slot1 = new WorldSlot(root, WorkDir.getFile("slot1"));
rows.add(slot1);
slot2 = new WorldSlot(root, WorkDir.getFile("save/slot_2.ion"));
slot2 = new WorldSlot(root, WorkDir.getFile("slot2"));
rows.add(slot2);
slot3 = new WorldSlot(root, WorkDir.getFile("save/slot_3.ion"));
slot3 = new WorldSlot(root, WorkDir.getFile("slot3"));
rows.add(slot3);
// escape to quitn from here
@ -87,7 +87,7 @@ public class ScreenSelectWorld extends LayeredScreen {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.MAIN_MENU));
getEventBus().send(new RogueStateRequest(RogueState.MAIN_MENU));
}
});
@ -96,7 +96,7 @@ public class ScreenSelectWorld extends LayeredScreen {
@Override
public void run()
{
getEventBus().send(new GameStateRequest(RogueState.EXIT));
getEventBus().send(new RogueStateRequest(RogueState.EXIT));
}
});
}

@ -4,7 +4,7 @@ package mightypork.rogue.screens.select_world;
import java.io.File;
import java.io.IOException;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.core.AppAccess;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.input.TextButton;

Loading…
Cancel
Save