/********************************************************************************
* Stat List code copyright 1999-2001 *
* Markanth : markanth@spaceservices.net *
* Devil's Lament : spaceservices.net port 3778 *
* Web Page : http://spaceservices.net/~markanth/ *
* *
* All I ask in return is that you give me credit on your mud somewhere *
* or email me if you use it. *
********************************************************************************/
/**************************************************************************
* Mindor 1.0 is copyright 2002-2004 by Shaun Mcbride *
* Portions of the code were inspired by other works *
* found around the internet. *
* *
* Please follow all previous copyrights and licenses. *
**************************************************************************/
/* Again heavily modified to work with Mindor. */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "merc.h"
#include "recycle.h"
STAT_DATA *stat_list;
long TopGameStat[MAX_GAMESTAT];
void show_game_stats(CHAR_DATA * ch, int type);
void save_statlist(void)
{
STAT_DATA *pstat;
FILE *fp;
bool found = FALSE;
int i;
CLOSE_RESERVE();
if ((fp = fopen(STAT_FILE, "w")) == NULL)
{
perror(STAT_FILE);
}
fprintf(fp, "TOPSTATS %d ", MAX_GAMESTAT);
for (i = 0; i < MAX_GAMESTAT; i++)
fprintf(fp, "%ld ", TopGameStat[i]);
fprintf(fp, "\n");
for (pstat = stat_list; pstat != NULL; pstat = pstat->next)
{
found = TRUE;
fprintf(fp, "%s ", pstat->name);
for (i = 0; i < MAX_GAMESTAT; i++)
fprintf(fp, "%ld ", pstat->gamestat[i]);
fprintf(fp, "\n");
}
fclose(fp);
OPEN_RESERVE();
if (!found)
unlink(STAT_FILE);
}
void load_statlist(void)
{
FILE *fp;
STAT_DATA *stat_last;
int i,
maxStat = 0;
if ((fp = fopen(STAT_FILE, "r")) == NULL)
return;
if (!str_cmp(fread_word(fp), "TOPSTATS"));
{
maxStat = fread_number(fp);
for (i = 0; i < maxStat; i++)
TopGameStat[i] = fread_number(fp);
}
stat_last = NULL;
for (;;)
{
STAT_DATA *pstat;
if (feof(fp))
{
fclose(fp);
return;
}
pstat = new_stat_data();
pstat->name = str_dup(fread_word(fp));
for (i = 0; i < maxStat; i++)
pstat->gamestat[i] = fread_number(fp);
fread_to_eol(fp);
if (stat_list == NULL)
stat_list = pstat;
else
stat_last->next = pstat;
stat_last = pstat;
}
}
void update_statlist(CHAR_DATA * ch, bool delete)
{
STAT_DATA *prev;
STAT_DATA *curr;
int i;
if (IS_NPC(ch) || IS_IMMORTAL(ch))
return;
prev = NULL;
for (curr = stat_list; curr != NULL; prev = curr, curr = curr->next)
{
if (!str_cmp(ch->name, curr->name))
{
if (prev == NULL)
stat_list = stat_list->next;
else
prev->next = curr->next;
free_stat_data(curr);
save_statlist();
}
}
if (delete)
{
return;
}
curr = new_stat_data();
curr->name = str_dup(ch->name);
for (i = 0; i < MAX_GAMESTAT; i++)
{
curr->gamestat[i] = ch->pcdata->gamestat[i];
if (curr->gamestat[i] > TopGameStat[i])
TopGameStat[i] = curr->gamestat[i];
}
curr->next = stat_list;
stat_list = curr;
save_statlist();
return;
}
void do_showstats(CHAR_DATA * ch, char *argument)
{
int option;
char buf[MSL],
arg[MIL];
argument = one_argument(argument, arg);
if (IS_NULLSTR(arg))
{
send_to_char(" {ROPTIONS AVAILABLE:{x\n\r", ch);
/* belar
send_to_char(" {G0{x - Game Stats on Devils Lament (gstats)\n\r", ch);
*/
send_to_char(" {G1{x - Ranking of Player Killers (pkills)\n\r", ch);
send_to_char(" {G2{x - Ranking of Player Deaths (pdeaths)\n\r", ch);
send_to_char(" {G3{x - Ranking of Mob Kills (mkills)\n\r", ch);
send_to_char(" {G4{x - Ranking of Mob Deaths (mdeaths)\n\r", ch);
send_to_char(" {G5{x - Ranking of Quests Completed (qcomplete)\n\r", ch);
send_to_char(" {G6{x - Ranking of Quests Failed (qfail)\n\r", ch);
send_to_char(" {G7{x - Ranking of Quest Points Earned (qpoints)\n\r", ch);
if(IS_IMMORTAL(ch))
send_to_char(" {Gdelete <name>{x - deletes from statlist\n\r", ch);
return;
}
option = atoi(arg);
if (!str_cmp(arg, "delete") && IS_IMMORTAL(ch))
{
STAT_DATA *prev = NULL;
STAT_DATA *curr = NULL;
bool found = FALSE;
for (curr = stat_list; curr != NULL; prev = curr, curr = curr->next)
{
if (!str_cmp(argument, curr->name))
{
if (prev == NULL)
stat_list = stat_list->next;
else
prev->next = curr->next;
free_stat_data(curr);
save_statlist();
found = TRUE;
}
}
if (!found)
{
sprintf( buf, "Error deleting %s.\n\r", argument);
send_to_char(buf, ch );
}
} else if (option == 1 || !str_prefix(arg, "pkills"))
show_game_stats(ch, PK_KILLS);
else if (option == 3 || !str_prefix(arg, "mkills"))
show_game_stats(ch, MOB_KILLS);
else if (option == 2 || !str_prefix(arg, "pdeaths"))
show_game_stats(ch, PK_DEATHS);
else if (option == 4 || !str_prefix(arg, "mdeaths"))
show_game_stats(ch, MOB_DEATHS);
else if (option == 5 || !str_prefix(arg, "qcomplete"))
show_game_stats(ch, QUESTS_COMPLETE);
else if (option == 6 || !str_prefix(arg, "qfail"))
show_game_stats(ch, QUESTS_FAIL);
else if (option == 7 || !str_prefix(arg, "qpoints"))
show_game_stats(ch, QUESTS_POINTS);
/* belar
else
do_statlist(ch, "");
*/
return;
}
void show_game_stats(CHAR_DATA * ch, int type)
{
STAT_DATA *curr;
BUFFER *output;
char buf[MSL];
long top;
int count,
pos;
bool found = FALSE;
const char *stat_name[MAX_GAMESTAT] = {
"PLAYER KILLERS",
"MOB KILLERS",
"PK DEATHS",
"MOB DEATHS",
"QUESTS COMPLETED",
"QUESTS FAILED",
"QUEST POINTS"
};
output = new_buf();
count = 0;
pos = 0;
sprintf(buf, "{CRANKING OF %s{x", stat_name[type]);
add_buf(output, buf);
add_buf(output, "\n\r");
for (top = TopGameStat[type]; top > 0; top--)
{
for (curr = stat_list; curr != NULL; curr = curr->next)
{
if (curr->gamestat[type] == top)
{
if (count++ > 49)
break;
sprintf(buf, "{G%2d{w){W %-20s {w[{R%8ld{W]{x ", count, curr->name, curr->gamestat[type]);
add_buf(output, buf);
if (++pos % 2 == 0)
{
add_buf(output, "\n\r");
pos = 0;
}
found = TRUE;
}
}
}
if (!found)
add_buf(output, "\n\rNo one found yet.\n\r");
else if (pos % 2 != 0)
add_buf(output, "\n\r");
page_to_char(buf_string(output), ch);
free_buf(output);
return;
}