/* * Pixel Dungeon * Copyright (C) 2012-2015 Oleg Dolya * * Shattered Pixel Dungeon * Copyright (C) 2014-2015 Evan Debenham * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see */ package com.shatteredpixel.shatteredpixeldungeon.ui; import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon; import com.shatteredpixel.shatteredpixeldungeon.levels.traps.Trap; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoTrap; import com.watabou.noosa.Game; import com.watabou.noosa.Gizmo; import com.watabou.noosa.Image; import com.watabou.noosa.ui.Button; import com.watabou.noosa.ui.Component; import com.shatteredpixel.shatteredpixeldungeon.Assets; import com.shatteredpixel.shatteredpixeldungeon.Dungeon; import com.shatteredpixel.shatteredpixeldungeon.DungeonTilemap; import com.shatteredpixel.shatteredpixeldungeon.actors.Actor; import com.shatteredpixel.shatteredpixeldungeon.actors.mobs.Mob; import com.shatteredpixel.shatteredpixeldungeon.items.Heap; import com.shatteredpixel.shatteredpixeldungeon.items.Item; import com.shatteredpixel.shatteredpixeldungeon.levels.Level; import com.shatteredpixel.shatteredpixeldungeon.plants.Plant; import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector; import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene; import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite; import com.shatteredpixel.shatteredpixeldungeon.windows.WndCatalogus; import com.shatteredpixel.shatteredpixeldungeon.windows.WndHero; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoCell; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoItem; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoMob; import com.shatteredpixel.shatteredpixeldungeon.windows.WndInfoPlant; import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag; import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage; import com.shatteredpixel.shatteredpixeldungeon.windows.WndTradeItem; public class Toolbar extends Component { private Tool btnWait; private Tool btnSearch; private Tool btnInventory; private Tool[] btnQuick; public static int slots; public static boolean flipped; private PickedUpItem pickedUp; private boolean lastEnabled = true; private static boolean examining = false; public Toolbar() { super(); slots = ShatteredPixelDungeon.quickSlots(); flipped = ShatteredPixelDungeon.flippedUI(); height = btnInventory.height(); } @Override protected void createChildren() { add(btnWait = new Tool(24, 0, 20, 26) { @Override protected void onClick() { Dungeon.hero.rest(false); } protected boolean onLongClick() { Dungeon.hero.rest(true); return true; } ; }); add(btnSearch = new Tool(44, 0, 20, 26) { @Override protected void onClick() { if (!examining) { GameScene.selectCell(informer); examining = true; } else { informer.onSelect(null); Dungeon.hero.search(true); } } }); btnQuick = new Tool[4]; add( btnQuick[3] = new QuickslotTool( 64, 0, 22, 24, 3) ); add( btnQuick[2] = new QuickslotTool( 64, 0, 22, 24, 2) ); add(btnQuick[1] = new QuickslotTool(64, 0, 22, 24, 1)); add(btnQuick[0] = new QuickslotTool(64, 0, 22, 24, 0)); add(btnInventory = new Tool(0, 0, 24, 26) { private GoldIndicator gold; @Override protected void onClick() { GameScene.show(new WndBag(Dungeon.hero.belongings.backpack, null, WndBag.Mode.ALL, null)); } protected boolean onLongClick() { GameScene.show(new WndCatalogus()); return true; } ; @Override protected void createChildren() { super.createChildren(); gold = new GoldIndicator(); add(gold); } ; @Override protected void layout() { super.layout(); gold.fill(this); } ; }); add(pickedUp = new PickedUpItem()); } @Override protected void layout() { int[] visible = new int[4]; for(int i = 0; i <= 3; i++) visible[i] = (int)((slots > i) ? y+2 : y+25); for(int i = 0; i <= 3; i++) btnQuick[i].visible = slots > i; if (!flipped) { btnWait.setPos(x, y); btnSearch.setPos(btnWait.right(), y); btnInventory.setPos(width - btnInventory.width(), y); int ofs = (slots == 4 && btnInventory.left() - btnSearch.right() < 90) ? 2 : 0; btnQuick[0].setPos(btnInventory.left() - btnQuick[0].width() + ofs, visible[0]); btnQuick[1].setPos(btnQuick[0].left() - btnQuick[1].width() + ofs, visible[1]); btnQuick[2].setPos(btnQuick[1].left() - btnQuick[2].width() + ofs, visible[2]); btnQuick[3].setPos(btnQuick[2].left() - btnQuick[3].width() + ofs, visible[3]); } else { btnWait.setPos(width - btnWait.width(), y); btnSearch.setPos(btnWait.left() - btnSearch.width(), y); btnInventory.setPos(x, y); int ofs = (slots == 4 && btnSearch.left() - btnInventory.right() < 90) ? 2 : 0; btnQuick[0].setPos(btnInventory.right() - ofs, visible[0]); btnQuick[1].setPos(btnQuick[0].right() - ofs, visible[1]); btnQuick[2].setPos(btnQuick[1].right() - ofs, visible[2]); btnQuick[3].setPos(btnQuick[2].right() - ofs, visible[3]); } } @Override public void update() { super.update(); if (lastEnabled != Dungeon.hero.ready) { lastEnabled = Dungeon.hero.ready; for (Gizmo tool : members) { if (tool instanceof Tool) { ((Tool)tool).enable( lastEnabled ); } } } if (!Dungeon.hero.isAlive()) { btnInventory.enable(true); } //check if visible slots or UI flipping has changed. if ((slots == 0 && btnQuick[0].visible) || (slots != 0 && !btnQuick[slots-1].visible)){ layout(); } else if (flipped && btnWait.left() == 0 || !flipped && btnInventory.left() == 0){ layout(); } } public void pickup( Item item ) { pickedUp.reset( item, btnInventory.centerX(), btnInventory.centerY() ); } private static CellSelector.Listener informer = new CellSelector.Listener() { @Override public void onSelect( Integer cell ) { examining = false; if (cell == null) { return; } if (cell < 0 || cell > Level.LENGTH || (!Dungeon.level.visited[cell] && !Dungeon.level.mapped[cell])) { GameScene.show( new WndMessage( "You don't know what is there." ) ) ; return; } if (cell == Dungeon.hero.pos) { GameScene.show( new WndHero() ); return; } if (Dungeon.visible[cell]) { Mob mob = (Mob) Actor.findChar(cell); if (mob != null) { GameScene.show(new WndInfoMob(mob)); return; } Heap heap = Dungeon.level.heaps.get(cell); if (heap != null) { if (heap.type == Heap.Type.FOR_SALE && heap.size() == 1 && heap.peek().price() > 0) { GameScene.show(new WndTradeItem(heap, false)); } else { GameScene.show(new WndInfoItem(heap)); } return; } } Plant plant = Dungeon.level.plants.get( cell ); if (plant != null) { GameScene.show( new WndInfoPlant( plant ) ); return; } Trap trap = Dungeon.level.traps.get( cell ); if (trap != null && trap.visible) { GameScene.show( new WndInfoTrap( trap )); return; } GameScene.show( new WndInfoCell( cell ) ); } @Override public String prompt() { return "Select a cell to examine"; } }; private static class Tool extends Button { private static final int BGCOLOR = 0x7B8073; private Image base; public Tool( int x, int y, int width, int height ) { super(); base.frame( x, y, width, height ); this.width = width; this.height = height; } @Override protected void createChildren() { super.createChildren(); base = new Image( Assets.TOOLBAR ); add( base ); } @Override protected void layout() { super.layout(); base.x = x; base.y = y; } @Override protected void onTouchDown() { base.brightness( 1.4f ); } @Override protected void onTouchUp() { if (active) { base.resetColor(); } else { base.tint( BGCOLOR, 0.7f ); } } public void enable( boolean value ) { if (value != active) { if (value) { base.resetColor(); } else { base.tint( BGCOLOR, 0.7f ); } active = value; } } } private static class QuickslotTool extends Tool { private QuickSlotButton slot; public QuickslotTool( int x, int y, int width, int height, int slotNum ) { super( x, y, width, height ); slot = new QuickSlotButton( slotNum ); add( slot ); } @Override protected void layout() { super.layout(); slot.setRect( x + 2, y + 2, width - 4, height - 3 ); } @Override public void enable( boolean value ) { super.enable( value ); slot.enable( value ); } } private static class PickedUpItem extends ItemSprite { private static final float DISTANCE = DungeonTilemap.SIZE; private static final float DURATION = 0.2f; private float dstX; private float dstY; private float left; public PickedUpItem() { super(); originToCenter(); active = visible = false; } public void reset( Item item, float dstX, float dstY ) { view( item ); active = visible = true; this.dstX = dstX - ItemSprite.SIZE / 2; this.dstY = dstY - ItemSprite.SIZE / 2; left = DURATION; x = this.dstX - DISTANCE; y = this.dstY - DISTANCE; alpha( 1 ); } @Override public void update() { super.update(); if ((left -= Game.elapsed) <= 0) { visible = active = false; if (emitter != null) emitter.on = false; } else { float p = left / DURATION; scale.set( (float)Math.sqrt( p ) ); float offset = DISTANCE * p; x = dstX - offset; y = dstY - offset; } } } }