From bc7480459ae1a5d23b6b3c2ed4140b66e7f5bc86 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Sat, 8 Mar 2025 11:06:11 +0100 Subject: [PATCH] feat: Started implementing oak sapling logic --- src/main/java/cz/jzitnik/game/Game.java | 43 +- .../java/cz/jzitnik/game/SpriteLoader.java | 13 +- .../items/registry/blocks/LavaBlock.java | 1 - .../items/registry/blocks/OakLeavesBlock.java | 16 + .../registry/blocks/OakSaplingBlock.java | 14 + .../items/registry/items/AppleItem.java | 13 + .../items/registry/items/OakLeavesItem.java | 13 + .../items/registry/items/OakSaplingItem.java | 13 + .../items/registry/items/ObsidianItem.java | 13 + .../jzitnik/game/generation/Generation.java | 19 +- .../handlers/place/CustomPlaceHandler.java | 2 +- .../handlers/place/DefaultPlaceHandler.java | 4 +- .../place/handlers/BedPlaceHandler.java | 4 +- .../place/handlers/BucketPlaceHandler.java | 33 -- .../place/handlers/DoorPlaceHandler.java | 4 +- .../place/handlers/OakLeavesMineHandler.java | 55 +++ .../logic/services/flowing/FlowingLogic.java | 7 - .../services/flowing/LavaWaterLogic.java | 1 - .../logic/services/saplings/SaplingData.java | 17 + .../logic/services/saplings/SaplingLogic.java | 15 + .../game/mobs/services/cow/CowLogic.java | 2 +- .../game/mobs/services/pig/PigLogic.java | 4 +- .../game/mobs/services/sheep/SheepLogic.java | 2 +- .../config/checkstyle/checkstyle.xml | 427 ------------------ src/main/resources/textures/items/apple.ans | 25 + .../resources/textures/items/oak_leaves.ans | 25 + .../resources/textures/items/obsidian.ans | 25 + src/main/resources/textures/oak_sapling.ans | 25 + 28 files changed, 327 insertions(+), 508 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakLeavesBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakSaplingBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/AppleItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/OakLeavesItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/OakSaplingItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/ObsidianItem.java delete mode 100644 src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java create mode 100644 src/main/java/cz/jzitnik/game/handlers/place/handlers/OakLeavesMineHandler.java create mode 100644 src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingData.java create mode 100644 src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java delete mode 100644 src/main/resources/config/checkstyle/checkstyle.xml create mode 100644 src/main/resources/textures/items/apple.ans create mode 100644 src/main/resources/textures/items/oak_leaves.ans create mode 100644 src/main/resources/textures/items/obsidian.ans create mode 100644 src/main/resources/textures/oak_sapling.ans diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java index 46df254..3a2c290 100644 --- a/src/main/java/cz/jzitnik/game/Game.java +++ b/src/main/java/cz/jzitnik/game/Game.java @@ -22,6 +22,7 @@ import lombok.Getter; import lombok.Setter; import org.jline.terminal.Terminal; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -203,27 +204,34 @@ public class Game { mining = false; var blocks = world[y][x]; - for (Block block : blocks) { - if (!block.isMineable()) { - continue; - } + var blocksCopy = new ArrayList<>(blocks); + CustomPlaceHandler customPlaceHandler = gameStates.dependencies.placeHandler + .get(blocks.stream().filter(Block::isMineable).toList().getFirst().getBlockId()); + boolean giveItem = customPlaceHandler.mine(this, x, y); - if (block.getToolVariants().isEmpty()) { - // Add to inv - block.getDrops().forEach(inventory::addItem); - continue; - } + if (giveItem) { + for (Block block : blocksCopy) { + if (!block.isMineable()) { + continue; + } - var toolVariants = block.getToolVariants(); - if (inventory.getItemInHand().isPresent() - && inventory.getItemInHand().get().getToolVariant().isPresent() && block.getTool().isPresent() - && block.getTool().get().equals(inventory.getItemInHand().get().getType()) - && toolVariants.contains(inventory.getItemInHand().get().getToolVariant().get())) { - block.getDrops().forEach(inventory::addItem); + if (block.getToolVariants().isEmpty()) { + // Add to inv + block.getDrops().forEach(inventory::addItem); + continue; + } + + var toolVariants = block.getToolVariants(); + if (inventory.getItemInHand().isPresent() + && inventory.getItemInHand().get().getToolVariant().isPresent() && block.getTool().isPresent() + && block.getTool().get().equals(inventory.getItemInHand().get().getType()) + && toolVariants.contains(inventory.getItemInHand().get().getToolVariant().get())) { + block.getDrops().forEach(inventory::addItem); + } } } - for (Block block : blocks) { + for (Block block : blocksCopy) { if (block.getBlockId().equals("chest")) { ((Chest) block.getData()).breakBlock(this); } else if (block.getBlockId().equals("furnace")) { @@ -231,9 +239,6 @@ public class Game { } } - CustomPlaceHandler customPlaceHandler = gameStates.dependencies.placeHandler - .get(blocks.stream().filter(Block::isMineable).toList().getFirst().getBlockId()); - customPlaceHandler.mine(this, x, y); inventory.getItemInHand().ifPresent(Item::use); screenRenderer.render(this); diff --git a/src/main/java/cz/jzitnik/game/SpriteLoader.java b/src/main/java/cz/jzitnik/game/SpriteLoader.java index 12d19a3..12d331e 100644 --- a/src/main/java/cz/jzitnik/game/SpriteLoader.java +++ b/src/main/java/cz/jzitnik/game/SpriteLoader.java @@ -22,6 +22,9 @@ public class SpriteLoader { // Work FURNACE, CHEST, CRAFTING_TABLE, BED, + // Saplings + OAK_SAPLING, + // ENTITIES STEVE, PIG, SHEEP, COW, @@ -34,7 +37,7 @@ public class SpriteLoader { ITEM_STICK, ITEM_LEATHER, // Block Items - ITEM_DIRT, ITEM_OAK_LOG, ITEM_OAK_PLANKS, ITEM_COBBLESTONE, ITEM_STONE, ITEM_OAK_DOOR, ITEM_WOOL, + ITEM_DIRT, ITEM_OAK_LOG, ITEM_OAK_LEAF, ITEM_OAK_PLANKS, ITEM_COBBLESTONE, ITEM_STONE, ITEM_OAK_DOOR, ITEM_WOOL, ITEM_OBSIDIAN, // Ore Items ITEM_COAL_ORE, ITEM_IRON_ORE, ITEM_GOLD_ORE, ITEM_DIAMOND_ORE, @@ -59,7 +62,7 @@ public class SpriteLoader { BUCKET, WATER_BUCKET, LAVA_BUCKET, MILK_BUCKET, // Food - ITEM_PORKCHOP, ITEM_COOKED_PORKCHOP, ITEM_MUTTON, ITEM_COOKED_MUTTON, ITEM_BEEF, ITEM_STEAK, + ITEM_PORKCHOP, ITEM_COOKED_PORKCHOP, ITEM_MUTTON, ITEM_COOKED_MUTTON, ITEM_BEEF, ITEM_STEAK, ITEM_APPLE, } public static final HashMap SPRITES_MAP = new HashMap<>(); @@ -100,6 +103,9 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.CHEST, new SimpleSprite("chest.ans")); SPRITES_MAP.put(SPRITES.BED, new Bed()); + // Saplings + SPRITES_MAP.put(SPRITES.OAK_SAPLING, new SimpleSprite("oak_sapling.ans")); + // ENTITIES SPRITES_MAP.put(SPRITES.STEVE, new Steve()); SPRITES_MAP.put(SPRITES.PIG, new Pig()); @@ -120,11 +126,13 @@ public class SpriteLoader { // Block Items SPRITES_MAP.put(SPRITES.ITEM_DIRT, new SimpleSprite("items/dirt.ans")); SPRITES_MAP.put(SPRITES.ITEM_OAK_LOG, new SimpleSprite("items/oak_log.ans")); + SPRITES_MAP.put(SPRITES.ITEM_OAK_LEAF, new SimpleSprite("items/oak_leaves.ans")); SPRITES_MAP.put(SPRITES.ITEM_OAK_PLANKS, new SimpleSprite("items/oak_planks.ans")); SPRITES_MAP.put(SPRITES.ITEM_COBBLESTONE, new SimpleSprite("items/cobblestone.ans")); SPRITES_MAP.put(SPRITES.ITEM_STONE, new SimpleSprite("items/stone.ans")); 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")); // Ore Items SPRITES_MAP.put(SPRITES.ITEM_COAL_ORE, new SimpleSprite("items/coal_ore.ans")); @@ -191,6 +199,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.ITEM_COOKED_MUTTON, new SimpleSprite("items/cooked_mutton.ans")); 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")); } public static SpriteList load() { diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LavaBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LavaBlock.java index 38c4b52..7763fd7 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LavaBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LavaBlock.java @@ -4,7 +4,6 @@ import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.services.flowing.FlowingData; -import cz.jzitnik.game.sprites.Lava; import cz.jzitnik.game.sprites.Water; @BlockRegistry(value = "lava", drops = "lava_bucket") diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakLeavesBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakLeavesBlock.java new file mode 100644 index 0000000..003983d --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakLeavesBlock.java @@ -0,0 +1,16 @@ +package cz.jzitnik.game.entities.items.registry.blocks; + +import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.entities.items.ItemType; + +import java.util.ArrayList; + +@BlockRegistry("oak_leaves") +public class OakLeavesBlock extends Block { + public OakLeavesBlock() { + super("oak_leaves", SpriteLoader.SPRITES.OAK_LEAF, 1, ItemType.SHEARS, + new ArrayList<>()); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakSaplingBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakSaplingBlock.java new file mode 100644 index 0000000..114910b --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/OakSaplingBlock.java @@ -0,0 +1,14 @@ +package cz.jzitnik.game.entities.items.registry.blocks; + +import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.logic.services.saplings.SaplingData; + +@BlockRegistry("oak_sapling") +public class OakSaplingBlock extends Block { + public OakSaplingBlock() { + super("oak_sapling", SpriteLoader.SPRITES.OAK_SAPLING, 0); + setData(new SaplingData()); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/AppleItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/AppleItem.java new file mode 100644 index 0000000..bdc5eef --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/AppleItem.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("apple") +public class AppleItem extends Item { + public AppleItem() { + super("apple", "Apple", ItemType.FOOD, SpriteLoader.SPRITES.ITEM_APPLE, 2); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakLeavesItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakLeavesItem.java new file mode 100644 index 0000000..95f3a77 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakLeavesItem.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("oak_leaves") +public class OakLeavesItem extends Item { + public OakLeavesItem() { + super("oak_leaves", "Oak leaves", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_OAK_LEAF); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakSaplingItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakSaplingItem.java new file mode 100644 index 0000000..84f5f6a --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/OakSaplingItem.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("oak_sapling") +public class OakSaplingItem extends Item { + public OakSaplingItem() { + super("oak_sapling", "Oak sapling", ItemType.BLOCK, SpriteLoader.SPRITES.OAK_SAPLING); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/ObsidianItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/ObsidianItem.java new file mode 100644 index 0000000..c34d18b --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/ObsidianItem.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("obsidian") +public class ObsidianItem extends Item { + public ObsidianItem() { + super("obsidian", "Obsidian", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_OBSIDIAN); + } +} diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index 71ce3ad..2d80827 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -4,10 +4,8 @@ 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.entities.items.ItemType; import cz.jzitnik.game.sprites.Steve; -import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; @@ -36,9 +34,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) { @@ -101,6 +96,7 @@ public class Generation { if (treeBase - 3 < 0) continue; + // Place trunk for (int j = 0; j < 3; j++) { if (treeBase - j >= 0) { world[treeBase - j - 1][i].add(ItemBlockSupplier.getBlock("oak_log")); @@ -109,19 +105,22 @@ public class Generation { int leafY = treeBase - 4; + // 2D Pyramid-shaped leaf placement for (int layer = 0; layer < 3; layer++) { int size = 5 - (layer * 2); int offsetY = leafY - layer; for (int dx = -size / 2; dx <= size / 2; dx++) { - for (int dy = -size / 2; dy <= size / 2; dy++) { - if (i + dx >= 0 && i + dx < world[0].length && offsetY >= 0) { - world[offsetY][i + dx].add(new Block("oak_leaves", SpriteLoader.SPRITES.OAK_LEAF, 1, - ItemType.SHEARS, new ArrayList<>())); - } + int x = i + dx; + int y = offsetY; + + if (x >= 0 && x < world[0].length && y >= 0) { + world[y][x].add(ItemBlockSupplier.getBlock("oak_leaves")); } } } } } + + } diff --git a/src/main/java/cz/jzitnik/game/handlers/place/CustomPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/CustomPlaceHandler.java index 5594b66..e0a0998 100644 --- a/src/main/java/cz/jzitnik/game/handlers/place/CustomPlaceHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/place/CustomPlaceHandler.java @@ -5,5 +5,5 @@ import cz.jzitnik.game.Game; public interface CustomPlaceHandler { boolean place(Game game, int x, int y); - void mine(Game game, int x, int y); + boolean mine(Game game, int x, int y); } diff --git a/src/main/java/cz/jzitnik/game/handlers/place/DefaultPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/DefaultPlaceHandler.java index 37d9403..a9c6cd7 100644 --- a/src/main/java/cz/jzitnik/game/handlers/place/DefaultPlaceHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/place/DefaultPlaceHandler.java @@ -18,9 +18,11 @@ public class DefaultPlaceHandler implements CustomPlaceHandler { } @Override - public void mine(Game game, int x, int y) { + public boolean mine(Game game, int x, int y) { var blocks = game.getWorld()[y][x]; blocks.removeAll(blocks.stream().filter(i -> !i.getBlockId().equals("air")).toList()); + + return true; } } diff --git a/src/main/java/cz/jzitnik/game/handlers/place/handlers/BedPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/handlers/BedPlaceHandler.java index 0a6f031..02bc3c0 100644 --- a/src/main/java/cz/jzitnik/game/handlers/place/handlers/BedPlaceHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/place/handlers/BedPlaceHandler.java @@ -47,7 +47,7 @@ public class BedPlaceHandler implements CustomPlaceHandler { } @Override - public void mine(Game game, int x, int y) { + public boolean mine(Game game, int x, int y) { var blocks = game.getWorld()[y][x]; Block block = blocks.stream().filter(b -> b.getBlockId().equals("bed")).toList().getFirst(); @@ -62,5 +62,7 @@ public class BedPlaceHandler implements CustomPlaceHandler { } blocks.removeAll(blocks.stream().filter(i -> !i.getBlockId().equals("air")).toList()); + + return true; } } diff --git a/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java deleted file mode 100644 index 2283ffa..0000000 --- a/src/main/java/cz/jzitnik/game/handlers/place/handlers/BucketPlaceHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package cz.jzitnik.game.handlers.place.handlers; - -import cz.jzitnik.game.Game; -import cz.jzitnik.game.annotations.PlaceHandler; -import cz.jzitnik.game.entities.Block; -import cz.jzitnik.game.entities.items.Item; -import cz.jzitnik.game.handlers.place.CustomPlaceHandler; - -@PlaceHandler("bucket") -public class BucketPlaceHandler implements CustomPlaceHandler { - @Override - public boolean place(Game game, int x, int y) { - return false; - } - - @Override - public void mine(Game game, int x, int y) { - var world = game.getWorld(); - var blocks = world[y][x]; - var flowingBlocks = blocks.stream().filter(Block::isFlowing).toList(); - - if (flowingBlocks.isEmpty()) { - return; - } - - var flowingBlock = flowingBlocks.getFirst(); - var items = flowingBlock.getDrops(); - for (Item item : items) { - game.getInventory().addItem(item); - } - blocks.remove(flowingBlock); - } -} diff --git a/src/main/java/cz/jzitnik/game/handlers/place/handlers/DoorPlaceHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/handlers/DoorPlaceHandler.java index d3ddf4d..f72bb36 100644 --- a/src/main/java/cz/jzitnik/game/handlers/place/handlers/DoorPlaceHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/place/handlers/DoorPlaceHandler.java @@ -36,7 +36,7 @@ public class DoorPlaceHandler implements CustomPlaceHandler { } @Override - public void mine(Game game, int x, int y) { + public boolean mine(Game game, int x, int y) { var blocks = game.getWorld()[y][x]; Block block = blocks.stream().filter(b -> b.getBlockId().equals("oak_door")).toList().getFirst(); @@ -53,5 +53,7 @@ public class DoorPlaceHandler implements CustomPlaceHandler { } blocks.removeAll(blocks.stream().filter(i -> !i.getBlockId().equals("air")).toList()); + + return true; } } diff --git a/src/main/java/cz/jzitnik/game/handlers/place/handlers/OakLeavesMineHandler.java b/src/main/java/cz/jzitnik/game/handlers/place/handlers/OakLeavesMineHandler.java new file mode 100644 index 0000000..6920d27 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/handlers/place/handlers/OakLeavesMineHandler.java @@ -0,0 +1,55 @@ +package cz.jzitnik.game.handlers.place.handlers; + +import cz.jzitnik.game.annotations.PlaceHandler; +import cz.jzitnik.game.entities.Block; +import cz.jzitnik.game.Game; +import cz.jzitnik.game.entities.items.InventoryItem; +import cz.jzitnik.game.entities.items.ItemBlockSupplier; +import cz.jzitnik.game.entities.items.ItemType; +import cz.jzitnik.game.handlers.place.CustomPlaceHandler; + +import java.util.Random; + +@PlaceHandler("oak_leaves") +public class OakLeavesMineHandler implements CustomPlaceHandler { + @Override + public boolean place(Game game, int x, int y) { + var blocks = game.getWorld()[y][x]; + var inventory = game.getInventory(); + + blocks.add(inventory.getItemInHand().get().getBlock().get()); + blocks.removeAll(blocks.stream().filter(Block::isFlowing).toList()); + + inventory.decreaseItemInHand(); + + return true; + } + + @Override + public boolean mine(Game game, int x, int y) { + var blocks = game.getWorld()[y][x]; + + blocks.removeAll(blocks.stream().filter(i -> !i.getBlockId().equals("air")).toList()); + + Random random = new Random(); + int percentage = random.nextInt(100); + + // If mined with sheers drop leaf + if (game.getInventory().getItemInHand().isPresent() && game.getInventory().getItemInHand().get().getType() == ItemType.SHEARS) { + return true; + } + + if (percentage < 2) { + // Apple + game.getInventory().addItem(ItemBlockSupplier.getItem("apple")); + } else if (percentage < 2 + 4) { + // Sticks + game.getInventory().addItem(new InventoryItem(random.nextInt(2) + 1, ItemBlockSupplier.getItem("stick"))); + } else if (percentage < 2 + 4 + 5) { + // Sapling + game.getInventory().addItem(ItemBlockSupplier.getItem("oak_sapling")); + } + + return false; + } +} 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 419a790..bbed62f 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 @@ -97,18 +97,11 @@ public class FlowingLogic implements CustomLogicInterface { var targetBlocks = world[newY][newX]; boolean hasWater = targetBlocks.stream().anyMatch(b -> b.getBlockId().equals("water")); boolean hasLava = targetBlocks.stream().anyMatch(b -> b.getBlockId().equals("lava")); - boolean isLavaSource = hasLava && targetBlocks.stream().anyMatch(b -> ((FlowingData) b.getData()).isSource()); if (liquidId.equals("water") && hasLava) { - if (isLavaSource) { - world[newY][newX].add(ItemBlockSupplier.getBlock("obsidian")); - } else { - world[newY][newX].add(ItemBlockSupplier.getBlock("cobblestone")); - } return; } if (liquidId.equals("lava") && hasWater) { - world[newY][newX].add(ItemBlockSupplier.getBlock("cobblestone")); return; } 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 3372b1f..c11e203 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 @@ -29,7 +29,6 @@ public class LavaWaterLogic implements CustomLogicInterface { var water = blocks.stream().filter(block -> block.getBlockId().equals("water")).findFirst().get(); var lava = blocks.stream().filter(block -> block.getBlockId().equals("lava")).findFirst().get(); - var waterData = (FlowingData) water.getData(); var lavaData = (FlowingData) lava.getData(); world[y][x].remove(water); diff --git a/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingData.java b/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingData.java new file mode 100644 index 0000000..31ab442 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingData.java @@ -0,0 +1,17 @@ +package cz.jzitnik.game.logic.services.saplings; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Random; + +@Getter +@Setter +public class SaplingData { + private int growWait; + + public SaplingData() { + Random random = new Random(); + growWait = random.nextInt(270) + 30; + } +} 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 new file mode 100644 index 0000000..ff7fefd --- /dev/null +++ b/src/main/java/cz/jzitnik/game/logic/services/saplings/SaplingLogic.java @@ -0,0 +1,15 @@ +package cz.jzitnik.game.logic.services.saplings; + +import cz.jzitnik.game.Game; +import cz.jzitnik.game.annotations.CustomLogic; +import cz.jzitnik.game.logic.CustomLogicInterface; + +@CustomLogic +public class SaplingLogic implements CustomLogicInterface { + private static final int RADIUS = 30; + + @Override + public void nextIteration(Game game) { + + } +} diff --git a/src/main/java/cz/jzitnik/game/mobs/services/cow/CowLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/cow/CowLogic.java index 3ceae12..a4a36ce 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/cow/CowLogic.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/cow/CowLogic.java @@ -140,7 +140,7 @@ public class CowLogic if (countCows(rstartX, rendX, rstartY, rendY, game) < 3 && random.nextInt(100) < 2) { var spawnLocations = cowCanSpawn(rstartX, rendX, playerY, game); if (!spawnLocations.isEmpty()) { - for (int i = 0; i < Math.min(random.nextInt(3) + 2, spawnLocations.size()); i++) { + for (int i = 0; i < Math.min(4, spawnLocations.size()); i++) { var randomLocation = getRandomEntry(spawnLocations); int x = randomLocation.getKey(); int y = randomLocation.getValue(); diff --git a/src/main/java/cz/jzitnik/game/mobs/services/pig/PigLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/pig/PigLogic.java index f282d2c..55662c2 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/pig/PigLogic.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/pig/PigLogic.java @@ -105,7 +105,7 @@ public class PigLogic @Override public void spawn(int playerX, int playerY, Game game, Terminal terminal) { - // Cordinates where player can see + // Coordinates where player can see int[] data = ScreenMovingCalculationProvider.calculate(playerX, playerY, terminal.getHeight(), terminal.getWidth(), game.getWorld()[0].length, game.getWorld().length); var world = game.getWorld(); @@ -140,7 +140,7 @@ public class PigLogic if (countPrasata(rstartX, rendX, rstartY, rendY, game) < 3 && random.nextInt(100) < 2) { var spawnLocations = pigCanSpawn(rstartX, rendX, playerY, game); if (!spawnLocations.isEmpty()) { - for (int i = 0; i < Math.min(random.nextInt(3) + 2, spawnLocations.size()); i++) { + for (int i = 0; i < Math.min(4, spawnLocations.size()); i++) { var randomLocation = getRandomEntry(spawnLocations); int x = randomLocation.getKey(); int y = randomLocation.getValue(); diff --git a/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepLogic.java index 2e95ba3..5da134a 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepLogic.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepLogic.java @@ -153,7 +153,7 @@ public class SheepLogic if (countSheep(rstartX, rendX, rstartY, rendY, game) < 3 && random.nextInt(100) < 2) { var spawnLocations = sheepCanSpawn(rstartX, rendX, playerY, game); if (!spawnLocations.isEmpty()) { - for (int i = 0; i < Math.min(random.nextInt(3) + 2, spawnLocations.size()); i++) { + for (int i = 0; i < Math.min(4, spawnLocations.size()); i++) { var randomLocation = getRandomEntry(spawnLocations); int x = randomLocation.getKey(); int y = randomLocation.getValue(); diff --git a/src/main/resources/config/checkstyle/checkstyle.xml b/src/main/resources/config/checkstyle/checkstyle.xml deleted file mode 100644 index 2ffc78b..0000000 --- a/src/main/resources/config/checkstyle/checkstyle.xml +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/textures/items/apple.ans b/src/main/resources/textures/items/apple.ans new file mode 100644 index 0000000..b2b8aa1 --- /dev/null +++ b/src/main/resources/textures/items/apple.ans @@ -0,0 +1,25 @@ +                                                   +                                                 +                                                 +                                               +                                               +                                                 +                                         +                                         +                                   +                               +                              +                         +                               +                               +                                +                              +                         +                                   +                                    +                                +                                     +                                     +                                     +                                     +                                                   diff --git a/src/main/resources/textures/items/oak_leaves.ans b/src/main/resources/textures/items/oak_leaves.ans new file mode 100644 index 0000000..b55900d --- /dev/null +++ b/src/main/resources/textures/items/oak_leaves.ans @@ -0,0 +1,25 @@ +                                                  +                                                 +                                           +                                          +                                    +                                    +                              +                                   +                                   +                                     +                                   +                                +                               +                                  +                                  +                                  +                          +                               +                                 +                                      +                                        +                                          +                                         +                                              +                                                  diff --git a/src/main/resources/textures/items/obsidian.ans b/src/main/resources/textures/items/obsidian.ans new file mode 100644 index 0000000..5a96263 --- /dev/null +++ b/src/main/resources/textures/items/obsidian.ans @@ -0,0 +1,25 @@ +                                                  +                                             +                                        +                                     +                               +                             +                       +                          +                       +                           +                         +                          +                           +                          +                          +                         +                         +                           +                        +                            +                                  +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/oak_sapling.ans b/src/main/resources/textures/oak_sapling.ans new file mode 100644 index 0000000..bbc2660 --- /dev/null +++ b/src/main/resources/textures/oak_sapling.ans @@ -0,0 +1,25 @@ +                                                   +                                                 +                                                +                                              +                                            +                                     +                                +                              +                           +                              +                                +                                    +                                 +                                        +                              +                                +                          +                         +                      +                                       +                                        +                                        +                                            +                                            +