From 841bc7aa31cd9115582f4b6c8deb631fe3ca6450 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Sun, 2 Mar 2025 09:31:07 +0100 Subject: [PATCH] feat: Colored wool --- src/main/java/cz/jzitnik/Main.java | 7 +- .../java/cz/jzitnik/game/SpriteLoader.java | 5 +- .../java/cz/jzitnik/game/blocks/Furnace.java | 4 +- .../java/cz/jzitnik/game/entities/Block.java | 6 ++ .../cz/jzitnik/game/entities/items/Item.java | 5 ++ .../items/registry/blocks/BlackWoolBlock.java | 14 ++++ .../items/registry/blocks/BrownWoolBlock.java | 14 ++++ .../items/registry/blocks/GrayWoolBlock.java | 14 ++++ .../registry/blocks/LightGrayWoolBlock.java | 14 ++++ .../items/registry/blocks/PinkWoolBlock.java | 14 ++++ .../items/registry/blocks/WhiteWoolBlock.java | 14 ++++ .../items/registry/items/BlackWoolItem.java | 15 ++++ .../items/registry/items/BrownWoolItem.java | 15 ++++ .../items/registry/items/GrayWoolItem.java | 15 ++++ .../registry/items/LightGrayWoolItem.java | 15 ++++ .../items/registry/items/PinkWoolItem.java | 15 ++++ .../items/registry/items/WhiteWoolItem.java | 15 ++++ .../entities/items/registry/mobs/Sheep.java | 30 +++++--- .../game/mobs/services/sheep/SheepData.java | 5 ++ .../game/mobs/services/sheep/SheepLogic.java | 74 +++++++++++-------- .../mobs/services/sheep/SheepVariant.java | 10 +++ .../java/cz/jzitnik/game/sprites/Wool.java | 34 +++++++++ .../cz/jzitnik/game/sprites/WoolItem.java | 34 +++++++++ .../cz/jzitnik/game/ui/CraftingTable.java | 4 +- .../java/cz/jzitnik/game/ui/Inventory.java | 8 +- .../jzitnik/game/ui/SmallCraftingTable.java | 4 +- src/main/resources/textures/black_wool.ans | 25 +++++++ src/main/resources/textures/brown_wool.ans | 25 +++++++ src/main/resources/textures/gray_wool.ans | 25 +++++++ .../resources/textures/items/black_wool.ans | 25 +++++++ .../resources/textures/items/brown_wool.ans | 25 +++++++ .../resources/textures/items/gray_wool.ans | 25 +++++++ .../textures/items/light_gray_wool.ans | 25 +++++++ .../resources/textures/items/pink_wool.ans | 25 +++++++ .../resources/textures/items/white_wool.ans | 25 +++++++ .../resources/textures/light_gray_wool.ans | 25 +++++++ src/main/resources/textures/pink_wool.ans | 25 +++++++ src/main/resources/textures/white_wool.ans | 25 +++++++ 38 files changed, 658 insertions(+), 46 deletions(-) create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BlackWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BrownWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrayWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LightGrayWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/PinkWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WhiteWoolBlock.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/BlackWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/BrownWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/GrayWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/LightGrayWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/PinkWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/entities/items/registry/items/WhiteWoolItem.java create mode 100644 src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepVariant.java create mode 100644 src/main/java/cz/jzitnik/game/sprites/Wool.java create mode 100644 src/main/java/cz/jzitnik/game/sprites/WoolItem.java create mode 100644 src/main/resources/textures/black_wool.ans create mode 100644 src/main/resources/textures/brown_wool.ans create mode 100644 src/main/resources/textures/gray_wool.ans create mode 100644 src/main/resources/textures/items/black_wool.ans create mode 100644 src/main/resources/textures/items/brown_wool.ans create mode 100644 src/main/resources/textures/items/gray_wool.ans create mode 100644 src/main/resources/textures/items/light_gray_wool.ans create mode 100644 src/main/resources/textures/items/pink_wool.ans create mode 100644 src/main/resources/textures/items/white_wool.ans create mode 100644 src/main/resources/textures/light_gray_wool.ans create mode 100644 src/main/resources/textures/pink_wool.ans create mode 100644 src/main/resources/textures/white_wool.ans diff --git a/src/main/java/cz/jzitnik/Main.java b/src/main/java/cz/jzitnik/Main.java index 26c78c7..4e38ecd 100644 --- a/src/main/java/cz/jzitnik/Main.java +++ b/src/main/java/cz/jzitnik/Main.java @@ -42,7 +42,12 @@ public class Main { inputHandlerThread.start(); while (isRunning[0]) { - entityLogicProvider.update(game); + try { + entityLogicProvider.update(game); + } catch (Exception ignored) { + // Yeah, yeah I know. Deal with it + } + if (game.getWindow() == Window.WORLD) { screenRenderer.render(game); } diff --git a/src/main/java/cz/jzitnik/game/SpriteLoader.java b/src/main/java/cz/jzitnik/game/SpriteLoader.java index 9ab9639..735b730 100644 --- a/src/main/java/cz/jzitnik/game/SpriteLoader.java +++ b/src/main/java/cz/jzitnik/game/SpriteLoader.java @@ -18,6 +18,7 @@ public class SpriteLoader { BREAKING, COBBLESTONE, FURNACE, + WOOL, CHEST, CRAFTING_TABLE, @@ -44,6 +45,7 @@ public class SpriteLoader { ITEM_STONE, ITEM_FURNACE, ITEM_OAK_DOOR, + ITEM_WOOL, ITEM_CRAFTING_TABLE, ITEM_CHEST, @@ -80,6 +82,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.FURNACE, new Furnace()); SPRITES_MAP.put(SPRITES.COAL_ORE, new SimpleSprite("coal_ore.ans")); SPRITES_MAP.put(SPRITES.OAK_DOOR, new OakDoor()); + SPRITES_MAP.put(SPRITES.WOOL, new Wool()); SPRITES_MAP.put(SPRITES.WOODEN_PICKAXE, new SimpleSprite("items/wooden_pickaxe.ans")); SPRITES_MAP.put(SPRITES.STONE_PICKAXE, new SimpleSprite("items/stone_pickaxe.ans")); @@ -99,6 +102,7 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.ITEM_OAK_DOOR, new SimpleSprite("oak_door/items/oak_door.ans")); SPRITES_MAP.put(SPRITES.ITEM_PORKCHOP, new SimpleSprite("items/porkchop.ans")); SPRITES_MAP.put(SPRITES.ITEM_COOKED_PORKCHOP, new SimpleSprite("items/cooked_porkchop.ans")); + SPRITES_MAP.put(SPRITES.ITEM_WOOL, new WoolItem()); SPRITES_MAP.put(SPRITES.ITEM_MUTTON, new SimpleSprite("items/mutton.ans")); SPRITES_MAP.put(SPRITES.ITEM_COOKED_MUTTON, new SimpleSprite("items/cooked_mutton.ans")); @@ -108,7 +112,6 @@ public class SpriteLoader { SPRITES_MAP.put(SPRITES.PIG, new Pig()); SPRITES_MAP.put(SPRITES.SHEEP, new Sheep()); - } public static SpriteList load() { diff --git a/src/main/java/cz/jzitnik/game/blocks/Furnace.java b/src/main/java/cz/jzitnik/game/blocks/Furnace.java index 8d941be..3739fd2 100644 --- a/src/main/java/cz/jzitnik/game/blocks/Furnace.java +++ b/src/main/java/cz/jzitnik/game/blocks/Furnace.java @@ -44,7 +44,9 @@ public class Furnace implements RightClickHandler { List sprites = game.getInventory().getSprites(items, spriteList, inventory.getSelectedItemInv() - 50); String[] outputSprite = outputItem == null ? null : SpriteCombiner.combineTwoSprites( - spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(), + outputItem.getItem().getFirst().getSpriteState().isPresent() ? + spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite(outputItem.getItem().getFirst().getSpriteState().get()) : + spriteList.getSprite(outputItem.getItem().getFirst().getSprite()).getSprite() , Numbers.getNumberSprite(outputItem.getAmount()) ).split("\n"); diff --git a/src/main/java/cz/jzitnik/game/entities/Block.java b/src/main/java/cz/jzitnik/game/entities/Block.java index b4cf1d3..b8a2f3b 100644 --- a/src/main/java/cz/jzitnik/game/entities/Block.java +++ b/src/main/java/cz/jzitnik/game/entities/Block.java @@ -40,6 +40,12 @@ public class Block { this.isMineable = isMineable; } + public Block(String blockId, SpriteLoader.SPRITES sprite, int hardness) { + this.blockId = blockId; + this.sprite = sprite; + this.hardness = hardness; + } + public Block(String blockId, SpriteLoader.SPRITES sprite, int hardness, ItemType tool, List toolVariants) { this.blockId = blockId; this.sprite = sprite; diff --git a/src/main/java/cz/jzitnik/game/entities/items/Item.java b/src/main/java/cz/jzitnik/game/entities/items/Item.java index b74cc8f..2c6ad18 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/Item.java +++ b/src/main/java/cz/jzitnik/game/entities/items/Item.java @@ -16,6 +16,7 @@ public class Item { private ItemType type; private Optional toolVariant = Optional.empty(); private SpriteLoader.SPRITES sprite; + private Optional spriteState = Optional.empty(); private boolean stackable = true; private int durability; private double miningDecrease = 0; @@ -71,4 +72,8 @@ public class Item { return name.equals(item.name); } + + public void setSpriteState(Enum spriteState) { + this.spriteState = Optional.of(spriteState); + } } diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BlackWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BlackWoolBlock.java new file mode 100644 index 0000000..65c8bef --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BlackWoolBlock.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.sprites.Wool; + +@BlockRegistry("black_wool") +public class BlackWoolBlock extends Block { + public BlackWoolBlock() { + super("black_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.BLACK); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BrownWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BrownWoolBlock.java new file mode 100644 index 0000000..8fb7c1e --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/BrownWoolBlock.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.sprites.Wool; + +@BlockRegistry("brown_wool") +public class BrownWoolBlock extends Block { + public BrownWoolBlock() { + super("brown_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.BROWN); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrayWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrayWoolBlock.java new file mode 100644 index 0000000..d97991f --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/GrayWoolBlock.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.sprites.Wool; + +@BlockRegistry("gray_wool") +public class GrayWoolBlock extends Block { + public GrayWoolBlock() { + super("gray_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.GRAY); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LightGrayWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LightGrayWoolBlock.java new file mode 100644 index 0000000..2f51901 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/LightGrayWoolBlock.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.sprites.Wool; + +@BlockRegistry("light_gray_wool") +public class LightGrayWoolBlock extends Block { + public LightGrayWoolBlock() { + super("light_gray_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.LIGHT_GRAY); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/PinkWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/PinkWoolBlock.java new file mode 100644 index 0000000..a09c888 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/PinkWoolBlock.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.sprites.Wool; + +@BlockRegistry("pink_wool") +public class PinkWoolBlock extends Block { + public PinkWoolBlock() { + super("pink_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.PINK); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WhiteWoolBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WhiteWoolBlock.java new file mode 100644 index 0000000..ecef3dd --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/WhiteWoolBlock.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.sprites.Wool; + +@BlockRegistry("white_wool") +public class WhiteWoolBlock extends Block { + public WhiteWoolBlock() { + super("white_wool", SpriteLoader.SPRITES.WOOL, 3); + setSpriteState(Wool.WoolState.WHITE); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/BlackWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/BlackWoolItem.java new file mode 100644 index 0000000..8f11e81 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/BlackWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("black_wool") +public class BlackWoolItem extends Item { + public BlackWoolItem() { + super("black_wool", "Black wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.BLACK); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/BrownWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/BrownWoolItem.java new file mode 100644 index 0000000..663237e --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/BrownWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("brown_wool") +public class BrownWoolItem extends Item { + public BrownWoolItem() { + super("brown_wool", "Brown wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.BROWN); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/GrayWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/GrayWoolItem.java new file mode 100644 index 0000000..bf0cdaa --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/GrayWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("gray_wool") +public class GrayWoolItem extends Item { + public GrayWoolItem() { + super("gray_wool", "Gray wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.GRAY); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/LightGrayWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/LightGrayWoolItem.java new file mode 100644 index 0000000..c5a12df --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/LightGrayWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("light_gray_wool") +public class LightGrayWoolItem extends Item { + public LightGrayWoolItem() { + super("light_gray_wool", "Light gray wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.LIGHT_GRAY); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/PinkWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/PinkWoolItem.java new file mode 100644 index 0000000..273e67f --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/PinkWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("pink_wool") +public class PinkWoolItem extends Item { + public PinkWoolItem() { + super("pink_wool", "Pink wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.PINK); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/items/WhiteWoolItem.java b/src/main/java/cz/jzitnik/game/entities/items/registry/items/WhiteWoolItem.java new file mode 100644 index 0000000..ca0c150 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/items/WhiteWoolItem.java @@ -0,0 +1,15 @@ +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; +import cz.jzitnik.game.sprites.WoolItem; + +@ItemRegistry("white_wool") +public class WhiteWoolItem extends Item { + public WhiteWoolItem() { + super("white_wool", "White wool", ItemType.BLOCK, SpriteLoader.SPRITES.ITEM_WOOL); + setSpriteState(WoolItem.WoolItemState.WHITE); + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Sheep.java b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Sheep.java index c19b38b..72e6fc3 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Sheep.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Sheep.java @@ -4,46 +4,56 @@ import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.EntityRegistry; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.mobs.services.sheep.SheepData; +import cz.jzitnik.game.mobs.services.sheep.SheepVariant; +import lombok.AllArgsConstructor; +import lombok.Getter; import java.util.Random; import static cz.jzitnik.game.sprites.Sheep.SheepState.*; - @EntityRegistry("sheep") public class Sheep extends Block { - private cz.jzitnik.game.sprites.Sheep.SheepState getSheep() { + @Getter + @AllArgsConstructor + private static class SheepDTO { + private cz.jzitnik.game.sprites.Sheep.SheepState state; + private SheepVariant variant; + } + + private SheepDTO getSheep() { Random random = new Random(); int num = random.nextInt(100); if (num < 1) { - return PINK_RIGHT; + return new SheepDTO(PINK_RIGHT, SheepVariant.PINK); } if (num < 4) { - return BROWN_RIGHT; + return new SheepDTO(BROWN_RIGHT, SheepVariant.BROWN); } if (num < 15) { int num1 = random.nextInt(3); return switch (num1) { - case 0 -> LIGHT_GRAY_RIGHT; - case 1 -> GRAY_RIGHT; - case 2 -> BLACK_RIGHT; + case 0 -> new SheepDTO(LIGHT_GRAY_RIGHT, SheepVariant.LIGHT_GRAY); + case 1 -> new SheepDTO(GRAY_RIGHT, SheepVariant.GRAY); + case 2 -> new SheepDTO(BLACK_RIGHT, SheepVariant.BLACK); default -> throw new IllegalStateException("Unexpected value: " + num1); }; } - return WHITE_RIGHT; + return new SheepDTO(WHITE_RIGHT, SheepVariant.WHITE); } public Sheep() { super("sheep", SpriteLoader.SPRITES.SHEEP); + var dto = getSheep(); setMob(true); setGhost(true); - setSpriteState(getSheep()); + setSpriteState(dto.getState()); setMineable(false); - setData(new SheepData()); + setData(new SheepData(dto.getVariant())); setHp(8); } } diff --git a/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepData.java b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepData.java index 71e089e..ab3e4bf 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepData.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepData.java @@ -9,4 +9,9 @@ public class SheepData { private int lastDirection = 1; // 1 = right, -1 = left private int movementCooldown = 0; private int jumpAttempts = 0; + private SheepVariant variant; + + public SheepData(SheepVariant variant) { + this.variant = variant; + } } 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 e2466c0..ae13728 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 @@ -48,33 +48,7 @@ public class SheepLogic implements EntityLogicInterface, EntitySpawnInterface, E } sheepData.setLastDirection(direction); - boolean isHurt = sheep.getSpriteState().get().name().endsWith("_HURT"); - Sheep.SheepState newState = switch (sheep.getSpriteState().get()) { - case WHITE_LEFT, WHITE_RIGHT, WHITE_LEFT_HURT, WHITE_RIGHT_HURT -> - isHurt ? (direction == 1 ? WHITE_RIGHT_HURT : WHITE_LEFT_HURT) - : (direction == 1 ? WHITE_RIGHT : WHITE_LEFT); - - case LIGHT_GRAY_LEFT, LIGHT_GRAY_RIGHT, LIGHT_GRAY_LEFT_HURT, LIGHT_GRAY_RIGHT_HURT -> - isHurt ? (direction == 1 ? LIGHT_GRAY_RIGHT_HURT : LIGHT_GRAY_LEFT_HURT) - : (direction == 1 ? LIGHT_GRAY_RIGHT : LIGHT_GRAY_LEFT); - - case GRAY_LEFT, GRAY_RIGHT, GRAY_LEFT_HURT, GRAY_RIGHT_HURT -> - isHurt ? (direction == 1 ? GRAY_RIGHT_HURT : GRAY_LEFT_HURT) - : (direction == 1 ? GRAY_RIGHT : GRAY_LEFT); - - case BLACK_LEFT, BLACK_RIGHT, BLACK_LEFT_HURT, BLACK_RIGHT_HURT -> - isHurt ? (direction == 1 ? BLACK_RIGHT_HURT : BLACK_LEFT_HURT) - : (direction == 1 ? BLACK_RIGHT : BLACK_LEFT); - - case BROWN_LEFT, BROWN_RIGHT, BROWN_LEFT_HURT, BROWN_RIGHT_HURT -> - isHurt ? (direction == 1 ? BROWN_RIGHT_HURT : BROWN_LEFT_HURT) - : (direction == 1 ? BROWN_RIGHT : BROWN_LEFT); - - case PINK_LEFT, PINK_RIGHT, PINK_LEFT_HURT, PINK_RIGHT_HURT -> - isHurt ? (direction == 1 ? PINK_RIGHT_HURT : PINK_LEFT_HURT) - : (direction == 1 ? PINK_RIGHT : PINK_LEFT); - default -> throw new IllegalStateException("Unexpected value: " + sheep.getSpriteState().get()); - }; + Sheep.SheepState newState = getSheepState(sheep, sheepData, direction); sheep.setSpriteState(newState); @@ -118,6 +92,36 @@ public class SheepLogic implements EntityLogicInterface, EntitySpawnInterface, E sheepData.setMovementCooldown(random.nextInt(3) + 1); // 1-3 iterations cooldown } + private static Sheep.SheepState getSheepState(Block sheep, SheepData sheepData, int direction) { + boolean isHurt = sheep.getSpriteState().get().name().endsWith("_HURT"); + Sheep.SheepState newState = switch (sheepData.getVariant()) { + case WHITE -> + isHurt ? (direction == 1 ? WHITE_RIGHT_HURT : WHITE_LEFT_HURT) + : (direction == 1 ? WHITE_RIGHT : WHITE_LEFT); + + case LIGHT_GRAY -> + isHurt ? (direction == 1 ? LIGHT_GRAY_RIGHT_HURT : LIGHT_GRAY_LEFT_HURT) + : (direction == 1 ? LIGHT_GRAY_RIGHT : LIGHT_GRAY_LEFT); + + case GRAY -> + isHurt ? (direction == 1 ? GRAY_RIGHT_HURT : GRAY_LEFT_HURT) + : (direction == 1 ? GRAY_RIGHT : GRAY_LEFT); + + case BLACK -> + isHurt ? (direction == 1 ? BLACK_RIGHT_HURT : BLACK_LEFT_HURT) + : (direction == 1 ? BLACK_RIGHT : BLACK_LEFT); + + case BROWN -> + isHurt ? (direction == 1 ? BROWN_RIGHT_HURT : BROWN_LEFT_HURT) + : (direction == 1 ? BROWN_RIGHT : BROWN_LEFT); + + case PINK -> + isHurt ? (direction == 1 ? PINK_RIGHT_HURT : PINK_LEFT_HURT) + : (direction == 1 ? PINK_RIGHT : PINK_LEFT); + }; + return newState; + } + @Override public void spawn(int playerX, int playerY, Game game, Terminal terminal) { // Cordinates where player can see @@ -246,7 +250,19 @@ public class SheepLogic implements EntityLogicInterface, EntitySpawnInterface, E @Override public void killed(Game game, Block mob) { int amount = random.nextInt(3) + 1; - InventoryItem inventoryItem = new InventoryItem(amount, ItemBlockSupplier.getItem("mutton")); - game.getInventory().addItem(inventoryItem); + var sheepData = (SheepData) mob.getData(); + + InventoryItem mutton = new InventoryItem(amount, ItemBlockSupplier.getItem("mutton")); + InventoryItem wool = new InventoryItem(1, ItemBlockSupplier.getItem(switch (sheepData.getVariant()) { + case WHITE -> "white_wool"; + case LIGHT_GRAY -> "light_gray_wool"; + case GRAY -> "gray_wool"; + case BLACK -> "black_wool"; + case BROWN -> "brown_wool"; + case PINK -> "pink_wool"; + })); + + game.getInventory().addItem(mutton); + game.getInventory().addItem(wool); } } diff --git a/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepVariant.java b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepVariant.java new file mode 100644 index 0000000..eefeed0 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/mobs/services/sheep/SheepVariant.java @@ -0,0 +1,10 @@ +package cz.jzitnik.game.mobs.services.sheep; + +public enum SheepVariant { + WHITE, + LIGHT_GRAY, + GRAY, + BLACK, + BROWN, + PINK +} diff --git a/src/main/java/cz/jzitnik/game/sprites/Wool.java b/src/main/java/cz/jzitnik/game/sprites/Wool.java new file mode 100644 index 0000000..45bb8bf --- /dev/null +++ b/src/main/java/cz/jzitnik/game/sprites/Wool.java @@ -0,0 +1,34 @@ +package cz.jzitnik.game.sprites; + +import cz.jzitnik.tui.ResourceLoader; +import cz.jzitnik.tui.Sprite; + +public class Wool extends Sprite { + public enum WoolState { + WHITE, + LIGHT_GRAY, + GRAY, + BLACK, + BROWN, + PINK, + } + + public String getSprite() { + return getSprite(WoolState.WHITE); + } + + public String getSprite(Enum e) { + return ResourceLoader.loadResource( + switch (e) { + case WoolState.WHITE -> "white_wool.ans"; + case WoolState.LIGHT_GRAY -> "light_gray_wool.ans"; + case WoolState.GRAY -> "gray_wool.ans"; + case WoolState.BLACK -> "black_wool.ans"; + case WoolState.BROWN -> "brown_wool.ans"; + case WoolState.PINK -> "pink_wool.ans"; + + default -> throw new IllegalStateException("Unexpected value: " + e); + } + ); + } +} diff --git a/src/main/java/cz/jzitnik/game/sprites/WoolItem.java b/src/main/java/cz/jzitnik/game/sprites/WoolItem.java new file mode 100644 index 0000000..9e44895 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/sprites/WoolItem.java @@ -0,0 +1,34 @@ +package cz.jzitnik.game.sprites; + +import cz.jzitnik.tui.ResourceLoader; +import cz.jzitnik.tui.Sprite; + +public class WoolItem extends Sprite { + public enum WoolItemState { + WHITE, + LIGHT_GRAY, + GRAY, + BLACK, + BROWN, + PINK, + } + + public String getSprite() { + return getSprite(WoolItemState.WHITE); + } + + public String getSprite(Enum e) { + return ResourceLoader.loadResource( + switch (e) { + case WoolItemState.WHITE -> "items/white_wool.ans"; + case WoolItemState.LIGHT_GRAY -> "items/light_gray_wool.ans"; + case WoolItemState.GRAY -> "items/gray_wool.ans"; + case WoolItemState.BLACK -> "items/black_wool.ans"; + case WoolItemState.BROWN -> "items/brown_wool.ans"; + case WoolItemState.PINK -> "items/pink_wool.ans"; + + default -> throw new IllegalStateException("Unexpected value: " + e); + } + ); + } +} diff --git a/src/main/java/cz/jzitnik/game/ui/CraftingTable.java b/src/main/java/cz/jzitnik/game/ui/CraftingTable.java index ce9e6d6..9ab4577 100644 --- a/src/main/java/cz/jzitnik/game/ui/CraftingTable.java +++ b/src/main/java/cz/jzitnik/game/ui/CraftingTable.java @@ -65,7 +65,9 @@ public class CraftingTable { Optional craftedItem = recipe.map(craftingRecipe -> craftingRecipe.getItemSupplier().get()); String[] craftedSprite = craftedItem.map(inventoryItem -> SpriteCombiner.combineTwoSprites( - spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(), + inventoryItem.getItem().getFirst().getSpriteState().isPresent() ? + spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(inventoryItem.getItem().getFirst().getSpriteState().get()) : + spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite() , Numbers.getNumberSprite(inventoryItem.getAmount()) ).split("\n")).orElse(null); diff --git a/src/main/java/cz/jzitnik/game/ui/Inventory.java b/src/main/java/cz/jzitnik/game/ui/Inventory.java index d33cc45..89ae233 100644 --- a/src/main/java/cz/jzitnik/game/ui/Inventory.java +++ b/src/main/java/cz/jzitnik/game/ui/Inventory.java @@ -223,14 +223,18 @@ public class Inventory { if (i == selectedItem) { sprites.add(SpriteCombiner.combineTwoSprites(getHotbarBackground(), SpriteCombiner.combineTwoSprites( - spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(), + item.getItem().getFirst().getSpriteState().isPresent() ? + spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(item.getItem().getFirst().getSpriteState().get()) : + spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(), Numbers.getNumberSprite(item.getAmount()) ))); continue; } sprites.add(SpriteCombiner.combineTwoSprites( - spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(), + item.getItem().getFirst().getSpriteState().isPresent() ? + spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(item.getItem().getFirst().getSpriteState().get()) : + spriteList.getSprite(item.getItem().getFirst().getSprite()).getSprite(), Numbers.getNumberSprite(item.getAmount()) )); } diff --git a/src/main/java/cz/jzitnik/game/ui/SmallCraftingTable.java b/src/main/java/cz/jzitnik/game/ui/SmallCraftingTable.java index da321c6..62597dc 100644 --- a/src/main/java/cz/jzitnik/game/ui/SmallCraftingTable.java +++ b/src/main/java/cz/jzitnik/game/ui/SmallCraftingTable.java @@ -52,7 +52,9 @@ public class SmallCraftingTable { Optional craftedItem = recipe.map(craftingRecipe -> craftingRecipe.getItemSupplier().get()); String[] craftedSprite = craftedItem.map(inventoryItem -> SpriteCombiner.combineTwoSprites( - spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(), + inventoryItem.getItem().getFirst().getSpriteState().isPresent() ? + spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite(inventoryItem.getItem().getFirst().getSpriteState().get()) : + spriteList.getSprite(inventoryItem.getItem().getFirst().getSprite()).getSprite() , Numbers.getNumberSprite(inventoryItem.getAmount()) ).split("\n")).orElse(null); diff --git a/src/main/resources/textures/black_wool.ans b/src/main/resources/textures/black_wool.ans new file mode 100644 index 0000000..6220de0 --- /dev/null +++ b/src/main/resources/textures/black_wool.ans @@ -0,0 +1,25 @@ +          +          +      +  +  +    +         +         +         +  +  +    +           +           +       +       +    +       +       +       +    +    +     +       +       diff --git a/src/main/resources/textures/brown_wool.ans b/src/main/resources/textures/brown_wool.ans new file mode 100644 index 0000000..68d6229 --- /dev/null +++ b/src/main/resources/textures/brown_wool.ans @@ -0,0 +1,25 @@ +                +                +               +                +                +                +                +                +                 +              +              +              +                 +                 +               +               +                +               +               +                +                 +                 +                 +                 +                 diff --git a/src/main/resources/textures/gray_wool.ans b/src/main/resources/textures/gray_wool.ans new file mode 100644 index 0000000..03e15eb --- /dev/null +++ b/src/main/resources/textures/gray_wool.ans @@ -0,0 +1,25 @@ +                +                +                +                +                +                +                +                +                 +              +              +               +                 +                 +              +              +                +               +               +               +                 +                 +                 +                 +                 diff --git a/src/main/resources/textures/items/black_wool.ans b/src/main/resources/textures/items/black_wool.ans new file mode 100644 index 0000000..d359796 --- /dev/null +++ b/src/main/resources/textures/items/black_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                      +                                  +                              +                           +                            +                          +                            +                          +                          +                        +                            +                           +                            +                           +                          +                           +                             +                                 +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/items/brown_wool.ans b/src/main/resources/textures/items/brown_wool.ans new file mode 100644 index 0000000..d124e3c --- /dev/null +++ b/src/main/resources/textures/items/brown_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                     +                                  +                              +                           +                            +                        +                            +                            +                         +                        +                            +                           +                            +                          +                           +                            +                             +                                 +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/items/gray_wool.ans b/src/main/resources/textures/items/gray_wool.ans new file mode 100644 index 0000000..c684417 --- /dev/null +++ b/src/main/resources/textures/items/gray_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                      +                                 +                              +                            +                           +                         +                            +                            +                         +                        +                            +                         +                            +                           +                          +                           +                             +                                 +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/items/light_gray_wool.ans b/src/main/resources/textures/items/light_gray_wool.ans new file mode 100644 index 0000000..6aae0a2 --- /dev/null +++ b/src/main/resources/textures/items/light_gray_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                      +                                  +                              +                           +                           +                         +                            +                            +                          +                         +                           +                           +                            +                           +                           +                          +                             +                                 +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/items/pink_wool.ans b/src/main/resources/textures/items/pink_wool.ans new file mode 100644 index 0000000..561605e --- /dev/null +++ b/src/main/resources/textures/items/pink_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                      +                                  +                              +                            +                           +                          +                            +                            +                          +                         +                            +                           +                            +                           +                           +                            +                             +                                 +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/items/white_wool.ans b/src/main/resources/textures/items/white_wool.ans new file mode 100644 index 0000000..cc77bb6 --- /dev/null +++ b/src/main/resources/textures/items/white_wool.ans @@ -0,0 +1,25 @@ +                                                  +                                              +                                          +                                      +                                  +                              +                            +                            +                         +                            +                            +                          +                         +                            +                           +                            +                           +                           +                            +                             +                                +                                      +                                          +                                              +                                                  diff --git a/src/main/resources/textures/light_gray_wool.ans b/src/main/resources/textures/light_gray_wool.ans new file mode 100644 index 0000000..7bf0331 --- /dev/null +++ b/src/main/resources/textures/light_gray_wool.ans @@ -0,0 +1,25 @@ +                +                +                +                +                +                +                +                +                 +              +              +              +                 +                 +               +               +                +                +                +                +                 +                 +                 +                 +                 diff --git a/src/main/resources/textures/pink_wool.ans b/src/main/resources/textures/pink_wool.ans new file mode 100644 index 0000000..48df039 --- /dev/null +++ b/src/main/resources/textures/pink_wool.ans @@ -0,0 +1,25 @@ +                +                +                +                +                +                +                +                +                 +              +              +               +                 +                 +               +               +                +                +                +                +                 +                 +                 +                 +                 diff --git a/src/main/resources/textures/white_wool.ans b/src/main/resources/textures/white_wool.ans new file mode 100644 index 0000000..9c18f68 --- /dev/null +++ b/src/main/resources/textures/white_wool.ans @@ -0,0 +1,25 @@ +                +                +                +                +                +                +                +                +                 +              +              +               +                 +                 +               +               +                +               +               +                +                 +                 +                +                 +