EmlenMud2003LOC/
EmlenMud2003LOC/world/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"

void 
check_pkdata (CHAR_DATA * ch)
{
  int k, i;
  int oldslot[PKN];
  int newslot[PKN];
  float charinfo[PKN];
  bool in_pkdata_already[PKN];
  bool foundnew[PKN];
  if (IS_MOB (ch))
    return;
  if (LEVEL(ch) > 90) return;

/* Prevent Neutrals from appearing in pkdata */
  if (ALIGN (ch) == 0 )
    return;

  for (i = 0; i < PKN; i++)
    charinfo[i] = 0.0;

  if (ch->pcdata->warpoints <0) ch->pcdata->warpoints = 0;
  if (current_time - ch->pcdata->created > 0 &&  current_time - startup_time > 0) 
    {
       charinfo[10] = (float)((float) (ch->pcdata->played + (current_time
- ch->pcdata->logon)))*100.0/((float)(current_time-ch->pcdata->created));
      charinfo[11] = (float)((float)
(ch->pcdata->played)*100.0)/((float)(current_time-startup_time));
    }
  if (ch->pcdata->pkills > 20)
    {
      charinfo[0] = (float) ch->pcdata->pkills;
      charinfo[1] = (float) ((float) ch->pcdata->pklevels /
			       (float) ch->pcdata->pkills);
      charinfo[2] = (float) ((float) ch->pcdata->pkills /
			     (float) ch->pcdata->pkhelpers);
      charinfo[5] = (float)   ch->pcdata->total_wps;
      charinfo[6] =  (float) ((float) ch->pcdata->pkills /
			       (float) ch->pcdata->pklevels);
      charinfo[7] = (float) ((float) ch->pcdata->pkhelpers/
			     (float) ch->pcdata->pkills); 
      charinfo[8] = (float) ch->pcdata->warpoints;
      charinfo[9] = (float) ch->pcdata->hard_pkills;
     
      
      

    }
  if (ch->pcdata->pkilled >=1)
    {
      charinfo[3] = (float) ((float) ch->pcdata->pkilled);
      charinfo[4] = (float) ((float) ch->pcdata->pkers /
				    (float) ch->pcdata->pkilled);
    }
  for (k=0; k < PKN; k++)
    {
      oldslot[k] = -1;
      in_pkdata_already[k] = FALSE;
      newslot[k] = -1;
      foundnew[k] = FALSE;
    }
  for (i=0; i < PKN; i++)
    {
      for (k = 0; k < MAX_PKDATA; k++)
	{
          if (!str_cmp (capitalize (NAME (ch)), pkdata[k][i].name))
	    {   
	      in_pkdata_already[i] = TRUE;
	      oldslot[i] = k;  
	    }
	}
    }
  send_to_char("\n\r", ch);
  for (i = 0; i < PKN; i++)
    {
      if (in_pkdata_already[i] && (oldslot[i] <= (MAX_PKDATA-2)) && (oldslot[i] >=0))
	{
	  for (k = oldslot[i]; k < (MAX_PKDATA -1); k++)
	    {
	      if (k > (MAX_PKDATA-2))
		break;
	      strcpy (pkdata[k][i].name, pkdata[k+1][i].name);
	      pkdata[k][i].value = pkdata[k+1][i].value;
	      pkdata[k][i].alignment = pkdata[k+1][i].alignment;
	    }
	  strcpy (pkdata[MAX_PKDATA-1][i].name, "Free-Slot");
	  pkdata[MAX_PKDATA-1][i].value = 0.0;
	  pkdata[MAX_PKDATA-1][i].alignment = FALSE;
	}
    }
  for(i=0; i < PKN; i++)
    {
      if (charinfo[i] > 0)
	{
	  for (k=0; k < MAX_PKDATA; k++)
	    { 
	      if(charinfo[i] > pkdata[k][i].value)
		{
		  newslot[i] = k;
		  break;
		}
	    }
	}
      else
	newslot[i] = -1;
    }
  for(i=0; i < PKN;i ++)
    {
      if ((newslot[i] >=0) && (newslot[i] < (MAX_PKDATA-1)))
	{
	  for (k = (MAX_PKDATA -1); k > newslot[i]; k--)
	    {
	      strcpy (pkdata[k][i].name, pkdata[k-1][i].name);
	      pkdata[k][i].value = pkdata[k-1][i].value;
	      pkdata[k][i].alignment = pkdata[k-1][i].alignment;
	    }
	}
      if(newslot >=0)
	{
	  strcpy (pkdata[newslot[i]][i].name, capitalize (NAME (ch)));
	  pkdata[newslot[i]][i].alignment = ch->pcdata->alignment;
	  pkdata[newslot[i]][i].value = charinfo[i];
	  strcpy (pkdata[newslot[i]][i].name, capitalize (NAME (ch)));
	}
    }
  return;
}





