/
vortex/area/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"

void save_config args(( void ));
void load_config args(( void ));

void do_configure(CHAR_DATA *ch, char *argument)
{
 char buf[MAX_STRING_LENGTH];
 char arg1[MAX_INPUT_LENGTH];
 char arg2[MAX_INPUT_LENGTH];
 char arg3[MAX_INPUT_LENGTH];
 char *wholearg;
 CHAR_DATA *vch;
 int ox, oy;

 argument = one_argument(argument,arg1);
 wholearg = argument;
 argument = one_argument(argument,arg2);
 argument = one_argument(argument,arg3);

 if( arg1[0] == '\0' )
 {
  stc("Current Configuration:\n\r",ch);
  sprintf(buf,"  Mobile Hp     *= %d / %d\n\r",
   config_info->mob_hp_mult, config_info->mob_hp_div);
   stc(buf,ch);
  sprintf(buf,"  Mobile Level  *= %d / %d\n\r",
   config_info->mob_level_mult, config_info->mob_level_div);
   stc(buf,ch);
  sprintf(buf,"  Mobile Damage *= %d / %d\n\r",
   config_info->mob_dam_mult, config_info->mob_dam_div);
   stc(buf,ch);
  sprintf(buf,"  Mobile Exp    *= %d / %d\n\r",
   config_info->research_exp_mult, config_info->research_exp_div);
   stc(buf,ch);
  sprintf(buf,"  AutoHelp      == %s\n\r",
   config_info->autohelp);
   stc(buf,ch);
  sprintf(buf,"  TitleNone     == %s\n\r",
   config_info->title_none);
   stc(buf,ch);
  sprintf(buf,"  Title00       == %s\n\r",
   config_info->title00);
   stc(buf,ch);
  sprintf(buf,"  Title05       == %s\n\r",
   config_info->title05);
   stc(buf,ch);
  sprintf(buf,"  Title10       == %s\n\r",
   config_info->title10);
   stc(buf,ch);
  sprintf(buf,"  Title15       == %s\n\r",
   config_info->title15);
   stc(buf,ch);
  sprintf(buf,"  Title20       == %s\n\r",
   config_info->title20);
   stc(buf,ch);
  sprintf(buf,"  Title25       == %s\n\r",
   config_info->title25);
   stc(buf,ch);
  sprintf(buf,"  Title30       == %s\n\r",
   config_info->title30);
   stc(buf,ch);
  sprintf(buf,"  Title35       == %s\n\r",
   config_info->title35);
   stc(buf,ch);
  sprintf(buf,"  Title40       == %s\n\r",
   config_info->title40);
   stc(buf,ch);
  sprintf(buf,"  Title45       == %s\n\r",
   config_info->title45);
   stc( buf, ch);
  sprintf(buf,"  Title50       == %s\n\r",
   config_info->title50);
   stc( buf, ch);
  sprintf(buf,"  Imm07         == %s\n\r",
   config_info->imm07);  
   stc(buf,ch);
  sprintf(buf,"  Imm08         == %s\n\r",
   config_info->imm08);  
   stc(buf,ch);
  sprintf(buf,"  Imm09         == %s\n\r",
   config_info->imm09);  
   stc(buf,ch);
  sprintf(buf,"  Imm10         == %s\n\r",
   config_info->imm10);  
   stc(buf,ch);
  sprintf(buf,"  Imm11         == %s\n\r",
   config_info->imm11);  
   stc(buf,ch);
  sprintf(buf,"  Imm12         == %s\n\r",
   config_info->imm12);  
   stc(buf,ch);
  return;
 }

 if( !str_prefix(arg1,"autohelp") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure autohelp <help page>",ch);
   return;
  }
  free_string(config_info->autohelp);
  config_info->autohelp = str_dup(wholearg);
  stc("Successfully updated Auto Help.\n\r",ch);
  save_config();
  return;
 }	

 if( !str_cmp(arg1,"titlenone") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure titlenone <string>",ch);
   return;
  }
  free_string(config_info->title_none);
  config_info->title_none = str_dup(wholearg);
  stc("Successfully updated titlenone.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title00") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title00 <string>",ch);
   return;
  }
  free_string(config_info->title00);
  config_info->title00 = str_dup(wholearg);
  stc("Successfully updated title00.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title05") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title05 <string>",ch);
   return;
  }
  free_string(config_info->title05);
  config_info->title05 = str_dup(wholearg);
  stc("Successfully updated title05.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title10") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title10 <string>",ch);
   return;
  }
  free_string(config_info->title10);
  config_info->title10 = str_dup(wholearg);
  stc("Successfully updated title10.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title15") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title15 <string>",ch);
   return;
  }
  free_string(config_info->title15);
  config_info->title15 = str_dup(wholearg);
  stc("Successfully updated title15.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title20") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title20 <string>",ch);
   return;
  }
  free_string(config_info->title20);
  config_info->title20 = str_dup(wholearg);
  stc("Successfully updated title20.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title25") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title25 <string>",ch);
   return;
  }
  free_string(config_info->title25);
  config_info->title25 = str_dup(wholearg);
  stc("Successfully updated title25.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title30") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title30 <string>",ch);
   return;
  }
  free_string(config_info->title30);
  config_info->title30 = str_dup(wholearg);
  stc("Successfully updated title30.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title35") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title35 <string>",ch);
   return;
  }
  free_string(config_info->title35);
  config_info->title35 = str_dup(wholearg);
  stc("Successfully updated title35.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title40") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title40 <string>",ch);
   return;
  }
  free_string(config_info->title40);
  config_info->title40 = str_dup(wholearg);
  stc("Successfully updated title40.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title45") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title45 <string>",ch);
   return;
  }
  free_string(config_info->title45);
  config_info->title45 = str_dup(wholearg);
  stc("Successfully updated title45.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"title50") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure title50 <string>",ch);
   return;
  }
  free_string(config_info->title50);
  config_info->title50 = str_dup(wholearg);
  stc("Successfully updated title50.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm07") )
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm07 <string>",ch);
   return;
  }
  free_string(config_info->imm07);
  config_info->imm07 = str_dup(wholearg);
  stc("Successfully updated imm07.\n\r",ch);
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm08") )  
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm08 <string>",ch);  
   return;
  }
  free_string(config_info->imm08);  
  config_info->imm08 = str_dup(wholearg);  
  stc("Successfully updated imm08.\n\r",ch);  
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm09") )  
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm09 <string>",ch);  
   return;
  }
  free_string(config_info->imm09);  
  config_info->imm09 = str_dup(wholearg);  
  stc("Successfully updated imm09.\n\r",ch);  
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm10") )  
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm10 <string>",ch);  
   return;
  }
  free_string(config_info->imm10);  
  config_info->imm10 = str_dup(wholearg);  
  stc("Successfully updated imm10.\n\r",ch);  
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm11") )  
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm11 <string>",ch);  
   return;
  }
  free_string(config_info->imm11);  
  config_info->imm11 = str_dup(wholearg);  
  stc("Successfully updated imm11.\n\r",ch);  
  save_config();
  return;
 }

 if( !str_cmp(arg1,"imm12") )  
 {
  if( wholearg[0] == '\0' )
  {
   stc("Syntax: configure imm12 <string>",ch);  
   return;
  }
  free_string(config_info->imm12);  
  config_info->imm12 = str_dup(wholearg);  
  stc("Successfully updated imm12.\n\r",ch);  
  save_config();
  return;
 }

 if( !is_number(arg2) || !is_number(arg3) )
 {
  stc("Syntax:  configure <variable> <x> <y>\n\r",ch);
  stc("where x:y is the ratio you wish to set the variable to.\n\r",ch);
  stc("eg. configure hitpoints 2 1\n\r",ch);
  stc("Doubles the number of hp every mob has.\n\r",ch);
  stc("Configure on it's own lists all variables.\n\r",ch);
  return;
 }

 if( atoi(arg3) == 0 || atoi(arg2)==0 )
 {
  stc("Values of zero are not allowed.\n\r",ch);
  return;
 }

 if( !str_prefix(arg1,"hitpoints") )
 {
  ox = config_info->mob_hp_mult;
  oy = config_info->mob_hp_div;

  config_info->mob_hp_mult = atoi(arg2);
  config_info->mob_hp_div  = atoi(arg3);

  for( vch = char_list; vch != NULL; vch = vch->next )
  {
   if( IS_NPC(vch) )
   {
    vch->hit = vch->hit * oy / ox;
    vch->hit = vch->hit * config_info->mob_hp_mult / config_info->mob_hp_div;
    vch->max_hit = vch->max_hit * oy / ox;
    vch->max_hit = vch->max_hit * config_info->mob_hp_mult / config_info->mob_hp_div;
   }
  }
  stc("Successful update of mobile hitpoints.\n\r",ch);
  save_config();
  return;
 }

 if( !str_prefix(arg1,"damage") )
 {
  ox = config_info->mob_dam_mult;
  oy = config_info->mob_dam_div;

  config_info->mob_dam_mult = atoi(arg2);
  config_info->mob_dam_div  = atoi(arg3);

  for( vch = char_list; vch != NULL; vch = vch->next )
  {
   if( IS_NPC(vch) )
   {
    vch->damroll = vch->damroll * oy / ox;
    vch->damroll = vch->damroll * config_info->mob_hp_mult / config_info->mob_hp_div; 
   }
  }
  stc("Successful update of mobile damage.\n\r",ch);
  save_config();
  return;
 }

 if( !str_prefix(arg1,"level") )
 {
  ox = config_info->mob_level_mult;
  oy = config_info->mob_level_div;

  config_info->mob_level_mult = atoi(arg2);
  config_info->mob_level_div  = atoi(arg3);

  for( vch = char_list; vch != NULL; vch = vch->next )
  {
   if( IS_NPC(vch) )
   {
    int lvl;
    lvl = vch->level;
    vch->level = vch->level * oy / ox;
    vch->level = vch->level * config_info->mob_level_mult / config_info->mob_level_div;
    if( vch->level < lvl )
    vch->level = lvl;
   }
  }
  stc("Successful update of mobile level.\n\r",ch);
  save_config();
  return;
 }

 if( !str_prefix(arg1,"exp") )
 {
  config_info->research_exp_mult = atoi(arg2);
  config_info->research_exp_div  = atoi(arg3);

  stc("Successful update of exp.\n\r",ch);
  save_config();
  return;
 }

 if( !str_prefix(arg1,"points") )
 {
  config_info->prac_exp_mult = atoi(arg2);
  config_info->prac_exp_div  = atoi(arg3);

  stc("Successful update of Disc Points.\n\r",ch);
  save_config();
  return;
 }

 stc("Cannot update a non-existant variable.\n\r",ch);
 stc("config with no arguments to list.\n\r",ch);
 return;
}

