#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"); }