LOP/
LOP/area/
LOP/boards/
LOP/channels/
LOP/clans/
LOP/classes/
LOP/color/
LOP/councils/
LOP/deity/
LOP/races/
LOP/src/specials/
/*****************************************************************************
 * DikuMUD (C) 1990, 1991 by:                                                *
 *   Sebastian Hammer, Michael Seifert, Hans Henrik Staefeldt, Tom Madsen,   *
 *   and Katja Nyboe.                                                        *
 *---------------------------------------------------------------------------*
 * MERC 2.1 (C) 1992, 1993 by:                                               *
 *   Michael Chastain, Michael Quan, and Mitchell Tse.                       *
 *---------------------------------------------------------------------------*
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998 by: Derek Snider.                    *
 *   Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, Swordbearer, *
 *         gorog, Grishnakh, Nivek, Tricops, and Fireblade.                  *
 *---------------------------------------------------------------------------*
 * SMAUG 1.7 FUSS by: Samson and others of the SMAUG community.              *
 *                    Their contributions are greatly appreciated.           *
 *---------------------------------------------------------------------------*
 * LoP (C) 2006, 2007, 2008 by: the LoP team.                                *
 *****************************************************************************/

#include <stdio.h>
#include "h/mud.h"

#define SYSDATA_FILE SYSTEM_DIR "sysdata.dat"

/* Save system info to data file */
void save_sysdata( void )
{
   FILE *fp;

   if( !( fp = fopen( SYSDATA_FILE, "w" ) ) )
   {
      bug( "%s: couldn't open %s for writing", __FUNCTION__, SYSDATA_FILE );
      perror( SYSDATA_FILE );
      return;
   }
   if( sysdata.mud_name )
      fprintf( fp, "MudName           %s~\n", sysdata.mud_name );
   if( !xIS_EMPTY( sysdata.save_flags ) )
      fprintf( fp, "Saveflags         %s~\n", ext_flag_string( &sysdata.save_flags, save_flag ) );
   if( sysdata.time_of_max )
      fprintf( fp, "Highplayertime    %ld\n", sysdata.time_of_max );
   if( sysdata.next_pfile_cleanup )
      fprintf( fp, "NPfileCleanup     %ld\n", sysdata.next_pfile_cleanup );
   if( sysdata.alltimemax )
      fprintf( fp, "Highplayers       %d\n", sysdata.alltimemax );
   if( sysdata.ident_retries != 20 )
      fprintf( fp, "IdentTries        %d\n", sysdata.ident_retries );
   if( sysdata.ban_site != PERM_HEAD)
      fprintf( fp, "BanSiteLevel      %d\n", sysdata.ban_site );
   if( sysdata.ban_race != PERM_HEAD )
      fprintf( fp, "BanRaceLevel      %d\n", sysdata.ban_race );
   if( sysdata.ban_class != PERM_HEAD )
      fprintf( fp, "BanClassLevel     %d\n", sysdata.ban_class );
   if( sysdata.perm_forcepc != PERM_HEAD )
      fprintf( fp, "Forcepc           %d\n", sysdata.perm_forcepc );
   if( sysdata.NAME_RESOLVING )
      fprintf( fp, "%s", "NameResolving\n" );
   if( sysdata.DENY_NEW_PLAYERS )
      fprintf( fp, "%s", "DenyNewPlayers\n" );
   if( sysdata.WAIT_FOR_AUTH )
      fprintf( fp, "%s", "WaitForAuth\n" );
   if( sysdata.morph_opt )
      fprintf( fp, "%s", "MorphOpt\n" );
   if( sysdata.save_pets )
      fprintf( fp, "%s", "PetSave\n" );
   if( sysdata.pk_loot )
      fprintf( fp, "%s", "PkLoot\n" );
   if( sysdata.wizlock )
      fprintf( fp, "%s", "WizLock\n" );
   if( sysdata.skipclasses )
      fprintf( fp, "%s", "SkipClasses\n" );
   if( sysdata.perm_getobjnotake != PERM_LEADER )
      fprintf( fp, "GetObjNoTake      %d\n", sysdata.perm_getobjnotake );
   if( sysdata.perm_muse != PERM_LEADER )
      fprintf( fp, "Muse              %d\n", sysdata.perm_muse );
   if( sysdata.perm_think != PERM_HEAD )
      fprintf( fp, "Think             %d\n", sysdata.perm_think );
   if( sysdata.perm_build != PERM_BUILDER )
      fprintf( fp, "Build             %d\n", sysdata.perm_build );
   if( sysdata.perm_log != PERM_LOG )
      fprintf( fp, "Log               %d\n", sysdata.perm_log );
   if( sysdata.perm_modify_proto != PERM_LEADER )
      fprintf( fp, "Protoflag         %d\n", sysdata.perm_modify_proto );
   if( sysdata.perm_override_private != PERM_LEADER )
      fprintf( fp, "Overridepriv      %d\n", sysdata.perm_override_private );
   if( sysdata.perm_mset_player != PERM_HEAD )
      fprintf( fp, "Msetplayer        %d\n", sysdata.perm_mset_player );
   if( sysdata.save_frequency != 20 )
      fprintf( fp, "Savefreq          %d\n", sysdata.save_frequency );
   if( sysdata.bestow_dif != 5 )
      fprintf( fp, "Bestowdif         %d\n", sysdata.bestow_dif );
   if( sysdata.mlimit_total != 6 )
      fprintf( fp, "MLimitTotal       %d\n", sysdata.mlimit_total );
   if( sysdata.mlimit_deadly != 1 )
      fprintf( fp, "MLimitDeadly      %d\n", sysdata.mlimit_total );
   if( sysdata.mlimit_peaceful != 3 )
      fprintf( fp, "MLimitPeaceful    %d\n", sysdata.mlimit_peaceful );
   if( sysdata.maxpet > 1 )
      fprintf( fp, "MaxPet            %d\n", sysdata.maxpet );
   if( sysdata.room_limbo )
      fprintf( fp, "RoomLimbo         %d\n", sysdata.room_limbo );
   if( sysdata.room_poly )
      fprintf( fp, "RoomPoly          %d\n", sysdata.room_poly );
   if( sysdata.room_authstart )
      fprintf( fp, "RoomAuthstart     %d\n", sysdata.room_authstart );
   if( sysdata.room_deadly )
      fprintf( fp, "RoomDeadly        %d\n", sysdata.room_deadly );
   if( sysdata.room_school )
      fprintf( fp, "RoomSchool        %d\n", sysdata.room_school );
   if( sysdata.room_temple )
      fprintf( fp, "RoomTemple        %d\n", sysdata.room_temple );
   if( sysdata.room_altar )
      fprintf( fp, "RoomAltar         %d\n", sysdata.room_altar );
   if( sysdata.room_halloffallen )
      fprintf( fp, "RoomHallofFallen  %d\n", sysdata.room_halloffallen );

   fprintf( fp, "End\n" );
   fclose( fp );
   fp = NULL;
}

