mirror of
https://github.com/tbamud/tbamud.git
synced 2026-01-22 08:56:09 +01:00
Fixed top_of_helpt bug being off by one. (thanks Jamdog) Fixed trigedit copy bug where it used real_room and not real_trigger. (thanks Jamdog) [Dec 21 2007] - Rumble Fixed dg_affect crash caused by a typo on my part. Renamed shit again! No really in zmalloc.c unsigned char * shit. [Dec 15 2007] - Rumble Showvnums shows [T#] for a single attached trig or [TRIGS] for multiple attached trigs (except for rooms since there is plenty of room to list all attached trigs). Fixed bug where showvnums would not show if attached. (thanks Sryth)
396 lines
13 KiB
C
Executable file
396 lines
13 KiB
C
Executable file
/* ************************************************************************
|
|
* file: plrtoascii.c Part of CircleMud *
|
|
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
|
|
* All Rights Reserved *
|
|
************************************************************************* */
|
|
|
|
#include "../conf.h"
|
|
#include "../sysdep.h"
|
|
|
|
#include "../structs.h"
|
|
#include "../utils.h"
|
|
#include "../db.h"
|
|
#include "../pfdefaults.h"
|
|
|
|
|
|
// first some stock circle 3.0 defines. Change where appropriate.
|
|
#define MAX_NAME_LENGTH 20 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
|
|
#define MAX_PWD_LENGTH 30 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
#define MAX_TITLE_LENGTH 80 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
#define HOST_LENGTH 40 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
#define MAX_TONGUE 3 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
#define MAX_SKILLS 200 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
#define MAX_AFFECT 32 /* Used in char_file_u *DO*NOT*CHANGE* */
|
|
|
|
/* Char's abilities. Used in char_file_u *DO*NOT*CHANGE* */
|
|
struct char_ability_data_plrtoascii {
|
|
sbyte str;
|
|
sbyte str_add; /* 000 - 100 if strength 18 */
|
|
sbyte intel;
|
|
sbyte wis;
|
|
sbyte dex;
|
|
sbyte con;
|
|
sbyte cha;
|
|
};
|
|
|
|
|
|
/* Char's points. Used in char_file_u *DO*NOT*CHANGE* */
|
|
struct char_point_data_plrtoascii {
|
|
sh_int mana;
|
|
sh_int max_mana; /* Max mana for PC/NPC */
|
|
sh_int hit;
|
|
sh_int max_hit; /* Max hit for PC/NPC */
|
|
sh_int move;
|
|
sh_int max_move; /* Max move for PC/NPC */
|
|
|
|
sh_int armor; /* Internal -100..100, external -10..10 AC */
|
|
int gold; /* Money carried */
|
|
int bank_gold; /* Gold the char has in a bank account */
|
|
int exp; /* The experience of the player */
|
|
|
|
sbyte hitroll; /* Any bonus or penalty to the hit roll */
|
|
sbyte damroll; /* Any bonus or penalty to the damage roll */
|
|
};
|
|
|
|
|
|
/*
|
|
* char_special_data_saved: specials which both a PC and an NPC have in
|
|
* common, but which must be saved to the playerfile for PC's.
|
|
*
|
|
* WARNING: Do not change this structure. Doing so will ruin the
|
|
* playerfile. If you want to add to the playerfile, use the spares
|
|
* in player_special_data.
|
|
*/
|
|
struct char_special_data_saved_plrtoascii {
|
|
int alignment; /* +-1000 for alignments */
|
|
long idnum; /* player's idnum; -1 for mobiles */
|
|
long /*bitvector_t*/ act; /* act flag for NPC's; player flag for PC's */
|
|
|
|
long /*bitvector_t*/ affected_by;
|
|
/* Bitvector for spells/skills affected by */
|
|
sh_int apply_saving_throw[5]; /* Saving throw (Bonuses) */
|
|
};
|
|
|
|
struct player_special_data_saved_plrtoascii {
|
|
byte skills[MAX_SKILLS+1]; /* array of skills plus skill 0 */
|
|
byte PADDING0; /* used to be spells_to_learn */
|
|
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_vnum load_room; /* Which room to place char in */
|
|
long /*bitvector_t*/ pref; /* preference flags for PC's. */
|
|
ubyte bad_pws; /* number of bad password attemps */
|
|
sbyte conditions[3]; /* Drunk, full, thirsty */
|
|
|
|
/* spares below for future expansion. You can change the names from
|
|
'sparen' to something meaningful, but don't change the order. */
|
|
|
|
ubyte spare0;
|
|
ubyte spare1;
|
|
ubyte spare2;
|
|
ubyte spare3;
|
|
ubyte spare4;
|
|
ubyte page_length;
|
|
int spells_to_learn; /* How many can you learn yet this level*/
|
|
int olc_zone;
|
|
int spare8;
|
|
int spare9;
|
|
int spare10;
|
|
int spare11;
|
|
int spare12;
|
|
int spare13;
|
|
int spare14;
|
|
int spare15;
|
|
int spare16;
|
|
long spare17;
|
|
long spare18;
|
|
long spare19;
|
|
long spare20;
|
|
long spare21;
|
|
};
|
|
|
|
struct affected_type_plrtoascii {
|
|
sh_int type; /* The type of spell that caused this */
|
|
sh_int duration; /* For how long its effects will last */
|
|
sbyte modifier; /* This is added to apropriate ability */
|
|
byte location; /* Tells which ability to change(APPLY_XXX)*/
|
|
long /*bitvector_t*/ bitvector; /* Tells which bits to set (AFF_XXX) */
|
|
|
|
struct affected_type_plrtoascii *next;
|
|
};
|
|
|
|
/* ==================== File Structure for Player ======================= */
|
|
/* BEWARE: Changing it will ruin the playerfile */
|
|
struct char_file_u_plrtoascii {
|
|
/* char_player_data */
|
|
char name[MAX_NAME_LENGTH+1];
|
|
char description[PLR_DESC_LENGTH];
|
|
char title[MAX_TITLE_LENGTH+1];
|
|
byte sex;
|
|
byte chclass;
|
|
byte level;
|
|
sh_int hometown;
|
|
time_t birth; /* Time of birth of character */
|
|
int played; /* Number of secs played in total */
|
|
ubyte weight;
|
|
ubyte height;
|
|
|
|
char pwd[MAX_PWD_LENGTH+1]; /* character's password */
|
|
|
|
struct char_special_data_saved_plrtoascii char_specials_saved;
|
|
struct player_special_data_saved_plrtoascii player_specials_saved;
|
|
struct char_ability_data_plrtoascii abilities;
|
|
struct char_point_data_plrtoascii points;
|
|
struct affected_type_plrtoascii affected[MAX_AFFECT];
|
|
|
|
time_t last_logon; /* Time (in secs) of last logon */
|
|
char host[HOST_LENGTH+1]; /* host of last logon */
|
|
};
|
|
/* ====================================================================== */
|
|
|
|
int sprintascii(char *out, bitvector_t bits);
|
|
int plr_filename(char *orig_name, char *filename);
|
|
|
|
void convert(char *filename)
|
|
{
|
|
FILE *fl, *outfile, *index_file;
|
|
struct char_file_u_plrtoascii player;
|
|
char index_name[40], outname[40], bits[127];
|
|
int i;
|
|
struct char_special_data_saved_plrtoascii *csds;
|
|
struct player_special_data_saved_plrtoascii *psds;
|
|
struct char_ability_data_plrtoascii *cad;
|
|
struct char_point_data_plrtoascii *cpd;
|
|
struct affected_type_plrtoascii *aff;
|
|
|
|
if (!(fl = fopen(filename, "r+"))) {
|
|
perror("error opening playerfile");
|
|
exit(1);
|
|
}
|
|
sprintf(index_name, "%s%s", LIB_PLRFILES, INDEX_FILE);
|
|
if (!(index_file = fopen(index_name, "w"))) {
|
|
perror("error opening index file");
|
|
exit(1);
|
|
}
|
|
for (;;) {
|
|
fread(&player, sizeof(struct char_file_u_plrtoascii), 1, fl);
|
|
if (feof(fl)) {
|
|
fclose(fl);
|
|
fclose(index_file);
|
|
exit(1);
|
|
}
|
|
|
|
if (!plr_filename(player.name, outname))
|
|
exit(1);
|
|
printf("writing: %s\n", outname);
|
|
|
|
fprintf(index_file, "%ld %s %d 0 %ld\n",
|
|
player.char_specials_saved.idnum, bits, player.level,
|
|
player.last_logon);
|
|
|
|
if (!(outfile = fopen(outname, "w"))) {
|
|
printf("error opening output file");
|
|
exit(1);
|
|
}
|
|
|
|
/* char_file_u */
|
|
if (player.name)
|
|
fprintf(outfile, "Name: %s\n", player.name);
|
|
if (player.pwd)
|
|
fprintf(outfile, "Pass: %s\n", player.pwd);
|
|
if (player.title)
|
|
fprintf(outfile, "Titl: %s\n", player.title);
|
|
if (player.description && *player.description)
|
|
fprintf(outfile, "Desc:\n%s~\n", player.description);
|
|
if (player.sex != PFDEF_SEX)
|
|
fprintf(outfile, "Sex : %d\n", (int)player.sex);
|
|
if (player.chclass != PFDEF_CLASS)
|
|
fprintf(outfile, "Clas: %d\n", (int)player.chclass);
|
|
if (player.level != PFDEF_LEVEL)
|
|
fprintf(outfile, "Levl: %d\n", (int)player.level);
|
|
fprintf(outfile, "Brth: %d\n", (int)player.birth);
|
|
fprintf(outfile, "Plyd: %d\n", (int)player.played);
|
|
fprintf(outfile, "Last: %d\n", (int)player.last_logon);
|
|
fprintf(outfile, "Host: %s\n", player.host);
|
|
if (player.height != PFDEF_HEIGHT)
|
|
fprintf(outfile, "Hite: %d\n", (int)player.height);
|
|
if (player.weight != PFDEF_WEIGHT)
|
|
fprintf(outfile, "Wate: %d\n", (int)player.weight);
|
|
|
|
/* char_special_data_saved */
|
|
csds = &(player.char_specials_saved);
|
|
if (csds->alignment != PFDEF_ALIGNMENT)
|
|
fprintf(outfile, "Alin: %d\n", csds->alignment);
|
|
fprintf(outfile, "Id : %d\n", (int)csds->idnum);
|
|
if (csds->act != PFDEF_PLRFLAGS)
|
|
fprintf(outfile, "Act : %d\n", (int)csds->act);
|
|
if (csds->affected_by != PFDEF_AFFFLAGS) {
|
|
sprintascii(bits, csds->affected_by);
|
|
fprintf(outfile, "Aff : %s\n", bits);
|
|
}
|
|
if (csds->apply_saving_throw[0] != PFDEF_SAVETHROW)
|
|
fprintf(outfile, "Thr1: %d\n", csds->apply_saving_throw[0]);
|
|
if (csds->apply_saving_throw[1] != PFDEF_SAVETHROW)
|
|
fprintf(outfile, "Thr2: %d\n", csds->apply_saving_throw[1]);
|
|
if (csds->apply_saving_throw[2] != PFDEF_SAVETHROW)
|
|
fprintf(outfile, "Thr3: %d\n", csds->apply_saving_throw[2]);
|
|
if (csds->apply_saving_throw[3] != PFDEF_SAVETHROW)
|
|
fprintf(outfile, "Thr4: %d\n", csds->apply_saving_throw[3]);
|
|
if (csds->apply_saving_throw[4] != PFDEF_SAVETHROW)
|
|
fprintf(outfile, "Thr5: %d\n", csds->apply_saving_throw[4]);
|
|
|
|
/* player_special_data_saved */
|
|
psds = &(player.player_specials_saved);
|
|
if (player.level < LVL_IMMORT) {
|
|
fprintf(outfile, "Skil:\n");
|
|
for (i = 1; i <= MAX_SKILLS; i++) {
|
|
if (psds->skills[i])
|
|
fprintf(outfile, "%d %d\n", i, (int)psds->skills[i]);
|
|
}
|
|
fprintf(outfile, "0 0\n");
|
|
}
|
|
if (psds->wimp_level != PFDEF_WIMPLEV)
|
|
fprintf(outfile, "Wimp: %d\n", psds->wimp_level);
|
|
if (psds->freeze_level != PFDEF_FREEZELEV)
|
|
fprintf(outfile, "Frez: %d\n", (int)psds->freeze_level);
|
|
if (psds->invis_level != PFDEF_INVISLEV)
|
|
fprintf(outfile, "Invs: %d\n", (int)psds->invis_level);
|
|
if (psds->load_room != PFDEF_LOADROOM)
|
|
fprintf(outfile, "Room: %d\n", (int)psds->load_room);
|
|
if (psds->pref != PFDEF_PREFFLAGS) {
|
|
sprintascii(bits, psds->pref);
|
|
fprintf(outfile, "Pref: %s\n", bits);
|
|
}
|
|
if (psds->conditions[HUNGER] && player.level < LVL_IMMORT &&
|
|
psds->conditions[HUNGER] != PFDEF_HUNGER)
|
|
fprintf(outfile, "Hung: %d\n", (int)psds->conditions[0]);
|
|
if (psds->conditions[THIRST] && player.level < LVL_IMMORT &&
|
|
psds->conditions[THIRST] != PFDEF_THIRST)
|
|
fprintf(outfile, "Thir: %d\n", (int)psds->conditions[1]);
|
|
if (psds->conditions[2] && player.level < LVL_IMMORT &&
|
|
psds->conditions[DRUNK] != PFDEF_DRUNK)
|
|
fprintf(outfile, "Drnk: %d\n", (int)psds->conditions[2]);
|
|
if (psds->spells_to_learn != PFDEF_PRACTICES)
|
|
fprintf(outfile, "Lern: %d\n", (int)psds->spells_to_learn);
|
|
|
|
/* char_ability_data */
|
|
cad = &(player.abilities);
|
|
if (cad->str != PFDEF_STR || cad->str_add != PFDEF_STRADD)
|
|
fprintf(outfile, "Str : %d/%d\n", cad->str, cad->str_add);
|
|
if (cad->intel != PFDEF_INT)
|
|
fprintf(outfile, "Int : %d\n", cad->intel);
|
|
if (cad->wis != PFDEF_WIS)
|
|
fprintf(outfile, "Wis : %d\n", cad->wis);
|
|
if (cad->dex != PFDEF_DEX)
|
|
fprintf(outfile, "Dex : %d\n", cad->dex);
|
|
if (cad->con != PFDEF_CON)
|
|
fprintf(outfile, "Con : %d\n", cad->con);
|
|
if (cad->cha != PFDEF_CHA)
|
|
fprintf(outfile, "Cha : %d\n", cad->cha);
|
|
|
|
/* char_point_data */
|
|
cpd = &(player.points);
|
|
if (cpd->hit != PFDEF_HIT || cpd->max_hit != PFDEF_MAXHIT)
|
|
fprintf(outfile, "Hit : %d/%d\n", cpd->hit, cpd->max_hit);
|
|
if (cpd->mana != PFDEF_MANA || cpd->max_mana != PFDEF_MAXMANA)
|
|
fprintf(outfile, "Mana: %d/%d\n", cpd->mana, cpd->max_mana);
|
|
if (cpd->move != PFDEF_MOVE || cpd->max_move != PFDEF_MAXMOVE)
|
|
fprintf(outfile, "Move: %d/%d\n", cpd->move, cpd->max_move);
|
|
if (cpd->armor != PFDEF_AC)
|
|
fprintf(outfile, "Ac : %d\n", cpd->armor);
|
|
if (cpd->gold != PFDEF_GOLD)
|
|
fprintf(outfile, "Gold: %d\n", cpd->gold);
|
|
if (cpd->bank_gold != PFDEF_BANK)
|
|
fprintf(outfile, "Bank: %d\n", cpd->bank_gold);
|
|
if (cpd->exp != PFDEF_EXP)
|
|
fprintf(outfile, "Exp : %d\n", cpd->exp);
|
|
if (cpd->hitroll != PFDEF_HITROLL)
|
|
fprintf(outfile, "Hrol: %d\n", cpd->hitroll);
|
|
if (cpd->damroll != PFDEF_DAMROLL)
|
|
fprintf(outfile, "Drol: %d\n", cpd->damroll);
|
|
|
|
/* affected_type */
|
|
fprintf(outfile, "Affs:\n");
|
|
for (i = 0; i < MAX_AFFECT; i++) {
|
|
aff = &(player.affected[i]);
|
|
if (aff->type)
|
|
fprintf(outfile, "%d %d %d %d %d\n", aff->type, aff->duration,
|
|
aff->modifier, aff->location, (int)aff->bitvector);
|
|
}
|
|
fprintf(outfile, "0 0 0 0 0\n");
|
|
|
|
fclose(outfile);
|
|
}
|
|
}
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
if (argc != 2)
|
|
printf("Usage: %s playerfile-name\n", argv[0]);
|
|
else
|
|
convert(argv[1]);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int sprintascii(char *out, bitvector_t bits)
|
|
{
|
|
int i, j = 0;
|
|
/* 32 bits, don't just add letters to try to get more unless your bitvector_t is also as large. */
|
|
char *flags = "abcdefghijklmnopqrstuvwxyzABCDEF";
|
|
|
|
for (i = 0; flags[i] != '\0'; i++)
|
|
if (bits & (1 << i))
|
|
out[j++] = flags[i];
|
|
|
|
if (j == 0) /* Didn't write anything. */
|
|
out[j++] = '0';
|
|
|
|
/* NUL terminate the output string. */
|
|
out[j++] = '\0';
|
|
return j;
|
|
}
|
|
|
|
|
|
int plr_filename(char *orig_name, char *filename)
|
|
{
|
|
const char *middle;
|
|
char name[64], *ptr;
|
|
|
|
if (orig_name == NULL || *orig_name == '\0' || filename == NULL) {
|
|
perror("error getting player file name");
|
|
return (0);
|
|
}
|
|
|
|
strcpy(name, orig_name);
|
|
for (ptr = name; *ptr; ptr++)
|
|
*ptr = LOWER(*ptr);
|
|
|
|
switch (LOWER(*name)) {
|
|
case 'a': case 'b': case 'c': case 'd': case 'e':
|
|
middle = "A-E";
|
|
break;
|
|
case 'f': case 'g': case 'h': case 'i': case 'j':
|
|
middle = "F-J";
|
|
break;
|
|
case 'k': case 'l': case 'm': case 'n': case 'o':
|
|
middle = "K-O";
|
|
break;
|
|
case 'p': case 'q': case 'r': case 's': case 't':
|
|
middle = "P-T";
|
|
break;
|
|
case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
|
|
middle = "U-Z";
|
|
break;
|
|
default:
|
|
middle = "ZZZ";
|
|
break;
|
|
}
|
|
|
|
sprintf(filename, "%s%s"SLASH"%s.%s", LIB_PLRFILES, middle, name, SUF_PLR);
|
|
return (1);
|
|
}
|