package cz.jzitnik.game.ui; import cz.jzitnik.game.crafting.CraftingRecipe; import cz.jzitnik.game.crafting.CraftingRecipeList; import cz.jzitnik.game.entities.items.InventoryItem; import cz.jzitnik.tui.utils.SpriteCombiner; import cz.jzitnik.tui.SpriteList; import cz.jzitnik.tui.utils.Numbers; import lombok.Getter; import java.util.Arrays; import java.util.List; import java.util.Optional; public class SmallCraftingTable { public static final int ROW_AMOUNT = 2; public static final int COLUMN_AMOUNT = 2; private Inventory inventory; @Getter private InventoryItem[] items = new InventoryItem[4]; public void pickup() { Optional recipe = CraftingRecipeList.getRecipe(Arrays.stream(items) .map(item -> item == null ? null : item.getItem().getFirst().getId()).toArray(String[]::new)); if (recipe.isPresent()) { InventoryItem item = recipe.get().getItemSupplier().get(); inventory.addItem(item); for (int i = 0; i < items.length; i++) { InventoryItem it = items[i]; if (it == null) { continue; } if (it.getAmount() == 1) { items[i] = null; } else { it.decrease(); } } } } public StringBuilder render(SpriteList spriteList) { var buf = new StringBuilder(); List sprites = inventory.getSprites(items, spriteList, inventory.getSelectedItemInv() - 29); Optional recipe = CraftingRecipeList.getRecipe(Arrays.stream(items) .map(item -> item == null ? null : item.getItem().getFirst().getId()).toArray(String[]::new)); Optional craftedItem = recipe.map(craftingRecipe -> craftingRecipe.getItemSupplier().get()); String[] craftedSprite = craftedItem.map(inventoryItem -> SpriteCombiner.combineTwoSprites( inventoryItem.getItem().getFirst().getSpriteState().isPresent() ? spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()) .getSprite(inventoryItem.getItem().getFirst().getSpriteState().get()) : spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(), Numbers.getNumberSprite(inventoryItem.getAmount(), spriteList)).split("\n")).orElse(null); int counter = 0; for (int i = 0; i < ROW_AMOUNT; i++) { for (int j = 0; j < 26; j++) { if (j == 25) { buf.append("\033[38;5;231;48;5;231m▓".repeat(106)); } else { for (int k = 0; k < COLUMN_AMOUNT; k++) { buf.append("\033[38;5;231;48;5;231m▓".repeat(2)); String sprite = sprites.get(i * 2 + k); if (sprite == null) { buf.append("\033[0m ".repeat(50)); } else { String[] spriteLines = sprite.split("\n"); buf.append(spriteLines[j]); } } buf.append("\033[38;5;231;48;5;231m▓".repeat(2)); } if (i == 0 && j > 10 || i == 1 && j < 12) { buf.append("\033[0m").append(" ".repeat(7)); if (i == 0 && j - 11 == 0 || i == 1 && j == 11) { buf.append("\033[38;5;231;48;5;231m▓".repeat(54)); } else { buf.append("\033[38;5;231;48;5;231m▓".repeat(2)); if (craftedItem.isEmpty()) { buf.append("\033[0m ".repeat(50)); } else { buf.append(craftedSprite[counter]); counter++; } buf.append("\033[38;5;231;48;5;231m▓".repeat(2)); } } buf.append("\n"); } } buf.append("\033[0m"); return buf; } public SmallCraftingTable(Inventory inventory) { this.inventory = inventory; } }