void 
check_topten (CHAR_DATA * ch)
{
  int k;
  int oldslot;
  int newslot;
  bool in_topten_already;
  if (IS_MOB (ch))
    return;
  if (LEVEL (ch) > 90 ) return;

/* Prevent Neutrals from appearing on topten */
  if (ALIGN (ch)== 0 )
    return;

  oldslot = -1;
  in_topten_already = FALSE;
  if (ch->pcdata->warpoints  < 0) ch->pcdata->warpoints = 0;
  for (k = 0; k < MAX_TOPTEN; k++)
    {
      if (!str_cmp (capitalize (NAME (ch)), topten.topten_name[k]))
         {
            in_topten_already = TRUE;
            oldslot = k;
            break;  
         }
    }
   if (in_topten_already && (oldslot <= (MAX_TOPTEN-2)))
      {
	  for (k = oldslot; k < (MAX_TOPTEN -1); k++)
	    {
	      if (k > (MAX_TOPTEN-2))
		break;
	      strcpy (topten.topten_name[k], topten.topten_name[k + 1]);
	      topten.topten_warpoints[k] = topten.topten_warpoints[k + 1];
	      topten.topten_alignment[k] = topten.topten_alignment[k + 1];
	    }
          strcpy (topten.topten_name[MAX_TOPTEN-1], "Free-Slot");
          topten.topten_warpoints[MAX_TOPTEN-1] = 0;
          topten.topten_alignment[MAX_TOPTEN-1] = TRUE;
	}
      newslot = -1;
      for (k=0; k < MAX_TOPTEN; k++)
	{
          if (ch->pcdata->warpoints > topten.topten_warpoints[k])
             {  
               newslot = k;
               break;
             }
        }
 if (newslot >=0)
   {
     /*Move everyone after that slot down on the list */
     for (k = (MAX_TOPTEN -1); k > newslot; k--)
       {
	 strcpy (topten.topten_name[k], topten.topten_name[k - 1]);
	 topten.topten_warpoints[k] = topten.topten_warpoints[k - 1];
	 topten.topten_alignment[k] = topten.topten_alignment[k - 1];
       }
     topten.topten_warpoints[newslot] = ch->pcdata->warpoints;
     strcpy (topten.topten_name[newslot], capitalize (NAME (ch)));
   
     topten.topten_alignment[newslot] = ch->pcdata->alignment;
    
     
   }
 if (number_range(1,3) == 2)
   save_topten ();
 return;
 
}



