/**************************************************************************** * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame | \\._.// * * -----------------------------------------------------------| (0...0) * * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by Derek Snider | ).:.( * * -----------------------------------------------------------| {o o} * * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus, | / ' ' \ * * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek, |~'~.VxvxV.~'~* * Tricops and Fireblade | * * ------------------------------------------------------------------------ * * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * ------------------------------------------------------------------------ * * Deity handling module * ****************************************************************************/ /*Put together by Rennard for Realms of Despair. Brap on...*/ /* Converted to work on Rogue Winds by Scion. When in Rome... */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" DEITY_DATA * first_deity; DEITY_DATA * last_deity; /* local routines */ void fread_deity args( ( DEITY_DATA *deity, FILE *fp ) ); bool load_deity_file args( ( char *deityfile ) ); void write_deity_list args( ( void ) ); int get_risflag args( ( char *flag ) ); int get_npc_race args( ( char *type ) ); /* Get pointer to deity structure from deity name */ DEITY_DATA *get_deity( char *name ) { DEITY_DATA *deity; for ( deity = first_deity; deity; deity = deity->next ) if ( !str_cmp( name, deity->name ) ) return deity; return NULL; } void write_deity_list( ) { DEITY_DATA *tdeity; FILE *fpout; char filename[256]; sprintf( filename, "%s%s", DEITY_DIR, DEITY_LIST ); fclose(fpReserve); fpout = fopen( filename, "w" ); if ( !fpout ) bug( "FATAL: cannot open deity.lst for writing!\n\r", 0 ); else { for ( tdeity = first_deity; tdeity; tdeity = tdeity->next ) fprintf( fpout, "%s\n", tdeity->filename ); fprintf( fpout, "$\n" ); fclose( fpout ); } fpReserve = fopen(NULL_FILE, "r"); } /* Save a deity's data to its data file */ void save_deity( DEITY_DATA *deity ) { FILE *fp; char filename[256]; char buf[MAX_STRING_LENGTH]; if ( !deity ) { bug( "save_deity: null deity pointer!", 0 ); return; } if ( !deity->filename || deity->filename[0] == '\0' ) { sprintf( buf, "save_deity: %s has no filename", deity->name ); bug( buf, 0 ); return; } sprintf( filename, "%s%s", DEITY_DIR, deity->filename ); fclose( fpReserve ); if ( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "save_deity: fopen", 0 ); perror( filename ); } else { fprintf( fp, "#DEITY\n" ); fprintf( fp, "Index %d\n", deity->index ); fprintf( fp, "Filename %s~\n", deity->filename ); fprintf( fp, "Name %s~\n", deity->name ); fprintf( fp, "Description %s~\n", deity->description ); fprintf( fp, "Message %s~\n", deity->message ); fprintf( fp, "Cost %d\n", deity->cost); fprintf( fp, "Count %d\n", deity->count); fprintf( fp, "Archmage %s~\n", deity->archmage); fprintf( fp, "ArchLvl %d\n", deity->arch_lvl); fprintf( fp, "Color %s~\n", deity->color); fprintf( fp, "End\n\n" ); fprintf( fp, "#END\n" ); fclose(fp); } fpReserve = fopen ( NULL_FILE, "r" ); return; } /* Read in actual deity data */ #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void fread_deity( DEITY_DATA *deity, FILE *fp ) { char *word; bool fMatch; deity->index = -1; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Archmage", deity->archmage, fread_string(fp)); KEY( "ArchLvl", deity->arch_lvl, fread_number(fp)); break; case 'C': KEY( "Color", deity->color, fread_string(fp)); KEY( "Cost", deity->cost, fread_number(fp)); KEY( "Count", deity->count, fread_number(fp)); break; case 'D': KEY( "Description", deity->description, fread_string( fp ) ); break; case 'E': if ( !str_cmp( word, "End" ) ) { if (!deity->name) deity->name = STRALLOC( "" ); if (!deity->description) deity->description = STRALLOC( "" ); return; } break; case 'F': KEY( "Filename", deity->filename, fread_string_nohash( fp ) ); break; case 'I': // KEY( "Index", deity->index, fread_number( fp ) ); break; case 'M': KEY( "Message", deity->message, fread_string(fp)); case 'N': KEY( "Name", deity->name, fread_string( fp ) ); break; } if ( !fMatch ) { /* sprintf( buf, "Fread_deity: no match: %s", word ); bug( buf, 0 ); */ } } } /* Load a deity file */ bool load_deity_file( char *deityfile ) { char filename[256]; DEITY_DATA *deity; DEITY_DATA *tdeity; FILE *fp; bool found; found = FALSE; sprintf( filename, "%s%s", DEITY_DIR, deityfile ); if ( ( fp = fopen( filename, "r" ) ) != NULL ) { for ( ; ; ) { char letter; char *word; letter = fread_letter( fp ); if ( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter != '#' ) { bug( "Load_deity_file: # not found.", 0 ); break; } word = fread_word( fp ); if ( !str_cmp( word, "DEITY" ) ) { CREATE( deity, DEITY_DATA, 1 ); fread_deity( deity, fp ); LINK(deity, first_deity, last_deity, next, prev); /* Give each deity a unique index number for spells to refer to it by */ for (tdeity = first_deity; tdeity; tdeity = tdeity->next) { deity->index++; if (tdeity->index != deity->index) break; } found = TRUE; break; } else { char buf[MAX_STRING_LENGTH]; sprintf( buf, "Load_deity_file: bad section: %s.", word ); bug( buf, 0 ); break; } } fclose( fp ); } return found; } /* Load in all the deity files */ void load_deity( ) { FILE *fpList; char *filename; char deitylist[256]; char buf[MAX_STRING_LENGTH]; first_deity = NULL; last_deity = NULL; log_string( "Loading talents..." ); sprintf( deitylist, "%s%s", DEITY_DIR, DEITY_LIST ); if ( ( fpList = fopen ( deitylist, "r" ) ) == NULL ) { perror( deitylist ); exit( 1 ); } for ( ; ; ) { filename = feof( fpList ) ? "$" : fread_word( fpList ); log_string( filename ); if ( filename[0] == '$' ) break; if ( !load_deity_file( filename ) ) { sprintf( buf, "Cannot load talent file: %s", filename ); bug( buf, 0 ); } } fclose( fpList ); log_string( " Done talents " ); return; } void do_setdeity( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; DEITY_DATA *deity; if ( IS_NPC( ch ) ) { send_to_char( "Huh?\n\r", ch ); return; } switch( ch->substate ) { default: break; case SUB_RESTRICTED: send_to_char( "You cannot do this while in another command.\n\r", ch ); return; case SUB_DEITYDESC: deity = ch->dest_buf; STRFREE( deity->description ); deity->description = copy_buffer( ch ); stop_editing( ch ); save_deity( deity ); ch->substate = ch->tempnum; return; } argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' ) { send_to_char( "Usage: settalent <talent> <field> <toggle>\n\r", ch ); send_to_char( "\n\rField being one of:\n\r", ch ); send_to_char( "filename name cost\n\r", ch ); return; } deity = get_deity( arg1 ); if ( !deity ) { send_to_char( "No such talent.\n\r", ch ); return; } if ( !str_cmp( arg2, "name" ) ) { STRFREE( deity->name ); deity->name = STRALLOC( argument ); send_to_char( "Done.\n\r", ch ); save_deity( deity ); return; } if ( !str_cmp( arg2, "filename" ) ) { DISPOSE( deity->filename ); deity->filename = str_dup( argument ); send_to_char( "Done.\n\r", ch ); save_deity( deity ); write_deity_list( ); return; } if ( !str_cmp( arg2, "description" ) ) { if ( ch->substate == SUB_REPEATCMD ) ch->tempnum = SUB_REPEATCMD; else ch->tempnum = SUB_NONE; ch->substate = SUB_DEITYDESC; ch->dest_buf = deity; start_editing( ch, deity->description ); return; } if (!str_cmp(arg2, "cost")) { deity->cost = atoi(argument); send_to_char("Done.\r\n", ch); save_deity(deity); return; } if (!str_cmp(arg2, "archlvl")) { deity->arch_lvl = atoi(argument); send_to_char("Done.\r\n", ch); save_deity(deity); return; } if (!str_cmp(arg2, "count")) { deity->count = atoi(argument); send_to_char("Done.\r\n", ch); save_deity(deity); return; } if (!str_cmp(arg2, "message")) { STRFREE(deity->message); deity->message = STRALLOC(argument); send_to_char("Done.\n\r", ch); save_deity(deity); return; } if ( !str_cmp( arg2, "archmage" ) ) { STRFREE( deity->archmage ); deity->archmage = STRALLOC( argument ); send_to_char( "Done.\n\r", ch ); save_deity( deity ); return; } if ( !str_cmp( arg2, "color" ) ) { STRFREE( deity->color ); deity->color = STRALLOC( argument ); send_to_char( "Done.\n\r", ch ); save_deity( deity ); return; } ch_printf( ch, "Done.\n\r" ); save_deity( deity ); return; } void do_showdeity( CHAR_DATA *ch, char *argument ) { DEITY_DATA *deity; int i; if ( IS_NPC( ch ) ) { huh(ch); return; } if ( argument[0] == '\0' ) { send_to_char( "Usage: showtalent <talent>\n\r", ch ); return; } deity = get_deity( argument ); if ( !deity ) { send_to_char( "No such talent.\n\r", ch ); return; } ch_printf( ch, "&wTalent: %s\n\rFilename: %s\n\rDescription:\n\r%s\n\r", deity->name, deity->filename, deity->description ); ch_printf( ch, "Archmage: %s Archmage Level: %d\n\r", deity->archmage, deity->arch_lvl); ch_printf( ch, "Index: %d Cost: %d\r\n", deity->index, deity->cost); ch_printf( ch, "Message: %s\n\r", deity->message); ch_printf( ch, "Color: %s\n\r", deity->color); ch_printf( ch, "Total levels: %d\n\r", deity->count); ch_printf( ch, "Ranks:\n\r"); for (i = 0;i < 12;i++) ch_printf(ch, "%d: %s\n\r", i*10+10, talent_rank[deity->index][i]); } void do_makedeity( CHAR_DATA *ch, char *argument ) { char filename[256]; DEITY_DATA *deity; bool found; if ( !argument || argument[0] == '\0' ) { send_to_char( "Usage: maketalent <talent name>\n\r", ch ); return; } found = FALSE; sprintf( filename, "%s%s", DEITY_DIR, strlower(argument) ); CREATE( deity, DEITY_DATA, 1 ); LINK( deity, first_deity, last_deity, next, prev ); deity->name = STRALLOC( argument ); deity->description = STRALLOC( "" ); deity->filename = str_dup( filename ); write_deity_list(); save_deity(deity); } void do_deities( CHAR_DATA *ch, char *argument ) { DEITY_DATA *deity; int count = 0; send_to_pager_color( "&gFor detailed information on a Talent, try 'help <talent>'\n\r", ch ); send_to_pager_color( "Talent Cost\n\r", ch ); for ( deity = first_deity; deity; deity = deity->next ) { pager_printf_color( ch, "&G%-10s &g%19d\n\r", deity->name, deity->cost ); count++; } if ( !count ) { send_to_pager_color( "&gThere are no Talents on this world.\n\r", ch ); return; } return; } void do_archmages( CHAR_DATA *ch, char *argument ) { DEITY_DATA *talent; for (talent = first_deity;talent;talent = talent->next) { ch_printf(ch, "%s is the Archmage of %s.\n\r", talent->archmage, talent->name); } }