From 9ff0d6c99db2f990804617f0d30b41920addd1c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Wed, 31 Aug 2022 01:01:04 +0200 Subject: [PATCH] Enable disarming already armed equipment --- data.mv.db | Bin 45056 -> 32768 bytes .../demo/gui/EquipmentWindow.java | 122 +++++++++++++----- .../demo/gui/GameMenuWindow.java | 17 ++- .../demo/gui/ItemIconView.java | 34 ++++- .../bartlomiejpluta/demo/gui/LootWindow.java | 6 +- .../demo/gui/StartMenuWindow.java | 10 +- .../demo/world/weapon/Ammunition.java | 2 +- .../demo/world/weapon/MeleeWeapon.java | 2 +- .../demo/world/weapon/RangedWeapon.java | 2 +- .../56ca6b39-f949-4212-9c23-312db25887e0.xml | 2 +- .../c473a91a-ff25-4e71-9bec-b35e48102aeb.xml | 53 ++++---- 11 files changed, 166 insertions(+), 84 deletions(-) diff --git a/data.mv.db b/data.mv.db index 79f52eb79a074dfcaf476d2e8e023a5b5e104705..f20eab7002b2592cea42c521bde09e41b99a6881 100644 GIT binary patch delta 3325 zcmZp8z|_#dr0QX1q?44BpPX%F4xxiHt5U5D4Gau)k~2#4vaO6QEDa~Bs*74!8tSCw zq?ROSq!w8jni!>6q?ws)OkBw?O^(LRi2}>`<18!Exv5SsCi&CKgy3CxYk- zD>GvQoxIeF5-T&Eg2eRHVk;w^qWt_4t5hQs128Z)FfrCC$;?f)GBHg}G_^1?)+tLZ zD$dN$1G(B@a)Lwj#zdpfO^At^8UqYOo@h* z9hD_)QjLr)K<+d*HAi))p@mLqUTJY^iepI_+`Sg5NRGFdywF&b+rlCZYOdwvgT_iA za}^B4d{d2#lR@Shp!?r21!^uLJh0f4hHOvTW*ZfACT8=Lw8>>^^3vuhY20~B3V75dCgr5+P0m%7+MK4!%Lvnf&*aS+>hc^~$Y}vN77>Zg z(mc&PE!EI;@<#nINehcqXxJEola4Vg>41V>17FZ147W&~oZyhkWN~})afeAv+G{pP zJC+KuYUdnbVVb-lQe^VWU{NM*rAZ+nOgjH3hlR*9=^U9{9%3n{W7o~f$RNlRP@bQk zlA0HvSX7i>ZpZ)vS9K;&J{NMCN!MiZ;!ss4{au?+g}!5AQgEHTE25T3@#JL7$RZ}i z#>s0VmoX`QnH(Br%%nVHb63;^MkW=5$ucp^m{c4mABo9lQth8?8mr^3`U#wLl^Yn? zIbYHFGaH`F98)xr$UGc`0pa+;Y*ax%gcvwBP8WN@Uw zoD503FegKKP$xrqP!~gZFc(93Fc(94P!~gaP!~gZP#2p)GYibg5J{MmAv~Cqp*)a_ zHx`z2Oj2OiLN3&hiz!4Im~3orX>4SY1T6z$^@AC>3$AQd*S)P-cXJx39n^<6FY>}jsn^<9G zW^AC7ms(L`m84UUn4Vf}Wu#M-pI>5?l5CM|00PDaCdN7?nYpP}CZ^^_h8AWfI%TOv z#hLkeU{_C0Fo>RfK!G*L{4fI}BLnY=0}Kon(-?S9I52Rm7Ln9t%}p%OGh<+2J!izv zAj!Z5_OG6?xnVM#X=H$48X}lRlNlAexGWOcK_(bmBu!qBD9UYam<$a`lgS4Xm6$A& zCMy_7Q=ojuk}!lX43NBJn5p!OP14pf5Jn;@2xl57FC*8nAy49zSoVfGMhuaND@U(*f!dn>UzU;F#Q?&#r}>PLWd>B14#% z8W^Nm8X8RAs2?V2ZUm1J9h77}Ss_7817E}-8E!B+!60GsJ_Ytb^8=9N%K%Bf#~IL) z?=2$<9Ld)(1)gRNQxVKbirpxQw-7Dy!Xwj$aNd>eWNg1#!8`$$pb;q)In5y@Xv0*KG&6%#NP84E%^)hDC;o98gHGz>yd(mVWpJhzimnR?b$!F4% zoowo>dG4Mh%ngpVr(9`!}kU**@%n?~C5y4EtUOAXU;~%YZFa^gy zYGG-RWRYYJO;^zPhgTLT@t=eo|K>;uA5nN3CPM8+PIoye$!1v6w?UFcGP1oOKCF^L zu{ROf-b5sOVHwWY+%O4huLUT*=b+~|OY{Q33>*%q1pu=B#D_x?)_lOmz`(pzOmy?k zpt(%-7KzNp7D>D*(5l(g+|bYn&NDMgF|a`J%q)`=;XIK05ImDKV*`XfQ^RBv6SzuK zqa*_Z1kc#WAQ{f9H#IXiL1;8fG&DpgH8(J|Kv-dJlxBf&jJZitGD4q$si|oy+)$IW zR0}gW&(zQa$!TUL$;k*)%!DkBlT8c^%#f(b-$D}VElik=Elhb+k|2dKG+3ZKXt2O| zkYIuGpuqy=L4yU#g9ZzX2MHD!4-za;9xPa(TxhUBdC*{i@gTth<3WN2%7X?Alm`tK zC=VJeP#!c`V7$$&;fL8LDX?oHwd9Z!dNQJPG)po`HL@@>G%p#I;KHN zM?FaC7!4^M&7q~^d`Ri|4pKTQKuX70aOrr$0a7|bTG1$_VTb3cz@f zQUJ<>l>$&Mv=o5yprrte2Pp+$JV+@3(A@ZKA^aD;d9VSOP;(#Fz>Lo(b5))xvgKLja+8X$ck zNFjvMmFL6N7eX$C5ap2}{_-dpsVkq70&Op#w$`ZGl{ZYAoRFji?n;BZ@Ko#_AeBRi z)*-wc0{4m#_Cg{Bl%XjtZwL$>q#+F**itlffVI_!+=WM^L*$f&lx$7SlG7}VK|LOS E0QeMuga7~l diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java index 3442d9b..89c7b02 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/EquipmentWindow.java @@ -2,11 +2,14 @@ package com.bartlomiejpluta.demo.gui; import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.gui.*; +import com.bartlomiejpluta.base.api.input.Key; +import com.bartlomiejpluta.base.api.input.KeyAction; +import com.bartlomiejpluta.base.api.input.KeyEvent; +import com.bartlomiejpluta.base.lib.gui.HOptionChoice; import com.bartlomiejpluta.base.lib.gui.Label; import com.bartlomiejpluta.base.lib.gui.VGridOptionChoice; 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.potion.Medicament; @@ -14,7 +17,7 @@ import com.bartlomiejpluta.demo.world.weapon.MeleeWeapon; import com.bartlomiejpluta.demo.world.weapon.RangedWeapon; import java.util.Map; -import java.util.function.Consumer; +import java.util.function.BiConsumer; import static java.lang.String.format; @@ -22,20 +25,26 @@ import static java.lang.String.format; public class EquipmentWindow extends DecoratedWindow { private final Player player; - private final Window eqItemMenuWindow; + private final Window popupMenuWindow; private final Button useBtn; private final Button dropBtn; private final Button cancelBtn; - private final VOptionChoice eqItemMenu; + private final VOptionChoice popupMenu; - @Ref("eq") - private VGridOptionChoice eqGrid; + @Ref("layout") + private HOptionChoice layout; + + @Ref("equipment") + private VGridOptionChoice equipment; + + @Ref("inventory") + private VGridOptionChoice inventory; @Ref("weapon") - private ItemIconView weapon; + private ItemIconView weaponSlot; @Ref("ammo") - private ItemIconView ammo; + private ItemIconView ammoSlot; @Ref("item-name") private Label nameLbl; @@ -43,14 +52,26 @@ public class EquipmentWindow extends DecoratedWindow { @Ref("item-details") private Label detailsLbl; + public EquipmentWindow(Context context, GUI gui, Map refs) { super(context, gui, refs); this.player = context.getGlobal("player", Player.class); - this.eqItemMenuWindow = gui.inflateWindow(A.widgets.eq_item_menu.uid); - this.eqItemMenu = eqItemMenuWindow.reference("menu", VOptionChoice.class); - this.useBtn = eqItemMenuWindow.reference("use", Button.class); - this.dropBtn = eqItemMenuWindow.reference("drop", Button.class); - this.cancelBtn = eqItemMenuWindow.reference("cancel", Button.class); + this.popupMenuWindow = gui.inflateWindow(A.widgets.eq_item_menu.uid); + this.popupMenu = popupMenuWindow.reference("menu", VOptionChoice.class); + this.useBtn = popupMenuWindow.reference("use", Button.class); + this.dropBtn = popupMenuWindow.reference("drop", Button.class); + this.cancelBtn = popupMenuWindow.reference("cancel", Button.class); + + addEventListener(KeyEvent.TYPE, this::handleKey); + } + + private void handleKey(KeyEvent event) { + if (event.getKey() == Key.KEY_TAB && event.getAction() == KeyAction.PRESS) { + layout.selectNext(); + layout.focus(); + updateItemDetails(((VGridOptionChoice) layout.getSelectedComponent()).getSelectedComponent()); + event.consume(); + } } @Override @@ -58,41 +79,53 @@ public class EquipmentWindow extends DecoratedWindow { super.onOpen(manager, args); cancelBtn.setAction(manager::close); - eqGrid.setOnSelect(this::updateItemDetails); + inventory.setOnSelect(this::updateItemDetails); + equipment.setOnSelect(this::updateItemDetails); updateEquipment(); - eqGrid.select(0, 0); - eqGrid.focus(); + layout.select(1); + layout.focus(); + } + + @Override + public void onClose(WindowManager manager) { + super.onClose(manager); + layout.blur(); } private void updateEquipment() { var i = 0; - for (var child : eqGrid.getChildren()) { + for (var child : inventory.getChildren()) { var slot = (ItemIconView) child; slot.setItem(player.getEquipmentItem(i++)); - slot.setAction(handleClick(slot)); + slot.setAction(this::handleInventoryClick); } - weapon.setItem(player.getWeapon()); - ammo.setItem(player.getAmmunition()); + weaponSlot.setItem(player.getWeapon()); + weaponSlot.setAction(handleEquipmentClick(() -> { + player.setWeapon(null); + updateEquipment(); + manager.close(); + })); + + ammoSlot.setItem(player.getAmmunition()); + ammoSlot.setAction(handleEquipmentClick(() -> { + player.setAmmunition(null); + updateEquipment(); + manager.close(); + })); } - private Consumer handleClick(ItemIconView slot) { - return item -> { - useBtn.setText(getButtonTitle(item)); - eqItemMenu.select(0); - eqItemMenu.focus(); + private BiConsumer handleEquipmentClick(Runnable deequip) { + return (slot, item) -> { + useBtn.setText("Disarm"); + popupMenu.select(0); + popupMenu.focus(); - manager.open(eqItemMenuWindow); + manager.open(popupMenuWindow); - if (item instanceof Useable useable) { - useBtn.setAction(() -> { - useable.use(player); - updateEquipment(); - manager.close(); - }); - } + useBtn.setAction(deequip); dropBtn.setAction(() -> { player.dropItemFromEquipment(item); @@ -103,6 +136,29 @@ public class EquipmentWindow extends DecoratedWindow { }; } + private void handleInventoryClick(ItemIconView slot, Item item) { + useBtn.setText(getButtonTitle(item)); + popupMenu.select(0); + popupMenu.focus(); + + manager.open(popupMenuWindow); + + if (item instanceof Useable useable) { + useBtn.setAction(() -> { + useable.use(player); + updateEquipment(); + manager.close(); + }); + } + + dropBtn.setAction(() -> { + player.dropItemFromEquipment(item); + slot.setItem(null); + updateItemDetails(slot); + manager.close(); + }); + } + private void updateItemDetails(Component slot) { var item = ((ItemIconView) slot).getItem(); diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/GameMenuWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/GameMenuWindow.java index 2368113..cd5463a 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/GameMenuWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/GameMenuWindow.java @@ -1,16 +1,17 @@ package com.bartlomiejpluta.demo.gui; import com.bartlomiejpluta.base.api.context.Context; -import com.bartlomiejpluta.base.api.gui.Component; -import com.bartlomiejpluta.base.api.gui.GUI; -import com.bartlomiejpluta.base.api.gui.Inflatable; -import com.bartlomiejpluta.base.api.gui.Ref; +import com.bartlomiejpluta.base.api.gui.*; +import com.bartlomiejpluta.base.lib.gui.VOptionChoice; import lombok.Getter; import java.util.Map; -public class GameMenuWindow extends DecoratedWindow implements Inflatable { +public class GameMenuWindow extends DecoratedWindow { + + @Ref("menu") + private VOptionChoice menu; @Ref("resume_game") @Getter @@ -29,7 +30,9 @@ public class GameMenuWindow extends DecoratedWindow implements Inflatable { } @Override - public void onInflate() { - resumeGameBtn.focus(); + public void onOpen(WindowManager manager, Object[] args) { + super.onOpen(manager, args); + menu.select(0); + menu.focus(); } } \ No newline at end of file diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java b/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java index 4868b06..61a6ed2 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/ItemIconView.java @@ -2,15 +2,14 @@ package com.bartlomiejpluta.demo.gui; import A.fonts; import com.bartlomiejpluta.base.api.context.Context; -import com.bartlomiejpluta.base.api.gui.Color; -import com.bartlomiejpluta.base.api.gui.Component; -import com.bartlomiejpluta.base.api.gui.GUI; +import com.bartlomiejpluta.base.api.gui.*; import com.bartlomiejpluta.base.api.icon.Icon; import com.bartlomiejpluta.base.api.input.Key; import com.bartlomiejpluta.base.api.input.KeyAction; import com.bartlomiejpluta.base.api.input.KeyEvent; import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.lib.gui.IconView; +import com.bartlomiejpluta.demo.util.IconUtil; import com.bartlomiejpluta.demo.world.item.Item; import com.bartlomiejpluta.demo.world.item.ItemStack; import lombok.Getter; @@ -18,9 +17,10 @@ import lombok.NonNull; import lombok.Setter; import java.util.Map; -import java.util.function.Consumer; +import java.util.function.BiConsumer; public class ItemIconView extends IconView { + private final GUI gui; private final Color normal; private final Color hover; private final Color textColor; @@ -28,11 +28,18 @@ public class ItemIconView extends IconView { @Getter private Item item; + private IconSet placeholderIconSet; + private Paint placeholderIconPaint; + + private int placeholderIconSetRow; + private int placeholderIconSetColumn; + @Setter - private Consumer action; + private BiConsumer action; public ItemIconView(Context context, GUI gui, Map refs) { super(context, gui, refs); + this.gui = gui; this.normal = gui.createColor(); this.hover = gui.createColor(); this.textColor = gui.createColor(); @@ -71,10 +78,19 @@ public class ItemIconView extends IconView { throw new UnsupportedOperationException(); } + @Attribute("placeholder") + public void setPlaceholderIcon(String icon) { + this.placeholderIconPaint = gui.createPaint(); + var parts = icon.split(","); + this.placeholderIconSet = gui.getIconSet(A.iconsets.get(parts[0]).uid); + this.placeholderIconSetRow = Integer.parseInt(parts[1]); + this.placeholderIconSetColumn = Integer.parseInt(parts[2]); + } + private void handleKeyEvent(KeyEvent event) { if (event.getKey() == Key.KEY_ENTER && event.getAction() == KeyAction.PRESS && item != null && action != null) { event.consume(); - action.accept(item); + action.accept(this, item); } } @@ -96,6 +112,12 @@ public class ItemIconView extends IconView { gui.fill(); gui.closePath(); + if (item == null && placeholderIconSet != null) { + gui.icon(this.x, this.y, 2, 2, 0, 0.2f, placeholderIconSet, placeholderIconSetRow, placeholderIconSetColumn, placeholderIconPaint); + + return; + } + super.draw(screen, gui); if (item != null && item instanceof ItemStack stack) { diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java index 5df5377..c899135 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java @@ -46,6 +46,8 @@ public class LootWindow extends DecoratedWindow implements Inflatable { this.loot = (Item[]) args[0]; this.titleLbl.setText((String) args[1]); + this.lootMenu.select(0, 0); + this.lootMenu.focus(); updateSlots(); } @@ -57,7 +59,7 @@ public class LootWindow extends DecoratedWindow implements Inflatable { this.loot = null; } - private void handleClick(Item item) { + private void handleClick(ItemIconView slot, Item item) { if (item == null) { return; } @@ -66,7 +68,7 @@ public class LootWindow extends DecoratedWindow implements Inflatable { for (int i = 0; i < Enemy.MAX_LOOT; i++) { if (loot[i] == item) { loot[i] = null; - slots[i].setItem(null); + slot.setItem(null); break; } } diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/StartMenuWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/StartMenuWindow.java index 2695e7d..26dcc43 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/StartMenuWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/StartMenuWindow.java @@ -1,16 +1,13 @@ package com.bartlomiejpluta.demo.gui; import com.bartlomiejpluta.base.api.context.Context; -import com.bartlomiejpluta.base.api.gui.Component; -import com.bartlomiejpluta.base.api.gui.GUI; -import com.bartlomiejpluta.base.api.gui.Inflatable; -import com.bartlomiejpluta.base.api.gui.Ref; +import com.bartlomiejpluta.base.api.gui.*; import com.bartlomiejpluta.base.lib.gui.VOptionChoice; import lombok.Getter; import java.util.Map; -public class StartMenuWindow extends DecoratedWindow implements Inflatable { +public class StartMenuWindow extends DecoratedWindow { @Ref("new_game") @Getter @@ -28,7 +25,8 @@ public class StartMenuWindow extends DecoratedWindow implements Inflatable { } @Override - public void onInflate() { + public void onOpen(WindowManager manager, Object[] args) { + super.onOpen(manager, args); menu.select(0); menu.focus(); } 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 3cc7e09..e66de38 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/Ammunition.java @@ -39,6 +39,6 @@ public class Ammunition extends StackableItem implements Useable { @Override public String usageName() { - return "Equip"; + return "Arm"; } } 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 30ab1bf..0b5c660 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/MeleeWeapon.java @@ -65,6 +65,6 @@ public class MeleeWeapon extends BaseItem implements Weapon { @Override public String usageName() { - return "Equip"; + return "Arm"; } } \ 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 eb56110..edc62d5 100644 --- a/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java +++ b/src/main/java/com/bartlomiejpluta/demo/world/weapon/RangedWeapon.java @@ -97,6 +97,6 @@ public class RangedWeapon extends BaseItem implements Weapon { @Override public String usageName() { - return "Equip"; + return "Arm"; } } \ No newline at end of file diff --git a/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml b/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml index 1a40365..6abd42d 100644 --- a/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml +++ b/widgets/56ca6b39-f949-4212-9c23-312db25887e0.xml @@ -20,7 +20,7 @@ fontSize="30f">Game Menu - + Equipment + fontSize="30f">Inventory & Equipment - - - - - + + + + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + -