wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 1.0 **                                *
 *--------------------------------------------------------------------------*
 *               WolfPaw 1.0 (c) 1997,1998 by Dale Corse                    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *  Scryn, Thoric, Justice, Tricops and Mask.                               *
 *--------------------------------------------------------------------------*
 *			TopTen Control Module 			    	    *
 *--------------------------------------------------------------------------*/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include "mud.h"

#define TOPTEN_DAMAGE		1
#define TOPTEN_EXP		2
#define TOPTEN_PKS		3
#define TOPTEN_HITROLL		4
#define TOPTEN_AC		5
#define TOPTEN_MAC		6
#define TOPTEN_TAC		7
#define TOPTEN_MANA		8
#define TOPTEN_HP		9
#define TOPTEN_IMPCHAR		10

#define TOPTEN_FILE	"../system/topten.dat"

void show_topten( CHAR_DATA *ch, sh_int type );
char *get_topten_type_name( sh_int type );
TOPTEN_DATA *on_topten_list( TOPTEN_DATA *top, char *name, bool AC, long value );
TOPTEN_DATA * list_resort( TOPTEN_DATA *top, bool AC );
void topten_exist_check( TOPTEN_DATA *top );

void topten_setup( void )
{
TOPTEN_DATA *top_entry=NULL,*tmp=NULL,*next_tmp=NULL;
FILE *fp;

first_topten = NULL;
last_topten = NULL;
lowest_toptens[0] = 0;

if ( ( fp = fopen( TOPTEN_FILE, "r" ) )==NULL)
{
  bug("TopTen Setup: Cannot open Data file!",0);
  TOPTEN_ACTIVE = FALSE;
  return;
}
else
  TOPTEN_ACTIVE = TRUE;

for( ; ; )
{
  char *word;
  char letter;
  char buf[MSL];
  int cnt=0;

  letter = fread_letter(fp);

  if ( letter != '#' )
  {
    bug("TopTen Setup: # not found!",0);
    TOPTEN_ACTIVE = FALSE;
    break;
  }

  word = fread_word(fp);

  if ( !str_cmp( word, "ENTRY" ) )
  {
    top_entry=NULL;
    CREATE(top_entry, TOPTEN_DATA, 1 );
    top_entry->type = fread_number(fp);

    sprintf(buf,"Loading Entry: T:%d",top_entry->type);
    log_string(buf);

    for ( cnt = 0; cnt <= 9; cnt++ )
      top_entry->plist[cnt] = fread_string(fp);

    for ( cnt = 0; cnt <= 9; cnt++ )  
      top_entry->values[cnt] = fread_number(fp);

    lowest_toptens[top_entry->type] = top_entry->values[9];

    LINK(top_entry, first_topten, last_topten, next, prev );
 }
 else if ( !str_cmp( word, "END" ) )
          break;
 else
 {
    bug("TopTen Setup: bad word! (%s)", word );
    TOPTEN_ACTIVE = FALSE;
    break;
 }
}
new_fclose(fp);
log_string("TopTen Setup Conplete!"); 
log_string("TOPTEN: Checking to make sure all entries still exist..");
for ( tmp=first_topten; tmp; tmp=next_tmp )
{
  next_tmp= tmp->next;

  topten_exist_check(tmp);
}
log_string("Done.");
return;     
}

