idirt-1.82d/
idirt-1.82d/bin/
idirt-1.82d/data/LOGS/
idirt-1.82d/data/POLICY/
idirt-1.82d/data/WIZ_ZONES/
idirt-1.82d/doc/
idirt-1.82d/doc/info/
idirt-1.82d/doc/manual/
idirt-1.82d/src/Ident/
idirt-1.82d/src/utils/
idirt-1.82d/utils/
/* iDiRT UAF_RAND Convertor
 * 1.80.02 -> 1.80.13 (Language Support)
 * 1995, 1996 Illusion
 * -------------------------------------------------------------------
 * This will read from the standard output and rewrite to the standard
 * output. Look at the '../bin/conv' script to see how this program is
 * ran.
 *
 * Run 'make convert' to make the module. The module is created in the
 * '../bin' directory as 'convert'. Run the 'conv' script to convert
 * the uaf_rand file. See the 'conv' script for more details.
 *
 * Please feel free to edit this convertor in anyway that it will help
 * you if you change your PERSONA structure.
 */

#include "kernel.h"
#include <time.h>
#include <errno.h>
#include "pflags.h"
#include "sflags.h"
#include "levels.h"
#include "nflags.h"
#include "eflags.h"
#include "quests.h"

int convert (FILE * from, FILE * to);

int
main (int argc, char *argv[])
{
  FILE *f;
  int errors = 0;

  if (argc == 1) {
    errors += convert (stdin, stdout);
  } else
    while (*++argv != NULL) {
      if ((f = fopen (*argv, "r")) == NULL) {
	perror ("Convert");
	++errors;
      } else {
	errors += convert (f, stdout);
	pclose (f);
      }
    }

  fprintf (stderr, "Errors: %d\n", errors);

  return errors;
}

/* The iDiRT 1.70.00 PERSONA Format
 */
typedef struct {
  char p_name[PNAME_LEN + 1];
  char p_title[TITLE_LEN + 1];
  char p_passwd[PASSWD_LEN];
  long int p_home;
  int p_score;
  int p_strength;
  int p_damage;
  int p_armor;
  SFLAGS p_sflags;
  PFLAGS p_pflags;
  PFLAGS p_mask;
  QFLAGS p_quests;
  NFLAGS p_nflags;
  int p_lang;
  int p_vlevel;
  int p_level;
  time_t p_last_on;
  int p_wimpy;
  long int p_id;
  char p_last_host[MAXHOSTNAMELEN];
  int p_magic;
  int p_channel;
  int p_killed;
  int p_died;
  char p_forget[20][PNAME_LEN + 1];
  int p_pager;
  char p_usrname[MAXHOSTNAMELEN + 20];
} OLD_PERSONA;

int
convert (FILE * from, FILE * to)
{
  PERSONA new;
  OLD_PERSONA old;

  while (fread (&old, sizeof (OLD_PERSONA), 1, from) > 0) {

#ifdef CLEAN_UAF
/* Remove players who have not been on for 2 months and score <= 2020.
 */
    time_t now = time (NULL);

    fprintf (stderr, "[Cleaning Out User File]\n");

    if (now - old.p_last_on > 5184000 && old.p_level <= 3
	&& old.p_score <= 2020) {
      fprintf (stderr, "Deleting %s.\n", old.p_name);
      continue;
    }
#endif

    if (old.p_score < 0 || (old.p_score > 200000 && old.p_level >= 12))
      old.p_score = 0;

    strcpy (new.p_name, old.p_name);
    strcpy (new.p_title, old.p_title);
    strcpy (new.p_passwd, old.p_passwd);
    strcpy (new.p_last_host, old.p_last_host);
    strcpy (new.p_usrname, old.p_usrname);

    new.p_home = old.p_home;

    new.p_score = old.p_score;
    new.p_strength = old.p_strength;
    new.p_damage = old.p_damage;
    new.p_armor = old.p_armor;
    new.p_sflags = old.p_sflags;
    new.p_pflags = old.p_pflags;
    new.p_mask = old.p_mask;
    new.p_quests = old.p_quests;
    new.p_id = old.p_id;

    new.p_vlevel = old.p_vlevel;
    new.p_level = old.p_level;
    new.p_last_on = old.p_last_on;
    new.p_magic = old.p_magic;
    new.p_channel = old.p_channel;
    new.p_wimpy = old.p_wimpy;
    new.p_killed = old.p_killed;
    new.p_died = old.p_died;
    new.p_pager = old.p_pager;
    new.p_lang = old.p_lang;
    new.p_nflags = old.p_nflags;

    /* Give people the Spell flags, and the original iDiRT spells. */
    new.p_eflags = 0;
    xsetbit (new.p_eflags, EFL_FIREBALL);
    xsetbit (new.p_eflags, EFL_MISSILE);
    xsetbit (new.p_eflags, EFL_FROST);
    xsetbit (new.p_eflags, EFL_SHOCK);

    fwrite (&new, sizeof (PERSONA), 1, to);
  }

  return ferror (from) || ferror (to);
}