/************************************************************************** ** 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); }