/
lib/objects/
lib/rooms/
lib/scripts/
lib/security/
src/banner/
src/util/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <time.h>
#include "protos.h"

/* once file is converted BE SURE to update the structs.h file */

#define NEW_MAX_SKILLS  	350
#define NEW_MAX_AFFECT		40
#define NEW_ABS_MAX_CLASS	20
#define NEW_MAX_TOUNGE		3
#define NEW_MAX_NEW_LANGUAGES	10
#define NEW_MAX_SAVES		8
#define NEW_MAX_CONDITIONS	5

		/* new structs here */
struct char_file_u_new
{
	int class;
	byte sex;
	byte level[ABS_MAX_CLASS];
	time_t birth;  /* Time of birth of character     */
	int played;    /* Number of secs played in total */
	int   race;
	unsigned int weight;
	unsigned int height;	
	char title[80];
	char extra_str[255];
	sh_int hometown;
	char description[240];
	bool talks[MAX_TOUNGE];
#if 0
	bool new_languages[MAX_NEW_LANGUAGES];
#endif	
	long extra_flags;
	sh_int load_room;            /* Which room to place char in  */
	struct char_ability_data abilities;
	struct char_point_data points;
	struct char_skill_data skills[MAX_SKILLS];
	struct affected_type affected[MAX_AFFECT];
	/* specials */
	byte spells_to_learn;  
	int alignment;     
	long affected_by;
	long affected_by2;
	time_t last_logon;  /* Time (in secs) of last logon */
	long    act;          /* ACT Flags                    */
	/* char data */
	char name[20];
	char alias[30];  /* for later use.... */
	char pwd[11];
	sh_int apply_saving_throw[MAX_SAVES];
	int conditions[MAX_CONDITIONS];
	int startroom;  /* which room the player should start in */

	long user_flags;	/* no-delete,use ansi,etc... */
	int speaking;		/* language currently speakin in */

};

struct my_char_data {
  struct char_file_u grunt;  		/* contained in structs.h */
  struct char_file_u_new grunt2;	/* contained here */
  short AXE;
}**dummy;


void muck(int orig_ammt, char name[80]);
void specific_axe(int orig_ammt, char name[80]);
void inactive_god_axe (int orig_ammt,time_t CURRENT_TIME);
int change_struct( int orig_ammt);
void inactive_axe(int orig_ammt, time_t CURRENT_TIME);
void zero_bank();
char *time_print(long et);
int load_playerfile(char *argv[]);
int convert_playerfile(char *argv[]);
int orig_ammt=0, after_ammt=0;
int our_pos = 0;

int get_int(int min, int max, int zero_ok)
{
  char buff[20];   /* We should never need anything over 10^20th */
  int i,isok=FALSE;
  printf("\n");
  do {
    printf(">");
    gets(buff);
    i=atoi(buff);
    if( i > max || i < min)
      printf("Hey bozo, you can't do that.\n");
    else if(i==0 && !zero_ok)
      printf("Sorry peanut-head, that was unacceptable.\n");
    else isok=TRUE;
  }while(!isok);
  return i;
}

get_string(char *s)
{
  do {
    printf(">");
    gets(s);
    if(*s=='\0') printf("There was nothing there!\n");
    else if(*s==' ')  printf("Please do not start with a blank.\n");
  }while(*s=='\0' || *s==' ');
}