void topten_update( char *name, sh_int type, long value )
{
TOPTEN_DATA *top, *next_top;
int cnt=0;
bool AC;
TOPTEN_DATA *temp;
bool REMOVE_NAME=FALSE;
char buf[MSL];

if ( type == TOPTEN_AC || type == TOPTEN_MAC || type == TOPTEN_TAC )
AC = TRUE;
else
AC = FALSE;

if ( type == TOPTEN_IMPCHAR )
REMOVE_NAME=TRUE;

if ( REMOVE_NAME )
{
  for( top= first_topten; top; top=next_top )
  {
   next_top=top->next;

    if ( top->type != TOPTEN_PKS )
    {
       for ( cnt=0; cnt <= 9; cnt++ )
       {
	 if( !str_cmp(top->plist[cnt],name) )
	 {
	   sprintf(buf,"TOPTEN: Imp_char Found, Removing (%s)",name);
	   log_string_plus(buf,LOG_NORMAL,59);
      	   top->plist[cnt] = STRALLOC("None");
           top->values[cnt] = 0;
	   fwrite_topten();
	 }
       }
    }
  }
return;
}

for( top = first_topten; top; top=next_top )
{
  next_top = top->next;

  if( top->type == type )
  {
    if ( ( temp=on_topten_list(top,name,AC,value) )!=NULL)
    {
       /* Update Low values */
       UNLINK(top,first_topten,last_topten,next,prev);
       DISPOSE(top);
       LINK(temp,first_topten,last_topten,next,prev);
       break;
    }

    /* Only Insert if it is higher then the lowest in the list --GW */
    if ( ( !AC && value < lowest_toptens[type] ) ||
         ( AC && value > lowest_toptens[type] ) )
    return;

    for( cnt=0; cnt <= 9; cnt++ )
    {
      if ( ( !AC && value > top->values[cnt] ) ||
           ( AC && value < top->values[cnt] ) )
      {
	if ( cnt == 9 )
	{
	   top->plist[9] = name;
           top->values[9] = value;
	   break;
        }
        else
        {
        /* Move everyone else up, and insert myself */
   	    top->plist[9] = top->plist[8]; /* put me in 9th */
	    top->values[9]= top->values[8];
  	if ( cnt < 8 ) /* put me in 8th */
        {
	    top->plist[8] = top->plist[7]; 
	    top->values[8]= top->values[7];
	}
  	if ( cnt < 7 ) /* put me in 7th */
        {
	    top->plist[7] = top->plist[6]; 
	    top->values[7]= top->values[6];
	}
  	if ( cnt < 6 ) /* put me in 6th */
        {
	    top->plist[6] = top->plist[5]; 
	    top->values[6]= top->values[5];
	}
  	if ( cnt < 5 ) /* put me in 5th */
        {
	    top->plist[5] = top->plist[4]; 
	    top->values[5]= top->values[4];
	}
  	if ( cnt < 4 ) /* put me in 4th */
        {
	    top->plist[4] = top->plist[3]; 
	    top->values[4]= top->values[3];
	}
  	if ( cnt < 3 ) /* put me in 3rd */
        {
	    top->plist[3] = top->plist[2]; 
	    top->values[3]= top->values[2];
	}
  	if ( cnt < 2 ) /* Put me in 2nd */
        {
	    top->plist[2] = top->plist[1]; 
	    top->values[2]= top->values[1];
	}
  	if ( cnt < 1 ) /* Put me in 1st */
        {
	    top->plist[1] = top->plist[0]; 
	    top->values[1]= top->values[0];
	}

	top->plist[cnt] = name;
        top->values[cnt] = value;
	if ( top->values[cnt] == 0 )
	top->plist[cnt] = STRALLOC("None");
        break;
   } /* Else */


}/* if ( value is greater )*/
}/* for ( value scan )*/

lowest_toptens[type] = top->values[9];

}/* if  ( type is right )*/
}/* for (tpye check)*/

fwrite_topten();
return;	    
}

void do_topten( CHAR_DATA *ch, char *argument )
{
char arg1[MSL];
TOPTEN_DATA *top, *next_top;
int cnt=0;
char buf[MSL];

if ( !TOPTEN_ACTIVE )
{
send_to_char("TopTen is not Active.\n\r",ch);
return;
}

if ( IS_NPC(ch) )
return;

one_argument( argument, arg1 );

if ( arg1[0] == '\0' )
{
send_to_char("Syntax: topten <type>\n\r",ch);
send_to_char("\n\rTypes:\n\r",ch);
send_to_char("damroll exp pks hitroll eqac mac ac mana hp\n\r",ch);
return;
}

if ( !str_cmp( arg1, "damroll" ) )
{
  show_topten(ch, TOPTEN_DAMAGE);
  return;
}
if ( !str_cmp( arg1, "exp" ) )
{
  show_topten(ch, TOPTEN_EXP);
  return;
}
if ( !str_cmp( arg1, "pks" ) )
{
  show_topten(ch, TOPTEN_PKS);
  return;
}
if ( !str_cmp( arg1, "hitroll" ) )
{
  show_topten(ch, TOPTEN_HITROLL);
  return;
}
if ( !str_cmp( arg1, "eqac" ) )
{
  show_topten(ch, TOPTEN_AC);
  return;
}
if ( !str_cmp( arg1, "mac" ) )
{
  show_topten(ch, TOPTEN_MAC);
  return;
}
if ( !str_cmp( arg1, "ac" ) )
{
  show_topten(ch, TOPTEN_TAC);
  return;
}
if ( !str_cmp( arg1, "mana" ) )
{
  show_topten(ch, TOPTEN_MANA);
  return;
}
if ( !str_cmp( arg1, "hp" ) )
{
  show_topten(ch, TOPTEN_HP);
  return;
}

/* Secret Value for Hyps */
if ( IS_IMP(ch) )
{
  if ( !str_cmp( arg1,"clear" ) )
  {
    sprintf(buf,"%s cleared the TopTen Data",capitalize(ch->name));
    log_string_plus(buf,LOG_NORMAL,LEVEL_HYPERION);
    for( top = first_topten; top; top = next_top )
    {
      next_top = top->next;
      for( cnt = 0; cnt <= 9; cnt++ )
      {
        top->plist[cnt] = STRALLOC("None");
        top->values[cnt] = 0;
      }
    }
  }
fwrite_topten();
}

send_to_char("Syntax: topten <type>\n\r",ch);
send_to_char("\n\rTypes:\n\r",ch);
send_to_char("damroll exp pks hitroll eqac mac ac mana hp\n\r",ch);
return;
}

