/*
* (c) 2000-2009 Carlos G�mez Rodr�guez, todos los derechos reservados / all rights reserved.
* Licencia en license/bsd.txt / License in license/bsd.txt
*/
package eu.irreality.age;
import eu.irreality.age.debug.Debug;
class WeightLimitExceededException extends Exception
{
}
class VolumeLimitExceededException extends Exception
{
}
public class Inventory extends EntityList
{
/**Peso total.*/
private int weight;
/**Volumen total.*/
private int volume;
/**L�mite de peso de este inventario (en personaje, ba�l, etc.)*/
private int weightLimit;
/**L�mite de volumen.*/
private int volumeLimit;
/**
* La funci�n addElement de java.util.Vector.
*
*/
private void addElement ( Item o )
{
laLista.addElement ( o );
}
/**
* La funci�n removeElement de java.util.Vector.
*
*/
private boolean removeElement ( Item o )
{
return laLista.removeElement ( o );
}
public void addItem ( Item o ) throws WeightLimitExceededException, VolumeLimitExceededException
{
if ( weight+o.getTotalWeight() > weightLimit )
throw new WeightLimitExceededException ( );
else if ( volume+o.getVolume() > volumeLimit )
throw new VolumeLimitExceededException ( );
else
{
addElement(o);
weight += o.getTotalWeight();
volume += o.getVolume();
}
}
public boolean removeItem ( Item o )
{
boolean valor = removeElement(o);
if ( valor == true )
{
weight -= o.getTotalWeight();
volume -= o.getVolume();
}
return valor;
}
public void empty()
{
for ( int i = 0 ; i < size() ; i++ )
{
removeItem ( elementAt(i) );
}
}
public void clear()
{
empty();
}
public int size ( )
{
return laLista.size ( );
}
public String toString ( )
{
return toString ( null , null );
}
public String toString ( World w )
{
return toString ( null , w );
}
public String toString ( /*nullable*/ Entity viewer , World w )
{
/*luego hay que hacer el constructname con mas items si hay duplicados.*/
int i = 0;
String cadena = "";
String conjunction;
if ( w == null ) conjunction="y";
else conjunction = w.getMessages().getMessage("coord.conj");
boolean [] considerados = new boolean [ size ( ) ];
boolean vacio = true; //si el inventario esta vacio a efectos de
//descripcion (no tiene nada o no tiene nada visible/con descripcion en ese estado)
int nconsiderados = 0; /*numero de items que hemos considerado ya*/
for ( int j = 0 ; j < size() ; j++ ) considerados[j] = false;
//primero, descartamos los invisibles en este estado
while ( i < size() )
{
/*para cada item...*/
int numeroitems = 1;
/*buscamos sus duplicados...*/
for ( int k = i+1 ; k < size() ; k++ )
{
if ( elementAt(k).isSame( elementAt(i) ) )
{
numeroitems++;
}
}
/*
if ( viewer == null )
{
if ( StringMethods.numToks ( elementAt(i).constructName(1,elementAt(i).getState()) , ' ' ) < 2 )
{
//y si no tiene nombre, es decir, es invisible en este estado, lo tachamos
considerados[i] = true;
nconsiderados++;
//Debug.println("Invisible item detected");
}
}
else
*/
{
if ( elementAt(i).isInvisible(viewer) )
//if ( StringMethods.numToks ( elementAt(i).constructName(1,viewer) , ' ' ) < 2 )
{
//y si no tiene nombre, es decir, es invisible en este estado, lo tachamos
considerados[i] = true;
nconsiderados++;
//Debug.println("Invisible item detected");
}
}
i++;
}
i = 0;
int j = 0;
//ahora los visibles, si los hay
while ( i < size() )
{
/*si ya esta considerado (era invisible), pasamos*/
if ( ! considerados[i] )
{
considerados[i]=true;
nconsiderados++;
int numeroitems = 1;
/*buscamos sus duplicados*/
for ( int k = i+1 ; k < size() ; k++ )
{
/*
Debug.println("-------");
Debug.println(elementAt(k).getID() + " " + elementAt(i).getID() );
Debug.println("Result: " + elementAt(k).isSame( elementAt(i) ) );
Debug.println("-------");
*/
if ( elementAt(k).isIndistinguishableFrom( elementAt(i) , viewer ) )
{
considerados[k] = true;
nconsiderados++;
numeroitems++;
}
}
/*
if ( viewer == null )
{
if ( StringMethods.numToks ( elementAt(i).constructName(numeroitems,elementAt(i).getState()) , ' ' ) < 2 )
{
//si no tienen nombre, es decir, son invisibles en este estado.
i++;
continue;
}
}
else
*/
{
if ( elementAt(i).isInvisible(viewer) )
//if ( StringMethods.numToks ( elementAt(i).constructName(numeroitems,viewer) , ' ' ) < 2 )
{
//si no tienen nombre, es decir, son invisibles en este estado.
i++;
continue;
}
}
vacio = false; //agregamos algo a la cadena
if ( j == 0 )
;
else if ( nconsiderados < size() )
cadena += ", ";
else
cadena += ( " " + conjunction + " " );
//if ( viewer == null )
// cadena += elementAt(i).constructName(numeroitems,elementAt(i).getState());
//else
cadena += elementAt(i).constructName(numeroitems,viewer);
j++; //j s�lo se incrementa con los que se muestran en el string
}
i++;
}
if ( vacio && w!=null ) return w.getMessages().getMessage("nothing")+".";
else if ( vacio && w== null ) return "<empty inventory, null world passed>";
else return cadena+".";
}
public Inventory ( int weightLimit , int volumeLimit )
{
laLista = new java.util.Vector ( );
weight = 0; volume = 0;
this.weightLimit = weightLimit;
this.volumeLimit = volumeLimit;
}
public Inventory ( int weightLimit , int volumeLimit , int initSize )
{
laLista = new java.util.Vector ( initSize );
weight = 0; volume = 0;
this.weightLimit = weightLimit;
this.volumeLimit = volumeLimit;
}
public void incrementSize ( int increment )
{
if ( increment > 0 )
laLista.setSize ( laLista.size() + increment );
}
public int getWeightLimit ( )
{
return weightLimit;
}
public int getVolumeLimit ( )
{
return volumeLimit;
}
public void setWeightLimit ( int nuevo ) throws WeightLimitExceededException
{
weightLimit = nuevo;
if ( weight > weightLimit )
throw new WeightLimitExceededException ( );
}
public void setVolumeLimit ( int nuevo ) throws VolumeLimitExceededException
{
volumeLimit = nuevo;
if ( volume > volumeLimit )
throw new VolumeLimitExceededException ( );
}
public boolean isEmpty ( )
{
return laLista.isEmpty();
}
public Item elementAt ( int i )
{
return (Item) laLista.elementAt ( i );
}
public void setElementAt ( Item nuevo, int i ) throws WeightLimitExceededException, VolumeLimitExceededException
{
if ( i < size() && elementAt(i) != null )
{
volume -= elementAt(i).getVolume();
weight -= elementAt(i).getTotalWeight();
}
volume += nuevo.getVolume();
weight += nuevo.getTotalWeight();
laLista.setElementAt ( nuevo , i );
if ( volume > volumeLimit )
throw new VolumeLimitExceededException ( );
if ( weight > weightLimit )
throw new WeightLimitExceededException ( );
}
public boolean contains ( Item it )
{
for ( int i = 0 ; i < size() ; i++ )
{
Debug.println(laLista);
Debug.println("i=" + i);
if ( elementAt(i) != null && elementAt(i).equals( it ) ) return true;
}
return false;
}
public int getWeight()
{
return weight;
}
public int getVolume()
{
return volume;
}
public org.w3c.dom.Node getXMLRepresentation ( org.w3c.dom.Document doc )
{
org.w3c.dom.Element suElemento = doc.createElement( "Inventory" );
suElemento.setAttribute ( "weight" , String.valueOf(weight) );
suElemento.setAttribute ( "volume" , String.valueOf(volume) );
suElemento.setAttribute ( "weightLimit" , String.valueOf(weightLimit) );
suElemento.setAttribute ( "volumeLimit" , String.valueOf(volumeLimit) );
for ( int i = 0 ; i < size() ; i++ )
{
org.w3c.dom.Element nuevoElemento = doc.createElement ( "ItemRef" );
Item nuestroItem = (Item) laLista.elementAt(i);
if ( nuestroItem != null ) //null puede salir en inventories como el de wielded weapons
nuevoElemento.setAttribute ( "id" , String.valueOf ( nuestroItem.getID() ) );
suElemento.appendChild(nuevoElemento);
}
return suElemento;
}
//PRECD: Los items referenciados ya han sido creados
//(es decir, se puede y debe usar como carga diferida)
public Inventory ( World mundo , org.w3c.dom.Node n ) throws XMLtoWorldException
{
if ( ! ( n instanceof org.w3c.dom.Element ) )
{
throw ( new XMLtoWorldException ( "Inventory node not Element" ) );
}
else
{
int weight,volume,weightLimit,volumeLimit;
try
{
org.w3c.dom.Element e = (org.w3c.dom.Element) n;
if ( !e.hasAttribute("weight") )
weight=0;
else
weight = Integer.valueOf ( e.getAttribute("weight") ) . intValue();
if ( !e.hasAttribute("volume") )
volume=0;
else
volume = Integer.valueOf ( e.getAttribute("volume") ) . intValue();
if ( !e.hasAttribute("weightLimit") )
weightLimit=50000;
else
weightLimit = Integer.valueOf ( e.getAttribute("weightLimit") ) . intValue();
if ( !e.hasAttribute("volumeLimit") )
volumeLimit=50000;
else
volumeLimit = Integer.valueOf ( e.getAttribute("volumeLimit") ) . intValue();
}
catch ( NumberFormatException nfe )
{
throw ( new XMLtoWorldException ( "Inventory attribute value not found or invalid" ) );
}
//Inventory inv = new Inventory ( weightLimit , volumeLimit , 0 );
this.laLista = new java.util.Vector();
this.weightLimit = weightLimit;
this.volumeLimit = volumeLimit;
this.weight = 0;
this.volume = 0; //on adding items, will increase
org.w3c.dom.NodeList nl = n.getChildNodes();
for ( int i = 0 ; i < nl.getLength() ; i++ )
{
org.w3c.dom.Node hijo = nl.item(i);
//si todo va bien, es de la forma <ItemRef id="una id"/>
if ( !( hijo instanceof org.w3c.dom.Element ) )
{
//throw ( new XMLtoWorldException ( "Inventory node's child " + i + " not Element:" + nl.item(i) + "(" + nl.item(i).getClass() + ")" + ", next one being " + nl.item(i+1) ) );
continue;
}
else
{
org.w3c.dom.Element h = (org.w3c.dom.Element)hijo;
try
{
if ( h.hasAttribute("id") )
addItem ( mundo.getItem ( h.getAttribute("id") ) );
else
//(add null) <- useful for wielded weapons, etc.
incrementSize(1);
}
catch ( WeightLimitExceededException wle )
{
throw ( new XMLtoWorldException ( "Inventory overloaded in weight" ) );
}
catch ( VolumeLimitExceededException wle )
{
throw ( new XMLtoWorldException ( "Inventory overloaded in volume" ) );
}
}
} //end for each son of inventory node
if ( this.volume != volume || this.weight != weight )
//throw ( new XMLtoWorldException ( "Inventory volume or weight do not match items: " + toString() ) );
Debug.println("Warning: Inventory volume or weight do not match items: " + toString(mundo) );
} //end if the node is an element
} //end method
//SHALLOW copy
public Object clone()
{
Inventory inv = new Inventory( weightLimit , volumeLimit );
inv.laLista = new java.util.Vector ( laLista.size() );
for ( int i = 0 ; i < laLista.size() ; i++ )
{
try
{
inv.addItem((Item)laLista.get(i));
}
catch ( WeightLimitExceededException wlee )
{
;
}
catch ( VolumeLimitExceededException wlee )
{
;
}
}
return inv;
}
/*
N�tese que esta funci�n a�ade los nuevos items al mundo.
cloneContents: si se clona a su vez el inventario del item.
cloneParts: �dem con las partes.
*/
public Inventory cloneCopyingItems ( World w , boolean cloneContents , boolean cloneParts )
{
//do it!
Inventory inv = new Inventory( weightLimit , volumeLimit );
inv.laLista = new java.util.Vector ( laLista.size() );
for ( int i = 0 ; i < laLista.size() ; i++ )
{
try
{
Item original = (Item)laLista.get(i);
Item copia = original.createNewInstance( w , cloneContents , cloneParts );
w.addItemAssigningID ( copia );
inv.addItem(copia);
}
catch ( WeightLimitExceededException wlee )
{
;
}
catch ( VolumeLimitExceededException wlee )
{
;
}
}
return inv;
}
} //end class