/**************************************************************************** * [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, Fireblade, Edmond, Conran | * * ------------------------------------------------------------------------ * * 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[MAX_STRING_LENGTH]; 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=LEVEL_AVATAR; } for(level=level_lo;level<=level_hi;level++) count += gaso_level(ch,level); return; } int gaso_level(CHAR_DATA * ch, int level) { char buf[MAX_STRING_LENGTH], 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(x) 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; }; */