ackfuss-4.3.2/area/boards/
ackfuss-4.3.2/npcs/a/
ackfuss-4.3.2/npcs/b/
ackfuss-4.3.2/npcs/c/
ackfuss-4.3.2/npcs/d/
ackfuss-4.3.2/npcs/e/
ackfuss-4.3.2/npcs/f/
ackfuss-4.3.2/npcs/h/
ackfuss-4.3.2/npcs/i/
ackfuss-4.3.2/npcs/k/
ackfuss-4.3.2/npcs/l/
ackfuss-4.3.2/npcs/n/
ackfuss-4.3.2/npcs/o/
ackfuss-4.3.2/npcs/p/
ackfuss-4.3.2/npcs/r/
ackfuss-4.3.2/npcs/s/
ackfuss-4.3.2/npcs/w/
ackfuss-4.3.2/player/c/
ackfuss-4.3.2/reports/
/***************************************************************************
 *  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.                              *
 *                                                                         *
 *  Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley              *
 *                                                                         *
 *  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.                                               *
 *                                                                         *
 *       _/          _/_/_/     _/    _/     _/    ACK! MUD is modified    *
 *      _/_/        _/          _/  _/       _/    Merc2.0/2.1/2.2 code    *
 *     _/  _/      _/           _/_/         _/    (c)Stephen Zepp 1998    *
 *    _/_/_/_/      _/          _/  _/             Version #: 4.3          *
 *   _/      _/      _/_/_/     _/    _/     _/                            *
 *                                                                         *
 *                        http://ackmud.nuc.net/                           *
 *                        zenithar@ackmud.nuc.net                          *
 *  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.                                                  *
 ***************************************************************************/


#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 "globals.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 )
      {
         sh_int 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" ) )
   {
      sh_int 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 );

      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 ) )
      {
         sh_int 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;

}