diff --git a/pom.xml b/pom.xml index 9d4c238..2b0dc09 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,12 @@ 2.18.2 + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + 2.18.2 + + junit junit diff --git a/src/main/java/cz/jzitnik/Game.java b/src/main/java/cz/jzitnik/Game.java index bc0032e..b2e8532 100644 --- a/src/main/java/cz/jzitnik/Game.java +++ b/src/main/java/cz/jzitnik/Game.java @@ -18,7 +18,11 @@ public class Game { ScheduledTaskManager scheduledTaskManager = dependencyManager.getDependencyOrThrow(ScheduledTaskManager.class); GlobalIOHandlerRepository globalIOHandlerRepository = dependencyManager.getDependencyOrThrow(GlobalIOHandlerRepository.class); - gameSetup.setup(); + try { + gameSetup.setup(); + } catch (Exception e) { + throw new RuntimeException(e); + } threadManager.startAll(); scheduledTaskManager.startAll(); globalIOHandlerRepository.setup(); diff --git a/src/main/java/cz/jzitnik/events/RerenderPart.java b/src/main/java/cz/jzitnik/events/RerenderPart.java new file mode 100644 index 0000000..77de5b9 --- /dev/null +++ b/src/main/java/cz/jzitnik/events/RerenderPart.java @@ -0,0 +1,14 @@ +package cz.jzitnik.events; + +import cz.jzitnik.utils.events.Event; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class RerenderPart implements Event { + private int forStartX; + private int forEndX; + private int forStartY; + private int forEndY; +} diff --git a/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java b/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java index 983ea68..4d95226 100644 --- a/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/DroppedItemRerenderHandler.java @@ -1,20 +1,11 @@ package cz.jzitnik.events.handlers; -import com.googlecode.lanterna.TerminalPosition; import cz.jzitnik.annotations.EventHandler; -import cz.jzitnik.annotations.injectors.InjectConfig; import cz.jzitnik.annotations.injectors.InjectDependency; -import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; import cz.jzitnik.events.DroppedItemRerender; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameState; -import cz.jzitnik.game.ResourceManager; +import cz.jzitnik.events.RerenderPart; import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.RerenderUtils; import cz.jzitnik.utils.events.AbstractEventHandler; import cz.jzitnik.utils.events.EventManager; @@ -29,56 +20,16 @@ public class DroppedItemRerenderHandler extends AbstractEventHandler { BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); Player player = gameState.getPlayer(); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); + BufferedImage playerTexture = player.getTexture(resourceManager); TerminalSize terminalSize = terminalScreen.getTerminalSize(); int width = room.getWidth(); diff --git a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java index 7ed6482..cbe1079 100644 --- a/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/MouseMoveEventHandler.java @@ -100,7 +100,7 @@ public class MouseMoveEventHandler extends AbstractEventHandler BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); Player player = gameState.getPlayer(); RoomCords playerCords = player.getPlayerCords(); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); + BufferedImage playerTexture = player.getTexture(resourceManager); var start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); int startX = start.getX(); diff --git a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java index c7e24c4..d1c5b05 100644 --- a/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java +++ b/src/main/java/cz/jzitnik/events/handlers/PlayerMoveEventHandler.java @@ -140,7 +140,7 @@ public class PlayerMoveEventHandler extends AbstractEventHandler { + public RerenderPartHandler(DependencyManager dm) { + super(dm); + } + + @InjectState + private TerminalState terminalState; + + @InjectState + private GameState gameState; + + @InjectState + private ScreenBuffer screenBuffer; + + @InjectConfig + private Debugging debugging; + + @InjectDependency + private ResourceManager resourceManager; + + @InjectDependency + private EventManager eventManager; + + @Override + public void handle(RerenderPart event) { + int forStartX = event.getForStartX(); + int forEndX = event.getForEndX(); + int forStartY = event.getForStartY(); + int forEndY = event.getForEndY(); + + GameRoom currentRoom = gameState.getCurrentRoom(); + BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); + + RoomCords start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); + + RerenderUtils.rerenderPart( + forStartX, + forEndX, + forStartY, + forEndY, + start.getX(), + start.getY(), + currentRoom, + room, + gameState.getPlayer(), + gameState.getPlayer().getTexture(resourceManager), + screenBuffer, + resourceManager, + debugging + ); + + eventManager.emitEvent( + new RerenderScreen(new RerenderScreen.ScreenPart( + new TerminalPosition(forStartX, forStartY), + new TerminalPosition(forEndX * 2 + 1 + start.getX(), forEndY + start.getY()) + )) + ); + } +} diff --git a/src/main/java/cz/jzitnik/game/Player.java b/src/main/java/cz/jzitnik/game/Player.java index 264faca..9ea32c1 100644 --- a/src/main/java/cz/jzitnik/game/Player.java +++ b/src/main/java/cz/jzitnik/game/Player.java @@ -1,16 +1,24 @@ package cz.jzitnik.game; +import cz.jzitnik.events.RerenderPart; import cz.jzitnik.game.items.GameItem; import cz.jzitnik.game.items.types.interfaces.WeaponInterface; +import cz.jzitnik.game.mobs.HittableMob; import cz.jzitnik.game.utils.RoomCords; import cz.jzitnik.ui.Inventory; +import cz.jzitnik.utils.DependencyManager; +import cz.jzitnik.utils.StateManager; +import cz.jzitnik.utils.events.Event; +import cz.jzitnik.utils.events.EventManager; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import java.awt.image.BufferedImage; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; @RequiredArgsConstructor @@ -31,6 +39,8 @@ public class Player { private int health = MAX_HEALTH; private int stamina = MAX_STAMINA; private boolean swinging = false; + private boolean hitAnimationOn = false; + private ScheduledFuture currentTimeoutHitAnimation = null; public void increaseStamina() { stamina++; @@ -44,7 +54,7 @@ public class Player { health = Math.min(MAX_HEALTH, health + amount); } - public boolean dealDamage(int amount) { + public boolean dealDamage(int amount, DependencyManager dependencyManager) { if (health - amount <= 0) { health = 0; return true; @@ -52,9 +62,54 @@ public class Player { health -= amount; + if (hitAnimationOn) { + if (currentTimeoutHitAnimation != null && !currentTimeoutHitAnimation.isDone()) { + currentTimeoutHitAnimation.cancel(false); + } + } else { + hitAnimationOn = true; + rerender(dependencyManager); + } + + currentTimeoutHitAnimation = scheduler.schedule(() -> { + hitAnimationOn = false; + rerender(dependencyManager); + }, 250, TimeUnit.MILLISECONDS); + return false; } + private void rerender(DependencyManager dependencyManager) { + ResourceManager resourceManager = dependencyManager.getDependencyOrThrow(ResourceManager.class); + EventManager eventManager = dependencyManager.getDependencyOrThrow(EventManager.class); + + int forStartX = playerCords.getX(); + int forStartY = playerCords.getY(); + + BufferedImage playerTexture = getTexture(resourceManager); + int forEndX = playerCords.getX() + playerTexture.getWidth() - 1; + int forEndY = playerCords.getY() + playerTexture.getHeight(); + + eventManager.emitEvent(new Event[]{ + new RerenderPart(forStartX, forEndX, forStartY, forEndY), + }); + } + + public BufferedImage getTexture(ResourceManager resourceManager) { + BufferedImage resource = resourceManager.getResource(switch (playerRotation) { + case FRONT -> ResourceManager.Resource.PLAYER_FRONT; + case BACK -> ResourceManager.Resource.PLAYER_BACK; + case LEFT -> ResourceManager.Resource.PLAYER_LEFT; + case RIGHT -> ResourceManager.Resource.PLAYER_RIGHT; + }); + + if (hitAnimationOn) { + return HittableMob.applyRedFactor(resource); + } + + return resource; + } + public int getDamageDeal() { int damage = 1; diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMob.java b/src/main/java/cz/jzitnik/game/mobs/HittableMob.java index 209ba9f..9ce3ccd 100644 --- a/src/main/java/cz/jzitnik/game/mobs/HittableMob.java +++ b/src/main/java/cz/jzitnik/game/mobs/HittableMob.java @@ -1,20 +1,11 @@ package cz.jzitnik.game.mobs; -import com.googlecode.lanterna.TerminalPosition; -import cz.jzitnik.annotations.injectors.InjectConfig; import cz.jzitnik.annotations.injectors.InjectDependency; import cz.jzitnik.annotations.injectors.InjectState; -import cz.jzitnik.config.Debugging; -import cz.jzitnik.events.RerenderScreen; -import cz.jzitnik.game.GameRoom; +import cz.jzitnik.events.RerenderPart; import cz.jzitnik.game.GameState; -import cz.jzitnik.game.Player; -import cz.jzitnik.game.ResourceManager; import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.states.ScreenBuffer; -import cz.jzitnik.states.TerminalState; import cz.jzitnik.utils.DependencyManager; -import cz.jzitnik.utils.RerenderUtils; import cz.jzitnik.utils.events.EventManager; import cz.jzitnik.utils.roomtasks.RoomTask; import cz.jzitnik.utils.roomtasks.RoomTaskScheduler; @@ -22,6 +13,7 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -32,25 +24,47 @@ public abstract class HittableMob extends Mob { public abstract void onKilled(); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + @Getter protected int health; private ScheduledFuture currentTimeoutHitAnimation = null; - @Getter private boolean hitAnimationOn = false; + @Override + public BufferedImage getTexture() { + if (hitAnimationOn) { + return applyRedFactor(texture); + } + + return texture; + } + + public static BufferedImage applyRedFactor(BufferedImage src) { + final float redFactor = 2f; + int width = src.getWidth(); + int height = src.getHeight(); + + BufferedImage copy = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); + byte[] srcPixels = ((DataBufferByte) src.getRaster().getDataBuffer()).getData(); + byte[] dstPixels = ((DataBufferByte) copy.getRaster().getDataBuffer()).getData(); + + System.arraycopy(srcPixels, 0, dstPixels, 0, srcPixels.length); + + for (int i = 0; i < dstPixels.length; i += 4) { + int red = dstPixels[i + 3] & 0xFF; + red = (int) (red * redFactor); + if (red > 255) red = 255; + dstPixels[i + 3] = (byte) red; + } + + return copy; + } + @InjectDependency private EventManager eventManager; @InjectState private GameState gameState; @InjectDependency - private ResourceManager resourceManager; - @InjectState - private TerminalState terminalState; - @InjectState - private ScreenBuffer screenBuffer; - @InjectConfig - private Debugging debugging; - @InjectDependency private RoomTaskScheduler roomTaskScheduler; public HittableMob(BufferedImage texture, RoomTask task, RoomCords cords, int initialHealth) { @@ -99,34 +113,11 @@ public abstract class HittableMob extends Mob { int forEndX = cords.getX() + texture.getWidth() - 1; int forEndY = cords.getY() + texture.getHeight(); - GameRoom currentRoom = gameState.getCurrentRoom(); - BufferedImage room = resourceManager.getResource(currentRoom.getTexture()); - Player player = gameState.getPlayer(); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); - - var start = RerenderUtils.getStart(room, terminalState.getTerminalScreen().getTerminalSize()); - int startX = start.getX(); - int startY = start.getY(); - - RerenderUtils.rerenderPart( + eventManager.emitEvent(new RerenderPart( forStartX, forEndX, forStartY, - forEndY, - startX, - startY, - currentRoom, - room, - player, - playerTexture, - screenBuffer, - resourceManager, - debugging - ); - - eventManager.emitEvent(new RerenderScreen(new RerenderScreen.ScreenPart( - new TerminalPosition(forStartX, forStartY), - new TerminalPosition(forEndX * 2 + 1 + startX, forEndY + startY) - ))); + forEndY + )); } } diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java b/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java index a115f05..24b2a0d 100644 --- a/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java +++ b/src/main/java/cz/jzitnik/game/mobs/HittableMobDrops.java @@ -43,6 +43,12 @@ public abstract class HittableMobDrops extends HittableMob { private static final int DROP_ITEM_ON_GROUND_RADIUS = 30; + /** + * Can be overwritten by an extending class + **/ + public void afterKill() { + } + @Override public final void onKilled() { GameItem[] items = itemDropSupplier.get(); @@ -77,6 +83,6 @@ public abstract class HittableMobDrops extends HittableMob { } } - eventManager.emitEvent(events); + eventManager.emitEvent(events, this::afterKill); } } diff --git a/src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java b/src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java new file mode 100644 index 0000000..5a7cb06 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/mobs/HittableMobNoDrops.java @@ -0,0 +1,17 @@ +package cz.jzitnik.game.mobs; + +import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.utils.roomtasks.RoomTask; + +import java.awt.image.BufferedImage; + +public abstract class HittableMobNoDrops extends HittableMob { + public HittableMobNoDrops(BufferedImage texture, RoomTask task, RoomCords cords, int initialHealth) { + super(texture, task, cords, initialHealth); + } + + @Override + public void onKilled() { + + } +} diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerHittingTask.java b/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerHittingTask.java index 13c3ba6..c1c5571 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerHittingTask.java +++ b/src/main/java/cz/jzitnik/game/mobs/tasks/EnemyPlayerHittingTask.java @@ -6,6 +6,7 @@ import cz.jzitnik.events.RenderStats; import cz.jzitnik.game.GameState; import cz.jzitnik.game.mobs.Mob; import cz.jzitnik.game.utils.RoomCords; +import cz.jzitnik.utils.DependencyManager; import cz.jzitnik.utils.events.EventManager; import cz.jzitnik.utils.roomtasks.RoomTask; import lombok.RequiredArgsConstructor; @@ -32,6 +33,9 @@ public class EnemyPlayerHittingTask extends RoomTask { @InjectDependency private EventManager eventManager; + @InjectDependency + private DependencyManager dependencyManager; + @Override public void run() { RoomCords playerCords = gameState.getPlayer().getPlayerCords(); @@ -44,7 +48,7 @@ public class EnemyPlayerHittingTask extends RoomTask { int damage = damageSupplier.get(); - boolean isDead = gameState.getPlayer().dealDamage(damage); + boolean isDead = gameState.getPlayer().dealDamage(damage, dependencyManager); eventManager.emitEvent(new RenderStats()); log.debug("Is dead: {}", isDead); diff --git a/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java b/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java index ed1d0e1..b138880 100644 --- a/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java +++ b/src/main/java/cz/jzitnik/game/mobs/tasks/MobFollowingPlayerTask.java @@ -79,7 +79,7 @@ public class MobFollowingPlayerTask extends RoomTask { int startY = start.getY(); Player player = gameState.getPlayer(); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); + BufferedImage playerTexture = player.getTexture(resourceManager); RerenderUtils.rerenderPart(forStartX, forEndX, forStartY, forEndY, startX, startY, gameState.getCurrentRoom(), room, player, playerTexture, screenBuffer, resourceManager, debugging); diff --git a/src/main/java/cz/jzitnik/game/objects/Chest.java b/src/main/java/cz/jzitnik/game/objects/Chest.java index ca114bc..b3cae97 100644 --- a/src/main/java/cz/jzitnik/game/objects/Chest.java +++ b/src/main/java/cz/jzitnik/game/objects/Chest.java @@ -9,6 +9,7 @@ import cz.jzitnik.annotations.injectors.InjectState; import cz.jzitnik.config.Debugging; import cz.jzitnik.events.InventoryRerender; import cz.jzitnik.events.MouseAction; +import cz.jzitnik.events.RerenderPart; import cz.jzitnik.events.RerenderScreen; import cz.jzitnik.game.GameRoom; import cz.jzitnik.game.GameState; @@ -39,7 +40,6 @@ public final class Chest extends GameObject implements UIClickHandler { private static final int RENDER_PADDING = 1; private final List items; - private final DependencyManager dependencyManager; private int listenerHashCode; @@ -49,8 +49,6 @@ public final class Chest extends GameObject implements UIClickHandler { private int chestUISizeX; private int chestUISizeY; - @InjectDependency - private StateManager sm; @InjectDependency private ResourceManager resourceManager; @InjectDependency @@ -68,10 +66,9 @@ public final class Chest extends GameObject implements UIClickHandler { @InjectConfig private Debugging debugging; - public Chest(DependencyManager dm, ResourceManager resourceManager, RoomCords cords, GameItem[] items) { + public Chest(ResourceManager resourceManager, RoomCords cords, GameItem[] items) { super(resourceManager.getResource(ResourceManager.Resource.CHEST), cords, true); this.items = Lists.newArrayList(items); - this.dependencyManager = dm; } @Override @@ -99,7 +96,7 @@ public final class Chest extends GameObject implements UIClickHandler { Player player = gameState.getPlayer(); BufferedImage roomTexture = resourceManager.getResource(currentRoom.getTexture()); - BufferedImage playerTexture = RerenderUtils.getPlayer(resourceManager, player); + BufferedImage playerTexture = player.getTexture(resourceManager); BufferedImage chestTexture = getTexture(); var buffer = screenBuffer.getRenderedBuffer(); @@ -150,34 +147,19 @@ public final class Chest extends GameObject implements UIClickHandler { TerminalPosition guiStart = new TerminalPosition(renderMinX - RENDER_PADDING, renderMinY - RENDER_PADDING); TerminalPosition guiEnd = new TerminalPosition(renderMaxX + RENDER_PADDING, renderMaxY + RENDER_PADDING); - - if (!items.isEmpty()) { - drawUI(currentGrid, buffer, overrideBuffer, start, guiStartX, guiStartY); - } - - RerenderUtils.rerenderPart( - guiStart.getColumn() - start.getX(), - guiEnd.getColumn() - start.getX(), - guiStart.getRow() - start.getY(), - guiEnd.getRow() - start.getY(), - start.getX(), - start.getY(), - currentRoom, - roomTexture, - player, - playerTexture, - screenBuffer, - resourceManager, - debugging - ); - RerenderScreen.ScreenPart sp = new RerenderScreen.ScreenPart(guiStart, guiEnd); if (!items.isEmpty()) { + drawUI(currentGrid, buffer, overrideBuffer, start, guiStartX, guiStartY); listenerHashCode = uiRoomClickHandlerRepository.registerCurrentRoomHandler(sp, this); } - eventManager.emitEvent(new RerenderScreen(sp)); + eventManager.emitEvent(new RerenderPart( + guiStart.getColumn() - start.getX(), + guiEnd.getColumn() - start.getX(), + guiStart.getRow() - start.getY(), + guiEnd.getRow() - start.getY() + )); } private void clearPreviousUI( diff --git a/src/main/java/cz/jzitnik/game/setup/GameSetup.java b/src/main/java/cz/jzitnik/game/setup/GameSetup.java index 7a9c427..a3ff9d9 100644 --- a/src/main/java/cz/jzitnik/game/setup/GameSetup.java +++ b/src/main/java/cz/jzitnik/game/setup/GameSetup.java @@ -22,7 +22,7 @@ public class GameSetup { public void setup() { //gameState.setScreen(new IntroScene(dependencyManager)); - GameRoom mainRoom = new MainRoom(dependencyManager, resourceManager); + GameRoom mainRoom = new MainRoom(resourceManager); GameRoom rightRoom = new GameRoom(ResourceManager.Resource.ROOM2); GameRoom topRightRoom = new GameRoom(ResourceManager.Resource.ROOM3); GameRoom topRightTop = new GameRoom(ResourceManager.Resource.ROOM4); diff --git a/src/main/java/cz/jzitnik/game/setup/config/EnemiesConfigSetup.java b/src/main/java/cz/jzitnik/game/setup/config/EnemiesConfigSetup.java new file mode 100644 index 0000000..26ddac7 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/setup/config/EnemiesConfigSetup.java @@ -0,0 +1,14 @@ +package cz.jzitnik.game.setup.config; + +import cz.jzitnik.game.ResourceManager; + +public class EnemiesConfigSetup { + private class Enemy { + private ResourceManager.Resource texture; + private int initialHealth; + } + + public void setup() { + + } +} diff --git a/src/main/java/cz/jzitnik/game/setup/rooms/MainRoom.java b/src/main/java/cz/jzitnik/game/setup/rooms/MainRoom.java index d5a7613..f0c3804 100644 --- a/src/main/java/cz/jzitnik/game/setup/rooms/MainRoom.java +++ b/src/main/java/cz/jzitnik/game/setup/rooms/MainRoom.java @@ -9,15 +9,14 @@ import cz.jzitnik.game.setup.items.WoodenSword; import cz.jzitnik.game.objects.Chest; import cz.jzitnik.game.setup.enemies.Zombie; import cz.jzitnik.game.utils.RoomCords; -import cz.jzitnik.utils.DependencyManager; import lombok.extern.slf4j.Slf4j; @Slf4j public class MainRoom extends GameRoom { - public MainRoom(DependencyManager dependencyManager, ResourceManager resourceManager) { + public MainRoom(ResourceManager resourceManager) { super(ResourceManager.Resource.ROOM1); - Chest chest = new Chest(dependencyManager, resourceManager, new RoomCords(100, 45), new GameItem[]{ + Chest chest = new Chest(resourceManager, new RoomCords(100, 45), new GameItem[]{ new WoodenSword(resourceManager), new Apple(resourceManager) }); diff --git a/src/main/java/cz/jzitnik/utils/DependencyManager.java b/src/main/java/cz/jzitnik/utils/DependencyManager.java index acae27d..93236bc 100644 --- a/src/main/java/cz/jzitnik/utils/DependencyManager.java +++ b/src/main/java/cz/jzitnik/utils/DependencyManager.java @@ -26,7 +26,7 @@ public class DependencyManager { private final ClassToInstanceMap data = MutableClassToInstanceMap.create(); public T getDependencyOrThrow(Class clazz) { - T instance = get(clazz); + T instance = data.getInstance(clazz); if (instance == null) { throw new RuntimeException("Class was not found!"); @@ -36,12 +36,21 @@ public class DependencyManager { } public Optional getDependency(Class clazz) { - return Optional.ofNullable(get(clazz)); + return Optional.ofNullable(data.getInstance(clazz)); } - @SuppressWarnings("unchecked") - private T get(Class clazz) { - return (T) data.get(clazz); + public Optional getConfig(Class clazz) { + return Optional.ofNullable(configs.getInstance(clazz)); + } + + public T getConfigOrThrow(Class clazz) { + T instance = configs.getInstance(clazz); + + if (instance == null) { + throw new RuntimeException("Class was not found!"); + } + + return instance; } public DependencyManager(Reflections reflections) { diff --git a/src/main/java/cz/jzitnik/utils/RerenderUtils.java b/src/main/java/cz/jzitnik/utils/RerenderUtils.java index f5d25d3..6a0db97 100644 --- a/src/main/java/cz/jzitnik/utils/RerenderUtils.java +++ b/src/main/java/cz/jzitnik/utils/RerenderUtils.java @@ -99,13 +99,9 @@ public class RerenderUtils { int r = (pixel >> 16) & 0xff; int g = (pixel >> 8) & 0xff; int b = pixel & 0xff; - float redFactor = 2f; if (alpha != 0) { - if (object instanceof HittableMob mob && mob.isHitAnimationOn()) { - r = Math.min(255, (int) (r * redFactor)); - pixel = (alpha << 24) | (r << 16) | (g << 8) | b; - } else if (isSelected) { + if (isSelected) { r = Math.min(255, (int) (r * factor)); g = Math.min(255, (int) (g * factor)); b = Math.min(255, (int) (b * factor)); @@ -192,15 +188,6 @@ public class RerenderUtils { return new PixelResult(room.getRGB(x, y), false); } - public static BufferedImage getPlayer(ResourceManager resourceManager, Player player) { - return resourceManager.getResource(switch (player.getPlayerRotation()) { - case FRONT -> ResourceManager.Resource.PLAYER_FRONT; - case BACK -> ResourceManager.Resource.PLAYER_BACK; - case LEFT -> ResourceManager.Resource.PLAYER_LEFT; - case RIGHT -> ResourceManager.Resource.PLAYER_RIGHT; - }); - } - public static Set getDoorPositions(GameRoom currentRoom) { Set doorPositions = new HashSet<>(); if (currentRoom.getLeft() != null) doorPositions.add(FullRoomDrawHandler.DoorPosition.LEFT); diff --git a/src/main/java/cz/jzitnik/utils/events/EventManager.java b/src/main/java/cz/jzitnik/utils/events/EventManager.java index 65abc8e..6cb2eb3 100644 --- a/src/main/java/cz/jzitnik/utils/events/EventManager.java +++ b/src/main/java/cz/jzitnik/utils/events/EventManager.java @@ -49,6 +49,10 @@ public class EventManager extends Thread { eventQueue.add(new EventRecord(events.toArray(new Event[]{}))); } + public void emitEvent(List events, Runnable callback) { + eventQueue.add(new EventRecord(events.toArray(new Event[]{}), callback)); + } + public void emitEvent(Event[] events, Runnable callback) { eventQueue.add(new EventRecord(events, callback)); } diff --git a/src/main/resources/enemies.yaml b/src/main/resources/enemies.yaml new file mode 100644 index 0000000..f5cd069 --- /dev/null +++ b/src/main/resources/enemies.yaml @@ -0,0 +1,23 @@ +- id: zombie1 + className: cz.jzitnik.game.setup.enemies.Zombie + health: 10 + texture: PLAYER_FRONT + cords: + x: 100 + y: 100 + drops: + - apple1 + tasks: + - className: cz.jzitnik.game.mobs.tasks.MobFollowingPlayerTask + args: + speed: 1 + range: 100 + - className: cz.jzitnik.game.mobs.tasks.EnemyPlayerHittingTask + args: + cooldown: 500 + damage: 15 + hitSupplier: + rules: + - if: "health > 5" + value: 5 + - value: 2 \ No newline at end of file diff --git a/src/main/resources/items.yaml b/src/main/resources/items.yaml new file mode 100644 index 0000000..99e8ac8 --- /dev/null +++ b/src/main/resources/items.yaml @@ -0,0 +1,15 @@ +- id: sword1 + className: cz.jzitnik.game.setup.items.WoodenSword + name: "Wooden sword" + texture: WOODEN_SWORD + itemType: cz.jzitnik.game.items.types.weapons.Sword + properties: + damageDeal: 2 + +- id: apple1 + className: cz.jzitnik.game.setup.items.Apple + name: "Apple" + texture: APPLE + itemType: cz.jzitnik.game.items.types.food.Food + properties: + heal: 5 diff --git a/src/main/resources/rooms.yaml b/src/main/resources/rooms.yaml new file mode 100644 index 0000000..091003b --- /dev/null +++ b/src/main/resources/rooms.yaml @@ -0,0 +1,57 @@ +- id: room1 + className: cz.jzitnik.game.setup.rooms.MainRoom + texture: ROOM1 + objects: + - className: cz.jzitnik.game.objects.Chest + cords: + x: 100 + y: 45 + items: + - sword1 + - apple1 + colliders: + - from: + x: 60 + y: 10 + to: + x: 135 + y: 15 + mobs: + - zombie1 + connections: + right: room2 + +- id: room2 + className: cz.jzitnik.game.GameRoom + texture: ROOM2 + objects: [] + colliders: [] + mobs: [] + connections: + up: room3 + +- id: room3 + className: cz.jzitnik.game.GameRoom + texture: ROOM3 + objects: [] + colliders: [] + mobs: [] + connections: + up: room4 + +- id: room4 + className: cz.jzitnik.game.GameRoom + texture: ROOM4 + objects: [] + colliders: [] + mobs: [] + connections: + left: roomFrozen + +- id: roomFrozen + className: cz.jzitnik.game.GameRoom + texture: ROOM_FROZEN + objects: [] + colliders: [] + mobs: [] + connections: {}