/* 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;
}