main(int argc, char *argv[])
{
  char tempbuf[255];
  time_t CURRENT_TIME;
  int choice,j;
  register i;
  int number_level[9];
  
  system("clear");
  if(argc != 3) {
    printf("please use this program in the following format:");
    printf("\n<%s> <input file> <output file>\n",argv[0]);
    exit(0);
  }
  if(!strcmp(argv[1],argv[2])) {
    printf("\nPlease use a seperate files for input and output.\n");
    exit(0);
  }
  orig_ammt=load_playerfile(argv);
  CURRENT_TIME=time(0);
  for(i=0;i<orig_ammt;i++) 
	dummy[i]->AXE=FALSE;

  printf("\nStructures initialized.");
  printf("\nCurrent time: %s\n",time_print(CURRENT_TIME));
  do {
    printf("\n    What to do?");
    printf("\n0 -\t Exit");
    printf("\n1 -\t Routine deletion of low level inactive characters.");
    printf("\n2 -\t Routine demotion of inactive gods.");
    printf("\n3 -\t Delete a specific player.");
    printf("\n4 -\t Muck with a player in depth.");
    printf("\n5 -\t Find those who have a certain item number.");
    printf("\n6 -\t Zero all bank accounts.");
    printf("\n7 -\t Convert Playerfile to new structure.");
    printf("\n\nChanges are updated upon entering 0");
    printf("\nWell? > ");
    gets(tempbuf);
    choice=atoi(tempbuf);
    switch(choice) {
    case 1:
      inactive_axe(orig_ammt,CURRENT_TIME);
      break;
    case 2:
      inactive_god_axe(orig_ammt,CURRENT_TIME);
      break;
    case 3:
      printf("\nWhom do you want to delete?\n");
      get_string(tempbuf);
      specific_axe(orig_ammt,tempbuf);
      break;
    case 4:
      printf("\nWhom do you want to mess around with?\n");
      get_string(tempbuf);
      muck(orig_ammt,tempbuf);
      break;
    case 5:
      printf("\nWhat item number?\n");
      j=get_int(1,30000,FALSE);
      access_rent_files(orig_ammt,j);
      break;
    case 6:
      zero_bank();
      break;
    case 7:
      convert_playerfile(argv);
      break;
    default:
      after_ammt=spit_out_remains(argv,orig_ammt);
      choice=0;
      printf("Playerfile adjusted by %d players.\n",after_ammt-orig_ammt);
      printf("\nbye!\n");
      break;
    }
  }while(choice);
}

int change_struct( int orig_ammt)
{
}

void menu2() {
  printf("\n\n\n\t You can anything below, and more :)");
  printf("\n1\t- edit levels");
  printf("\n2\t- change the room that someone starts in.");
  printf("\n3\t- change race (ghost is 29 (no can cast)).");
  printf("\n> ");
}

void muck(int orig_ammt, char name[80]) {
  void menu2();
  register i;
  int l, count, f;
  char temp[10];
  char buffer[255];

  name[0]=toupper(name[0]);
  printf("Do you wish to search from the beginning? (Y/N) ");
  gets(buffer);
  if((buffer[0] == 'y') || (buffer[0] == 'Y'))
    f = 0;
  else
    f = our_pos;

  for(i=f;i<orig_ammt;i++) {
    if(!(strcmp(name,dummy[i]->grunt.name))) {
      our_pos = i;
      menu2();
      gets(temp);
      l=atoi(temp);
      switch(l) {
      case 1:
        printf("%s:\n", dummy[i]->grunt.name);
	printf("Levels: M:%d C:%d W:%d T:%d D:%d K:%d",
	       dummy[i]->grunt.level[0],
	       dummy[i]->grunt.level[1],dummy[i]->grunt.level[2],
	       dummy[i]->grunt.level[3],dummy[i]->grunt.level[4],
	       dummy[i]->grunt.level[5]);

        for(count = 0; count <= 5; count++) {
           printf("Current Level %d: %d\n", count, dummy[i]->grunt.level[count]);
           printf("New Level [%d]: ", dummy[i]->grunt.level[count]);
           gets(buffer);
           if(buffer[0] == '\0')
             f = dummy[i]->grunt.level[count];
           else
             f = atoi(buffer);
           dummy[i]->grunt.level[count] = f;
	}

	printf("%s\'s levels: M:%d C:%d W:%d T:%d D:%d K:%d",
	       dummy[i]->grunt.name, dummy[i]->grunt.level[0],
               dummy[i]->grunt.level[1],dummy[i]->grunt.level[2],
               dummy[i]->grunt.level[3],dummy[i]->grunt.level[4],
               dummy[i]->grunt.level[5]);
	break;
      case 2:
	printf("\n%s currently starts in room %d.",dummy[i]->grunt.load_room);
	printf("\nNew room?\n");
	dummy[i]->grunt.load_room=get_int(0,40000,TRUE);
	printf("\nStart room set to %d.",dummy[i]->grunt.load_room);
	break;
      case 3:
	printf("\nCurrent race is %d. (go look it up in race.h)",
	       dummy[i]->grunt.race);
	printf("\nNew race is?\n");
	dummy[i]->grunt.race=get_int(0,49,TRUE);
	printf("\nRace set to %d.",dummy[i]->grunt.race);
	break;
	case 4:
	 printf("\nCurrent STR is %d.",dummy[i]->grunt.abilities.str);
	 printf("\nNew STR?\n");
	 dummy[i]->grunt.abilities.str=(get_int(0,25,TRUE));
	 printf("\nSTR set to %b.",dummy[i]->grunt.abilities.str);
	 break;
      default:
	printf("\nAck, wrong choice! :P");
	break;
      }
    }
  }
}
	
      

