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

/***************************************************************************
*	ROM 2.4 is copyright 1993-1995 Russ Taylor			   *
*	ROM has been brought to you by the ROM consortium		   *
*	    Russ Taylor (rtaylor@pacinfo.com)				   *
*	    Gabrielle Taylor (gtaylor@pacinfo.com)			   *
*	    Brian Moore (rom@rom.efn.org)				   *
*	By using this code, you have agreed to follow the terms of the	   *
*	ROM license, in the file Rom24/doc/rom.license			   *
***************************************************************************/

/*************************************************************************** 
*       ROT 1.4 is copyright 1996-1997 by Russ Walsh                       * 
*       By using this code, you have agreed to follow the terms of the     * 
*       ROT license, in the file doc/rot.license                           * 
***************************************************************************/
/***************************************************************************
 *                                 _/                            _/        *
 *      _/_/_/  _/_/      _/_/_/  _/    _/_/    _/    _/    _/_/_/         *
 *     _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/          *
 *    _/    _/    _/  _/        _/  _/    _/  _/    _/  _/    _/           *
 *   _/    _/    _/    _/_/_/  _/    _/_/      _/_/_/    _/_/_/            *
 ***************************************************************************
 * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius),                 *
 * Additional credits are in the help file CODECREDITS                     *
 * All Rights Reserved.                                                    *
 ***************************************************************************/

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

WIZ_DATA *wiz_list;

char     *const wiz_titles[] = {
        "Administration ",
        "Coder       ",
        "Enforcer    ",
        "NULL        ",
        "QuestMaster ",
        "Builder     ",
};

/*
 * Local functions.
 */
void      change_wizlist
args((CHAR_DATA * ch, bool add, int level, char *argument));


void save_wizlist(void)
{
        WIZ_DATA *pwiz;
        FILE     *fp;
        bool      found = FALSE;

        fclose(fpReserve);
        if ((fp = fopen(WIZ_FILE, "w")) == NULL)
        {
                perror(WIZ_FILE);
        }

        for (pwiz = wiz_list; pwiz != NULL; pwiz = pwiz->next)
        {
                found = TRUE;
                fprintf(fp, "%s %d\n", pwiz->name, pwiz->level);
        }

        fclose(fp);
        fpReserve = fopen(NULL_FILE, "r");
        if (!found)
                unlink(WIZ_FILE);
}

void load_wizlist(void)
{
        FILE     *fp;
        WIZ_DATA *wiz_last;

        if ((fp = fopen(WIZ_FILE, "r")) == NULL)
        {
                return;
        }

        wiz_last = NULL;
        for (;;)
        {
                WIZ_DATA *pwiz;

                if (feof(fp))
                {
                        fclose(fp);
                        return;
                }

                pwiz = new_wiz();

                pwiz->name = str_dup(fread_word(fp));
                pwiz->level = fread_number(fp);
                fread_to_eol(fp);

                if (wiz_list == NULL)
                        wiz_list = pwiz;
                else
                        wiz_last->next = pwiz;
                wiz_last = pwiz;
        }
}

