parent
98826985e1
commit
5c329e8636
@ -0,0 +1,155 @@ |
|||||||
|
package mightypork.rogue.world; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
import mightypork.gamecore.util.ion.IonInput; |
||||||
|
import mightypork.gamecore.util.ion.IonObjBinary; |
||||||
|
import mightypork.gamecore.util.ion.IonOutput; |
||||||
|
import mightypork.rogue.world.item.Item; |
||||||
|
import mightypork.rogue.world.item.Items; |
||||||
|
|
||||||
|
|
||||||
|
public class Inventory implements IonObjBinary { |
||||||
|
|
||||||
|
private static final short ION_MARK = 0; |
||||||
|
private Item[] items; |
||||||
|
|
||||||
|
|
||||||
|
public Inventory(int size) |
||||||
|
{ |
||||||
|
this.items = new Item[size]; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public Inventory() |
||||||
|
{ |
||||||
|
// ION constructor
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void load(IonInput in) throws IOException |
||||||
|
{ |
||||||
|
final int size = in.readIntByte(); |
||||||
|
items = new Item[size]; |
||||||
|
|
||||||
|
// for all items in sequence
|
||||||
|
while (in.hasNextEntry()) { |
||||||
|
|
||||||
|
// load item index
|
||||||
|
final int i = in.readIntByte(); |
||||||
|
|
||||||
|
// load item
|
||||||
|
setItem(i, Items.loadItem(in)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void save(IonOutput out) throws IOException |
||||||
|
{ |
||||||
|
// write length
|
||||||
|
out.writeIntByte(getSize()); |
||||||
|
|
||||||
|
// find items that are writable
|
||||||
|
for (int i = 0; i < getSize(); i++) { |
||||||
|
final Item item = getItem(i); |
||||||
|
if (item != null && !item.isEmpty()) { |
||||||
|
|
||||||
|
// start sequence entry
|
||||||
|
out.startEntry(); |
||||||
|
|
||||||
|
// write index
|
||||||
|
out.writeIntByte(i); |
||||||
|
|
||||||
|
// write item at index
|
||||||
|
Items.saveItem(out, item); |
||||||
|
} |
||||||
|
} |
||||||
|
// close sequence
|
||||||
|
out.endSequence(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public short getIonMark() |
||||||
|
{ |
||||||
|
return ION_MARK; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get item in a slot |
||||||
|
* |
||||||
|
* @param i slot number |
||||||
|
* @return item in the slot; can be null. |
||||||
|
*/ |
||||||
|
public Item getItem(int i) |
||||||
|
{ |
||||||
|
verifyIndex(i); |
||||||
|
final Item itm = items[i]; |
||||||
|
if (itm == null || itm.isEmpty()) return null; |
||||||
|
return itm; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void verifyIndex(int i) |
||||||
|
{ |
||||||
|
if (i < 0 || i > getSize()) { |
||||||
|
throw new IndexOutOfBoundsException("Invalid inventory index: " + i + ", size: " + getSize()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Put item in a slot |
||||||
|
* |
||||||
|
* @param i slot number |
||||||
|
* @param item item to store |
||||||
|
*/ |
||||||
|
public void setItem(int i, Item item) |
||||||
|
{ |
||||||
|
verifyIndex(i); |
||||||
|
items[i] = item; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return inventory size |
||||||
|
*/ |
||||||
|
public int getSize() |
||||||
|
{ |
||||||
|
return items.length; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add an item, try to merge first. |
||||||
|
* |
||||||
|
* @param stored stored item |
||||||
|
* @return true if the item was entirely added, and is now empty. |
||||||
|
*/ |
||||||
|
public boolean addItem(Item stored) |
||||||
|
{ |
||||||
|
// try to merge with another item
|
||||||
|
for (int i = 0; i < getSize(); i++) { |
||||||
|
final Item itm = getItem(i); |
||||||
|
if (itm != null && itm.canStackWith(stored)) { |
||||||
|
if (itm.addItem(stored)) return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// try to place in a free slot
|
||||||
|
for (int i = 0; i < getSize(); i++) { |
||||||
|
final Item itm = getItem(i); |
||||||
|
if (itm == null) { |
||||||
|
setItem(i, stored.split(stored.getAmount())); // store a copy, empty the original item.
|
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// could not insert.
|
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
package mightypork.rogue.world.item; |
||||||
|
|
||||||
|
|
||||||
|
public enum ItemType |
||||||
|
{ |
||||||
|
FOOD, WEAPON; |
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package mightypork.rogue.world.item.items; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.world.item.Item; |
||||||
|
import mightypork.rogue.world.item.ItemModel; |
||||||
|
import mightypork.rogue.world.item.ItemType; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class ItemBaseFood extends Item { |
||||||
|
|
||||||
|
public ItemBaseFood(ItemModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isStackable() |
||||||
|
{ |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int getAttackPoints() |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public ItemType getType() |
||||||
|
{ |
||||||
|
return ItemType.FOOD; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,37 @@ |
|||||||
|
package mightypork.rogue.world.item.items; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.rogue.world.item.Item; |
||||||
|
import mightypork.rogue.world.item.ItemModel; |
||||||
|
import mightypork.rogue.world.item.ItemType; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class ItemBaseWeapon extends Item { |
||||||
|
|
||||||
|
public ItemBaseWeapon(ItemModel model) |
||||||
|
{ |
||||||
|
super(model); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isStackable() |
||||||
|
{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int getFoodPoints() |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public ItemType getType() |
||||||
|
{ |
||||||
|
return ItemType.WEAPON; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue