though each file is unique, here is an example that I wrote to give you an
idea....
/* ************************************************************************
* file: purgeplay.c Part of CircleMUD *
* Usage: purge useless chars from playerfile *
* All Rights Reserved *
* Copyright (C) 1992, 1993 The Trustees of The Johns Hopkins University *
************************************************************************* */
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <strings.h>
#include <sys/types.h>
typedef signed char sbyte;
typedef unsigned char ubyte;
typedef signed short int sh_int;
typedef unsigned short int ush_int;
typedef char bool;
typedef char byte;
#define LEVEL_IMPL 60
#define LEVEL_CIMP 59
#define LEVEL_GRGOD 58
#define LEVEL_GOD 57
#define LEVEL_DEMIGOD 56
#define LEVEL_AVATAR 55
#define LEVEL_WBUILD 54
#define LEVEL_QUESTOR 53
#define LEVEL_AMBASADOR 52
#define LEVEL_IMMORT 51
#define PLR_KILLER (1 << 0)
#define PLR_THIEF (1 << 1)
#define PLR_FROZEN (1 << 2)
#define PLR_DONTSET (1 << 3) /* Dont EVER set (ISNPC bit) */
#define PLR_WRITING (1 << 4)
#define PLR_MAILING (1 << 5)
#define PLR_CRASH (1 << 6)
#define PLR_SITEOK (1 << 7)
#define PLR_NOSHOUT (1 << 8)
#define PLR_NOTITLE (1 << 9)
#define PLR_DELETED (1 << 10)
#define PLR_LOADROOM (1 << 11)
#define PLR_NOWIZLIST (1 << 12)
#define PLR_NODELETE (1 << 13)
#define PLR_INVSTART (1 << 14)
#define PLR_CRYO (1 << 15)
#define SECS_PER_REAL_MIN 60
#define SECS_PER_REAL_HOUR (60*SECS_PER_REAL_MIN)
#define SECS_PER_REAL_DAY (24*SECS_PER_REAL_HOUR)
#define SECS_PER_REAL_YEAR (365*SECS_PER_REAL_DAY)
#define MAX_PWD_LENGTH 10
#define HOST_LEN 30
#define MAX_SKILLS 128
#define MAX_TOUNGE 3
#define MAX_AFFECT 32
#define MAX_PWD_LENGTH_NEW 10
#define HOST_LEN_NEW 30
#define MAX_SKILLS_NEW 250
#define MAX_TOUNGE_NEW 3
#define MAX_TITLE_LEN_NEW 80
#define MAX_XDESC_LEN_NEW 240
#define MAX_NAME_LEN_SAVE_NEW 20
#define MAX_AFFECT_NEW 32
#define MAX_POOF_NEW 250
struct char_ability_data_new
{
sbyte str;
sbyte str_add;
sbyte intel;
sbyte wis;
sbyte dex;
sbyte con;
};
struct char_point_data_new
{
sh_int mana;
sh_int max_mana;
sh_int hit;
sh_int max_hit;
sh_int move;
sh_int max_move;
sh_int armor;
int gold;
int bank_gold;
int exp;
sbyte hitroll;
sbyte damroll;
};
struct char_special2_data_new
{
long idnum;
sh_int load_room;
byte spells_to_learn;
int alignment;
long act;
long pref;
int wimp_level;
byte freeze_level;
ubyte bad_pws;
sh_int apply_saving_throw[5];
sbyte conditions[3];
char poofIn[MAX_POOF_NEW];
char poofOut[MAX_POOF_NEW];
ubyte spare0;
ubyte spare1;
ubyte spare2;
ubyte spare3;
ubyte spare4;
ubyte spare5;
ubyte spare6;
ubyte spare7;
ubyte spare8;
ubyte spare9;
ubyte spare10;
ubyte spare11;
long spare12;
long spare13;
long spare14;
long spare15;
long spare16;
long spare17;
long spare18;
long spare19;
long spare20;
long spare21;
};
struct affected_type_new
{
sbyte type;
sh_int duration;
sbyte modifier;
byte location;
long bitvector;
struct affected_type_new *next;
};
struct char_file_u_new
{
byte sex;
byte class;
byte level;
time_t birth;
/* Time of birth of character */
int played;
/* Number of secs played in total */
ubyte weight;
ubyte height;
char title[MAX_TITLE_LEN_NEW];
sh_int hometown;
char description[MAX_XDESC_LEN_NEW];
bool talks[MAX_TOUNGE_NEW];
struct char_ability_data_new abilities;
struct char_point_data_new points;
byte skills[MAX_SKILLS_NEW];
struct affected_type_new affected[MAX_AFFECT_NEW];
struct char_special2_data_new specials2;
time_t last_logon;
/* Time (in secs) of last logon */
char host[HOST_LEN_NEW+1];
/* host of last logon */
/* char data */
char name[MAX_NAME_LEN_SAVE_NEW];
char pwd[MAX_PWD_LENGTH_NEW+1];
};
/********************
********************
********************
********************/
struct char_ability_data
{
sbyte str;
sbyte str_add;
sbyte intel;
sbyte wis;
sbyte dex;
sbyte con;
};
struct char_point_data
{
sh_int mana;
sh_int max_mana;
sh_int hit;
sh_int max_hit;
sh_int move;
sh_int max_move;
sh_int armor;
int gold;
int bank_gold;
int exp;
sbyte hitroll;
sbyte damroll;
};
struct char_special2_data
{
long idnum;
sh_int load_room;
byte spells_to_learn;
int alignment;
long act;
long pref;
int wimp_level;
byte freeze_level;
ubyte bad_pws;
sh_int apply_saving_throw[5];
sbyte conditions[3];
ubyte spare0;
ubyte spare1;
ubyte spare2;
ubyte spare3;
ubyte spare4;
ubyte spare5;
ubyte spare6;
ubyte spare7;
ubyte spare8;
ubyte spare9;
ubyte spare10;
ubyte spare11;
long spare12;
long spare13;
long spare14;
long spare15;
long spare16;
long spare17;
long spare18;
long spare19;
long spare20;
long spare21;
};
struct affected_type
{
sbyte type;
sh_int duration;
sbyte modifier;
byte location;
long bitvector;
struct affected_type *next;
};
struct char_file_u
{
byte sex;
byte class;
byte level;
time_t birth;
/* Time of birth of character */
int played;
/* Number of secs played in total */
ubyte weight;
ubyte height;
char title[80];
sh_int hometown;
char description[240];
bool talks[MAX_TOUNGE];
struct char_ability_data abilities;
struct char_point_data points;
byte skills[MAX_SKILLS];
struct affected_type affected[MAX_AFFECT];
struct char_special2_data specials2;
time_t last_logon;
/* Time (in secs) of last logon */
char host[HOST_LEN+1];
/* host of last logon */
/* char data */
char name[20];
char pwd[MAX_PWD_LENGTH+1];
};
void purge(char *filename)
{
FILE * fl;
FILE * outfile;
struct char_file_u player;
struct char_file_u_new player2;
int okay, num = 0;
int i;
long timeout;
char *ptr, reason[80];
struct affected_type *af;
if (!(fl = fopen(filename, "r+"))) {
printf("Can't open %s.", filename);
exit();
}
outfile = fopen("players.fixed", "w");
printf("editting: \n");
for (; ; ) {
fread(&player, sizeof(struct char_file_u ), 1, fl);
if (feof(fl)) {
fclose(fl);
fclose(outfile);
puts("Done.");
exit();
}
okay = 1;
*reason = '\0';
for (ptr = player.name; *ptr; ptr++)
if (!isalpha(*ptr) || *ptr == ' ') {
okay = 0;
strcpy(reason, "Invalid name");
}
if (player.level == 0) {
okay = 0;
strcpy(reason, "Never entered game");
}
if (player.level < 0 || player.level > LEVEL_IMPL) {
okay = 0;
strcpy(reason, "Invalid level");
}
/* now, check for timeouts. They only apply if the char is not
cryo-rented. Lev 32-34 do not time out. */
if (okay && player.level <= LEVEL_IMMORT) {
if (!(player.specials2.act & PLR_CRYO)) {
if (player.level == 1)
timeout = 15; /* Lev 1 : 4 days */
else if (player.level <= 4)
timeout = 20; /* Lev 2-4 : 7 days */
else if (player.level <= 10)
timeout = 25; /* Lev 5-10: 30 days */
else if (player.level <= LEVEL_IMMORT - 1)
timeout = 35; /* Lev 11-30: 60 days */
else if (player.level <= LEVEL_IMMORT)
timeout = 90; /* Lev 31: 90 days */
} else
timeout = 90;
timeout *= SECS_PER_REAL_DAY;
if ((time(0) - player.last_logon) > timeout) {
okay = 0;
sprintf(reason, "Level %2d idle for %3d days", player.level,
((time(0) - player.last_logon) / SECS_PER_REAL_DAY));
}
}
if (player.specials2.act & PLR_DELETED) {
okay = 0;
sprintf(reason, "Deleted flag set");
}
if (!okay && (player.specials2.act & PLR_NODELETE)) {
okay = 2;
strcat(reason, "; NOT deleted.");
}
player2.sex=player.sex;
player2.class=player.class-1;
player2.level=player.level;
player2.birth=player.birth;
player2.played=player.played;
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;
for(i=0;i<MAX_TOUNGE;i++)
player2.talks[i]=player.talks[i];
for(;i<MAX_TOUNGE_NEW;i++)
player2.talks[i]=0;
for(i=0;i<MAX_SKILLS;i++)
if(player.skills[i])
player2.skills[i]=player.skills[i];
else
player2.skills[i]=0;
for(;i<MAX_SKILLS_NEW;i++)
player2.skills[i]=0;
player2.skills[45]=0;
player2.skills[46]=0;
player2.skills[47]=0;
player2.skills[48]=0;
player2.skills[49]=0;
player2.skills[50]=player.skills[61];
player2.skills[51]=0;
player2.skills[52]=player.skills[54];
player2.skills[53]=player.skills[53];
player2.skills[54]=player.skills[55];
player2.skills[55]=player.skills[66];
player2.skills[56]=player.skills[56];
player2.skills[57]=player.skills[57];
player2.skills[58]=player.skills[58];
player2.skills[59]=player.skills[59];
player2.skills[60]=player.skills[60];
player2.skills[61]=player.skills[62];
player2.skills[62]=player.skills[63];
player2.skills[63]=player.skills[64];
player2.skills[64]=player.skills[65];
player2.skills[65]=0;
player2.skills[66]=0;
player2.skills[67]=0;
player2.skills[161]=player.skills[48];
player2.skills[162]=player.skills[51];
player2.skills[163]=player.skills[46];
player2.skills[164]=player.skills[50];
player2.skills[165]=player.skills[49];
player2.skills[166]=0;
player2.skills[167]=player.skills[52];
player2.skills[168]=player.skills[45];
player2.skills[169]=player.skills[47];
player2.skills[170]=0;
player2.skills[171]=player.skills[67];
for (af=&player.affected,i = 0; i < MAX_AFFECT; i++)
{
if (af)
{
player2.affected[i].type = player.affected[i].type;
player2.affected[i].duration=player.affected[i].duration;
player2.affected[i].modifier=player.affected[i].modifier;
player2.affected[i].location=player.affected[i].location;
player2.affected[i].bitvector=player.affected[i].bitvector;
player2.affected[i].next = 0;
af = af->next;
}
else
{
player2.affected[i].type = 0;
/* Zero signifies not used */
player2.affected[i].duration = 0;
player2.affected[i].modifier = 0;
player2.affected[i].location = 0;
player2.affected[i].bitvector = 0;
player2.affected[i].next = 0;
}
}
for(;MAX_AFFECT_NEW>i;i++)
{
player2.affected[i].type = 0;
/* Zero signifies not used */
player2.affected[i].duration = 0;
player2.affected[i].modifier = 0;
player2.affected[i].location = 0;
player2.affected[i].bitvector = 0;
player2.affected[i].next = 0;
}
strcpy(player2.host,player.host);
strcpy(player2.name,player.name);
strcpy(player2.pwd,player.pwd);
player2.abilities.str=player.abilities.str;
player2.abilities.str_add=player.abilities.str_add;
player2.abilities.dex=player.abilities.dex;
player2.abilities.wis=player.abilities.wis;
player2.abilities.intel=player.abilities.intel;
player2.abilities.con=player.abilities.con;
player2.points.mana=player.points.mana;
player2.points.max_mana=player.points.max_mana;
player2.points.hit=player.points.hit;
player2.points.max_hit=player.points.max_hit;
player2.points.move=player.points.move;
player2.points.max_move=player.points.max_move;
player2.points.armor=player.points.armor;
player2.points.gold=player.points.gold;
player2.points.bank_gold=player.points.bank_gold;
player2.points.exp=player.points.exp;
player2.points.hitroll=player.points.hitroll;
player2.points.damroll=player.points.damroll;
player2.specials2.idnum=player.specials2.idnum;
player2.specials2.load_room=player.specials2.load_room;
player2.specials2.spells_to_learn=player.specials2.spells_to_learn;
player2.specials2.alignment=player.specials2.alignment;
player2.specials2.act=player.specials2.act;
player2.specials2.pref=player.specials2.pref;
player2.specials2.wimp_level=player.specials2.wimp_level;
player2.specials2.freeze_level=player.specials2.freeze_level;
player2.specials2.bad_pws=player.specials2.bad_pws;
for (i=0;i<5;i++)
player2.specials2.apply_saving_throw[i]=player.specials2.apply_saving_throw[i];
for(i=0;i<3;i++)
player2.specials2.conditions[i]=player.specials2.conditions[i];
strcpy(player2.specials2.poofIn,"\0");
strcpy(player2.specials2.poofOut,"\0");
if (okay)
fwrite(&player2, sizeof(struct char_file_u_new ), 1, outfile);
else
printf("%4d. %-20s %s\n", ++num, player2.name, reason);
if (okay == 2)
fprintf(stderr, "%-20s %s\n", player2.name, reason);
}
}
void main(int argc, char *argv[])
{
if (argc != 2)
printf("Usage: %s playerfile-name\n", argv[0]);
else
purge(argv[1]);
}
-------------------------------------------------------------------------------
Harvard Law:
Under the most rigorously controlled conditions of pressure,
temperature, volume, humidity, and other variables, the
organism will do as it damn well pleases.
DoDGeR@wpi.wpi.edu
This archive was generated by hypermail 2b30 : 12/07/00 PST