cotn/notes/
cotn/src/
/***************************************************************************
 *  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.                                               *
 *                                                                         *
 *  Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen  *
 *                                                                         *
 *  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.                                                    *
 ***************************************************************************/

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

#include "merc.h"

void sort_top_board args((void));
void init_topboard  args((void));

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

        if ((fp = fopen("../txt/topboard.txt", "r")) == NULL)
        {
		init_topboard();
		if( (fp = fopen("../txt/topboard.txt", "r")) == NULL )
                {
			log_string(LOG_CRIT, "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);
}

// init_topboard added by Akurei
void init_topboard( void )
{
	int	i;
	FILE	*fp;

	if( (fp = fopen("../txt/topboard.txt", "w")) == NULL ) return;
	for( i = 1; i <= MAX_TOP_PLAYERS; i++ )
	{
		fprintf(fp, "None~\n");
		fprintf(fp, "0\n");
	}
	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->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); // changed from xprintf by Akurei, seems to have helped
                        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(LOG_CRIT, "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_religions()
{
        int       i, j;
        FILE     *fp;

        if ((fp = fopen("../txt/religion.txt", "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: religion.txt not found!");
                exit(1);
        }
        religion_table[0].name = "#7of #RD#7aneguard#n";
        religion_table[0].truename = "Daneguard";
        religion_table[0].decapmessage =
                "#R%s #0was destroyed by the #RD#7a#RN#7e#RG#7u#RA#7r#RD #0member #R%s#n";
        religion_table[0].channel = "#Y.:#P%s#Y:.#n '#C$t#n'.";
        for (i = 0; i < 5; i++)
                religion_table[0].rankname[i] = "#RP#7rince#n";
        for (i = 1; i <= MAX_RELIGIONS; i++)
        {
                religion_table[i].name = fread_string(fp);
                religion_table[i].truename = fread_string(fp);
                for (j = 0; j < 5; j++)
                        religion_table[i].rankname[j] = fread_string(fp);
                religion_table[i].decapmessage = fread_string(fp);
                religion_table[i].channel = fread_string(fp);
        }
        fclose(fp);
}

void save_religions()
{
        int       i, j;
        FILE     *fp;

        if ((fp = fopen("../txt/religion.txt", "w")) == NULL)
        {
                log_string(LOG_CRIT, "Error writing to religion.txt");
                return;
        }
        for (i = 1; i <= MAX_RELIGIONS; i++)
        {
                fprintf(fp, "%s~\n", religion_table[i].name);
                fprintf(fp, "%s~\n", religion_table[i].truename);
                for (j = 0; j < 5; j++)
                        fprintf(fp, "%s~\n", religion_table[i].rankname[j]);
                fprintf(fp, "%s~\n", religion_table[i].decapmessage);
                fprintf(fp, "%s~\n", religion_table[i].channel);
        }
        fclose(fp);
}

void load_leaderboard()
{
        FILE     *fp;

        if ((fp = fopen("../txt/leader.txt", "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: leader.txt not found!");
                exit(1);
        }
        leader_board.pk_name = fread_string(fp);
        leader_board.pk_number = fread_number(fp);
        leader_board.time_name = fread_string(fp);
        leader_board.time_number = fread_number(fp);
        leader_board.quest_name = fread_string(fp);
        leader_board.quest_number = fread_number(fp);
        leader_board.mobkills_name = fread_string(fp);
        leader_board.mobkills_number = fread_number(fp);
        leader_board.pkscore_name = fread_string(fp);
        leader_board.pkscore_number = fread_number(fp);
        leader_board.arena_name = fread_string(fp);
        leader_board.arena_number = fread_number(fp);
        fclose(fp);
}

void save_leaderboard()
{
        FILE     *fp;

        if ((fp = fopen("../txt/leader.txt", "w")) == NULL)
        {
                log_string(LOG_CRIT, "Error writing to leader.txt");
                return;
        }
        fprintf(fp, "%s~\n", leader_board.pk_name);
        fprintf(fp, "%d\n", leader_board.pk_number);
        fprintf(fp, "%s~\n", leader_board.time_name);
        fprintf(fp, "%d\n", leader_board.time_number);
        fprintf(fp, "%s~\n", leader_board.quest_name);
        fprintf(fp, "%d\n", leader_board.quest_number);
        fprintf(fp, "%s~\n", leader_board.mobkills_name);
        fprintf(fp, "%d\n", leader_board.mobkills_number);
        fprintf(fp, "%s~\n", leader_board.pkscore_name);
        fprintf(fp, "%d\n", leader_board.pkscore_number);
        fprintf(fp, "%s~\n", leader_board.arena_name);
        fprintf(fp, "%d\n", leader_board.arena_number);
        fclose(fp);
}

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.pkscore_number
            || !str_cmp(leader_board.pkscore_name, ch->name))
        {
                leader_board.pkscore_number = get_ratio(ch);
                free_string(leader_board.pkscore_name);
                leader_board.pkscore_name = str_dup(ch->name);
                changed = TRUE;
        }
        if (ch->mkill > leader_board.mobkills_number)
        {
                leader_board.mobkills_number = ch->mkill;
                free_string(leader_board.mobkills_name);
                leader_board.mobkills_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->pcdata->questtotal > leader_board.quest_number)
        {
                leader_board.quest_number = ch->pcdata->questtotal;
                free_string(leader_board.quest_name);
                leader_board.quest_name = str_dup(ch->name);
                changed = TRUE;
        }
        if ((get_age(ch) - 17) * 2 > leader_board.time_number)
        {
                leader_board.time_number = (get_age(ch) - 17) * 2;
                free_string(leader_board.time_name);
                leader_board.time_name = str_dup(ch->name);
                changed = TRUE;
        }
        if (ch->pcdata->awins > leader_board.arena_number)
        {
                leader_board.arena_number = ch->pcdata->awins;
                free_string(leader_board.arena_name);
                leader_board.arena_name = str_dup(ch->name);
                changed = TRUE;
        }
        if (changed)
                save_leaderboard();
        return;
}

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

        if ((fp = fopen("../txt/mudinfo.txt", "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: mudinfo.txt not found!");
                exit(1);
        }

        for (i = 0; i < (MUDINFO_MAX - 2); i++)
        {
                mudinfo[i] = fread_number(fp);
        }
        mudinfo[MUDINFO_MAX - 2] = 0;
        mudinfo[MUDINFO_MAX - 1] = 0;
        fclose(fp);
}

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

        if ((fp = fopen("../txt/ccenter.txt", "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: ccenter.txt not found!");
                exit(1);
        }
        for (i = 0; i < CCENTER_MAX; i++)
        {
                ccenter[i] = fread_number(fp);
        }
        fclose(fp);
}

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

        if ((fp = fopen("../txt/ccenter.txt", "w")) == NULL)
        {
                bug("could not write to ccenter.txt!", 0);
                return;
        }
        for (i = 0; i < CCENTER_MAX; i++)
        {
                fprintf(fp, "%d\n", ccenter[i]);
        }
        fclose(fp);
}

void write_mudinfo_database()
{
        FILE     *fp;
        int       ratio, mspusers, avusers, a, b, c;

        if ((fp = fopen("../txt/mud_data.txt", "a")) == NULL)
        {
                log_string(LOG_ERR, "Error writing to mud_data.txt");
                return;
        }

        /*
         * Calculate the ratio of users that use msp 
         */
        mspusers =
                (100 * mudinfo[MUDINFO_MSP_USERS] /
                 (mudinfo[MUDINFO_MCCP_USERS] +
                  mudinfo[MUDINFO_OTHER_USERS]));

        /*
         * Calculate the ratio of users that use mccp 
         */
        ratio = (100 * mudinfo[MUDINFO_MCCP_USERS] /
                 (mudinfo[MUDINFO_MCCP_USERS] +
                  mudinfo[MUDINFO_OTHER_USERS]));

        /*
         * Calculate the amount of average players online 
         */
        avusers =
                (mudinfo[MUDINFO_MCCP_USERS] +
                 mudinfo[MUDINFO_OTHER_USERS]) / mudinfo[MUDINFO_UPDATED];

        /*
         * Calculate the average tranfer rate in kbyte 
         */
        a = mudinfo[MUDINFO_MBYTE] * 1024 + mudinfo[MUDINFO_BYTE] / 1024;
        b = a / (mudinfo[MUDINFO_UPDATED] * 3);
        c = b / 10;
        c = c * 10;
        c = b - c;

        /*
         * Append it all to the file 
         */
        fprintf(fp, "\nMudinfo Database Entry\n");
        fprintf(fp, "Average Online Users       %d\n", avusers);
        fprintf(fp, "Peak Users Online          %d\n",
                mudinfo[MUDINFO_PEAK_USERS]);
        fprintf(fp, "Mccp Ratio                 %d %%\n", ratio);
        fprintf(fp, "MSP Ratio                  %d %%\n", mspusers);
        fprintf(fp, "Amount of MB send          %d MB\n",
                mudinfo[MUDINFO_MBYTE]);
        fprintf(fp, "Datatransfer Average       %d.%d\n", b / 10, c);

        /*
         * Calculating the peak transfer rate 
         */
        b = mudinfo[MUDINFO_DATA_PEAK] / (3 * 1024);
        c = b / 10;
        c = c * 10;
        c = b - c;

        fprintf(fp, "Datatransfer Peak          %d.%d\n", b / 10, c);

        fclose(fp);
}

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

        if ((fp = fopen("../txt/mudinfo.txt", "w")) == NULL)
        {
                log_string(LOG_ERR, "Error writing to mudinfo.txt");
                return;
        }
        for (i = 0; i < (MUDINFO_MAX - 2); i++)
        {
                fprintf(fp, "%d\n", mudinfo[i]);
        }
        fclose(fp);
}

void load_coreinfo()
{
        FILE     *fp;

        if ((fp = fopen("../txt/coreinfo.txt", "r")) == NULL)
        {
                log_string(LOG_CRIT, "Error: coreinfo.txt not found!");
                exit(1);
        }

        top_playerid = fread_number(fp);
        pulse_exp = fread_number(fp);
        pulse_dt = fread_number(fp);
        pulse_arena = fread_number(fp);
        pulse_cp = fread_number(fp);

        if (pulse_exp > 0)
                global_exp = TRUE;
        if (pulse_dt > 0)
                global_dt = TRUE;
        if (pulse_cp > 0)
                global_cp = TRUE;

        fclose(fp);
}

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

        for (i = 0; i < 2; i++)
        {
                if (i == 0)
                {
                        if ((fp = fopen("../txt/coreinfo.bck", "w")) == NULL)
                        {
                                log_string(LOG_ERR,
                                           "Error writing to coreinfo.bck");
                                return;
                        }
                }
                else
                {
                        if ((fp = fopen("../txt/coreinfo.txt", "w")) == NULL)
                        {
                                log_string(LOG_ERR,
                                           "Error writing to coreinfo.txt");
                                return;
                        }
                }

                fprintf(fp, "%d\n", top_playerid);
                fprintf(fp, "%d\n", pulse_exp);
                fprintf(fp, "%d\n", pulse_dt);
                fprintf(fp, "%d\n", pulse_arena);
                fprintf(fp, "%d\n", pulse_cp);
                fclose(fp);
        }
}

