v0.2.3e: refactored quick slot button, should now support multiple instances of itself tied to different quickslots, needs testing

This commit is contained in:
Evan Debenham 2015-01-20 17:26:53 -05:00
parent 18580f7f0b
commit 2b44154ac1
16 changed files with 86 additions and 82 deletions

View File

@ -23,7 +23,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Gold;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.items.artifacts.Artifact;
import com.shatteredpixel.shatteredpixeldungeon.items.weapon.missiles.MissileWeapon;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.watabou.noosa.Game;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
@ -86,7 +86,7 @@ public class Bones {
item = hero.belongings.misc2;
break;
case 4:
item = QuickSlot.getItem();
item = Dungeon.quickslot.randomNonePlaceholder();
break;
}
if (item != null && !item.bones)

View File

@ -3,6 +3,7 @@ package com.shatteredpixel.shatteredpixeldungeon;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
import com.watabou.utils.Random;
import java.util.ArrayList;
import java.util.Collection;
@ -77,6 +78,16 @@ public class QuickSlot {
setSlot( i , placeholder );
}
public Item randomNonePlaceholder(){
ArrayList<Item> result = new ArrayList<Item>();
for (int i = 0; i < slots.size(); i ++)
if (slots.get(i) != null && !isPlaceholder(i))
result.add(slots.get(i));
return Random.element(result);
}
private final String PLACEHOLDERS = "placeholders";
private final String PLACEMENTS = "placements";

View File

