/***************************************************************************
* 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 *
***************************************************************************/
#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[] = {
"Implementors",
"Creators ",
"Supremacies ",
"Deities ",
"Gods ",
"Immortals ",
"DemiGods ",
"Knights ",
"Squires "
};
/*
* 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;
if ( ( fp = file_open ( 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 );
}
file_close ( fp );
if ( !found )
unlink ( WIZ_FILE );
}
void load_wizlist ( void )
{
FILE *fp;
WIZ_DATA *wiz_last;
strcat ( boot_buf, "sson to all ." );
if ( ( fp = file_open ( WIZ_FILE, "r" ) ) == NULL )
{
strcat ( boot_buf, "....\n\r\n\r " );
return;
}
wiz_last = NULL;
strcat ( boot_buf, "....\n\r\n\r " );
for ( ;; )
{
WIZ_DATA *pwiz;
if ( feof ( fp ) )
{
file_close ( 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;
}
}
CH_CMD ( do_wizlist )
{
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 ( );
sprintf ( title, "The IMMORTALS of Death Rising{x" );
sprintf ( buf,
"{W ___________________________________________________________________________{x\n\r" );
add_buf ( buffer, buf );
sprintf ( buf, "{W /\\_\\%70s\\_\\\n\r", " " );
add_buf ( buffer, buf );
lngth = ( 70 - strlen ( title ) ) / 2;
for ( ; lngth >= 0; lngth-- )
{
strcat ( title, " " );
}
sprintf ( buf, "{W|/\\\\_\\{D%72s{W\\_\\\n\r", title );
add_buf ( buffer, buf );
sprintf ( buf, "{W\\_/_|_|{x%69s{W|_|\n\r", " " );
add_buf ( buffer, buf );
for ( level = IMPLEMENTOR; level > ANCIENT; 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 == ANCIENT + 1 )
{
sprintf ( buf, "{x {W___|_|{x%69s{W|_|\n\r", " " );
add_buf ( buffer, buf );
}
continue;
}
sprintf ( buf, "{x {W|_|{B%37s {b[{W%d{b]{x%26s{W|_|{x\n\r",
wiz_titles[IMPLEMENTOR - level], level, " " );
add_buf ( buffer, buf );
sprintf ( buf, "{x {W|_|{c%25s******************{x%26s{W|_|{x\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 )
{
sprintf ( buf, "{x {W|_|{x{%s%12s%-17s ",
level >= DEMI ? "R" : "r", " ",
pwiz->name );
add_buf ( buffer, buf );
lngth = 1;
}
else if ( amt > 1 )
{
sprintf ( buf, "{x {W|_|{x{%s%21s%-17s ",
level >= DEMI ? "R" : "r", " ",
pwiz->name );
add_buf ( buffer, buf );
lngth = 1;
}
else
{
sprintf ( buf, "{x {W|_|{x{%s%30s%-39s{W|_|{x\n\r",
level >= DEMI ? "R" : "r", " ",
pwiz->name );
add_buf ( buffer, buf );
lngth = 0;
}
}
else if ( lngth == 1 )
{
if ( amt > 2 )
{
sprintf ( buf, "%-17s ", pwiz->name );
add_buf ( buffer, buf );
lngth = 2;
}
else
{
sprintf ( buf, "%-30s{W|_|{x\n\r", pwiz->name );
add_buf ( buffer, buf );
lngth = 0;
}
}
else
{
sprintf ( buf, "%-21s{W|_|{x\n\r", pwiz->name );
add_buf ( buffer, buf );
lngth = 0;
amt -= 3;
}
}
}
if ( level == ANCIENT + 1 )
{
sprintf ( buf, "{x {W___|_|{x%69s{W|_|{x\n\r", " " );
}
else
{
sprintf ( buf, "{x {W |_|{x%69s{W|_|{x\n\r", " " );
}
add_buf ( buffer, buf );
}
sprintf ( buf, "{x/ \\ {W|_|{x%69s{W|_|{x\n\r", " " );
add_buf ( buffer, buf );
sprintf ( buf, "{W|\\//_/{x%70s{W/_/\n\r", " " );
add_buf ( buffer, buf );
sprintf ( buf,
"{x\\{W/_/_______________________________________________________________________/_/{x\n\r" );
add_buf ( buffer, buf );
page_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 <= ANCIENT )
{
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 <= ANCIENT ) || ( 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;
}