/* ** j###t ########## #### #### ** j###t ########## #### #### ** j###T "###L J###" ** ######P' ########## ######### ** ######k, ########## T######T ** ####~###L #### ** #### q###L ########## .##### ** #### \###L ########## #####" ** ** $Id$ ** ** Class History ** ** Date Name Description ** ---------|------------|----------------------------------------------- ** 19Aug98 subtle start of recorded history ** */ package key; import key.collections.ObjectCollection; import java.util.Enumeration; import java.util.NoSuchElementException; import java.util.Hashtable; import java.io.*; /** * Nothing other than person location positions should be in this property * list. */ public class Inventory extends Container { private static final long serialVersionUID = 3171435380110162286L; public static final AtomicElement[] ELEMENTS = { AtomicElement.construct( Inventory.class, Atom.class, "personage", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "head", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "hair", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "ears", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "face", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "neck", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "body_outer", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "body_middle", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "body_inner", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "arm_left", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "arm_right", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "waist_accessory", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "waist", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "legs_outer", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "legs_middle", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "legs_inner", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "hands", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "wrist_left", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "wrist_right", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "finger_left", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "finger_right", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "feet_outer", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "feet_middle", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "feet_inner", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "miscellaneous", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "wield_left", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "wield_right", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ), AtomicElement.construct( Inventory.class, Atom.class, "seat", AtomicElement.PUBLIC_FIELD, "object being worn on personage" ) }; protected Reference personage = Reference.EMPTY; protected Reference head = Reference.EMPTY; protected Reference hair = Reference.EMPTY; protected Reference ears = Reference.EMPTY; protected Reference face = Reference.EMPTY; protected Reference neck = Reference.EMPTY; protected Reference body_outer = Reference.EMPTY; protected Reference body_middle = Reference.EMPTY; protected Reference body_inner = Reference.EMPTY; protected Reference arm_left = Reference.EMPTY; protected Reference arm_right = Reference.EMPTY; protected Reference waist_accessory = Reference.EMPTY; protected Reference waist = Reference.EMPTY; protected Reference legs_outer = Reference.EMPTY; protected Reference legs_middle = Reference.EMPTY; protected Reference legs_inner = Reference.EMPTY; protected Reference hands = Reference.EMPTY; protected Reference wrist_left = Reference.EMPTY; protected Reference wrist_right = Reference.EMPTY; protected Reference finger_left = Reference.EMPTY; protected Reference finger_right = Reference.EMPTY; protected Reference feet_outer = Reference.EMPTY; protected Reference feet_middle = Reference.EMPTY; protected Reference feet_inner = Reference.EMPTY; protected Reference miscellaneous = Reference.EMPTY; protected Reference wield_left = Reference.EMPTY; protected Reference wield_right = Reference.EMPTY; protected Reference seat = Reference.EMPTY; public static final AtomicStructure STRUCTURE = new AtomicStructure( Container.STRUCTURE, ELEMENTS ); public AtomicStructure getDeclaredStructure() { return( STRUCTURE ); } public Inventory() { super( false, "inventory", new ObjectCollection() ); setConstraint( Type.THING ); setLimit( 10 ); } public void remove( Atom removed ) throws NonUniqueKeyException,NoSuchElementException,BadKeyException { if( isWearing( removed ) ) throw new CannotDropWhileWearingException(); super.remove( removed ); } public boolean isWearing( Atom a ) { // quickly scan our fields & determine if we're wearing // this or not for( int i = 0; i < ELEMENTS.length; i++ ) { try { if( ((Reference) ELEMENTS[i].getBasicValue( this )).contains( a ) ) return( true ); } catch( Exception e ) { Log.debug( this, e.toString() + " while checking if wearing" ); e.printStackTrace(); } } return( false ); } public Paragraph contents() { Hashtable ht = new Hashtable(); // prescan once for( int i = 0; i < ELEMENTS.length; i++ ) { try { AtomicElement ae = ELEMENTS[i]; Reference r = (Reference) ae.getBasicValue( this ); if( r.isValid() ) { Map m = (Map) ht.get( r ); if( m == null ) { m = new Map( ae.getName(), r ); ht.put( r, m ); } else { m.sb.append( ", " ); m.sb.append( ae.getName() ); } } } catch( Exception e ) { Log.debug( this, e.toString() + " while checking if wearing" ); e.printStackTrace(); } } // now output everything TableParagraph.Generator table = new TableParagraph.Generator( columns ); for( Enumeration e = referenceElements(); e.hasMoreElements(); ) { Reference r = (Reference) e.nextElement(); Map m = (Map) ht.get( r ); // this line is necessary - if we are carrying more // than one of the same thing, we still only list it // as being worn once - as this is indeed the case: // it can only be worn once. ht.remove( r ); String s[] = new String[2]; s[0] = r.getName(); if( m != null ) s[1] = m.sb.toString(); else s[1] = ""; table.appendRow( s ); } int c = count(); StringBuffer footer = new StringBuffer(); footer.append( "There "); footer.append( Grammar.isAreCount( c ) ); footer.append( " " ); footer.append( Grammar.objectObjects( c ) ); footer.append( " in your inventory." ); table.setFooter( footer.toString() ); ht.clear(); return( table.getParagraph() ); } class Map { Reference fr; StringBuffer sb; Map( String first, Reference r ) { fr = r; sb = new StringBuffer( first ); } } public static final TableParagraph.Column[] columns = { new TableParagraph.Column( "name", Player.MAX_NAME ), new TableParagraph.Column( "being worn at", 40 ) }; }