/
roa/
roa/lib/boards/
roa/lib/config/
roa/lib/edits/
roa/lib/help/
roa/lib/misc/
roa/lib/plrobjs/
roa/lib/quests/
roa/lib/socials/
roa/lib/www/
roa/lib/www/LEDSign/
roa/lib/www/LEDSign/fonts/
roa/lib/www/LEDSign/scripts/
roa/src/s_inc/
roa/src/sclient/
roa/src/sclient/binary/
roa/src/sclient/text/
roa/src/util/
/* 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;
}