void specific_axe(int orig_ammt, char *name) {
  register i;
  int j=FALSE;

  name[0]=toupper(name[0]);
  for(i=0;i<orig_ammt,!j;i++) {
    if(!(strcmp(name,dummy[i]->grunt.name))) {
      dummy[i]->AXE=TRUE;
      printf("%s's head found, putting it on the block.\n",
	     dummy[i]->grunt.name);
      j=TRUE;
    }
  }
  if(!j)
    printf("%s's head could not be found.",name);
}

void inactive_god_axe(int orig_ammt, time_t CURRENT_TIME) {
  register i,j,max;
  int amt=0;
  i=j=max=0;

  for(i=0;i<orig_ammt;i++) {
    if((CURRENT_TIME - dummy[i]->grunt.last_logon) > (long) (86400 * 30)) {
      for(j=0,max=0;j<6;j++) {
        if (dummy[i]->grunt.level[j] > max) {
          max = dummy[i]->grunt.level[j];
        }
      }
      if(max > 51 && max < 59) {
	printf("%s prepared for demotion.",dummy[i]->grunt.name);
	printf("  Was %d, now is",max);
	max--;
	for(j=0;j<6;j++) dummy[i]->grunt.level[j]=max;
	printf(" %d.\n",max);
        amt++;
      } else if( max == 51) {
	printf("%s will be deleted.\n", dummy[i]->grunt.name);
        dummy[i]->AXE=TRUE;
      }
    }
  }
}


