A while back, i had came into the problem that when mprogs on shopkeepers
created items it screwed up the do_list command, by not combining the items
correctly. Dont know if anyone else has had this problem, but i figured i
would share my fix for this. Thanks to Kender and Muerte from #rom for the
help on it. Instead of having do_list display the objects i created a second
function to do it and here it is.

void display_list_obj_keeper (CHAR_DATA *ch, CHAR_DATA *keeper)
{
 char buf[MSL], name[MSL];
 OBJ_DATA *obj, *obj2;
 int vnum, price, count, level;
 bool lstfnd, unlimited, objfnd, displayed, inlist;

 struct shop_item
    {
  int vnum;
  int total;
  int price;
  int level;
  const char * name;
  bool displayed;
  bool unlimited;
  struct shop_item * next_item;
    };
    struct shop_item *item_list = NULL;
    struct shop_item *new_item;
    struct shop_item *listing;

    objfnd    = FALSE;
    displayed = FALSE;
    inlist    = FALSE;

    /*add to list*/
    for ( obj = keeper->carrying; obj != NULL; obj = obj->next_content )
    {
     if ((obj->wear_loc == WEAR_NONE)
     &&  (can_see_obj(ch, obj))
     &&  ((get_cost(keeper, obj, TRUE)) > 0)
     &&  (obj->level > 0 && obj->level < 101))
     {
      objfnd =TRUE;
      lstfnd = FALSE;
      count = 0;
      level  = obj->level;
      vnum   = obj->pIndexData->vnum;
      price  = get_cost(keeper, obj, TRUE);
      sprintf(name,"%s", obj->short_descr);
      if (IS_OBJ_STAT(obj,ITEM_INVENTORY))
       unlimited = TRUE;
      else
       unlimited = FALSE;
      for ( obj2 = keeper->carrying; obj2 != NULL; obj2 =
obj2->next_content )
      {
       if (vnum == obj2->pIndexData->vnum)
        count++;
      }
      if (!inlist)
      {
       new_item= alloc_mem(sizeof(struct shop_item));
    new_item->vnum      = vnum;
    new_item->total     = count;
    new_item->price     = price;
    new_item->level     = level;
       new_item->name      = str_dup(name);
    new_item->displayed = FALSE;
    new_item->unlimited = unlimited;
    new_item->next_item = item_list;
    item_list           = new_item;
       inlist              = TRUE;
      }
      else
      {
       for (listing = item_list; listing != NULL; listing=
listing->next_item)
    {
     if (vnum == listing->vnum)
      lstfnd = TRUE;
    }

    if (!lstfnd)
    {
     new_item= alloc_mem(sizeof(struct shop_item));
     new_item->vnum      = vnum;
     new_item->total     = count;
     new_item->price     = price;
     new_item->level     = level;
        new_item->name      = str_dup(name);
     new_item->displayed = FALSE;
     new_item->unlimited = unlimited;
     new_item->next_item = item_list;
     item_list           = new_item;
    }

   }
  }
 }
 /*display to character*/
 if (objfnd)
 {
  if (!displayed)
  {
   send_to_char( "[Lvl  {YGold {WSilver{x Qty] Items being sold.\n\r",ch);
   displayed = TRUE;
  }
  for (listing = item_list; listing != NULL; listing= listing->next_item)
  {
   sprintf(buf,"%s\n\r",listing->name);
   if (listing->displayed == FALSE)
   {

    if (listing->unlimited == TRUE)
    {
     sprintf(buf,"[%3d {Y%5d  {W%5d{x ---] %s{x\n\r",
      listing->level,
      (listing->price * 1/100),
      (listing->price * 1 - (listing->price * 1/100) * 100),
      listing->name);
    }
    else
    {
     sprintf(buf,"[%3d {Y%5d  {W%5d{x %3d] %s{x\n\r",
      listing->level,
      (listing->price * 1/100),
      (listing->price * 1 - (listing->price * 1/100) * 100),
      listing->total,
      listing->name);
    }
    listing->displayed = TRUE;
    send_to_char(buf,ch);
   }
  }
 }
 /*free memory*/
 if (objfnd)
 {

  for (listing = item_list; listing != NULL; listing= listing->next_item)
  {
   free_mem(listing, sizeof(listing));
  }

 }
 /*nothing*/
 if (!objfnd)
  send_to_char( "You can't buy anything here.\n\r", ch );
}

Anyway, that might help someone so have fun.

-Ostoles/Richard

/*
 *
 * Email: [EMAIL PROTECTED]
 * Alt Email: [EMAIL PROTECTED]
 * ICQ: 86937973
 * AIM: Ostoles
 * MSN: [EMAIL PROTECTED]
 *
 */


Reply via email to