diff --git a/data.mv.db b/data.mv.db index 28f369d..79f52eb 100644 Binary files a/data.mv.db and b/data.mv.db differ diff --git a/maps/b602601a-e9b0-44bf-bc0d-5f31c9964ba1.dat b/maps/b602601a-e9b0-44bf-bc0d-5f31c9964ba1.dat index d901318..0cf89b7 100644 Binary files a/maps/b602601a-e9b0-44bf-bc0d-5f31c9964ba1.dat and b/maps/b602601a-e9b0-44bf-bc0d-5f31c9964ba1.dat differ diff --git a/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat b/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat index 124ef1b..15e3756 100644 Binary files a/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat and b/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat differ diff --git a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java index 430a60a..7dd044c 100644 --- a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java +++ b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java @@ -10,7 +10,7 @@ import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon; import lombok.NonNull; public class WeaponBasedAI implements AI { - private static final int RANGE = 10; + private static final int RANGE = 20; private static final int MIN_RANGE = 3; private static final int MAX_RANGE = 12; private final Enemy enemy; diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java b/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java index da50e8c..6d741da 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java @@ -50,10 +50,10 @@ public abstract class Creature extends NamedCharacter { if (attackCooldown >= weapon.getCooldown()) { if (weapon.attack(this)) { - if(weapon instanceof RangedWeapon) { + if (weapon instanceof RangedWeapon) { ammunition.decrease(); - if(ammunition.getCount() == 0) { + if (ammunition.getCount() == 0) { ammunition = null; } } @@ -84,6 +84,10 @@ public abstract class Creature extends NamedCharacter { } } + public void heal(int hp) { + this.hp = Math.min(this.hp + hp, this.maxHp); + } + @Override public void update(float dt) { super.update(dt); @@ -105,4 +109,6 @@ public abstract class Creature extends NamedCharacter { } public abstract String getName(); + + public abstract void removeItemFromEquipment(Item item); } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java b/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java index cfd8354..57fbfb6 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Enemy.java @@ -51,9 +51,9 @@ public class Enemy extends Creature implements NPC { super(ContextHolder.INSTANCE.getContext().createCharacter(A.charsets.get(template.getCharset()).uid)); this.template = template; name = template.getName(); - maxHp = DiceRoller.of(template.getHp()).roll(); + maxHp = DiceRoller.roll(template.getHp()); hp = maxHp; - var speed = DiceRoller.of(template.getSpeed()).roll() / 10f; + var speed = DiceRoller.roll(template.getSpeed()) / 10f; setSpeed(speed); setAnimationSpeed(speed / 2.0f); setBlocking(template.isBlocking()); @@ -68,7 +68,7 @@ public class Enemy extends Creature implements NPC { var split = rangedWeaponTemplate.split(","); this.rangedWeapon = new RangedWeapon(split[0]); - setAmmunition(new Ammunition(split[1], DiceRoller.of(split[2]).roll())); + setAmmunition(new Ammunition(split[1], DiceRoller.roll(split[2]))); } this.dieAnimation = new SimpleAnimationRunner(A.animations.get(template.getDieAnimation()).uid); @@ -79,6 +79,11 @@ public class Enemy extends Creature implements NPC { return ai; } + @Override + public void removeItemFromEquipment(Item item) { + // noop + } + @Override public void die() { super.die(); @@ -114,7 +119,7 @@ public class Enemy extends Creature implements NPC { loot[index] = switch (split[0]) { case "melee_weapon" -> new MeleeWeapon(split[1]); case "ranged_weapon" -> new RangedWeapon(split[1]); - case "ammo" -> new Ammunition(split[1], DiceRoller.of(d.getAmount()).roll()); + case "ammo" -> new Ammunition(split[1], DiceRoller.roll(d.getAmount())); case "junk" -> new Junk(split[1]); default -> throw new IllegalArgumentException("Unsupported item type"); }; diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Player.java b/src/main/java/com/bartlomiejpluta/demo/entity/Player.java index a561c56..b6a7987 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Player.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Player.java @@ -13,8 +13,8 @@ public class Player extends Creature { public Player(@NonNull Character entity) { super(entity); - this.hp = 500; - this.maxHp = 500; + this.hp = 20; + this.maxHp = 20; } public void interact() { @@ -68,6 +68,7 @@ public class Player extends Creature { return equipment[index]; } + @Override public void removeItemFromEquipment(@NonNull Item item) { for (int i = 0; i < equipment.length; ++i) { if (equipment[i] == item) { diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java index 03fddf2..3442d9b 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java @@ -9,6 +9,7 @@ import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.runner.DemoRunner; import com.bartlomiejpluta.demo.world.item.Item; import com.bartlomiejpluta.demo.world.item.Useable; +import com.bartlomiejpluta.demo.world.potion.Medicament; import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon; import com.bartlomiejpluta.demo.world.weapon.RangedWeapon; @@ -121,6 +122,11 @@ public class EquipmentWindow extends DecoratedWindow { if (item instanceof RangedWeapon weapon) { detailsLbl.setText(format("Damage: %s\nRange: %s\nCooldown: %s\n", weapon.getDmgRoller(), weapon.getRangeRoller(), weapon.getCooldown())); + return; + } + + if (item instanceof Medicament medicament) { + detailsLbl.setText(format("Restores: %s HP\n", medicament.getRoller())); } } diff --git a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java index 9565eb9..9d158a5 100644 --- a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java +++ b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java @@ -20,6 +20,7 @@ import com.bartlomiejpluta.demo.entity.Enemy; import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.event.EnemyDiedEvent; import com.bartlomiejpluta.demo.runner.DemoRunner; +import com.bartlomiejpluta.demo.world.potion.Medicament; import lombok.NonNull; public abstract class BaseMapHandler implements MapHandler { @@ -122,6 +123,17 @@ public abstract class BaseMapHandler implements MapHandler { return spawner; } + public Medicament medicament(@NonNull String id, int count) { + return new Medicament(id, count); + } + + public Medicament medicament(ObjectLayer layer, int x, int y, @NonNull String id, int count) { + var medicament = new Medicament(id, count); + medicament.setCoordinates(x, y); + layer.addEntity(medicament); + return medicament; + } + public Icon icon(ObjectLayer layer, int x, int y, String iconSetUid, int row, int column) { var icon = context.createIcon(iconSetUid, row, column); icon.setScale(1f); diff --git a/src/main/java/com/bartlomiejpluta/demo/util/IconUtil.java b/src/main/java/com/bartlomiejpluta/demo/util/IconUtil.java new file mode 100644 index 0000000..c8db851 --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/util/IconUtil.java @@ -0,0 +1,11 @@ +package com.bartlomiejpluta.demo.util; + +import com.bartlomiejpluta.base.api.context.ContextHolder; +import com.bartlomiejpluta.base.api.icon.Icon; + +public class IconUtil { + public static Icon parseIcon(String iconDefinition) { + var parts = iconDefinition.split(","); + return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(parts[0]).uid, Integer.parseInt(parts[1]), Integer.parseInt(parts[2])); + } +} diff --git a/src/main/java/com/bartlomiejpluta/demo/world/item/BaseItem.java b/src/main/java/com/bartlomiejpluta/demo/world/item/BaseItem.java new file mode 100644 index 0000000..99b18d5 --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/world/item/BaseItem.java @@ -0,0 +1,12 @@ +package com.bartlomiejpluta.demo.world.item; + +import com.bartlomiejpluta.base.lib.icon.IconDelegate; +import com.bartlomiejpluta.demo.util.IconUtil; +import lombok.NonNull; + +public abstract class BaseItem extends IconDelegate implements Item { + protected BaseItem(@NonNull String icon) { + super(IconUtil.parseIcon(icon)); + setZIndex(-1); + } +} diff --git a/src/main/java/com/bartlomiejpluta/demo/world/item/StackableItem.java b/src/main/java/com/bartlomiejpluta/demo/world/item/StackableItem.java new file mode 100644 index 0000000..61a4e01 --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/world/item/StackableItem.java @@ -0,0 +1,38 @@ +package com.bartlomiejpluta.demo.world.item; + +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; + +public abstract class StackableItem extends BaseItem implements ItemStack { + @Getter + @Setter + protected int count; + + protected StackableItem(@NonNull String id, int count) { + super(id); + this.count = Math.max(0, count); + } + + @Override + public void decrease() { + if (count > 0) { + --count; + } + } + + @Override + public void increase() { + ++count; + } + + @Override + public void increase(int count) { + this.count += count; + } + + @Override + public void decrease(int count) { + this.count = Math.max(0, count); + } +} diff --git a/src/main/java/com/bartlomiejpluta/demo/world/junk/Junk.java b/src/main/java/com/bartlomiejpluta/demo/world/junk/Junk.java index 49d8e4a..ce76919 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/junk/Junk.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/junk/Junk.java @@ -1,13 +1,10 @@ package com.bartlomiejpluta.demo.world.junk; -import com.bartlomiejpluta.base.api.context.ContextHolder; -import com.bartlomiejpluta.base.api.icon.Icon; -import com.bartlomiejpluta.base.lib.icon.IconDelegate; -import com.bartlomiejpluta.demo.world.item.Item; +import com.bartlomiejpluta.demo.world.item.BaseItem; import lombok.Getter; import lombok.NonNull; -public class Junk extends IconDelegate implements Item { +public class Junk extends BaseItem { @Getter private final String name; @@ -17,12 +14,7 @@ public class Junk extends IconDelegate implements Item { } public Junk(@NonNull DB.model.JunkModel template) { - super(createIcon(template)); + super(template.getIcon()); this.name = template.getName(); } - - private static Icon createIcon(DB.model.JunkModel template) { - var icons = template.getIcon().split(","); - return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2])); - } } diff --git a/src/main/java/com/bartlomiejpluta/demo/world/potion/Medicament.java b/src/main/java/com/bartlomiejpluta/demo/world/potion/Medicament.java new file mode 100644 index 0000000..3485ccc --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/world/potion/Medicament.java @@ -0,0 +1,37 @@ +package com.bartlomiejpluta.demo.world.potion; + +import DB.dao; +import com.bartlomiejpluta.base.util.random.DiceRoller; +import com.bartlomiejpluta.demo.entity.Creature; +import com.bartlomiejpluta.demo.world.item.StackableItem; +import com.bartlomiejpluta.demo.world.item.Useable; +import lombok.Getter; +import lombok.NonNull; + +public class Medicament extends StackableItem implements Useable { + + @Getter + private final String name; + + @Getter + private final DiceRoller roller; + + public Medicament(@NonNull String id, int count) { + this(dao.medicaments.find(id), count); + } + + public Medicament(@NonNull DB.model.MedicamentsModel template, int count) { + super(template.getIcon(), count); + this.name = template.getName(); + this.roller = DiceRoller.of(template.getHp()); + } + + @Override + public void use(Creature creature) { + if(--count == 0) { + creature.removeItemFromEquipment(this); + } + + creature.heal(roller.roll()); + } +} diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java index 25af6dc..3cc7e09 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java @@ -1,26 +1,18 @@ package com.bartlomiejpluta.demo.world.weapon; -import com.bartlomiejpluta.base.api.context.ContextHolder; -import com.bartlomiejpluta.base.api.icon.Icon; -import com.bartlomiejpluta.base.lib.icon.IconDelegate; import com.bartlomiejpluta.demo.entity.Creature; -import com.bartlomiejpluta.demo.world.item.ItemStack; +import com.bartlomiejpluta.demo.world.item.StackableItem; import com.bartlomiejpluta.demo.world.item.Useable; import lombok.Getter; import lombok.NonNull; -import lombok.Setter; import lombok.ToString; @ToString -public class Ammunition extends IconDelegate implements ItemStack, Useable { +public class Ammunition extends StackableItem implements Useable { @Getter private final String id; - @Getter - @Setter - private int count; - @Getter private final String name; @@ -32,39 +24,13 @@ public class Ammunition extends IconDelegate implements ItemStack, Useable { } public Ammunition(@NonNull DB.model.AmmunitionModel template, int count) { - super(createIcon(template)); + super(template.getIcon(), count); + this.id = template.getId(); this.name = template.getName(); - this.count = count; this.appliesTo = template.getAppliesTo(); } - private static Icon createIcon(DB.model.AmmunitionModel template) { - var icons = template.getIcon().split(","); - return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2])); - } - - @Override - public void decrease() { - if (count > 0) { - --count; - } - } - - @Override - public void increase() { - ++count; - } - - @Override - public void increase(int count) { - this.count += count; - } - - @Override - public void decrease(int count) { - this.count = Math.max(0, count); - } @Override public void use(Creature creature) { diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java index 228e9ac..30ab1bf 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java @@ -2,18 +2,17 @@ package com.bartlomiejpluta.demo.world.weapon; import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.context.ContextHolder; -import com.bartlomiejpluta.base.api.icon.Icon; import com.bartlomiejpluta.base.lib.animation.AnimationRunner; import com.bartlomiejpluta.base.lib.animation.RandomAnimationsRunner; -import com.bartlomiejpluta.base.lib.icon.IconDelegate; import com.bartlomiejpluta.base.util.random.DiceRoller; import com.bartlomiejpluta.demo.entity.Creature; import com.bartlomiejpluta.demo.event.HitEvent; +import com.bartlomiejpluta.demo.world.item.BaseItem; import lombok.Getter; import lombok.NonNull; import org.joml.Vector2i; -public class MeleeWeapon extends IconDelegate implements Weapon { +public class MeleeWeapon extends BaseItem implements Weapon { private final Context context; private final AnimationRunner animation; private final String sound; @@ -32,7 +31,7 @@ public class MeleeWeapon extends IconDelegate implements Weapon { } public MeleeWeapon(@NonNull DB.model.MeleeWeaponModel template) { - super(createIcon(template)); + super(template.getIcon()); this.context = ContextHolder.INSTANCE.getContext(); this.name = template.getName(); @@ -68,9 +67,4 @@ public class MeleeWeapon extends IconDelegate implements Weapon { public String usageName() { return "Equip"; } - - private static Icon createIcon(DB.model.MeleeWeaponModel template) { - var icons = template.getIcon().split(","); - return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2])); - } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java index 41bd460..eb56110 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java @@ -4,19 +4,18 @@ import com.bartlomiejpluta.base.api.animation.Animation; import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.context.ContextHolder; import com.bartlomiejpluta.base.api.entity.Entity; -import com.bartlomiejpluta.base.api.icon.Icon; import com.bartlomiejpluta.base.api.move.Movable; import com.bartlomiejpluta.base.lib.animation.AnimationRunner; import com.bartlomiejpluta.base.lib.animation.BulletAnimationRunner; import com.bartlomiejpluta.base.lib.animation.SimpleAnimationRunner; -import com.bartlomiejpluta.base.lib.icon.IconDelegate; import com.bartlomiejpluta.base.util.random.DiceRoller; import com.bartlomiejpluta.demo.entity.Creature; import com.bartlomiejpluta.demo.event.HitEvent; +import com.bartlomiejpluta.demo.world.item.BaseItem; import lombok.Getter; import lombok.NonNull; -public class RangedWeapon extends IconDelegate implements Weapon { +public class RangedWeapon extends BaseItem implements Weapon { private final Context context; private final BulletAnimationRunner animation; private final String sound; @@ -45,7 +44,7 @@ public class RangedWeapon extends IconDelegate implements Weapon { } public RangedWeapon(@NonNull DB.model.RangedWeaponModel template) { - super(createIcon(template)); + super(template.getIcon()); this.context = ContextHolder.INSTANCE.getContext(); this.name = template.getName(); @@ -81,7 +80,7 @@ public class RangedWeapon extends IconDelegate implements Weapon { public boolean attack(Creature attacker) { var ammunition = attacker.getAmmunition(); - if(ammunition == null || !ammunition.getAppliesTo().equals(type)) { + if (ammunition == null || !ammunition.getAppliesTo().equals(type)) { return false; } @@ -100,9 +99,4 @@ public class RangedWeapon extends IconDelegate implements Weapon { public String usageName() { return "Equip"; } - - private static Icon createIcon(DB.model.RangedWeaponModel template) { - var icons = template.getIcon().split(","); - return ContextHolder.INSTANCE.getContext().createIcon(A.iconsets.get(icons[0]).uid, Integer.parseInt(icons[1]), Integer.parseInt(icons[2])); - } } \ No newline at end of file