void fread_sysdata( FILE *fp )
{
   char *infoflags, flag[MIL];
   const char *word;
   int value;
   bool fMatch;

   for( ;; )
   {
      word = feof( fp ) ? "End" : fread_word( fp );
      fMatch = false;

      if( word[0] == EOF )
         word = "End";

      switch( UPPER( word[0] ) )
      {
         case '*':
            fMatch = true;
            fread_to_eol( fp );
            break;

         case 'B':
            KEY( "Bestowdif", sysdata.bestow_dif, fread_number( fp ) );
            KEY( "Build", sysdata.perm_build, fread_number( fp ) );
            KEY( "BanSiteLevel", sysdata.ban_site, fread_number( fp ) );
            KEY( "BanClassLevel", sysdata.ban_class, fread_number( fp ) );
            KEY( "BanRaceLevel", sysdata.ban_race, fread_number( fp ) );
            break;

         case 'D':
            if( !str_cmp( word, "DenyNewPlayers" ) )
            {
               sysdata.DENY_NEW_PLAYERS = true;
               fMatch = true;
               break;
            }
            break;

         case 'E':
            if( !str_cmp( word, "End" ) )
               return;
            break;

         case 'F':
            KEY( "Forcepc", sysdata.perm_forcepc, fread_number( fp ) );
            break;

         case 'G':
            KEY( "GetObjNoTake", sysdata.perm_getobjnotake, fread_number( fp ) );
            break;

         case 'H':
            KEY( "Highplayers", sysdata.alltimemax, fread_number( fp ) );
            KEY( "Highplayertime", sysdata.time_of_max, fread_time( fp ) );
            break;

         case 'I':
            KEY( "IdentTries", sysdata.ident_retries, fread_number( fp ) );
            break;

         case 'L':
            KEY( "Log", sysdata.perm_log, fread_number( fp ) );
            break;

         case 'M':
            if( !str_cmp( word, "MorphOpt" ) )
            {
               sysdata.morph_opt = true;
               fMatch = true;
               break;
            }
            KEY( "MLimitTotal", sysdata.mlimit_total, fread_number( fp ) );
            KEY( "MLimitDeadly", sysdata.mlimit_deadly, fread_number( fp ) );
            KEY( "MLimitPeaceful", sysdata.mlimit_peaceful, fread_number( fp ) );
            KEY( "MaxPet", sysdata.maxpet, fread_number( fp ) );
            KEY( "Msetplayer", sysdata.perm_mset_player, fread_number( fp ) );
            KEY( "MudName", sysdata.mud_name, fread_string( fp ) );
            KEY( "Muse", sysdata.perm_muse, fread_number( fp ) );
            break;

         case 'N':
            if( !str_cmp( word, "NameResolving" ) )
            {
               sysdata.NAME_RESOLVING = true;
               fMatch = true;
               break;
            }
            KEY( "NPfileCleanup", sysdata.next_pfile_cleanup, fread_time( fp ) );
            break;

         case 'O':
            KEY( "Overridepriv", sysdata.perm_override_private, fread_number( fp ) );
            break;

         case 'P':
            if( !str_cmp( word, "PetSave" ) )
            {
               sysdata.save_pets = true;
               fMatch = true;
               break;
            }
            if( !str_cmp( word, "PkLoot" ) )
            {
               sysdata.pk_loot = true;
               fMatch = true;
               break;
            }
            KEY( "Protoflag", sysdata.perm_modify_proto, fread_number( fp ) );
            break;

         case 'R':
            KEY( "RoomLimbo", sysdata.room_limbo, fread_number( fp ) );
            KEY( "RoomPoly", sysdata.room_poly, fread_number( fp ) );
            KEY( "RoomAuthstart", sysdata.room_authstart, fread_number( fp ) );
            KEY( "RoomDeadly", sysdata.room_deadly, fread_number( fp ) );
            KEY( "RoomSchool", sysdata.room_school, fread_number( fp ) );
            KEY( "RoomTemple", sysdata.room_temple, fread_number( fp ) );
            KEY( "RoomAltar", sysdata.room_altar, fread_number( fp ) );
            KEY( "RoomHallofFallen", sysdata.room_halloffallen, fread_number( fp ) );
            break;

         case 'S':
            WEXTKEY( "Saveflags", sysdata.save_flags, fp, save_flag, SV_MAX );
            KEY( "Savefreq", sysdata.save_frequency, fread_number( fp ) );
            if( !str_cmp( word, "SkipClasses" ) )
            {
               sysdata.skipclasses = true;
               fMatch = true;
               break;
            }
            break;

         case 'T':
            KEY( "Think", sysdata.perm_think, fread_number( fp ) );
            break;

         case 'W':
            if( !str_cmp( word, "WizLock" ) )
            {
               sysdata.wizlock = true;
               fMatch = true;
               break;
            }
            if( !str_cmp( word, "WaitForAuth" ) )
            {
               sysdata.WAIT_FOR_AUTH = true;
               fMatch = true;
               break;
            }
            break;
      }

      if( !fMatch )
      {
         bug( "%s: no match: %s", __FUNCTION__, word );
         fread_to_eol( fp );
      }
   }
}

