/* First of all, a class for complex items.  It does nothing except say
*  yes, they are complex.
*/

class complex: item
iscomplex = true
;

/*  Okay.  What we have here is a new function I created.  It looks much
*   like listcont, but is only ( and always ) called to get the item
*   listing for a room.  Hopefully, hopefully, hopefully, this will
*   allow us to give long descriptions for some objects, and short ones
*   for the rest.  Note the long descs are only used in room listings, not
*   for containers.
*/

roomcont: function( obj )
{
   local i, count, tot, ctot, stot, list, slist, clist, cur, disptot;
   count := 0;
   list := obj.contents;
   slist := [];
   clist := [];
   tot := length( list );
   i := 1;

/* The first thing to do is to sort the items.  Items with complex descriptions
*  are added to the c(omplex)list, and everything else is added to the
*  s(imple)list.
*/

   while ( i <= tot )
   {
       cur := list[i];
       if ( cur.iscomplex )
       {
           clist := clist + cur;
       }
       else
       {
           slist := slist + cur;
       }
       i := i + 1;
   }

/* Now we can define some things.  And reset i, the generic counter. */

   ctot := length( clist );
   stot := length( slist );
   disptot := itemcnt ( slist );
   i := 1;

/* Print the items on the clist first... */

   if ( ctot )
   {
       while ( i <= ctot )
       {
           cur := clist[i];
           cur.cdesc;               // list this object's cdesc
           if ( cur.islamp and cur.islit ) " (providing light)";
/* (Do we need extra space or not?) */

           if ( not ( ( i + 1 ) > ctot ) )
           {
               "  ";
           }

           i := i + 1;
       }
   }

/* ...reset values... */

   i := 1;

/*  ...and go on and print the items with normal descs, as usual. */

   if ( stot )
   {
/* Do we need some spaces first? */
   if ( ctot )
       "  ";
/* Now, let's proceed. */
   "You see ";
       while ( i <= stot )
       {
           cur := slist[i];
           if ( cur.isListed )
           {
               if ( count > 0 )
               {
                   if ( count+1 < disptot )
                       ", ";
                   else if (count = 1)
                       " and ";
                   else
                       ", and ";
               }
               count := count + 1;
               cur.adesc;               // list this object
               if ( cur.islamp and cur.islit ) " (providing light)";
           }
           i := i + 1;
       }
       " here.";
   }
}

/*  Now, all that's left is to modify the function used to look around... */

modify room
   nrmLkAround( verbosity ) =      // lookAround without location status
   {
       local l, cur, i, tot;

       if ( verbosity )
       {
           "\n\t"; self.ldesc;

           l := self.contents;
           tot := length( l );
           i := 1;
           while ( i <= tot )
           {
               cur := l[i];
               if ( cur.isfixed ) cur.heredesc;
               i := i + 1;
           }
       }
       "\n\t";
       if (itemcnt( self.contents ))
       {
           roomcont( self );
       }
       listcontcont( self ); "\n";

       l := self.contents;
       tot := length( l );
       i := 1;
       while ( i <= tot )
       {
           cur := l[i];
           if ( cur.isactor )
           {
               if ( cur <> Me )
               {
                   "\n\t";
                   cur.actorDesc;
               }
           }
           i := i + 1;
       }
   }
;

/* And voila!  Pretty cool, eh?  Yes, I know it is rather kludgey, and possibly
*  buggy.  Sorry.  All comments to [email protected].  Please do not claim
*  this work as your own, but please feel free to use and distribute.  Thank you
*/

/* All that is needed to make an item complex is to make it class complex,
*  and give a cdesc for it.  For example:
*  nugget: complex, item
*  sdesc = "gold nugget"
*  ldesc = "It's a nugget of gold!"
*  cdesc = "A glittering gold nugget is here."
*  [...and so on.]
*  Enjoy!
*/