Improve equipment window

This commit is contained in:
2022-08-25 20:05:15 +02:00
parent a8a12a022a
commit 2c1fc56a5f
13 changed files with 287 additions and 39 deletions

View File

@@ -1,39 +1,119 @@
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.Ref;
import com.bartlomiejpluta.base.api.gui.WindowManager;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.api.gui.*;
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.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;
import static java.lang.String.format;
public class EquipmentWindow extends DecoratedWindow {
private final DemoRunner runner;
private final Player player;
private final Window eqItemMenuWindow;
private final Button useBtn;
private final Button dropBtn;
private final Button cancelBtn;
private final VOptionChoice eqItemMenu;
@Ref("eq")
private VGridOptionChoice eqGrid;
@Ref("item-name")
private Label nameLbl;
@Ref("item-details")
private Label detailsLbl;
public EquipmentWindow(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
this.runner = (DemoRunner) context.getGameRunner();
this.player = runner.getPlayer();
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);
}
@Override
public void onOpen(WindowManager manager) {
super.onOpen(manager);
cancelBtn.setAction(manager::close);
eqGrid.setOnSelect(this::updateItemDetails);
var i = 0;
for(var child : eqGrid.getChildren()) {
for (var child : eqGrid.getChildren()) {
var slot = (ItemIconView) child;
slot.setIcon(player.getEquipmentItem(i++));
slot.setItem(player.getEquipmentItem(i++));
slot.setAction(handleItem(slot));
}
eqGrid.select(0, 0);
eqGrid.focus();
}
private Consumer<Item> handleItem(ItemIconView slot) {
return item -> {
useBtn.setText(getButtonTitle(item));
eqItemMenu.select(0);
eqItemMenu.focus();
manager.open(eqItemMenuWindow);
useBtn.setAction(() -> {
player.useEquipmentItem(item);
manager.close();
});
dropBtn.setAction(() -> {
player.dropItemFromEquipment(item);
slot.setItem(null);
updateItemDetails(slot);
manager.close();
});
};
}
private void updateItemDetails(Component slot) {
var item = ((ItemIconView) slot).getItem();
if (item == null) {
nameLbl.setText("");
detailsLbl.setText("");
return;
}
nameLbl.setText(item.getName());
if (item instanceof MeleeWeapon weapon) {
detailsLbl.setText(format("Damage: %s\nCooldown: %s\n", weapon.getDmgRoller(), weapon.getCooldown()));
return;
}
if (item instanceof RangedWeapon weapon) {
detailsLbl.setText(format("Damage: %s\nRange: %s\nCooldown: %s\n", weapon.getDmgRoller(), weapon.getRangeRoller(), weapon.getCooldown()));
}
}
private String getButtonTitle(Item item) {
if (item instanceof Weapon) {
return "Equip";
}
return "Use";
}
}

View File

@@ -4,8 +4,19 @@ 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.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.world.item.Item;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import java.util.Map;
import java.util.function.Consumer;
import java.util.Map;
@@ -13,6 +24,12 @@ public class ItemIconView extends IconView {
private final Color normal;
private final Color hover;
@Getter
private Item item;
@Setter
private Consumer<Item> action;
public ItemIconView(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
this.normal = gui.createColor();
@@ -21,6 +38,40 @@ public class ItemIconView extends IconView {
normal.setRGBA(0x444444FF);
hover.setRGBA(0x888888FF);
super.setScale(2f);
addEventListener(KeyEvent.TYPE, this::handleKeyEvent);
}
public void setItem(Item item) {
this.item = item;
super.setIcon(item);
}
@Override
public void setIcon(Icon icon) {
throw new UnsupportedOperationException();
}
@Override
public void setIconSet(String iconSetUid) {
throw new UnsupportedOperationException();
}
@Override
public void setIconSetRow(@NonNull Integer iconSetRow) {
throw new UnsupportedOperationException();
}
@Override
public void setIconSetColumn(@NonNull Integer iconSetColumn) {
throw new UnsupportedOperationException();
}
private void handleKeyEvent(KeyEvent event) {
if (event.getKey() == Key.KEY_ENTER && event.getAction() == KeyAction.PRESS && item != null && action != null) {
event.consume();
action.accept(item);
}
}
@Override

View File

@@ -20,12 +20,16 @@ public class StartMenuWindow extends DecoratedWindow implements Inflatable {
@Getter
private Button exitBtn;
@Ref("menu")
private VOptionChoice menu;
public StartMenuWindow(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
public void onInflate() {
newGameBtn.focus();
menu.select(0);
menu.focus();
}
}