void initialise_config()
{
 if (config_info == NULL)
  config_info = alloc_perm( sizeof(*config_info) );

 config_info->ap_exp_points     = 1000000;
 config_info->ap_exp_mult       = 1.00;
 config_info->mob_hp_mult	= 1;
 config_info->mob_hp_div	= 1;
 config_info->mob_level_mult	= 1;
 config_info->mob_level_div	= 1;
 config_info->mob_dam_mult	= 1;
 config_info->mob_dam_div	= 1;
 config_info->prac_exp_mult	= 1;
 config_info->prac_exp_div	= 1;
 config_info->train_exp_mult	= 1;
 config_info->train_exp_div	= 1;
 config_info->research_exp_mult	= 1;
 config_info->research_exp_div	= 1;
 config_info->research_time_mult	= 1;
 config_info->research_time_div	= 1;
 config_info->max_players		= 0;
 config_info->autohelp = str_dup("help");
 config_info->title_none = str_dup("titlenone");
 config_info->title00 = str_dup("title00");
 config_info->title05 = str_dup("title05");
 config_info->title10 = str_dup("title10");
 config_info->title15 = str_dup("title15");
 config_info->title20 = str_dup("title20");
 config_info->title25 = str_dup("title25");
 config_info->title30 = str_dup("title30");
 config_info->title35 = str_dup("title35");
 config_info->title40 = str_dup("title40");
 config_info->title45 = str_dup("title45");
 config_info->title45 = str_dup("title50");
 config_info->imm07 = str_dup("imm07");
 config_info->imm08 = str_dup("imm08");
 config_info->imm09 = str_dup("imm09");
 config_info->imm10 = str_dup("imm10");
 config_info->imm11 = str_dup("imm11");
 config_info->imm12 = str_dup("imm12");

 load_config();
 return;
}

void load_config( void )
{
 FILE *fp;
 char *word;
 bool done = FALSE;
 bool found = FALSE;
        
 if( (fp = fopen( CONFIG_FILE, "r")) == NULL)
 {
  log_string("No configuration file found...Creating new.");
  save_config();
  return;
 }
 log_string("Loading configuration data...");
 word = fread_word(fp); 
 while(!done)
 {
  found = FALSE;
  if( !str_cmp( word, "ApExpPoints") )
  {
   config_info->ap_exp_points = fread_number(fp);
   found = TRUE;
  }
  if( !str_cmp( word, "ApExpMult") )
  {
   config_info->ap_exp_mult = atof( fread_string(fp) );
   found = TRUE;
  }
  if( !str_cmp(word,"MobHpMult") )
  {
   config_info->mob_hp_mult = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"MobHpDiv") )
  {
   config_info->mob_hp_div = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"MobLevelMult") )
  {
   config_info->mob_level_mult = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"MobLevelDiv") )
  {
   config_info->mob_level_div = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"MobDamMult") )
  {
   config_info->mob_dam_mult = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"MobDamDiv") )
  {
   config_info->mob_dam_div = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"ExpMult") )
  {
   config_info->research_exp_mult = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"ExpDiv") )
  {
   config_info->research_exp_div = fread_number(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"AutoHelp") )
  {
   config_info->autohelp = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"TitleNone") )
  {
   config_info->title_none = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title00") )
  {
   config_info->title00 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title05") )
  {
   config_info->title05 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title10") )
  {
   config_info->title10 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title15") )
  {
   config_info->title15 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title20") )
  {
   config_info->title20 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title25") )
  {
   config_info->title25 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title30") )
  {
   config_info->title30 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title35") )
  {
   config_info->title35 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Title40") )
  {
   config_info->title40 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word, "Title45") )
  {
   config_info->title45 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word, "Title50") )
  {
   config_info->title50 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm07") )
  {
   config_info->imm07 = fread_string(fp);
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm08") )  
  {
   config_info->imm08 = fread_string(fp);  
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm09") )  
  {
   config_info->imm09 = fread_string(fp);  
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm10") )  
  {
   config_info->imm10 = fread_string(fp);  
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm11") )  
  {
   config_info->imm11 = fread_string(fp);  
   found = TRUE;
  }
  else if( !str_cmp(word,"Imm12") )  
  {
   config_info->imm12 = fread_string(fp);  
   found = TRUE;
  }
  else if( !str_cmp(word,"#END") )
  {
   done = TRUE;
   found = TRUE;
   break;
  }
  if(!found)
  {
   fclose(fp);
   return;
  }
  if(!done)
   word = fread_word(fp);
 }
 log_string("Configuration data loaded...");
 fclose(fp);
 return;
}  

void save_config( void )
{
 FILE *fp;

 if( (fp = fopen( CONFIG_FILE, "w")) == NULL)
 {
  log_string("Can not open CONFIG_FILE for writing.");
  return;
 }

 fprintf(fp,"MobHpMult    %d\n",config_info->mob_hp_mult);
 fprintf(fp,"MobHpDiv     %d\n",config_info->mob_hp_div);
 fprintf(fp,"MobLevelMult %d\n",config_info->mob_level_mult);
 fprintf(fp,"MobLevelDiv  %d\n",config_info->mob_level_div);
 fprintf(fp,"MobDamMult   %d\n",config_info->mob_dam_mult);
 fprintf(fp,"MobDamDiv    %d\n",config_info->mob_dam_div);
 fprintf(fp,"ExpMult      %d\n",config_info->research_exp_mult);
 fprintf(fp,"ExpDiv       %d\n",config_info->research_exp_div);
 fprintf(fp,"AutoHelp     %s~\n",config_info->autohelp);
 fprintf(fp,"TitleNone    %s~\n",config_info->title_none);
 fprintf(fp,"Title00      %s~\n",config_info->title00);
 fprintf(fp,"Title05      %s~\n",config_info->title05);
 fprintf(fp,"Title10      %s~\n",config_info->title10);
 fprintf(fp,"Title15      %s~\n",config_info->title15);
 fprintf(fp,"Title20      %s~\n",config_info->title20);
 fprintf(fp,"Title25      %s~\n",config_info->title25);
 fprintf(fp,"Title30      %s~\n",config_info->title30);
 fprintf(fp,"Title35      %s~\n",config_info->title35);
 fprintf(fp,"Title40      %s~\n",config_info->title40);
 fprintf(fp,"Title45      %s~\n",config_info->title45);
 fprintf(fp,"Title50      %s~\n",config_info->title50);
 fprintf(fp,"Imm07        %s~\n",config_info->imm07);
 fprintf(fp,"Imm08        %s~\n",config_info->imm08);
 fprintf(fp,"Imm09        %s~\n",config_info->imm09);
 fprintf(fp,"Imm10        %s~\n",config_info->imm10);
 fprintf(fp,"Imm11        %s~\n",config_info->imm11);
 fprintf(fp,"Imm12        %s~\n",config_info->imm12);
 fprintf(fp,"ApExpPoints  %d\n" ,config_info->ap_exp_points);
 fprintf(fp,"ApExpMult    %1.3f~\n",config_info->ap_exp_mult); 
 fprintf(fp,"#END\n");
 log_string("Configuration successfully saved.");
 fclose(fp);

 return;  
}