update SaveLoadScene, InventoryScene

- fix layout, add table header and scrollable content
- update textratypist
This commit is contained in:
Anthony Calosa
2023-03-08 17:20:58 +08:00
parent 8066a9be83
commit 64c920421b
5 changed files with 101 additions and 136 deletions

View File

@@ -21,21 +21,21 @@ import forge.adventure.util.Paths;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class InventoryScene extends UIScene { public class InventoryScene extends UIScene {
TextraButton leave; TextraButton leave;
Button equipButton; Button equipButton;
TextraButton useButton; TextraButton useButton;
TextraLabel itemDescription; TextraLabel itemDescription;
private final Table inventory; private final Table inventory;
private final Array<Button> inventoryButtons=new Array<>(); private final Array<Button> inventoryButtons = new Array<>();
private final HashMap<String,Button> equipmentSlots=new HashMap<>(); private final HashMap<String, Button> equipmentSlots = new HashMap<>();
HashMap<Button,String> itemLocation=new HashMap<>(); HashMap<Button, String> itemLocation = new HashMap<>();
Button selected; Button selected;
Button deleteButton; Button deleteButton;
Texture equipOverlay; Texture equipOverlay;
int columns=0; int columns = 0;
public InventoryScene()
{ public InventoryScene() {
super(Forge.isLandscapeMode() ? "ui/inventory.json" : "ui/inventory_portrait.json"); super(Forge.isLandscapeMode() ? "ui/inventory.json" : "ui/inventory_portrait.json");
equipOverlay = new Texture(Config.instance().getFile(Paths.ITEMS_EQUIP)); equipOverlay = new Texture(Config.instance().getFile(Paths.ITEMS_EQUIP));
ui.onButtonPress("return", () -> done()); ui.onButtonPress("return", () -> done());
@@ -44,51 +44,44 @@ public class InventoryScene extends UIScene {
ui.onButtonPress("equip", () -> equip()); ui.onButtonPress("equip", () -> equip());
ui.onButtonPress("use", () -> use()); ui.onButtonPress("use", () -> use());
equipButton = ui.findActor("equip"); equipButton = ui.findActor("equip");
useButton= ui.findActor("use"); useButton = ui.findActor("use");
useButton.setDisabled(true); useButton.setDisabled(true);
deleteButton = ui.findActor("delete"); deleteButton = ui.findActor("delete");
itemDescription = ui.findActor("item_description"); itemDescription = ui.findActor("item_description");
ScrollPane pane = new ScrollPane(itemDescription);
pane.setBounds(itemDescription.getX(), itemDescription.getY(), itemDescription.getWidth() - 5, itemDescription.getHeight() - 5);
itemDescription.setAlignment(Align.topLeft); itemDescription.setAlignment(Align.topLeft);
ui.addActor(pane);
Array<Actor> children = ui.getChildren(); Array<Actor> children = ui.getChildren();
for (int i = 0, n = children.size; i < n; i++) for (int i = 0, n = children.size; i < n; i++) {
{
if(children.get(i).getName()!=null&&children.get(i).getName().startsWith("Equipment")) if (children.get(i).getName() != null && children.get(i).getName().startsWith("Equipment")) {
{ String slotName = children.get(i).getName().split("_")[1];
String slotName=children.get(i).getName().split("_")[1];
equipmentSlots.put(slotName, (Button) children.get(i)); equipmentSlots.put(slotName, (Button) children.get(i));
Actor slot=children.get(i); Actor slot = children.get(i);
slot.addListener(new ChangeListener() { slot.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
Button button=((Button) actor); Button button = ((Button) actor);
if(button.isChecked()) if (button.isChecked()) {
{ for (Button otherButton : equipmentSlots.values()) {
for(Button otherButton:equipmentSlots.values()) if (button != otherButton && otherButton.isChecked()) {
{
if(button!=otherButton&&otherButton.isChecked()){
otherButton.setChecked(false); otherButton.setChecked(false);
} }
} }
String item=Current.player().itemInSlot(slotName); String item = Current.player().itemInSlot(slotName);
if(item!=null&& !item.equals("")) if (item != null && !item.equals("")) {
{ Button changeButton = null;
Button changeButton=null; for (Button invButton : inventoryButtons) {
for(Button invButton:inventoryButtons) if (itemLocation.get(invButton) != null && itemLocation.get(invButton).equals(item)) {
{ changeButton = invButton;
if(itemLocation.get(invButton)!=null&&itemLocation.get(invButton).equals(item))
{
changeButton=invButton;
break; break;
} }
} }
if(changeButton!=null) if (changeButton != null)
changeButton.setChecked(true); changeButton.setChecked(true);
} } else {
else
{
setSelected(null); setSelected(null);
} }
} }
@@ -99,29 +92,26 @@ public class InventoryScene extends UIScene {
} }
inventory = new Table(Controls.getSkin()); inventory = new Table(Controls.getSkin());
ScrollPane scrollPane = ui.findActor("inventory"); ScrollPane scrollPane = ui.findActor("inventory");
scrollPane.setScrollingDisabled(true,false); scrollPane.setScrollingDisabled(true, false);
scrollPane.setActor(inventory); scrollPane.setActor(inventory);
columns= (int) (scrollPane.getWidth()/createInventorySlot().getWidth()); columns = (int) (scrollPane.getWidth() / createInventorySlot().getWidth());
columns-=1; columns -= 1;
if(columns<=0)columns=1; if (columns <= 0) columns = 1;
scrollPane.setActor(inventory); scrollPane.setActor(inventory);
itemDescription.setWrap(true); itemDescription.setWrap(true);
} }
private void showConfirm() { private void showConfirm() {
Dialog confirm = prepareDialog("",ButtonYes|ButtonNo,()->delete()); Dialog confirm = prepareDialog("", ButtonYes | ButtonNo, () -> delete());
confirm.text( Controls.newLabel(Forge.getLocalizer().getMessage("lblDelete"))); confirm.text(Controls.newLabel(Forge.getLocalizer().getMessage("lblDelete")));
showDialog(confirm); showDialog(confirm);
} }
private static InventoryScene object; private static InventoryScene object;
public static InventoryScene instance() { public static InventoryScene instance() {
if(object==null) if (object == null)
object=new InventoryScene(); object = new InventoryScene();
return object; return object;
} }
@@ -134,16 +124,17 @@ public class InventoryScene extends UIScene {
public void delete() { public void delete() {
ItemData data = ItemData.getItem(itemLocation.get(selected)); ItemData data = ItemData.getItem(itemLocation.get(selected));
if(data != null) { if (data != null) {
Current.player().removeItem(data.name); Current.player().removeItem(data.name);
} }
updateInventory(); updateInventory();
} }
public void equip() { public void equip() {
if(selected == null) return; if (selected == null) return;
ItemData data = ItemData.getItem(itemLocation.get(selected)); ItemData data = ItemData.getItem(itemLocation.get(selected));
if(data==null)return; if (data == null) return;
Current.player().equip(data); Current.player().equip(data);
updateInventory(); updateInventory();
} }
@@ -153,100 +144,88 @@ public class InventoryScene extends UIScene {
stage.act(delta); stage.act(delta);
} }
private void triggerUse() { private void triggerUse() {
if(selected==null)return; if (selected == null) return;
ItemData data = ItemData.getItem(itemLocation.get(selected)); ItemData data = ItemData.getItem(itemLocation.get(selected));
if(data==null)return; if (data == null) return;
Current.player().addShards(-data.shardsNeeded); Current.player().addShards(-data.shardsNeeded);
done(); done();
ConsoleCommandInterpreter.getInstance().command(data.commandOnUse); ConsoleCommandInterpreter.getInstance().command(data.commandOnUse);
} }
private void use() { private void use() {
ItemData data = ItemData.getItem(itemLocation.get(selected)); ItemData data = ItemData.getItem(itemLocation.get(selected));
if(data==null)return; if (data == null) return;
Dialog useDialog = prepareDialog("",ButtonYes|ButtonNo,()->triggerUse()); Dialog useDialog = prepareDialog("", ButtonYes | ButtonNo, () -> triggerUse());
useDialog.getContentTable().add(Controls.newTextraLabel("Use "+data.name+"?\n"+data.getDescription())); useDialog.getContentTable().add(Controls.newTextraLabel("Use " + data.name + "?\n" + data.getDescription()));
showDialog(useDialog); showDialog(useDialog);
} }
private void setSelected(Button actor) { private void setSelected(Button actor) {
selected=actor; selected = actor;
if(actor==null) if (actor == null) {
{
itemDescription.setText(""); itemDescription.setText("");
deleteButton.setDisabled(true); deleteButton.setDisabled(true);
equipButton.setDisabled(true); equipButton.setDisabled(true);
useButton.setDisabled(true); useButton.setDisabled(true);
for(Button button:inventoryButtons) for (Button button : inventoryButtons) {
{
button.setChecked(false); button.setChecked(false);
} }
return; return;
} }
ItemData data = ItemData.getItem(itemLocation.get(actor)); ItemData data = ItemData.getItem(itemLocation.get(actor));
if(data==null) return; if (data == null) return;
deleteButton.setDisabled(data.questItem); deleteButton.setDisabled(data.questItem);
boolean isInPoi = MapStage.getInstance().isInMap(); boolean isInPoi = MapStage.getInstance().isInMap();
useButton.setDisabled(!(isInPoi&&data.usableInPoi||!isInPoi&&data.usableOnWorldMap)); useButton.setDisabled(!(isInPoi && data.usableInPoi || !isInPoi && data.usableOnWorldMap));
if(data.shardsNeeded==0) if (data.shardsNeeded == 0)
useButton.setText("Use"); useButton.setText("Use");
else else
useButton.setText("Use "+data.shardsNeeded+"[+Shards]"); useButton.setText("Use " + data.shardsNeeded + "[+Shards]");
useButton.layout(); useButton.layout();
if(Current.player().getShards()<data.shardsNeeded) if (Current.player().getShards() < data.shardsNeeded)
useButton.setDisabled(true); useButton.setDisabled(true);
if(data.equipmentSlot==null|| data.equipmentSlot.equals("")) if (data.equipmentSlot == null || data.equipmentSlot.equals("")) {
{
equipButton.setDisabled(true); equipButton.setDisabled(true);
} } else {
else
{
equipButton.setDisabled(false); equipButton.setDisabled(false);
if(equipButton instanceof TextraButton) if (equipButton instanceof TextraButton) {
{ TextraButton button = (TextraButton) equipButton;
TextraButton button=(TextraButton) equipButton; String item = Current.player().itemInSlot(data.equipmentSlot);
String item=Current.player().itemInSlot(data.equipmentSlot); if (item != null && item.equals(data.name)) {
if(item!=null&&item.equals(data.name))
{
button.setText("Unequip"); button.setText("Unequip");
} } else {
else
{
button.setText("Equip"); button.setText("Equip");
} }
button.layout(); button.layout();
} }
} }
for(Button button:inventoryButtons) for (Button button : inventoryButtons) {
{ if (actor != button && button.isChecked()) {
if(actor!=button&&button.isChecked()){
button.setChecked(false); button.setChecked(false);
} }
} }
itemDescription.setText(data.name+"\n"+data.getDescription()); itemDescription.setText(data.name + "\n" + data.getDescription());
itemDescription.setWrap(true); itemDescription.setWrap(true);
itemDescription.layout(); itemDescription.layout();
} }
private void updateInventory() { private void updateInventory() {
clearSelectable(); clearSelectable();
inventoryButtons.clear(); inventoryButtons.clear();
inventory.clear(); inventory.clear();
for(int i=0;i<Current.player().getItems().size;i++) { for (int i = 0; i < Current.player().getItems().size; i++) {
if(i%columns==0) if (i % columns == 0)
inventory.row(); inventory.row();
Button newActor=createInventorySlot(); Button newActor = createInventorySlot();
inventory.add(newActor).top().left().space(1); inventory.add(newActor).top().left().space(1);
addToSelectable(new Selectable(newActor){ addToSelectable(new Selectable(newActor) {
@Override @Override
public void onSelect(UIScene scene) { public void onSelect(UIScene scene) {
setSelected(newActor); setSelected(newActor);
@@ -254,47 +233,43 @@ public class InventoryScene extends UIScene {
} }
}); });
inventoryButtons.add(newActor); inventoryButtons.add(newActor);
ItemData item=ItemData.getItem(Current.player().getItems().get(i)); ItemData item = ItemData.getItem(Current.player().getItems().get(i));
if(item==null) if (item == null) {
{ System.err.print("Can not find item name " + Current.player().getItems().get(i) + "\n");
System.err.print("Can not find item name "+Current.player().getItems().get(i)+"\n");
continue; continue;
} }
if(item.sprite()==null) if (item.sprite() == null) {
{ System.err.print("Can not find sprite name " + item.iconName + "\n");
System.err.print("Can not find sprite name "+item.iconName+"\n");
continue; continue;
} }
Image img=new Image(item.sprite()); Image img = new Image(item.sprite());
img.setX((newActor.getWidth()-img.getWidth())/2); img.setX((newActor.getWidth() - img.getWidth()) / 2);
img.setY((newActor.getHeight()-img.getHeight())/2); img.setY((newActor.getHeight() - img.getHeight()) / 2);
newActor.addActor(img); newActor.addActor(img);
itemLocation.put(newActor,Current.player().getItems().get(i)); itemLocation.put(newActor, Current.player().getItems().get(i));
if(Current.player().getEquippedItems().contains(item.name)) if (Current.player().getEquippedItems().contains(item.name)) {
{ Image overlay = new Image(equipOverlay);
Image overlay=new Image(equipOverlay); overlay.setX((newActor.getWidth() - img.getWidth()) / 2);
overlay.setX((newActor.getWidth()-img.getWidth())/2); overlay.setY((newActor.getHeight() - img.getHeight()) / 2);
overlay.setY((newActor.getHeight()-img.getHeight())/2);
newActor.addActor(overlay); newActor.addActor(overlay);
} }
newActor.addListener(new ChangeListener() { newActor.addListener(new ChangeListener() {
@Override @Override
public void changed(ChangeEvent event, Actor actor) { public void changed(ChangeEvent event, Actor actor) {
if(((Button) actor).isChecked()) if (((Button) actor).isChecked()) {
{
setSelected((Button) actor); setSelected((Button) actor);
} }
} }
}); });
} }
for(Map.Entry<String, Button> slot :equipmentSlots.entrySet()) { for (Map.Entry<String, Button> slot : equipmentSlots.entrySet()) {
if(slot.getValue().getChildren().size>=2) if (slot.getValue().getChildren().size >= 2)
slot.getValue().removeActorAt(1,false); slot.getValue().removeActorAt(1, false);
String equippedItem=Current.player().itemInSlot(slot.getKey()); String equippedItem = Current.player().itemInSlot(slot.getKey());
if(equippedItem == null || equippedItem.equals("")) if (equippedItem == null || equippedItem.equals(""))
continue; continue;
ItemData item = ItemData.getItem(equippedItem); ItemData item = ItemData.getItem(equippedItem);
if(item != null) { if (item != null) {
Image img = new Image(item.sprite()); Image img = new Image(item.sprite());
img.setX((slot.getValue().getWidth() - img.getWidth()) / 2); img.setX((slot.getValue().getWidth() - img.getWidth()) / 2);
img.setY((slot.getValue().getHeight() - img.getHeight()) / 2); img.setY((slot.getValue().getHeight() - img.getHeight()) / 2);
@@ -311,9 +286,7 @@ public class InventoryScene extends UIScene {
} }
public Button createInventorySlot() { public Button createInventorySlot() {
ImageButton button = new ImageButton(Controls.getSkin(), "item_frame");
ImageButton button=new ImageButton(Controls.getSkin(),"item_frame"); return button;
return button;
} }
} }

View File

@@ -56,8 +56,11 @@ public class SaveLoadScene extends UIScene {
private SaveLoadScene() { private SaveLoadScene() {
super(Forge.isLandscapeMode() ? "ui/save_load.json" : "ui/save_load_portrait.json"); super(Forge.isLandscapeMode() ? "ui/save_load.json" : "ui/save_load_portrait.json");
Table root = new Table();
layout = new Table(); layout = new Table();
stage.addActor(layout); scrollPane = new ScrollPane(layout);
Window window = ui.findActor("saveSlots");
window.add(root);
textInput = Controls.newTextField(""); textInput = Controls.newTextField("");
int c = 0; int c = 0;
String[] diffList = new String[Config.instance().getConfigData().difficulties.length]; String[] diffList = new String[Config.instance().getConfigData().difficulties.length];
@@ -78,9 +81,11 @@ public class SaveLoadScene extends UIScene {
playerLocation.setY(previewImage.getY() + 5); playerLocation.setY(previewImage.getY() + 5);
ui.addActor(playerLocation); ui.addActor(playerLocation);
header = Controls.newTextraLabel(Forge.getLocalizer().getMessage("lblSave")); header = Controls.newTextraLabel(Forge.getLocalizer().getMessage("lblSave"));
header.setAlignment(Align.center); root.row();
layout.add(header).pad(2).colspan(4).align(Align.center).expandX(); root.add(header).grow();
layout.row(); root.add(difficulty);
root.row();
root.add(scrollPane).colspan(2).width(window.getWidth() - 20);
autoSave = addSaveSlot(Forge.getLocalizer().getMessage("lblAutoSave"), WorldSave.AUTO_SAVE_SLOT); autoSave = addSaveSlot(Forge.getLocalizer().getMessage("lblAutoSave"), WorldSave.AUTO_SAVE_SLOT);
quickSave = addSaveSlot(Forge.getLocalizer().getMessage("lblQuickSave"), WorldSave.QUICK_SAVE_SLOT); quickSave = addSaveSlot(Forge.getLocalizer().getMessage("lblQuickSave"), WorldSave.QUICK_SAVE_SLOT);
for (int i = 1; i < NUMBEROFSAVESLOTS; i++) for (int i = 1; i < NUMBEROFSAVESLOTS; i++)
@@ -91,10 +96,6 @@ public class SaveLoadScene extends UIScene {
ui.onButtonPress("save", () -> SaveLoadScene.this.loadSave()); ui.onButtonPress("save", () -> SaveLoadScene.this.loadSave());
back = ui.findActor("return"); back = ui.findActor("return");
ui.onButtonPress("return", () -> SaveLoadScene.this.back()); ui.onButtonPress("return", () -> SaveLoadScene.this.back());
scrollPane = ui.findActor("saveSlots");
scrollPane.setActor(layout);
ui.addActor(difficulty);
difficulty.setSelectedIndex(1); difficulty.setSelectedIndex(1);
difficulty.setAlignment(Align.center); difficulty.setAlignment(Align.center);
difficulty.getStyle().fontColor = Color.GOLD; difficulty.getStyle().fontColor = Color.GOLD;
@@ -137,7 +138,6 @@ public class SaveLoadScene extends UIScene {
super.onSelect(scene); super.onSelect(scene);
updateSlot(slotNumber); updateSlot(slotNumber);
} }
} }
private Selectable<TextraButton> addSaveSlot(String name, int i) { private Selectable<TextraButton> addSaveSlot(String name, int i) {
@@ -151,7 +151,6 @@ public class SaveLoadScene extends UIScene {
} }
public boolean select(int slot) { public boolean select(int slot) {
if (!buttons.containsKey(slot)) if (!buttons.containsKey(slot))
return false; return false;
@@ -193,7 +192,6 @@ public class SaveLoadScene extends UIScene {
if (previewDate != null) if (previewDate != null)
previewDate.setVisible(false); previewDate.setVisible(false);
} }
return true; return true;
} }
@@ -247,7 +245,6 @@ public class SaveLoadScene extends UIScene {
Forge.clearTransitionScreen(); Forge.clearTransitionScreen();
} }
break; break;
} }
} }
@@ -281,7 +278,6 @@ public class SaveLoadScene extends UIScene {
for (File name : names) { for (File name : names) {
if (WorldSave.isSafeFile(name.getName())) { if (WorldSave.isSafeFile(name.getName())) {
try { try {
try (FileInputStream fos = new FileInputStream(name.getAbsolutePath()); try (FileInputStream fos = new FileInputStream(name.getAbsolutePath());
InflaterInputStream inf = new InflaterInputStream(fos); InflaterInputStream inf = new InflaterInputStream(fos);
ObjectInputStream oos = new ObjectInputStream(inf)) { ObjectInputStream oos = new ObjectInputStream(inf)) {
@@ -298,10 +294,7 @@ public class SaveLoadScene extends UIScene {
} }
previews.put(slot, header); previews.put(slot, header);
} }
} catch (ClassNotFoundException | IOException | GdxRuntimeException e) { } catch (ClassNotFoundException | IOException | GdxRuntimeException e) {
} }
} }
} }
@@ -353,5 +346,4 @@ public class SaveLoadScene extends UIScene {
} }
super.enter(); super.enter();
} }
} }

View File

@@ -43,7 +43,7 @@
<dependency> <dependency>
<groupId>com.github.tommyettinger</groupId> <groupId>com.github.tommyettinger</groupId>
<artifactId>textratypist</artifactId> <artifactId>textratypist</artifactId>
<version>0.7.8</version> <version>0.7.9</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.thoughtworks.xstream</groupId> <groupId>com.thoughtworks.xstream</groupId>

View File

@@ -10,7 +10,7 @@
"height": 270 "height": 270
}, },
{ {
"type": "Scroll", "type": "Window",
"name": "saveSlots", "name": "saveSlots",
"x": 15, "x": 15,
"y": 18, "y": 18,

View File

@@ -10,7 +10,7 @@
"height": 480 "height": 480
}, },
{ {
"type": "Scroll", "type": "Window",
"name": "saveSlots", "name": "saveSlots",
"x": 10, "x": 10,
"y": 106, "y": 106,