void do_wizlist(CHAR_DATA * ch, char *argument)
{
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        char      arg3[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        char      title[MAX_STRING_LENGTH];
        BUFFER   *buffer;
        int       level;
        WIZ_DATA *pwiz;
        int       lngth;
        int       amt;
        bool      found;

        argument = one_argument(argument, arg1);
        argument = one_argument(argument, arg2);
        argument = one_argument(argument, arg3);

/*
 * Uncomment the following to use the old method of having
 * a fixed wizlist in the rot.are file.
 */

/*
    do_help(ch,"wizlist");
    return;
*/

        if ((arg1[0] != '\0') && (ch->level == MAX_LEVEL))
        {
                if (!str_prefix(arg1, "add"))
                {
                        if (!is_number(arg2) || (arg3[0] == '\0'))
                        {
                                send_to_char
                                        ("Syntax: wizlist add <level> <name>\n\r",
                                         ch);
                                return;
                        }
                        level = atoi(arg2);
                        change_wizlist(ch, TRUE, level, arg3);
                        return;
                }
                if (!str_prefix(arg1, "delete"))
                {
                        if (arg2[0] == '\0')
                        {
                                send_to_char
                                        ("Syntax: wizlist delete <name>\n\r",
                                         ch);
                                return;
                        }
                        change_wizlist(ch, FALSE, 0, arg2);
                        return;
                }
                send_to_char("Syntax:\n\r", ch);
                send_to_char("       wizlist delete <name>\n\r", ch);
                send_to_char("       wizlist add <level> <name>\n\r", ch);
                return;
        }

        if (wiz_list == NULL)
        {
                send_to_char("No immortals listed at this time.\n\r", ch);
                return;
        }
        buffer = new_buf();
        xprintf(title, "  #WThe Gods of Mindcloud#0");
        xprintf(buf,
                "#0  ___________________________________________________________________________\n\r");
        add_buf(buffer, buf);
        xprintf(buf, " /\\_\\%70s\\_\\\n\r", " ");
        add_buf(buffer, buf);
        lngth = (70 - strlen(title)) / 2;
        for (; lngth >= 0; lngth--)
        {
                strcat(title, " ");
        }
        xprintf(buf, "|/\\\\_\\  %70s  \\_\\\n\r", title);
        add_buf(buffer, buf);
        xprintf(buf, "#0\\_/_|_|%69s#0|_|#0\n\r", " ");
        add_buf(buffer, buf);
        for (level = 12; level > 5; level--)
        {
                found = FALSE;
                amt = 0;
                for (pwiz = wiz_list; pwiz != NULL; pwiz = pwiz->next)
                {
                        if (pwiz->level == level)
                        {
                                amt++;
                                found = TRUE;
                        }
                }
                if (!found)
                {
                        if (level == 6)
                        {
                                xprintf(buf, "#0 ___|_|%69s|_|\n\r", " ");
                                add_buf(buffer, buf);
                        }
                        continue;
                }
                xprintf(buf, "#0    |_|#R%40s #w%28s#0|_|#0\n\r",
                        wiz_titles[12 - level], " ");
                add_buf(buffer, buf);
                xprintf(buf,
                        "#0    |_|#W%25s******************#w%26s#0|_|#0\n\r",
                        " ", " ");
                add_buf(buffer, buf);
                lngth = 0;
                for (pwiz = wiz_list; pwiz != NULL; pwiz = pwiz->next)
                {
                        if (pwiz->level == level)
                        {
                                if (lngth == 0)
                                {
                                        if (amt > 2)
                                        {
                                                xprintf(buf,
                                                        "#0    |_|#B%12s%-17s #B",
                                                        " ", pwiz->name);
                                                add_buf(buffer, buf);
                                                lngth = 1;
                                        }
                                        else if (amt > 1)
                                        {
                                                xprintf(buf,
                                                        "#0    |_|#B%21s%-17s #B",
                                                        " ", pwiz->name);
                                                add_buf(buffer, buf);
                                                lngth = 1;
                                        }
                                        else
                                        {
                                                xprintf(buf,
                                                        "#0    |_|#B%30s%-39s#0|_|\n\r",
                                                        " ", pwiz->name);
                                                add_buf(buffer, buf);
                                                lngth = 0;
                                        }
                                }
                                else if (lngth == 1)
                                {
                                        if (amt > 2)
                                        {
                                                xprintf(buf, "%-17s ",
                                                        pwiz->name);
                                                add_buf(buffer, buf);
                                                lngth = 2;
                                        }
                                        else
                                        {
                                                xprintf(buf, "%-30s#0|_|\n\r",
                                                        pwiz->name);
                                                add_buf(buffer, buf);
                                                lngth = 0;
                                        }
                                }
                                else
                                {
                                        xprintf(buf, "%-21s#0|_|\n\r",
                                                pwiz->name);
                                        add_buf(buffer, buf);
                                        lngth = 0;
                                        amt -= 3;
                                }
                        }
                }
                if (level == 6)
                {
                        xprintf(buf, "#0 ___|_|%69s#0|_|\n\r", " ");
                }
                else
                {
                        xprintf(buf, "#0    |_|%69s#0|_|\n\r", " ");
                }
                add_buf(buffer, buf);
        }
        xprintf(buf, "#0/ \\ |_|%69s#0|_|\n\r", " ");
        add_buf(buffer, buf);
        xprintf(buf, "#0|\\//_/%70s#0/_/\n\r", " ");
        add_buf(buffer, buf);
        xprintf(buf,
                "#0 \\/_/______________________________________________________________________/_/#n\n\r");
        add_buf(buffer, buf);
        pager_to_char(buf_string(buffer), ch);
        free_buf(buffer);
        return;
}

void update_wizlist(CHAR_DATA * ch, int level)
{
        WIZ_DATA *prev;
        WIZ_DATA *curr;

        if (IS_NPC(ch))
        {
                return;
        }
        prev = NULL;
        for (curr = wiz_list; curr != NULL; prev = curr, curr = curr->next)
        {
                if (!str_cmp(ch->name, curr->name))
                {
                        if (prev == NULL)
                                wiz_list = wiz_list->next;
                        else
                                prev->next = curr->next;

                        free_wiz(curr);
                        save_wizlist();
                }
        }
        if (level <= 6)
        {
                return;
        }
        curr = new_wiz();
        curr->name = str_dup(ch->name);
        curr->level = level;
        curr->next = wiz_list;
        wiz_list = curr;
        save_wizlist();
        return;
}

void change_wizlist(CHAR_DATA * ch, bool add, int level, char *argument)
{
        char      arg[MAX_INPUT_LENGTH];
        WIZ_DATA *prev;
        WIZ_DATA *curr;

        one_argument(argument, arg);
        if (arg[0] == '\0')
        {
                send_to_char("Syntax:\n\r", ch);
                if (!add)
                        send_to_char("    wizlist delete <name>\n\r", ch);
                else
                        send_to_char("    wizlist add <level> <name>\n\r",
                                     ch);
                return;
        }
        if (add)
        {
                if ((level <= 6) || (level > MAX_LEVEL))
                {
                        send_to_char("Syntax:\n\r", ch);
                        send_to_char("    wizlist add <level> <name>\n\r",
                                     ch);
                        return;
                }
        }
        if (!add)
        {
                prev = NULL;
                for (curr = wiz_list; curr != NULL;
                     prev = curr, curr = curr->next)
                {
                        if (!str_cmp(capitalize(arg), curr->name))
                        {
                                if (prev == NULL)
                                        wiz_list = wiz_list->next;
                                else
                                        prev->next = curr->next;

                                free_wiz(curr);
                                save_wizlist();
                        }
                }
        }
        else
        {
                curr = new_wiz();
                curr->name = str_dup(capitalize(arg));
                curr->level = level;
                curr->next = wiz_list;
                wiz_list = curr;
                save_wizlist();
        }
        return;
}