void
check_rating (CHAR_DATA * ch)
{
  int k;
  int oldslot = -1;
  int newslot;
  bool in_rating_already;
  int ratng = rating(ch);
  if (IS_MOB (ch))
    return;
  if (LEVEL(ch) > 91)
     return;

/* Prevent Neutrals from appearing on rating */
  if (ALIGN(ch)==0)
     return;

  in_rating_already = FALSE;
  for (k = 0; k < MAX_RATING; k++)
    {
      if (!str_cmp (capitalize (NAME (ch)), ratingd.rating_name[k]))
	{
	  in_rating_already = TRUE;
	  oldslot = k;
	  break;  
	}
    }
  if (in_rating_already && (oldslot < (MAX_RATING-1)))
    {
      for (k = oldslot; k < (MAX_RATING -1); k++)
	{
	  if (k > (MAX_RATING-1))
	    break;
	  strcpy (ratingd.rating_name[k], ratingd.rating_name[k + 1]);
	  ratingd.rating_rating[k] = ratingd.rating_rating[k + 1];
	  ratingd.rating_alignment[k] = ratingd.rating_alignment[k + 1];
	}
      
      strcpy (ratingd.rating_name[MAX_RATING-1], "<Free-Slot>");
      ratingd.rating_rating[MAX_RATING-1] = 0;
      ratingd.rating_alignment[MAX_RATING-1] = TRUE;
    }
  if (in_rating_already)
    ratingd.rating_rating[MAX_RATING-1] = 0;
  newslot = -1;
  for (k=0; k < MAX_RATING; k++)
    {
      if (ratng > ratingd.rating_rating[k])
	{  
	  newslot = k;
	  break;
	}
      
    }
  if (newslot >=0)
    {
      if (newslot < (MAX_RATING-1))
	{
	  /*Move everyone after that slot down on the list */
	  for (k = (MAX_RATING -1); k > newslot; k--)
	    {
	      strcpy (ratingd.rating_name[k], ratingd.rating_name[k - 1]);
	      ratingd.rating_rating[k] = ratingd.rating_rating[k - 1];
	      ratingd.rating_alignment[k] = ratingd.rating_alignment[k - 1];
	    }
	}
      ratingd.rating_rating[newslot] = rating(ch);
      strcpy (ratingd.rating_name[newslot], capitalize (NAME (ch)));
      ratingd.rating_alignment[newslot] = ch->pcdata->alignment;
      
      if (number_range(1,3) == 2)
	save_rating ();
    }
  return;
}


void 
do_trophy (CHAR_DATA * ch, char *argy)
{
  bool foundy;
  char buffy[500];
  int i;
  DEFINE_COMMAND ("trophy", do_trophy, POSITION_SLEEPING, 0, LOG_NORMAL, "Shows your mob or pkill trophy.")

    if (IS_MOB (ch))
    return;

  foundy = FALSE;
  send_to_char (" \x1B[1;34m[\x1B[30mTrophy of Kills\x1B[34m]\x1B[1;37m\n\r\n\r", ch);
  sprintf (buffy, "%5s %6s %5s\n\r",
	   "\x1B[1;30m[\x1B[32mLvl\x1B[30m]",
	   "\x1B[1;31m[\x1B[37mName\x1B[31m]",
	   "\x1B[1;36m[\x1B[35mTimes\x1B[36m]");
  send_to_char (buffy, ch);
  for (i = 0; i < MAX_TROPHY; i++)
    if ((ch->pcdata->trophy_name[i] != '\0') && (ch->pcdata->trophy_level[i] >=1) && (ch->pcdata->trophy_times[i] >=1))
      {
	foundy = TRUE;
	sprintf (buffy,
		 "\x1B[37;0m[\x1B[1;34m%3d\x1B[37;0m] %-23s\x1B[1;37m*%-4d\n\r", 
		 ch->pcdata->trophy_level[i],
		 ch->pcdata->trophy_name[i], ch->pcdata->trophy_times[i]);
	send_to_char (buffy, ch);
      }
  if (!foundy)
    {
      send_to_char ("\n\rNone.\n\r", ch);
    }
  send_to_char ("\x1B[37;0m", ch);
  return;
}


void 
do_topten (CHAR_DATA * ch, char *argy)
{
  char buffy[500];
  char buf[200];
  int position;
  int i;
  DEFINE_COMMAND ("topten", do_topten, POSITION_SLEEPING, 0, LOG_NORMAL, "Shows the top PKillers.")
    
    if (IS_MOB (ch))
      return;
  position = ch->position;
  ch->position = POSITION_STANDING;
  if (LEVEL(ch) < 90)
    check_topten(ch);

  if (!str_cmp(argy, "reset") && LEVEL(ch) == MAX_LEVEL)
    {
      send_to_char("Resetting topten.\n\r", ch);
      for (i = 0; i < MAX_RATING; i++)
	{
           strcpy(topten.topten_name[i], "Free-Slot");
           topten.topten_warpoints[i] = 0;
           topten.topten_alignment[i] = 0;      
         }
      return;
    }

  for ( i=0; i < MAX_TOPTEN; i++)
    {
      sprintf (buffy, "\x1b[1;3%dm* $B$0#%-2d $B$7%-35s $B$0-->$B$7 %-6ld$4 $B$4Warpoints$7",
	       (URANGE(0,(topten.topten_alignment[i]-1)*7, 7)),i + 1,  
	       topten.topten_name[i], topten.topten_warpoints[i]);
      act (buffy, ch, NULL, ch, TO_CHAR);
    }
  sprintf(buffy, "\n\rYou have \x1b[1;31m%ld\x1b[0;37m warpoints.\n\r", ch->pcdata->warpoints);
  send_to_char(buffy, ch);
  ch->position = position;
  return;
}



