twodcraft/src/main/java/cz/jzitnik/game/ui/SmallCraftingTable.java
2025-03-25 12:58:14 +01:00

111 lines
4.2 KiB
Java

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<CraftingRecipe> 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<String> sprites = inventory.getSprites(items, spriteList, inventory.getSelectedItemInv() - 29);
Optional<CraftingRecipe> recipe = CraftingRecipeList.getRecipe(Arrays.stream(items)
.map(item -> item == null ? null : item.getItem().getFirst().getId()).toArray(String[]::new));
Optional<InventoryItem> 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;
}
}