/* Load the sysdata file */
void load_systemdata( void )
{
   FILE *fp;

   /* Defaults */
   xCLEAR_BITS( sysdata.save_flags );
   sysdata.mud_name = NULL;
   sysdata.perm_muse = PERM_LEADER;
   sysdata.perm_think = PERM_HEAD;
   sysdata.perm_build = PERM_BUILDER;
   sysdata.perm_log = PERM_LOG;
   sysdata.perm_modify_proto = PERM_LEADER;
   sysdata.perm_override_private = PERM_LEADER;
   sysdata.perm_mset_player = PERM_HEAD;
   sysdata.perm_getobjnotake = PERM_LEADER;
   sysdata.ban_site = PERM_HEAD;
   sysdata.ban_race = PERM_HEAD;
   sysdata.ban_class = PERM_HEAD;
   sysdata.perm_forcepc = PERM_HEAD;
   sysdata.save_frequency = 20;  /* minutes */
   sysdata.ident_retries = 20;
   sysdata.bestow_dif = 5;
   sysdata.time_of_max = 0;
   sysdata.next_pfile_cleanup = 0;
   sysdata.WAIT_FOR_AUTH = false;
   sysdata.DENY_NEW_PLAYERS = false;
   sysdata.NAME_RESOLVING = false;
   sysdata.morph_opt = false;
   sysdata.save_pets = false;
   sysdata.pk_loot = false;
   sysdata.wizlock = false;
   sysdata.skipclasses = false;
   sysdata.mlimit_total = 6;
   sysdata.mlimit_deadly = 1;
   sysdata.mlimit_peaceful = 4;
   sysdata.maxpet = 1;
   sysdata.room_limbo = 2;
   sysdata.room_poly = 3;
   sysdata.room_authstart = 21017;
   sysdata.room_deadly = 21017;
   sysdata.room_school = 21017;
   sysdata.room_temple = 21017;
   sysdata.room_altar = 21017;
   sysdata.room_halloffallen = 21017;

   if( !( fp = fopen( SYSDATA_FILE, "r" ) ) )
   {
      log_printf( "%s: couldn't open %s for reading. Using Defaults.", __FUNCTION__, SYSDATA_FILE );
      perror( SYSDATA_FILE );
      return;
   }
   fread_sysdata( fp );
   fclose( fp );
   fp = NULL;
}

