From fe828f902615ef9ca6cef81277f6ce3e2e45523a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 25 Aug 2022 21:52:50 +0200 Subject: [PATCH] Add basic support for ammo --- data.mv.db | Bin 40960 -> 36864 bytes maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat | Bin 24032 -> 25206 bytes .../demo/ai/WeaponBasedAI.java | 5 +- .../bartlomiejpluta/demo/entity/Creature.java | 19 ++++++ .../bartlomiejpluta/demo/entity/Player.java | 43 +++++++++++++- .../demo/gui/EquipmentWindow.java | 34 ++++++++--- .../demo/gui/ItemIconView.java | 2 +- .../demo/world/item/ItemStack.java | 12 +++- .../demo/world/item/Useable.java | 11 ++++ .../demo/world/weapon/Ammunition.java | 55 ++++++++++++++++-- .../demo/world/weapon/MeleeWeapon.java | 10 ++++ .../demo/world/weapon/RangedWeapon.java | 20 +++++++ .../demo/world/weapon/Weapon.java | 3 +- .../c473a91a-ff25-4e71-9bec-b35e48102aeb.xml | 5 ++ 14 files changed, 197 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/bartlomiejpluta/demo/world/item/Useable.java diff --git a/data.mv.db b/data.mv.db index 852d8bcbc753cdc02226ea859de59864d9a04412..f6c30320c55e8a81231c673c469db9424630adb4 100644 GIT binary patch literal 36864 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 diff --git a/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat b/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat index 9047a075d1dd9e2ecc6a007119243b92a30d344d..1aea8a08c2e85c64d75b3f8535017df9364a170c 100644 GIT binary patch delta 118 zcmaE`oAKKb#tjwf+>dR!SbP&R^Q3OsPM)Y9IeCFP-()!*fyoWpJd+n_uuan7+bpG# zB+hYyg@Z#tPU_(1g%)cWCmTBYFd9#;cl6*CI>EvrD4>8WVFHmj$-==aASHDOtYfpG H<9ZnYS@>{#tjwf+-FU=SbP&R^Q4ZLOrEG7IeCFP-()!*fyoWpJd+n_uuan7+bpG# eB+hY?g@Z#tPU_I+g%)cWC)YUpY!-G)mH_~~+ZcoZ diff --git a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java index 7989fa2..430a60a 100644 --- a/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java +++ b/src/main/java/com/bartlomiejpluta/demo/ai/WeaponBasedAI.java @@ -40,8 +40,7 @@ public class WeaponBasedAI implements AI { @Override public void nextActivity(ObjectLayer layer, float dt) { var lastAttacker = enemy.getLastAttacker(); - if (lastAttacker != null && lastAttacker instanceof Creature) { - var attacker = (Creature) lastAttacker; + if (lastAttacker instanceof Creature attacker) { if (attacker.isAlive()) { runawayAI.setDanger(attacker); meleeAI.setTarget(attacker); @@ -61,7 +60,7 @@ public class WeaponBasedAI implements AI { return; } - if (rangedWeapon == null || enemy.manhattanDistance(target) == 1) { + if (rangedWeapon == null || enemy.manhattanDistance(target) == 1 || enemy.getAmmunition() == null) { enemy.setWeapon(meleeWeapon); meleeAI.nextActivity(layer, dt); return; diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java b/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java index ce903ad..da50e8c 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Creature.java @@ -2,6 +2,8 @@ package com.bartlomiejpluta.demo.entity; import com.bartlomiejpluta.base.api.character.Character; import com.bartlomiejpluta.demo.world.item.Item; +import com.bartlomiejpluta.demo.world.weapon.Ammunition; +import com.bartlomiejpluta.demo.world.weapon.RangedWeapon; import com.bartlomiejpluta.demo.world.weapon.Weapon; import lombok.Getter; import lombok.NonNull; @@ -30,6 +32,10 @@ public abstract class Creature extends NamedCharacter { @Setter private Weapon weapon; + @Getter + @Setter + private Ammunition ammunition; + @Getter private NamedCharacter lastAttacker; @@ -44,6 +50,14 @@ public abstract class Creature extends NamedCharacter { if (attackCooldown >= weapon.getCooldown()) { if (weapon.attack(this)) { + if(weapon instanceof RangedWeapon) { + ammunition.decrease(); + + if(ammunition.getCount() == 0) { + ammunition = null; + } + } + attackCooldown = 0; } } @@ -62,6 +76,11 @@ public abstract class Creature extends NamedCharacter { public void useEquipmentItem(Item item) { if (item instanceof Weapon weapon) { setWeapon(weapon); + return; + } + + if (item instanceof Ammunition ammunition) { + setAmmunition(ammunition); } } diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Player.java b/src/main/java/com/bartlomiejpluta/demo/entity/Player.java index 48a54c9..677ae29 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/Player.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Player.java @@ -2,6 +2,7 @@ package com.bartlomiejpluta.demo.entity; import com.bartlomiejpluta.base.api.character.Character; import com.bartlomiejpluta.demo.world.item.Item; +import com.bartlomiejpluta.demo.world.weapon.Ammunition; import com.bartlomiejpluta.demo.world.weapon.Weapon; import lombok.NonNull; import org.joml.Vector2i; @@ -63,9 +64,49 @@ public class Player extends Creature { item.setCoordinates(getCoordinates()); getLayer().addEntity(item); - if(item == getWeapon()) { + if (item == getWeapon()) { setWeapon(null); } + + if (item == getAmmunition()) { + setAmmunition(null); + } + } + + @Override + public void setWeapon(Weapon weapon) { + var currentWeapon = getWeapon(); + + if (weapon != null) { + removeItemFromEquipment(weapon); + } + + if (currentWeapon != null) { + pushItemToEquipment(currentWeapon); + } + + super.setWeapon(weapon); + } + + @Override + public void setAmmunition(Ammunition ammunition) { + var currentAmmo = getAmmunition(); + + if (currentAmmo != null && currentAmmo.getId().equals(ammunition.getId())) { + currentAmmo.increase(ammunition.getCount()); + removeItemFromEquipment(ammunition); + return; + } + + if (ammunition != null) { + removeItemFromEquipment(ammunition); + } + + if (currentAmmo != null) { + pushItemToEquipment(currentAmmo); + } + + super.setAmmunition(ammunition); } @Override diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java index 2494126..4cf49f9 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java @@ -8,9 +8,9 @@ import com.bartlomiejpluta.base.lib.gui.VOptionChoice; 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.weapon.MeleeWeapon; import com.bartlomiejpluta.demo.world.weapon.RangedWeapon; -import com.bartlomiejpluta.demo.world.weapon.Weapon; import java.util.Map; import java.util.function.Consumer; @@ -31,6 +31,12 @@ public class EquipmentWindow extends DecoratedWindow { @Ref("eq") private VGridOptionChoice eqGrid; + @Ref("weapon") + private ItemIconView weapon; + + @Ref("ammo") + private ItemIconView ammo; + @Ref("item-name") private Label nameLbl; @@ -55,6 +61,13 @@ public class EquipmentWindow extends DecoratedWindow { cancelBtn.setAction(manager::close); eqGrid.setOnSelect(this::updateItemDetails); + updateEquipment(); + + eqGrid.select(0, 0); + eqGrid.focus(); + } + + private void updateEquipment() { var i = 0; for (var child : eqGrid.getChildren()) { var slot = (ItemIconView) child; @@ -62,8 +75,8 @@ public class EquipmentWindow extends DecoratedWindow { slot.setAction(handleItem(slot)); } - eqGrid.select(0, 0); - eqGrid.focus(); + weapon.setItem(player.getWeapon()); + ammo.setItem(player.getAmmunition()); } private Consumer handleItem(ItemIconView slot) { @@ -74,10 +87,13 @@ public class EquipmentWindow extends DecoratedWindow { manager.open(eqItemMenuWindow); - useBtn.setAction(() -> { - player.useEquipmentItem(item); - manager.close(); - }); + if (item instanceof Useable useable) { + useBtn.setAction(() -> { + useable.use(player); + updateEquipment(); + manager.close(); + }); + } dropBtn.setAction(() -> { player.dropItemFromEquipment(item); @@ -110,8 +126,8 @@ public class EquipmentWindow extends DecoratedWindow { } private String getButtonTitle(Item item) { - if (item instanceof Weapon) { - return "Equip"; + if (item instanceof Useable useable) { + return useable.usageName(); } return "Use"; diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java b/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java index 704584c..4868b06 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java @@ -102,7 +102,7 @@ public class ItemIconView extends IconView { gui.beginPath(); gui.setFontFace(fonts.roboto_regular.uid); gui.setFontSize(17); - gui.putText(x + 15, y + 5, String.valueOf(stack.count())); + gui.putText(x + 15, y + 5, String.valueOf(stack.getCount())); gui.setFillColor(textColor); gui.fill(); gui.closePath(); diff --git a/src/main/java/com/bartlomiejpluta/demo/world/item/ItemStack.java b/src/main/java/com/bartlomiejpluta/demo/world/item/ItemStack.java index fa8ec6e..c46c340 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/item/ItemStack.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/item/ItemStack.java @@ -1,5 +1,15 @@ package com.bartlomiejpluta.demo.world.item; public interface ItemStack extends Item { - int count(); + int getCount(); + + void setCount(int count); + + void decrease(); + + void increase(); + + void increase(int count); + + void decrease(int count); } diff --git a/src/main/java/com/bartlomiejpluta/demo/world/item/Useable.java b/src/main/java/com/bartlomiejpluta/demo/world/item/Useable.java new file mode 100644 index 0000000..58fe9d6 --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/world/item/Useable.java @@ -0,0 +1,11 @@ +package com.bartlomiejpluta.demo.world.item; + +import com.bartlomiejpluta.demo.entity.Creature; + +public interface Useable { + void use(Creature creature); + + default String usageName() { + return "Use"; + } +} 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 171cc1f..25af6dc 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java @@ -3,33 +3,76 @@ 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.Useable; import lombok.Getter; import lombok.NonNull; +import lombok.Setter; +import lombok.ToString; -public class Ammunition extends IconDelegate implements ItemStack { +@ToString +public class Ammunition extends IconDelegate implements ItemStack, Useable { + + @Getter + private final String id; + + @Getter + @Setter private int count; @Getter private final String name; + @Getter + private final String appliesTo; + public Ammunition(@NonNull String id, int count) { this(DB.dao.ammunition.find(id), count); } public Ammunition(@NonNull DB.model.AmmunitionModel template, int count) { super(createIcon(template)); + this.id = template.getId(); this.name = template.getName(); this.count = count; - } - - @Override - public int count() { - return 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) { + creature.setAmmunition(this); + } + + @Override + public String usageName() { + return "Equip"; + } } 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 1617a22..228e9ac 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java @@ -59,6 +59,16 @@ public class MeleeWeapon extends IconDelegate implements Weapon { return false; } + @Override + public void use(Creature creature) { + creature.setWeapon(this); + } + + @Override + 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])); 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 8708b1e..41bd460 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java @@ -28,6 +28,9 @@ public class RangedWeapon extends IconDelegate implements Weapon { @Getter private final String name; + @Getter + private final String type; + @Getter private final DiceRoller dmgRoller; @@ -46,6 +49,7 @@ public class RangedWeapon extends IconDelegate implements Weapon { this.context = ContextHolder.INSTANCE.getContext(); this.name = template.getName(); + this.type = template.getType(); this.dmgRoller = DiceRoller.of(template.getDamage()); this.rangeRoller = DiceRoller.of(template.getRange()); this.cooldown = template.getCooldown(); @@ -75,12 +79,28 @@ public class RangedWeapon extends IconDelegate implements Weapon { @Override public boolean attack(Creature attacker) { + var ammunition = attacker.getAmmunition(); + + if(ammunition == null || !ammunition.getAppliesTo().equals(type)) { + return false; + } + var direction = attacker.getFaceDirection(); context.playSound(sound); animation.range(rangeRoller.roll()).direction(direction).rotation(direction.xAngle - 180).run(context, attacker.getLayer(), attacker); return true; } + @Override + public void use(Creature creature) { + creature.setWeapon(this); + } + + @Override + 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])); diff --git a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java index 7975bd4..a8a1fbf 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Weapon.java @@ -2,8 +2,9 @@ package com.bartlomiejpluta.demo.world.weapon; import com.bartlomiejpluta.demo.entity.Creature; import com.bartlomiejpluta.demo.world.item.Item; +import com.bartlomiejpluta.demo.world.item.Useable; -public interface Weapon extends Item { +public interface Weapon extends Item, Useable { int getCooldown(); diff --git a/widgets/c473a91a-ff25-4e71-9bec-b35e48102aeb.xml b/widgets/c473a91a-ff25-4e71-9bec-b35e48102aeb.xml index 14998aa..b620b1c 100644 --- a/widgets/c473a91a-ff25-4e71-9bec-b35e48102aeb.xml +++ b/widgets/c473a91a-ff25-4e71-9bec-b35e48102aeb.xml @@ -21,6 +21,11 @@ + + + + +