/***************************************************** ** _________ __ ** ** \_ ___ \_____|__| _____ ________ ___ ** ** / \ \/_ __ \ |/ \/ ___/_ \/ \ ** ** \ \___| | \/ | | | \___ \ / ) | \ ** ** \______ /__| |__|__|_| /____ \__/__| / ** ** ____\/____ _ \/ ___ \/ \/ ** ** \______ \ |_____ __| _/___ ** ** | | _/ |\__ \/ __ | __ \ ** ** | | \ |_/ __ \ / | ___/_ ** ** |_____ /__/____ /_ /___ / ** ** \/Antipode\/ \/ \/ ** ****************************************************** ** Crimson Blade Codebase (CbC) ** ** (c) 2000-2002 John Bellone (Noplex) ** ** Coders: Noplex, Krowe ** ** http://www.crimsonblade.org ** *****************************************************/ /* * File: hometowns.c * Name: Hometowns and Nations module v2.2 * Author: John 'Noplex' Bellone (jbellone@comcast.net) * Terms: * If this file is to be re-disributed; you must send an email * to the author. All headers above the #include calls must be * kept intact. All license requirements must be met. License * can be found in the included license.txt document or on the * website. * Description: * This is the long needed overhaul of my original Hometowns snippet; * The changes have been recorded in the changes.txt file included with * this snippet. This snippet also includes Crimson Blade's Nations module * which was adapted recently to fit the use of this particular snippet. */ #include "mud.h" #ifdef FCLOSE #undef FCLOSE #endif #define FCLOSE(fp) fclose(fp); fp=NULL; #ifdef NULLSTR #undef NULLSTR #endif #define NULLSTR(str) (!str || str[0] == '\0') /* Globals */ int top_nation; int top_hometown; /* Locals */ static void checkup( void ); /* * save hometowns -Nopey * rewritten 3/20/02 * new handling system 7/10/02 */ void save_hometowns( void ) { FILE *fp = NULL; char filename[256]; int i; /* * grab the filename for the hometowns */ sprintf( filename, "%shometowns.dat", SYSTEM_DIR ); if( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "save_hometowns(): cannot open %s for writing", filename ); return; } /* * save each one individually */ for( i = 0; i < top_hometown; i++ ) { HOMETOWN_DATA *htown = hometown_list[i]; fprintf( fp, "#HOMETOWN\n" ); fprintf( fp, "Name %s~\n", htown->name ); fprintf( fp, "Recall %d\n", htown->recall ); fprintf( fp, "Vnum %d\n", htown->vnum ); fprintf( fp, "Citizens %d\n", htown->citizens ); /* * nation support */ if( htown->nation ) fprintf( fp, "Nation %d\n", htown->nation->vnum ); fprintf( fp, "Description %s~\n", htown->description ); fprintf( fp, "End\n" ); } fprintf( fp, "#END\n" ); /* * close; close; close it! */ FCLOSE( fp ); return; } /* * load_hometowns -Nopey * rewritten 3/20/02 * new handling system 7/10/02 */ void load_hometowns( void ) { FILE *fp = NULL; char filename[256]; /* * filename to load from */ sprintf( filename, "%shometowns.dat", SYSTEM_DIR ); if( ( fp = fopen( filename, "r" ) ) == NULL ) { bug( "load_hometowns(): cannot open %s for reading", filename ); return; } top_hometown = 0; for( ;; ) { char letter = fread_letter( fp ); char *word; if( letter == '*' ) { fread_to_eol( fp ); break; } if( letter != '#' ) { bug( "load_hometowns(): # not found" ); return; } word = fread_word( fp ); if( !str_cmp( word, "HOMETOWN" ) ) { HOMETOWN_DATA *htown = fread_hometown( fp ); if( !htown ) { bug( "load_hometowns(): fread_hometown returned NULL htown; aborting load" ); return; } /* * link em' up */ hometown_list[top_hometown] = htown; top_hometown++; break; } else if( !str_cmp( word, "END" ) ) break; else { bug( "load_hometowns(): unknown section %s", word ); break; } } FCLOSE( fp ); return; } /* * read the hometown and stuffs -Nopey * rewritten 3/20/02 */ HOMETOWN_DATA *fread_hometown( FILE * fp ) { HOMETOWN_DATA *htown = NULL; bool fMatch = FALSE; /* * create htown entry; initalize stuffs */ CREATE( htown, HOMETOWN_DATA, 1 ); htown->name = STRALLOC( "None" ); htown->description = STRALLOC( "None" ); htown->nation = NULL; htown->citizens = 0; htown->vnum = -1; htown->nation_vnum = -1; htown->recall = -1; for( ;; ) { char *word = feof( fp ) ? "End" : fread_word( fp ); switch ( UPPER( word[0] ) ) { case '*': fread_to_eol( fp ); break; case 'C': KEY( "Citizens", htown->citizens, fread_number( fp ) ); break; case 'D': KEY( "Description", htown->description, fread_string( fp ) ); break; case 'E': if( !str_cmp( word, "End" ) ) { if( NULLSTR( htown->name ) ) htown->name = STRALLOC( "Not Set" ); return htown; } break; case 'N': KEY( "Name", htown->name, fread_string( fp ) ); KEY( "Nation", htown->nation_vnum, fread_number( fp ) ); break; case 'R': KEY( "Recall", htown->recall, fread_number( fp ) ); break; case 'V': KEY( "Vnum", htown->vnum, fread_number( fp ) ); break; } if( !fMatch ) { bug( "fread_hometown(): unknown section %s", word ); break; } } return NULL; } /* * save the nations -Nopey * rewritten 3/21/02 * new handling system 7/10/02 */ void save_nations( void ) { FILE *list = NULL; char fname[256]; int i; /* * nations list of files */ sprintf( fname, "%snations.lst", NATION_DIR ); if( ( list = fopen( fname, "w" ) ) == NULL ) { bug( "save_nations(): cannot open file for writing %s; aborting saving", fname ); return; } for( i = 0; i < top_nation; i++ ) { NATION_DATA *nation = nation_list[i]; if( nation_list[i] && ( !NULLSTR( nation->fname ) || !NULLSTR( nation->name ) ) ) { FILE *fp = NULL; /* * two birds with one stone; eh? */ sprintf( fname, "%s%s", NATION_DIR, nation->fname ); if( ( fp = fopen( fname, "w" ) ) == NULL ) { bug( "save_nations(): cannot open file for writing %s; moving to next", fname ); break; } /* * print to the list */ fprintf( list, "%s~\n", nation->fname ); fprintf( list, "$\n" ); /* * print to the file */ fprintf( fp, "Filename %s~\n", nation->fname ); fprintf( fp, "Name %s~\n", nation->name ); fprintf( fp, "Leader %s~\n", nation->leader ); fprintf( fp, "Vnum %d\n", nation->vnum ); /* * hometown support */ if( nation->hometown ) fprintf( fp, "Hometown %d\n", nation->hometown->vnum ); /* * race support */ if( nation->race > -1 ) fprintf( fp, "Race %d\n", nation->race ); fprintf( fp, "Description %s~\n", nation->description ); fprintf( fp, "$\n" ); FCLOSE( fp ); } else /* no filename */ { bug( "save_nations(): nation (%d) has a null filename", i ); continue; } } fprintf( list, "$\n" ); FCLOSE( list ); return; } /* * load the nationfiles -Nopey */ void load_nations( void ) { FILE *fp = NULL; FILE *list = NULL; char fname[256]; /* * load from nations list */ sprintf( fname, "%snations.lst", NATION_DIR ); if( ( list = fopen( fname, "r" ) ) == NULL ) { bug( "load_nations(): cannot open %s for reading; aborting load", fname ); return; } top_nation = 0; for( ;; ) { char *filename = feof( list ) ? "$" : fread_string( list ); /* * end of the file */ if( filename[0] == '*' ) { fread_to_eol( fp ); continue; } else if( filename[0] == '$' ) break; /* * load each nation indiviually */ { NATION_DATA *nation = NULL; nation = fread_nation( filename ); if( !nation ) { bug( "load_nations(): error returning back nation from filename %s", filename ); return; } /* * linker */ nation_list[top_nation] = nation; top_nation++; continue; } } FCLOSE( list ); checkup( ); return; } /* * Read the nation from a specific file * in the /nations/ directory -Nopey */ NATION_DATA *fread_nation( char *file ) { char filename[256]; FILE *fp = NULL; NATION_DATA *nation = NULL; sprintf( filename, "../nations/%s", file ); if( ( fp = fopen( filename, "r" ) ) == NULL ) { bug( "fread_nation(): cannot open %s for reading", filename ); FCLOSE( fp ); /* just in case */ return NULL; } /* * initalize entry */ CREATE( nation, NATION_DATA, 1 ); nation->name = STRALLOC( "None" ); nation->leader = STRALLOC( "None" ); nation->fname = STRALLOC( "None" ); nation->description = STRALLOC( "None" ); nation->hometown = NULL; nation->htown_vnum = -1; nation->vnum = -1; nation->race = -1; for( ;; ) { bool fMatch = FALSE; char *word = feof( fp ) ? "END" : fread_word( fp ); if( word[0] == '*' ) { fread_to_eol( fp ); break; } switch ( UPPER( word[0] ) ) { case '$': { FCLOSE( fp ); return nation; } break; case 'D': KEY( "Description", nation->description, fread_string( fp ) ); break; case 'F': KEY( "Filename", nation->fname, fread_string( fp ) ); break; case 'H': KEY( "Hometown", nation->htown_vnum, fread_number( fp ) ); break; case 'L': KEY( "Leader", nation->leader, fread_string( fp ) ); break; case 'N': KEY( "Name", nation->name, fread_string( fp ) ); break; case 'R': KEY( "Race", nation->race, fread_number( fp ) ); break; case 'V': KEY( "Vnum", nation->vnum, fread_number( fp ) ); break; } if( !fMatch ) bug( "fread_nation(): no match for %s", word ); } FCLOSE( fp ); return NULL; } /* * Assign correct hometown and nations -Nopey */ static void checkup( void ) { int i, j; /* * I hope this works... :P */ for( i = 0; i < top_hometown; i++ ) for( j = 0; j < top_nation; j++ ) if( ( nation_list[j]->htown_vnum > -1 && nation_list[j]->htown_vnum == hometown_list[i]->vnum ) || ( hometown_list[i]->nation_vnum > -1 && hometown_list[i]->nation_vnum == nation_list[j]->vnum ) ) { nation_list[j]->hometown = hometown_list[i]; hometown_list[i]->nation = nation_list[j]; break; } return; } /* * Look-up functions -Nopey */ HOMETOWN_DATA *hometown_lookup( char *name ) { int i; if( is_number( name ) ) { int vnum = atoi( name ); for( i = 0; i < top_hometown; i++ ) if( hometown_list[i]->vnum == vnum ) return hometown_list[i]; } else { for( i = 0; i < top_hometown; i++ ) if( !str_cmp( hometown_list[i]->name, name ) ) return hometown_list[i]; } return NULL; } NATION_DATA *nation_lookup( char *name ) { int i; if( is_number( name ) ) { int vnum = atoi( name ); for( i = 0; i < top_nation; i++ ) if( nation_list[i]->vnum == vnum ) return nation_list[i]; } else { for( i = 0; i < top_nation; i++ ) if( !str_cmp( nation_list[i]->name, name ) || !str_cmp( nation_list[i]->fname, name ) ) return nation_list[i]; } return NULL; } void do_hometowns( CHAR_DATA * ch, char *argument ) { HOMETOWN_DATA *htown = NULL; bool found = FALSE; int i; if( IS_NPC( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } if( argument[0] == '\0' ) { pager_printf_color( ch, "&GHometown Nation Citizens\r\n" ); pager_printf_color( ch, "&G_____________________________________________________\r\n" ); for( i = 0; i < top_hometown; i++ ) { found = TRUE; pager_printf_color( ch, "&W%-24s %-23s %d&G\r\n", hometown_list[i]->name, hometown_list[i]->nation ? hometown_list[i]->nation->name : "None", hometown_list[i]->citizens ); } if( !found ) pager_printf_color( ch, "&RThere are currently no hometowns formed.&g\r\n" ); else send_to_char_color( "&GFor more information use 'hometowns <name>'&g\r\n", ch ); } else if( ( htown = hometown_lookup( argument ) ) != NULL ) { pager_printf_color( ch, "&GHometown name:&g %s\r\n&GCitizens:&g %d\r\n", htown->name, htown->citizens ); if( htown->description[0] != '\0' ) pager_printf_color( ch, "&GDescription:&g\r\n%s\r\n", htown->description ); } return; } void do_nations( CHAR_DATA * ch, char *argument ) { NATION_DATA *nation = NULL; int i; if( IS_NPC( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } if( argument[0] == '\0' ) { bool found = FALSE; pager_printf_color( ch, "&gNation Leader Hometown\r\n" ); pager_printf_color( ch, "&g____________________________________________________\r\n" ); for( i = 0; i < top_nation; i++ ) { found = TRUE; pager_printf_color( ch, "&W%-28s %-20s %s&g\r\n", nation_list[i]->name, nation_list[i]->leader, nation_list[i]->hometown ? nation_list[i]->hometown->name : "None" ); } if( !found ) pager_printf_color( ch, "&RThere are currently no nations formed.&g\r\n" ); else pager_printf_color( ch, "&gUse nations 'nation' for more information.\r\n" ); return; } else if( ( nation = nation_lookup( argument ) ) == NULL ) { pager_printf_color( ch, "&gNo such nation formed. Use 'nations' to get a list of all nations formed.\r\n" ); return; } pager_printf_color( ch, "&gNation:&W %s\r\n&gLeader:&W %s\r\n", nation->name, nation->leader ); if( IS_IMMORTAL( ch ) ) pager_printf_color( ch, "&gFilename:&W %s\r\n", nation->fname ); if( nation->hometown ) pager_printf_color( ch, "&gHometown:&W %s\r\n", nation->hometown->name ); if( nation->race > -1 ) pager_printf_color( ch, "&gRace:&W %s\r\n", race_table[nation->race]->race_name ); if( nation->description[0] != '\0' ) pager_printf_color( ch, "&gDescription:&W\r\n%s&g\r\n", nation->description ); return; } /* * OLC functions -Nopey */ void do_makenation( CHAR_DATA * ch, char *argument ) { if( !IS_IMMORTAL( ch ) || IS_NPC( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } if( argument[0] == '\0' ) { send_to_char( "Syntax: makenation <name>\r\n", ch ); return; } if( nation_lookup( argument ) ) { send_to_char( "There is already a nation with that name.\r\n", ch ); return; } { NATION_DATA *nation = NULL; char buf[MAX_INPUT_LENGTH]; sprintf( buf, "%s.nation", argument ); CREATE( nation, NATION_DATA, 1 ); nation->fname = STRALLOC( buf ); nation->name = STRALLOC( argument ); nation->leader = STRALLOC( "None" ); nation->description = STRALLOC( "None" ); nation->vnum = top_nation; nation->hometown = NULL; nation->htown_vnum = -1; nation->race = -1; nation_list[top_nation] = nation; top_nation++; save_nations( ); send_to_char( "Done.\r\n", ch ); return; } } /* * create hometown; takes care of * creating a hometown; and linking * it online -Nopey */ void do_makehometown( CHAR_DATA * ch, char *argument ) { if( !IS_IMMORTAL( ch ) || IS_NPC( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } if( argument[0] == '\0' ) { send_to_char( "Syntax: makehometown <name>\r\n", ch ); return; } if( hometown_lookup( argument ) ) { send_to_char( "There is already a hometown with that name.\r\n", ch ); return; } { HOMETOWN_DATA *htown = NULL; CREATE( htown, HOMETOWN_DATA, 1 ); htown->name = STRALLOC( argument ); htown->description = STRALLOC( "None" ); htown->vnum = top_hometown; htown->nation = NULL; htown->nation_vnum = -1; htown->recall = -1; htown->citizens = -1; hometown_list[top_hometown] = htown; top_hometown++; save_hometowns( ); send_to_char( "Done.\r\n", ch ); return; } } /* * olc edit hometown function * takes care of all the editing * of hometowns online -Nopey */ void do_edithometown( CHAR_DATA * ch, char *argument ) { HOMETOWN_DATA *htown = NULL; char ht_arg[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; argument = one_argument( argument, ht_arg ); if( IS_NPC( ch ) || !IS_IMMORTAL( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } switch ( ch->substate ) { case SUB_HTOWN_DESC: { start_editing( ch, htown->description ); STRFREE( htown->description ); htown->description = copy_buffer( ch ); stop_editing( ch ); ch->substate = ch->tempnum; return; } break; } if( NULLSTR( ht_arg ) ) { send_to_char( "Syntax: edithometown <hometown> <field> <value>\r\n", ch ); send_to_char( " Fields being one of the following:\r\n", ch ); send_to_char( " name recall nation description\r\n", ch ); return; } if( !str_cmp( ht_arg, "save" ) ) { save_hometowns( ); send_to_char( "Done.\r\n", ch ); return; } { if( ( htown = hometown_lookup( ht_arg ) ) == NULL ) { send_to_char( "That's not a hometown vnum or name.\r\n", ch ); return; } argument = one_argument( argument, arg ); if( NULLSTR( arg ) || NULLSTR( argument ) ) { send_to_char( "Syntax: edithometown <hometown> <field> <value>\r\n", ch ); send_to_char( " Fields being one of the following:\r\n", ch ); send_to_char( " name recall nation description\r\n", ch ); return; } if( !str_cmp( arg, "name" ) ) { if( is_number( argument ) ) { send_to_char( "Name cannot contain any numerals.\r\n", ch ); return; } htown->name = STRALLOC( argument ); send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "description" ) ) { if( ch->substate == SUB_REPEATCMD ) ch->tempnum = SUB_REPEATCMD; else ch->tempnum = SUB_NONE; ch->substate = SUB_HTOWN_DESC; send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "recall" ) ) { if( !is_number( argument ) ) { send_to_char( "Recall vnum cannot contain any letters.\r\n", ch ); return; } htown->recall = atoi( argument ); send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "nation" ) ) { NATION_DATA *nation = NULL; if( ( nation = nation_lookup( argument ) ) == NULL ) { send_to_char( "That's not a nation vnum or name.\r\n", ch ); return; } htown->nation_vnum = nation->vnum; htown->nation = nation; nation->htown_vnum = htown->vnum; nation->hometown = htown; save_nations( ); save_hometowns( ); send_to_char( "Done.\r\n", ch ); return; } } do_edithometown( ch, "" ); return; } /* * nation editing function; takes care of * editing nations online -Nopey */ void do_editnation( CHAR_DATA * ch, char *argument ) { NATION_DATA *nation = NULL; char nat_arg[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; argument = one_argument( argument, nat_arg ); if( IS_NPC( ch ) || !IS_IMMORTAL( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } switch ( ch->substate ) { case SUB_NATION_DESC: { start_editing( ch, nation->description ); STRFREE( nation->description ); nation->description = copy_buffer( ch ); stop_editing( ch ); ch->substate = ch->tempnum; return; } break; } if( NULLSTR( nat_arg ) ) { send_to_char( "Syntax: editnation <nation> <field> <value>\r\n", ch ); send_to_char( " Field being one of the following:\r\n", ch ); send_to_char( " name leader hometown race description\r\n", ch ); return; } if( !str_cmp( nat_arg, "save" ) ) { save_nations( ); send_to_char( "Done.\r\n", ch ); return; } { if( ( nation = nation_lookup( nat_arg ) ) == NULL ) { send_to_char( "That's not a nation name or vnum.\r\n", ch ); return; } argument = one_argument( argument, arg ); if( NULLSTR( arg ) || NULLSTR( argument ) ) { send_to_char( "Syntax: editnation <nation> <field> <value>\r\n", ch ); send_to_char( " Field being one of the following:\r\n", ch ); send_to_char( " name leader hometown race description\r\n", ch ); return; } if( !str_cmp( arg, "name" ) ) { if( is_number( argument ) ) { send_to_char( "Names cannot include numerals.\r\n", ch ); return; } nation->name = STRALLOC( argument ); send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "description" ) ) { if( ch->substate == SUB_REPEATCMD ) ch->tempnum = SUB_REPEATCMD; else ch->tempnum = SUB_NONE; ch->substate = SUB_NATION_DESC; send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "leader" ) ) { CHAR_DATA *vic = NULL; if( ( vic = get_char_world( supermob, argument ) ) == NULL ) { send_to_char( "Character isn't online.\r\n", ch ); return; } nation->leader = STRALLOC( vic->name ); vic->pcdata->nation = nation; vic->pcdata->nation_vnum = nation->vnum; send_to_char( "Done.\r\n", ch ); pager_printf_color( vic, "You are now the nation leader of %s.", nation->name ); return; } else if( !str_cmp( arg, "hometown" ) ) { HOMETOWN_DATA *htown = NULL; if( ( htown = hometown_lookup( argument ) ) == NULL ) { send_to_char( "That's not a hometown name or vnum.\r\n", ch ); return; } nation->htown_vnum = htown->vnum; nation->hometown = htown; htown->nation_vnum = nation->vnum; htown->nation = nation; save_nations( ); save_hometowns( ); send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( arg, "race" ) ) { int x = 0; if( !str_cmp( argument, "clear" ) || !str_cmp( argument, "none" ) ) { nation->race = -1; send_to_char( "Done.\r\n", ch ); return; } for( x = 0; x < MAX_PC_RACE; x++ ) if( !str_cmp( race_table[x]->race_name, argument ) ) { nation->race = x; send_to_char( "Done.\r\n", ch ); return; } send_to_char( "No such race with that name.\r\n", ch ); return; } } do_editnation( ch, "" ); return; } void do_destroynation( CHAR_DATA * ch, char *argument ) { int i; if( IS_NPC( ch ) || !IS_IMMORTAL( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } for( i = 0; i < top_nation; i++ ) if( !str_cmp( nation_list[i]->name, argument ) ) { if( !NULLSTR( nation_list[i]->name ) ) STRFREE( nation_list[i]->name ); if( !NULLSTR( nation_list[i]->fname ) ) STRFREE( nation_list[i]->fname ); if( !NULLSTR( nation_list[i]->description ) ) STRFREE( nation_list[i]->description ); if( !NULLSTR( nation_list[i]->leader ) ) STRFREE( nation_list[i]->leader ); if( nation_list[i]->hometown ) { nation_list[i]->hometown->nation = NULL; nation_list[i]->hometown = NULL; } DISPOSE( nation_list[i] ); nation_list[i] = NULL; save_nations( ); save_hometowns( ); send_to_char( "Done.\r\n", ch ); return; } send_to_char( "Syntax: destroynation <vnum/name>\r\n", ch ); return; } void do_destroyhometown( CHAR_DATA * ch, char *argument ) { int i; if( IS_NPC( ch ) || !IS_IMMORTAL( ch ) ) { send_to_char( "Huh?\r\n", ch ); return; } for( i = 0; i < top_hometown; i++ ) if( !str_cmp( hometown_list[i]->name, argument ) ) { if( !NULLSTR( hometown_list[i]->name ) ) STRFREE( hometown_list[i]->name ); if( hometown_list[i]->nation ) { hometown_list[i]->nation->hometown = NULL; hometown_list[i]->nation = NULL; } DISPOSE( hometown_list[i] ); save_hometowns( ); save_nations( ); send_to_char( "Done.\r\n", ch ); return; } send_to_char( "Syntax: destroyhometown <vnum/name>\r\n", ch ); return; } /* * mobprog for making someone a citizen -Nopey */ void do_mp_makecitizen( CHAR_DATA * ch, char *argument ) { CHAR_DATA *victim = NULL; HOMETOWN_DATA *htown = NULL; char vic_name[MAX_INPUT_LENGTH]; if( !IS_NPC( ch ) || ch->desc || IS_AFFECTED( ch, AFF_CHARM ) ) { send_to_char( "Huh?\r\n", ch ); return; } argument = one_argument( argument, vic_name ); if( NULLSTR( vic_name ) ) { progbug( "mpmakecitizen(): null victim name", ch ); return; } if( ( victim = get_char_room( ch, vic_name ) ) == NULL ) { progbug( "mpmakecitizen(): that victim isn't in the same room", ch ); return; } if( ( htown = hometown_lookup( argument ) ) == NULL ) { progbug( "mpmakecitizen(): hometown_lookup returned NULL hometown", ch ); return; } if( ( htown->nation && htown->nation->race > -1 ) && ( victim->race != htown->nation->race ) ) { pager_printf_color( victim, "You cannot become a citizen of %s because your race is not of calibur.\r\n", htown->name ); return; } /* * they have a previous hometown */ if( victim->pcdata->hometown ) { pager_printf_color( victim, "You cannot become a citizen of %s because you are already a citizen of %s.\r\nGo revoke your citizenship at %s.", htown->name, victim->pcdata->hometown->name, victim->pcdata->hometown->name ); return; } /* * set them up */ victim->pcdata->hometown = htown; victim->pcdata->htown_vnum = htown->vnum; if( htown->nation ) { victim->pcdata->nation = htown->nation; victim->pcdata->nation_vnum = htown->nation->vnum; } htown->citizens++; pager_printf_color( victim, "You are now a citizen of %s!\r\n", htown->name ); save_hometowns( ); return; } /* * mobprog for revoking a citizenship -Nopey */ void do_mp_revokecitizen( CHAR_DATA * ch, char *argument ) { char vic_name[MAX_INPUT_LENGTH]; CHAR_DATA *victim = NULL; if( !IS_NPC( ch ) || ch->desc || IS_AFFECTED( ch, AFF_CHARM ) ) { send_to_char( "Huh?\r\n", ch ); return; } argument = one_argument( argument, vic_name ); if( NULLSTR( vic_name ) ) { progbug( "mp_revokecitizen(): vic_name null", ch ); return; } if( ( victim = get_char_room( ch, vic_name ) ) == NULL ) { progbug( "mp_revokecitizen(): victim not in room", ch ); return; } if( victim->pcdata->hometown == NULL || ( victim->pcdata->hometown && str_cmp( victim->pcdata->hometown->name, argument ) ) ) { pager_printf_color( victim, "Your not a citizen of %s.\r\n", argument ); return; } if( victim->pcdata->hometown ) { victim->pcdata->hometown->citizens--; victim->pcdata->hometown = NULL; victim->pcdata->htown_vnum = -1; if( victim->pcdata->nation ) { victim->pcdata->nation = NULL; victim->pcdata->nation_vnum = -1; } pager_printf_color( victim, "You are no longer a citizen of %s.\r\n", argument ); } save_hometowns( ); return; } /* update the loading character correctly -Nopey */ void update_char_hometown( CHAR_DATA * ch ) { char buf[MAX_INPUT_LENGTH]; int i; if( ch->pcdata->htown_vnum > -1 ) { for( i = 0; i < top_hometown; i++ ) if( hometown_list[i]->vnum == ch->pcdata->htown_vnum ) { ch->pcdata->hometown = hometown_list[i]; if( hometown_list[i]->nation ) { ch->pcdata->nation = hometown_list[i]->nation; ch->pcdata->nation_vnum = hometown_list[i]->nation->vnum; } return; } if( ch->pcdata->hometown == NULL ) { sprintf( buf, "update_char_hometown(): (%s) invaild vnum for hometown (%d)", ch->name, ch->pcdata->htown_vnum ); bug( buf, 0 ); ch->pcdata->htown_vnum = -1; } } return; }