chore: Some changes
This commit is contained in:
@ -634,4 +634,8 @@ public class Game {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Object getContext(Class clazz) {
|
||||||
|
return gameStates.globalContextProvider.getMap(clazz);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ public class SpriteLoader {
|
|||||||
SPRITES_MAP.put(SPRITES.WOODEN_SHOVEL, new SimpleSprite("items/wooden_shovel.ans"));
|
SPRITES_MAP.put(SPRITES.WOODEN_SHOVEL, new SimpleSprite("items/wooden_shovel.ans"));
|
||||||
SPRITES_MAP.put(SPRITES.WOODEN_HOE, new SimpleSprite("items/wooden_hoe.ans"));
|
SPRITES_MAP.put(SPRITES.WOODEN_HOE, new SimpleSprite("items/wooden_hoe.ans"));
|
||||||
|
|
||||||
SPRITES_MAP.put(SPRITES.STONE_SWORD, new SimpleSprite("items/wooden_sword.ans"));
|
SPRITES_MAP.put(SPRITES.STONE_SWORD, new SimpleSprite("items/stone_sword.ans"));
|
||||||
SPRITES_MAP.put(SPRITES.STONE_PICKAXE, new SimpleSprite("items/stone_pickaxe.ans"));
|
SPRITES_MAP.put(SPRITES.STONE_PICKAXE, new SimpleSprite("items/stone_pickaxe.ans"));
|
||||||
SPRITES_MAP.put(SPRITES.STONE_AXE, new SimpleSprite("items/stone_axe.ans"));
|
SPRITES_MAP.put(SPRITES.STONE_AXE, new SimpleSprite("items/stone_axe.ans"));
|
||||||
SPRITES_MAP.put(SPRITES.STONE_SHOVEL, new SimpleSprite("items/stone_shovel.ans"));
|
SPRITES_MAP.put(SPRITES.STONE_SHOVEL, new SimpleSprite("items/stone_shovel.ans"));
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package cz.jzitnik.game.annotations;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
public @interface GlobalContext {
|
||||||
|
|
||||||
|
}
|
66
src/main/java/cz/jzitnik/game/blocks/Bed.java
Normal file
66
src/main/java/cz/jzitnik/game/blocks/Bed.java
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package cz.jzitnik.game.blocks;
|
||||||
|
|
||||||
|
import cz.jzitnik.game.Game;
|
||||||
|
import cz.jzitnik.game.annotations.RightClickLogic;
|
||||||
|
import cz.jzitnik.game.context.list.BedSleepGlobalContext;
|
||||||
|
import cz.jzitnik.game.handlers.rightclick.RightClickHandler;
|
||||||
|
import cz.jzitnik.tui.ScreenRenderer;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.ScheduledFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@RightClickLogic
|
||||||
|
public class Bed implements RightClickHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBlockRightClick(int x, int y, Game game, ScreenRenderer screenRenderer) {
|
||||||
|
BedSleepGlobalContext bedSleepGlobalContext =
|
||||||
|
(BedSleepGlobalContext) game.getContext(BedSleepGlobalContext.class);
|
||||||
|
|
||||||
|
if (bedSleepGlobalContext.isSleeping() || game.getDaytime() < 200 || game.getDaytime() > 500) {
|
||||||
|
return; // already in progress
|
||||||
|
}
|
||||||
|
|
||||||
|
bedSleepGlobalContext.setSleeping(true);
|
||||||
|
|
||||||
|
int targetTime = 500;
|
||||||
|
int step = 10;
|
||||||
|
long delayMillis = 50; // animation speed
|
||||||
|
|
||||||
|
// Create a brand-new scheduler for this run
|
||||||
|
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||||
|
|
||||||
|
final ScheduledFuture<?>[] futureHolder = new ScheduledFuture<?>[1];
|
||||||
|
|
||||||
|
Runnable sleepTask = () -> {
|
||||||
|
int currentTime = game.getDaytime();
|
||||||
|
|
||||||
|
if (currentTime == targetTime) {
|
||||||
|
// cancel this repeating task + shut down the scheduler
|
||||||
|
futureHolder[0].cancel(false);
|
||||||
|
scheduler.shutdown();
|
||||||
|
bedSleepGlobalContext.setSleeping(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nextTime = (currentTime + step) % 600;
|
||||||
|
|
||||||
|
if (currentTime < targetTime && nextTime >= targetTime) {
|
||||||
|
nextTime = targetTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextTime < currentTime && nextTime >= targetTime) {
|
||||||
|
nextTime = targetTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
game.setDaytime(nextTime);
|
||||||
|
screenRenderer.render(game);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Schedule the task and keep its handle
|
||||||
|
futureHolder[0] = scheduler.scheduleAtFixedRate(
|
||||||
|
sleepTask, 0, delayMillis, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
}
|
@ -22,7 +22,7 @@ import java.util.Optional;
|
|||||||
|
|
||||||
@RightClickLogic
|
@RightClickLogic
|
||||||
public class Furnace implements RightClickHandler, Serializable {
|
public class Furnace implements RightClickHandler, Serializable {
|
||||||
private final Block block;
|
private Block block;
|
||||||
private final InventoryItem[] items = new InventoryItem[2];
|
private final InventoryItem[] items = new InventoryItem[2];
|
||||||
private InventoryItem outputItem;
|
private InventoryItem outputItem;
|
||||||
private int size;
|
private int size;
|
||||||
@ -37,6 +37,8 @@ public class Furnace implements RightClickHandler, Serializable {
|
|||||||
this.block = block;
|
this.block = block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Furnace() {}
|
||||||
|
|
||||||
public void render(Game game, StringBuilder buffer, Terminal terminal, SpriteList spriteList) {
|
public void render(Game game, StringBuilder buffer, Terminal terminal, SpriteList spriteList) {
|
||||||
int widthPixels = COLUMN_AMOUNT * (CELL_WIDTH + BORDER_SIZE) + BORDER_SIZE;
|
int widthPixels = COLUMN_AMOUNT * (CELL_WIDTH + BORDER_SIZE) + BORDER_SIZE;
|
||||||
var inventory = game.getInventory();
|
var inventory = game.getInventory();
|
||||||
@ -193,7 +195,7 @@ public class Furnace implements RightClickHandler, Serializable {
|
|||||||
|
|
||||||
// Add smelt item
|
// Add smelt item
|
||||||
Thread thread1 = new Thread(() -> {
|
Thread thread1 = new Thread(() -> {
|
||||||
while (true) {
|
do {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(10000);
|
Thread.sleep(10000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@ -215,10 +217,7 @@ public class Furnace implements RightClickHandler, Serializable {
|
|||||||
rerender(game, screenRenderer);
|
rerender(game, screenRenderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (items[0] == null || !smelting) {
|
} while (items[0] != null && smelting);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Thread thread2 = new Thread(() -> {
|
Thread thread2 = new Thread(() -> {
|
||||||
|
@ -0,0 +1,33 @@
|
|||||||
|
package cz.jzitnik.game.context;
|
||||||
|
|
||||||
|
import cz.jzitnik.game.annotations.GlobalContext;
|
||||||
|
import org.reflections.Reflections;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class GlobalContextProvider {
|
||||||
|
private final Map<Class, Object> data = new HashMap<>();
|
||||||
|
private boolean loaded = false;
|
||||||
|
|
||||||
|
public Object getMap(Class<?> clazz) {
|
||||||
|
if (!loaded) {
|
||||||
|
Reflections reflections = new Reflections("cz.jzitnik.game.context");
|
||||||
|
Set<Class<?>> handlerClasses = reflections.getTypesAnnotatedWith(GlobalContext.class);
|
||||||
|
|
||||||
|
for (Class<?> claz : handlerClasses) {
|
||||||
|
try {
|
||||||
|
Object instance = claz.getDeclaredConstructor().newInstance();
|
||||||
|
data.put(claz, instance);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return data.get(clazz);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package cz.jzitnik.game.context.list;
|
||||||
|
|
||||||
|
import cz.jzitnik.game.annotations.GlobalContext;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@GlobalContext
|
||||||
|
public class BedSleepGlobalContext {
|
||||||
|
private boolean sleeping = false;
|
||||||
|
}
|
@ -92,22 +92,33 @@ public class CraftingRecipeList {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean are2DArraysIdentical(String[][] array1, String[][] array2, boolean usingRegex) {
|
public static boolean are2DArraysIdentical(String[][] array1, String[][] array2, boolean usingRegex) {
|
||||||
|
if (array1 == null || array2 == null) {
|
||||||
|
return array1 == array2;
|
||||||
|
}
|
||||||
|
|
||||||
if (array1.length != array2.length) {
|
if (array1.length != array2.length) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < array1.length; i++) {
|
for (int i = 0; i < array1.length; i++) {
|
||||||
|
if (array1[i] == null || array2[i] == null) {
|
||||||
|
if (array1[i] != array2[i]) return false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (array1[i].length != array2[i].length) {
|
if (array1[i].length != array2[i].length) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < array1[i].length; j++) {
|
for (int j = 0; j < array1[i].length; j++) {
|
||||||
if (array1[i][j] == null && array2[i][j] != null) {
|
String a = array1[i][j];
|
||||||
return false;
|
String b = array2[i][j];
|
||||||
}
|
|
||||||
if (array1[i][j] != null
|
if (a == null || b == null) {
|
||||||
&& (usingRegex ? !array2[i][j].matches(array1[i][j]) : !array1[i][j].equals(array2[i][j]))) {
|
if (a != b) return false; // one null, one not -> false
|
||||||
return false;
|
} else {
|
||||||
|
boolean equal = usingRegex ? b.matches(a) : a.equals(b);
|
||||||
|
if (!equal) return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
package cz.jzitnik.game.entities;
|
package cz.jzitnik.game.entities;
|
||||||
|
|
||||||
import cz.jzitnik.game.Game;
|
import cz.jzitnik.game.Game;
|
||||||
|
import cz.jzitnik.game.context.GlobalContextProvider;
|
||||||
import cz.jzitnik.game.ui.CraftingTable;
|
import cz.jzitnik.game.ui.CraftingTable;
|
||||||
|
|
||||||
public class GameStates {
|
public class GameStates {
|
||||||
public CraftingTable craftingTable;
|
public CraftingTable craftingTable;
|
||||||
public Dependencies dependencies;
|
public Dependencies dependencies;
|
||||||
|
public GlobalContextProvider globalContextProvider = new GlobalContextProvider();
|
||||||
public int clickX = -1;
|
public int clickX = -1;
|
||||||
public int clickY = -1;
|
public int clickY = -1;
|
||||||
|
|
||||||
|
@ -41,6 +41,14 @@ public class Player {
|
|||||||
fallDistance++;
|
fallDistance++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resetHealth() {
|
||||||
|
health = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetHunger() {
|
||||||
|
hunger = 10;
|
||||||
|
}
|
||||||
|
|
||||||
public void fell(List<Block> fallblock, Game game, ScreenRenderer screenRenderer) {
|
public void fell(List<Block> fallblock, Game game, ScreenRenderer screenRenderer) {
|
||||||
var block = fallblock.stream().filter(b -> b.getClass().isAnnotationPresent(ReduceFallDamage.class))
|
var block = fallblock.stream().filter(b -> b.getClass().isAnnotationPresent(ReduceFallDamage.class))
|
||||||
.findFirst();
|
.findFirst();
|
||||||
|
@ -5,7 +5,8 @@ import cz.jzitnik.game.annotations.*;
|
|||||||
import cz.jzitnik.game.core.reducefalldamage.BedFallDamageReducer;
|
import cz.jzitnik.game.core.reducefalldamage.BedFallDamageReducer;
|
||||||
import cz.jzitnik.game.core.sound.SoundKey;
|
import cz.jzitnik.game.core.sound.SoundKey;
|
||||||
import cz.jzitnik.game.entities.Block;
|
import cz.jzitnik.game.entities.Block;
|
||||||
import cz.jzitnik.game.sprites.Bed;
|
import static cz.jzitnik.game.sprites.Bed.BedState;
|
||||||
|
import cz.jzitnik.game.blocks.Bed;
|
||||||
|
|
||||||
@MineSound(SoundKey.WOOD_DIG)
|
@MineSound(SoundKey.WOOD_DIG)
|
||||||
@PlaceSound(SoundKey.WOOD_DIG)
|
@PlaceSound(SoundKey.WOOD_DIG)
|
||||||
@ -17,6 +18,7 @@ public class BedBlock extends Block {
|
|||||||
public BedBlock() {
|
public BedBlock() {
|
||||||
super("bed", SpriteLoader.SPRITES.BED, 2);
|
super("bed", SpriteLoader.SPRITES.BED, 2);
|
||||||
setGhost(true);
|
setGhost(true);
|
||||||
setSpriteState(Bed.BedState.RIGHT);
|
setSpriteState(BedState.RIGHT);
|
||||||
|
setData(new Bed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,9 +2,11 @@ package cz.jzitnik.game.entities.items.registry.items.ores.coal;
|
|||||||
|
|
||||||
import cz.jzitnik.game.SpriteLoader;
|
import cz.jzitnik.game.SpriteLoader;
|
||||||
import cz.jzitnik.game.annotations.ItemRegistry;
|
import cz.jzitnik.game.annotations.ItemRegistry;
|
||||||
|
import cz.jzitnik.game.annotations.Smeltable;
|
||||||
import cz.jzitnik.game.entities.items.Item;
|
import cz.jzitnik.game.entities.items.Item;
|
||||||
import cz.jzitnik.game.entities.items.ItemType;
|
import cz.jzitnik.game.entities.items.ItemType;
|
||||||
|
|
||||||
|
@Smeltable("coal")
|
||||||
@ItemRegistry("coal_ore")
|
@ItemRegistry("coal_ore")
|
||||||
public class CoalOreItem extends Item {
|
public class CoalOreItem extends Item {
|
||||||
public CoalOreItem() {
|
public CoalOreItem() {
|
||||||
|
@ -34,12 +34,11 @@ public class ZombieLogic
|
|||||||
@Override
|
@Override
|
||||||
public void spawn(int playerX, int playerY, Game game, Terminal terminal) {
|
public void spawn(int playerX, int playerY, Game game, Terminal terminal) {
|
||||||
int[] view = ScreenMovingCalculationProvider.calculate(playerX, playerY, terminal.getHeight(), terminal.getWidth(), game.getWorld()[0].length, game.getWorld().length);
|
int[] view = ScreenMovingCalculationProvider.calculate(playerX, playerY, terminal.getHeight(), terminal.getWidth(), game.getWorld()[0].length, game.getWorld().length);
|
||||||
var world = game.getWorld();
|
|
||||||
int startX = view[0];
|
int startX = view[0];
|
||||||
int endX = view[1];
|
int endX = view[1];
|
||||||
|
|
||||||
attemptZombieSpawn(startX - 20, startX - 5, playerY, game);
|
//attemptZombieSpawn(startX - 20, startX - 5, playerY, game);
|
||||||
attemptZombieSpawn(endX + 5, endX + 20, playerY, game);
|
//attemptZombieSpawn(endX + 5, endX + 20, playerY, game);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void attemptZombieSpawn(int startX, int endX, int centerY, Game game) {
|
private void attemptZombieSpawn(int startX, int endX, int centerY, Game game) {
|
||||||
@ -106,8 +105,8 @@ public class ZombieLogic
|
|||||||
@Override
|
@Override
|
||||||
public void killed(Game game, Block mob) {
|
public void killed(Game game, Block mob) {
|
||||||
int rottenFlesh = random.nextInt(3) + 1;
|
int rottenFlesh = random.nextInt(3) + 1;
|
||||||
InventoryItem drop = new InventoryItem(rottenFlesh, ItemBlockSupplier.getItem("rotten_flesh"));
|
//InventoryItem drop = new InventoryItem(rottenFlesh, ItemBlockSupplier.getItem("rotten_flesh"));
|
||||||
game.getInventory().addItem(drop);
|
//game.getInventory().addItem(drop);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <K, V> Map.Entry<K, V> getRandomEntry(HashMap<K, V> map) {
|
public static <K, V> Map.Entry<K, V> getRandomEntry(HashMap<K, V> map) {
|
||||||
|
@ -110,6 +110,9 @@ public class DeathScreen {
|
|||||||
if (buttony > top && buttony < bottom) {
|
if (buttony > top && buttony < bottom) {
|
||||||
if (type == MouseEvent.Type.Pressed) {
|
if (type == MouseEvent.Type.Pressed) {
|
||||||
game.setWindow(Window.WORLD);
|
game.setWindow(Window.WORLD);
|
||||||
|
game.getPlayer().resetHealth();
|
||||||
|
game.getPlayer().resetHunger();
|
||||||
|
screenRenderer.render(game);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!buttonHover) {
|
if (!buttonHover) {
|
||||||
|
@ -81,11 +81,7 @@ public abstract class Sprite<E extends Enum<E>> {
|
|||||||
protected final String getResource(E key) {
|
protected final String getResource(E key) {
|
||||||
var resource = resources.get(key);
|
var resource = resources.get(key);
|
||||||
|
|
||||||
if (resource.isEmpty()) {
|
return resource.orElseGet(() -> loadResource(key));
|
||||||
return loadResource(key);
|
|
||||||
} else {
|
|
||||||
return resource.get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user