diff --git a/res/img/tiles.png b/res/img/tiles.png
index 3cf4770..f3621ab 100644
Binary files a/res/img/tiles.png and b/res/img/tiles.png differ
diff --git a/res/img/tiles.xcf b/res/img/tiles.xcf
index a804fc9..05bfd2b 100644
Binary files a/res/img/tiles.xcf and b/res/img/tiles.xcf differ
diff --git a/src/mightypork/gamecore/eventbus/BusEvent.java b/src/mightypork/gamecore/eventbus/BusEvent.java
index 1086a5c..772fade 100644
--- a/src/mightypork/gamecore/eventbus/BusEvent.java
+++ b/src/mightypork/gamecore/eventbus/BusEvent.java
@@ -4,8 +4,8 @@ package mightypork.gamecore.eventbus;
import mightypork.gamecore.eventbus.event_flags.DelayedEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
-import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
/**
@@ -15,7 +15,7 @@ import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
*
* Can be annotated as {@link SingleReceiverEvent} to be delivered once only,
* and {@link DelayedEvent} or {@link ImmediateEvent} to specify default sending
- * mode. When marked as {@link UnloggedEvent}, it will not appear in detailed
+ * mode. When marked as {@link NotLoggedEvent}, it will not appear in detailed
* bus logging (useful for very frequent events, such as UpdateEvent).
*
*
diff --git a/src/mightypork/gamecore/eventbus/EventBus.java b/src/mightypork/gamecore/eventbus/EventBus.java
index dbbcbdf..988af77 100644
--- a/src/mightypork/gamecore/eventbus/EventBus.java
+++ b/src/mightypork/gamecore/eventbus/EventBus.java
@@ -12,7 +12,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.UnloggedEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.eventbus.events.Destroyable;
import mightypork.gamecore.logging.Log;
@@ -388,7 +388,7 @@ final public class EventBus implements Destroyable, BusAccess {
private boolean shallLog(BusEvent> event)
{
if (!detailedLogging) return false;
- if (event.getClass().isAnnotationPresent(UnloggedEvent.class)) return false;
+ if (event.getClass().isAnnotationPresent(NotLoggedEvent.class)) return false;
return true;
}
diff --git a/src/mightypork/gamecore/eventbus/event_flags/UnloggedEvent.java b/src/mightypork/gamecore/eventbus/event_flags/NotLoggedEvent.java
similarity index 90%
rename from src/mightypork/gamecore/eventbus/event_flags/UnloggedEvent.java
rename to src/mightypork/gamecore/eventbus/event_flags/NotLoggedEvent.java
index dd4d78b..1497e16 100644
--- a/src/mightypork/gamecore/eventbus/event_flags/UnloggedEvent.java
+++ b/src/mightypork/gamecore/eventbus/event_flags/NotLoggedEvent.java
@@ -14,4 +14,4 @@ import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Inherited
@Documented
-public @interface UnloggedEvent {}
+public @interface NotLoggedEvent {}
diff --git a/src/mightypork/gamecore/eventbus/events/UpdateEvent.java b/src/mightypork/gamecore/eventbus/events/UpdateEvent.java
index e4b9f40..7962e66 100644
--- a/src/mightypork/gamecore/eventbus/events/UpdateEvent.java
+++ b/src/mightypork/gamecore/eventbus/events/UpdateEvent.java
@@ -4,7 +4,7 @@ package mightypork.gamecore.eventbus.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.ImmediateEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
-import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
/**
@@ -12,7 +12,7 @@ import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
*
* @author MightyPork
*/
-@UnloggedEvent
+@NotLoggedEvent
@ImmediateEvent
@NonConsumableEvent
public class UpdateEvent extends BusEvent {
diff --git a/src/mightypork/gamecore/gui/Action.java b/src/mightypork/gamecore/gui/Action.java
index 1b468d6..191f1f4 100644
--- a/src/mightypork/gamecore/gui/Action.java
+++ b/src/mightypork/gamecore/gui/Action.java
@@ -17,7 +17,7 @@ public abstract class Action implements Runnable, Enableable {
* @param enable true to enable
*/
@Override
- public final void enable(boolean enable)
+ public final void setEnabled(boolean enable)
{
this.enabled = enable;
}
diff --git a/src/mightypork/gamecore/gui/ActionGroup.java b/src/mightypork/gamecore/gui/ActionGroup.java
index fbc591a..686a850 100644
--- a/src/mightypork/gamecore/gui/ActionGroup.java
+++ b/src/mightypork/gamecore/gui/ActionGroup.java
@@ -13,11 +13,11 @@ public class ActionGroup implements Enableable {
@Override
- public void enable(boolean yes)
+ public void setEnabled(boolean yes)
{
enabled = yes;
for (final Enableable e : groupMembers)
- e.enable(yes);
+ e.setEnabled(yes);
}
diff --git a/src/mightypork/gamecore/gui/Enableable.java b/src/mightypork/gamecore/gui/Enableable.java
index 66bb7a4..29ba0d9 100644
--- a/src/mightypork/gamecore/gui/Enableable.java
+++ b/src/mightypork/gamecore/gui/Enableable.java
@@ -15,7 +15,7 @@ public interface Enableable {
*
* @param yes enabled
*/
- public void enable(boolean yes);
+ public void setEnabled(boolean yes);
/**
diff --git a/src/mightypork/gamecore/gui/components/BaseComponent.java b/src/mightypork/gamecore/gui/components/BaseComponent.java
index c68db4a..43c28b3 100644
--- a/src/mightypork/gamecore/gui/components/BaseComponent.java
+++ b/src/mightypork/gamecore/gui/components/BaseComponent.java
@@ -8,6 +8,8 @@ import mightypork.gamecore.input.InputSystem;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.render.Renderable;
import mightypork.gamecore.util.annot.DefaultImpl;
+import mightypork.gamecore.util.math.color.Color;
+import mightypork.gamecore.util.math.constraints.num.Num;
import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.math.constraints.rect.caching.AbstractRectCache;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;
@@ -26,6 +28,7 @@ public abstract class BaseComponent extends AbstractRectCache implements Compone
private boolean visible = true;
private int disableLevel = 0;
+ private Num alphaMul = Num.ONE;
public BaseComponent()
@@ -67,7 +70,9 @@ public abstract class BaseComponent extends AbstractRectCache implements Compone
{
if (!isVisible()) return;
+ Color.pushAlpha(alphaMul);
renderComponent();
+ Color.popAlpha();
}
@@ -109,7 +114,7 @@ public abstract class BaseComponent extends AbstractRectCache implements Compone
@Override
- public void enable(boolean yes)
+ public void setEnabled(boolean yes)
{
if (yes) {
if (disableLevel > 0) disableLevel--;
@@ -124,4 +129,16 @@ public abstract class BaseComponent extends AbstractRectCache implements Compone
{
return disableLevel == 0;
}
+
+
+ public void setAlpha(Num alpha)
+ {
+ this.alphaMul = alpha;
+ }
+
+
+ public void setAlpha(double alpha)
+ {
+ this.alphaMul = Num.make(alpha);
+ }
}
diff --git a/src/mightypork/gamecore/gui/components/LayoutComponent.java b/src/mightypork/gamecore/gui/components/LayoutComponent.java
index 42733f9..5b24634 100644
--- a/src/mightypork/gamecore/gui/components/LayoutComponent.java
+++ b/src/mightypork/gamecore/gui/components/LayoutComponent.java
@@ -107,11 +107,11 @@ public abstract class LayoutComponent extends BaseComponent implements ClientHub
@Override
- public void enable(boolean yes)
+ public void setEnabled(boolean yes)
{
- super.enable(yes);
+ super.setEnabled(yes);
for (final Component c : components) {
- c.enable(yes);
+ c.setEnabled(yes);
}
}
diff --git a/src/mightypork/gamecore/gui/components/layout/ClickableWrapper.java b/src/mightypork/gamecore/gui/components/layout/ClickableWrapper.java
index dfc5e76..3c285d5 100644
--- a/src/mightypork/gamecore/gui/components/layout/ClickableWrapper.java
+++ b/src/mightypork/gamecore/gui/components/layout/ClickableWrapper.java
@@ -49,10 +49,10 @@ public class ClickableWrapper extends ClickableComponent implements DelegatingCl
@Override
- public void enable(boolean yes)
+ public void setEnabled(boolean yes)
{
- super.enable(yes);
- wrapped.enable(yes);
+ super.setEnabled(yes);
+ wrapped.setEnabled(yes);
}
diff --git a/src/mightypork/gamecore/gui/events/CrossfadeRequest.java b/src/mightypork/gamecore/gui/events/CrossfadeRequest.java
index da053c8..a7cd680 100644
--- a/src/mightypork/gamecore/gui/events/CrossfadeRequest.java
+++ b/src/mightypork/gamecore/gui/events/CrossfadeRequest.java
@@ -2,12 +2,14 @@ package mightypork.gamecore.gui.events;
import mightypork.gamecore.eventbus.BusEvent;
+import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
import mightypork.gamecore.gui.screens.impl.CrossfadeOverlay;
/**
* @author MightyPork
*/
+@SingleReceiverEvent
public class CrossfadeRequest extends BusEvent {
private final String screen;
diff --git a/src/mightypork/gamecore/gui/events/ViewportChangeEvent.java b/src/mightypork/gamecore/gui/events/ViewportChangeEvent.java
index 993cd0d..bef507d 100644
--- a/src/mightypork/gamecore/gui/events/ViewportChangeEvent.java
+++ b/src/mightypork/gamecore/gui/events/ViewportChangeEvent.java
@@ -3,6 +3,7 @@ package mightypork.gamecore.gui.events;
import mightypork.gamecore.eventbus.BusEvent;
import mightypork.gamecore.eventbus.event_flags.NonConsumableEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.util.math.constraints.vect.Vect;
@@ -12,6 +13,7 @@ import mightypork.gamecore.util.math.constraints.vect.Vect;
* @author MightyPork
*/
@NonConsumableEvent
+@NotLoggedEvent
public class ViewportChangeEvent extends BusEvent {
private final boolean fullscreen;
diff --git a/src/mightypork/gamecore/gui/screens/Overlay.java b/src/mightypork/gamecore/gui/screens/Overlay.java
index 18539f7..8c9c7e9 100644
--- a/src/mightypork/gamecore/gui/screens/Overlay.java
+++ b/src/mightypork/gamecore/gui/screens/Overlay.java
@@ -16,6 +16,8 @@ import mightypork.gamecore.input.KeyBindingPool;
import mightypork.gamecore.input.KeyStroke;
import mightypork.gamecore.render.Renderable;
import mightypork.gamecore.util.annot.DefaultImpl;
+import mightypork.gamecore.util.math.color.Color;
+import mightypork.gamecore.util.math.constraints.num.Num;
import mightypork.gamecore.util.math.constraints.vect.Vect;
@@ -44,6 +46,7 @@ public abstract class Overlay extends AppSubModule implements Comparable updated = new LinkedHashSet<>();
+ private Num alphaMul = Num.ONE;
public Overlay(AppAccess app)
@@ -90,10 +93,10 @@ public abstract class Overlay extends AppSubModule implements Comparable {
private final int key;
diff --git a/src/mightypork/gamecore/input/events/MouseButtonEvent.java b/src/mightypork/gamecore/input/events/MouseButtonEvent.java
index 77aba1a..f6e0848 100644
--- a/src/mightypork/gamecore/input/events/MouseButtonEvent.java
+++ b/src/mightypork/gamecore/input/events/MouseButtonEvent.java
@@ -2,7 +2,7 @@ package mightypork.gamecore.input.events;
import mightypork.gamecore.eventbus.BusEvent;
-import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.util.math.constraints.rect.proxy.RectBound;
import mightypork.gamecore.util.math.constraints.vect.Vect;
import mightypork.gamecore.util.math.constraints.vect.VectConst;
@@ -13,7 +13,7 @@ import mightypork.gamecore.util.math.constraints.vect.VectConst;
*
* @author MightyPork
*/
-@UnloggedEvent
+@NotLoggedEvent
public class MouseButtonEvent extends BusEvent {
public static final int BUTTON_LEFT = 0;
diff --git a/src/mightypork/gamecore/input/events/MouseMotionEvent.java b/src/mightypork/gamecore/input/events/MouseMotionEvent.java
index 855184b..11180f3 100644
--- a/src/mightypork/gamecore/input/events/MouseMotionEvent.java
+++ b/src/mightypork/gamecore/input/events/MouseMotionEvent.java
@@ -2,7 +2,7 @@ package mightypork.gamecore.input.events;
import mightypork.gamecore.eventbus.BusEvent;
-import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.gamecore.util.math.constraints.vect.Vect;
import mightypork.gamecore.util.math.constraints.vect.VectConst;
@@ -12,7 +12,7 @@ import mightypork.gamecore.util.math.constraints.vect.VectConst;
*
* @author MightyPork
*/
-@UnloggedEvent
+@NotLoggedEvent
public class MouseMotionEvent extends BusEvent {
private final VectConst move;
diff --git a/src/mightypork/gamecore/util/math/Calc.java b/src/mightypork/gamecore/util/math/Calc.java
index 024f857..718f500 100644
--- a/src/mightypork/gamecore/util/math/Calc.java
+++ b/src/mightypork/gamecore/util/math/Calc.java
@@ -670,15 +670,17 @@ public class Calc {
public static int randInt(Random rand, int low, int high)
{
- int range = Math.abs(high - low) + 1;
+ final int range = Math.abs(high - low) + 1;
return low + rand.nextInt(range);
}
-
+
+
public static int randInt(int low, int high)
{
- return randInt(rand, low, high);
+ return randInt(rand, low, high);
}
+
/**
* Get ordinal version of numbers (1 = 1st, 5 = 5th etc.)
*
diff --git a/src/mightypork/gamecore/util/math/Range.java b/src/mightypork/gamecore/util/math/Range.java
index d0acf4f..559edde 100644
--- a/src/mightypork/gamecore/util/math/Range.java
+++ b/src/mightypork/gamecore/util/math/Range.java
@@ -1,9 +1,6 @@
package mightypork.gamecore.util.math;
-import java.util.Random;
-
-
/**
* Numeric range, able to generate random numbers and give min/max values.
*
@@ -74,7 +71,7 @@ public class Range {
*/
public int randInt()
{
- return Calc.randInt(Calc.rand, (int)Math.round(min), (int)Math.round(min));
+ return Calc.randInt(Calc.rand, (int) Math.round(min), (int) Math.round(min));
}
diff --git a/src/mightypork/gamecore/util/math/algo/Sides.java b/src/mightypork/gamecore/util/math/algo/Sides.java
index 391e932..f397c7b 100644
--- a/src/mightypork/gamecore/util/math/algo/Sides.java
+++ b/src/mightypork/gamecore/util/math/algo/Sides.java
@@ -1,5 +1,6 @@
package mightypork.gamecore.util.math.algo;
+
import mightypork.gamecore.util.math.Calc;
@@ -69,8 +70,8 @@ public class Sides {
{
return (byte) (1 << (7 - i));
}
-
-
+
+
public static Step randomCardinal()
{
return CARDINAL_SIDES[Calc.randInt(0, 3)];
diff --git a/src/mightypork/gamecore/util/math/timing/TaskRepeater.java b/src/mightypork/gamecore/util/math/timing/TaskRepeater.java
index 584a787..61b2d02 100644
--- a/src/mightypork/gamecore/util/math/timing/TaskRepeater.java
+++ b/src/mightypork/gamecore/util/math/timing/TaskRepeater.java
@@ -25,7 +25,7 @@ public abstract class TaskRepeater extends AnimatorRewind implements Runnable, E
@Override
- public void enable(boolean yes)
+ public void setEnabled(boolean yes)
{
this.enabled = yes;
}
diff --git a/src/mightypork/rogue/App.java b/src/mightypork/rogue/App.java
index 6bdd24c..c2a693d 100644
--- a/src/mightypork/rogue/App.java
+++ b/src/mightypork/rogue/App.java
@@ -138,11 +138,13 @@ public final class App extends BaseApp {
bindEventToKey(new GameStateRequest(GameState.MAIN_MENU), Keys.M, Keys.MOD_CONTROL);
}
+
private void bindEventToKey(final BusEvent> event, int key)
{
bindEventToKey(event, key, Keys.MOD_NONE);
}
+
private void bindEventToKey(final BusEvent> event, int key, byte mod)
{
getInput().bindKey(new KeyStroke(key, mod), new Runnable() {
diff --git a/src/mightypork/rogue/GameStateManager.java b/src/mightypork/rogue/GameStateManager.java
index 75c12ca..db03238 100644
--- a/src/mightypork/rogue/GameStateManager.java
+++ b/src/mightypork/rogue/GameStateManager.java
@@ -5,7 +5,6 @@ import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.app.AppModule;
import mightypork.gamecore.gui.events.CrossfadeRequest;
import mightypork.gamecore.logging.Log;
-import mightypork.rogue.world.WorldProvider;
public class GameStateManager extends AppModule {
diff --git a/src/mightypork/rogue/Res.java b/src/mightypork/rogue/Res.java
index 7e7dd83..f146b86 100644
--- a/src/mightypork/rogue/Res.java
+++ b/src/mightypork/rogue/Res.java
@@ -157,6 +157,7 @@ public final class Res {
textures.add("tile.ufog.ne", grid.makeQuad(5, 7).flipX());
textures.add("tile.ufog.sw", grid.makeQuad(5, 7).flipY());
textures.add("tile.ufog.se", grid.makeQuad(5, 7).flipY().flipX());
+ textures.add("tile.ufog.full", grid.makeQuad(6, 7));
texture = textures.loadTexture("items", "/res/img/items.png", FilterMode.NEAREST, WrapMode.CLAMP);
diff --git a/src/mightypork/rogue/events/ActionRequest.java b/src/mightypork/rogue/events/ActionRequest.java
index 53b55d3..a1265aa 100644
--- a/src/mightypork/rogue/events/ActionRequest.java
+++ b/src/mightypork/rogue/events/ActionRequest.java
@@ -6,7 +6,7 @@ import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
/**
- * Request for a global sction to be done in the main loop.
+ * Request for a global action to be done in the main loop.
*
* @author MightyPork
*/
diff --git a/src/mightypork/rogue/events/GameStateRequest.java b/src/mightypork/rogue/events/GameStateRequest.java
index eb98eb2..98f33cd 100644
--- a/src/mightypork/rogue/events/GameStateRequest.java
+++ b/src/mightypork/rogue/events/GameStateRequest.java
@@ -6,6 +6,11 @@ import mightypork.rogue.GameStateManager;
import mightypork.rogue.GameStateManager.GameState;
+/**
+ * Request for a game state change
+ *
+ * @author MightyPork
+ */
public class GameStateRequest extends BusEvent {
final private GameState requested;
diff --git a/src/mightypork/rogue/events/LoadingOverlayRequest.java b/src/mightypork/rogue/events/LoadingOverlayRequest.java
new file mode 100644
index 0000000..a42d5c8
--- /dev/null
+++ b/src/mightypork/rogue/events/LoadingOverlayRequest.java
@@ -0,0 +1,38 @@
+package mightypork.rogue.events;
+
+
+import mightypork.gamecore.eventbus.BusEvent;
+import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
+import mightypork.rogue.screens.LoadingOverlay;
+
+
+/**
+ * Request to execute a given task in a loading overlay
+ *
+ * @author MightyPork
+ */
+@SingleReceiverEvent
+public class LoadingOverlayRequest extends BusEvent {
+
+ private final String msg;
+ private final Runnable task;
+
+
+ /**
+ * @param msg task description
+ * @param task task runnable
+ */
+ public LoadingOverlayRequest(String msg, Runnable task)
+ {
+ this.task = task;
+ this.msg = msg;
+ }
+
+
+ @Override
+ protected void handleBy(LoadingOverlay handler)
+ {
+ handler.show(msg, task);
+ }
+
+}
diff --git a/src/mightypork/rogue/screens/FpsOverlay.java b/src/mightypork/rogue/screens/FpsOverlay.java
index 40769b1..746c5dd 100644
--- a/src/mightypork/rogue/screens/FpsOverlay.java
+++ b/src/mightypork/rogue/screens/FpsOverlay.java
@@ -17,6 +17,11 @@ import mightypork.gamecore.util.strings.StringProvider;
import mightypork.rogue.Res;
+/**
+ * FPS indicator overlay
+ *
+ * @author MightyPork
+ */
public class FpsOverlay extends Overlay {
TextPainter tp;
@@ -43,7 +48,7 @@ public class FpsOverlay extends Overlay {
final Num h = root.height();
final RectBound constraint = root.shrink(h.perc(3)).topRight().startRect().growDown(h.perc(5).max(16));
- tp = new TextPainter(font, AlignX.RIGHT, RGB.WHITE, new StringProvider() {
+ tp = new TextPainter(font, AlignX.RIGHT, RGB.YELLOW, new StringProvider() {
@Override
public String getString()
@@ -53,7 +58,7 @@ public class FpsOverlay extends Overlay {
});
tp.setRect(constraint);
- tp.setShadow(RGB.BLACK, Vect.make(tp.height().div(8).round()));
+ tp.setShadow(RGB.BLACK_60, Vect.make(tp.height().div(8).round()));
root.add(tp);
diff --git a/src/mightypork/rogue/screens/LoaderRequest.java b/src/mightypork/rogue/screens/LoaderRequest.java
deleted file mode 100644
index 645b360..0000000
--- a/src/mightypork/rogue/screens/LoaderRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package mightypork.rogue.screens;
-
-import mightypork.gamecore.eventbus.BusEvent;
-
-
-public class LoaderRequest extends BusEvent {
-
- private final String msg;
- private Runnable task;
-
-
- public LoaderRequest(String msg, Runnable task) {
- this.task = task;
- this.msg = msg;
- }
- @Override
- protected void handleBy(LoadingOverlay handler)
- {
- handler.show(msg, task);
- }
-
-}
diff --git a/src/mightypork/rogue/screens/LoadingOverlay.java b/src/mightypork/rogue/screens/LoadingOverlay.java
index 18796c0..a042bdf 100644
--- a/src/mightypork/rogue/screens/LoadingOverlay.java
+++ b/src/mightypork/rogue/screens/LoadingOverlay.java
@@ -5,11 +5,9 @@ import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.gui.AlignX;
import mightypork.gamecore.gui.components.painters.QuadPainter;
import mightypork.gamecore.gui.components.painters.TextPainter;
-import mightypork.gamecore.gui.events.ScreenRequest;
import mightypork.gamecore.gui.screens.Overlay;
import mightypork.gamecore.util.Utils;
import mightypork.gamecore.util.math.Easing;
-import mightypork.gamecore.util.math.color.Color;
import mightypork.gamecore.util.math.color.pal.PAL16;
import mightypork.gamecore.util.math.color.pal.RGB;
import mightypork.gamecore.util.math.constraints.num.Num;
@@ -18,10 +16,14 @@ import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.math.timing.TimedTask;
import mightypork.gamecore.util.strings.StringProvider;
import mightypork.rogue.Res;
-import mightypork.rogue.events.ActionRequest;
-import mightypork.rogue.events.ActionRequest.RequestType;
+/**
+ * Overlay with blue background and loading-info text, that accompanies an async
+ * task.
+ *
+ * @author MightyPork
+ */
public class LoadingOverlay extends Overlay {
private static final double T_IN = 0.5;
@@ -42,7 +44,7 @@ public class LoadingOverlay extends Overlay {
private String msg;
private Runnable task;
- private TimedTask tt = new TimedTask() {
+ private final TimedTask tt = new TimedTask() {
@Override
public void run()
@@ -62,7 +64,8 @@ public class LoadingOverlay extends Overlay {
};
- public LoadingOverlay(AppAccess app) {
+ public LoadingOverlay(AppAccess app)
+ {
super(app);
final QuadPainter qp = new QuadPainter(PAL16.SEABLUE);
@@ -80,6 +83,8 @@ public class LoadingOverlay extends Overlay {
tp.setRect(textRect);
tp.setShadow(RGB.BLACK_60, tp.height().mul(1 / 8D).toVectXY());
root.add(tp);
+
+ setAlpha(alpha);
}
@@ -90,9 +95,15 @@ public class LoadingOverlay extends Overlay {
}
+ /**
+ * Show for a task
+ *
+ * @param message task description
+ * @param task task
+ */
public void show(String message, Runnable task)
{
- if(busy) throw new IllegalStateException("Loader is busy with another task.");
+ if (busy) throw new IllegalStateException("Loader is busy with another task.");
this.msg = message;
this.task = task;
@@ -103,13 +114,4 @@ public class LoadingOverlay extends Overlay {
tt.start(T_IN);
}
-
-
- @Override
- public void render()
- {
- Color.pushAlpha(alpha);
- super.render();
- Color.popAlpha();
- }
}
diff --git a/src/mightypork/rogue/screens/PushButton.java b/src/mightypork/rogue/screens/PushButton.java
new file mode 100644
index 0000000..2a3bc01
--- /dev/null
+++ b/src/mightypork/rogue/screens/PushButton.java
@@ -0,0 +1,71 @@
+package mightypork.rogue.screens;
+
+
+import mightypork.gamecore.gui.AlignX;
+import mightypork.gamecore.gui.components.ClickableComponent;
+import mightypork.gamecore.gui.components.painters.TextPainter;
+import mightypork.gamecore.input.InputSystem;
+import mightypork.gamecore.resources.fonts.GLFont;
+import mightypork.gamecore.util.math.color.Color;
+import mightypork.gamecore.util.math.color.pal.RGB;
+import mightypork.gamecore.util.math.constraints.vect.Vect;
+import mightypork.gamecore.util.math.constraints.vect.mutable.VectVar;
+
+
+/**
+ * Menu-like button with shadow and push state
+ *
+ * @author MightyPork
+ */
+public class PushButton extends ClickableComponent {
+
+ public final TextPainter textPainter;
+
+ private final VectVar offset = Vect.makeVar();
+
+ public Vect offsetPassive = height().div(16).toVectXY();
+ public Vect offsetOver = height().div(20).toVectXY();
+ public Vect offsetUnder = height().div(32).toVectXY();
+
+ private final Color color;
+
+ private boolean hoverMove = true;
+
+
+ public PushButton(GLFont font, String text, Color color)
+ {
+ this.color = color;
+
+ this.textPainter = new TextPainter(font, AlignX.CENTER, this.color, text);
+ this.textPainter.setRect(this);
+ this.textPainter.setShadow(RGB.BLACK_30, offset);
+ textPainter.setPaddingHPerc(0, 5);
+ }
+
+
+ @Override
+ protected void renderComponent()
+ {
+ if (isMouseOver()) {
+ if (InputSystem.isMouseButtonDown(0)) {
+ offset.setTo(offsetUnder);
+ } else {
+ offset.setTo(hoverMove ? offsetOver : offsetPassive);
+ }
+ } else {
+ offset.setTo(offsetPassive);
+ }
+
+ textPainter.render();
+ }
+
+
+ /**
+ * Disable offset change on hover
+ */
+ public void disableHover()
+ {
+ hoverMove = false;
+ }
+
+}
diff --git a/src/mightypork/rogue/screens/game/HudLayer.java b/src/mightypork/rogue/screens/game/HudLayer.java
index 1d7d33e..95564ea 100644
--- a/src/mightypork/rogue/screens/game/HudLayer.java
+++ b/src/mightypork/rogue/screens/game/HudLayer.java
@@ -130,7 +130,7 @@ public class HudLayer extends ScreenLayer {
// TODO actions
//nav.addLeft(new NavButton(Res.txq("nav.button.fg.options")));
//nav.addLeft(new NavButton(Res.txq("nav.button.fg.help")));
-
+
nav.addLeft(btn = new NavButton(Res.txq("nav.button.fg.menu")));
btn.setAction(gameScreen.actionMenu);
diff --git a/src/mightypork/rogue/screens/game/InvLayer.java b/src/mightypork/rogue/screens/game/InvLayer.java
index 238d027..7926d47 100644
--- a/src/mightypork/rogue/screens/game/InvLayer.java
+++ b/src/mightypork/rogue/screens/game/InvLayer.java
@@ -144,7 +144,7 @@ public class InvLayer extends ScreenLayer {
@Override
public void run()
{
- if(isEnabled()) {
+ if (isEnabled()) {
screen.actionToggleInv.run();
}
}
diff --git a/src/mightypork/rogue/screens/game/ScreenGame.java b/src/mightypork/rogue/screens/game/ScreenGame.java
index b0a1a81..507fe35 100644
--- a/src/mightypork/rogue/screens/game/ScreenGame.java
+++ b/src/mightypork/rogue/screens/game/ScreenGame.java
@@ -2,8 +2,6 @@ package mightypork.rogue.screens.game;
import java.io.File;
-import java.io.IOException;
-import java.util.Random;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.gui.Action;
@@ -89,7 +87,7 @@ public class ScreenGame extends LayeredScreen {
worldLayer.map.toggleMag();
}
};
-
+
public Action actionSave = new Action() {
@Override
@@ -98,30 +96,30 @@ public class ScreenGame extends LayeredScreen {
try {
WorldProvider.get().saveWorld();
WorldProvider.get().getWorld().getConsole().msgWorldSaved();
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("Could not save the world.", e);
WorldProvider.get().getWorld().getConsole().msgWorldSaveError();
}
}
};
-
+
public Action actionLoad = new Action() {
@Override
public void execute()
{
try {
- File f = WorldProvider.get().getWorld().getSaveFile();
+ final File f = WorldProvider.get().getWorld().getSaveFile();
WorldProvider.get().loadWorld(f);
WorldProvider.get().getWorld().getConsole().msgReloaded();
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("Could not load the world.", e);
WorldProvider.get().getWorld().getConsole().msgLoadFailed();
}
}
};
-
+
public Action actionMenu = new Action() {
@Override
@@ -132,6 +130,8 @@ public class ScreenGame extends LayeredScreen {
getEventBus().send(new GameStateRequest(GameState.MAIN_MENU));
}
};
+
+
/**
* Set gui state (overlay)
*
@@ -144,21 +144,21 @@ public class ScreenGame extends LayeredScreen {
if (nstate != GScrState.WORLD) { // leaving world.
getEventBus().send(new WorldPauseRequest(PauseAction.PAUSE));
- worldActions.enable(false); // disable world actions
+ worldActions.setEnabled(false); // disable world actions
}
if (nstate == GScrState.WORLD) {
getEventBus().send(new WorldPauseRequest(PauseAction.RESUME));
invLayer.setVisible(false); // hide all extra layers
- invLayer.enable(false);
+ invLayer.setEnabled(false);
- worldActions.enable(true);
+ worldActions.setEnabled(true);
}
if (nstate == GScrState.INV) {
invLayer.setVisible(true);
- invLayer.enable(true);
+ invLayer.setEnabled(true);
}
this.state = nstate;
@@ -176,15 +176,15 @@ public class ScreenGame extends LayeredScreen {
super(app);
addLayer(invLayer = new InvLayer(this));
- invLayer.enable(false);
+ invLayer.setEnabled(false);
invLayer.setVisible(false);
addLayer(hudLayer = new HudLayer(this));
- hudLayer.enable(true);
+ hudLayer.setEnabled(true);
hudLayer.setVisible(true);
addLayer(worldLayer = new WorldLayer(this));
- worldLayer.enable(true);
+ worldLayer.setEnabled(true);
worldLayer.setVisible(true);
// TODO temporary, remove
@@ -206,7 +206,7 @@ public class ScreenGame extends LayeredScreen {
bindKey(new KeyStroke(Keys.E), actionEat);
bindKey(new KeyStroke(Keys.M), actionToggleMinimap);
bindKey(new KeyStroke(Keys.Z), actionToggleZoom);
-
+
bindKey(new KeyStroke(Keys.R, Keys.MOD_CONTROL), actionLoad);
bindKey(new KeyStroke(Keys.L, Keys.MOD_CONTROL), actionLoad);
@@ -225,7 +225,7 @@ public class ScreenGame extends LayeredScreen {
worldActions.add(actionLoad);
worldActions.add(actionMenu);
- worldActions.enable(true);
+ worldActions.setEnabled(true);
// TMP TODO remove
bindKey(new KeyStroke(Keys.X), new Runnable() {
diff --git a/src/mightypork/rogue/screens/menu/MenuButton.java b/src/mightypork/rogue/screens/menu/MenuButton.java
deleted file mode 100644
index 82caa83..0000000
--- a/src/mightypork/rogue/screens/menu/MenuButton.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package mightypork.rogue.screens.menu;
-
-
-import mightypork.gamecore.gui.AlignX;
-import mightypork.gamecore.gui.components.ClickableComponent;
-import mightypork.gamecore.gui.components.painters.TextPainter;
-import mightypork.gamecore.input.InputSystem;
-import mightypork.gamecore.resources.fonts.GLFont;
-import mightypork.gamecore.util.math.color.Color;
-import mightypork.gamecore.util.math.color.pal.RGB;
-import mightypork.gamecore.util.math.constraints.vect.Vect;
-import mightypork.gamecore.util.math.constraints.vect.mutable.VectVar;
-import mightypork.rogue.Res;
-
-
-class MenuButton extends ClickableComponent {
-
- private static GLFont font = Res.getFont("thick");
- private final TextPainter painter;
-
- private final VectVar offset = Vect.makeVar();
- private final Vect offsetPassive = height().div(16).toVectXY();
- private final Vect offsetPassive2 = height().div(20).toVectXY();
- private final Vect offsetUnder = height().div(32).toVectXY();
-
- private final Color color;
-
-
- public MenuButton(String text, Color color)
- {
- this.color = color;
-
- this.painter = new TextPainter(font, AlignX.CENTER, this.color, text);
- this.painter.setRect(this);
- this.painter.setShadow(RGB.BLACK_30, offset);
- painter.setPaddingHPerc(0, 5);
- }
-
-
- @Override
- protected void renderComponent()
- {
- if (isMouseOver()) {
- if (InputSystem.isMouseButtonDown(0)) {
- offset.setTo(offsetUnder);
- } else {
- offset.setTo(offsetPassive2);
- }
- } else {
- offset.setTo(offsetPassive);
- }
-
- painter.render();
- }
-
-}
diff --git a/src/mightypork/rogue/screens/menu/ScreenMainMenu.java b/src/mightypork/rogue/screens/menu/ScreenMainMenu.java
index 4449714..d2dacd6 100644
--- a/src/mightypork/rogue/screens/menu/ScreenMainMenu.java
+++ b/src/mightypork/rogue/screens/menu/ScreenMainMenu.java
@@ -9,6 +9,7 @@ import mightypork.gamecore.gui.components.painters.QuadPainter;
import mightypork.gamecore.gui.screens.LayeredScreen;
import mightypork.gamecore.gui.screens.Screen;
import mightypork.gamecore.gui.screens.ScreenLayer;
+import mightypork.gamecore.resources.fonts.GLFont;
import mightypork.gamecore.util.math.color.Color;
import mightypork.gamecore.util.math.color.pal.PAL16;
import mightypork.gamecore.util.math.constraints.num.Num;
@@ -16,6 +17,7 @@ import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.rogue.GameStateManager.GameState;
import mightypork.rogue.Res;
import mightypork.rogue.events.GameStateRequest;
+import mightypork.rogue.screens.PushButton;
/**
@@ -67,11 +69,12 @@ public class ScreenMainMenu extends LayeredScreen {
layout.put(ip, r, 0, 4, 1);
r += 5;
- MenuButton btn;
+ PushButton btn;
+ final GLFont btnFont = Res.getFont("thick");
// world button
- btn = new MenuButton("Play", PAL16.SLIMEGREEN);
+ btn = new PushButton(btnFont, "Play", PAL16.SLIMEGREEN);
btn.setAction(new Action() {
@Override
@@ -99,7 +102,7 @@ public class ScreenMainMenu extends LayeredScreen {
*/
// quit button
- btn = new MenuButton("Exit", PAL16.BLOODRED);
+ btn = new PushButton(btnFont, "Exit", PAL16.BLOODRED);
btn.setAction(new Action() {
@Override
diff --git a/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java b/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java
index a616c33..ce86c1b 100644
--- a/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java
+++ b/src/mightypork/rogue/screens/select_world/ScreenSelectWorld.java
@@ -38,8 +38,8 @@ public class ScreenSelectWorld extends LayeredScreen {
private WorldSlot slot1;
private WorldSlot slot2;
private WorldSlot slot3;
-
-
+
+
public WorldsLayer(Screen screen)
{
super(screen);
@@ -66,7 +66,7 @@ public class ScreenSelectWorld extends LayeredScreen {
layout.put(tp = new TextPainter(Res.getFont("thick"), AlignX.CENTER, RGB.YELLOW, "Save slot:"), 0, 0, 1, 1);
tp.setPaddingHPerc(0, 20);
tp.setShadow(RGB.BLACK_50, tp.height().mul(0.6 / 8D).toVectXY());
-
+
slot1 = new WorldSlot(root, Paths.SAVE_SLOT_1);
layout.put(slot1, 1, 0, 1, 1);
@@ -84,7 +84,7 @@ public class ScreenSelectWorld extends LayeredScreen {
return 2;
}
-
+
@Override
protected void onScreenEnter()
{
diff --git a/src/mightypork/rogue/screens/select_world/WorldSlot.java b/src/mightypork/rogue/screens/select_world/WorldSlot.java
index fd55400..765debb 100644
--- a/src/mightypork/rogue/screens/select_world/WorldSlot.java
+++ b/src/mightypork/rogue/screens/select_world/WorldSlot.java
@@ -7,26 +7,21 @@ import java.io.IOException;
import mightypork.gamecore.app.AppAccess;
import mightypork.gamecore.gui.Action;
import mightypork.gamecore.gui.AlignX;
-import mightypork.gamecore.gui.components.layout.ClickableWrapper;
import mightypork.gamecore.gui.components.layout.ConstraintLayout;
import mightypork.gamecore.gui.components.layout.GridLayout;
import mightypork.gamecore.gui.components.painters.QuadPainter;
-import mightypork.gamecore.gui.components.painters.TextPainter;
-import mightypork.gamecore.gui.events.CrossfadeRequest;
import mightypork.gamecore.gui.events.ScreenRequest;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.resources.fonts.GLFont;
-import mightypork.gamecore.util.Utils;
import mightypork.gamecore.util.ion.Ion;
import mightypork.gamecore.util.ion.IonBundle;
import mightypork.gamecore.util.math.color.pal.RGB;
import mightypork.gamecore.util.math.constraints.num.Num;
import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.strings.StringProvider;
-import mightypork.rogue.GameStateManager.GameState;
import mightypork.rogue.Res;
-import mightypork.rogue.events.GameStateRequest;
-import mightypork.rogue.screens.LoaderRequest;
+import mightypork.rogue.events.LoadingOverlayRequest;
+import mightypork.rogue.screens.PushButton;
import mightypork.rogue.world.World;
import mightypork.rogue.world.WorldProvider;
@@ -47,8 +42,13 @@ public class WorldSlot extends ConstraintLayout {
private IonBundle worldBundle;
+ private PushButton loadBtn;
- public WorldSlot(AppAccess app, File worldFile) {
+ private PushButton delBtn;
+
+
+ public WorldSlot(AppAccess app, File worldFile)
+ {
super(app);
this.file = worldFile;
@@ -60,7 +60,7 @@ public class WorldSlot extends ConstraintLayout {
@Override
public double value()
{
- return isMouseOver() ? 0.2 : 0.1;
+ return isMouseOver() ? 0.15 : 0.1;
}
}));
@@ -68,18 +68,20 @@ public class WorldSlot extends ConstraintLayout {
add(qp);
final GridLayout gridl = new GridLayout(app, 1, 8);
- gridl.setRect(innerRect.shrink(width().perc(10), Num.ZERO));
+ final Num shrinkH = width().perc(8);
+ final Num shrinkV = height().perc(10);
+ gridl.setRect(innerRect.shrink(shrinkH, shrinkH, shrinkV, shrinkV.half()));
add(gridl);
- TextPainter tp;
- ClickableWrapper btn;
final GLFont font = Res.getFont("thick");
- tp = new TextPainter(font, AlignX.LEFT, RGB.WHITE, lblStrp);
- tp.setPaddingHPerc(0, 20);
+ gridl.put(loadBtn = new PushButton(font, "", RGB.WHITE), 0, 0, 1, 7);
+ loadBtn.textPainter.setPaddingHPerc(0, 20);
+ loadBtn.textPainter.setAlign(AlignX.LEFT);
+ loadBtn.textPainter.setText(lblStrp);
+ loadBtn.disableHover();
- gridl.put(btn = new ClickableWrapper(tp), 0, 0, 1, 7);
- btn.setAction(new Action() {
+ loadBtn.setAction(new Action() {
@Override
protected void execute()
@@ -92,7 +94,7 @@ public class WorldSlot extends ConstraintLayout {
msg = "Creating world...";
}
- getEventBus().send(new LoaderRequest(msg, new Runnable() {
+ getEventBus().send(new LoadingOverlayRequest(msg, new Runnable() {
@Override
public void run()
@@ -109,7 +111,7 @@ public class WorldSlot extends ConstraintLayout {
getEventBus().send(new ScreenRequest("game"));
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("Could not create & save the world.", e);
}
@@ -123,7 +125,7 @@ public class WorldSlot extends ConstraintLayout {
getEventBus().send(new ScreenRequest("game"));
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("Could not load the world.", e);
}
}
@@ -134,10 +136,12 @@ public class WorldSlot extends ConstraintLayout {
}
});
- tp = new TextPainter(font, AlignX.LEFT, RGB.RED, "X");
- tp.setPaddingHPerc(0, 20);
- gridl.put(btn = new ClickableWrapper(tp), 0, 7, 1, 1);
- btn.setAction(new Action() {
+ gridl.put(delBtn = new PushButton(font, "X", RGB.RED), 0, 7, 1, 1);
+ delBtn.textPainter.setPaddingHPerc(0, 20);
+ delBtn.textPainter.setAlign(AlignX.RIGHT);
+ delBtn.disableHover();
+
+ delBtn.setAction(new Action() {
@Override
protected void execute()
@@ -153,6 +157,9 @@ public class WorldSlot extends ConstraintLayout {
public void refresh()
{
+ delBtn.setVisible(false);
+ delBtn.setEnabled(false);
+
if (!file.exists()) {
label = "";
} else {
@@ -161,8 +168,11 @@ public class WorldSlot extends ConstraintLayout {
final int lvl = worldBundle.get("meta.last_level", -1);
if (lvl == -1) throw new RuntimeException(); // let the catch block handle it
-
- label = "Floor " + (lvl + 1);
+
+ label = "Level " + (lvl + 1);
+ delBtn.setVisible(true);
+ delBtn.setEnabled(true);
+
} catch (final IOException e) {
label = "";
}
diff --git a/src/mightypork/rogue/world/PlayerFacade.java b/src/mightypork/rogue/world/PlayerFacade.java
index 02ec7e8..85bc7d9 100644
--- a/src/mightypork/rogue/world/PlayerFacade.java
+++ b/src/mightypork/rogue/world/PlayerFacade.java
@@ -22,10 +22,19 @@ import mightypork.rogue.world.level.Level;
*/
public class PlayerFacade {
- /** */
+ /** a world */
private final World world;
+ /**
+ * @return true if can go up
+ */
+ public boolean canAscend()
+ {
+ return world.playerData.getLevelNumber() > 0;
+ }
+
+
/**
* @param world
*/
@@ -35,12 +44,18 @@ public class PlayerFacade {
}
- public boolean canAscend()
+ /**
+ * @return true if can go down
+ */
+ public boolean canDescend()
{
- return world.playerData.getLevelNumber() > 0;
+ return world.playerData.getLevelNumber() < world.levels.size() - 1;
}
+ /**
+ * Go one level down if applicable
+ */
public void descend()
{
if (!canDescend()) return;
@@ -58,12 +73,9 @@ public class PlayerFacade {
}
- public boolean canDescend()
- {
- return world.playerData.getLevelNumber() < world.levels.size() - 1;
- }
-
-
+ /**
+ * Go one level up if applicable
+ */
public void ascend()
{
if (!canAscend()) return;
@@ -90,36 +102,56 @@ public class PlayerFacade {
}
+ /**
+ * @return current level
+ */
public Level getLevel()
{
return world.levels.get(world.playerData.getLevelNumber());
}
+ /**
+ * @return entity ID
+ */
public int getEID()
{
return world.playerData.getEID();
}
+ /**
+ * @return entity coordinate in level
+ */
public Coord getCoord()
{
return world.playerEntity.getCoord();
}
+ /**
+ * @return entity visual pos in level
+ */
public Vect getVisualPos()
{
return world.playerEntity.pos.getVisualPos();
}
+ /**
+ * Find path to
+ *
+ * @param pos
+ */
public void navigateTo(Coord pos)
{
world.playerEntity.pos.navigateTo(pos);
}
+ /**
+ * Discard steps in buffer
+ */
public void cancelPath()
{
world.playerEntity.pos.cancelPath();
@@ -366,8 +398,8 @@ public class PlayerFacade {
{
return world;
}
-
-
+
+
public boolean canGoTo(Step side)
{
return getEntity().pos.canGoTo(side);
diff --git a/src/mightypork/rogue/world/World.java b/src/mightypork/rogue/world/World.java
index 426a8d4..451642e 100644
--- a/src/mightypork/rogue/world/World.java
+++ b/src/mightypork/rogue/world/World.java
@@ -22,7 +22,7 @@ import mightypork.rogue.world.level.Level;
/**
- * World on a server. To a server, all players and levels are equal.
+ * World object.
*
* @author MightyPork
*/
@@ -80,18 +80,18 @@ public class World implements DelegatingClient, BusAccess, IonObjBundled, Pausea
in.loadBundled("player", playerData);
- int eid = playerData.getEID();
- int lvl = playerData.getLevelNumber();
+ final int eid = playerData.getEID();
+ final int lvl = playerData.getLevelNumber();
playerEntity = levels.get(lvl).getEntity(eid);
if (playerEntity == null) {
Log.e("Player entity not found in the world: " + eid + " on floor " + lvl);
- for(int i=0; i
+ * Modules make up an entity AI and behavior.
*
* @author MightyPork
*/
@@ -26,6 +26,9 @@ public abstract class EntityModule implements IonObjBundled, Updateable {
}
+ /**
+ * @return whether the module should be saved into a world file
+ */
public abstract boolean isModuleSaved();
diff --git a/src/mightypork/rogue/world/entity/EntityPathFinder.java b/src/mightypork/rogue/world/entity/EntityPathFinder.java
index 2193c0d..03e238c 100644
--- a/src/mightypork/rogue/world/entity/EntityPathFinder.java
+++ b/src/mightypork/rogue/world/entity/EntityPathFinder.java
@@ -8,6 +8,11 @@ import mightypork.gamecore.util.math.algo.pathfinding.Heuristic;
import mightypork.gamecore.util.math.algo.pathfinding.PathFinder;
+/**
+ * Basic Pathfinder implementation for entities
+ *
+ * @author MightyPork
+ */
public class EntityPathFinder extends PathFinder {
protected final Entity entity;
diff --git a/src/mightypork/rogue/world/entity/EntityRenderer.java b/src/mightypork/rogue/world/entity/EntityRenderer.java
index 19705ee..deb464c 100644
--- a/src/mightypork/rogue/world/entity/EntityRenderer.java
+++ b/src/mightypork/rogue/world/entity/EntityRenderer.java
@@ -4,6 +4,11 @@ package mightypork.rogue.world.entity;
import mightypork.rogue.world.level.render.MapRenderContext;
+/**
+ * Entity renderer
+ *
+ * @author MightyPork
+ */
public abstract class EntityRenderer {
public abstract void render(MapRenderContext context);
diff --git a/src/mightypork/rogue/world/entity/EntityType.java b/src/mightypork/rogue/world/entity/EntityType.java
index ec7c639..5375bfd 100644
--- a/src/mightypork/rogue/world/entity/EntityType.java
+++ b/src/mightypork/rogue/world/entity/EntityType.java
@@ -8,5 +8,10 @@ package mightypork.rogue.world.entity;
*/
public enum EntityType
{
- PLAYER, MONSTER, PASSIVE;
+ /** Player entity */
+ PLAYER,
+ /** Monster entity */
+ MONSTER,
+ /** Non-mobile entity */
+ PASSIVE;
}
diff --git a/src/mightypork/rogue/world/entity/impl/BossRatAi.java b/src/mightypork/rogue/world/entity/impl/BossRatAi.java
index f63c6ca..fc1fb54 100644
--- a/src/mightypork/rogue/world/entity/impl/BossRatAi.java
+++ b/src/mightypork/rogue/world/entity/impl/BossRatAi.java
@@ -48,6 +48,7 @@ public class BossRatAi extends GrayRatAi {
healTimer.update(delta);
}
+
@Override
protected double getStepTime()
{
diff --git a/src/mightypork/rogue/world/entity/impl/BrownRatAi.java b/src/mightypork/rogue/world/entity/impl/BrownRatAi.java
index 68eb9da..f466391 100644
--- a/src/mightypork/rogue/world/entity/impl/BrownRatAi.java
+++ b/src/mightypork/rogue/world/entity/impl/BrownRatAi.java
@@ -36,6 +36,7 @@ public class BrownRatAi extends GrayRatAi {
return Calc.randInt(7, 12);
}
+
@Override
protected double getStepTime()
{
diff --git a/src/mightypork/rogue/world/entity/impl/GrayRatAi.java b/src/mightypork/rogue/world/entity/impl/GrayRatAi.java
index 17453e2..29c7b19 100644
--- a/src/mightypork/rogue/world/entity/impl/GrayRatAi.java
+++ b/src/mightypork/rogue/world/entity/impl/GrayRatAi.java
@@ -42,7 +42,7 @@ public class GrayRatAi extends MonsterAi {
{
return Calc.randInt(7, 11);
}
-
+
@Override
protected double getStepTime()
diff --git a/src/mightypork/rogue/world/entity/impl/MonsterAi.java b/src/mightypork/rogue/world/entity/impl/MonsterAi.java
index 158ec1b..133c102 100644
--- a/src/mightypork/rogue/world/entity/impl/MonsterAi.java
+++ b/src/mightypork/rogue/world/entity/impl/MonsterAi.java
@@ -57,14 +57,14 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
if (!isIdle()) return;
// annoyed by attacking.
- if(entity.getLastAttackTime() < 0.5) {
+ if (entity.getLastAttackTime() < 0.5) {
lookForTarget();
return;
}
- if(entity.pos.isMoving()) return;
+ if (entity.pos.isMoving()) return;
- if(Calc.rand.nextInt(10) == 0) {
+ if (Calc.rand.nextInt(10) == 0) {
entity.pos.addStep(Sides.randomCardinal());
}
}
@@ -76,7 +76,8 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
private int preyId = -1;
- public MonsterAi(final Entity entity) {
+ public MonsterAi(final Entity entity)
+ {
super(entity);
noDoorPf = new PathFinderProxy(entity.getPathFinder()) {
@@ -189,7 +190,6 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
{
return !chasing;
}
-
public boolean isChasing()
@@ -197,10 +197,11 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
return chasing;
}
+
private void lookForTarget()
{
if (entity.isDead()) return;
-
+
final Entity prey = entity.getLevel().getClosestEntity(entity.pos.getVisualPos(), EntityType.PLAYER, getScanRadius());
if (prey != null) {
@@ -208,7 +209,7 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
final List noDoorPath = noDoorPf.findPath(entity.getCoord(), prey.getCoord());
if (noDoorPath == null) return; // cant reach, give up
-
+
startChasing(prey);
}
}
@@ -340,6 +341,7 @@ public class MonsterAi extends EntityModule implements EntityMoveListener {
return 1; // For override
}
+
@DefaultImpl
protected double getStepTime()
{
diff --git a/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java b/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java
index c4e5592..7be52f3 100644
--- a/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java
+++ b/src/mightypork/rogue/world/entity/modules/EntityModulePosition.java
@@ -67,6 +67,11 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * Set coord without animation
+ *
+ * @param coord coord
+ */
public void setCoord(Coord coord)
{
freeTile(); // release old tile
@@ -79,6 +84,9 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * Occupy current tile in level
+ */
public void occupyTile()
{
if (entity.getLevel() != null) {
@@ -87,6 +95,9 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * free current tile in level
+ */
public void freeTile()
{
if (entity.getLevel() != null) {
@@ -152,12 +163,20 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * @return true if path buffer is empty
+ */
public boolean isPathFinished()
{
return entityPos.isFinished() && path.isEmpty();
}
+ /**
+ * Add a step to path buffer
+ *
+ * @param step
+ */
public void addStep(Step step)
{
if (path.isEmpty() && !canGoTo(step)) return;
@@ -166,12 +185,21 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * Discard steps in buffer
+ */
public void cancelPath()
{
path.clear();
}
+ /**
+ * Find path to
+ *
+ * @param target
+ * @return path found
+ */
public boolean navigateTo(Coord target)
{
if (target.equals(getCoord())) return true;
@@ -195,36 +223,49 @@ public class EntityModulePosition extends EntityModule {
}
+ /**
+ * Add steps to path buffer
+ *
+ * @param path steps
+ */
public void addSteps(List path)
{
this.path.addAll(path);
}
+ /**
+ * @return coord in level
+ */
public Coord getCoord()
{
return entityPos.getCoord();
}
- public double getStepTime()
- {
- return stepTime;
- }
-
-
+ /**
+ * Set step time (seconds)
+ *
+ * @param stepTime step time
+ */
public void setStepTime(double stepTime)
{
this.stepTime = stepTime;
}
+ /**
+ * @return step progress 0..1
+ */
public double getProgress()
{
return entityPos.getProgress();
}
+ /**
+ * @return visual pos in level; interpolated from last to new coord
+ */
public VectConst getVisualPos()
{
return entityPos.getVisualPos();
diff --git a/src/mightypork/rogue/world/events/PlayerStepEndEvent.java b/src/mightypork/rogue/world/events/PlayerStepEndEvent.java
index cf7c9d5..bdb72f2 100644
--- a/src/mightypork/rogue/world/events/PlayerStepEndEvent.java
+++ b/src/mightypork/rogue/world/events/PlayerStepEndEvent.java
@@ -2,11 +2,11 @@ package mightypork.rogue.world.events;
import mightypork.gamecore.eventbus.BusEvent;
-import mightypork.gamecore.eventbus.event_flags.UnloggedEvent;
+import mightypork.gamecore.eventbus.event_flags.NotLoggedEvent;
import mightypork.rogue.world.entity.impl.PlayerEntity;
-@UnloggedEvent
+@NotLoggedEvent
public class PlayerStepEndEvent extends BusEvent {
private final PlayerEntity player;
diff --git a/src/mightypork/rogue/world/gen/LevelGenerator.java b/src/mightypork/rogue/world/gen/LevelGenerator.java
index 8a7fa91..81b3bec 100644
--- a/src/mightypork/rogue/world/gen/LevelGenerator.java
+++ b/src/mightypork/rogue/world/gen/LevelGenerator.java
@@ -43,7 +43,7 @@ public class LevelGenerator {
if (rand.nextInt(6) > 0) map.addRoom(Rooms.DEAD_END, false);
}
- for (int i = 0; i < Calc.randInt(rand, 1, (int)Math.ceil(level / 2D)); i++) {
+ for (int i = 0; i < Calc.randInt(rand, 1, (int) Math.ceil(level / 2D)); i++) {
map.addRoom(Rooms.TREASURE, false);
}
@@ -103,12 +103,12 @@ public class LevelGenerator {
map.putEntityInMap(e, 30);
- if(rand.nextInt(6+level/2)==0) {
- map.putItemInMap(Items.CHEESE.createItem(), 10);
+ if (rand.nextInt(6 + level / 2) == 0) {
+ map.putItemInMap(Items.CHEESE.createItem(), 10);
}
- if(rand.nextInt(6)==0) {
- map.putItemInMap(Items.MEAT.createItem(), 10);
+ if (rand.nextInt(6) == 0) {
+ map.putItemInMap(Items.MEAT.createItem(), 10);
}
}
diff --git a/src/mightypork/rogue/world/gui/Minimap.java b/src/mightypork/rogue/world/gui/Minimap.java
index ffb7149..4c0eb0d 100644
--- a/src/mightypork/rogue/world/gui/Minimap.java
+++ b/src/mightypork/rogue/world/gui/Minimap.java
@@ -12,6 +12,7 @@ import mightypork.gamecore.util.math.constraints.num.Num;
import mightypork.gamecore.util.math.constraints.rect.Rect;
import mightypork.gamecore.util.math.constraints.rect.mutable.RectMutable;
import mightypork.gamecore.util.math.constraints.vect.Vect;
+import mightypork.rogue.Config;
import mightypork.rogue.world.PlayerFacade;
import mightypork.rogue.world.WorldProvider;
import mightypork.rogue.world.level.Level;
@@ -55,7 +56,7 @@ public class Minimap extends InputComponent implements MouseButtonListener {
for (pos.x = 0, point.x = tl.xi(); pos.x < lw; pos.x++, point.x += unit) {
final Tile t = lvl.getTile(pos);
- if (t.isNull() || !t.isExplored()) continue;
+ if (t.isNull() || (!t.isExplored() && Config.RENDER_UFOG)) continue;
final Color clr = t.getMapColor();
diff --git a/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java b/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
index 13e2e22..61921f6 100644
--- a/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
+++ b/src/mightypork/rogue/world/gui/interaction/MIPKeyboard.java
@@ -49,7 +49,7 @@ public class MIPKeyboard extends MapInteractionPlugin implements PlayerStepEndLi
if (evt.isDown() || mapView.plc.getPlayer().isMoving()) return; // not interested
- if(InputSystem.getModifierKeys() != Keys.MOD_NONE) return;
+ if (InputSystem.getModifierKeys() != Keys.MOD_NONE) return;
for (int i = 0; i < 4; i++) {
if (evt.getKey() == keys[i]) {
@@ -65,8 +65,8 @@ public class MIPKeyboard extends MapInteractionPlugin implements PlayerStepEndLi
if (mapView.plc.getPlayer().getMoveProgress() < 0.8) return false;
-
- if(InputSystem.getModifierKeys() != Keys.MOD_NONE) return false;
+
+ if (InputSystem.getModifierKeys() != Keys.MOD_NONE) return false;
for (int i = 0; i < 4; i++) {
diff --git a/src/mightypork/rogue/world/item/Item.java b/src/mightypork/rogue/world/item/Item.java
index 93edba7..80c2eb1 100644
--- a/src/mightypork/rogue/world/item/Item.java
+++ b/src/mightypork/rogue/world/item/Item.java
@@ -2,7 +2,6 @@ package mightypork.rogue.world.item;
import java.io.IOException;
-import java.util.Random;
import mightypork.gamecore.logging.Log;
import mightypork.gamecore.util.annot.DefaultImpl;
diff --git a/src/mightypork/rogue/world/item/ItemModel.java b/src/mightypork/rogue/world/item/ItemModel.java
index 81f45eb..eab653e 100644
--- a/src/mightypork/rogue/world/item/ItemModel.java
+++ b/src/mightypork/rogue/world/item/ItemModel.java
@@ -2,7 +2,6 @@ package mightypork.rogue.world.item;
import java.io.IOException;
-import java.util.Random;
import mightypork.gamecore.util.ion.IonInput;
import mightypork.gamecore.util.ion.IonOutput;
diff --git a/src/mightypork/rogue/world/level/Level.java b/src/mightypork/rogue/world/level/Level.java
index 1606443..e4a11a2 100644
--- a/src/mightypork/rogue/world/level/Level.java
+++ b/src/mightypork/rogue/world/level/Level.java
@@ -24,7 +24,6 @@ import mightypork.gamecore.util.math.noise.NoiseGen;
import mightypork.rogue.world.World;
import mightypork.rogue.world.entity.Entities;
import mightypork.rogue.world.entity.Entity;
-import mightypork.rogue.world.entity.EntityPathFinder;
import mightypork.rogue.world.entity.EntityType;
import mightypork.rogue.world.entity.impl.PlayerEntity;
import mightypork.rogue.world.item.Item;
@@ -124,11 +123,13 @@ public class Level implements BusAccess, Updateable, DelegatingClient, Toggleabl
private double timeSinceLastEntitySort;
- public Level() {
+ public Level()
+ {
}
- public Level(int width, int height) {
+ public Level(int width, int height)
+ {
size.setTo(width, height);
buildArray();
}
@@ -164,7 +165,7 @@ public class Level implements BusAccess, Updateable, DelegatingClient, Toggleabl
public final Tile getTile(Coord pos)
{
if (!pos.isInRange(0, 0, size.x - 1, size.y - 1)) return Tiles.NULL.createTile(); // out of range
-
+
return tiles[pos.y][pos.x];
}
diff --git a/src/mightypork/rogue/world/level/render/TileRenderContext.java b/src/mightypork/rogue/world/level/render/TileRenderContext.java
index 6bc7db6..1101310 100644
--- a/src/mightypork/rogue/world/level/render/TileRenderContext.java
+++ b/src/mightypork/rogue/world/level/render/TileRenderContext.java
@@ -67,6 +67,12 @@ public final class TileRenderContext extends MapRenderContext implements RectBou
}
+ public void renderUFog()
+ {
+ map.getTile(pos).renderUFog(this);
+ }
+
+
public void renderItems()
{
map.getTile(pos).renderExtra(this);
diff --git a/src/mightypork/rogue/world/tile/Tile.java b/src/mightypork/rogue/world/tile/Tile.java
index 1c93c47..03d7606 100644
--- a/src/mightypork/rogue/world/tile/Tile.java
+++ b/src/mightypork/rogue/world/tile/Tile.java
@@ -2,7 +2,6 @@ package mightypork.rogue.world.tile;
import java.io.IOException;
-import java.util.Random;
import mightypork.gamecore.eventbus.BusAccess;
import mightypork.gamecore.eventbus.EventBus;
@@ -61,6 +60,13 @@ public abstract class Tile implements BusAccess, IonObjBlob {
renderer.renderTile(context);
if (doesReceiveShadow()) renderer.renderShadows(context);
+ }
+
+
+ @DefaultImpl
+ public void renderUFog(TileRenderContext context)
+ {
+ initRenderer();
renderer.renderUnexploredFog(context);
}
diff --git a/src/mightypork/rogue/world/tile/TileRenderer.java b/src/mightypork/rogue/world/tile/TileRenderer.java
index d1fee55..8834b6c 100644
--- a/src/mightypork/rogue/world/tile/TileRenderer.java
+++ b/src/mightypork/rogue/world/tile/TileRenderer.java
@@ -6,7 +6,6 @@ import mightypork.gamecore.render.Render;
import mightypork.gamecore.resources.textures.TxQuad;
import mightypork.gamecore.util.math.algo.Sides;
import mightypork.gamecore.util.math.constraints.rect.Rect;
-import mightypork.rogue.Config;
import mightypork.rogue.Res;
import mightypork.rogue.world.level.render.TileRenderContext;
import mightypork.rogue.world.tile.render.NullTileRenderer;
@@ -22,7 +21,7 @@ public abstract class TileRenderer implements Updateable {
public static final TileRenderer NONE = new NullTileRenderer();
private static TxQuad SH_N, SH_S, SH_E, SH_W, SH_NW, SH_NE, SH_SW, SH_SE;
- private static TxQuad UFOG_N, UFOG_S, UFOG_E, UFOG_W, UFOG_NW, UFOG_NE, UFOG_SW, UFOG_SE;
+ private static TxQuad UFOG_N, UFOG_S, UFOG_E, UFOG_W, UFOG_NW, UFOG_NE, UFOG_SW, UFOG_SE, UFOG_FULL;
private static boolean inited;
@@ -62,6 +61,7 @@ public abstract class TileRenderer implements Updateable {
UFOG_NE = Res.txq("tile.ufog.ne");
UFOG_SW = Res.txq("tile.ufog.sw");
UFOG_SE = Res.txq("tile.ufog.se");
+ UFOG_FULL = Res.txq("tile.ufog.full");
inited = true;
}
}
@@ -105,10 +105,15 @@ public abstract class TileRenderer implements Updateable {
public void renderUnexploredFog(TileRenderContext context)
{
- if (!Config.RENDER_UFOG) return;
-
// TODO cache values, update neighbouring tiles upon "explored" flag changed.
+ final Rect rect = context.getRect();
+
+ if (!context.getTile().isExplored()) {
+ Render.quadTextured(rect, UFOG_FULL);
+ return;
+ }
+
byte ufog = 0;
for (int i = 0; i < 8; i++) {
@@ -120,7 +125,6 @@ public abstract class TileRenderer implements Updateable {
if (ufog == 0) return;
- final Rect rect = context.getRect();
if ((ufog & Sides.NW_CORNER) == Sides.MASK_NW) Render.quadTextured(rect, UFOG_NW);
if ((ufog & Sides.MASK_N) != 0) Render.quadTextured(rect, UFOG_N);
if ((ufog & Sides.NE_CORNER) == Sides.MASK_NE) Render.quadTextured(rect, UFOG_NE);
@@ -131,6 +135,7 @@ public abstract class TileRenderer implements Updateable {
if ((ufog & Sides.SW_CORNER) == Sides.MASK_SW) Render.quadTextured(rect, UFOG_SW);
if ((ufog & Sides.MASK_S) != 0) Render.quadTextured(rect, UFOG_S);
if ((ufog & Sides.SE_CORNER) == Sides.MASK_SE) Render.quadTextured(rect, UFOG_SE);
+
}