diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java index a6f600337..76bb3b7b5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/npcs/Shopkeeper.java @@ -104,6 +104,7 @@ public class Shopkeeper extends NPC { } public static WndBag sell() { + //FIXME currently doesn't allow for repeated sales on new inventory pane return GameScene.selectItem( itemSelector ); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java index cdb902fbb..25ce8de52 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/items/spells/Alchemize.java @@ -89,6 +89,7 @@ public class Alchemize extends Spell { @Override public void onSelect( Item item ) { if (item != null) { + //FIXME currently doesn't allow for repeated alchemizes on new inventory pane WndBag parentWnd = GameScene.selectItem( itemSelector ); GameScene.show( new WndAlchemizeItem( item, parentWnd ) ); } @@ -214,8 +215,10 @@ public class Alchemize extends Spell { Sample.INSTANCE.play(Assets.Sounds.TELEPORT); if (curItem.quantity() <= 1){ curItem.detachAll(Dungeon.hero.belongings.backpack); - owner.hide(); - owner = null; + if (owner != null) { + owner.hide(); + owner = null; + } } else { curItem.detach(Dungeon.hero.belongings.backpack); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 4ebb97135..ce6a1a7b3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -369,22 +369,7 @@ public class GameScene extends PixelScene { boss.camera = uiCamera; boss.setPos( 6 + (uiCamera.width - boss.width())/2, 20); add(boss); - - toolbar = new Toolbar(); - toolbar.camera = uiCamera; - if (uiSize == 2) { - inventory = new InventoryPane(); - inventory.camera = uiCamera; - inventory.setPos(uiCamera.width - inventory.width(), uiCamera.height - inventory.height()); - add(inventory); - - toolbar.setRect( 0, uiCamera.height - toolbar.height() - inventory.height(), uiCamera.width, toolbar.height() ); - } else { - toolbar.setRect( 0, uiCamera.height - toolbar.height(), uiCamera.width, toolbar.height() ); - } - add( toolbar ); - attack = new AttackIndicator(); attack.camera = uiCamera; add( attack ); @@ -406,6 +391,21 @@ public class GameScene extends PixelScene { log.newLine(); add( log ); + toolbar = new Toolbar(); + toolbar.camera = uiCamera; + add( toolbar ); + + if (uiSize == 2) { + inventory = new InventoryPane(); + inventory.camera = uiCamera; + inventory.setPos(uiCamera.width - inventory.width(), uiCamera.height - inventory.height()); + add(inventory); + + toolbar.setRect( 0, uiCamera.height - toolbar.height() - inventory.height(), uiCamera.width, toolbar.height() ); + } else { + toolbar.setRect( 0, uiCamera.height - toolbar.height(), uiCamera.width, toolbar.height() ); + } + layoutTags(); switch (InterlevelScene.mode) { @@ -736,7 +736,7 @@ public class GameScene extends PixelScene { toDestroy.clear(); } - private Point lastOffset = null; + public static Point lastOffset = null; @Override public synchronized Gizmo erase (Gizmo g) { @@ -1196,11 +1196,18 @@ public class GameScene extends PixelScene { public static WndBag selectItem( WndBag.ItemSelector listener ) { cancelCellSelector(); - WndBag wnd = WndBag.getBag( listener ); - - if (scene != null) scene.addToFront( wnd ); + if (scene != null) { + if (scene.inventory != null && scene.inventory.visible){ + scene.inventory.setSelector(listener); + return null; + } else { + WndBag wnd = WndBag.getBag( listener ); + show(wnd); + return wnd; + } + } - return wnd; + return null; } public static boolean cancel() { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java index 28e70b640..4092e0638 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ui/InventoryPane.java @@ -30,11 +30,13 @@ import com.shatteredpixel.shatteredpixeldungeon.items.bags.MagicalHolster; import com.shatteredpixel.shatteredpixeldungeon.items.bags.PotionBandolier; import com.shatteredpixel.shatteredpixeldungeon.items.bags.ScrollHolder; import com.shatteredpixel.shatteredpixeldungeon.items.bags.VelvetPouch; +import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndUseItem; import com.watabou.gltextures.TextureCache; +import com.watabou.input.PointerEvent; import com.watabou.noosa.BitmapText; import com.watabou.noosa.ColorBlock; import com.watabou.noosa.Game; @@ -42,6 +44,7 @@ import com.watabou.noosa.Image; import com.watabou.noosa.NinePatch; import com.watabou.noosa.PointerArea; import com.watabou.noosa.ui.Component; +import com.watabou.utils.Point; import java.util.ArrayList; @@ -50,6 +53,9 @@ public class InventoryPane extends Component { private NinePatch bg; private NinePatch bg2; //2 backgrounds to reduce transparency + //used to prevent clicks through the BG normally, or to cancel selectors if they're enabled + private PointerArea blocker; + private static InventoryPane instance; private ArrayList equipped; @@ -59,6 +65,7 @@ public class InventoryPane extends Component { private BitmapText goldTxt; private Image energy; private BitmapText energyTxt; + private RenderedTextBlock promptTxt; private ArrayList bags; @@ -68,6 +75,8 @@ public class InventoryPane extends Component { private static final int SLOT_WIDTH = 17; private static final int SLOT_HEIGHT = 24; + private WndBag.ItemSelector selector; + public static Bag lastBag; private boolean lastEnabled = true; @@ -92,22 +101,34 @@ public class InventoryPane extends Component { bg2 = Chrome.get(Chrome.Type.TOAST_TR); add(bg2); - //blocks touches from going through BG into game scene - add (new PointerArea(bg)); + blocker = new PointerArea(0, 0, PixelScene.uiCamera.width, PixelScene.uiCamera.height){ + @Override + protected void onClick(PointerEvent event) { + if (selector != null){ + selector = null; + updateInventory(); + } + } + }; + blocker.target = bg; //targets bg when there is no selector, otherwise targets itself + add (blocker); equipped = new ArrayList<>(); for (int i = 0; i < 5; i++){ InventorySlot btn = new InventorySlot(null){ @Override protected void onClick() { + //any windows opened as a consequence of this button should be centered on the inventory + GameScene.lastOffset = new Point((int)InventoryPane.this.centerX() - camera.width/2, + (int)InventoryPane.this.centerY() - camera.height/2); if (lastBag != item && !lastBag.contains(item) && !item.isEquipped(Dungeon.hero)){ updateInventory(); + } else if (selector != null) { + selector.onSelect( item ); + selector = null; + updateInventory(); } else { - Window w = new WndUseItem( null, item ); - w.offset( (int)InventoryPane.this.centerX() - camera.width/2, - (int)InventoryPane.this.centerY() - camera.height/2 ); - w.boundOffsetWithMargin(3); - Game.scene().addToFront(w); + GameScene.show(new WndUseItem( null, item )); } } }; @@ -127,28 +148,26 @@ public class InventoryPane extends Component { energyTxt.hardlight(0x44CCFF); add(energyTxt); + promptTxt = PixelScene.renderTextBlock(6); + promptTxt.hardlight(Window.TITLE_COLOR); + add(promptTxt); + bagItems = new ArrayList<>(); for (int i = 0; i < 20; i++){ InventorySlot btn = new InventorySlot(null){ @Override protected void onClick() { + //any windows opened as a consequence of this button should be centered on the inventory + GameScene.lastOffset = new Point((int)InventoryPane.this.centerX() - camera.width/2, + (int)InventoryPane.this.centerY() - camera.height/2); if (lastBag != item && !lastBag.contains(item) && !item.isEquipped(Dungeon.hero)){ updateInventory(); + } else if (selector != null) { + selector.onSelect( item ); + selector = null; + updateInventory(); } else { - Window w = new WndUseItem( null, item ); - int xOfs, yOfs; - if (w.height > InventoryPane.this.height - 15){ - yOfs = (camera.height - w.height)/2 - 9; - } else { - yOfs = (int)(InventoryPane.this.y)/2; - } - if (w.width > InventoryPane.this.width - 15){ - xOfs = (camera.width - w.width)/2 - 9; - } else { - xOfs = (int)(InventoryPane.this.x)/2; - } - w.offset(xOfs, yOfs); - Game.scene().addToFront(w); + GameScene.show(new WndUseItem( null, item )); } } }; @@ -186,6 +205,13 @@ public class InventoryPane extends Component { left = i.right()+1; } + promptTxt.maxWidth((int) (width - (left - x) - bg.marginRight())); + if (promptTxt.height() > 10){ + promptTxt.setPos(left, y + 2 + (12 - promptTxt.height()) / 2); + } else { + promptTxt.setPos(left, y + 4 + (10 - promptTxt.height()) / 2); + } + goldTxt.x = left; goldTxt.y = y+5.5f; PixelScene.align(goldTxt); @@ -224,6 +250,12 @@ public class InventoryPane extends Component { } public void updateInventory(){ + if (selector == null){ + blocker.target = bg; + } else { + blocker.target = blocker; + } + Belongings stuff = Dungeon.hero.belongings; if (lastBag == null || !stuff.contains(lastBag)){ @@ -256,12 +288,23 @@ public class InventoryPane extends Component { } } - goldTxt.text(Integer.toString(Dungeon.gold)); - goldTxt.measure(); + if (selector == null) { + promptTxt.visible = false; - energyTxt.text(Integer.toString(Dungeon.energy)); - energyTxt.measure(); - energyTxt.visible = energy.visible = Dungeon.energy > 0; + goldTxt.text(Integer.toString(Dungeon.gold)); + goldTxt.measure(); + goldTxt.visible = gold.visible = true; + + energyTxt.text(Integer.toString(Dungeon.energy)); + energyTxt.measure(); + energyTxt.visible = energy.visible = Dungeon.energy > 0; + } else { + promptTxt.text(selector.textPrompt()); + promptTxt.visible = true; + + goldTxt.visible = gold.visible = false; + energyTxt.visible = energy.visible = false; + } ArrayList inventBags = stuff.getBags(); for (int i = 0; i < bags.size(); i++){ @@ -273,10 +316,14 @@ public class InventoryPane extends Component { } for (InventorySlot b : equipped){ - b.enable(lastEnabled && !(b.item() instanceof WndBag.Placeholder)); + b.enable(lastEnabled + && !(b.item() instanceof WndBag.Placeholder) + && (selector == null || selector.itemSelectable(b.item()))); } for (InventorySlot b : bagItems){ - b.enable(lastEnabled && b.item() != null); + b.enable(lastEnabled + && b.item() != null + && (selector == null || selector.itemSelectable(b.item()))); } for (BagButton b : bags){ b.enable(lastEnabled); @@ -290,6 +337,15 @@ public class InventoryPane extends Component { layout(); } + public void setSelector(WndBag.ItemSelector selector){ + this.selector = selector; + if (selector.preferredBag() != null) { + Bag preferred = Dungeon.hero.belongings.getItem(selector.preferredBag()); + if (preferred != null) lastBag = preferred; + } + updateInventory(); + } + @Override public synchronized void update() { super.update();