From 3f0ccc49a889fb4b3bff2ec613561a476c0d476a Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Tue, 16 Dec 2025 22:00:38 +0100 Subject: [PATCH] feat: Fully working chest --- .../handlers/PlayerMoveEventHandler.java | 10 +- .../java/cz/jzitnik/game/ResourceManager.java | 2 + .../cz/jzitnik/game/items/WoodenSword.java | 2 +- .../java/cz/jzitnik/game/objects/Chest.java | 122 ++++++++++++++++-- .../resources/textures/tools/wooden_sword.png | Bin 0 -> 471 bytes 5 files changed, 122 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/textures/tools/wooden_sword.png diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index 2e86d8d..794b568 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -51,6 +51,8 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerX <= 30) { @@ -70,7 +72,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerY >= 110) { @@ -79,7 +81,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { if (originalPlayerX >= 155) { @@ -88,7 +90,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler(), player, playerTexture, x, y).pixel(); // This will never reach doors so no need to load texture + int red = (intPixel >> 16) & 0xff; + int green = (intPixel >> 8) & 0xff; + int blue = intPixel & 0xff; + + Pixel pixel = new ColoredPixel(new TextColor.RGB(red, green, blue)); + + buffer[y + start.getY()][x + start.getX()] = pixel; + overrideBuffer[y][x] = new Empty(); + } + } + + guiStart = new TerminalPosition(chestGUIStartX2 / 2, chestGUIStartY); + guiEnd = new TerminalPosition((chestGUIStartX2 + chestUISizeX - 1) / 2, ((chestGUIStartY + chestUISizeY - 1) / 2)); + } + + if (!items.isEmpty()) { + for (int y = chestGUIStartY; y < chestGUIStartY + chestUISizeY; y++) { + for (int x = chestGUIStartX; x < chestGUIStartX + chestUISizeX; x++) { + int objectX = x - chestGUIStartX; + int objectY = y - chestGUIStartY; + + Pixel pixel = getPixel(objectX, objectY, chestUISizeX, chestUISizeY); + + buffer[y + start.getY()][x + start.getX()] = pixel; + overrideBuffer[y][x] = pixel; + } } } @@ -102,8 +143,71 @@ public final class Chest extends GameObject implements Interactable, UIClickHand eventManager.emitEvent(RerenderScreen.full(terminalState.getTerminalScreen().getTerminalSize())); // TODO: Make this not rerender full screen } + // TODO: Add some padding on the item + private Pixel getPixel(int objectX, int objectY, int chestUISizeX, int chestUISizeY) { + if (objectX >= 0 && objectX <= 1 || objectX >= chestUISizeX - 2 && objectX <= chestUISizeX - 1 || objectY >= 0 && objectY <= 1 || objectY >= chestUISizeY - 2 && objectY <= chestUISizeY - 1) { + return new ColoredPixel(new TextColor.RGB(0, 0, 0)); + } + + int screenX = objectX - 2; + int screenY = objectY - 2; + int part = screenX / 18; + int rest = screenX % 18; + + if (rest == 16 || rest == 17) { + return new ColoredPixel(new TextColor.RGB(0, 0, 0)); + } + + GameItem item = items.get(part); + BufferedImage texture = item.getTexture(); + log.debug("{} {}", rest, screenY); + int pixel = texture.getRGB(rest, screenY); + + int alpha = (pixel >> 24) & 0xff; + + if (alpha == 0) { + return new ColoredPixel( + new TextColor.RGB(255, 255, 255) + ); + } + + int red = (pixel >> 16) & 0xff; + int green = (pixel >> 8) & 0xff; + int blue = pixel & 0xff; + + return new ColoredPixel( + new TextColor.RGB(red, green, blue) + ); + } + @Override public void handleClick(MouseAction mouseAction) { - log.debug("Test"); + int mouseX = mouseAction.getPosition().getColumn(); + int mouseY = mouseAction.getPosition().getRow(); + + log.debug("Mouse: x: {}, y: {}", mouseX, mouseY); + + int screenX = mouseX - actualDisplayStartX; + int screenY = (mouseY * 2) - actualDisplayStartY; + + log.debug("Screen: x: {}, y: {}", screenX, screenY); + + int part = screenX / 18; + + if (screenX < 0 || screenY < 0 || screenX > chestUISizeX || screenY > chestUISizeY || part >= items.size()) { + return; + } + + int rest = screenX % 18; + if (rest == 17 || rest == 16) { + return; + } + + GameItem item = items.get(part); + items.remove(part); + + // TODO: Add item to inventory + + render(true); } } diff --git a/src/main/resources/textures/tools/wooden_sword.png b/src/main/resources/textures/tools/wooden_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebcb5c4a97ad0ca29dfa291fae6a681e2f49cd9 GIT binary patch literal 471 zcmV;|0Vw{7P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGf6951U69E94oEQKA00(qQO+^Rk3=j}24&|6BY5)KM zElET{R5;6>lFdp&VGxF&`M%@N$&k#7K-vUJl+>mW0vA>g1np{J3)^)A-H~p(fp!_R zZ>6*-s35AvNfLwz>g2R2#8AuQ3j?#5XXc$@gdt?DsEDP-Cw2&45AqA7CP%q>YT^VT zBcO$RhD0)nuMK>^707`WHZxp5yf6~Alq*$0MFxcrw^s2QP2%w|rPCUK0RKC197l`m z8SbC!OpL`TRjO_HSJH3ter}PgdXwo`h?9%kE~ak-5z#_!9@mZX{^3(TtM#n!w4#Wh zsxlReXl{9iJMWcrYMkTq%f7=*I}yW9b{1odrc((Xy*GT{{}b+cu%q3qy4LFUN?HL8 z{AGadt<9;31c!eh1+=)a6sU=I#P>~%QIP>wa6_gG4kDvAJm^#P)E9)QW4G3CrA+_; N002ovPDHLkV1mb|xh4Pr literal 0 HcmV?d00001