diff --git a/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java b/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java new file mode 100644 index 0000000..2165abd --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/CustomMobFallingAfterMineLogic.java @@ -0,0 +1,15 @@ +package cz.jzitnik.game.annotations; + +import cz.jzitnik.game.core.CustomMobFallingAfterMineLogicHandler; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@RequireAnnotation(BlockRegistry.class) +public @interface CustomMobFallingAfterMineLogic { + Class value(); +} diff --git a/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java b/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java new file mode 100644 index 0000000..ebb4c60 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/CustomMobFallingAfterMineLogicHandler.java @@ -0,0 +1,7 @@ +package cz.jzitnik.game.core; + +import cz.jzitnik.game.Game; + +public interface CustomMobFallingAfterMineLogicHandler { + void handle(Game game, int x, int y); +} diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java index 60b00c0..c292e66 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/mobs/Zombie.java @@ -1,10 +1,13 @@ package cz.jzitnik.game.entities.items.registry.mobs; import cz.jzitnik.game.SpriteLoader; +import cz.jzitnik.game.annotations.CustomMobFallingAfterMineLogic; import cz.jzitnik.game.annotations.EntityRegistry; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.mobs.services.zombie.ZombieData; +import cz.jzitnik.game.mobs.services.zombie.ZombieFallingAfterMineLogic; +@CustomMobFallingAfterMineLogic(ZombieFallingAfterMineLogic.class) @EntityRegistry("zombie") public class Zombie extends Block { public Zombie() { diff --git a/src/main/java/cz/jzitnik/game/generation/Generation.java b/src/main/java/cz/jzitnik/game/generation/Generation.java index b3d7ad2..9d26c6c 100644 --- a/src/main/java/cz/jzitnik/game/generation/Generation.java +++ b/src/main/java/cz/jzitnik/game/generation/Generation.java @@ -30,6 +30,8 @@ public class Generation { game.getPlayer().setPlayerBlock1(steveBlock); game.getPlayer().setPlayerBlock2(steveBlock2); + game.getInventory().addItem(ItemBlockSupplier.getItem("sand")); + PopulateWorld.populateWorld(world, terrainHeight); Trees.plantTrees(world, terrainHeight); diff --git a/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java b/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java index 4e846af..c88f912 100644 --- a/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java +++ b/src/main/java/cz/jzitnik/game/handlers/events/handlers/mobs/MobMineHandler.java @@ -1,7 +1,9 @@ package cz.jzitnik.game.handlers.events.handlers.mobs; import cz.jzitnik.game.Game; +import cz.jzitnik.game.annotations.CustomMobFallingAfterMineLogic; import cz.jzitnik.game.annotations.MineEventHandler; +import cz.jzitnik.game.entities.Block; import cz.jzitnik.tui.ScreenRenderer; public class MobMineHandler { @@ -9,8 +11,24 @@ public class MobMineHandler { public void handle(ScreenRenderer screenRenderer, Game game, int x, int y) { var world = game.getWorld(); - var mobs = world[y-1][x].stream().filter(block -> block.isMob() && !block.getBlockId().equals("steve")).toList(); - world[y-1][x].removeAll(mobs); - world[y][x].addAll(mobs); + var mobs = world[y - 1][x].stream().filter(block -> block.isMob() && !block.getBlockId().equals("steve")).toList(); + + for (Block mob : mobs) { + if (mob.getClass().isAnnotationPresent(CustomMobFallingAfterMineLogic.class)) { + var annotation = mob.getClass().getAnnotation(CustomMobFallingAfterMineLogic.class); + var handlerClass = annotation.value(); + try { + var instance = handlerClass.getDeclaredConstructor().newInstance(); + + instance.handle(game, x, y); + continue; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + world[y - 1][x].remove(mob); + world[y][x].add(mob); + } } } diff --git a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java new file mode 100644 index 0000000..9fb0174 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieFallingAfterMineLogic.java @@ -0,0 +1,31 @@ +package cz.jzitnik.game.mobs.services.zombie; + +import cz.jzitnik.game.Game; +import cz.jzitnik.game.core.CustomMobFallingAfterMineLogicHandler; +import cz.jzitnik.game.entities.items.registry.mobs.Zombie; +import lombok.extern.slf4j.Slf4j; + +// I know this code is shit, but I don't want to deal with it +@Slf4j +public class ZombieFallingAfterMineLogic implements CustomMobFallingAfterMineLogicHandler { + @Override + public void handle(Game game, int x, int y) { + log.debug("Zombie is falling"); + + var world = game.getWorld(); + + var mobsTop = world[y - 2][x].stream().filter(block -> + block.getClass().equals(Zombie.class) && block.getSpriteState().isPresent() && + (block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.TOP) || + block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.TOP_HURT))).toList(); + var mobsBottom = world[y - 1][x].stream().filter(block -> + block.getClass().equals(Zombie.class) && block.getSpriteState().isPresent() && + (block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.BOTTOM_HURT) || + block.getSpriteState().get().equals(cz.jzitnik.game.sprites.Zombie.ZombieState.BOTTOM))).toList(); + world[y - 2][x].removeAll(mobsTop); + world[y -1][x].addAll(mobsTop); + + world[y - 1][x].removeAll(mobsBottom); + world[y][x].addAll(mobsBottom); + } +} diff --git a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java index df223d0..8b13715 100644 --- a/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java +++ b/src/main/java/cz/jzitnik/game/mobs/services/zombie/ZombieLogic.java @@ -12,12 +12,14 @@ import cz.jzitnik.game.mobs.*; import cz.jzitnik.game.sprites.Zombie; import cz.jzitnik.game.sprites.Zombie.ZombieState; import cz.jzitnik.tui.ScreenMovingCalculationProvider; +import lombok.extern.slf4j.Slf4j; import org.jline.terminal.Terminal; import java.util.*; import static cz.jzitnik.game.sprites.Zombie.ZombieState.*; +@Slf4j @EntitySpawn @EntityLogic("zombie") @EntityHurtAnimationHandler("zombie") @@ -29,6 +31,7 @@ public class ZombieLogic @Override public void nextIteration(EntityLogicProvider.EntityLogicMobDTO entityLogicMobDTO) { + log.debug("Running zombie logic"); } @Override