diff --git a/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java b/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java index 09378b7e7..ed3cb56e7 100644 --- a/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java +++ b/engine/src/main/java/org/destinationsol/game/item/ItemContainer.java @@ -130,11 +130,12 @@ public List getSelectionAfterRemove(List selected) { if (selected.size() > 1) { return selected; } - int idx = groups.indexOf(selected) + 1; - if (idx <= 0 || idx >= groupCount()) { + int groupCount = groupCount(); + int idx = groups.indexOf(selected); + if (idx <= 0 || groupCount <= 1) { return null; } - return groups.get(idx); + return groups.get(idx == (groupCount - 1) ? idx - 1 : idx + 1); } public SolItem getRandom() { diff --git a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java index c556a8dc4..2252348d4 100644 --- a/engine/src/main/java/org/destinationsol/game/ship/SolShip.java +++ b/engine/src/main/java/org/destinationsol/game/ship/SolShip.java @@ -580,6 +580,10 @@ public boolean maybeUnequip(SolGame game, SolItem item, boolean unequip) { } public boolean maybeUnequip(SolGame game, SolItem item, boolean secondarySlot, boolean unequip) { + if (item == null) { + return false; + } + if (!secondarySlot) { if (myHull.getEngine() == item) { if (unequip) { diff --git a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java index 3ca548f90..633286059 100644 --- a/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java +++ b/engine/src/main/java/org/destinationsol/ui/nui/screens/InventoryScreen.java @@ -73,6 +73,7 @@ public class InventoryScreen extends NUIScreenLayer { private ColumnLayout inventoryActionButtons; private UIWarnButton closeButton; private InventoryOperationsScreen inventoryOperations; + private List selectedItemGroup; private int selectedIndex; private int page; @@ -102,6 +103,7 @@ public void initialise() { nextButton.subscribe(button -> { nextPage(button); selectedIndex = 0; + selectedItemGroup = null; updateItemRows(); }); @@ -110,6 +112,7 @@ public void initialise() { previousButton.subscribe(button -> { previousPage(button); selectedIndex = 0; + selectedItemGroup = null; updateItemRows(); }); @@ -250,8 +253,11 @@ public boolean onKeyEvent(NUIKeyEvent event) { selectedIndex--; previousButton.getClickSound().play(previousButton.getClickVolume()); } + selectedItemGroup = null; - items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + if (items.groupCount() > 0) { + items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + } updateItemRows(); return true; @@ -268,8 +274,11 @@ public boolean onKeyEvent(NUIKeyEvent event) { selectedIndex++; nextButton.getClickSound().play(nextButton.getClickVolume()); } + selectedItemGroup = null; - items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + if (items.groupCount() > 0) { + items.seen(items.getGroup(selectedIndex + page * Const.ITEM_GROUPS_PER_PAGE)); + } updateItemRows(); return true; @@ -314,18 +323,7 @@ public SolItem getSelectedItem() { * @param itemGroup the item group to select */ public void setSelected(List itemGroup) { - ItemContainer items = inventoryOperations.getItems(solApplication.getGame()); - if (!items.containsGroup(itemGroup)) { - selectedIndex = 0; - } else { - for (int groupNo = 0; groupNo < items.groupCount(); groupNo++) { - if (items.getGroup(groupNo) == itemGroup) { - page = groupNo / Const.ITEM_GROUPS_PER_PAGE; - selectedIndex = groupNo % Const.ITEM_GROUPS_PER_PAGE; - } - } - } - + selectedItemGroup = itemGroup; updateItemRows(); } @@ -537,6 +535,17 @@ private UIWidget createItemRow(int index) { public void updateItemRows() { ItemContainer items = inventoryOperations.getItems(solApplication.getGame()); + if (selectedItemGroup != null && items.containsGroup(selectedItemGroup)) { + for (int groupNo = 0; groupNo < items.groupCount(); groupNo++) { + if (items.getGroup(groupNo) == selectedItemGroup) { + page = groupNo / Const.ITEM_GROUPS_PER_PAGE; + selectedIndex = groupNo % Const.ITEM_GROUPS_PER_PAGE; + } + } + } else { + selectedItemGroup = items.groupCount() < selectedIndex ? items.getGroup(selectedIndex) : null; + } + Iterator rowsIterator = inventoryRows.iterator(); rowsIterator.next(); // Ignore the first row, since it's the header. UIWidget row = rowsIterator.next();