From a610bcf3ca7af84b6051b1c21a30a5c26e64fe40 Mon Sep 17 00:00:00 2001
From: jzitnik-dev <email@jzitnik.dev>
Date: Mon, 17 Mar 2025 13:24:11 +0100
Subject: [PATCH] feat: Burning

Added Burning state so player will be burning even after he is out of
lava. Also added texture for fire that is added on top of steve texture
---
 src/main/java/cz/jzitnik/game/Game.java       |  3 +-
 .../cz/jzitnik/game/annotations/Burning.java  | 12 ++++++
 .../java/cz/jzitnik/game/entities/Player.java |  3 ++
 .../registry/blocks/blocks/LavaBlock.java     |  2 +
 .../jzitnik/game/generation/Generation.java   |  2 +-
 .../game/logic/services/burning/Burning.java  | 40 +++++++++++++++++++
 .../java/cz/jzitnik/tui/ScreenRenderer.java   |  7 ++++
 src/main/resources/textures/fire.ans          | 25 ++++++++++++
 .../resources/textures/steve2_burning.ans     | 25 ++++++++++++
 .../AutoTransientSupportTest.java             |  2 +-
 10 files changed, 118 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/cz/jzitnik/game/annotations/Burning.java
 create mode 100644 src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java
 create mode 100644 src/main/resources/textures/fire.ans
 create mode 100644 src/main/resources/textures/steve2_burning.ans

diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java
index 18f08ed..048b458 100644
--- a/src/main/java/cz/jzitnik/game/Game.java
+++ b/src/main/java/cz/jzitnik/game/Game.java
@@ -388,7 +388,8 @@ public class Game extends AutoTransientSupport {
 
         CustomPlaceHandler placeHandler = gameStates.dependencies.placeHandler.get(item.getId());
 
-        var blocksRemove = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(BreaksByPlace.class)).toList();
+        var blocksRemove = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(BreaksByPlace.class))
+                .toList();
 
         if (placeHandler.place(this, x, y)) {
             blocks.removeAll(blocksRemove);
diff --git a/src/main/java/cz/jzitnik/game/annotations/Burning.java b/src/main/java/cz/jzitnik/game/annotations/Burning.java
new file mode 100644
index 0000000..777a6ff
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/annotations/Burning.java
@@ -0,0 +1,12 @@
+package cz.jzitnik.game.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@RequireAnnotation(BlockRegistry.class)
+public @interface Burning {
+}
\ No newline at end of file
diff --git a/src/main/java/cz/jzitnik/game/entities/Player.java b/src/main/java/cz/jzitnik/game/entities/Player.java
index 0dca2c1..e3bde1a 100644
--- a/src/main/java/cz/jzitnik/game/entities/Player.java
+++ b/src/main/java/cz/jzitnik/game/entities/Player.java
@@ -13,6 +13,9 @@ public class Player implements Serializable {
     private int fallDistance = 0;
     private Block playerBlock1;
     private Block playerBlock2;
+    private boolean burning = false;
+    private int burningTimeout;
+    private boolean burningState = false;
 
     public synchronized void heal() {
         if (hunger > 3 && health < 10) {
diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/LavaBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/LavaBlock.java
index f5d6cc7..ff66f23 100644
--- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/LavaBlock.java
+++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/LavaBlock.java
@@ -2,10 +2,12 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks;
 
 import cz.jzitnik.game.SpriteLoader;
 import cz.jzitnik.game.annotations.BlockRegistry;
+import cz.jzitnik.game.annotations.Burning;
 import cz.jzitnik.game.entities.Block;
 import cz.jzitnik.game.logic.services.flowing.FlowingData;
 import cz.jzitnik.game.sprites.Water;
 
+@Burning
 @BlockRegistry(value = "lava", drops = "lava_bucket")
 public class LavaBlock extends Block {
     public LavaBlock() {
diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java
index 38f399e..006b128 100644
--- a/src/main/java/cz/jzitnik/game/generation/Generation.java
+++ b/src/main/java/cz/jzitnik/game/generation/Generation.java
@@ -34,7 +34,7 @@ public class Generation {
         world[terrainHeight[256] - 1][256].add(steveBlock2);
         world[terrainHeight[256] - 2][256].add(steveBlock);
 
-        game.getInventory().addItem(ItemBlockSupplier.getItem("bucket"));
+        game.getInventory().addItem(ItemBlockSupplier.getItem("lava_bucket"));
     }
 
     private static void initializeWorld(List<Block>[][] world) {
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
new file mode 100644
index 0000000..2efa3da
--- /dev/null
+++ b/src/main/java/cz/jzitnik/game/logic/services/burning/Burning.java
@@ -0,0 +1,40 @@
+package cz.jzitnik.game.logic.services.burning;
+
+import cz.jzitnik.game.Game;
+import cz.jzitnik.game.annotations.CustomLogic;
+import cz.jzitnik.game.entities.Player;
+import cz.jzitnik.game.logic.CustomLogicInterface;
+
+@CustomLogic
+public class Burning implements CustomLogicInterface {
+    @Override
+    public void nextIteration(Game game) {
+        var world = game.getWorld();
+        int[] data = game.getPlayerCords();
+        int x = data[0];
+        int y = data[1];
+        Player player = game.getPlayer();
+
+        var blocks = world[y][x];
+
+        if (blocks.stream().anyMatch(i -> i.getClass().isAnnotationPresent(cz.jzitnik.game.annotations.Burning.class))) {
+            player.setBurning(true);
+            player.setBurningTimeout(0);
+        } else {
+            boolean prev = player.isBurning();
+            if (prev) {
+                player.setBurning(false);
+                player.setBurningTimeout(5);
+            } else if (player.getBurningTimeout() != 0) {
+                player.setBurningTimeout(player.getBurningTimeout() - 1);
+            }
+        }
+
+        if (player.isBurning() || player.getBurningTimeout() != 0) {
+            player.dealDamage();
+            player.setBurningState(true);
+        } else {
+            player.setBurningState(false);
+        }
+    }
+}
diff --git a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java
index 34165db..609699b 100644
--- a/src/main/java/cz/jzitnik/tui/ScreenRenderer.java
+++ b/src/main/java/cz/jzitnik/tui/ScreenRenderer.java
@@ -2,6 +2,7 @@ package cz.jzitnik.tui;
 
 import cz.jzitnik.game.entities.Block;
 import cz.jzitnik.game.Game;
+import cz.jzitnik.game.sprites.SimpleSprite;
 import cz.jzitnik.game.sprites.Steve;
 import cz.jzitnik.game.blocks.Chest;
 import cz.jzitnik.game.blocks.Furnace;
@@ -111,6 +112,12 @@ 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());
+                        }
+
                         String sprite = SpriteCombiner.combineSprites(sprites.toArray(String[]::new));
 
                         String[] spriteLines = sprite.split("\n");
diff --git a/src/main/resources/textures/fire.ans b/src/main/resources/textures/fire.ans
new file mode 100644
index 0000000..7218e1f
--- /dev/null
+++ b/src/main/resources/textures/fire.ans
@@ -0,0 +1,25 @@
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
diff --git a/src/main/resources/textures/steve2_burning.ans b/src/main/resources/textures/steve2_burning.ans
new file mode 100644
index 0000000..d96cecc
--- /dev/null
+++ b/src/main/resources/textures/steve2_burning.ans
@@ -0,0 +1,25 @@
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
+                                                  
diff --git a/src/test/java/cz/jzitnik/game/core/autotransient/AutoTransientSupportTest.java b/src/test/java/cz/jzitnik/game/core/autotransient/AutoTransientSupportTest.java
index 3d0bf3d..9898202 100644
--- a/src/test/java/cz/jzitnik/game/core/autotransient/AutoTransientSupportTest.java
+++ b/src/test/java/cz/jzitnik/game/core/autotransient/AutoTransientSupportTest.java
@@ -20,7 +20,7 @@ class AutoTransientSupportTest {
         Reflections reflections = new Reflections(
                 new ConfigurationBuilder()
                         .forPackages("cz.jzitnik.game")
-                        .addScanners(Scanners.FieldsAnnotated) // Explicitly add the scanner for fields
+                        .addScanners(Scanners.FieldsAnnotated)
         );
         Set<Field> fields = reflections.getFieldsAnnotatedWith(AutoTransient.class);