toc/
toc/account/a/
toc/area/backup/
toc/area/imc/
toc/caste/
toc/caste/backup/
toc/clans/
toc/classes/
toc/crash/
toc/gods/
toc/guilds/
toc/lname/s/
toc/maps/backup/
toc/player/a/
toc/src/
toc/system/backup/
toc/tableprog/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * 			Get Abstract Statistics on Objects		    *
 ****************************************************************************/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"


typedef struct gaso_struct GASO_STRUCT;

struct gaso_struct
{
   sh_int weight;
   int cost;
   int value[6];
   int count;
   int extra_flags[32];
};

int gaso_level(CHAR_DATA * ch, int level);

void do_gaso(CHAR_DATA * ch, char *argument)
{
   char arg[MSL];
   int level, level_lo, level_hi, count;

   count = 0;

   if (!ch->desc)
   {
      bug("No desc in do_gas\n\r", 0);
   }


   one_argument(argument, arg);
   if (arg[0] == '\0')
   {
      level = -1;
   }
   else
   {
      level = atoi(arg);
   }

   if ((level < 0) || (level > MAX_LEVEL))
   {
      level_lo = level_hi = level;
   }
   else
   {
      level_lo = 1;
      level_hi = 1;
   }

   for (level = level_lo; level <= level_hi; level++)
      count += gaso_level(ch, level);

   return;
}

int gaso_level(CHAR_DATA * ch, int level)
{
   char buf[MSL], buf2[MAX_STRING_LENGTH];
   int count, type, gcount, i;
   GASO_STRUCT stats[MAX_ITEM_TYPE + 1]; /* duh */
   OBJ_DATA *obj;
   double dcount;

   count = 0;
   gcount = 0;

   for (type = 0; type <= MAX_ITEM_TYPE; type++)
   {
      stats[type].weight = stats[type].cost = stats[type].count = 0;
      stats[type].value[0] = 0;
      stats[type].value[1] = 0;
      stats[type].value[2] = 0;
      stats[type].value[3] = 0;
      stats[type].value[4] = 0;
      stats[type].value[5] = 0;
      for (i = 0; i < 32; i++)
      {
         stats[type].extra_flags[i] = 0;
      }
   }

   for (obj = first_object; obj; obj = obj->next)
   {
      if (obj->level == level)
      {
         count++;
         stats[obj->item_type].count++;
         stats[obj->item_type].weight += obj->weight;
         stats[obj->item_type].cost += obj->cost;
         stats[obj->item_type].value[0] += obj->value[0];
         stats[obj->item_type].value[1] += obj->value[1];
         stats[obj->item_type].value[2] += obj->value[2];
         stats[obj->item_type].value[3] += obj->value[3];
         stats[obj->item_type].value[4] += obj->value[4];
         stats[obj->item_type].value[5] += obj->value[5];
         for (i = 0; i < 32; i++)
         {
            if (xIS_SET(obj->pIndexData->extra_flags, i))
               stats[obj->item_type].extra_flags[i]++;
         }

      }
      gcount++;
   }

   if (count == 0)
   {
      /* send_to_pager("No objects in this range.\n\r",ch); */
      return (0);
   }

   for (type = 0; type <= MAX_ITEM_TYPE; type++)
   {
      if (stats[type].count != 0)
      {
#define TODUB(x) (  (double)(1.0 * x) )

         dcount = TODUB(stats[type].count);
         sprintf(buf, "%d,%d,%d,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f,%2.2f",
            level, type, stats[type].count, (double) (100.0 * (dcount / TODUB(count))), /* %-age of objs at this level */
            (double) (TODUB(stats[type].weight) / dcount), /* average weight of this item_type for lev */
            (double) (TODUB(stats[type].cost) / dcount), /* average cost of this item_type for lev */
            (double) (TODUB(stats[type].value[0]) / dcount),
            (double) (TODUB(stats[type].value[1]) / dcount),
            (double) (TODUB(stats[type].value[2]) / dcount),
            (double) (TODUB(stats[type].value[3]) / dcount),
            (double) (TODUB(stats[type].value[4]) / dcount), (double) (TODUB(stats[type].value[5]) / dcount));
         for (i = 0; i < 32; i++)
         {
            sprintf(buf2, ",%2.2f", (double) (TODUB(stats[type].extra_flags[i]) / dcount));
            strcat(buf, buf2);
         }
         strcat(buf, "\n\r");
         send_to_pager(buf, ch);
      }

   }

#undef TODUB

   return count;
}


/*   STUFF TO DEAL WITH:

    int                 wear_flags; 
    sh_int              wear_loc;
{
    AFFECT_DATA *       next;
    AFFECT_DATA *       prev;
    sh_int              type;
    sh_int              duration;
    sh_int              location;
    int                 modifier;
    int                 bitvector;
};

*/