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 0000000..6ebcb5c Binary files /dev/null and b/src/main/resources/textures/tools/wooden_sword.png differ