void load_newbiebans()
{
        FILE     *fp;
        BAN_DATA *p;
        char     *name;

        newbieban_list = NULL;
        fp = fopen(NEWBIEBAN_LIST, "r");
        if (!fp)
                return;
        name = fread_word(fp);
        while (str_cmp(name, END_MARKER))
        {
                p = alloc_mem(sizeof(BAN_DATA));
                p->name = str_dup(name);
                p->reason = fread_string(fp);
                p->next = newbieban_list;
                newbieban_list = p;
                name = fread_word(fp);
        }
        fclose(fp);
}

void save_newbiebans()
{
        FILE     *fp;
        BAN_DATA *p;

        if (!newbieban_list)
        {
                unlink(BAN_LIST);
                return;
        }
        fp = fopen(NEWBIEBAN_LIST, "w");
        if (!fp)
        {
                bug("could not open newban.txt", 0);
                return;
        }
        for (p = newbieban_list; p; p = p->next)
        {
                fprintf(fp, "%s\n", p->name);
                fprintf(fp, "%s~\n", p->reason);
        }
        fprintf(fp, "%s\n", END_MARKER);
        fclose(fp);
}



void load_bans()
{
        FILE     *fp;
        BAN_DATA *p;
        char     *name;

        ban_list = NULL;
        fp = fopen(BAN_LIST, "r");
        if (!fp)
                return;

        name = fread_word(fp);
        while (str_cmp(name, END_MARKER))
        {
                p = alloc_mem(sizeof(BAN_DATA));
                p->name = str_dup(name);
                p->reason = fread_string(fp);
                p->next = ban_list;
                ban_list = p;
                name = fread_word(fp);
        }
        fclose(fp);
}

void save_bans()
{
        FILE     *fp;
        BAN_DATA *p;

        if (!ban_list)
        {
                unlink(BAN_LIST);
                return;
        }
        if ((fp = fopen(BAN_LIST, "w")) == NULL)
        {
                bug("could not open ban.txt", 0);
                return;
        }
        for (p = ban_list; p; p = p->next)
        {
                fprintf(fp, "%s\n", p->name);
                fprintf(fp, "%s~\n", p->reason);
        }
        fprintf(fp, "%s\n", END_MARKER);
        fclose(fp);
}