void inactive_axe(int orig_ammt, time_t CURRENT_TIME) {
  register i,j,max;
  char buf [254];
  int amt=0;
  i=j=max=0;

  for(i=0;i<orig_ammt;i++) {

#if 0
    if((CURRENT_TIME - dummy[i]->grunt.last_logon) > (long) (86400 * 120)) {
#else
/* new */
    if((CURRENT_TIME - dummy[i]->grunt.last_logon) > (long) (16400 * 120)) {
#endif    
      for(j=0,max=0;j<MAX_CLASS;j++) {
	if (dummy[i]->grunt.level[j] > max) {
	  max = dummy[i]->grunt.level[j];
	}
      }
      if(max <51) {
	dummy[i]->AXE=TRUE;
	amt++;
	sprintf(buf,"rm rent/%s",dummy[i]->grunt.name);
	system(buf);
	sprintf(buf,"rm rent/%s.aux",dummy[i]->grunt.name);
	system(buf);
      }
    }
  }
  printf("\n%d players prepared for axing.",amt);
}

int spit_out_remains(char *argv[], int ammt) {
  FILE *fl;
  int i,j;

  if(!(fl = fopen(argv[2], "w"))) {
    printf("\nCan not open %s, bye!\n",argv[2]);
    exit(0);
  }
  i=j=0;
  for(;i<ammt;i++) {
    if(!(dummy[i]->AXE)) {
      fwrite(&(dummy[i]->grunt), sizeof(struct char_file_u), 1, fl);
      j++;
    }
  }
  return j;
}
  
int load_playerfile(char *argv[]) {
  int ammt=0;
  int test,tmpi;
  FILE *fl,*fl2;

  if (!(fl = fopen(argv[1], "r")))        {
    printf("\nCan not open %s, bye!\n",argv[1]);
    exit(0);
  }

#if 0
  if(!(fl2 = fopen(argv[2], "w"))) {
    printf("\nCan not open %s, bye!\n",argv[2]);
    exit(0);
  }
#endif

  dummy=(struct my_char_data **)malloc(5500 * sizeof(dummy));
  access_rent_files();
  if(dummy==NULL) {
    printf("ack\n");
  }
  for (;!feof(fl);)    {
    dummy[ammt]=(struct my_char_data *)malloc(sizeof(struct my_char_data));
    test=fread(&(dummy[ammt]->grunt),  sizeof(struct char_file_u), 1, fl); 

       printf("\n[%s] <%d> <test:%d>",dummy[ammt]->grunt.name,ammt,test); 
    if (!feof(fl)) 
      if(strcmp(dummy[ammt]->grunt.name,"111111")) {

#if 0
	/* pfile is corrupt after this record for some reason */
if (ammt == 2037) {
  printf("\n%d players read.\n",ammt);
  return ammt;
    }
#endif

	ammt++;
    
      }

  }
  printf("\n%d players read.\n",ammt);
  return ammt;
}

int convert_playerfile(char *argv[]) {
  int test,tmpi,ammt=0;
  FILE *fl2;

  if(!(fl2 = fopen(argv[2], "w"))) {
    printf("\nCan not open %s, bye!\n",argv[2]);
    exit(0);
  }

  if(dummy==NULL) {
    printf("ack\n");
  }
  
	for(ammt=0;ammt<orig_ammt;ammt++) {
	dummy[ammt]->grunt2.class = dummy[ammt]->grunt.class;                            /* NEW Class */
	dummy[ammt]->grunt2.sex = dummy[ammt]->grunt.sex;

for (tmpi=0;tmpi<= ABS_MAX_CLASS;tmpi++) {
 	dummy[ammt]->grunt2.level[tmpi] = dummy[ammt]->grunt.level[tmpi];
	}
for (tmpi=ABS_MAX_CLASS;tmpi<=NEW_ABS_MAX_CLASS;tmpi++)
    dummy[ammt]->grunt2.level[tmpi] = 0;
 	
	dummy[ammt]->grunt2.birth = dummy[ammt]->grunt.birth;
	dummy[ammt]->grunt2.played = dummy[ammt]->grunt.played;
	dummy[ammt]->grunt2.race = dummy[ammt]->grunt.race;
	dummy[ammt]->grunt2.weight = dummy[ammt]->grunt.weight;
	dummy[ammt]->grunt2.height = 	dummy[ammt]->grunt.height;

for (tmpi=0;tmpi<=strlen(dummy[ammt]->grunt.title);tmpi++)
	dummy[ammt]->grunt2.title[tmpi] = dummy[ammt]->grunt.title[tmpi];
	
for (tmpi=0;tmpi<=strlen(dummy[ammt]->grunt.extra_str);tmpi++)
	dummy[ammt]->grunt2.extra_str[tmpi] = dummy[ammt]->grunt.extra_str[tmpi];

	dummy[ammt]->grunt2.hometown = dummy[ammt]->grunt.hometown;

for (tmpi=0;tmpi<=strlen(dummy[ammt]->grunt.description);tmpi++)
	dummy[ammt]->grunt2.description[tmpi] = dummy[ammt]->grunt.description[tmpi];

for (tmpi=0;tmpi<=MAX_TOUNGE;tmpi++) {
	dummy[ammt]->grunt2.talks[tmpi] = dummy[ammt]->grunt.talks[tmpi];
	}
for (tmpi=MAX_TOUNGE;tmpi<=NEW_MAX_TOUNGE;tmpi++)
	dummy[ammt]->grunt2.talks[tmpi] = 0;

		/* removed 3/7/94, msw */
#if 0
for (tmpi=0;tmpi<=MAX_NEW_LANGUAGES;tmpi++) {
	dummy[ammt]->grunt2.new_languages[tmpi] = dummy[ammt]->grunt.new_languages[tmpi];
	}
for (tmpi=MAX_NEW_LANGUAGES;tmpi<=NEW_MAX_NEW_LANGUAGES;tmpi++)
	dummy[ammt]->grunt2.new_languages[tmpi] = 0;
#endif

	dummy[ammt]->grunt2.extra_flags = dummy[ammt]->grunt.extra_flags;
	dummy[ammt]->grunt2.load_room = dummy[ammt]->grunt.load_room;
	dummy[ammt]->grunt2.abilities = dummy[ammt]->grunt.abilities;
	dummy[ammt]->grunt2.points = dummy[ammt]->grunt.points;

for (tmpi=0;tmpi<=MAX_SKILLS;tmpi++) {
	dummy[ammt]->grunt2.skills[tmpi] = dummy[ammt]->grunt.skills[tmpi];
  }

for (tmpi = MAX_SKILLS;tmpi<=NEW_MAX_SKILLS;tmpi++) {
	 dummy[ammt]->grunt2.skills[tmpi].learned = 0;
	 dummy[ammt]->grunt2.skills[tmpi].flags   = 0;	 
 	 dummy[ammt]->grunt2.skills[tmpi].special = 0;
 	 dummy[ammt]->grunt2.skills[tmpi].nummem  = 0;
	}

for (tmpi=0;tmpi<=MAX_AFFECT;tmpi++) {
 dummy[ammt]->grunt2.affected[tmpi].type = dummy[ammt]->grunt.affected[tmpi].type;
 dummy[ammt]->grunt2.affected[tmpi].duration = dummy[ammt]->grunt.affected[tmpi].duration;
 dummy[ammt]->grunt2.affected[tmpi].modifier = dummy[ammt]->grunt.affected[tmpi].modifier;
 dummy[ammt]->grunt2.affected[tmpi].location = dummy[ammt]->grunt.affected[tmpi].location;
 dummy[ammt]->grunt2.affected[tmpi].bitvector = dummy[ammt]->grunt.affected[tmpi].bitvector;
 dummy[ammt]->grunt2.affected[tmpi].next = dummy[ammt]->grunt.affected[tmpi].next;
}

for (tmpi=MAX_AFFECT;tmpi<=NEW_MAX_AFFECT;tmpi++){
 dummy[ammt]->grunt2.affected[tmpi].type = 0;
 dummy[ammt]->grunt2.affected[tmpi].duration = 0;
 dummy[ammt]->grunt2.affected[tmpi].modifier = 0;
 dummy[ammt]->grunt2.affected[tmpi].location = 0;
 dummy[ammt]->grunt2.affected[tmpi].bitvector = 0;
 dummy[ammt]->grunt2.affected[tmpi].next = NULL;
}
	
dummy[ammt]->grunt2.spells_to_learn = dummy[ammt]->grunt.spells_to_learn;
dummy[ammt]->grunt2.alignment = dummy[ammt]->grunt.alignment;
dummy[ammt]->grunt2.affected_by = dummy[ammt]->grunt.affected_by;
dummy[ammt]->grunt2.affected_by2 = dummy[ammt]->grunt.affected_by2;
dummy[ammt]->grunt2.last_logon = dummy[ammt]->grunt.last_logon;
dummy[ammt]->grunt2.act = dummy[ammt]->grunt.act;

for (tmpi=0;tmpi<=strlen(dummy[ammt]->grunt.name);tmpi++)
   dummy[ammt]->grunt2.name[tmpi] = dummy[ammt]->grunt.name[tmpi];

for (tmpi=0;tmpi<=strlen(dummy[ammt]->grunt.alias);tmpi++)
   dummy[ammt]->grunt2.alias[tmpi] = dummy[ammt]->grunt.alias[tmpi];

for (tmpi=0;tmpi<=11;tmpi++)
   dummy[ammt]->grunt2.pwd[tmpi] = dummy[ammt]->grunt.pwd[tmpi];

 for (tmpi=0;tmpi<=MAX_SAVES;tmpi++) {
 	dummy[ammt]->grunt2.apply_saving_throw[tmpi] = dummy[ammt]->grunt2.apply_saving_throw[tmpi];
  }
for (tmpi=MAX_SAVES;tmpi<=NEW_MAX_SAVES;tmpi++)
 	dummy[ammt]->grunt2.apply_saving_throw[tmpi] = 0;
 	
 for (tmpi=0;tmpi<=MAX_CONDITIONS;tmpi++) {
 	dummy[ammt]->grunt2.conditions[tmpi] = dummy[ammt]->grunt2.conditions[tmpi];
  }
for (tmpi=MAX_CONDITIONS;tmpi<=NEW_MAX_CONDITIONS;tmpi++)
 	dummy[ammt]->grunt2.conditions[tmpi] = 0;
  
  dummy[ammt]->grunt2.startroom = dummy[ammt]->grunt.startroom;


				/* added 3/7/94 msw */
  dummy[ammt]->grunt2.user_flags = 0;
  dummy[ammt]->grunt2.speaking   = 0;
  

 fwrite(&(dummy[ammt]->grunt2), sizeof(struct char_file_u_new), 1, fl2);
}

  printf("\n%d players converted.\n",ammt);
  exit(0);
  return ammt;
}
  

char *time_print(long et)
{
  char *buff;

  buff= (char *)asctime(localtime(&et));
  *(buff + strlen(buff) -1) = '\0';
  return(buff);
}
/*
int SearchForNameFromPos(char *arg, int pos)
{
 register int i;

 if(pos > orig_amnt)
   return(-1);

 for(i = pos; i < orig_amnt; i++)
   if(!strcasecmp(dummy[i]->grunt.name, arg))
     return(i);

 return(-1);
}
*/

void access_rent_files(int number, int ITEM, char buf[40]) {
/*
  int ReadObjs(FILE *fl, struct obj_file_u *st);

  char buff2[80];
  FILE *fl;
  int i,j,tried,succeed;
  struct obj_file_u muck;

  for(i=0;i<number;i++) {
    j=tried=succeed=0;
    while(buf[j] != '\0' && j<30) {
      buf[j]=tolower(buf[j]);
      j++;
    } 
    buf[j]='\0';
    if(buf[0]=='e')
    printf("\nAtteming to open %s's rent file.",buf);
         if(strlen(buff) > sprintf) {
      (,"~/lib/rent/%s",buff); 
      if((fl=fopen(buf,"r")) != NULL ) {
	if(ReadObjs(fl,&muck)) {
	  succeed++;
	  printf("\nReading the %d objects in %s's rent file.",
		 muck.number,buff);
	  for(j=0;j<muck.number && j< 250;j++) {
	    if(muck.objects[j].item_number == (sh_int) ITEM) {
	      printf("\n%s has it!",buff);
	    } 
	  }
	} 
	
    }
  }
  printf("\nAttempted to read %d files, read %d in actuality.",i,succeed);
*/
}

int ReadObjs( FILE *fl, struct obj_file_u *st)
{
  int i;

  if (feof(fl)) {
    fclose(fl);
    return(FALSE);
    printf("\nEmpty file.");
  }
    
  fread(st->owner, sizeof(st->owner), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read file owner's name, [%s].",st->owner);
    return(FALSE);
  }
  fread(&st->gold_left, sizeof(st->gold_left), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read gold_left.");
    return(FALSE);
  }
  fread(&st->total_cost, sizeof(st->total_cost), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read total_cost.");
    return(FALSE);
  }
  fread(&st->last_update, sizeof(st->last_update), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read last update time.");
    return(FALSE);
  }
  fread(&st->minimum_stay, sizeof(st->minimum_stay), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read minimum stay.");
    return(FALSE);
  }
  fread(&st->number, sizeof(st->number), 1, fl);
  if (feof(fl)) {
    fclose(fl);
    printf("\nFailed to read the number of items stored.");
    return(FALSE);
  }
  for (i=0;i<st->number;i++) {
    fread(&st->objects[i], sizeof(struct obj_file_elem), 1, fl);
  }
}


void zero_bank()
{
  register i;

  for(i=0;i<orig_ammt;i++) {
    dummy[i]->grunt.points.bankgold = 0;
  }
  printf("All bank accounts set to 0.\n");
}