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); + }