/* basic conversion utility for converting player files -jtrhone */ /* from one format to another.. not this has to be matched to the new and old player file type to work correctly... */ #include <unistd.h> #include "structures.h" #include "utils.h" // new structure does not have skill array in it 6/20/98 -jtrhone struct old_char_file_u { byte sex; byte cls; byte level; time_t birth; /* Time of birth of character */ int played; /* Number of secs played in total */ ubyte weight; ubyte height; char title[TITLE_LENGTH]; sh_int hometown; char description[240]; struct char_ability_data real_abils; struct char_point_data points; skl_info skills[256]; struct affected_type affected[MAX_AFFECT]; struct pc_saved_data saved; time_t last_logon; /* Time (in secs) of last logon */ char host[HOST_LEN+1]; /* host of last logon */ char name[NAME_LENGTH]; char pwd[MAX_PWD_LENGTH+1]; }; // generic player data filename getter 6/21/98 -jtrhone int get_pdata_filename(char *orig_name, char *ext, char *filename) { char *ptr, name[30]; if (!*orig_name) return 0; strcpy(name, orig_name); for (ptr = name; *ptr; ptr++) *ptr = tolower(*ptr); switch (tolower(*name)) { case 'a': case 'b': case 'c': case 'd': case 'e': sprintf(filename, "plrobjs/A-E/%s.%s", name, ext); break; case 'f': case 'g': case 'h': case 'i': case 'j': sprintf(filename, "plrobjs/F-J/%s.%s", name, ext); break; case 'k': case 'l': case 'm': case 'n': case 'o': sprintf(filename, "plrobjs/K-O/%s.%s", name, ext); break; case 'p': case 'q': case 'r': case 's': case 't': sprintf(filename, "plrobjs/P-T/%s.%s", name, ext); break; case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': sprintf(filename, "plrobjs/U-Z/%s.%s", name, ext); break; default: sprintf(filename, "plrobjs/ZZZ/%s.%s", name, ext); break; } return 1; } // write known skills to disk 6/20/98 -jtrhone int save_skills(skl_info *skills, char *name) { char fname[MAX_INPUT_LENGTH]; FILE *fp; int i; BOOL found = FALSE; if (!get_pdata_filename(name, "skl", fname)) return FALSE; if (!(fp = fopen(fname, "wt"))) return FALSE; for (i = 0; i < 240; i++) if (skills[i].perc || skills[i].learned) { fprintf(fp, "%d %d %d\n", i, skills[i].learned, skills[i].perc); found = TRUE; } if (!found) fprintf(fp, "1 0 0\n"); fclose(fp); return TRUE; } // write known dialects to disk 6/20/98 -jtrhone int save_dialects(skl_info *skills, char *name) { char fname[MAX_INPUT_LENGTH]; FILE *fp; int i; if (!get_pdata_filename(name, "lang", fname)) return FALSE; if (!(fp = fopen(fname, "wt"))) return FALSE; for (i = 240; i < 248; i++) fprintf(fp, "%d 1 %d\n", i-240, skills[i].perc); fclose(fp); return TRUE; } int main(int argc, char **argv) { struct char_file_u nd; struct old_char_file_u od; FILE *infp, *outfp; int n,i; // set working dir to ../lib chdir("../lib"); // first make an old copy... system("cp misc/players misc/players.old"); infp = fopen("misc/players", "rb"); outfp = fopen("misc/players.new", "wb"); if (!infp || !outfp) { fprintf(stderr, "Could not open files.\n"); exit(1); } printf("sizeof old: %d\nsizeof new: %d\n",sizeof(od),sizeof(nd)); n = 0; while (!feof(infp)) { if (fread(&od, sizeof(od), 1, infp) != 1) break; // clear out nd memset(&nd, 0, sizeof(nd)); nd.sex = od.sex; nd.cls = od.cls; nd.level = od.level; nd.birth = od.birth; nd.played = od.played; nd.weight = od.weight; nd.height = od.height; strcpy(nd.title, od.title); nd.hometown = od.hometown; strcpy(nd.description, od.description); nd.real_abils.str = od.real_abils.str; nd.real_abils.str_add = od.real_abils.str_add; nd.real_abils.intel = od.real_abils.intel; nd.real_abils.wis = od.real_abils.wis; nd.real_abils.dex = od.real_abils.dex; nd.real_abils.con = od.real_abils.con; nd.real_abils.cha = od.real_abils.cha; nd.points.mana = od.points.mana; nd.points.max_mana = od.points.max_mana; /* Max move for PC/NPC */ nd.points.hit = od.points.hit; nd.points.max_hit = od.points.max_hit; /* Max hit for PC/NPC */ nd.points.move = od.points.move; nd.points.max_move = od.points.max_move; /* Max move for PC/NPC */ nd.points.armor = od.points.armor; /* Internal -100..100, external -10..10 AC */ nd.points.gold = od.points.gold; /* Money carried */ nd.points.bank_gold = od.points.bank_gold; /* Gold the char has in a bank account */ nd.points.exp = od.points.exp; /* The experience of the player */ nd.points.hitroll = od.points.hitroll; /* Any bonus or penalty to the hit roll */ nd.points.damroll = od.points.damroll; /* Any bonus or penalty to the damage roll */ nd.saved.idnum = od.saved.idnum; nd.saved.load_room = od.saved.load_room; nd.saved.spells_to_learn = od.saved.spells_to_learn; nd.saved.alignment = od.saved.alignment; nd.saved.player_flags = od.saved.player_flags; nd.saved.pref_flags = od.saved.pref_flags; nd.saved.wimp_level = od.saved.wimp_level; nd.saved.freeze_level = od.saved.freeze_level; nd.saved.bad_pws = od.saved.bad_pws; for (i=0; i< 5; i++) nd.saved.saving_throws[i] = od.saved.saving_throws[i]; /* Saving throw (Bonuses) */ for (i=0; i< 3; i++) nd.saved.conditions[i] = od.saved.conditions[i]; nd.saved.race = od.saved.race; nd.saved.olc_min_zone = od.saved.olc_min_zone; nd.saved.olc_max_zone = od.saved.olc_max_zone; nd.saved.vtsplit = od.saved.vtsplit; nd.saved.psize = od.saved.psize; nd.saved.crow = od.saved.crow; nd.saved.ccol = od.saved.ccol; nd.saved.page_length = od.saved.page_length; nd.saved.rites = od.saved.rites; nd.saved.zone_locked = od.saved.zone_locked; nd.saved.changed_password = od.saved.changed_password; nd.saved.in_clan = od.saved.in_clan; /* treated as a BOOLean */ nd.saved.clanleader = od.saved.clanleader; /* " " " " */ nd.saved.clan_num = od.saved.clan_num; /* id num of the clan */ nd.saved.arena_wins = od.saved.arena_wins; nd.saved.spare13 = od.saved.spare13; nd.saved.spare14 = od.saved.spare14; nd.saved.snooptell = od.saved.snooptell; /* for implementors */ nd.saved.vt100 = od.saved.vt100; nd.saved.warlock_level = od.saved.warlock_level; nd.saved.bars = od.saved.bars; nd.saved.grants = od.saved.grants; nd.saved.quest_pts = od.saved.quest_pts; nd.saved.pref2_flags = od.saved.pref2_flags; nd.saved.plr2_flags = od.saved.plr2_flags; strcpy(nd.saved.poofIn, od.saved.poofIn); strcpy(nd.saved.poofOut, od.saved.poofOut); strcpy(nd.saved.walkIn, od.saved.walkIn); strcpy(nd.saved.walkOut, od.saved.walkOut); strcpy(nd.saved.clan, od.saved.clan); strcpy(nd.saved.prename, od.saved.prename); strcpy(nd.saved.saved_prompt, od.saved.saved_prompt); nd.last_logon = od.last_logon; strcpy(nd.host, od.host); strcpy(nd.name, od.name); strcpy(nd.pwd, od.pwd); // ******************************************************************** // MAIN CONVERSION / MODIFICATION INSERTED BELOW HERE // convert the skill array save_skills(od.skills, od.name); save_dialects(od.skills, od.name); // MAIN CONVERSION / MODIFICATION INSERTED ABOVE HERE // ******************************************************************** fwrite(&nd, sizeof(nd), 1, outfp); n++; } fclose(infp); fclose(outfp); printf("%d players converted\n", n); return 1; }