Re: Circle: The CircleMUD player file format

From: Belgian Underground Mud (bug@asteriks.rug.ac.be)
Date: 04/24/95


[etc]
>       player2.weight=player.weight;
>       player2.height=player.height;
>       strcpy(player2.title,player.title);
>       player2.hometown=player.hometown;
>       strcpy(player2.description,player.description);
>       player2.last_logon=player.last_logon;
[etc]

I like mine better:

/* ************************************************************************
*  file: plrconv.c                                      Part of CircleMUD *
*  Usage: Convert the player file                 By Gekke Eekhoorn, 4/95 *
*  All Rights Reserved                                                    *
*  Copyright (C) 1992, 1993 The Trustees of The Johns Hopkins University  *
************************************************************************* */

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "../structs.h"


/* Insert your new structs here */

struct player_special_data_saved2 {
   byte skills[MAX_SKILLS+1];   /* array of skills plus skill 0         */
   byte spells_to_learn;        /* How many can you learn yet this level*/
   bool talks[MAX_TONGUE];      /* PC s Tongues 0 for NPC               */
   int  wimp_level;             /* Below this # of hit points, flee!    */
   byte freeze_level;           /* Level of god who froze char, if any  */
   sh_int invis_level;          /* level of invisibility                */
   room_num load_room;          /* Which room to place char in          */
   long pref;                   /* preference flags for PC's.           */
   ubyte bad_pws;               /* number of bad password attemps       */
   sbyte conditions[3];         /* Drunk, full, thirsty                 */
};

struct t1 {
   char name[MAX_NAME_LENGTH+1];
   char description[EXDSCR_LENGTH];
   char title[MAX_TITLE_LENGTH+1];
   byte sex;
   byte class;
};

struct t2 {
   byte level;
   sh_int hometown;
   time_t birth;   /* Time of birth of character     */
   int  played;    /* Number of secs played in total */
};

struct t3 {
   /* password */
   char pwd[MAX_PWD_LENGTH+1];

   struct char_special_data_saved char_specials_saved;
};

struct t4 {
   struct char_ability_data abilities;
   struct char_point_data points;
   struct affected_type affected[MAX_AFFECT];

   time_t last_logon;           /* Time (in secs) of last logon */
   char host[HOST_LENGTH+1];    /* host of last logon */
};

struct char_file_u2 {
   /* char_player_data */
   struct t1 tmp1;

   byte race;

   struct t2 tmp2;

   sh_int weight;
   sh_int height;

   struct t3 tmp3;

   struct player_special_data_saved2 player_specials_saved;

   struct t4 tmp4;
};



void convert(char *filename)
{
   FILE * fl;
   FILE * outfile;
   struct char_file_u oldpl;
   struct char_file_u2 newpl;

   if (!(fl = fopen(filename, "r+"))) {
      printf("Can't open %s.", filename);
      exit();
   }

   outfile = fopen("players.new", "w");
   printf("Converting.\n");

   for (; ; ) {
      fread(&oldpl, sizeof(struct char_file_u), 1, fl);
      if (feof(fl)) {
         fclose(fl);
         fclose(outfile);
         puts("Done.");
         exit();
      }

      /* Here, the conversion takes place. */
      /* The memcpys are for not having to type the lot :] */
      memcpy(&newpl.tmp1, oldpl.name, sizeof(struct t1));
      memcpy(&newpl.tmp2, &oldpl.level, sizeof(struct t2));
      memcpy(&newpl.tmp3, oldpl.pwd, sizeof(struct t3));
      memcpy(&newpl.tmp4, &oldpl.abilities, sizeof(struct t4));

      /* Move race to char_data */
      newpl.race=oldpl.player_specials_saved.race;

      /* Convert them to sh_int */
      newpl.weight=oldpl.weight;
      newpl.height=oldpl.height;

      /* Here, I cut all the unnecessary junk away */
      memcpy(&newpl.player_specials_saved,
        &oldpl.player_specials_saved,
        sizeof(struct player_special_data_saved));

      /* And here we write it */
      fwrite(&newpl, sizeof(struct char_file_u2 ), 1, outfile);
   }
}



void main(int argc, char *argv[])
{
   if (argc != 2)
      printf("Usage: %s playerfile-name\n", argv[0]);
   else
      convert(argv[1]);
}

----------------------------

Never /really/  tested it tho... Wrote it this Easter... Take a good look at 
the struct copying code :)



This archive was generated by hypermail 2b30 : 12/07/00 PST