void show_topten( CHAR_DATA *ch, sh_int type )
{
int cnt=0;
TOPTEN_DATA *top, *next_top;
char buf[MSL];

for ( top = first_topten; top; top = next_top )
{
  next_top = top->next;
  if ( top->type == type )
    break;
}

ch_printf(ch,"%s\n\r\n\r",get_topten_type_name(type));

for(cnt=0; cnt <= 9; cnt++ )
{
  sprintf(buf,"%2.2d) %-25s %ld\n\r",cnt+1,capitalize(top->plist[cnt]),top->values[cnt]);
  send_to_char(buf,ch);
}

return;
}

void topten_check( CHAR_DATA *ch )
{
if ( IS_NPC(ch) )
  return;

if ( IS_IMMORTAL(ch) )
  return;

if ( !TOPTEN_ACTIVE )
  return;

if ( char_died(ch) )
return;

/* PK's Check */
  topten_update(ch->name,TOPTEN_PKS,ch->pcdata->pkills);

if ( IS_SET(ch->pcdata->flagstwo, MOREPC_NO_LIMIT_CNT) )
{
  topten_update(ch->name,TOPTEN_IMPCHAR,0);
  return;
}

if ( char_died(ch) )
return;

/* Damage Check */
  topten_update(ch->name,TOPTEN_DAMAGE,GET_DAMROLL(ch));

if ( char_died(ch) )
return;

/* Exp check */
  topten_update(ch->name,TOPTEN_EXP,ch->exp);

if ( char_died(ch) )
return;

/* Hitroll Check */
  topten_update(ch->name,TOPTEN_HITROLL,GET_HITROLL(ch));

if ( char_died(ch) )
return;

/* EQ-AC Check */
  topten_update(ch->name,TOPTEN_AC,GET_EQAC(ch));

if ( char_died(ch) )
return;

/* MAC Check */
  topten_update(ch->name,TOPTEN_MAC,GET_MAC(ch));

if ( char_died(ch) )
return;

/* TAC Check */
  topten_update(ch->name,TOPTEN_TAC,GET_AC(ch));

if ( char_died(ch) )
return;

if ( str_cmp( ch->name, "ancientone" ) ) /* Keep the bot off */
{
/* HP Check */
  topten_update(ch->name,TOPTEN_HP,ch->max_hit);

if ( char_died(ch) )
return;

/* Mana Check */
 if ( !IS_VAMPIRE(ch) )
  topten_update(ch->name,TOPTEN_MANA,ch->max_mana);
}
return;
}

char *get_topten_type_name( sh_int type )
{

switch( type )
{
  case TOPTEN_DAMAGE:
    return "--=={== Top Ten Players Sorted by Damage Roll ==}==--";
  case TOPTEN_EXP:
    return "--=={== Top Ten Players Sorted by Experiance Points ==}==--";
  case TOPTEN_PKS:
    return "--=={== Top Ten Players Sorted by Player Kills ==}==--";
  case TOPTEN_HITROLL:
    return "--=={== Top Ten Players Sorted by Hit Roll ==}==--";
  case TOPTEN_AC:
    return "--=={== Top Ten Players Sorted by EQ-AC ==}==--";
  case TOPTEN_MAC:
    return "--=={== Top Ten Players Sorted by Magical AC ==}==--";
  case TOPTEN_TAC:
    return "--=={== Top Ten Players Sorted by Total AC ==}==--";
  case TOPTEN_MANA:
    return "--=={== Top Ten Players Sorted by Mana Points ==}==--";
  case TOPTEN_HP:
    return "--=={== Top Ten Players Sorted by Hit Points ==}==--";
  default:
    return "[**ERROR**]";
}

return NULL;
}

