forked from jzitnik/twodcraft
258 lines
9.3 KiB
Java
258 lines
9.3 KiB
Java
package cz.jzitnik.game.ui;
|
|
|
|
import cz.jzitnik.game.Block;
|
|
import cz.jzitnik.game.Game;
|
|
import cz.jzitnik.game.items.InventoryItem;
|
|
import cz.jzitnik.game.items.Item;
|
|
import cz.jzitnik.game.smelting.Smelting;
|
|
import cz.jzitnik.tui.ScreenRenderer;
|
|
import cz.jzitnik.tui.SpriteList;
|
|
import cz.jzitnik.tui.utils.Numbers;
|
|
import cz.jzitnik.tui.utils.SpriteCombiner;
|
|
import org.jline.terminal.MouseEvent;
|
|
import org.jline.terminal.Terminal;
|
|
|
|
import java.util.List;
|
|
import java.util.Optional;
|
|
|
|
public class Furnace {
|
|
private final Block block;
|
|
private final InventoryItem[] items = new InventoryItem[2];
|
|
private InventoryItem outputItem;
|
|
private int size;
|
|
private boolean smelting;
|
|
|
|
private static final int COLUMN_AMOUNT = 3;
|
|
private static final int CELL_WIDTH = 50;
|
|
private static final int CELL_HEIGHT = 27;
|
|
private static final int BORDER_SIZE = 2;
|
|
|
|
public Furnace(Block block) {
|
|
this.block = block;
|
|
}
|
|
|
|
public void render(Game game, StringBuilder buffer, Terminal terminal, SpriteList spriteList) {
|
|
int widthPixels = COLUMN_AMOUNT * (CELL_WIDTH + BORDER_SIZE) + BORDER_SIZE;
|
|
var inventory = game.getInventory();
|
|
int moveLeft = (terminal.getWidth() / 2) - (widthPixels / 2);
|
|
|
|
List<String> sprites = game.getInventory().getSprites(items, spriteList, inventory.getSelectedItemInv() - 50);
|
|
|
|
String[] outputSprite = outputItem == null ? null : SpriteCombiner.combineTwoSprites(
|
|
spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(),
|
|
Numbers.getNumberSprite(outputItem.getAmount())
|
|
).split("\n");
|
|
|
|
for (int j = 0; j < CELL_HEIGHT; j++) {
|
|
buffer.append("\033[0m").append(" ".repeat(moveLeft));
|
|
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
if (j == 0 || j == CELL_HEIGHT - 1) {
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(CELL_WIDTH));
|
|
} else {
|
|
if (items[0] == null) {
|
|
buffer.append("\033[0m ".repeat(CELL_WIDTH));
|
|
} else {
|
|
String sprite = sprites.get(0);
|
|
String[] spriteLines = sprite.split("\n");
|
|
buffer.append(spriteLines[j - 1]);
|
|
}
|
|
}
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
|
|
buffer.append("\n");
|
|
}
|
|
|
|
for (int j = 0; j < CELL_HEIGHT; j++) {
|
|
buffer.append("\033[0m").append(" ".repeat(moveLeft));
|
|
|
|
buffer.append("\033[0m").append(" ".repeat(2 * (2 * BORDER_SIZE + CELL_WIDTH)));
|
|
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
if (j == 0 || j == CELL_HEIGHT - 1) {
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(CELL_WIDTH));
|
|
} else {
|
|
if (outputItem == null) {
|
|
buffer.append("\033[0m ".repeat(CELL_WIDTH));
|
|
} else {
|
|
buffer.append(outputSprite[j - 1]);
|
|
}
|
|
}
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
buffer.append("\n");
|
|
}
|
|
|
|
for (int j = 0; j < CELL_HEIGHT; j++) {
|
|
buffer.append("\033[0m").append(" ".repeat(moveLeft));
|
|
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
if (j == 0 || j == CELL_HEIGHT - 1) {
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(CELL_WIDTH));
|
|
} else {
|
|
if (items[1] == null) {
|
|
buffer.append("\033[0m ".repeat(CELL_WIDTH));
|
|
} else {
|
|
String sprite = sprites.get(1);
|
|
String[] spriteLines = sprite.split("\n");
|
|
buffer.append(spriteLines[j - 1]);
|
|
}
|
|
}
|
|
buffer.append("\033[38;5;231;48;5;231m▓".repeat(BORDER_SIZE));
|
|
|
|
buffer.append("\n");
|
|
}
|
|
|
|
buffer.append("\n".repeat(20));
|
|
|
|
size = buffer.toString().split("\n").length;
|
|
|
|
game.getInventory().renderFull(buffer, terminal, spriteList, false, Optional.of(size));
|
|
}
|
|
|
|
public void click(Game game, MouseEvent mouseEvent, Terminal terminal, ScreenRenderer screenRenderer) {
|
|
int x = mouseEvent.getX();
|
|
int y = mouseEvent.getY();
|
|
int widthPixels = COLUMN_AMOUNT * (CELL_WIDTH + BORDER_SIZE) + BORDER_SIZE;
|
|
int moveLeft = (terminal.getWidth() / 2) - (widthPixels / 2);
|
|
|
|
if (x > moveLeft && x <= moveLeft + CELL_WIDTH + BORDER_SIZE && y > 0 && y < CELL_HEIGHT && mouseEvent.getType() == MouseEvent.Type.Pressed) {
|
|
InventoryItem selectedItem = game.getInventory().getSelectedItemNo(Optional.of(items));
|
|
if (selectedItem != null && !Smelting.smeltingList.containsKey(selectedItem.getItem().getFirst().getId())) {
|
|
return;
|
|
}
|
|
|
|
InventoryClickHandler.handleItemClick(mouseEvent, game.getInventory(), items, 0, 50, Optional.of(items));
|
|
|
|
screenRenderer.render(game);
|
|
checkSmelt(game, screenRenderer);
|
|
} else if (x > moveLeft + (2 * (2 * BORDER_SIZE + CELL_WIDTH)) && x <= moveLeft + (3 * (2 * BORDER_SIZE + CELL_WIDTH)) && y > CELL_HEIGHT && y <= 2*CELL_HEIGHT && mouseEvent.getType() == MouseEvent.Type.Pressed) {
|
|
pickup(game);
|
|
screenRenderer.render(game);
|
|
} else if (x > moveLeft && x <= moveLeft + CELL_WIDTH + BORDER_SIZE && y > 2 * CELL_HEIGHT && y < 3 * CELL_HEIGHT && mouseEvent.getType() == MouseEvent.Type.Pressed) {
|
|
InventoryItem selectedItem = game.getInventory().getSelectedItemNo(Optional.of(items));
|
|
if (selectedItem != null && !Smelting.fuelList.containsKey(selectedItem.getItem().getFirst().getId())) {
|
|
return;
|
|
}
|
|
|
|
InventoryClickHandler.handleItemClick(mouseEvent, game.getInventory(), items, 1, 50, Optional.of(items));
|
|
|
|
screenRenderer.render(game);
|
|
checkSmelt(game, screenRenderer);
|
|
} else {
|
|
InventoryClickHandler.click(mouseEvent, terminal, screenRenderer, game, Optional.of(size + 20), Optional.of(items));
|
|
}
|
|
}
|
|
|
|
public void setSmelting(boolean smelting) {
|
|
this.smelting = smelting;
|
|
this.block.setSpriteState(smelting ? cz.jzitnik.game.sprites.Furnace.FurnaceState.ON : cz.jzitnik.game.sprites.Furnace.FurnaceState.OFF);
|
|
}
|
|
|
|
public void checkSmelt(Game game, ScreenRenderer screenRenderer) {
|
|
if (items[0] == null || items[1] == null) {
|
|
return;
|
|
}
|
|
|
|
if (!smelting) {
|
|
startSmelting(game, screenRenderer);
|
|
}
|
|
}
|
|
|
|
public void rerender(Game game, ScreenRenderer screenRenderer) {
|
|
if (game.getWindow() == Window.FURNACE) {
|
|
screenRenderer.render(game);
|
|
}
|
|
}
|
|
|
|
public void pickup(Game game) {
|
|
if (outputItem == null) {
|
|
return;
|
|
}
|
|
|
|
game.getInventory().addItem(outputItem);
|
|
outputItem = null;
|
|
}
|
|
|
|
public void startSmelting(Game game, ScreenRenderer screenRenderer) {
|
|
setSmelting(true);
|
|
|
|
// Add smelt item
|
|
Thread thread1 = new Thread(() -> {
|
|
while (true) {
|
|
try {
|
|
Thread.sleep(10000);
|
|
} catch (InterruptedException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
if (smelting) {
|
|
var supplier = Smelting.smeltingList.get(items[0].getItem().getFirst().getId());
|
|
if (outputItem == null) {
|
|
outputItem = new InventoryItem(1, supplier.get());
|
|
} else {
|
|
outputItem.add(supplier.get());
|
|
}
|
|
|
|
items[0].decrease();
|
|
if (items[0].getAmount() == 0) {
|
|
items[0] = null;
|
|
}
|
|
rerender(game, screenRenderer);
|
|
}
|
|
|
|
if (items[0] == null || !smelting) {
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
Thread thread2 = new Thread(() -> {
|
|
while (true) {
|
|
Item fuel = items[1].getItem().getFirst();
|
|
double smelts = Smelting.fuelList.get(fuel.getId());
|
|
|
|
items[1].decrease();
|
|
if (items[1].getAmount() == 0) {
|
|
items[1] = null;
|
|
}
|
|
rerender(game, screenRenderer);
|
|
|
|
try {
|
|
Thread.sleep((long) (10000 * smelts));
|
|
} catch (InterruptedException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
if (items[0] == null || items[1] == null) {
|
|
setSmelting(false);
|
|
rerender(game, screenRenderer);
|
|
break;
|
|
}
|
|
|
|
rerender(game, screenRenderer);
|
|
}
|
|
});
|
|
|
|
thread1.start();
|
|
thread2.start();
|
|
}
|
|
|
|
public void breakBlock(Game game) {
|
|
for (var i = 0; i < items.length; i++) {
|
|
if (items[i] == null) {
|
|
continue;
|
|
}
|
|
|
|
game.getInventory().addItem(items[i]);
|
|
items[i] = null;
|
|
}
|
|
|
|
if (outputItem != null) {
|
|
game.getInventory().addItem(outputItem);
|
|
outputItem = null;
|
|
}
|
|
|
|
setSmelting(false);
|
|
}
|
|
}
|