// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.resource.are;
import java.nio.ByteBuffer;
import org.infinity.datatype.DecNumber;
import org.infinity.datatype.Flag;
import org.infinity.datatype.ResourceRef;
import org.infinity.resource.AbstractStruct;
import org.infinity.resource.AddRemovable;
import org.infinity.util.io.StreamUtils;
public final class Item extends AbstractStruct implements AddRemovable
{
// ARE/Item-specific field labels
public static final String ARE_ITEM = "Item";
public static final String ARE_ITEM_RESREF = "Item";
public static final String ARE_ITEM_EXPIRY_TIME = "Expiry time";
public static final String ARE_ITEM_QUANTITY_FMT = "Quantity/Charges %d";
public static final String ARE_ITEM_FLAGS = "Flags";
public static final String[] s_flags = {"No flags set", "Identified", "Not stealable", "Stolen",
"Undroppable"};
private int nr = -1;
Item() throws Exception
{
super(null, ARE_ITEM, StreamUtils.getByteBuffer(20), 0);
}
Item(AbstractStruct superStruct, ByteBuffer buffer, int offset, int nr) throws Exception
{
super(superStruct, ARE_ITEM, buffer, offset);
this.nr = nr;
}
// --------------------- Begin Interface StructEntry ---------------------
@Override
public String getName()
{
if (nr == -1)
return ARE_ITEM;
return ARE_ITEM + " " + nr;
}
// --------------------- End Interface StructEntry ---------------------
//--------------------- Begin Interface AddRemovable ---------------------
@Override
public boolean canRemove()
{
return true;
}
//--------------------- End Interface AddRemovable ---------------------
@Override
public int read(ByteBuffer buffer, int offset) throws Exception
{
addField(new ResourceRef(buffer, offset, ARE_ITEM_RESREF, "ITM"));
addField(new DecNumber(buffer, offset + 8, 2, ARE_ITEM_EXPIRY_TIME));
for (int i = 0; i < 3; i++) {
addField(new DecNumber(buffer, offset + 10 + (i * 2), 2, String.format(ARE_ITEM_QUANTITY_FMT, i+1)));
}
addField(new Flag(buffer, offset + 16, 4, ARE_ITEM_FLAGS, s_flags));
return offset + 20;
}
}