v0.2.3e: tonnes of fixes relating to WIP multi-quickslot implementation

This commit is contained in:
Evan Debenham
2015-01-20 00:56:36 -05:00
parent e53c6b678f
commit 6e3c2223cd
13 changed files with 66 additions and 36 deletions
@@ -41,8 +41,6 @@ public class Belongings implements Iterable<Item> {
public Bag backpack;
public QuickSlot quickslot;
public KindOfWeapon weapon = null;
public Armor armor = null;
public KindofMisc misc1 = null;
@@ -71,8 +69,6 @@ public class Belongings implements Iterable<Item> {
bundle.put( ARMOR, armor );
bundle.put( MISC1, misc1);
bundle.put( MISC2, misc2);
quickslot.storePlaceholders( bundle );
}
public void restoreFromBundle( Bundle bundle ) {
@@ -96,8 +92,6 @@ public class Belongings implements Iterable<Item> {
if (misc2 != null) {
misc2.activate( owner );
}
quickslot.restorePlaceholders(bundle);
}
@SuppressWarnings("unchecked")
@@ -878,7 +878,7 @@ public class Hero extends Char {
if (wand.curCharges < wand.maxCharges && damage > 0) {
wand.curCharges++;
if (belongings.quickslot.contains(wand)) {
if (Dungeon.quickslot.contains(wand)) {
QuickSlot.refresh();
}
@@ -139,7 +139,7 @@ public enum HeroClass {
Dart darts = new Dart( 8 );
darts.identify().collect();
hero.belongings.quickslot.setSlot(0, darts);
Dungeon.quickslot.setSlot(0, darts);
new PotionOfStrength().setKnown();
}
@@ -150,7 +150,7 @@ public enum HeroClass {
WandOfMagicMissile wand = new WandOfMagicMissile();
wand.identify().collect();
hero.belongings.quickslot.setSlot(0, wand);
Dungeon.quickslot.setSlot(0, wand);
new ScrollOfIdentify().setKnown();
}
@@ -165,8 +165,8 @@ public enum HeroClass {
Dart darts = new Dart( 8 );
darts.identify().collect();
hero.belongings.quickslot.setSlot(0, cloak);
hero.belongings.quickslot.setSlot(1, darts);
Dungeon.quickslot.setSlot(0, cloak);
Dungeon.quickslot.setSlot(1, darts);
new ScrollOfMagicMapping().setKnown();
}
@@ -179,7 +179,7 @@ public enum HeroClass {
Boomerang boomerang = new Boomerang();
boomerang.identify().collect();
hero.belongings.quickslot.setSlot(0, boomerang);
Dungeon.quickslot.setSlot(0, boomerang);
}
public String title() {
@@ -1,107 +0,0 @@
package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
import com.watabou.utils.Bundlable;
import com.watabou.utils.Bundle;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* Created by debenhame on 16/01/2015.
*/
public class QuickSlot {
/**
* Slots contain objects which are also in a player's inventory.
* The one exception to this is when quantity is 0, which can
* happen for a stackable item that has been 'used up', these are refered to a placeholders.
*/
private ArrayList<Item> slots = new ArrayList<Item>();
public void setSlot(int slot, Item item){
slots.set(slot, item);
}
public Item getItem(int slot){
return slots.get(slot);
}
//TODO: this will currently only get the first occurance of an item, even if it's in multiple slots
//perhaps do not allow duplicate items in quickslots.
public int getSlot(Item item) {
return slots.indexOf(item);
}
public Boolean isPlaceholder(int slot){
return slots.get(slot) != null && slots.get(slot).quantity() == 0;
}
public void clearSlot(int slot){
setSlot(slot, null);
}
public void clearItem(Item item){
for (int i = 0; i < slots.size(); i++)
if (slots.get(i) == item)
clearSlot(i);
}
public void clear(){
slots = new ArrayList<Item>();
}
public boolean contains(Item item){
return slots.contains(item);
}
public void replaceSimilar(Item item){
for (int i = 0; i < slots.size(); i++)
if (item.isSimilar(slots.get(i)))
setSlot( i , item );
}
public void convertToPlaceholder(Item item){
Item placeholder = Item.virtual(item.getClass());
if (placeholder != null && slots.contains(item))
for (int i = 0; i < slots.size(); i++)
if (slots.get(i) == item)
setSlot( i , placeholder );
}
private final String PLACEHOLDERS = "placeholders";
private final String PLACEMENTS = "placements";
public void storePlaceholders(Bundle bundle){
ArrayList<Item> placeholders = new ArrayList<Item>(slots.size());
boolean[] placements = new boolean[slots.size()];
for (int i = 0; i < slots.size(); i++)
if (isPlaceholder(i)) {
placeholders.add(slots.get(i));
placements[i] = true;
}
bundle.put( PLACEHOLDERS, placeholders );
bundle.put( PLACEMENTS, placements );
}
//placements array is used as order is preserved while bundling, but exact index is not, so if we
//bundle both the placeholders (which preserves their order) an an array telling us where the placeholders are,
//we can reconstruct them perfectly.
public void restorePlaceholders(Bundle bundle){
Collection<Bundlable> placeholders = bundle.getCollection(PLACEHOLDERS);
boolean[] placements = bundle.getBooleanArray( PLACEMENTS );
int i = 0;
for (Bundlable item : placeholders){
while (placements[i] == false) i++;
setSlot( i, (Item)item );
i++;
}
}
}