diff --git a/src/main/java/cz/jzitnik/Game.java b/src/main/java/cz/jzitnik/Game.java index 57420ff..8c236f5 100644 --- a/src/main/java/cz/jzitnik/Game.java +++ b/src/main/java/cz/jzitnik/Game.java @@ -1,5 +1,6 @@ package cz.jzitnik; +import cz.jzitnik.game.GameSetup; import cz.jzitnik.utils.DependencyManager; import org.reflections.Reflections; @@ -8,6 +9,10 @@ public class Game { public void start() { Cli cli = dependencyManager.getDependencyOrThrow(Cli.class); + + GameSetup gameSetup = dependencyManager.getDependencyOrThrow(GameSetup.class); + gameSetup.setup(); + cli.run(); } } diff --git a/src/main/java/cz/jzitnik/config/RoomSizeConfig.java b/src/main/java/cz/jzitnik/config/RoomSizeConfig.java deleted file mode 100644 index 4b2ba6a..0000000 --- a/src/main/java/cz/jzitnik/config/RoomSizeConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package cz.jzitnik.config; - -import cz.jzitnik.annotations.Config; -import lombok.Getter; - -@Config -@Getter -public class RoomSizeConfig { - private final int roomHeight = 450; - private final int roomWidth = 450; -} diff --git a/src/main/java/cz/jzitnik/events/FullRoomDraw.java b/src/main/java/cz/jzitnik/events/FullRoomDraw.java index cff76fc..cd2e707 100644 --- a/src/main/java/cz/jzitnik/events/FullRoomDraw.java +++ b/src/main/java/cz/jzitnik/events/FullRoomDraw.java @@ -1,6 +1,13 @@ package cz.jzitnik.events; import cz.jzitnik.utils.events.Event; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +@AllArgsConstructor +@NoArgsConstructor +@Getter public class FullRoomDraw implements Event { + private boolean fullRerender = false; } diff --git a/src/main/java/cz/jzitnik/events/PlayerMoveEvent.java b/src/main/java/cz/jzitnik/events/PlayerMoveEvent.java new file mode 100644 index 0000000..41169ce --- /dev/null +++ b/src/main/java/cz/jzitnik/events/PlayerMoveEvent.java @@ -0,0 +1,12 @@ +package cz.jzitnik.events; + +import com.googlecode.lanterna.input.KeyStroke; +import cz.jzitnik.utils.events.Event; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class PlayerMoveEvent implements Event { + private KeyStroke keyStroke; +} diff --git a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java b/src/main/java/cz/jzitnik/events/handlers/CliHandler.java index a260657..2fc3c39 100644 --- a/src/main/java/cz/jzitnik/events/handlers/CliHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/CliHandler.java @@ -13,7 +13,6 @@ import cz.jzitnik.utils.DependencyManager; import cz.jzitnik.utils.events.AbstractEventHandler; import lombok.extern.slf4j.Slf4j; -import java.awt.*; import java.io.IOException; @Slf4j @@ -32,7 +31,7 @@ public class CliHandler extends AbstractEventHandler { @Override public void handle(RerenderScreen event) { var parts = event.parts(); - var buffer = screenBuffer.getBuffer(); + var buffer = screenBuffer.getRenderedBuffer(); var terminalScreen = terminalState.getTerminalScreen(); var tg = terminalState.getTextGraphics(); diff --git a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java index 9b7e56b..99a8829 100644 --- a/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/FullRoomDrawHandler.java @@ -9,8 +9,11 @@ import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.events.FullRoomDraw; import cz.jzitnik.events.RerenderScreen; +import cz.jzitnik.game.GameRoom; import cz.jzitnik.game.GameState; +import cz.jzitnik.game.Player; import cz.jzitnik.game.ResourceManager; +import cz.jzitnik.game.utils.RoomCords; import cz.jzitnik.states.RenderState; import cz.jzitnik.states.ScreenBuffer; import cz.jzitnik.states.TerminalState; @@ -22,8 +25,7 @@ import cz.jzitnik.utils.events.EventManager; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Slf4j @EventHandler(FullRoomDraw.class) @@ -50,37 +52,50 @@ public class FullRoomDrawHandler extends AbstractEventHandler { @InjectState private RenderState renderState; + public enum DoorPosition { + TOP, + LEFT, + RIGHT, + BOTTOM, + } + @Override public void handle(FullRoomDraw event) { log.debug("Rendering full room"); TerminalScreen terminalScreen = terminalState.getTerminalScreen(); List partsToRerender = new ArrayList<>(); + GameRoom currentRoom = gameState.getCurrentRoom(); - var buffer = screenBuffer.getBuffer(); + Set doorPositions = getDoorPositions(currentRoom); - BufferedImage room = resourceManager.getResource(ResourceManager.Resource.ROOM1); + var buffer = screenBuffer.getRenderedBuffer(); + + BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + BufferedImage doors = resourceManager.getResource(ResourceManager.Resource.DOORS); + Player player = gameState.getPlayer(); + BufferedImage playerTexture = getPlayer(resourceManager, player); TerminalSize terminalSize = terminalScreen.getTerminalSize(); - int terminalHeight = terminalSize.getRows(); - int terminalWidth = terminalSize.getColumns(); - int width = room.getWidth(); int height = room.getHeight(); - int startX = (terminalWidth - (width * 2)) / 2; - int startY = (terminalHeight - height) / 2; + var start = getStart(room, terminalSize); + int startX = start.getX(); + int startY = start.getY(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - int pixel = room.getRGB(x, y); - int red = (pixel >> 16) & 0xff; + int pixel = getPixel(room, doors, doorPositions, player, playerTexture, x, y); + int red = (pixel >> 16) & 0xff; int green = (pixel >> 8) & 0xff; - int blue = pixel & 0xff; + int blue = pixel & 0xff; Pixel pixel1 = new ColoredPixel(new TextColor.RGB(red, green, blue)); buffer[y + startY][x * 2 + startX] = pixel1; buffer[y + startY][x * 2 + 1 + startX] = pixel1; + /*unrenderedBuffer[y + startY][x * 2 + startX].addFirst(pixel1); + unrenderedBuffer[y + startY][x * 2 + 1 + startX].addFirst(pixel1);*/ } } partsToRerender.add(new RerenderScreen.ScreenPart( @@ -88,12 +103,75 @@ public class FullRoomDrawHandler extends AbstractEventHandler { new TerminalPosition(startY + height - 1, (startX + height - 1) * 2) )); - if (renderState.isFirstRender()) { + if (renderState.isFirstRender() || event.isFullRerender()) { eventManager.emitEvent(RerenderScreen.full(terminalSize)); renderState.setFirstRender(false); } else { - eventManager.emitEvent(new RerenderScreen(partsToRerender.toArray(RerenderScreen.ScreenPart[]::new))); } } + + public static RoomCords getStart(BufferedImage room, TerminalSize terminalSize) { + int width = room.getWidth(); + int height = room.getHeight(); + int terminalHeight = terminalSize.getRows(); + int terminalWidth = terminalSize.getColumns(); + + int x = (terminalWidth - (width * 2)) / 2; + int y = (terminalHeight - height) / 2; + + return new RoomCords(x, y); + } + + public static int getPixel(BufferedImage room, BufferedImage doors, Set doorPositions, Player player, BufferedImage playerTexture, int x, int y) { + if (x >= player.getPlayerCords().getX() && x < player.getPlayerCords().getX() + playerTexture.getWidth() - 1 && y >= player.getPlayerCords().getY() && y <= player.getPlayerCords().getY() + playerTexture.getHeight() - 1) { + int pixel = playerTexture.getRGB(x - player.getPlayerCords().getX(), y - player.getPlayerCords().getY()); + int alpha = (pixel >> 24) & 0xff; + + if (alpha != 0) { + return pixel; + } + } + + record DoorBounds(int startX, int startY, int endX, int endY) { + boolean contains(int x, int y) { + return x >= startX && x <= endX && y >= startY && y <= endY; + } + } + + Map doorBounds = Map.of( + DoorPosition.TOP, new DoorBounds(96, 13, 132, 47), + DoorPosition.LEFT, new DoorBounds(0, 84, 37, 135), + DoorPosition.RIGHT, new DoorBounds(187, 98, 244, 136), + DoorPosition.BOTTOM, new DoorBounds(84, 190, 140, 225) + ); + + for (DoorPosition pos : doorPositions) { + DoorBounds bounds = doorBounds.get(pos); + if (bounds != null && bounds.contains(x, y)) { + return doors.getRGB(x, y); + } + } + + return room.getRGB(x, y); + } + + public static BufferedImage getPlayer(ResourceManager resourceManager, Player player) { + return resourceManager.getResource(switch (player.getPlayerRotation()) { + case FRONT -> ResourceManager.Resource.PLAYER_FRONT; + case BACK -> ResourceManager.Resource.PLAYER_BACK; + case LEFT -> ResourceManager.Resource.PLAYER_LEFT; + case RIGHT -> ResourceManager.Resource.PLAYER_RIGHT; + }); + } + + public static Set getDoorPositions(GameRoom currentRoom) { + Set doorPositions = new HashSet<>(); + if (currentRoom.getLeft() != null) doorPositions.add(DoorPosition.LEFT); + if (currentRoom.getRight() != null) doorPositions.add(DoorPosition.RIGHT); + if (currentRoom.getUp() != null) doorPositions.add(DoorPosition.TOP); + if (currentRoom.getDown() != null) doorPositions.add(DoorPosition.BOTTOM); + + return doorPositions; + } } diff --git a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java index d1ab6da..338f81b 100644 --- a/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/KeyboardPressEventHandler.java @@ -1,16 +1,10 @@ package cz.jzitnik.events.handlers; -import com.googlecode.lanterna.TerminalPosition; -import com.googlecode.lanterna.TextColor; import com.googlecode.lanterna.input.KeyStroke; import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.events.ExitEvent; import cz.jzitnik.events.KeyboardPressEvent; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.ui.pixels.ColoredPixel; -import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.events.PlayerMoveEvent; import cz.jzitnik.utils.DependencyManager; import cz.jzitnik.utils.events.AbstractEventHandler; import cz.jzitnik.utils.events.EventManager; @@ -21,33 +15,20 @@ public class KeyboardPressEventHandler extends AbstractEventHandler eventManager.emitEvent(new PlayerMoveEvent(keyStroke)); + } break; default: break; diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java new file mode 100644 index 0000000..6b45ff9 --- /dev/null +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -0,0 +1,117 @@ +package cz.jzitnik.events.handlers; + +import com.googlecode.lanterna.TerminalPosition; +import com.googlecode.lanterna.TextColor; +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.FullRoomDraw; +import cz.jzitnik.events.PlayerMoveEvent; +import cz.jzitnik.events.RerenderScreen; +import cz.jzitnik.game.GameRoom; +import cz.jzitnik.game.GameState; +import cz.jzitnik.game.Player; +import cz.jzitnik.game.ResourceManager; +import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.states.ScreenBuffer; +import cz.jzitnik.states.TerminalState; +import cz.jzitnik.ui.pixels.ColoredPixel; +import cz.jzitnik.ui.pixels.Pixel; +import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.utils.events.AbstractEventHandler; +import cz.jzitnik.utils.events.EventManager; +import lombok.extern.slf4j.Slf4j; + +import java.awt.image.BufferedImage; +import java.util.Set; + +@Slf4j +@EventHandler(PlayerMoveEvent.class) +public class PlayerMoveEventHandler extends AbstractEventHandler { + public PlayerMoveEventHandler(DependencyManager dm) { + super(dm); + } + + @InjectState + private GameState gameState; + + @InjectDependency + private EventManager eventManager; + + @InjectState + private TerminalState terminalState; + + @InjectState + private ScreenBuffer screenBuffer; + + @InjectDependency + private ResourceManager resourceManager; + + @Override + public void handle(PlayerMoveEvent event) { + KeyStroke keyStroke = event.getKeyStroke(); + Player player = gameState.getPlayer(); + RoomCords playerCords = player.getPlayerCords(); + + int originalPlayerX = playerCords.getX(); + int originalPlayerY = playerCords.getY(); + switch (keyStroke.getCharacter()) { + case 'w' -> { + if (originalPlayerY <= 10) return; + playerCords.updateCords(player.getPlayerCords().getX(), playerCords.getY() - 5); + } + case 'a' -> { + if (originalPlayerX <= 30) return; + playerCords.updateCords(player.getPlayerCords().getX() - 5, playerCords.getY()); + } + case 's' -> { + if (originalPlayerY >= 110) return; + playerCords.updateCords(player.getPlayerCords().getX(), playerCords.getY() + 5); + } + case 'd' -> { + if (originalPlayerX >= 155) return; + playerCords.updateCords(player.getPlayerCords().getX() + 5, playerCords.getY()); + } + } + int newPlayerX = playerCords.getX(); + int newPlayerY = playerCords.getY(); + + GameRoom currentRoom = gameState.getCurrentRoom(); + BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + BufferedImage doors = resourceManager.getResource(ResourceManager.Resource.DOORS); + BufferedImage playerTexture = FullRoomDrawHandler.getPlayer(resourceManager, player); + Set doorPositions = FullRoomDrawHandler.getDoorPositions(currentRoom); + var buffer = screenBuffer.getRenderedBuffer(); + var start = FullRoomDrawHandler.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); + int startX = start.getX(); + int startY = start.getY(); + + int forStartX = Math.min(originalPlayerX, newPlayerX); + int forStartY = Math.min(originalPlayerY, newPlayerY); + int forEndX = Math.max(originalPlayerX, newPlayerX) + playerTexture.getWidth(); + int forEndY = Math.max(originalPlayerY, newPlayerY) + playerTexture.getHeight(); + + for (int x = forStartX; x <= forEndX; x++) { + for (int y = forStartY; y <= forEndY; y++) { + int pixel = FullRoomDrawHandler.getPixel(room, doors, doorPositions, player, playerTexture, x, y); + + int red = (pixel >> 16) & 0xff; + int green = (pixel >> 8) & 0xff; + int blue = pixel & 0xff; + + Pixel pixel1 = new ColoredPixel(new TextColor.RGB(red, green, blue)); + + buffer[y + startY][x * 2 + startX] = pixel1; + buffer[y + startY][x * 2 + 1 + startX] = pixel1; + } + } + + eventManager.emitEvent(new RerenderScreen( + new RerenderScreen.ScreenPart( + new TerminalPosition(forStartX + startX, forStartY + startY), + new TerminalPosition(forEndX * 2 + 1 + startX, forEndY + startY) + ) + )); + } +} diff --git a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java index 440c124..25f67a4 100644 --- a/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/TerminalResizeEventHandler.java @@ -5,7 +5,6 @@ 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.RerenderScreen; import cz.jzitnik.events.TerminalResizeEvent; import cz.jzitnik.states.ScreenBuffer; import cz.jzitnik.ui.pixels.Empty; @@ -40,7 +39,7 @@ public class TerminalResizeEventHandler extends AbstractEventHandler objects; - - public GameRoom() { - objects = new ArrayList<>(); - } } diff --git a/src/main/java/cz/jzitnik/game/GameSetup.java b/src/main/java/cz/jzitnik/game/GameSetup.java new file mode 100644 index 0000000..f895809 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/GameSetup.java @@ -0,0 +1,25 @@ +package cz.jzitnik.game; + +import cz.jzitnik.annotations.Dependency; +import cz.jzitnik.annotations.injectors.InjectState; +import cz.jzitnik.game.utils.RoomCords; + +import java.util.ArrayList; + +@Dependency +public class GameSetup { + @InjectState + private GameState gameState; + + public void setup() { + GameRoom mainRoom = new GameRoom( + null, null, null, null, + ResourceManager.Resource.ROOM1, + new ArrayList<>() + ); + + gameState.setCurrentRoom(mainRoom); + + gameState.setPlayer(new Player(new RoomCords(155, 110))); + } +} diff --git a/src/main/java/cz/jzitnik/game/GameState.java b/src/main/java/cz/jzitnik/game/GameState.java index 097fd38..4d3fe3d 100644 --- a/src/main/java/cz/jzitnik/game/GameState.java +++ b/src/main/java/cz/jzitnik/game/GameState.java @@ -1,11 +1,13 @@ package cz.jzitnik.game; import cz.jzitnik.annotations.State; -import cz.jzitnik.game.utils.RoomCords; +import lombok.Getter; +import lombok.Setter; @State +@Getter +@Setter public class GameState { private GameRoom currentRoom; - - private RoomCords playerCords; + private Player player; } diff --git a/src/main/java/cz/jzitnik/game/Player.java b/src/main/java/cz/jzitnik/game/Player.java new file mode 100644 index 0000000..3aee2cf --- /dev/null +++ b/src/main/java/cz/jzitnik/game/Player.java @@ -0,0 +1,19 @@ +package cz.jzitnik.game; + +import cz.jzitnik.game.utils.RoomCords; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@RequiredArgsConstructor +@Getter +public class Player { + public enum PlayerRotation { + FRONT, BACK, LEFT, RIGHT + } + + private final RoomCords playerCords; + + @Setter + private PlayerRotation playerRotation = PlayerRotation.FRONT; +} diff --git a/src/main/java/cz/jzitnik/game/ResourceManager.java b/src/main/java/cz/jzitnik/game/ResourceManager.java index 7a5aa06..b76d7f5 100644 --- a/src/main/java/cz/jzitnik/game/ResourceManager.java +++ b/src/main/java/cz/jzitnik/game/ResourceManager.java @@ -19,9 +19,20 @@ public class ResourceManager { @AllArgsConstructor @Getter public enum Resource { - ROOM1("rooms/1.png"); + ROOM1("rooms/1.png"), + ROOM2("rooms/2.png"), + ROOM3("rooms/3.png"), + ROOM4("rooms/4.png"), + ROOM_FROZEN("rooms/frozen.png"), - private final String path; // Field must be final for enum + PLAYER_FRONT("player/front.png"), + PLAYER_BACK("player/back.png"), + PLAYER_LEFT("player/left.png"), + PLAYER_RIGHT("player/right.png"), + + DOORS("rooms/doors.png"); + + private final String path; } private HashMap resourceCache = new HashMap<>(); diff --git a/src/main/java/cz/jzitnik/game/utils/RoomCords.java b/src/main/java/cz/jzitnik/game/utils/RoomCords.java index 79d8bd0..58a4c87 100644 --- a/src/main/java/cz/jzitnik/game/utils/RoomCords.java +++ b/src/main/java/cz/jzitnik/game/utils/RoomCords.java @@ -1,26 +1,17 @@ package cz.jzitnik.game.utils; -import cz.jzitnik.config.RoomSizeConfig; -import cz.jzitnik.game.exceptions.InvalidCoordinatesException; import lombok.Getter; @Getter public class RoomCords { - private final RoomSizeConfig roomSizeConfig; private int x; private int y; - public RoomCords(int x, int y, RoomSizeConfig roomSizeConfig) { - this.roomSizeConfig = roomSizeConfig; - + public RoomCords(int x, int y) { updateCords(x, y); } public void updateCords(int x, int y) { - if (x >= roomSizeConfig.getRoomWidth() || y >= roomSizeConfig.getRoomHeight()) { - throw new InvalidCoordinatesException(); - } - this.x = x; this.y = y; } diff --git a/src/main/java/cz/jzitnik/states/ScreenBuffer.java b/src/main/java/cz/jzitnik/states/ScreenBuffer.java index 1e21769..67a6b15 100644 --- a/src/main/java/cz/jzitnik/states/ScreenBuffer.java +++ b/src/main/java/cz/jzitnik/states/ScreenBuffer.java @@ -7,5 +7,5 @@ import lombok.Data; @Data @State public class ScreenBuffer { - private Pixel[][] buffer = new Pixel[][] {}; + private Pixel[][] renderedBuffer = new Pixel[][] {}; } diff --git a/src/main/java/cz/jzitnik/utils/events/EventManager.java b/src/main/java/cz/jzitnik/utils/events/EventManager.java index d435fb5..e781da0 100644 --- a/src/main/java/cz/jzitnik/utils/events/EventManager.java +++ b/src/main/java/cz/jzitnik/utils/events/EventManager.java @@ -86,7 +86,7 @@ public class EventManager extends Thread { try { handler.handle(typedEvent); } catch (Exception e) { - log.debug(e.toString()); + log.error("Error", e); } }); } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 52ec92f..29dfd0f 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -13,12 +13,6 @@ 30MB - - ERROR - DENY - ACCEPT - - %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n diff --git a/src/main/resources/textures/player/back.png b/src/main/resources/textures/player/back.png new file mode 100644 index 0000000..6d20c0c Binary files /dev/null and b/src/main/resources/textures/player/back.png differ diff --git a/src/main/resources/textures/player/front.png b/src/main/resources/textures/player/front.png new file mode 100644 index 0000000..4d13247 Binary files /dev/null and b/src/main/resources/textures/player/front.png differ diff --git a/src/main/resources/textures/player/left.png b/src/main/resources/textures/player/left.png new file mode 100644 index 0000000..40c0eb4 Binary files /dev/null and b/src/main/resources/textures/player/left.png differ diff --git a/src/main/resources/textures/player/right.png b/src/main/resources/textures/player/right.png new file mode 100644 index 0000000..82bb4c5 Binary files /dev/null and b/src/main/resources/textures/player/right.png differ diff --git a/src/main/resources/textures/rooms/2.png b/src/main/resources/textures/rooms/2.png new file mode 100644 index 0000000..b06a93a Binary files /dev/null and b/src/main/resources/textures/rooms/2.png differ diff --git a/src/main/resources/textures/rooms/3.png b/src/main/resources/textures/rooms/3.png new file mode 100644 index 0000000..42c3846 Binary files /dev/null and b/src/main/resources/textures/rooms/3.png differ diff --git a/src/main/resources/textures/rooms/4.png b/src/main/resources/textures/rooms/4.png new file mode 100644 index 0000000..a25ef24 Binary files /dev/null and b/src/main/resources/textures/rooms/4.png differ diff --git a/src/main/resources/textures/rooms/doors.png b/src/main/resources/textures/rooms/doors.png new file mode 100644 index 0000000..d7b6382 Binary files /dev/null and b/src/main/resources/textures/rooms/doors.png differ diff --git a/src/main/resources/textures/rooms/frozen.png b/src/main/resources/textures/rooms/frozen.png new file mode 100644 index 0000000..7546840 Binary files /dev/null and b/src/main/resources/textures/rooms/frozen.png differ