@ -98,7 +98,7 @@ import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.HeroSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.AttackIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndMessage;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndResurrect;
@ -879,7 +879,7 @@ public class Hero extends Char {
wand.curCharges++;
if (Dungeon.quickslot.contains(wand)) {
QuickSlot.refresh();
QuickSlotButton.refresh();
}
ScrollOfRecharging.charge( this );

View File

@ -21,14 +21,12 @@ import java.util.ArrayList;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.HeroClass;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.watabou.noosa.audio.Sample;
import com.shatteredpixel.shatteredpixeldungeon.Assets;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.effects.Speck;
import com.shatteredpixel.shatteredpixeldungeon.effects.particles.ShaftParticle;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite.Glowing;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
@ -111,7 +109,7 @@ public class DewVial extends Item {
Sample.INSTANCE.play( Assets.SND_DRINK );
hero.sprite.operate( hero.pos );
QuickSlot.refresh();
QuickSlotButton.refresh();
} else {
@ -125,7 +123,7 @@ public class DewVial extends Item {
}
}
public void empty() {volume = 0; QuickSlot.refresh();}
public void empty() {volume = 0; QuickSlotButton.refresh();}
@Override
public boolean isUpgradable() {
@ -150,12 +148,12 @@ public class DewVial extends Item {
GLog.p( TXT_FULL );
}
QuickSlot.refresh();
QuickSlotButton.refresh();
}
public void fill() {
volume = MAX_VOLUME;
QuickSlot.refresh();
QuickSlotButton.refresh();
}
//removed as people need a bigger distinction to realize the dew vial doesn't revive.

View File

@ -32,7 +32,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.MissileSprite;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
import com.watabou.noosa.audio.Sample;
@ -179,7 +179,7 @@ public class Item implements Bundlable {
items.add( this );
Dungeon.quickslot.replaceSimilar(this);
QuickSlot.refresh();
QuickSlotButton.refresh();
Collections.sort( items, itemComparator );
return true;
@ -234,12 +234,12 @@ public class Item implements Bundlable {
public final Item detachAll( Bag container ) {
Dungeon.quickslot.clearItem( this );
QuickSlot.refresh();
QuickSlotButton.refresh();
for (Item item : container.items) {
if (item == this) {
container.items.remove( this );
item.onDetach( );
container.items.remove(this);
item.onDetach();
return this;
} else if (item instanceof Bag) {
Bag bag = (Bag)item;
@ -398,7 +398,7 @@ public class Item implements Bundlable {
public void updateQuickslot() {
if (Dungeon.quickslot.contains( this )) {
QuickSlot.refresh();
QuickSlotButton.refresh();
}
}
@ -455,7 +455,7 @@ public class Item implements Bundlable {
user.busy();
Char enemy = Actor.findChar( cell );
QuickSlot.target( this, enemy );
QuickSlotButton.target(enemy);
float delay = TIME_TO_THROW;
if (this instanceof MissileWeapon) {

View File

@ -22,7 +22,7 @@ import java.util.ArrayList;
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
@ -61,7 +61,7 @@ public class KindOfWeapon extends EquipableItem {
hero.belongings.weapon = this;
activate( hero );
QuickSlot.refresh();
QuickSlotButton.refresh();
cursedKnown = true;
if (cursed) {

View File

@ -4,7 +4,7 @@ import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
import com.shatteredpixel.shatteredpixeldungeon.actors.Char;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Random;
@ -60,7 +60,7 @@ public class CapeOfThorns extends Artifact {
BuffIndicator.refreshHero();
GLog.w("Your Cape becomes inert again.");
}
QuickSlot.refresh();
QuickSlotButton.refresh();
}
spend(TICK);
return true;
@ -92,7 +92,7 @@ public class CapeOfThorns extends Artifact {
}
}
QuickSlot.refresh();
QuickSlotButton.refresh();
return damage;
}

View File

@ -8,7 +8,7 @@ import com.shatteredpixel.shatteredpixeldungeon.actors.hero.Hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.BuffIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.noosa.audio.Sample;
import com.watabou.noosa.tweeners.AlphaTweener;
@ -185,7 +185,7 @@ public class CloakOfShadows extends Artifact {
if (cooldown > 0)
cooldown --;
QuickSlot.refresh();
QuickSlotButton.refresh();
spend( TICK );
@ -227,7 +227,7 @@ public class CloakOfShadows extends Artifact {
GLog.p("Your Cloak Grows Stronger!");
}
QuickSlot.refresh();
QuickSlotButton.refresh();
spend( TICK );
@ -247,7 +247,7 @@ public class CloakOfShadows extends Artifact {
cooldown = 10 - (level / 3);
QuickSlot.refresh();
QuickSlotButton.refresh();
super.detach();
}
}

View File

@ -19,7 +19,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.GhostSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndQuest;
import com.watabou.noosa.audio.Sample;
@ -211,7 +211,7 @@ public class DriedRose extends Artifact {
}
QuickSlot.refresh();
QuickSlotButton.refresh();
spend( TICK );

View File

@ -10,7 +10,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.CharSprite;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndOptions;
import com.watabou.noosa.audio.Sample;
@ -202,7 +202,7 @@ public class TimekeepersHourglass extends Artifact {
} else if (cursed && Random.Int(10) == 0)
((Hero) target).spend( TICK );
QuickSlot.refresh();
QuickSlotButton.refresh();
spend( TICK );
@ -226,7 +226,7 @@ public class TimekeepersHourglass extends Artifact {
target.invisible++;
QuickSlot.refresh();
QuickSlotButton.refresh();
Dungeon.observe();
@ -262,7 +262,7 @@ public class TimekeepersHourglass extends Artifact {
charge --;
}
QuickSlot.refresh();
QuickSlotButton.refresh();
if (charge <= 0){
detach();
@ -301,7 +301,7 @@ public class TimekeepersHourglass extends Artifact {
GameScene.freezeEmitters = false;
charge = 0;
QuickSlot.refresh();
QuickSlotButton.refresh();
super.detach();
activeBuff = null;
}

View File

@ -13,7 +13,7 @@ import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfMagicMappi
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
import com.watabou.noosa.audio.Sample;
@ -197,7 +197,7 @@ public class UnstableSpellbook extends Artifact {
}
}
QuickSlot.refresh();
QuickSlotButton.refresh();
spend( TICK );

View File

@ -39,7 +39,7 @@ import com.shatteredpixel.shatteredpixeldungeon.mechanics.Ballistica;
import com.shatteredpixel.shatteredpixeldungeon.scenes.CellSelector;
import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.GLog;
import com.watabou.utils.Bundle;
import com.watabou.utils.Callback;
@ -410,7 +410,7 @@ public abstract class Wand extends KindOfWeapon {
final int cell = Ballistica.cast( curUser.pos, target, true, curWand.hitChars );
curUser.sprite.zap( cell );
QuickSlot.target( curItem, Actor.findChar( cell ) );
QuickSlotButton.target(Actor.findChar(cell));
if (curWand.curCharges > 0) {

View File

@ -22,7 +22,6 @@ import java.io.IOException;
import com.shatteredpixel.shatteredpixeldungeon.*;
import com.watabou.noosa.Camera;
import com.watabou.noosa.Game;
import com.watabou.noosa.Gizmo;
import com.watabou.noosa.Group;
import com.watabou.noosa.SkinnedBlock;
import com.watabou.noosa.Visual;
@ -57,7 +56,7 @@ import com.shatteredpixel.shatteredpixeldungeon.ui.Banner;
import com.shatteredpixel.shatteredpixeldungeon.ui.BusyIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.GameLog;
import com.shatteredpixel.shatteredpixeldungeon.ui.HealthIndicator;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.ui.StatusPane;
import com.shatteredpixel.shatteredpixeldungeon.ui.Toast;
import com.shatteredpixel.shatteredpixeldungeon.ui.Toolbar;
@ -597,7 +596,7 @@ public class GameScene extends PixelScene {
public static void ready() {
selectCell( defaultCellListener );
QuickSlot.cancel();
QuickSlotButton.cancel();
}
private static final CellSelector.Listener defaultCellListener = new CellSelector.Listener() {

View File

@ -28,28 +28,30 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.GameScene;
import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.windows.WndBag;
//TODO: add proper multi-quickslot functionality.
public class QuickSlot extends Button implements WndBag.Listener {
//TODO: investigate targeting with multiple quickslots
public class QuickSlotButton extends Button implements WndBag.Listener {
private static final String TXT_SELECT_ITEM = "Select an item for the quickslot";
private static QuickSlot instance;
private static QuickSlotButton[] instance = new QuickSlotButton[4];
private int slotNum;
private Item itemInSlot;
private ItemSlot slot;
private Image crossB;
private Image crossM;
private static Image crossB;
private static Image crossM;
private boolean targeting = false;
private static boolean targeting = false;
private Item lastItem = null;
private Char lastTarget= null;
private static Char lastTarget= null;
public QuickSlot() {
public QuickSlotButton( int slotNum ) {
super();
item( select() );
this.slotNum = slotNum;
item( select( slotNum ) );
instance = this;
instance[slotNum] = this;
}
@Override
@ -72,18 +74,14 @@ public class QuickSlot extends Button implements WndBag.Listener {
if (targeting) {
GameScene.handleCell( lastTarget.pos );
} else {
Item item = select();
if (item == lastItem) {
useTargeting();
} else {
lastItem = item;
}
Item item = select(slotNum);
useTargeting();
item.execute( Dungeon.hero );
}
}
@Override
protected boolean onLongClick() {
return QuickSlot.this.onLongClick();
return QuickSlotButton.this.onLongClick();
}
@Override
protected void onTouchDown() {
@ -124,21 +122,15 @@ public class QuickSlot extends Button implements WndBag.Listener {
GameScene.selectItem( this, WndBag.Mode.QUICKSLOT, TXT_SELECT_ITEM );
return true;
}
@SuppressWarnings("unchecked")
private static Item select() {
return Dungeon.quickslot.getItem(0);
}
public static Item getItem(){
Item item = select();
return (item != null && item.quantity() != 0)? item : null;
}
private static Item select(int slotNum){
return Dungeon.quickslot.getItem( slotNum );
}
@Override
public void onSelect( Item item ) {
if (item != null) {
Dungeon.quickslot.setSlot( 0 , item );
Dungeon.quickslot.setSlot( slotNum , item );
refresh();
}
}
@ -181,24 +173,26 @@ public class QuickSlot extends Button implements WndBag.Listener {
}
public static void refresh() {
if (instance != null) {
instance.item( select() );
for (int i = 0; i < instance.length; i++) {
if (instance[i] != null) {
instance[i].item(select(i));
}
}
}
public static void target( Item item, Char target ) {
if (item == instance.lastItem && target != Dungeon.hero) {
instance.lastTarget = target;
public static void target( Char target ) {
if (target != Dungeon.hero) {
lastTarget = target;
HealthIndicator.instance.target( target );
}
}
public static void cancel() {
if (instance != null && instance.targeting) {
instance.crossB.visible = false;
instance.crossM.remove();
instance.targeting = false;
if (targeting) {
crossB.visible = false;
crossM.remove();
targeting = false;
}
}
}

View File

@ -275,17 +275,19 @@ public class Toolbar extends Component {
private static class QuickslotTool extends Tool {
private QuickSlot slot;
private QuickSlotButton slot;
private int slotNum;
public QuickslotTool( int x, int y, int width, int height ) {
public QuickslotTool( int x, int y, int width, int height, int slotNum ) {
super( x, y, width, height );
this.slotNum = slotNum;
}
@Override
protected void createChildren() {
super.createChildren();
slot = new QuickSlot();
slot = new QuickSlotButton( slotNum );
add( slot );
}

View File

@ -42,7 +42,7 @@ import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene;
import com.shatteredpixel.shatteredpixeldungeon.sprites.ItemSpriteSheet;
import com.shatteredpixel.shatteredpixeldungeon.ui.Icons;
import com.shatteredpixel.shatteredpixeldungeon.ui.ItemSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlot;
import com.shatteredpixel.shatteredpixeldungeon.ui.QuickSlotButton;
import com.shatteredpixel.shatteredpixeldungeon.utils.Utils;
import com.watabou.gltextures.TextureCache;
import com.watabou.noosa.BitmapText;
@ -396,7 +396,7 @@ public class WndBag extends WndTabbed {
if (listener == null && item.defaultAction != null) {
hide();
Dungeon.quickslot.setSlot( 0 , item );
QuickSlot.refresh();
QuickSlotButton.refresh();
return true;
} else {
return false;