CMDF( do_cset )
{
   char arg[MSL];
   short level;

   set_pager_color( AT_PLAIN, ch );
   if( !argument || argument[0] == '\0' )
   {
      pager_printf( ch, "\r\n&WMudName: &c%s\r\n", sysdata.mud_name ? sysdata.mud_name : "Not Set" );

      pager_printf( ch, "&WMultiPlayingLimits:\r\n  &wMLTotal:        &c%6d &wMLDeadly:       &c%6d &wMLPeaceful:       &c%6d\r\n",
         sysdata.mlimit_total, sysdata.mlimit_deadly, sysdata.mlimit_peaceful );

      pager_printf( ch, "&WSaveFlag:\r\n  &c%s\r\n", ext_flag_string( &sysdata.save_flags, save_flag ) );

      send_to_pager( "&WChannels:\r\n", ch );
      pager_printf( ch, "  &wMuse:           &c%6s &wThink:          &c%6s &wLog:             &c%6s\r\n  &wBuild:         &c%6s\r\n",
         perms_flag[sysdata.perm_muse], perms_flag[sysdata.perm_think],
         perms_flag[sysdata.perm_log], perms_flag[sysdata.perm_build] );

      send_to_pager( "&WBuilding:\r\n", ch );
      pager_printf( ch, "  &wProtoModify:    &c%6s &wMsetPlayer:     &c%6s\r\n",
         perms_flag[sysdata.perm_modify_proto], perms_flag[sysdata.perm_mset_player] );

      send_to_pager( "&WBan Data:\r\n", ch );
      pager_printf( ch, "  &wBanSite:        &c%6s &wBanClass:       &c%6s &wBanRace:          &c%6s\r\n",
         perms_flag[sysdata.ban_site], perms_flag[sysdata.ban_class], perms_flag[sysdata.ban_race] );

      send_to_pager( "&WOthers:\r\n", ch );
      pager_printf( ch, "  &wGetObjNoTake:   &c%6s &wSaveFrequency:  &c%6d &wBestowDif:        &c%6d\r\n",
         perms_flag[sysdata.perm_getobjnotake], sysdata.save_frequency, sysdata.bestow_dif );
      pager_printf( ch, "  &wIdent:          &c%6d &wForcePc:        &c%6s &wOverridePrivate:  &c%6s\r\n",
         sysdata.ident_retries, perms_flag[sysdata.perm_forcepc], perms_flag[sysdata.perm_override_private] );
      pager_printf( ch, "  &wMaxPet:         &c%6d\r\n", sysdata.maxpet );

      send_to_pager( "&WToggles:\r\n", ch );
      pager_printf( ch, "  &wNameResolving:  &c%6s &wWaitForAuth:    &c%6s &wPkLoot:           &c%6s\r\n",
         sysdata.NAME_RESOLVING ? "ON" : "off", sysdata.WAIT_FOR_AUTH ? "ON" : "off", sysdata.pk_loot ? "ON" : "off" );
      pager_printf( ch, "  &wDenyNewPlayers: &c%6s &wMorphOpt:       &c%6s &wPetSave:          &c%6s\r\n",
         sysdata.DENY_NEW_PLAYERS ? "ON" : "off", sysdata.morph_opt ? "ON" : "off", sysdata.save_pets ? "ON" : "off" );
      pager_printf( ch, "  &wWizLock:        &c%6s &wSkipClasses:    &c%6s\r\n",
         sysdata.wizlock ? "ON" : "off", sysdata.skipclasses ? "ON" : "off" );

      send_to_pager( "&WRooms:\r\n", ch );
      pager_printf( ch, "  &wRoomLimbo:      &c%6d &wRoomPoly:       &c%6d &wRoomAuthStart:    &c%6d\r\n",
         sysdata.room_limbo, sysdata.room_poly, sysdata.room_authstart );
      pager_printf( ch, "  &wRoomDeadly:     &c%6d &wRoomSchool:     &c%6d &wRoomHallofFallen: &c%6d\r\n",
         sysdata.room_deadly, sysdata.room_school, sysdata.room_halloffallen );
      pager_printf( ch, "  &wRoomAltar:      &c%6d &wRoomTemple:     &c%6d\r\n",
         sysdata.room_altar, sysdata.room_temple );
      return;
   }

   argument = one_argument( argument, arg );

   if( !str_cmp( arg, "save" ) )
   {
      save_sysdata( );
      send_to_char( "Cset functions saved.\r\n", ch );
      return;
   }

   if( !str_cmp( arg, "mudname" ) )
   {
      STRSET( sysdata.mud_name, argument );
      send_to_char( "Name Set.\r\n", ch );
      return;
   }

   if( !str_cmp( arg, "saveflag" ) )
   {
      int x = 0;

      while( argument && argument[0] != '\0' )
      {
         argument = one_argument( argument, arg );
         x = get_flag( arg, save_flag, SV_MAX );
         if( x < 0 || x >= SV_MAX )
            ch_printf( ch, "%s isn't a valid save flag.\r\n", arg );
         else
            xTOGGLE_BIT( sysdata.save_flags, x );
      }
      send_to_char( "SaveFlags Set.\r\n", ch );
      return;
   }

   level = ( short )atoi( argument );

   if( !str_cmp( arg, "mltotal" ) )
   {
      sysdata.mlimit_total = URANGE( 1, level, 100 );
      ch_printf( ch, "MLTotal set to %d.\r\n", sysdata.mlimit_total );
      return;
   }
   if( !str_cmp( arg, "mldeadly" ) )
   {
      sysdata.mlimit_deadly = URANGE( 1, level, 100 );
      ch_printf( ch, "MLDeadly set to %d.\r\n", sysdata.mlimit_deadly );
      return;
   }
   if( !str_cmp( arg, "mlpeaceful" ) )
   {
      sysdata.mlimit_peaceful = URANGE( 1, level, 100 );
      ch_printf( ch, "MLPeaceful set to %d.\r\n", sysdata.mlimit_peaceful );
      return;
   }
   if( !str_cmp( arg, "maxpet" ) )
   {
      sysdata.maxpet = URANGE( 1, level, 100 );
      ch_printf( ch, "MaxPet set to %d.\r\n", sysdata.maxpet);
      return;
   }
   if( !str_cmp( arg, "ident_retries" ) || !str_cmp( arg, "ident" ) )
   {
      if( level <= 0 )
         send_to_char( "Ident lookups turned off.\r\n", ch );
      else
         send_to_char( "Ok.\r\n", ch );
      sysdata.ident_retries = URANGE( 0, level, 20 );
      return;
   }

   if( !str_cmp( arg, "petsave" ) )
      sysdata.save_pets = !sysdata.save_pets;
   else if( !str_cmp( arg, "pkloot" ) )
      sysdata.pk_loot = !sysdata.pk_loot;
   else if( !str_cmp( arg, "wizlock" ) )
      sysdata.wizlock = !sysdata.wizlock;
   else if( !str_cmp( arg, "skipclasses" ) )
      sysdata.skipclasses = !sysdata.skipclasses;
   else if( !str_cmp( arg, "morphopt" ) )
      sysdata.morph_opt = !sysdata.morph_opt;
   else if( !str_cmp( arg, "nameresolving" ) )
      sysdata.NAME_RESOLVING = !sysdata.NAME_RESOLVING;
   else if( !str_cmp( arg, "denynewplayers" ) )
      sysdata.DENY_NEW_PLAYERS = !sysdata.DENY_NEW_PLAYERS;
   else if( !str_cmp( arg, "waitforauth" ) )
      sysdata.WAIT_FOR_AUTH = !sysdata.WAIT_FOR_AUTH;
   else if( !str_prefix( arg, "savefrequency" ) )
      sysdata.save_frequency = level;
   else if( !str_cmp( arg, "bestowdif" ) )
      sysdata.bestow_dif = URANGE( 1, level, 10 );
   else if( !str_cmp( arg, "getobjnotake" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_getobjnotake = level;
   }
   else if( !str_cmp( arg, "mset_player" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_mset_player = level;
   }
   else if( !str_cmp( arg, "forcepc" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_forcepc = level;
   }
   else if( !str_cmp( arg, "bansite" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.ban_site = level;
   }
   else if( !str_cmp( arg, "banrace" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.ban_race = level;
   }
   else if( !str_cmp( arg, "banclass" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.ban_class = level;
   }
   else if( !str_cmp( arg, "muse" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_muse = level;
   }
   else if( !str_cmp( arg, "think" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_think = level;
   }
   else if( !str_cmp( arg, "log" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_log = level;
   }
   else if( !str_cmp( arg, "build" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_build = level;
   }
   else if( !str_cmp( arg, "protomodify" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_modify_proto = level;
   }
   else if( !str_cmp( arg, "overrideprivate" ) )
   {
      if( !is_number( argument ) )
         level = get_flag( argument, perms_flag, PERM_MAX );
      if( level < PERM_IMM || level > get_trust( ch ) || level >= PERM_MAX )
      {
         send_to_char( "Permission out of range.\r\n", ch );
         return;
      }
      sysdata.perm_override_private = level;
   }
   else if( !str_cmp( arg, "roomlimbo" ) )
      sysdata.room_limbo = UMAX( 0, level );
   else if( !str_cmp( arg, "roompoly" ) )
      sysdata.room_poly = UMAX( 0, level );
   else if( !str_cmp( arg, "roomauthstart" ) )
      sysdata.room_authstart = UMAX( 0, level );
   else if( !str_cmp( arg, "roomdeadly" ) )
      sysdata.room_deadly = UMAX( 0, level );
   else if( !str_cmp( arg, "roomschool" ) )
      sysdata.room_school = UMAX( 0, level );
   else if( !str_cmp( arg, "roomtemple" ) )
      sysdata.room_temple = UMAX( 0, level );
   else if( !str_cmp( arg, "roomaltar" ) )
      sysdata.room_altar = UMAX( 0, level );
   else if( !str_cmp( arg, "roomhalloffallen" ) )
      sysdata.room_halloffallen = UMAX( 0, level );
   else
   {
      send_to_char( "Invalid argument.\r\n", ch );
      return;
   }
   ch_printf( ch, "%s Set.\r\n", capitalize( arg ) );
}

CMDF( do_wizlock )
{
   sysdata.wizlock = !sysdata.wizlock;
   set_char_color( AT_DANGER, ch );
   save_sysdata( );
   ch_printf( ch, "Game %swizlocked and sysdata saved.\r\n", sysdata.wizlock ? "" : "un-" );
}