pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/**************************************************************************
 ** Player Statistics routine, Creates INFO/players.i  Marty 1998
 **************************************************************************/
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include "kernel.h"
#include "macros.h"
#include "sflags.h"
#include "pflags.h"
#include "pflagnames.h"
#include "levelnames.h"
#include <gdbm.h>

int main (int argc, char *argv[])
{ FILE *outf;
  PERSONA p;
  GDBM_FILE dbf;
  datum in;
  datum key;
  datum newkey;
  char *filename,ofilename[256];
  int playercounter = 0;
  static int mlevels[LVL_APPREN];
  static int ilevels[MAX_LEV_IMM];
  int ppratio = 0;
  int ipratio = 0;
  float rimratio = 0;
  int rict = 0;
  int pct = 0;
  int ict = 0;
  int novicect =0;
  int realct = 0;
  int stepsize=0;

  filename = UAF_RAND ".bak";
  ofilename[0] = '\0';
  if ((dbf = gdbm_open(filename, sizeof(PERSONA), GDBM_READER,S_IRUSR|S_IWUSR, 0)) == NULL)
    {
      char cmd[1024];
      sprintf(ofilename,"%s.temp",filename);
      sprintf(cmd,"cp %s %s",filename,ofilename);
      system(cmd);
      if((dbf=gdbm_open(ofilename,sizeof(PERSONA),GDBM_READER,S_IRUSR|S_IWUSR, 0)) == NULL)
        {
          perror (ofilename);
          exit (1);
        }
    }

  key = gdbm_firstkey(dbf);
  while (key.dptr != NULL)
    {
      in = gdbm_fetch(dbf, key);
      bcopy(in.dptr,&p,sizeof(PERSONA));
      newkey = gdbm_nextkey(dbf, key);
      if (key.dptr) free (key.dptr);
      key = newkey;
      if (*p.p_name == '\0')
      {
        if (in.dptr) free (in.dptr);
	continue;
      }
      playercounter++;

      if (p.p_level >= 0 && p.p_level < LVL_APPREN)
      {   mlevels[p.p_level]++;
      }
      else
      {  if (p.p_level < LVL_EMERITUS)
            ilevels[LEV_APPRENTICE]++;
         else if (p.p_level < LVL_WIZARD)
            ilevels[LEV_EMERITUS]++;
         else if (p.p_level < LVL_SENIOR)
            ilevels[LEV_WIZARD]++; 
         else if (p.p_level < LVL_COUNSEL)
            ilevels[LEV_SENIOR]++; 
         else if (p.p_level < LVL_ARCHWIZARD)
            ilevels[LEV_COUNSEL]++; 
         else if (p.p_level < LVL_ADVISOR)
            ilevels[LEV_ARCHWIZARD]++;
         else if (p.p_level < LVL_DEMI)
            ilevels[LEV_ADVISOR]++;
         else if (p.p_level < LVL_GOD)
            ilevels[LEV_DEMI]++;
         else 
            ilevels[LEV_GOD]++;
      }

      if (in.dptr) free(in.dptr);
    }
  if (key.dptr) 
     free (key.dptr);    

  gdbm_close (dbf);


  outf = fopen(DATA_DIR "INFO/players.i","w");
  if (outf != NULL)
  {   int i;
      int d=0;
 
      fprintf(outf,"&+B==============================&+C[&+WPlayer Statistics&+C]&+B==============================&*\n");
      fprintf(outf,"Number of registered players: %d\n",playercounter);

      fprintf(outf,"Spread of the players over the levels:\n\n");
      for (i=MAX_LEV_IMM-1; i > 0; i--)
      {  if (ilevels[i] != 0)
         {  fprintf(outf,"\t%-16.16s\t: %d",WizLevels[i],ilevels[i]);
            d++;
         }
         if (d > 1)
         {  fprintf(outf,"\n");
            d=0;
         }
      }
      if (d > 0)
         fprintf(outf,"\n");

      d = 0;
      fprintf(outf,"\n");

      for (i=LVL_APPREN-1; i >0 ; i--)
      {  if (mlevels[i] != 0) 
         {
            fprintf(outf,"\t%-16.16s\t: %d",MLevels[i],mlevels[i]);
            d++;
         }
         if (d > 1)
         {  fprintf(outf,"\n");
            d=0;
         }
      }
      if (d > 0)
         fprintf(outf,"\n");

      for (i= LEV_ARCHWIZARD; i < MAX_LEV_IMM; i++)
         pct += ilevels[i];
  
      for (i= LEV_APPRENTICE; i < MAX_LEV_IMM; i++)
         ict += ilevels[i];

      for (i= LEV_WIZARD; i < MAX_LEV_IMM; i++)
         rict += ilevels[i];
      rict += ilevels[LEV_APPRENTICE];

      for (i=0; i < LVL_FIVE; i++)
         novicect += mlevels[i];

      for (i=LVL_FIVE; i < LVL_APPREN; i++)
         realct += mlevels[i]++;

      ppratio = (playercounter - pct)/pct;
      ipratio = (playercounter - ict)/ict;
      rimratio = (playercounter - (ict-rict))/ (rict * 1.0);

      fprintf(outf,"\n\tPlayers Per Power ratio       = %d:1\n",ppratio);
      fprintf(outf,"\tPlayers Per Immortal ratio    = %d:1\n",ipratio);
      fprintf(outf,"\tPlayers who reached immort.   = %.0f%%\n", 100/rimratio);
      fprintf(outf,"\tDie hards who reached immort. = %.0f%%\n",100.0/ ((playercounter - (ict - rict) - novicect)/rict));
      fprintf(outf,"\tDie hards VS Beginners        = 1:%d\n\n",novicect/realct);

      stepsize = mlevels[LVL_ONE] / 60;
      if (stepsize > 15)
         stepsize = 15;
      if (stepsize < 1)
         stepsize = 1;

      fprintf(outf,"%%BREAK\n");
      fprintf(outf,"Graphical Representation: (* = %d players, + < %d)\n",
              stepsize,stepsize);

      for (i = MAX_LEV_IMM-1; i > 0; i--)
      {   if (ilevels[i] != 0)
          {   fprintf(outf,"\n  &+G%-16.16s&+W: &+R",WizLevels[i]);

              if (ilevels[i] < stepsize )
              {  fprintf(outf,"+");
                 continue;
              }

              d = ilevels[i] / stepsize;
              for (;d > 0; d--)
                  fprintf(outf,"*");
          }
      }
      for (i = LVL_APPREN-1; i > 0; i--)
      {   if (mlevels[i] != 0)
          {   fprintf(outf,"\n  &+C%-16.16s&+W: &+Y",MLevels[i]);

              if (mlevels[i] < stepsize )
              {   fprintf(outf,"+");
                  continue;
              }

              d = mlevels[i] / stepsize;
              if (d > 60)
              {   fprintf(outf,"****************************************************>>>");
                  continue;
              }
              for (;d > 0; d--)
                  fprintf(outf,"*");
          }
      }


      fprintf(outf,"\n&+B===============================================================================&*\n");
      fclose(outf);
  } 
                
  if(ofilename[0]) unlink(ofilename);
  return (0);
}