From 064ae511d979bd1231d6f94a493b99717de2aa9f Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Fri, 21 Mar 2025 11:29:59 +0100 Subject: [PATCH] feat: Implemented wheat and bread --- .../java/cz/jzitnik/game/SpriteLoader.java | 10 ++++--- .../cz/jzitnik/game/annotations/Farmable.java | 1 + .../crafting/recipes/food/BreadRecipe.java | 14 ++++++++++ .../registry/blocks/grassy/WheatBlock.java | 2 +- .../items/registry/items/food/BreadItem.java | 13 +++++++++ .../registry/items/grassy/WheatItem.java | 13 +++++++++ .../jzitnik/game/generation/Generation.java | 5 ---- .../place/CustomAnnotationHandler.java | 27 ++++++++++++++++++- src/main/resources/textures/items/bread.ans | 25 +++++++++++++++++ src/main/resources/textures/items/wheat.ans | 25 +++++++++++++++++ 10 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/crafting/recipes/food/BreadRecipe.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/food/BreadItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/grassy/WheatItem.java create mode 100644 src/main/resources/textures/items/bread.ans create mode 100644 src/main/resources/textures/items/wheat.ans diff --git a/src/main/java/cz/jzitnik/game/SpriteLoader.java b/src/main/java/cz/jzitnik/game/SpriteLoader.java index 960de70..fc86c2c 100644 --- a/src/main/java/cz/jzitnik/game/SpriteLoader.java +++ b/src/main/java/cz/jzitnik/game/SpriteLoader.java @@ -75,6 +75,9 @@ public class SpriteLoader { HEART, HUNGER, + // Seeds + WHEAT, + // ITEMS // Items @@ -158,9 +161,6 @@ public class SpriteLoader { LAVA_BUCKET, MILK_BUCKET, - // Seeds - WHEAT, - // Food ITEM_PORKCHOP, ITEM_COOKED_PORKCHOP, @@ -169,9 +169,11 @@ public class SpriteLoader { ITEM_BEEF, ITEM_STEAK, ITEM_APPLE, + ITEM_BREAD, // Seeds ITEM_WHEAT_SEEDS, + ITEM_WHEAT, } public static final HashMap SPRITES_MAP = new HashMap<>(); @@ -239,6 +241,7 @@ public class SpriteLoader { // Seeds SPRITES_MAP.put(SPRITES.ITEM_WHEAT_SEEDS, new SimpleSprite("items/wheat_seeds.ans")); + SPRITES_MAP.put(SPRITES.ITEM_WHEAT, new SimpleSprite("items/wheat.ans")); // ENTITIES SPRITES_MAP.put(SPRITES.STEVE, new Steve()); @@ -345,6 +348,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.ITEM_BEEF, new SimpleSprite("items/beef.ans")); SPRITES_MAP.put(SPRITES.ITEM_STEAK, new SimpleSprite("items/steak.ans")); SPRITES_MAP.put(SPRITES.ITEM_APPLE, new SimpleSprite("items/apple.ans")); + SPRITES_MAP.put(SPRITES.ITEM_BREAD, new SimpleSprite("items/bread.ans")); } public static SpriteList load() { diff --git a/src/main/java/cz/jzitnik/game/annotations/Farmable.java b/src/main/java/cz/jzitnik/game/annotations/Farmable.java index ed571ed..82ccf79 100644 --- a/src/main/java/cz/jzitnik/game/annotations/Farmable.java +++ b/src/main/java/cz/jzitnik/game/annotations/Farmable.java @@ -8,4 +8,5 @@ import java.lang.annotation.ElementType; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Farmable { + String value(); } diff --git a/src/main/java/cz/jzitnik/game/crafting/recipes/food/BreadRecipe.java b/src/main/java/cz/jzitnik/game/crafting/recipes/food/BreadRecipe.java new file mode 100644 index 0000000..21d6dc9 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/crafting/recipes/food/BreadRecipe.java @@ -0,0 +1,14 @@ +package cz.jzitnik.game.crafting.recipes.food; + +import cz.jzitnik.game.annotations.CraftingRecipeRegistry; + +@CraftingRecipeRegistry( + recipe = { + "wheat", "wheat", "wheat", + "_", "_", "_", + "_", "_", "_" + }, + result = "bread", + amount = 1 +) +public class BreadRecipe {} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/grassy/WheatBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/grassy/WheatBlock.java index 376f3f3..3027944 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/grassy/WheatBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/grassy/WheatBlock.java @@ -9,7 +9,7 @@ import cz.jzitnik.game.annotations.ResetSpriteStateOnMine; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.services.farmable.FarmableData; -@Farmable +@Farmable("wheat") @PlaceOnSolidNoHandler @ResetDataOnMine @ResetSpriteStateOnMine diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/food/BreadItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/food/BreadItem.java new file mode 100644 index 0000000..163b1de --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/food/BreadItem.java @@ -0,0 +1,13 @@ +package cz.jzitnik.game.entities.items.registry.items.food; + +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("bread") +public class BreadItem extends Item { + public BreadItem() { + super("bread", "Bread", ItemType.FOOD, SpriteLoader.SPRITES.ITEM_BREAD, 3); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/grassy/WheatItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/grassy/WheatItem.java new file mode 100644 index 0000000..9c62773 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/grassy/WheatItem.java @@ -0,0 +1,13 @@ +package cz.jzitnik.game.entities.items.registry.items.grassy; + +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("wheat") +public class WheatItem extends Item { + public WheatItem() { + super("wheat", "Wheat", ItemType.USELESS_ITEM, SpriteLoader.SPRITES.ITEM_WHEAT); + } +} diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index 122079e..f9f48d6 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -1,7 +1,6 @@ package cz.jzitnik.game.generation; import cz.jzitnik.game.entities.Block; -import cz.jzitnik.game.entities.items.ItemBlockSupplier; import cz.jzitnik.game.Game; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.sprites.Steve; @@ -33,10 +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("wooden_hoe")); - game.getInventory().addItem(ItemBlockSupplier.getItem("water_bucket")); - game.getInventory().addItem(ItemBlockSupplier.getItem("wheat_seeds")); } private static void initializeWorld(List[][] world) { diff --git a/src/main/java/cz/jzitnik/game/handlers/place/CustomAnnotationHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/CustomAnnotationHandler.java index 1da4b39..361a515 100644 --- a/src/main/java/cz/jzitnik/game/handlers/place/CustomAnnotationHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/place/CustomAnnotationHandler.java @@ -3,7 +3,9 @@ package cz.jzitnik.game.handlers.place; import cz.jzitnik.game.Game; import cz.jzitnik.game.annotations.*; import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.entities.items.InventoryItem; import cz.jzitnik.game.entities.items.ItemBlockSupplier; +import cz.jzitnik.game.logic.services.farmable.FarmableData; import cz.jzitnik.game.sprites.TwoBlockSprite; import java.lang.reflect.Constructor; @@ -14,6 +16,7 @@ import java.util.Random; public class CustomAnnotationHandler implements CustomPlaceHandler { private final Class clazz; private final DefaultPlaceHandler defaultPlaceHandler = new DefaultPlaceHandler(); + private final Random random = new Random(); private record BlockDrop(String drops, int percentage) { } @@ -71,6 +74,29 @@ public class CustomAnnotationHandler implements CustomPlaceHandler { @Override public boolean mine(Game game, int x, int y) { + boolean dropDefault = true; + + if (clazz.isAnnotationPresent(Farmable.class)) { + var blocks = game.getWorld()[y][x]; + var blockx = blocks.stream().filter(block -> !block.getBlockId().equals("air")).findFirst().get(); + + var data = (FarmableData) blockx.getData(); + + if (data.getState() == 2) { + dropDefault = false; + var annotation = clazz.getAnnotation(Farmable.class); + var growDrop = annotation.value(); + var seedDrop = blockx.getDrops().get(0); + var seedDropAmount = random.nextInt(4); + + if (seedDropAmount != 0) { + game.getInventory().addItem(new InventoryItem(seedDropAmount, seedDrop)); + } + + game.getInventory().addItem(ItemBlockSupplier.getItem(growDrop)); + } + } + if (clazz.isAnnotationPresent(ResetDataOnMine.class)) { resetDataOnMine(game, x, y); } @@ -82,7 +108,6 @@ public class CustomAnnotationHandler implements CustomPlaceHandler { blockx.setSpriteState(); } - boolean dropDefault = true; if (clazz.isAnnotationPresent(CustomDrops.class) || clazz.isAnnotationPresent(CustomDrop.class)) { var annotations = clazz.isAnnotationPresent(CustomDrops.class) diff --git a/src/main/resources/textures/items/bread.ans b/src/main/resources/textures/items/bread.ans new file mode 100644 index 0000000..ee993b4 --- /dev/null +++ b/src/main/resources/textures/items/bread.ans @@ -0,0 +1,25 @@ +                                                   +                                                   +                                        +                                 +                                   +                              +                              +                              +                             +                             +                        +                              +                         +                             +                            +                            +                           +                            +                                 +                                   +                                    +                                  +                                       +                                      +                                         diff --git a/src/main/resources/textures/items/wheat.ans b/src/main/resources/textures/items/wheat.ans new file mode 100644 index 0000000..9afccdc --- /dev/null +++ b/src/main/resources/textures/items/wheat.ans @@ -0,0 +1,25 @@ +                                                  +                                                +                                              +                                          +                                 +                                +                                 +                                 +                                +                           +                               +                             +                          +                             +                                +                                +                             +                               +                            +                                         +                                       +                                          +                                          +                                            +