From c14df96cac5da3a029ed388a15124aadb12f4262 Mon Sep 17 00:00:00 2001 From: pacien Date: Sat, 3 Feb 2018 18:13:50 +0100 Subject: Handle bomb drop Signed-off-by: pacien --- .../java/fr/umlv/java/wallj/block/BombBlock.java | 9 ++++--- .../java/fr/umlv/java/wallj/block/RobotBlock.java | 21 ++++++++++------ .../java/fr/umlv/java/wallj/context/Stage.java | 12 ++++++---- .../fr/umlv/java/wallj/event/BombSetupEvent.java | 28 ---------------------- .../umlv/java/wallj/event/BombTimerIncrEvent.java | 28 ++++++++++++++++++++++ 5 files changed, 56 insertions(+), 42 deletions(-) delete mode 100644 src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java create mode 100644 src/main/java/fr/umlv/java/wallj/event/BombTimerIncrEvent.java (limited to 'src/main') diff --git a/src/main/java/fr/umlv/java/wallj/block/BombBlock.java b/src/main/java/fr/umlv/java/wallj/block/BombBlock.java index baf10b3..ac63a87 100644 --- a/src/main/java/fr/umlv/java/wallj/block/BombBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/BombBlock.java @@ -13,6 +13,7 @@ import java.time.Duration; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Objects; /** * A bomb block. @@ -42,13 +43,15 @@ public class BombBlock extends JBoxBlock { @Override public List update(Context context) { - if (containsUpdateEvent(context.getEvents())) incrementTimer(); + handleBombConfiguration(context.getEvents()); paint(context.getGraphicsContext()); return consume(context.getTimeDelta()); } - private boolean containsUpdateEvent(List events) { - return Events.findFirst(events, BombSetupEvent.class).isPresent(); + private void handleBombConfiguration(List events) { + Events.findFirst(events, BombTimerIncrEvent.class) + .filter(event -> Objects.equals(event.getPos(), TileVec2.of(getPos()))) + .ifPresent(event -> incrementTimer()); } private List consume(Duration timeDelta) { diff --git a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java index 45ed5bd..0969009 100644 --- a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java @@ -5,6 +5,7 @@ import fr.umlv.java.wallj.board.PathFinder; import fr.umlv.java.wallj.board.TileVec2; import fr.umlv.java.wallj.context.Context; import fr.umlv.java.wallj.context.GraphicsContext; +import fr.umlv.java.wallj.context.Stage; import fr.umlv.java.wallj.event.*; import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; @@ -12,9 +13,7 @@ import org.jbox2d.dynamics.World; import java.awt.*; import java.time.Duration; -import java.util.Collections; -import java.util.Deque; -import java.util.LinkedList; +import java.util.*; import java.util.List; /** @@ -23,7 +22,7 @@ import java.util.List; * @author Pacien TRAN-GIRARD */ public class RobotBlock extends Block { - private static final float SPEED = 0.2f; // px/ms + private static final float SPEED = 4f; // px/ms private Vec2 pos; private PathFinder pathFinder; @@ -56,12 +55,14 @@ public class RobotBlock extends Block { move(context.getTimeDelta()); paint(context.getGraphicsContext()); - return setupBomb(context.getEvents()); + return setupBomb(context.getEvents(), context.getGame().getCurrentStage()); } - private List setupBomb(List events) { + private List setupBomb(List events, Stage stage) { return Events.findFirst(events, BombSetupOrder.class) - .map(event -> Collections.singletonList(new BombSetupEvent(TileVec2.of(pos)))) + .map(event -> isOnBomb(stage) ? + Collections.singletonList(new BombTimerIncrEvent(getTile())) : + Collections.singletonList(new BlockCreateEvent(BlockType.BOMB, getTile()))) .orElse(Collections.emptyList()); } @@ -83,4 +84,10 @@ public class RobotBlock extends Block { private void paint(GraphicsContext graphicsContext) { graphicsContext.paintCircle(Color.BLUE, getPos(), TileVec2.TILE_DIM / 2); } + + private boolean isOnBomb(Stage stage) { + return stage.getBlocks().stream() + .anyMatch(block -> Objects.equals(block.getType(), BlockType.BOMB) && + Objects.equals(block.getPos(), getTile().toVec2())); + } } diff --git a/src/main/java/fr/umlv/java/wallj/context/Stage.java b/src/main/java/fr/umlv/java/wallj/context/Stage.java index 8ef4558..49aa196 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Stage.java +++ b/src/main/java/fr/umlv/java/wallj/context/Stage.java @@ -11,10 +11,7 @@ import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; import java.time.Duration; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; /** * @author Pacien TRAN-GIRARD @@ -51,6 +48,13 @@ public class Stage implements Updateable { return board; } + /** + * @return the list of blocks + */ + public List getBlocks() { + return Collections.unmodifiableList(blocks); + } + /** * @return T(this stage is cleared, i.e. does not contain any garbage block) * @implNote TODO: profile this and consider a garbage block counter diff --git a/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java b/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java deleted file mode 100644 index 620eea2..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java +++ /dev/null @@ -1,28 +0,0 @@ -package fr.umlv.java.wallj.event; - -import fr.umlv.java.wallj.board.TileVec2; - -import java.util.Objects; - -/** - * Bomb setup event signalling the creation or the update of a bomb at a given position. - * - * @author Pacien TRAN-GIRARD - */ -public final class BombSetupEvent implements GameEvent { - private final TileVec2 pos; - - /** - * @param pos requested setup position - */ - public BombSetupEvent(TileVec2 pos) { - this.pos = Objects.requireNonNull(pos); - } - - /** - * @return the setup position - */ - public TileVec2 getPos() { - return pos; - } -} diff --git a/src/main/java/fr/umlv/java/wallj/event/BombTimerIncrEvent.java b/src/main/java/fr/umlv/java/wallj/event/BombTimerIncrEvent.java new file mode 100644 index 0000000..cbfe6e5 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/event/BombTimerIncrEvent.java @@ -0,0 +1,28 @@ +package fr.umlv.java.wallj.event; + +import fr.umlv.java.wallj.board.TileVec2; + +import java.util.Objects; + +/** + * Bomb setup event signalling the update of a bomb at a given position. + * + * @author Pacien TRAN-GIRARD + */ +public final class BombTimerIncrEvent implements GameEvent { + private final TileVec2 pos; + + /** + * @param pos requested setup position + */ + public BombTimerIncrEvent(TileVec2 pos) { + this.pos = Objects.requireNonNull(pos); + } + + /** + * @return the setup position + */ + public TileVec2 getPos() { + return pos; + } +} -- cgit v1.2.3