From 412959d456532446e91bda3d36edd8a9dad27c80 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Thu, 13 Mar 2025 17:07:53 +0100 Subject: [PATCH] feat: Falling blocks --- .../java/cz/jzitnik/game/SpriteLoader.java | 4 ++ .../game/annotations/BreaksFalling.java | 11 ++++ .../game/annotations/FallingBlock.java | 11 ++++ .../items/registry/blocks/GrassBushBlock.java | 2 + .../items/registry/blocks/SandBlock.java | 17 +++++++ .../items/registry/items/SandItem.java | 13 +++++ .../jzitnik/game/generation/Generation.java | 4 -- .../logic/services/falling/FallingLogic.java | 50 +++++++++++++++++++ src/main/resources/textures/items/sand.ans | 25 ++++++++++ src/main/resources/textures/sand.ans | 25 ++++++++++ 10 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java create mode 100644 src/main/java/cz/jzitnik/game/annotations/FallingBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/SandBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/SandItem.java create mode 100644 src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java create mode 100644 src/main/resources/textures/items/sand.ans create mode 100644 src/main/resources/textures/sand.ans diff --git a/src/main/java/cz/jzitnik/game/SpriteLoader.java b/src/main/java/cz/jzitnik/game/SpriteLoader.java index fbc0c19..fb462d5 100644 --- a/src/main/java/cz/jzitnik/game/SpriteLoader.java +++ b/src/main/java/cz/jzitnik/game/SpriteLoader.java @@ -26,6 +26,7 @@ public class SpriteLoader { OAK_PLANKS, OAK_DOOR, OBSIDIAN, + SAND, // Flowers etc GRASS_BUSH, @@ -78,6 +79,7 @@ public class SpriteLoader { ITEM_OAK_DOOR, ITEM_WOOL, ITEM_OBSIDIAN, + ITEM_SAND, // Ore Items ITEM_COAL_ORE, @@ -172,6 +174,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.WOOL, new Wool()); SPRITES_MAP.put(SPRITES.COBBLESTONE, new SimpleSprite("cobblestone.ans")); SPRITES_MAP.put(SPRITES.OBSIDIAN, new SimpleSprite("obsidian.ans")); + SPRITES_MAP.put(SPRITES.SAND, new SimpleSprite("sand.ans")); // Flowers etc. SPRITES_MAP.put(SPRITES.GRASS_BUSH, new SimpleSprite("grass_bush.ans")); @@ -224,6 +227,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.ITEM_OAK_DOOR, new SimpleSprite("oak_door/items/oak_door.ans")); SPRITES_MAP.put(SPRITES.ITEM_WOOL, new WoolItem()); SPRITES_MAP.put(SPRITES.ITEM_OBSIDIAN, new SimpleSprite("items/obsidian.ans")); + SPRITES_MAP.put(SPRITES.ITEM_SAND, new SimpleSprite("items/sand.ans")); // Ore Items SPRITES_MAP.put(SPRITES.ITEM_COAL_ORE, new SimpleSprite("items/coal_ore.ans")); diff --git a/src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java b/src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java new file mode 100644 index 0000000..1a627bd --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/BreaksFalling.java @@ -0,0 +1,11 @@ +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) +public @interface BreaksFalling { +} diff --git a/src/main/java/cz/jzitnik/game/annotations/FallingBlock.java b/src/main/java/cz/jzitnik/game/annotations/FallingBlock.java new file mode 100644 index 0000000..53c73f3 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/FallingBlock.java @@ -0,0 +1,11 @@ +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) +public @interface FallingBlock { +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrassBushBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrassBushBlock.java index 909d23c..a92166c 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrassBushBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrassBushBlock.java @@ -4,12 +4,14 @@ import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockDropPercentage; import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.annotations.BreakableByWater; +import cz.jzitnik.game.annotations.BreaksFalling; import cz.jzitnik.game.annotations.CustomDrop; import cz.jzitnik.game.annotations.PlaceOnSolid; import cz.jzitnik.game.entities.Block; @PlaceOnSolid @BreakableByWater +@BreaksFalling @CustomDrop(tool = "shears", drops = "grass_bush") @BlockDropPercentage(13) @BlockRegistry(value = "grass_bush", drops = "wheat_seeds") diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/SandBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/SandBlock.java new file mode 100644 index 0000000..8d20c8c --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/SandBlock.java @@ -0,0 +1,17 @@ +package cz.jzitnik.game.entities.items.registry.blocks; + +import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.FallingBlock; +import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.entities.items.ItemType; + +import java.util.ArrayList; + +@FallingBlock +@BlockRegistry("sand") +public class SandBlock extends Block { + public SandBlock() { + super("sand", SpriteLoader.SPRITES.SAND, 1, ItemType.SHOVEL, new ArrayList<>()); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/SandItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/SandItem.java new file mode 100644 index 0000000..aad107b --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/SandItem.java @@ -0,0 +1,13 @@ +package cz.jzitnik.game.entities.items.registry.items; + +import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.ItemRegistry; +import cz.jzitnik.game.entities.items.Item; +import cz.jzitnik.game.entities.items.ItemType; + +@ItemRegistry("sand") +public class SandItem extends Item { + public SandItem() { + super("sand", "Sand", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_SAND); + } +} diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index 4654056..f9f48d6 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -3,7 +3,6 @@ package cz.jzitnik.game.generation; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.Game; import cz.jzitnik.game.SpriteLoader; -import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.sprites.Steve; import java.util.List; @@ -33,9 +32,6 @@ 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("water_bucket")); - game.getInventory().addItem(ItemBlockSupplier.getItem("lava_bucket")); } private static void initializeWorld(List[][] world) { 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 new file mode 100644 index 0000000..61d0819 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/logic/services/falling/FallingLogic.java @@ -0,0 +1,50 @@ +package cz.jzitnik.game.logic.services.falling; + +import cz.jzitnik.game.Game; +import cz.jzitnik.game.annotations.BreaksFalling; +import cz.jzitnik.game.annotations.CustomLogic; +import cz.jzitnik.game.annotations.FallingBlock; +import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.logic.CustomLogicInterface; + +@CustomLogic +public class FallingLogic implements CustomLogicInterface { + private static final int RADIUS = 30; + + @Override + public void nextIteration(Game game) { + var world = game.getWorld(); + int[] data = game.getPlayerCords(); + int playerX = data[0]; + int playerY = data[1]; + + int startX = Math.max(0, playerX - RADIUS); + int startY = Math.max(0, playerY - RADIUS); + int endX = Math.min(world[0].length - 1, playerX + RADIUS); + int endY = Math.min(world.length - 1, playerY + RADIUS); + + for (int y = startY; y <= endY; y++) { + for (int x = startX; x <= endX; x++) { + var blocks = world[y][x]; + + if (world[y+1][x].stream().anyMatch(block -> block.getClass().isAnnotationPresent(BreaksFalling.class))) { + var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList(); + for (Block block : fallingBlocks) { + blocks.remove(block); + game.getInventory().addItem(block.getDrops()); + } + } + + if (!world[y+1][x].stream().allMatch(block -> block.isGhost())) { + continue; + } + + var fallingBlocks = blocks.stream().filter(block -> block.getClass().isAnnotationPresent(FallingBlock.class)).toList(); + for (Block block : fallingBlocks) { + blocks.remove(block); + world[y + 1][x].add(block); + } + } + } + } +} diff --git a/src/main/resources/textures/items/sand.ans b/src/main/resources/textures/items/sand.ans new file mode 100644 index 0000000..16e52d0 --- /dev/null +++ b/src/main/resources/textures/items/sand.ans @@ -0,0 +1,25 @@ +                                                  +                                             +                                        +                                      +                              +                           +                        +                          +                           +                        +                         +                          +                         +                         +                    +                        +                          +                        +                        +                             +                               +                                  +                                        +                                              +                                                  diff --git a/src/main/resources/textures/sand.ans b/src/main/resources/textures/sand.ans new file mode 100644 index 0000000..758a5a1 --- /dev/null +++ b/src/main/resources/textures/sand.ans @@ -0,0 +1,25 @@ +                     +                      +                        +                       +                      +                       +                        +                          +                     +                     +                     +                       +                         +                       +                      +                     +                      +                      +                      +                     +                     +                     +                      +                      +