diff --git a/src/main/java/cz/jzitnik/events/RoomChangeEvent.java b/src/main/java/cz/jzitnik/events/RoomChangeEvent.java new file mode 100644 index 0000000..4ca1766 --- /dev/null +++ b/src/main/java/cz/jzitnik/events/RoomChangeEvent.java @@ -0,0 +1,7 @@ +package cz.jzitnik.events; + +import cz.jzitnik.events.handlers.FullRoomDrawHandler; +import cz.jzitnik.utils.events.Event; + +public record RoomChangeEvent(FullRoomDrawHandler.DoorPosition door) implements Event { +} diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java index 181cd55..42c31ae 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java @@ -96,9 +96,10 @@ public class FullRoomDrawHandler extends AbstractEventHandler { buffer[y + startY][x * 2 + 1 + startX] = pixel1; } } + partsToRerender.add(new RerenderScreen.ScreenPart( new TerminalPosition(startX, startY), - new TerminalPosition(startY + height - 1, (startX + height - 1) * 2) + new TerminalPosition(startX + width * 2, startY + height - 1) )); if (renderState.isFirstRender() || event.isFullRerender()) { diff --git a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java index 338f81b..ce70507 100644 --- a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java @@ -2,9 +2,12 @@ package cz.jzitnik.events.handlers; import com.googlecode.lanterna.input.KeyStroke; import cz.jzitnik.annotations.EventHandler; +import cz.jzitnik.annotations.injectors.InjectDependency; +import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.events.ExitEvent; import cz.jzitnik.events.KeyboardPressEvent; import cz.jzitnik.events.PlayerMoveEvent; +import cz.jzitnik.game.GameState; import cz.jzitnik.utils.DependencyManager; import cz.jzitnik.utils.events.AbstractEventHandler; import cz.jzitnik.utils.events.EventManager; @@ -15,9 +18,18 @@ public class KeyboardPressEventHandler extends AbstractEventHandler { public MouseActionEventHandler(DependencyManager dm) { @@ -17,10 +23,25 @@ public class MouseActionEventHandler extends AbstractEventHandler { @InjectDependency private EventManager eventManager; + @InjectState + private GameState gameState; + @Override public void handle(MouseAction event) { + if (gameState.getScreen() != null) { + gameState.getScreen().handleMouseAction(event); + return; + } + switch (event.getActionType()) { case MOVE -> eventManager.emitEvent(new MouseMoveEvent(event)); + case CLICK_RELEASE -> { + Optional object = gameState.getCurrentRoom().getObjects().stream().filter(GameObject::isSelected).findFirst(); + + if (object.isEmpty()) return; + + ((Interactable) object.get()).interact(dm); + } } } } diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index c41b323..cceedcf 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -7,6 +7,7 @@ import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.events.PlayerMoveEvent; import cz.jzitnik.events.RerenderScreen; +import cz.jzitnik.events.RoomChangeEvent; import cz.jzitnik.game.GameRoom; import cz.jzitnik.game.GameState; import cz.jzitnik.game.Player; @@ -55,24 +56,45 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { - if (originalPlayerY <= 10) return; + if (originalPlayerY <= 10) { + if (originalPlayerX >= 80 && originalPlayerX <= 105) { + eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.TOP)); + } + return; + } playerCords.updateCords(player.getPlayerCords().getX(), playerCords.getY() - 5); } case 'a' -> { - if (originalPlayerX <= 30) return; + if (originalPlayerX <= 30) { + if (originalPlayerY >= 35 && originalPlayerY <= 65) { + eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.LEFT)); + } + return; + } playerCords.updateCords(player.getPlayerCords().getX() - 5, playerCords.getY()); } case 's' -> { - if (originalPlayerY >= 110) return; + if (originalPlayerY >= 110) { + if (originalPlayerX >= 75 && originalPlayerX <= 105) { + eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.BOTTOM)); + } + return; + } playerCords.updateCords(player.getPlayerCords().getX(), playerCords.getY() + 5); } case 'd' -> { - if (originalPlayerX >= 155) return; + if (originalPlayerX >= 155) { + if (originalPlayerY >= 40 && originalPlayerY <= 60) { + eventManager.emitEvent(new RoomChangeEvent(FullRoomDrawHandler.DoorPosition.RIGHT)); + } + return; + } playerCords.updateCords(player.getPlayerCords().getX() + 5, playerCords.getY()); } } int newPlayerX = playerCords.getX(); int newPlayerY = playerCords.getY(); + log.debug("x: {}, y: {}", newPlayerX, newPlayerY); BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); int forStartX = Math.min(originalPlayerX, newPlayerX); int forStartY = Math.min(originalPlayerY, newPlayerY); diff --git a/src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java new file mode 100644 index 0000000..7a134b4 --- /dev/null +++ b/src/main/java/cz/jzitnik/events/handlers/RoomChangeEventHandler.java @@ -0,0 +1,54 @@ +package cz.jzitnik.events.handlers; + +import cz.jzitnik.annotations.EventHandler; +import cz.jzitnik.annotations.injectors.InjectDependency; +import cz.jzitnik.annotations.injectors.InjectState; +import cz.jzitnik.events.FullRoomDraw; +import cz.jzitnik.events.RoomChangeEvent; +import cz.jzitnik.game.GameRoom; +import cz.jzitnik.game.GameState; +import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.utils.events.EventManager; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@EventHandler(RoomChangeEvent.class) +public class RoomChangeEventHandler extends AbstractEventHandler { + public RoomChangeEventHandler(DependencyManager dm) { + super(dm); + } + + @InjectState + private GameState gameState; + + @InjectDependency + private EventManager eventManager; + + @Override + public void handle(RoomChangeEvent event) { + RoomCords playerCords = gameState.getPlayer().getPlayerCords(); + GameRoom currentRoom = gameState.getCurrentRoom(); + GameRoom newRoom = switch (event.door()) { + case LEFT -> currentRoom.getLeft(); + case RIGHT -> currentRoom.getRight(); + case TOP -> currentRoom.getUp(); + case BOTTOM -> currentRoom.getDown(); + }; + + if (newRoom == null) { + return; + } + + switch (event.door()) { + case LEFT -> playerCords.updateCords(155, 60); + case RIGHT -> playerCords.updateCords(30, 50); + case TOP -> playerCords.updateCords(90, 110); + case BOTTOM -> playerCords.updateCords(85, 10); + } + + gameState.setCurrentRoom(newRoom); + eventManager.emitEvent(new FullRoomDraw()); + } +} diff --git a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java index 25f67a4..7e10c39 100644 --- a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java @@ -41,6 +41,6 @@ public class TerminalResizeEventHandler extends AbstractEventHandler