void 
do_pkstat (CHAR_DATA * ch, char *argy)
{
  char buffy[SML_LENGTH];
  int position;
  int i, k;
  char arg1[SML_LENGTH];
  DEFINE_COMMAND ("pkstat", do_pkstat, POSITION_SLEEPING, 0, LOG_NORMAL,
"Shows the pkstat info.")

    if (IS_MOB (ch))
    return;
    if (LEVEL(ch) < 91) check_pkdata (ch);
  position = ch->position;
  ch->position = POSITION_STANDING;
  if (number_range(1,5) == 4)
    save_pkdata();
  if (!str_cmp(argy, "reset") && LEVEL(ch) == MAX_LEVEL)
    {
      for (i = 0; i < MAX_PKDATA; i++)
        {
          for (k = 0; k < PKN; k++)
            {
               strcpy(pkdata[i][k].name, "Free-Slot");
               pkdata[i][k].alignment = 0;
               pkdata[i][k].value = 0.0;
            }
        }
      send_to_char("Resetting pkdata.\n\r", ch);
      return;
    }    


  argy = one_argy(argy, arg1);

  if (!str_cmp(arg1, "pkills"))
    {
      i=0;
      send_to_char("\x1b[0;31mTotal number of pkills:\n\n\r", ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  int pkillz = (int) pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $R$4#%-2d $3%-35s $0-->$5 %-7d",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pkillz);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYour total number of pkills is: \x1b[1;32m%d\x1b[0;37m.\n\r", ch->pcdata->pkills);
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    }

 if (!str_cmp(arg1, "ave"))
    {
      send_to_char("\x1b[0;31mAverage level of pkill victims:\n\n\r",ch);
      i=1;
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %2.4f",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pkdata[k][i].value);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYour average level of pkill victims is \x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)ch->pcdata->pklevels)/((float) (UMAX(ch->pcdata->pkills, 1))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    } 
 
 if (!str_cmp(arg1, "num"))
    { 
      i=2;
      send_to_char("\x1b[0;31mYour average groupsize when you pkill someone.\n\n\r", ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	
	  float groupsize;
	if (pkdata[k][i].value > 0)
           groupsize = 1 / pkdata[k][i].value;
        else groupsize = 0;
	  sprintf (buffy, "\x1b[1;3%dm* $B$1#%-2d $2%-35s $5-->$0% 2.4f",
	     (pkdata[k][i].alignment), k + 1,  
            pkdata[k][i].name, groupsize);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYour average groupsize when you pkill someone is \x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)ch->pcdata->pkhelpers)/((float) (UMAX(ch->pcdata->pkills, 1))));
	send_to_char(buffy, ch);
      ch->position = position;
      return;
    }

 if (!str_cmp(arg1, "pdeaths") && LEVEL(ch) < 111)
    {
      i=3;
      send_to_char("\x1b[0;31mThe people who have been pkilled the most.\n\n\r", ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  int pdeaths = (int) pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $B$7#%-2d $5%-35s $B$4-->$1 %-6d$R$7",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pdeaths);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
         sprintf(buffy, "\n\rYour total number of times you have been pkilled is: \x1b[1;32m%d\x1b[0;37m.\n\r", ch->pcdata->pkilled);
      send_to_char(buffy, ch);
      send_to_char ("\x1B[37;0m", ch);
      ch->position = position;
      return;
    }

 if (!str_cmp(arg1, "dif"))
    {
      i=4;
      send_to_char("\x1b[0;31mThe people who need the most opponents to kill them.\n\n\r", ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  float diff = pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $B$4#%-2d $3%-35s $0--> $1%2.3f",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, diff);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYou require \x1b[1;34m%2.4f\x1b[0;37m people to kill you on average.\n\r", (float) ((float)ch->pcdata->pkers)/((float) (UMAX(ch->pcdata->pkilled, 1))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    }

 if (!str_cmp(arg1, "total_wps"))
    {
      send_to_char("\x1b[0;31mTotal Warpoints:\n\n\r",ch);
      i=5;
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  int twps = (int) pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %-3d",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, twps);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
         sprintf(buffy, "\n\rYour total number of warpoints is: \x1b[1;32m%ld\x1b[0;37m.\n\r", ch->pcdata->total_wps);
      send_to_char(buffy, ch);
      send_to_char ("\x1B[37;0m", ch);
      ch->position = position;
      return;
    } 
if (!str_cmp(arg1, "hard"))
    {
      send_to_char("\x1b[0;31mHard Pkills:\n\n\r",ch);
      i=9;
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  int twps = (int) pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %-3d",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, twps);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
         sprintf(buffy, "\n\rYour total number of hard pkills is: \x1b[1;32m%ld\x1b[0;37m.\n\r", ch->pcdata->hard_pkills);
      send_to_char(buffy, ch);
      send_to_char ("\x1B[37;0m", ch);
      ch->position = position;
      return;
    }
 /*if (!str_cmp(arg1, "warpoints"))
    {
      send_to_char("\x1b[0;31mWarpoints:\n\n\r",ch);
      i=8;
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  int twps = (int) pkdata[k][i].value;
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %-3d",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, twps);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
	   sprintf(buffy, "\n\rYour number of warpoints is: \x1b[1;32m%d\x1b[0;37m.\n\r", ch->pcdata->warpoints);
      send_to_char(buffy, ch);
      send_to_char ("\x1B[37;0m", ch);
      ch->position = position;
      return;
    }*/ 

 if (!str_cmp(arg1, "newbie_killers") && LEVEL(ch) > 100)
    {
      send_to_char("\x1b[0;31mNewbie Killers:\n\n\r",ch);
      i=6;
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  float groupsize;
	  if (pkdata[k][i].value > 0)
	    groupsize = 1 / pkdata[k][i].value;
	  else groupsize = 0;
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %2.4f",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, groupsize);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
         sprintf(buffy, "\n\rYour average level of pkill victims is \x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)ch->pcdata->pklevels)/((float) (UMAX(ch->pcdata->pkills, 1))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    } 

 if (!str_cmp(arg1, "bgpkw") && LEVEL(ch) < 111)
    {
      i=7;
      send_to_char("\x1b[0;31mBig Group Pkill Whores:\n\n\r",ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %2.4f",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pkdata[k][i].value);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
          sprintf(buffy, "\n\rYour average groupsize when you pkill someone is \x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)ch->pcdata->pkhelpers)/((float) (UMAX(ch->pcdata->pkills, 1))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    } 
/*if (!str_cmp(arg1, "losers"))
    {
      i=10;
      send_to_char("\x1b[0;31mMost time on since they created:\n\n\r",ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %2.4f percent",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pkdata[k][i].value);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYour percentage of playing time since your creation is:\x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)(ch->pcdata->played + current_time - ch->pcdata->logon)*100.0/((float) (current_time - ch->pcdata->created))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    } */
if (!str_cmp(arg1, "no_life_dorks") && LEVEL(ch) < 111)
    {
      i=11;
      send_to_char("\x1b[0;31mMost time on since beginning of the game:\n\n\r",ch);
      for ( k=0; k < MAX_PKDATA; k++)
	{
	  sprintf (buffy, "\x1b[1;3%dm* $B$2%-2d $0%-35s $4-->$1 %2.4f percent",
	     (pkdata[k][i].alignment),k + 1,  
            pkdata[k][i].name, pkdata[k][i].value);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
      sprintf(buffy, "\n\rYour percentage of playing time since the game originally started is:\x1b[1;34m%2.4f\x1b[0;37m.\n\r", (float) ((float)(ch->pcdata->played + current_time - ch->pcdata->logon)*100.0/((float) (current_time - startup_time))));
      send_to_char(buffy, ch);
      ch->position = position;
      return;
    }
 send_to_char("Choose one of: pkills, ave, num, pdeaths, dif, total_wps, bgpkw, newbie_killers.\n\r", ch);
 ch->position = position;
return;

}


void 
do_rating (CHAR_DATA * ch, char *argy)
{
  bool foundy;
  char buffy[500];
  int i;
  int position;
  DEFINE_COMMAND ("rating", do_rating, POSITION_SLEEPING, 0, LOG_NORMAL, "Shows you your current rating.")

    if (IS_MOB (ch))
    return;
  if (LEVEL (ch) < 100)
    check_rating (ch);
  if (!str_cmp(argy, "reset") && LEVEL(ch) == MAX_LEVEL)
    {
      send_to_char("Resetting rating.\n\r", ch);
      for (i = 0; i < MAX_RATING; i++)
	{
           strcpy(ratingd.rating_name[i], "Free-Slot");
           ratingd.rating_rating[i] = 0;
           ratingd.rating_alignment[i] = 0;      
         }
      return;
    }


  position = ch->position;
  ch->position = POSITION_STANDING;
  foundy = FALSE;
  act ("$B$0[$7Top Ten Rated Players$0]", ch, NULL, ch, TO_CHAR);
  send_to_char ("\n\r", ch);
  for (i = 0; i < MAX_RATING; i++)
	{
	  sprintf (buffy, "\x1b[1;3%dm* $B$0#%-2d $B$7%-35s $B$0-->$B$7 %-6ld $B$4Rating$R$7",
	    URANGE(0,(ratingd.rating_alignment[i]-1)*7, 7),
     i + 1, ratingd.rating_name[i], ratingd.rating_rating[i]);
	  act (buffy, ch, NULL, ch, TO_CHAR);
	}
  sprintf (buffy, "\n\r\x1B[0;37mYour current rating: \x1B[1;37m%d\x1B[0;37m\n\r", rating (ch));
  send_to_char (buffy, ch);
  ch->position = position;
  return;
}

int 
free_trophy_slot (CHAR_DATA * ch, CHAR_DATA * victim)
{
  int i;
  int templev;
  int tempnum;
  if (IS_MOB (ch))
    return -1;
  for (i = 0; i < MAX_TROPHY; i++)
    {
      if (ch->pcdata->trophy_name[i][0] == '\0')
	return i;
    }
/*Okay, no free slots, replace lowest level */
  templev = 1000;
  tempnum = -1;
  for (i = 0; i < MAX_TROPHY; i++)
    {
      if (ch->pcdata->trophy_level[i] < templev)
	{
	  tempnum = i;
	  templev = ch->pcdata->trophy_level[i];
	}
    }
  if (ch->pcdata->trophy_level[tempnum] <= LEVEL (victim))
    return tempnum;
  else
    return -1;
}

void 
check_add_trophy (CHAR_DATA * ch, CHAR_DATA * victim, int same_align, int 
diff_align)
{
  int i;
  int nummy;
  int wpstogive;
  float warpoints_mult = 1.0;
  float level_mult = 1.0;
  float groupsize_mult = 1.0;
  float remorts_mult = 1.0;
  float same = (float) same_align;
  float diff = (float) diff_align;
  if (IS_MOB (ch) || IS_MOB (victim))
    return;
/* JRAJRA */
  check_pkdata(ch);

  check_pkdata(victim);
  ch->pcdata->online_spot->pk_since_locate++;
level_mult = (float) (((float)LEVEL (victim)))/((float)(LEVEL (ch)));
  if (level_mult > 2)
    level_mult = 2;
  if (level_mult < .2)
    level_mult = .2;
  groupsize_mult = diff/same;
  if (groupsize_mult >= 1.5)
      groupsize_mult = 1.5;
  if (groupsize_mult < .05)
      groupsize_mult = .05;
  remorts_mult=(float)((float)(5+victim->pcdata->remort_times))/((float)(5+ch->pcdata->remort_times));
  if (remorts_mult > 2)
     remorts_mult = 2;
  if (remorts_mult < .3)
     remorts_mult = .3;  


  warpoints_mult = level_mult * groupsize_mult * remorts_mult;
  if (warpoints_mult < .03)
    warpoints_mult = .03;
  if (warpoints_mult > 1.5)
    warpoints_mult = 1.5;
  /* Large Group Discouragement
  if (same_align > diff_align && same_align > 15)
    {
	if (same_align - 2 > diff_align)
        {
	    warpoints_mult *= .1;
        }
	else {
            warpoints_mult *= .05;
	}
  }
  */
  else if (same_align > 6)
  {
	if (same_align <= diff_align)
	{
	   warpoints_mult *= 1.1;
	}
	else if (same_align <= diff_align + 4)
	{
	   warpoints_mult *= 1;
	}
	else if (same_align <= diff_align + 5)
	{
	   warpoints_mult *= .8;
	}
	else if (same_align < diff_align + 7)
	{
	   warpoints_mult *= .7;
	}
	else
	{
	   warpoints_mult *= .5;
        }
  }
  if (same_align == 1)
    warpoints_mult = 1.7;
  if (warpoints_mult < .03)
    warpoints_mult = .03;
  if (warpoints_mult > 2)
    warpoints_mult = 2;
  wpstogive = (int)((warpoints_mult*((float)LEVEL(victim))));
/* This was set by STRUCTURE to allow all players to get 1.5 the amount of 
xp per kill on a person then normal WARPOINTS */
/*  if (IS_SET(ch->pcdata->act2, PLR_HARDCORE)) */
    wpstogive *= 1.5;
  if (victim->pcdata->died_recently > 2)
  {
    wpstogive = 0;
    send_to_char("Your victim is spam dying, you gain 1 warpoint.\n\r", ch);
    send_to_char("YOU ARE SPAM DYING, STOP OR BE FROZEN! NO WARPOINTS AWARDED!\n\r", victim);
    send_to_char("YOU HAVE LOST 50 WARPOINTS!\n\r", victim);
    victim->pcdata->warpoints -=50;
    if (victim->pcdata->warpoints < 0)
      victim->pcdata->warpoints = 0;
  }
  if (wpstogive > 1)
  {
   ch->pcdata->warpoints +=wpstogive;
   ch->pcdata->total_wps +=wpstogive;
  }
  else
  {
    ch->pcdata->total_wps += 1;
    ch->pcdata->warpoints += 1;
  }
  if (LEVEL (victim) > 59 && victim->pcdata->remort_times > 7)
    {
      ch->pcdata->total_wps += 1;
      ch->pcdata->warpoints += 1;
    }
  if (LEVEL(ch) <= 90)
   check_topten (ch); 



  for (i = 0; i < MAX_TROPHY; i++)
    {
      if (ch->pcdata->trophy_name[i][0] == '\0')
	continue;
      if (!str_cmp (RNAME (victim), ch->pcdata->trophy_name[i]))
	{
	  ch->pcdata->trophy_times[i]++;
	  ch->pcdata->trophy_level[i] = LEVEL (victim);
	  sort_trophy(ch, "moo");
	  return;
	}
   }
  nummy = free_trophy_slot (ch, victim);
    if (nummy == -1) return;
  strcpy (ch->pcdata->trophy_name[nummy], RNAME (victim));
  ch->pcdata->trophy_times[nummy] = 1;
  ch->pcdata->trophy_level[nummy] = LEVEL (victim);
  sort_trophy(ch, "moo");
  return;
}


void 
sort_trophy (CHAR_DATA *ch, char *argy)
{
  int i,k;
  int templev;
  int tempnum;
  char tempname[20];
  for (k = 0; k < (MAX_TROPHY - 1); k++)
    {
      if ((ch->pcdata->trophy_level[k] > 0) &&
(ch->pcdata->trophy_times[k] > 0) && (ch->pcdata->trophy_name[k][0] !=
'\0'))
      for (i = (k+1); i < MAX_TROPHY; i++)
	{
          if ((ch->pcdata->trophy_level[k]) <
(ch->pcdata->trophy_level[i]))
	    {
	      templev = ch->pcdata->trophy_level[i];
	      ch->pcdata->trophy_level[i] = ch->pcdata->trophy_level[k];
	      ch->pcdata->trophy_level[k] = templev;
	      tempnum = ch->pcdata->trophy_times[i];
	      ch->pcdata->trophy_times[i] = ch->pcdata->trophy_times[k];
	      ch->pcdata->trophy_times[k] = tempnum;
	      strcpy(tempname, ch->pcdata->trophy_name[i]);
	      strcpy(ch->pcdata->trophy_name[i],
ch->pcdata->trophy_name[k]);
	      strcpy(ch->pcdata->trophy_name[k], tempname);
	    }
	}
    }
  return;
}