diff --git a/src/main/java/cz/jzitnik/game/Game.java b/src/main/java/cz/jzitnik/game/Game.java index 93f18b3..1d5e477 100644 --- a/src/main/java/cz/jzitnik/game/Game.java +++ b/src/main/java/cz/jzitnik/game/Game.java @@ -330,7 +330,10 @@ public class Game extends AutoTransientSupport { screenRenderer.render(this); } else { - player.fell(); + ArrayList combinedList = new ArrayList<>(); + combinedList.addAll(world[cords2[1]][cords2[0]]); + combinedList.addAll(world[cords2[1] + 1][cords2[0]]); + player.fell(combinedList); screenRenderer.render(this); break; } diff --git a/src/main/java/cz/jzitnik/game/annotations/ReduceFallDamage.java b/src/main/java/cz/jzitnik/game/annotations/ReduceFallDamage.java new file mode 100644 index 0000000..42f2a43 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/annotations/ReduceFallDamage.java @@ -0,0 +1,16 @@ +package cz.jzitnik.game.annotations; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import cz.jzitnik.game.core.reducefalldamage.Reducer; + +import java.lang.annotation.ElementType; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@RequireAnnotation(BlockRegistry.class) +public @interface ReduceFallDamage { + Class value(); +} diff --git a/src/main/java/cz/jzitnik/game/core/reducefalldamage/BedFallDamageReducer.java b/src/main/java/cz/jzitnik/game/core/reducefalldamage/BedFallDamageReducer.java new file mode 100644 index 0000000..b9cd4f5 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/reducefalldamage/BedFallDamageReducer.java @@ -0,0 +1,8 @@ +package cz.jzitnik.game.core.reducefalldamage; + +public class BedFallDamageReducer implements Reducer { + @Override + public int reduce(int initial) { + return (int) (initial * 0.5); + } +} diff --git a/src/main/java/cz/jzitnik/game/core/reducefalldamage/HaybaleFallDamageReducer.java b/src/main/java/cz/jzitnik/game/core/reducefalldamage/HaybaleFallDamageReducer.java new file mode 100644 index 0000000..b4667a9 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/reducefalldamage/HaybaleFallDamageReducer.java @@ -0,0 +1,8 @@ +package cz.jzitnik.game.core.reducefalldamage; + +public class HaybaleFallDamageReducer implements Reducer { + @Override + public int reduce(int initial) { + return (int) (initial * 0.2); + } +} diff --git a/src/main/java/cz/jzitnik/game/core/reducefalldamage/Reducer.java b/src/main/java/cz/jzitnik/game/core/reducefalldamage/Reducer.java new file mode 100644 index 0000000..3604b6b --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/reducefalldamage/Reducer.java @@ -0,0 +1,5 @@ +package cz.jzitnik.game.core.reducefalldamage; + +public interface Reducer { + int reduce(int initial); +} diff --git a/src/main/java/cz/jzitnik/game/core/reducefalldamage/WaterFallDamageReducer.java b/src/main/java/cz/jzitnik/game/core/reducefalldamage/WaterFallDamageReducer.java new file mode 100644 index 0000000..b110964 --- /dev/null +++ b/src/main/java/cz/jzitnik/game/core/reducefalldamage/WaterFallDamageReducer.java @@ -0,0 +1,8 @@ +package cz.jzitnik.game.core.reducefalldamage; + +public class WaterFallDamageReducer implements Reducer { + @Override + public int reduce(int ignored) { + return 0; + } +} diff --git a/src/main/java/cz/jzitnik/game/entities/Player.java b/src/main/java/cz/jzitnik/game/entities/Player.java index e3bde1a..e53c5b5 100644 --- a/src/main/java/cz/jzitnik/game/entities/Player.java +++ b/src/main/java/cz/jzitnik/game/entities/Player.java @@ -4,6 +4,11 @@ import lombok.Getter; import lombok.Setter; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +import cz.jzitnik.game.annotations.ReduceFallDamage; +import cz.jzitnik.game.core.reducefalldamage.Reducer; @Getter @Setter @@ -33,8 +38,20 @@ public class Player implements Serializable { fallDistance++; } - public void fell() { + public void fell(List fallblock) { + var block = fallblock.stream().filter(b -> b.getClass().isAnnotationPresent(ReduceFallDamage.class)).findFirst(); int damage = Math.max(fallDistance - 3, 0); + if (block.isPresent()) { + var reducerClass = block.get().getClass().getAnnotation(ReduceFallDamage.class).value(); + try { + Reducer reducer = reducerClass.getDeclaredConstructor().newInstance(); + damage = reducer.reduce(damage); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + System.exit(0); + } + } dealDamage(damage); fallDistance = 0; } diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/HaybaleBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/HaybaleBlock.java index 4137dc6..ee5a058 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/HaybaleBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/HaybaleBlock.java @@ -2,12 +2,15 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.ReduceFallDamage; +import cz.jzitnik.game.core.reducefalldamage.HaybaleFallDamageReducer; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.entities.items.ItemType; import java.util.ArrayList; @BlockRegistry("haybale") +@ReduceFallDamage(HaybaleFallDamageReducer.class) public class HaybaleBlock extends Block { public HaybaleBlock() { super("haybale", SpriteLoader.SPRITES.HAYBALE, 3, ItemType.HOE, new ArrayList<>()); diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/WaterBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/WaterBlock.java index 4d55b88..f973a94 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/WaterBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/blocks/WaterBlock.java @@ -2,10 +2,13 @@ package cz.jzitnik.game.entities.items.registry.blocks.blocks; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.ReduceFallDamage; +import cz.jzitnik.game.core.reducefalldamage.WaterFallDamageReducer; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.logic.services.flowing.FlowingData; import cz.jzitnik.game.sprites.Water; +@ReduceFallDamage(WaterFallDamageReducer.class) @BlockRegistry(value = "water", drops = "water_bucket") public class WaterBlock extends Block { public WaterBlock() { diff --git a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/work/BedBlock.java b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/work/BedBlock.java index 8629a82..64e21a7 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/work/BedBlock.java +++ b/src/main/java/cz/jzitnik/game/entities/items/registry/blocks/work/BedBlock.java @@ -2,9 +2,12 @@ package cz.jzitnik.game.entities.items.registry.blocks.work; import cz.jzitnik.game.SpriteLoader; import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.ReduceFallDamage; +import cz.jzitnik.game.core.reducefalldamage.BedFallDamageReducer; import cz.jzitnik.game.entities.Block; import cz.jzitnik.game.sprites.Bed; +@ReduceFallDamage(BedFallDamageReducer.class) @BlockRegistry("bed") public class BedBlock extends Block { public BedBlock() {