From 76264407f40d4d59570c1d59eaff1c731ddfb4dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Tue, 30 Aug 2022 22:49:48 +0200 Subject: [PATCH] Add support for medicaments --- data.mv.db | Bin 40960 -> 45056 bytes maps/b602601a-e9b0-44bf-bc0d-5f31c9964ba1.dat | Bin 28502 -> 28987 bytes maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat | Bin 6333 -> 6387 bytes .../demo/ai/WeaponBasedAI.java | 2 +- .../bartlomiejpluta/demo/entity/Creature.java | 10 ++++- .../bartlomiejpluta/demo/entity/Enemy.java | 13 ++++-- .../bartlomiejpluta/demo/entity/Player.java | 5 ++- .../demo/gui/EquipmentWindow.java | 6 +++ .../demo/map/BaseMapHandler.java | 12 +++++ .../bartlomiejpluta/demo/util/IconUtil.java | 11 +++++ .../demo/world/item/BaseItem.java | 12 +++++ .../demo/world/item/StackableItem.java | 38 ++++++++++++++++ .../bartlomiejpluta/demo/world/junk/Junk.java | 14 ++---- .../demo/world/potion/Medicament.java | 37 +++++++++++++++ .../demo/world/weapon/Ammunition.java | 42 ++---------------- .../demo/world/weapon/MeleeWeapon.java | 12 ++--- .../demo/world/weapon/RangedWeapon.java | 14 ++---- 17 files changed, 151 insertions(+), 77 deletions(-) create mode 100644 src/main/java/com/bartlomiejpluta/demo/util/IconUtil.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/world/item/BaseItem.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/world/item/StackableItem.java create mode 100644 src/main/java/com/bartlomiejpluta/demo/world/potion/Medicament.java diff --git a/data.mv.db b/data.mv.db index 28f369d8ea799c24c66e2985a5b12e79ff1cb9bb..79f52eb79a074dfcaf476d2e8e023a5b5e104705 100644 GIT binary patch literal 45056 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 delta 80 zcmdn}i1FGz#tjBm+$&|cSbP&R^OP3IY<9FVWt<#f#Ws1Jqr&6>E49f9wqlbT9M~oo m*sx80V9Pey&sl7;pOe7kdrlmaCphqIma`G!*(~a%rVapk2O8D@ diff --git a/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat b/maps/d1b85d85-c52a-46f5-b81e-444847f8ddae.dat index 124ef1bdc28a704a9f76f626378645a378a8788f..15e3756d40065ff6da47166a418db1d44208a325 100644 GIT binary patch delta 108 zcmdmM_}Os7Q*Q2VJ}wsD#LPUUCce!dxK}c5UMTR2kxOVd3kSOZr_>gf&8q}9GENQ_ z@G<4$)JsfB@hnNr)yPQ9OUX$s(#uUv$xKenP0cIOP%6$%%*lz*$xKU)FUT*+%+FKO NQ83Zm+$m(j1_0zuB%lBQ delta 54 zcmextxYuyQQ*Q37yj(24iJ5syXLvV%;9kkZ(aOTXF2E`EZ}URFO^lQ6gnSsSH_zaE L&A9oXkP#aIAOI5E 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