mcloud2/i3/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/
/***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/
/**********************************
 * All kinds of new stuff by Jobo *
 **********************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#if !defined(WIN32)
#include <unistd.h>
#endif
#include "merc.h"

void    sort_top_board  args( ( void ) );

void load_topboard()
{
  int i;   
  FILE *fp;

  if ((fp = fopen("../txt/topboard.txt", "r")) == NULL)
  {
    log_string("Error: topboard.txt not found!");
    exit(1);
  }
  top_board[0].name = " ";
  top_board[0].pkscore = 0;
  for (i = 1; i <= MAX_TOP_PLAYERS; i++)
  {
    top_board[i].name = fread_string(fp);
    top_board[i].pkscore = fread_number(fp);
  }
  fclose(fp);
}

void update_top_board( CHAR_DATA *ch )
{
  int i,j;
  bool changed = FALSE;

  if (IS_NPC(ch)) return;
  if (ch->level > 6) return;

  for (i = 1; i <= MAX_TOP_PLAYERS && !changed; i++)
  {
    if (!str_cmp(ch->name,top_board[i].name))
    {
      if (ch->race != top_board[i].pkscore) top_board[i].pkscore = ch->race;
      changed = TRUE;
      sort_top_board();
      i = MAX_TOP_PLAYERS+1;
    }
  }
  for (i = 1; i <= MAX_TOP_PLAYERS && !changed; i++)
  {
    if (ch->race > top_board[i].pkscore)
    {
      for (j = MAX_TOP_PLAYERS; j > i; j--)
      {
        top_board[j].pkscore = top_board[j-1].pkscore;
        free_string(top_board[j].name);
        top_board[j].name = str_dup(top_board[j-1].name);
      }
      top_board[i].pkscore = ch->race;
      free_string(top_board[i].name);
      top_board[i].name = str_dup(ch->pcdata->switchname);
      changed = TRUE;
      i = MAX_TOP_PLAYERS+1;
    }
  }
  if (changed) save_topboard();
  return;
}

void sort_top_board()
{
  int i, tempscore;
  bool sorting = FALSE;
  char buf[MAX_STRING_LENGTH];

  for (i = 1; i < MAX_TOP_PLAYERS; i++)
  {
    if (top_board[i].pkscore < top_board[i+1].pkscore)
    {
      tempscore = top_board[i].pkscore;
      sprintf (buf, "%s", top_board[i].name);
      free_string(top_board[i].name);
      top_board[i].name = str_dup(top_board[i+1].name);
      top_board[i].pkscore = top_board[i+1].pkscore;
      free_string(top_board[i+1].name);
      top_board[i+1].name = str_dup(buf);;
      top_board[i+1].pkscore = tempscore;
      sorting = TRUE;
    }
  }
  if (sorting) sort_top_board();
  else return;
}

void save_topboard()
{
  FILE *fp;
  int i;

  if ((fp = fopen("../txt/topboard.txt","w")) == NULL)
  {
    log_string("Error writing to topboard.txt");
    return;
  }
  for (i=1;i<=MAX_TOP_PLAYERS;i++)
  {
    fprintf(fp, "%s~\n", top_board[i].name); 
    fprintf(fp, "%d\n", top_board[i].pkscore);
  }
  fclose (fp);
}

void load_leaderboard()
{
  FILE *fp;

  if ((fp = fopen("../txt/leader.txt", "r")) == NULL)
  {   
    log_string("Error: leader.txt not found!");
    exit(1);
  }
  leader_board.bestpk_name = fread_string(fp);  
  leader_board.bestpk_number = fread_number(fp);
  leader_board.pk_name = fread_string(fp);
  leader_board.pk_number = fread_number(fp);
  leader_board.pd_name = fread_string(fp);
  leader_board.pd_number = fread_number(fp);
  leader_board.mk_name = fread_string(fp);
  leader_board.mk_number = fread_number(fp);
  leader_board.md_name = fread_string(fp);
  leader_board.md_number = fread_number(fp);
  leader_board.tt_name = fread_string(fp);
  leader_board.tt_number = fread_number(fp);
  leader_board.qc_name = fread_string(fp);
  leader_board.qc_number = fread_number(fp);
  fclose(fp);
}

void save_leaderboard()
{
  FILE *fp;

  if ((fp = fopen("../txt/leader.txt","w")) == NULL)
  {
    log_string("Error writing to leader.txt");
    return;
  }
  fprintf(fp, "%s~\n", leader_board.bestpk_name); 
  fprintf(fp, "%d\n", leader_board.bestpk_number);
  fprintf(fp, "%s~\n", leader_board.pk_name);
  fprintf(fp, "%d\n", leader_board.pk_number);
  fprintf(fp, "%s~\n", leader_board.pd_name);     
  fprintf(fp, "%d\n", leader_board.pd_number);
  fprintf(fp, "%s~\n", leader_board.mk_name);
  fprintf(fp, "%d\n", leader_board.mk_number);
  fprintf(fp, "%s~\n", leader_board.md_name);
  fprintf(fp, "%d\n", leader_board.md_number);
  fprintf(fp, "%s~\n", leader_board.tt_name);
  fprintf(fp, "%d\n", leader_board.tt_number);
  fprintf(fp, "%s~\n", leader_board.qc_name);
  fprintf(fp, "%d\n", leader_board.qc_number);
  fclose (fp);
}

void do_leader( CHAR_DATA *ch, char *argument )
{    
  char buf[MAX_STRING_LENGTH];

  if (IS_NPC(ch)) return;

  stc("#r-==--==#B**#r==--==#B**#r==--==#B**#r== #GLEADER BOARD #r==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==#n\n\r\n\r",ch);

  send_to_char("   #yMr. Best PK'er   #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.bestpk_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith a #G%d #yPK score#n\n\r",leader_board.bestpk_number);
  send_to_char(buf,ch);

  send_to_char("   #yMr. Deadly       #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.pk_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #ypkills#n\n\r",leader_board.pk_number);
  send_to_char(buf,ch);

  send_to_char("   #yMr. Pathetic     #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.pd_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #ypdeaths#n\n\r",leader_board.pd_number);
  send_to_char(buf,ch);
  
  send_to_char("   #yMr. Slayer       #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.mk_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #ymkills#n\n\r",leader_board.mk_number);
  send_to_char(buf,ch);
  
  send_to_char("   #yMr. Wimpy        #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.md_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #ymdeaths#n\n\r",leader_board.md_number);
  send_to_char(buf,ch);
  
  send_to_char("   #yMr. No life      #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.tt_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #yHours played#n\n\r",leader_board.tt_number);
  send_to_char(buf,ch);
  
  send_to_char("   #yMr. Questor      #C--->    ",ch);
  sprintf(buf, "#G%-13s",leader_board.qc_name);
  send_to_char(buf,ch);
  sprintf(buf, " #ywith #G%d #yQuests completed#n\n\r",leader_board.qc_number);
  send_to_char(buf,ch);

  stc("\n\r#r-==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==#n\n\r",ch);
  return;
}

void check_leaderboard( CHAR_DATA *ch )
{
  bool changed = FALSE;

  if (IS_NPC(ch)) return;
  if (ch->level > 6) return;
  if (ch->race > leader_board.bestpk_number || !str_cmp(leader_board.bestpk_name , ch->name))
  {
    leader_board.bestpk_number = ch->race;
    free_string(leader_board.bestpk_name);
    leader_board.bestpk_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (ch->mdeath > leader_board.md_number)
  {
    leader_board.md_number = ch->mdeath;
    free_string(leader_board.md_name);
    leader_board.md_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (ch->mkill > leader_board.mk_number)
  {
    leader_board.mk_number = ch->mkill;
    free_string(leader_board.mk_name);
    leader_board.mk_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (ch->pkill > leader_board.pk_number)
  {
    leader_board.pk_number = ch->pkill;
    free_string(leader_board.pk_name);
    leader_board.pk_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (ch->pdeath > leader_board.pd_number)
  {
    leader_board.pd_number = ch->pdeath;
    free_string(leader_board.pd_name);
    leader_board.pd_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (ch->pcdata->questsrun > leader_board.qc_number)
  {
    leader_board.qc_number = ch->pcdata->questsrun;
    free_string(leader_board.qc_name);
    leader_board.qc_name = str_dup(ch->name);
    changed = TRUE;
  }
  if ((get_age(ch)-17)*2 > leader_board.tt_number)
  {
    leader_board.tt_number = (get_age(ch)-17)*2;
    free_string(leader_board.tt_name);
    leader_board.tt_name = str_dup(ch->name);
    changed = TRUE;
  }
  if (changed) save_leaderboard();
  return;
}

void do_leaderclear(CHAR_DATA *ch, char *argument )
{
  if (IS_NPC(ch)) return;
  if (ch->level < 7) return;
  free_string(leader_board.bestpk_name);
  leader_board.bestpk_name = str_dup("Noone");
  leader_board.bestpk_number = 0;
  free_string(leader_board.pk_name);
  leader_board.pk_name = str_dup("Noone");
  leader_board.pk_number = 0;
  free_string(leader_board.pd_name);
  leader_board.pd_name = str_dup("Noone");
  leader_board.pd_number = 0;
  free_string(leader_board.md_name);
  leader_board.md_name = str_dup("Noone");
  leader_board.md_number = 0;
  free_string(leader_board.mk_name);
  leader_board.mk_name = str_dup("Noone");
  leader_board.mk_number = 0;
  free_string(leader_board.qc_name);
  leader_board.qc_name = str_dup("Noone");
  leader_board.qc_number = 0;
  free_string(leader_board.tt_name);
  leader_board.tt_name = str_dup("Noone");
  leader_board.tt_number = 0;
  save_leaderboard();
  send_to_char("Leader board cleared.\n\r",ch);
  return;
}