From b1483c138a9ac873b2abd5504536a25adb30b14d Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Wed, 26 Mar 2025 13:01:46 +0100 Subject: [PATCH] feat(ui): Added hurt animation --- src/main/java/cz/jzitnik/Main.java | 2 +- src/main/java/cz/jzitnik/game/Game.java | 33 ++++++++++++++++--- .../java/cz/jzitnik/game/entities/Player.java | 15 ++++++--- .../cz/jzitnik/game/entities/SteveData.java | 14 ++++++++ .../jzitnik/game/generation/Generation.java | 7 ++++ .../game/logic/CustomLogicInterface.java | 3 +- .../game/logic/CustomLogicProvider.java | 5 +-- .../game/logic/services/burning/Burning.java | 5 +-- .../logic/services/daytime/DayTimeLogic.java | 3 +- .../logic/services/falling/FallingLogic.java | 3 +- .../services/farmable/FarmableLogic.java | 3 +- .../services/farmland/FarmlandLogic.java | 3 +- .../firespreading/FireSpreadingLogic.java | 3 +- .../logic/services/flowing/FlowingLogic.java | 3 +- .../logic/services/flowing/LavaFireLogic.java | 3 +- .../services/flowing/LavaWaterLogic.java | 3 +- .../services/grass/GrassGrowingLogic.java | 3 +- .../services/leaves/LeavesFallingLogic.java | 3 +- .../logic/services/saplings/SaplingLogic.java | 4 ++- .../services/suffocating/Suffocating.java | 5 +-- .../java/cz/jzitnik/game/sprites/Steve.java | 4 ++- .../game/threads/list/NoHungerThread.java | 6 +++- .../java/cz/jzitnik/tui/ScreenRenderer.java | 27 ++++++++++----- .../resources/textures/mobs/zombie/bottom.ans | 25 ++++++++++++++ .../textures/mobs/zombie/bottomhurt.ans | 25 ++++++++++++++ .../resources/textures/mobs/zombie/top.ans | 25 ++++++++++++++ .../textures/mobs/zombie/tophurt.ans | 25 ++++++++++++++ src/main/resources/textures/steve1_hurt.ans | 25 ++++++++++++++ src/main/resources/textures/steve2_hurt.ans | 25 ++++++++++++++ 29 files changed, 270 insertions(+), 40 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/entities/SteveData.java create mode 100644 src/main/resources/textures/mobs/zombie/bottom.ans create mode 100644 src/main/resources/textures/mobs/zombie/bottomhurt.ans create mode 100644 src/main/resources/textures/mobs/zombie/top.ans create mode 100644 src/main/resources/textures/mobs/zombie/tophurt.ans create mode 100644 src/main/resources/textures/steve1_hurt.ans create mode 100644 src/main/resources/textures/steve2_hurt.ans diff --git a/src/main/java/cz/jzitnik/Main.java b/src/main/java/cz/jzitnik/Main.java index ddf2808..d30f3cc 100644 --- a/src/main/java/cz/jzitnik/Main.java +++ b/src/main/java/cz/jzitnik/Main.java @@ -48,7 +48,7 @@ public class Main { // Yeah, yeah I know. Deal with it } try { - customLogicProvider.update(game); + customLogicProvider.update(game, screenRenderer); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java index 55411fa..39f14f4 100644 --- a/src/main/java/cz/jzitnik/game/Game.java +++ b/src/main/java/cz/jzitnik/game/Game.java @@ -3,13 +3,14 @@ package cz.jzitnik.game; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.GameStates; import cz.jzitnik.game.entities.Player; +import cz.jzitnik.game.entities.SteveData; import cz.jzitnik.game.generation.Generation; import cz.jzitnik.game.entities.items.Item; import cz.jzitnik.game.entities.items.ItemType; import cz.jzitnik.game.handlers.place.CustomPlaceHandler; import cz.jzitnik.game.mobs.EntitySpawnProvider; import cz.jzitnik.game.sprites.Breaking; -import cz.jzitnik.game.sprites.Steve; +import cz.jzitnik.game.sprites.Steve.SteveState; import cz.jzitnik.game.annotations.AutoTransient; import cz.jzitnik.game.annotations.BreaksByPlace; import cz.jzitnik.game.blocks.Chest; @@ -56,9 +57,14 @@ public class Game extends AutoTransientSupport { for (int i = 0; i < world.length; i++) { for (int j = 0; j < world[i].length; j++) { for (Block block : world[i][j]) { - if (block.getBlockId().equals("steve") && block.getSpriteState().isPresent() - && block.getSpriteState().get() == Steve.SteveState.SECOND) { - return new int[] { j, i }; + if (block.getBlockId().equals("steve")) { + var steveData = (SteveData) block.getData(); + + if (steveData.isTop()) { + return new int[] { j, i + 1 }; + } else { + return new int[] { j, i }; + } } } } @@ -340,7 +346,7 @@ public class Game extends AutoTransientSupport { ArrayList combinedList = new ArrayList<>(); combinedList.addAll(world[cords2[1]][cords2[0]]); combinedList.addAll(world[cords2[1] + 1][cords2[0]]); - player.fell(combinedList); + player.fell(combinedList, this, screenRenderer); screenRenderer.render(this); break; } @@ -434,4 +440,21 @@ public class Game extends AutoTransientSupport { public boolean isSolid(List blocks) { return !blocks.stream().allMatch(Block::isGhost); } + + public void playerHit(ScreenRenderer screenRenderer) { + player.getPlayerBlock1().setSpriteState(SteveState.FIRST_HURT); + player.getPlayerBlock2().setSpriteState(SteveState.SECOND_HURT); + + new Thread(() -> { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + player.getPlayerBlock1().setSpriteState(SteveState.FIRST); + player.getPlayerBlock2().setSpriteState(SteveState.SECOND); + screenRenderer.render(this); + }).start(); + } } diff --git a/src/main/java/cz/jzitnik/game/entities/Player.java b/src/main/java/cz/jzitnik/game/entities/Player.java index e53c5b5..fb8c498 100644 --- a/src/main/java/cz/jzitnik/game/entities/Player.java +++ b/src/main/java/cz/jzitnik/game/entities/Player.java @@ -7,8 +7,10 @@ import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.util.List; +import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.ReduceFallDamage; import cz.jzitnik.game.core.reducefalldamage.Reducer; +import cz.jzitnik.tui.ScreenRenderer; @Getter @Setter @@ -38,7 +40,7 @@ public class Player implements Serializable { fallDistance++; } - public void fell(List fallblock) { + public void fell(List fallblock, Game game, ScreenRenderer screenRenderer) { var block = fallblock.stream().filter(b -> b.getClass().isAnnotationPresent(ReduceFallDamage.class)).findFirst(); int damage = Math.max(fallDistance - 3, 0); if (block.isPresent()) { @@ -52,19 +54,22 @@ public class Player implements Serializable { System.exit(0); } } - dealDamage(damage); + dealDamage(damage, game, screenRenderer); fallDistance = 0; } - public synchronized void dealDamage(int amount) { + public synchronized void dealDamage(int amount, Game game, ScreenRenderer screenRenderer) { health = Math.max(0, health - amount); + if (amount != 0) { + game.playerHit(screenRenderer); + } if (health == 0) { // TODO: Implement dead } } - public synchronized void dealDamage() { - dealDamage(1); + public synchronized void dealDamage(Game game, ScreenRenderer screenRenderer) { + dealDamage(1, game, screenRenderer); } } diff --git a/src/main/java/cz/jzitnik/game/entities/SteveData.java b/src/main/java/cz/jzitnik/game/entities/SteveData.java new file mode 100644 index 0000000..c822323 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/SteveData.java @@ -0,0 +1,14 @@ +package cz.jzitnik.game.entities; + +import java.io.Serializable; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class SteveData implements Serializable { + private boolean top = false; +} diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index f9f48d6..aa2231a 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -1,6 +1,8 @@ package cz.jzitnik.game.generation; import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.entities.SteveData; +import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.Game; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.sprites.Steve; @@ -16,10 +18,12 @@ public class Generation { Block steveBlock = new Block("steve", SpriteLoader.SPRITES.STEVE); steveBlock.setSpriteState(Steve.SteveState.FIRST); steveBlock.setGhost(true); + steveBlock.setData(new SteveData(true)); Block steveBlock2 = new Block("steve", SpriteLoader.SPRITES.STEVE); steveBlock2.setSpriteState(Steve.SteveState.SECOND); steveBlock2.setGhost(true); steveBlock2.setMob(true); + steveBlock2.setData(new SteveData(false)); int[] terrainHeight = PopulateWorld.generateTerrain(); @@ -32,6 +36,9 @@ public class Generation { // Spawn player at a valid starting point world[terrainHeight[256] - 1][256].add(steveBlock2); world[terrainHeight[256] - 2][256].add(steveBlock); + + game.getInventory().addItem(ItemBlockSupplier.getItem("sand")); + game.getInventory().addItem(ItemBlockSupplier.getItem("sand")); } private static void initializeWorld(List[][] world) { diff --git a/src/main/java/cz/jzitnik/game/logic/CustomLogicInterface.java b/src/main/java/cz/jzitnik/game/logic/CustomLogicInterface.java index e0fc0f5..2518cbe 100644 --- a/src/main/java/cz/jzitnik/game/logic/CustomLogicInterface.java +++ b/src/main/java/cz/jzitnik/game/logic/CustomLogicInterface.java @@ -1,7 +1,8 @@ package cz.jzitnik.game.logic; import cz.jzitnik.game.Game; +import cz.jzitnik.tui.ScreenRenderer; public interface CustomLogicInterface { - void nextIteration(Game game); + void nextIteration(Game game, ScreenRenderer screenRenderer); } diff --git a/src/main/java/cz/jzitnik/game/logic/CustomLogicProvider.java b/src/main/java/cz/jzitnik/game/logic/CustomLogicProvider.java index d7ee8ae..443c31b 100644 --- a/src/main/java/cz/jzitnik/game/logic/CustomLogicProvider.java +++ b/src/main/java/cz/jzitnik/game/logic/CustomLogicProvider.java @@ -6,6 +6,7 @@ import java.util.Set; import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; +import cz.jzitnik.tui.ScreenRenderer; import lombok.extern.slf4j.Slf4j; import org.reflections.Reflections; @@ -14,10 +15,10 @@ import org.reflections.Reflections; public class CustomLogicProvider { private final List logicList = new ArrayList<>(); - public void update(Game game) { + public void update(Game game, ScreenRenderer screenRenderer) { for (CustomLogicInterface logicInterface : logicList) { log.debug("Running logic {}.", logicInterface.getClass().getSimpleName()); - logicInterface.nextIteration(game); + logicInterface.nextIteration(game, screenRenderer); } } diff --git a/src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java b/src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java index 2efa3da..afba756 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java +++ b/src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java @@ -4,11 +4,12 @@ import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.entities.Player; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class Burning implements CustomLogicInterface { @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer screenRenderer) { var world = game.getWorld(); int[] data = game.getPlayerCords(); int x = data[0]; @@ -31,7 +32,7 @@ public class Burning implements CustomLogicInterface { } if (player.isBurning() || player.getBurningTimeout() != 0) { - player.dealDamage(); + player.dealDamage(game, screenRenderer); player.setBurningState(true); } else { player.setBurningState(false); diff --git a/src/main/java/cz/jzitnik/game/logic/services/daytime/DayTimeLogic.java b/src/main/java/cz/jzitnik/game/logic/services/daytime/DayTimeLogic.java index d05593c..c02f21a 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/daytime/DayTimeLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/daytime/DayTimeLogic.java @@ -3,11 +3,12 @@ package cz.jzitnik.game.logic.services.daytime; import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class DayTimeLogic implements CustomLogicInterface { @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int time = game.getDaytime(); if (time >= 600) { diff --git a/src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java index caf76e1..92bf0b9 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java @@ -6,13 +6,14 @@ import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.annotations.FallingBlock; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class FallingLogic implements CustomLogicInterface { private static final int RADIUS = 30; @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { var world = game.getWorld(); int[] data = game.getPlayerCords(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/farmable/FarmableLogic.java b/src/main/java/cz/jzitnik/game/logic/services/farmable/FarmableLogic.java index 3ef7b5a..f280bda 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/farmable/FarmableLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/farmable/FarmableLogic.java @@ -4,6 +4,7 @@ import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.annotations.Farmable; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class FarmableLogic implements CustomLogicInterface { @@ -11,7 +12,7 @@ public class FarmableLogic implements CustomLogicInterface { private static int GROW_LENGTH = 600; @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/farmland/FarmlandLogic.java b/src/main/java/cz/jzitnik/game/logic/services/farmland/FarmlandLogic.java index 7534982..6825a87 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/farmland/FarmlandLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/farmland/FarmlandLogic.java @@ -6,6 +6,7 @@ import cz.jzitnik.game.annotations.Farmable; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.logic.CustomLogicInterface; import cz.jzitnik.game.sprites.Farmland.FarmlandState; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class FarmlandLogic implements CustomLogicInterface { @@ -15,7 +16,7 @@ public class FarmlandLogic implements CustomLogicInterface { private static final int AGE_THRESHOLD = 5; @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/firespreading/FireSpreadingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/firespreading/FireSpreadingLogic.java index f1a9a3b..39f01d2 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/firespreading/FireSpreadingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/firespreading/FireSpreadingLogic.java @@ -8,6 +8,7 @@ import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.annotations.Flamable; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class FireSpreadingLogic implements CustomLogicInterface { @@ -15,7 +16,7 @@ public class FireSpreadingLogic implements CustomLogicInterface { private Random random = new Random(); @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { var world = game.getWorld(); int[] data = game.getPlayerCords(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/flowing/FlowingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/flowing/FlowingLogic.java index 1e10773..faeb19f 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/flowing/FlowingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/flowing/FlowingLogic.java @@ -7,6 +7,7 @@ import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.logic.CustomLogicInterface; import cz.jzitnik.game.sprites.Water; +import cz.jzitnik.tui.ScreenRenderer; import lombok.AllArgsConstructor; import lombok.Getter; @@ -29,7 +30,7 @@ public class FlowingLogic implements CustomLogicInterface { } @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { processFlow(game, "water"); processFlow(game, "lava"); } diff --git a/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaFireLogic.java b/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaFireLogic.java index 93f56ad..8c57fb0 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaFireLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaFireLogic.java @@ -7,6 +7,7 @@ import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.annotations.Flamable; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class LavaFireLogic implements CustomLogicInterface { @@ -14,7 +15,7 @@ public class LavaFireLogic implements CustomLogicInterface { private Random random = new Random(); @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaWaterLogic.java b/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaWaterLogic.java index c11e203..c54ebe0 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaWaterLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/flowing/LavaWaterLogic.java @@ -4,13 +4,14 @@ import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class LavaWaterLogic implements CustomLogicInterface { private static final int RADIUS = 20; @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/grass/GrassGrowingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/grass/GrassGrowingLogic.java index 08b5347..991978e 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/grass/GrassGrowingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/grass/GrassGrowingLogic.java @@ -5,6 +5,7 @@ import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; import java.util.*; @@ -13,7 +14,7 @@ public class GrassGrowingLogic implements CustomLogicInterface { private static final int RADIUS = 35; @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/leaves/LeavesFallingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/leaves/LeavesFallingLogic.java index d6639ae..aeb7094 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/leaves/LeavesFallingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/leaves/LeavesFallingLogic.java @@ -4,6 +4,7 @@ import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; import java.util.*; @@ -14,7 +15,7 @@ public class LeavesFallingLogic implements CustomLogicInterface { private final Random random = new Random(); @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java b/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java index 7353762..f46dfb1 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java +++ b/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java @@ -7,6 +7,8 @@ import cz.jzitnik.game.annotations.Sapling; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.generation.Trees; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; + import org.reflections.Reflections; import java.util.HashSet; @@ -32,7 +34,7 @@ public class SaplingLogic implements CustomLogicInterface { } @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer ignored) { int[] data = game.getPlayerCords(); var world = game.getWorld(); int playerX = data[0]; diff --git a/src/main/java/cz/jzitnik/game/logic/services/suffocating/Suffocating.java b/src/main/java/cz/jzitnik/game/logic/services/suffocating/Suffocating.java index 98d7669..8362324 100644 --- a/src/main/java/cz/jzitnik/game/logic/services/suffocating/Suffocating.java +++ b/src/main/java/cz/jzitnik/game/logic/services/suffocating/Suffocating.java @@ -3,11 +3,12 @@ package cz.jzitnik.game.logic.services.suffocating; import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.CustomLogic; import cz.jzitnik.game.logic.CustomLogicInterface; +import cz.jzitnik.tui.ScreenRenderer; @CustomLogic public class Suffocating implements CustomLogicInterface { @Override - public void nextIteration(Game game) { + public void nextIteration(Game game, ScreenRenderer screenRenderer) { var world = game.getWorld(); int[] data = game.getPlayerCords(); int x = data[0]; @@ -17,7 +18,7 @@ public class Suffocating implements CustomLogicInterface { if (blocks.stream().anyMatch(i -> !i.isGhost())) { // Deal damage when solid block - game.getPlayer().dealDamage(); + game.getPlayer().dealDamage(game, screenRenderer); } } } diff --git a/src/main/java/cz/jzitnik/game/sprites/Steve.java b/src/main/java/cz/jzitnik/game/sprites/Steve.java index 23ac30c..a2cb96a 100644 --- a/src/main/java/cz/jzitnik/game/sprites/Steve.java +++ b/src/main/java/cz/jzitnik/game/sprites/Steve.java @@ -6,7 +6,7 @@ import java.util.HashMap; public class Steve extends Sprite { public enum SteveState { - FIRST, SECOND, + FIRST, SECOND, FIRST_HURT, SECOND_HURT } public Steve() { @@ -14,6 +14,8 @@ public class Steve extends Sprite { { put(SteveState.FIRST, "steve1.ans"); put(SteveState.SECOND, "steve2.ans"); + put(SteveState.FIRST_HURT, "steve1_hurt.ans"); + put(SteveState.SECOND_HURT, "steve2_hurt.ans"); } }, SteveState.class); } diff --git a/src/main/java/cz/jzitnik/game/threads/list/NoHungerThread.java b/src/main/java/cz/jzitnik/game/threads/list/NoHungerThread.java index 676a8c2..162c9b9 100644 --- a/src/main/java/cz/jzitnik/game/threads/list/NoHungerThread.java +++ b/src/main/java/cz/jzitnik/game/threads/list/NoHungerThread.java @@ -1,13 +1,17 @@ package cz.jzitnik.game.threads.list; +import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.ThreadRegistry; import cz.jzitnik.game.entities.Player; +import cz.jzitnik.tui.ScreenRenderer; import lombok.AllArgsConstructor; @AllArgsConstructor @ThreadRegistry public class NoHungerThread extends Thread { private final Player player; + private final Game game; + private final ScreenRenderer screenRenderer; @Override public void run() { @@ -15,7 +19,7 @@ public class NoHungerThread extends Thread { try { Thread.sleep(3000); if (player.getHunger() == 0) { - player.dealDamage(); + player.dealDamage(game, screenRenderer); } } catch (InterruptedException e) { break; diff --git a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java index 0ddb0f7..be1d5b1 100644 --- a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java +++ b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java @@ -1,6 +1,7 @@ package cz.jzitnik.tui; import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.entities.SteveData; import cz.jzitnik.game.Game; import cz.jzitnik.game.sprites.Air; import cz.jzitnik.game.sprites.SimpleSprite; @@ -37,9 +38,15 @@ public class ScreenRenderer { private int[] getPlayerCords(List[][] world) { for (int i = 0; i < world.length; i++) { for (int j = 0; j < world[i].length; j++) { - if (world[i][j].stream().anyMatch(x -> x.getBlockId().equals("steve") && x.getSpriteState().isPresent() - && x.getSpriteState().get() == Steve.SteveState.SECOND)) { - return new int[] { j, i }; + var steve = world[i][j].stream().filter(x -> x.getBlockId().equals("steve")).findFirst(); + if (steve.isPresent()) { + var steveData = (SteveData) steve.get().getData(); + + if (steveData.isTop()) { + return new int[] { j, i + 1 }; + } else { + return new int[] { j, i }; + } } } } @@ -127,12 +134,14 @@ public class ScreenRenderer { sprites.add(stringBuilder.toString()); } - if (blocks.stream() - .anyMatch(block -> block.getBlockId().equals("steve") - && block.getSpriteState().get() == Steve.SteveState.SECOND) - && game.getPlayer().isBurningState()) { - SimpleSprite fire = new SimpleSprite("fire.ans"); - sprites.add(fire.getSprite()); + var steve = blocks.stream().filter(block -> block.getBlockId().equals("steve")).findFirst(); + if (steve.isPresent() && game.getPlayer().isBurning()) { + var steveData = (SteveData) steve.get().getData(); + + if (!steveData.isTop()) { + SimpleSprite fire = new SimpleSprite("fire.ans"); + sprites.add(fire.getSprite()); + } } var burningBlocks = blocks.stream().filter(Block::isOnFire).toList(); diff --git a/src/main/resources/textures/mobs/zombie/bottom.ans b/src/main/resources/textures/mobs/zombie/bottom.ans new file mode 100644 index 0000000..c8a7fc1 --- /dev/null +++ b/src/main/resources/textures/mobs/zombie/bottom.ans @@ -0,0 +1,25 @@ +              +              +              +           +                  +               +           +               +                          +                           +                              +                             +                            +                            +                          +                               +                            +                              +                            +                          +                          +                          +                          +                          +                          diff --git a/src/main/resources/textures/mobs/zombie/bottomhurt.ans b/src/main/resources/textures/mobs/zombie/bottomhurt.ans new file mode 100644 index 0000000..7bf44cb --- /dev/null +++ b/src/main/resources/textures/mobs/zombie/bottomhurt.ans @@ -0,0 +1,25 @@ +             +                 +            +             +                 +            +            +           +                          +                            +                               +                          +                                +                            +                               +                              +                            +                              +                          +                                +                          +                          +                          +                          +                          diff --git a/src/main/resources/textures/mobs/zombie/top.ans b/src/main/resources/textures/mobs/zombie/top.ans new file mode 100644 index 0000000..ef59bf5 --- /dev/null +++ b/src/main/resources/textures/mobs/zombie/top.ans @@ -0,0 +1,25 @@ +                                   +                                   +                                 +                                      +                                    +                                  +                                   +                                +                                +                                  +                                 +                                 +                                  +                                 +                 +                  +                +              +                +                 +          +              +               +                  +                  diff --git a/src/main/resources/textures/mobs/zombie/tophurt.ans b/src/main/resources/textures/mobs/zombie/tophurt.ans new file mode 100644 index 0000000..eca9cbf --- /dev/null +++ b/src/main/resources/textures/mobs/zombie/tophurt.ans @@ -0,0 +1,25 @@ +                                   +                                   +                                 +                                     +                                    +                                    +                                   +                                  +                                  +                                    +                                 +                                +                                 +                                  +                 +                +              +           +             +             +             +             +                 +                  +                    diff --git a/src/main/resources/textures/steve1_hurt.ans b/src/main/resources/textures/steve1_hurt.ans new file mode 100644 index 0000000..cf42941 --- /dev/null +++ b/src/main/resources/textures/steve1_hurt.ans @@ -0,0 +1,25 @@ +                                   +                                 +                                    +                                      +                                      +                                      +                                      +                                      +                                      +                                      +                                     +                                      +                         +                          +                         +                         +                       +                      +                         +                        +                         +                         +                          +                          +                         diff --git a/src/main/resources/textures/steve2_hurt.ans b/src/main/resources/textures/steve2_hurt.ans new file mode 100644 index 0000000..b490e8c --- /dev/null +++ b/src/main/resources/textures/steve2_hurt.ans @@ -0,0 +1,25 @@ +                       +                       +                         +                          +                        +                       +                                    +                                +                                +                              +                              +                              +                                +                                    +                                    +                                     +                                  +                                   +                                   +                                  +                                  +                                +                                +                             +