mcloud/
/***************************************************************************
 *  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.                                                  *
 ***************************************************************************/

/**********************************
 * 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 (get_ratio(ch) != top_board[i].pkscore) top_board[i].pkscore = get_ratio(ch);
      changed = TRUE;
      sort_top_board();
      i = MAX_TOP_PLAYERS+1;
    }
  }
  for (i = 1; i <= MAX_TOP_PLAYERS && !changed; i++)
  {
    if (get_ratio(ch) > 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 = get_ratio(ch);
      free_string(top_board[i].name);
      top_board[i].name = str_dup(ch->name);
      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 (get_ratio(ch) > leader_board.bestpk_number || !str_cmp(leader_board.bestpk_name , ch->name))
  {
    leader_board.bestpk_number = get_ratio(ch);
    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;
}
/*
void do_top( CHAR_DATA *ch, char *argument )
{
  char buf[MAX_STRING_LENGTH];
  int i;

  if (IS_NPC(ch)) return;   
 
  stc("#r==--==#B**#r== #GTOP PKSCORE #r==#B**#r==--==#n\n\r\n\r",ch);
  for (i = 1; i <= MAX_TOP_PLAYERS; i++)
  {
    sprintf(buf," %2d.  %-15s      %-4d\n\r", i, top_board[i].name, top_board[i].pkscore);
    send_to_char(buf,ch);
  }
  sprintf(buf,"\n\r   #GYou #0:#G                %-4d\n\r",get_ratio(ch));
  send_to_char(buf,ch);
  stc("\n\r#r==#B**#r==--==#B**#r==--==#B**#r==--==#B**#r==--==#n\n\r",ch);
  return;
}


void do_topclear( CHAR_DATA *ch, char *argument )
{
  int i;

  if (IS_NPC(ch)) return;
  if (ch->level < MAX_LEVEL) return;
  for (i = 1; i <= MAX_TOP_PLAYERS; i++)  
  {
    top_board[i].pkscore = 0;
    free_string(top_board[i].name);
    top_board[i].name = str_dup("Noone");
  }
  save_topboard();
  send_to_char("Top cleared.\n\r",ch);
  return;
}
*/