void fwrite_topten( void )
{
FILE *fp;
TOPTEN_DATA *top, *next_top;
int cnt=0;

if ( ( fp = fopen( TOPTEN_FILE, "w" ) )==NULL )
{
  bug("fwrite_topten: cannot open db file!",0);
  return;
}

for( top = first_topten; top; top = next_top )
{
   next_top = top->next;

   
   fprintf(fp,"#ENTRY\n");
   fprintf(fp,"%d\n",top->type);

   for( cnt=0; cnt <= 9; cnt++ )
   fprintf(fp,"%s~\n",top->plist[cnt]);

   for( cnt=0; cnt <= 9; cnt++ )
   fprintf(fp,"%ld\n",top->values[cnt]);
   
}
   fprintf(fp,"#END\n");
   new_fclose(fp);
return;
}

TOPTEN_DATA *on_topten_list( TOPTEN_DATA *top, char *name, bool AC, long value )
{
int cnt=0;
TOPTEN_DATA *temp;

for( cnt = 0; cnt <= 9; cnt++ )
{
  if (!str_cmp( top->plist[cnt], name ) &&
      str_cmp( top->plist[cnt], "ancientone") )
  {
    top->values[cnt] = value;
    temp=list_resort(top,AC);
    return temp;
  }
}

return NULL;
}

TOPTEN_DATA *list_resort( TOPTEN_DATA *top, bool AC )
{
long top_value=0;
int main_cnt=0;
TOPTEN_DATA *temp=NULL;

CREATE(temp, TOPTEN_DATA, 1);

temp->type = top->type;

for( main_cnt=0; main_cnt <=9; main_cnt++ )
{
/* Make it Stop at None */
/*if ( !str_cmp( top->plist[main_cnt], "None" ) )
{
  temp->plist[main_cnt] = STRALLOC("None");
  temp->values[main_cnt] = 0;
  continue;
}*/

if ( !AC )
top_value = get_top_number(top);
else
top_value = get_low_number(top);

temp->values[main_cnt] = top->values[top_value]; 
temp->plist[main_cnt] = top->plist[top_value];
top->values[top_value] = 0;
}

return temp;
}

int get_top_number( TOPTEN_DATA *top )
{
int cnt=0;
long top_value=0;
int top_cnt=0;

for( cnt=0; cnt <= 9; cnt++ )
{

if ( top->values[cnt] > top_value )
{
  top_value = top->values[cnt];
  top_cnt=cnt;
}

}

return top_cnt;
}

int get_low_number( TOPTEN_DATA *top )
{
int cnt=0;
long top_value=0;
int top_cnt=0;

for( cnt=0; cnt <= 9; cnt++ )
{

if ( top->values[cnt] < top_value )
{
top_value = top->values[cnt];
top_cnt = cnt;
}

}

return top_cnt;
}

/* Remove Deleted Players from the Lists --GW */
void topten_exist_check( TOPTEN_DATA *top )
{
FILE *fp;
int cnt=0;
bool found;
char buf[MSL];
char file[MSL];
char *entry;

buf[0] = '\0';
file[0] = '\0';

for( cnt=0; cnt <= 9; cnt++ )
{
  found = FALSE;
  entry = top->plist[cnt];
  if ( !str_cmp(top->plist[cnt],"Ancientone") )
  {
       sprintf(buf,"TOPTEN: %s - Registered BOT, Removing.",top->plist[cnt]);
       log_string(buf);
       top->plist[cnt] = STRALLOC("None");
       top->values[cnt] = 0;
       continue;
  }
  entry[0] = LOWER(entry[0]);
  sprintf(file,"%s%c/%s.gz",PLAYER_DIR,entry[0],capitalize(entry));
  if ( ( fp=fopen(file,"r") )==NULL)
  {
    sprintf(file,"%s%c/%s",PLAYER_DIR,entry[0],capitalize(entry));
    if ( ( fp=fopen(file,"r") )==NULL)
    {
       sprintf(buf,"TOPTEN: %s Not found, Removing.",top->plist[cnt]);
       log_string(buf);
       top->plist[cnt] = STRALLOC("None");
       top->values[cnt] = 0;
    }
    else
     new_fclose(fp);
  }
  else
    new_fclose(fp);
}

return;
}