309 lines
6.9 KiB
Java
309 lines
6.9 KiB
Java
/*
|
|
* Pixel Dungeon
|
|
* Copyright (C) 2012-2014 Oleg Dolya
|
|
*
|
|
* 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 <http://www.gnu.org/licenses/>
|
|
*/
|
|
package com.shatteredpixel.shatteredpixeldungeon.actors.hero;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.KindofMisc;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.Item;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.KindOfWeapon;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.armor.Armor;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.bags.Bag;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.keys.IronKey;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.keys.Key;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.scrolls.ScrollOfRemoveCurse;
|
|
import com.shatteredpixel.shatteredpixeldungeon.items.wands.Wand;
|
|
import com.watabou.utils.Bundle;
|
|
import com.watabou.utils.Random;
|
|
|
|
public class Belongings implements Iterable<Item> {
|
|
|
|
public static final int BACKPACK_SIZE = 19;
|
|
|
|
private Hero owner;
|
|
|
|
public Bag backpack;
|
|
|
|
public KindOfWeapon weapon = null;
|
|
public Armor armor = null;
|
|
public KindofMisc misc1 = null;
|
|
public KindofMisc misc2 = null;
|
|
|
|
public Belongings( Hero owner ) {
|
|
this.owner = owner;
|
|
|
|
backpack = new Bag() {{
|
|
name = "backpack";
|
|
size = BACKPACK_SIZE;
|
|
}};
|
|
backpack.owner = owner;
|
|
}
|
|
|
|
private static final String WEAPON = "weapon";
|
|
private static final String ARMOR = "armor";
|
|
private static final String MISC1 = "misc1";
|
|
private static final String MISC2 = "misc2";
|
|
|
|
public void storeInBundle( Bundle bundle ) {
|
|
|
|
backpack.storeInBundle( bundle );
|
|
|
|
bundle.put( WEAPON, weapon );
|
|
bundle.put( ARMOR, armor );
|
|
bundle.put( MISC1, misc1);
|
|
bundle.put( MISC2, misc2);
|
|
}
|
|
|
|
public void restoreFromBundle( Bundle bundle ) {
|
|
|
|
backpack.clear();
|
|
backpack.restoreFromBundle( bundle );
|
|
|
|
if (bundle.get( WEAPON ) instanceof Wand){
|
|
//handles the case of an equipped wand from pre-0.3.0
|
|
Wand item = (Wand) bundle.get(WEAPON);
|
|
//try to add the wand to inventory
|
|
if (!item.collect(backpack)){
|
|
//if it's too full, shove it in anyway
|
|
backpack.items.add(item);
|
|
}
|
|
} else {
|
|
weapon = (KindOfWeapon) bundle.get(WEAPON);
|
|
if (weapon != null) {
|
|
weapon.activate(owner);
|
|
}
|
|
}
|
|
|
|
armor = (Armor)bundle.get( ARMOR );
|
|
|
|
misc1 = (KindofMisc)bundle.get(MISC1);
|
|
if (misc1 != null) {
|
|
misc1.activate( owner );
|
|
}
|
|
|
|
misc2 = (KindofMisc)bundle.get(MISC2);
|
|
if (misc2 != null) {
|
|
misc2.activate( owner );
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public<T extends Item> T getItem( Class<T> itemClass ) {
|
|
|
|
for (Item item : this) {
|
|
if (itemClass.isInstance( item )) {
|
|
return (T)item;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
public <T extends Key> T getKey( Class<T> kind, int depth ) {
|
|
|
|
for (Item item : backpack) {
|
|
if (item.getClass() == kind && ((Key)item).depth == depth) {
|
|
return (T)item;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public void countIronKeys() {
|
|
|
|
IronKey.curDepthQuantity = 0;
|
|
|
|
for (Item item : backpack) {
|
|
if (item instanceof IronKey && ((IronKey)item).depth == Dungeon.depth) {
|
|
IronKey.curDepthQuantity += item.quantity();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void identify() {
|
|
for (Item item : this) {
|
|
item.identify();
|
|
}
|
|
}
|
|
|
|
public void observe() {
|
|
if (weapon != null) {
|
|
weapon.identify();
|
|
Badges.validateItemLevelAquired( weapon );
|
|
}
|
|
if (armor != null) {
|
|
armor.identify();
|
|
Badges.validateItemLevelAquired( armor );
|
|
}
|
|
if (misc1 != null) {
|
|
misc1.identify();
|
|
Badges.validateItemLevelAquired(misc1);
|
|
}
|
|
if (misc2 != null) {
|
|
misc2.identify();
|
|
Badges.validateItemLevelAquired(misc2);
|
|
}
|
|
for (Item item : backpack) {
|
|
item.cursedKnown = true;
|
|
}
|
|
}
|
|
|
|
public void uncurseEquipped() {
|
|
ScrollOfRemoveCurse.uncurse( owner, armor, weapon, misc1, misc2);
|
|
}
|
|
|
|
public Item randomUnequipped() {
|
|
return Random.element( backpack.items );
|
|
}
|
|
|
|
public void resurrect( int depth ) {
|
|
|
|
for (Item item : backpack.items.toArray( new Item[0])) {
|
|
if (item instanceof Key) {
|
|
if (((Key)item).depth == depth) {
|
|
item.detachAll( backpack );
|
|
}
|
|
} else if (item.unique) {
|
|
// Keep unique items
|
|
} else if (!item.isEquipped( owner )) {
|
|
item.detachAll( backpack );
|
|
}
|
|
}
|
|
|
|
if (weapon != null) {
|
|
weapon.cursed = false;
|
|
weapon.activate( owner );
|
|
}
|
|
|
|
if (armor != null) {
|
|
armor.cursed = false;
|
|
}
|
|
|
|
if (misc1 != null) {
|
|
misc1.cursed = false;
|
|
misc1.activate( owner );
|
|
}
|
|
if (misc2 != null) {
|
|
misc2.cursed = false;
|
|
misc2.activate( owner );
|
|
}
|
|
}
|
|
|
|
public int charge( boolean full) {
|
|
|
|
int count = 0;
|
|
|
|
for (Item item : this) {
|
|
if (item instanceof Wand) {
|
|
Wand wand = (Wand)item;
|
|
if (wand.curCharges < wand.maxCharges) {
|
|
wand.curCharges = full ? wand.maxCharges : wand.curCharges + 1;
|
|
count++;
|
|
|
|
wand.updateQuickslot();
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
public int discharge() {
|
|
|
|
int count = 0;
|
|
|
|
for (Item item : this) {
|
|
if (item instanceof Wand) {
|
|
Wand wand = (Wand)item;
|
|
if (wand.curCharges > 0) {
|
|
wand.curCharges--;
|
|
count++;
|
|
|
|
wand.updateQuickslot();
|
|
}
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
@Override
|
|
public Iterator<Item> iterator() {
|
|
return new ItemIterator();
|
|
}
|
|
|
|
private class ItemIterator implements Iterator<Item> {
|
|
|
|
private int index = 0;
|
|
|
|
private Iterator<Item> backpackIterator = backpack.iterator();
|
|
|
|
private Item[] equipped = {weapon, armor, misc1, misc2};
|
|
private int backpackIndex = equipped.length;
|
|
|
|
@Override
|
|
public boolean hasNext() {
|
|
|
|
for (int i=index; i < backpackIndex; i++) {
|
|
if (equipped[i] != null) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return backpackIterator.hasNext();
|
|
}
|
|
|
|
@Override
|
|
public Item next() {
|
|
|
|
while (index < backpackIndex) {
|
|
Item item = equipped[index++];
|
|
if (item != null) {
|
|
return item;
|
|
}
|
|
}
|
|
|
|
return backpackIterator.next();
|
|
}
|
|
|
|
@Override
|
|
public void remove() {
|
|
switch (index) {
|
|
case 0:
|
|
equipped[0] = weapon = null;
|
|
break;
|
|
case 1:
|
|
equipped[1] = armor = null;
|
|
break;
|
|
case 2:
|
|
equipped[2] = misc1 = null;
|
|
break;
|
|
case 3:
|
|
equipped[3] = misc2 = null;
|
|
break;
|
|
default:
|
|
backpackIterator.remove();
|
|
}
|
|
}
|
|
}
|
|
}
|