/* * Ack!Mud 4.0 * Zenithar * rulers.c--handles setting up rulers for areas * Copyright Stephen Zepp 1997 * * This code may be freely shared and used by anyone, as * long as credit is given to the author and Ack!Mud 4.0 * */ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> /* For forks etc. */ #include <unistd.h> #include <fcntl.h> #include "merc.h" #include "tables.h" char *get_ruler_title( int ruler_rank, int sex ) { switch ( ruler_rank ) { case 0 : return ""; case 1 : return ( ( sex == SEX_NEUTRAL ) ? "@@WMonitor@@N " : ( sex == SEX_MALE ) ? "@@WLord@@N " : "@@WLady@@N " ); break; case 2 : return ( ( sex == SEX_NEUTRAL ) ? "@@eOverseer@@N " : ( sex == SEX_MALE ) ? "@@eBaron@@N " : "@@eBaroness@@N " ); break; case 3 : return ( ( sex == SEX_NEUTRAL ) ? "@@mController@@N " : ( sex == SEX_MALE ) ? "@@mDuke@@N " : "@@mDuchess@@N " ); break; case 4 : return ( ( sex == SEX_NEUTRAL ) ? "@@lDirector@@N " : ( sex == SEX_MALE ) ? "@@lPrince@@N " : "@@lPrincess@@N " ); break; case 5 : return ( ( sex == SEX_NEUTRAL ) ? "@@aDominator@@N " : ( sex == SEX_MALE ) ? "@@aKing@@N " : "@@aQueen@@N " ); break; } return "Lord"; } void save_rulers( ) { FILE * fp; char ruler_file_name[MAX_STRING_LENGTH]; RULER_LIST * ruler; CONTROL_LIST * control; fclose( fpReserve ); sprintf( ruler_file_name, "%s", RULERS_FILE ); if ( ( fp = fopen( ruler_file_name, "w" ) ) == NULL ) { bug( "Save ruler list: fopen", 0 ); perror( "failed open of rulers.lst in save_ruler" ); } else { for ( ruler = first_ruler_list; ruler != NULL; ruler = ruler->next ) { char keybuf[MSL]; char catkeybuf[MSL]; fprintf( fp, "#RULER~\n" ); fprintf( fp, "%s~\n", ruler->this_one->name ); fprintf( fp, "%d\n", ruler->this_one->affiliation_index ); fprintf( fp, "%d\n", ruler->this_one->flags ); fprintf( fp, "%d\n", ruler->this_one->ruler_rank ); sprintf( keybuf, "%s", "" ); for ( control = ruler->this_one->first_control; control ; control = control->next ) { sprintf( catkeybuf, "%s ", control->this_one->keyword ); safe_strcat( MSL, keybuf, catkeybuf ); } fprintf( fp, "%s~\n", keybuf ); } fprintf( fp, "#END~\n\n" ); } fflush( fp ); fclose( fp ); fpReserve = fopen( NULL_FILE, "r" ); return; } /* #define RKEY( literal, field, value ) if ( !str_cmp( word, literal ) ) { field = value; fMatch = TRUE; break;} #define RSKEY( literal, field, value ) if ( !str_cmp( word, literal ) ) { if (field!=NULL) free_string(field);field = value; fMatch = TRUE; break;} */ void load_rulers( void ) { FILE *rulersfp; char rulers_file_name[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; RULER_DATA * ruler; RULER_LIST * ruler_member; sprintf( rulers_file_name, "%s", RULERS_FILE ); sprintf( buf, "Loading %s\n\r", rulers_file_name); monitor_chan( buf, MONITOR_CLAN ); if ( ( rulersfp = fopen( rulers_file_name, "r" ) ) == NULL ) { bug( "Load rulers Table: fopen", 0 ); perror( "failed open of rulers_table.dat in load_rulers_table" ); } else { for ( ; ; ) { char *word; word = fread_string( rulersfp ); if ( !str_cmp( word, "#RULER" ) ) { GET_FREE( ruler, ruler_data_free ); GET_FREE( ruler_member, ruler_list_free ); ruler->name = fread_string( rulersfp ); ruler->affiliation_index = fread_number( rulersfp ); if ( ruler->affiliation_index == 0 ) ruler->affiliation_name = str_dup( "No Affiliation" ); else ruler->affiliation_name = str_dup( clan_table[ruler->affiliation_index].clan_abbr); ruler->flags = fread_number( rulersfp ); ruler->ruler_rank = fread_number( rulersfp ); ruler->keywords = fread_string( rulersfp ); ruler->first_control = NULL; ruler->last_control = NULL; free_string( word ); ruler_member->this_one = ruler; ruler_member->next = NULL; ruler_member->prev = NULL; LINK( ruler_member, first_ruler_list, last_ruler_list, next, prev ); } else if ( !str_cmp( word, "#END" ) ) { free_string( word ); break; } else { free_string( word ); monitor_chan( "Load_marks: bad section.", MONITOR_BAD ); break; } } fclose( rulersfp ); sprintf( buf, "Done Loading %s\n\r", rulers_file_name); monitor_chan( buf, MONITOR_CLAN ); } } void do_rulers( CHAR_DATA *ch, char *argument ) { char arg1[MSL]; char arg2[MSL]; char arg3[MSL]; char outbuf[MSL]; char catbuf[MSL]; RULER_LIST * ruler; RULER_DATA * this_ruler; /* CONTROL_DATA * this_control; */ argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( IS_NPC( ch ) ) { send_to_char( "This option is not for NPCs", ch ); return; } if ( arg1[0] == '\0' ) /* show current rulers */ { sprintf( outbuf, "\n\rCurrent Rulers of " mudnamecolor "\n\r\n\r" ); for ( ruler = first_ruler_list; ruler; ruler = ruler->next ) { short sex; sex = ( IS_SET( ruler->this_one->flags, RULER_NEUTRAL ) ? SEX_NEUTRAL : IS_SET( ruler->this_one->flags, RULER_MALE ) ? SEX_MALE : SEX_FEMALE ); sprintf( catbuf, " %s %s : %s \n\r", get_ruler_title( ruler->this_one->ruler_rank, sex ), capitalize( ruler->this_one->name ), ( IS_SET( ruler->this_one->flags, RULER_GROUP ) ? ruler->this_one->affiliation_name : "Not Affiliated" ) ); safe_strcat( MSL, outbuf, catbuf ); if ( ruler->this_one->first_control != NULL ) { CONTROL_LIST * control; sprintf( catbuf, " Ruler of :" ); safe_strcat( MSL, catbuf, outbuf ); for ( control = ruler->this_one->first_control; control ; control = control->next ) { sprintf( catbuf, "%s\n\r", control->this_one->area->name ); safe_strcat( MSL, outbuf, catbuf ); } } } send_to_char( outbuf, ch ); return; } if ( !str_prefix( arg1, "new" ) ) { if ( get_trust( ch ) < L_SUP ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg2[0] == '\0' ) { send_to_char( "What name?\n\r", ch ); return; } GET_FREE( ruler, ruler_list_free ); GET_FREE( this_ruler, ruler_data_free ); this_ruler->name = str_dup( arg2 ); this_ruler->ruler_rank = 1; this_ruler->affiliation_index = 0; this_ruler->affiliation_name = str_dup( "" ); this_ruler->keywords = str_dup( "" ); this_ruler->flags = RULER_NEUTRAL; this_ruler->first_control = NULL; this_ruler->last_control = NULL; this_ruler->next = NULL; this_ruler->prev = NULL; ruler->this_one = this_ruler; ruler->next = NULL; ruler->prev = NULL; LINK( ruler, first_ruler_list, last_ruler_list, next, prev ); save_rulers( ); do_rulers( ch, "" ); return; } if ( !str_prefix( arg1, "affiliation" ) ) { short clan_number; if ( get_trust( ch ) < L_SUP ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg2[0] == '\0' ) { send_to_char( "What name?\n\r", ch ); return; } argument = one_argument( argument, arg3 ); if ( arg3[0] == '\0' ) { send_to_char( "What Clan Number?\n\r", ch ); return; } if ( is_number( arg3 ) ) { clan_number = atoi( arg3 ); if ( ( clan_number < 1 ) || ( clan_number > MAX_CLAN ) ) { send_to_char( "Clan number must be between 1 and you Max Number of clans.\n\r", ch ); return; } for ( ruler = first_ruler_list ; ruler; ruler = ruler->next ) { if ( !str_cmp( arg2, ruler->this_one->name ) ) break; } if ( ruler == NULL ) { send_to_char( "That ruler is not in the current list.\n\r", ch ); return; } if ( ruler->this_one->affiliation_name != NULL ) free_string( ruler->this_one->affiliation_name ); ruler->this_one->affiliation_name = str_dup( clan_table[clan_number].clan_abbr ); SET_BIT( ruler->this_one->flags, RULER_GROUP ); ruler->this_one->affiliation_index = clan_number; save_rulers( ); do_rulers( ch, "" ); return; } send_to_char( "That is not a legitimate clan number.\n\r", ch ); return; } if ( !str_prefix( arg1, "delete" ) ) { if ( get_trust( ch ) < L_SUP ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg2[0] == '\0' ) { send_to_char( "What name?\n\r", ch ); return; } for ( ruler = first_ruler_list ; ruler; ruler = ruler->next ) { if ( !str_cmp( arg2, ruler->this_one->name ) ) break; } if ( ruler == NULL ) { send_to_char( "That ruler is not in the current list.\n\r", ch ); return; } UNLINK( ruler, first_ruler_list, last_ruler_list, next, prev ); free_string( ruler->this_one->name ); free_string( ruler->this_one->affiliation_name ); free_string( ruler->this_one->keywords ); if ( ruler->this_one->first_control != NULL ) { CONTROL_LIST * control; CONTROL_LIST * control_next; for ( control = ruler->this_one->first_control; control; control = control_next ) { control_next = control->next; UNLINK( control, ruler->this_one->first_control, ruler->this_one->last_control, next, prev ); control->this_one = NULL; PUT_FREE( control, control_list_free ); } } PUT_FREE( ruler->this_one, ruler_data_free ); PUT_FREE( ruler, ruler_list_free ); save_rulers( ); do_rulers( ch, "" ); return; } if ( !str_prefix( arg1, "sex" ) ) { if ( get_trust( ch ) < L_SUP ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg2[0] == '\0' ) { send_to_char( "What name?\n\r", ch ); return; } for ( ruler = first_ruler_list ; ruler; ruler = ruler->next ) { if ( !str_cmp( arg2, ruler->this_one->name ) ) break; } if ( ruler == NULL ) { send_to_char( "That ruler is not in the current list.\n\r", ch ); return; } argument = one_argument( argument, arg3 ); if ( IS_SET( ruler->this_one->flags, RULER_MALE ) ) REMOVE_BIT( ruler->this_one->flags, RULER_MALE ); if ( IS_SET( ruler->this_one->flags, RULER_FEMALE ) ) REMOVE_BIT( ruler->this_one->flags, RULER_FEMALE ); if ( IS_SET( ruler->this_one->flags, RULER_NEUTRAL ) ) REMOVE_BIT( ruler->this_one->flags, RULER_NEUTRAL ); if ( !str_cmp( arg3, "male" ) ) SET_BIT( ruler->this_one->flags, RULER_MALE ); else if ( !str_cmp( arg3, "female" ) ) SET_BIT( ruler->this_one->flags, RULER_FEMALE ); else if ( !str_cmp( arg3, "it" ) ) SET_BIT( ruler->this_one->flags, RULER_NEUTRAL ); else { send_to_char( "Use male/female/it\n\r", ch ); SET_BIT( ruler->this_one->flags, RULER_MALE ); return; } save_rulers( ); do_rulers( ch, "" ); return; } if ( !str_prefix( arg1, "rank" ) ) { if ( get_trust( ch ) < L_SUP ) { send_to_char( "Huh?\n\r", ch ); return; } if ( arg2[0] == '\0' ) { send_to_char( "What name?\n\r", ch ); return; } argument = one_argument( argument, arg3 ); if ( arg3[0] == '\0' ) { send_to_char( "What rank?\n\r", ch ); return; } if ( is_number( arg3 ) ) { short rank; rank = atoi( arg3 ); if ( ( rank < 1 ) || ( rank > 5 ) ) { send_to_char( "Rank must be between 1 and 5.\n\r", ch ); return; } for ( ruler = first_ruler_list ; ruler; ruler = ruler->next ) { if ( !str_cmp( arg2, ruler->this_one->name ) ) break; } if ( ruler == NULL ) { send_to_char( "That ruler is not in the current list.\n\r", ch ); return; } ruler->this_one->ruler_rank = rank; save_rulers( ); do_rulers( ch, "" ); return; } send_to_char( "That is not a legitimate rank.\n\r", ch ); return; } send_to_char( "Syntax for rulers:\n\r", ch ); send_to_char( "rulers new/affiliation/delete/sex name <clan number>\n\r", ch ); return; }