/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1995 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@pacinfo.com) *
* Gabrielle Taylor (gtaylor@pacinfo.com) *
* Brian Moore (rom@rom.efn.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
/***************************************************************************
* ROT 1.4 is copyright 1996-1997 by Russ Walsh *
* By using this code, you have agreed to follow the terms of the *
* ROT license, in the file doc/rot.license *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
#include "merc.h"
#include "lookup.h"
#include "tables.h"
#if !defined(macintosh)
extern int _filbuf args( (FILE *) );
#endif
void save_area args( ( FILE *fp ) );
void save_helps args( ( FILE *fp ) );
void save_mobiles args( ( FILE *fp ) );
void save_objects args( ( FILE *fp ) );
void save_resets args( ( FILE *fp ) );
void save_rooms args( ( FILE *fp ) );
void save_shops args( ( FILE *fp ) );
void save_socials args( ( FILE *fp ) );
void save_specials args( ( FILE *fp ) );
void save_dreams args( ( FILE *fp ) );
int newvnum;
int newmin;
int newmax;
bool changevnum;
extern int first_room;
extern int first_object;
extern int first_mobile;
extern int last_room;
extern int last_object;
extern int last_mobile;
extern MOB_INDEX_DATA * mob_index;
extern OBJ_INDEX_DATA * obj_index;
extern ROOM_INDEX_DATA * room_index;
extern DRM_INDEX_DATA * drm_index;
/*
* Converts an integer into letter-based flags.
*/
char *print_flags(int flag)
{
int count, pos = 0;
static char buf[52];
for (count = 0; count < 32; count++)
{
if (IS_SET(flag,1<<count))
{
if (count < 26)
buf[pos] = 'A' + count;
else
buf[pos] = 'a' + (count - 26);
pos++;
}
}
if (pos == 0)
{
buf[pos] = '0';
pos++;
}
buf[pos] = '\0';
return buf;
}
/*
* Compares flag aint to flag bint and returns flags
* in bint, but not in aint.
*/
char *cmp_flags(int aint, int bint)
{
int count, pos = 0;
static char buf[52];
for (count = 0; count < 32; count++)
{
if (IS_SET(bint,1<<count)
&& !IS_SET(aint,1<<count))
{
if (count < 26)
buf[pos] = 'A' + count;
else
buf[pos] = 'a' + (count - 26);
pos++;
}
}
if (pos == 0)
{
buf[pos] = '0';
pos++;
}
buf[pos] = '\0';
return buf;
}
void print_debug( int pos, const char *string )
{
int i;
if (!debug)
return;
for (i = 0; i < pos; i++)
{
printf("\t");
}
printf("%s\n", string);
return;
}
void save_area( FILE *fp )
{
printf("Saving AREA.\n");
fprintf( fp, "#AREA\n" );
fprintf( fp, "ROT v1.5 format~\n" );
fprintf( fp, "%s~\n", area_first->file_name );
fprintf( fp, "%s~\n", area_first->name );
fprintf( fp, "%s~\n", area_first->credits );
fprintf( fp, "%d %d\n", newmin, newmax );
return;
}
void save_helps( FILE *fp )
{
HELP_DATA *pHelp;
if ( help_first == NULL )
return;
printf("Saving HELPS.\n");
fprintf( fp, "\n#HELPS\n" );
for (pHelp = help_first; pHelp != NULL; pHelp = pHelp->next)
{
fprintf( fp, "%d ", pHelp->level );
fprintf( fp, "%s~\n", pHelp->keyword );
fprintf( fp, "%s~\n", pHelp->text );
}
fprintf( fp, "0 $~\n" );
return;
}
void save_mobiles( FILE *fp )
{
MOB_INDEX_DATA *pMobIndex;
int vnum;
printf("Saving MOBILES.\n");
fprintf( fp, "\n#MOBILES\n" );
for (vnum = first_mobile; vnum <= last_mobile; vnum++ )
{
if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
sh_int race;
sprintf(buf,"%d",pMobIndex->vnum);
print_debug(1,buf);
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
if (changevnum)
fprintf( fp, "#%d\n", pMobIndex->vnum + newvnum );
else
fprintf( fp, "#%d\n", pMobIndex->vnum );
print_debug(2,"Saving player_name");
str_replace(pMobIndex->player_name, buf, buf2);
fprintf( fp, "%s~\n", pMobIndex->player_name );
print_debug(2,"Saving short_descr");
str_replace(pMobIndex->short_descr, buf, buf2);
fprintf( fp, "%s~\n", pMobIndex->short_descr );
print_debug(2,"Saving long_descr");
str_replace(pMobIndex->long_descr, buf, buf2);
fprintf( fp, "%s~\n", pMobIndex->long_descr );
print_debug(2,"Saving description");
str_replace(pMobIndex->description, buf, buf2);
fprintf( fp, "%s~\n", pMobIndex->description );
print_debug(2,"Saving race");
fprintf( fp, "%s~\n", race_table[pMobIndex->race].name );
race = pMobIndex->race;
print_debug(2,"Saving act flags");
fprintf( fp, "%s ", print_flags(pMobIndex->act) );
print_debug(2,"Saving affect flags");
fprintf( fp, "%s ", print_flags(pMobIndex->affected_by) );
print_debug(2,"Saving shield flags");
fprintf( fp, "%s ", print_flags(pMobIndex->shielded_by) );
print_debug(2,"Saving alignment");
fprintf( fp, "%d ", pMobIndex->alignment );
print_debug(2,"Saving group");
fprintf( fp, "%d\n", pMobIndex->group );
print_debug(2,"Saving level");
fprintf( fp, "%d ", pMobIndex->level );
print_debug(2,"Saving hitroll");
fprintf( fp, "%d ", pMobIndex->hitroll );
print_debug(2,"Saving HP");
fprintf( fp, "%d", pMobIndex->hit[DICE_NUMBER] );
fprintf( fp, "d" );
fprintf( fp, "%d", pMobIndex->hit[DICE_TYPE] );
fprintf( fp, "+" );
fprintf( fp, "%d ", pMobIndex->hit[DICE_BONUS] );
print_debug(2,"Saving mana");
fprintf( fp, "%d", pMobIndex->mana[DICE_NUMBER] );
fprintf( fp, "d" );
fprintf( fp, "%d", pMobIndex->mana[DICE_TYPE] );
fprintf( fp, "+" );
fprintf( fp, "%d ", pMobIndex->mana[DICE_BONUS] );
print_debug(2,"Saving damage");
fprintf( fp, "%d", pMobIndex->damage[DICE_NUMBER] );
fprintf( fp, "d" );
fprintf( fp, "%d", pMobIndex->damage[DICE_TYPE] );
fprintf( fp, "+" );
fprintf( fp, "%d ", pMobIndex->damage[DICE_BONUS] );
print_debug(2,"Saving damage type");
fprintf( fp, "%s\n", attack_table[pMobIndex->dam_type].name );
print_debug(2,"Saving AC");
fprintf( fp, "%d ", pMobIndex->ac[AC_PIERCE]/10 );
fprintf( fp, "%d ", pMobIndex->ac[AC_BASH]/10 );
fprintf( fp, "%d ", pMobIndex->ac[AC_SLASH]/10 );
fprintf( fp, "%d\n", pMobIndex->ac[AC_EXOTIC]/10 );
print_debug(2,"Saving offense flags");
fprintf( fp, "%s ", print_flags(pMobIndex->off_flags) );
print_debug(2,"Saving immune flags");
fprintf( fp, "%s ", print_flags(pMobIndex->imm_flags) );
print_debug(2,"Saving resist flags");
fprintf( fp, "%s ", print_flags(pMobIndex->res_flags) );
print_debug(2,"Saving vulnerable flags");
fprintf( fp, "%s\n", print_flags(pMobIndex->vuln_flags) );
print_debug(2,"Saving start position");
fprintf( fp, "%s ",
position_table[pMobIndex->start_pos].short_name );
print_debug(2,"Saving default position");
fprintf( fp, "%s ",
position_table[pMobIndex->default_pos].short_name );
print_debug(2,"Saving sex");
fprintf( fp, "%s ", sex_table[pMobIndex->sex].name );
print_debug(2,"Saving wealth");
fprintf( fp, "%ld\n", pMobIndex->wealth );
print_debug(2,"Saving form flags");
fprintf( fp, "%s ", print_flags(pMobIndex->form) );
print_debug(2,"Saving parts flags");
fprintf( fp, "%s ", print_flags(pMobIndex->parts) );
print_debug(2,"Saving size");
fprintf( fp, "%s ", size_table[pMobIndex->size].name );
print_debug(2,"Saving material");
if (str_infix( " ", pMobIndex->material ) )
fprintf( fp, "%s\n", pMobIndex->material );
else
fprintf( fp, "'%s'\n", pMobIndex->material );
if (pMobIndex->die_descr[0] != '\0')
{
print_debug(2,"Saving die message");
str_replace(pMobIndex->die_descr, buf, buf2);
fprintf( fp, "D %s~\n", pMobIndex->die_descr );
}
if (pMobIndex->say_descr[0] != '\0')
{
print_debug(3,"Saving say message");
str_replace(pMobIndex->say_descr, buf, buf2);
fprintf( fp, "T %s~\n", pMobIndex->say_descr );
}
if (pMobIndex->clan[0] != '\0')
{
print_debug(3,"Saving clan");
str_replace(pMobIndex->clan, buf, buf2);
fprintf( fp, "C %s~\n", pMobIndex->clan );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->act,race_table[race].act ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F act %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->affected_by,race_table[race].aff ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F aff %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->shielded_by,race_table[race].shd ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F shd %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->off_flags,race_table[race].off ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F off %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->imm_flags,race_table[race].imm ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F imm %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->res_flags,race_table[race].res ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F res %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->vuln_flags,race_table[race].vuln ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F vul %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->form,race_table[race].form ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F for %s\n", buf );
}
buf[0] = '\0';
sprintf(buf,"%s",
cmp_flags( pMobIndex->parts,race_table[race].parts ) );
if (buf[0] != '0')
{
print_debug(3,"Saving flag remove");
fprintf( fp, "F par %s\n", buf );
}
}
}
fprintf( fp, "#0\n" );
return;
}
void save_rooms( FILE *fp )
{
ROOM_INDEX_DATA *pRoomIndex;
int vnum;
printf("Saving ROOMS.\n");
fprintf( fp, "\n#ROOMS\n" );
for (vnum = first_room; vnum <= last_room; vnum++ )
{
if ( ( pRoomIndex = get_room_index( vnum ) ) != NULL )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
GUILD_DATA *guild;
RACE_DATA *race;
EXTRA_DESCR_DATA *ed;
int door;
sprintf(buf,"%d",pRoomIndex->vnum);
print_debug(1,buf);
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
if (changevnum)
fprintf( fp, "#%d\n", pRoomIndex->vnum + newvnum );
else
fprintf( fp, "#%d\n", pRoomIndex->vnum );
print_debug(2,"Saving name");
str_replace(pRoomIndex->name, buf, buf2);
fprintf( fp, "%s~\n", pRoomIndex->name );
print_debug(2,"Saving description");
str_replace(pRoomIndex->description, buf, buf2);
fprintf( fp, "%s~\n", pRoomIndex->description );
print_debug(2,"Saving room flags");
fprintf( fp, "0 %s ", print_flags(pRoomIndex->room_flags) );
print_debug(2,"Saving sector type");
fprintf( fp, "%d\n", pRoomIndex->sector_type );
for ( door = 0; door <= 11; door++ )
{
EXIT_DATA *pexit;
if ( ( pexit = pRoomIndex->exit[door] ) != NULL)
{
int locks;
print_debug(3,"Saving door");
fprintf( fp, "D%d\n", door );
print_debug(4,"Saving description");
str_replace(pexit->description, buf, buf2);
fprintf( fp, "%s~\n", pexit->description );
print_debug(4,"Saving keyword");
str_replace(pexit->keyword, buf, buf2);
fprintf( fp, "%s~\n", pexit->keyword );
print_debug(4,"Saving door flags");
if (pexit->exit_info == EX_ISDOOR)
locks = 1;
else if (pexit->exit_info == (EX_ISDOOR | EX_PICKPROOF))
locks = 2;
else if (pexit->exit_info == (EX_ISDOOR | EX_NOPASS))
locks = 3;
else if (pexit->exit_info == (EX_ISDOOR | EX_NOPASS | EX_PICKPROOF))
locks = 4;
else
locks = 0;
fprintf(fp,"%d ", locks );
if (changevnum)
{
if ((pexit->key >= area_first->min_vnum)
&& (pexit->key <= area_first->max_vnum))
fprintf(fp,"%d ", pexit->key + newvnum );
else
fprintf(fp,"%d ", pexit->key );
if ((pexit->u1.vnum >= area_first->min_vnum)
&& (pexit->u1.vnum <= area_first->max_vnum))
fprintf(fp,"%d\n", pexit->u1.vnum + newvnum );
else
fprintf(fp,"%d\n", pexit->u1.vnum );
} else {
fprintf(fp,"%d ", pexit->key );
fprintf(fp,"%d\n", pexit->u1.vnum );
}
}
}
if ((pRoomIndex->heal_rate != 100)
|| (pRoomIndex->mana_rate != 100))
{
print_debug(3,"Saving heal/mana");
fprintf( fp, "M %d ", pRoomIndex->mana_rate );
fprintf( fp, "H %d\n", pRoomIndex->heal_rate );
}
if (pRoomIndex->clan[0] != '\0')
{
print_debug(3,"Saving clan");
str_replace(pRoomIndex->clan, buf, buf2);
fprintf( fp, "C %s~\n", pRoomIndex->clan );
}
for (guild = pRoomIndex->guild; guild != NULL; guild = guild->next)
{
print_debug(3,"Saving guild");
fprintf( fp, "G %s~\n", class_table[guild->guild].name );
}
for (race = pRoomIndex->race; race != NULL; race = race->next)
{
print_debug(3,"Saving race");
fprintf( fp, "R %s~\n", race_table[race->race].name );
}
if (pRoomIndex->owner[0] != '\0')
{
print_debug(3,"Saving owner");
str_replace(pRoomIndex->owner, buf, buf2);
fprintf( fp, "O %s~\n", pRoomIndex->owner );
}
for (ed = pRoomIndex->extra_descr; ed != NULL; ed = ed->next)
{
print_debug(3,"Saving extra description");
fprintf( fp, "E\n" );
str_replace(ed->keyword, buf, buf2);
fprintf( fp, "%s~\n", ed->keyword );
str_replace(ed->description, buf, buf2);
fprintf( fp, "%s~\n", ed->description );
}
fprintf( fp, "S\n" );
}
}
fprintf( fp, "#0\n" );
return;
}
void save_objects( FILE *fp )
{
OBJ_INDEX_DATA *pObjIndex;
int vnum;
printf("Saving OBJECTS.\n");
fprintf( fp, "\n#OBJECTS\n" );
for (vnum = first_object; vnum <= last_object; vnum++ )
{
if ( ( pObjIndex = get_obj_index( vnum ) ) != NULL )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
GUILD_DATA *guild;
EXTRA_DESCR_DATA *ed;
AFFECT_DATA *paf;
int condition;
sprintf(buf,"%d",pObjIndex->vnum);
print_debug(1,buf);
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
if (changevnum)
fprintf( fp, "#%d\n", pObjIndex->vnum + newvnum );
else
fprintf( fp, "#%d\n", pObjIndex->vnum );
print_debug(2,"Saving name");
str_replace(pObjIndex->name, buf, buf2);
fprintf( fp, "%s~\n", pObjIndex->name );
print_debug(2,"Saving short_descr");
str_replace(pObjIndex->short_descr, buf, buf2);
fprintf( fp, "%s~\n", pObjIndex->short_descr );
print_debug(2,"Saving description");
str_replace(pObjIndex->description, buf, buf2);
fprintf( fp, "%s~\n", pObjIndex->description );
print_debug(2,"Saving material");
str_replace(pObjIndex->material, buf, buf2);
fprintf( fp, "%s~\n", pObjIndex->material );
print_debug(2,"Saving item type");
fprintf( fp, "%s ", item_table[pObjIndex->item_type].name );
print_debug(2,"Saving extra flags");
fprintf( fp, "%s ", print_flags(pObjIndex->extra_flags) );
print_debug(2,"Saving wear flags");
fprintf( fp, "%s\n", print_flags(pObjIndex->wear_flags) );
print_debug(2,"Saving v0-v4");
switch(pObjIndex->item_type)
{
case ITEM_WEAPON:
fprintf( fp, "%s ", weapon_table[pObjIndex->value[0]].name );
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "%d ", pObjIndex->value[2] );
fprintf( fp, "%s ", attack_table[pObjIndex->value[3]].name );
fprintf( fp, "%s\n", print_flags(pObjIndex->value[4]) );
break;
case ITEM_CONTAINER:
case ITEM_PIT:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "%s ", print_flags(pObjIndex->value[1]) );
if (changevnum)
{
if ((pObjIndex->value[2] >= area_first->min_vnum)
&& (pObjIndex->value[2] <= area_first->max_vnum))
fprintf( fp, "%d ", pObjIndex->value[2] + newvnum );
else
fprintf( fp, "%d ", pObjIndex->value[2] );
}
fprintf( fp, "%d ", pObjIndex->value[3] );
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
case ITEM_EXIT:
if (changevnum)
{
if ((pObjIndex->value[0] >= area_first->min_vnum)
&& (pObjIndex->value[0] <= area_first->max_vnum))
fprintf( fp, "%d ", pObjIndex->value[0] + newvnum );
else
fprintf( fp, "%d ", pObjIndex->value[0] );
}
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "%d ", pObjIndex->value[2] );
fprintf( fp, "%d ", pObjIndex->value[3] );
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
case ITEM_PORTAL:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "%s ", print_flags(pObjIndex->value[2]) );
if (changevnum)
{
if ((pObjIndex->value[3] >= area_first->min_vnum)
&& (pObjIndex->value[3] <= area_first->max_vnum))
fprintf( fp, "%d ", pObjIndex->value[3] + newvnum );
else
fprintf( fp, "%d ", pObjIndex->value[3] );
}
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
case ITEM_DRINK_CON:
case ITEM_FOUNTAIN:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "'%s' ", liq_table[pObjIndex->value[2]].liq_name);
fprintf( fp, "%d ", pObjIndex->value[3] );
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
case ITEM_WAND:
case ITEM_STAFF:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "%d ", pObjIndex->value[2] );
fprintf( fp, "'%s' ", skill_table[pObjIndex->value[3]].name );
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
case ITEM_POTION:
case ITEM_PILL:
case ITEM_SCROLL:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "'%s' ", skill_table[pObjIndex->value[1]].name );
fprintf( fp, "'%s' ", skill_table[pObjIndex->value[2]].name );
fprintf( fp, "'%s' ", skill_table[pObjIndex->value[3]].name );
fprintf( fp, "'%s'\n", skill_table[pObjIndex->value[4]].name);
break;
default:
fprintf( fp, "%d ", pObjIndex->value[0] );
fprintf( fp, "%d ", pObjIndex->value[1] );
fprintf( fp, "%d ", pObjIndex->value[2] );
fprintf( fp, "%d ", pObjIndex->value[3] );
fprintf( fp, "%d\n", pObjIndex->value[4] );
break;
}
print_debug(2,"Saving level");
fprintf( fp, "%d ", pObjIndex->level );
print_debug(2,"Saving weight");
fprintf( fp, "%d ", pObjIndex->weight );
print_debug(2,"Saving cost");
fprintf( fp, "%d ", pObjIndex->cost );
print_debug(2,"Saving condition");
condition = pObjIndex->condition;
if (condition >= 100)
fprintf( fp, "P\n" );
else if (condition >= 90)
fprintf( fp, "G\n" );
else if (condition >= 75)
fprintf( fp, "A\n" );
else if (condition >= 50)
fprintf( fp, "W\n" );
else if (condition >= 25)
fprintf( fp, "D\n" );
else if (condition >= 10)
fprintf( fp, "B\n" );
else if (condition >= 0)
fprintf( fp, "R\n" );
else
fprintf( fp, "P\n" );
if (pObjIndex->clan[0] != '\0')
{
print_debug(3,"Saving clan");
str_replace(pObjIndex->clan, buf, buf2);
fprintf( fp, "C %s~\n", pObjIndex->clan );
}
for (guild = pObjIndex->guild; guild != NULL; guild = guild->next)
{
print_debug(3,"Saving guild");
fprintf( fp, "G %s~\n", class_table[guild->guild].name );
}
for (paf = pObjIndex->affected; paf != NULL; paf = paf->next)
{
if (paf->bitvector == 0)
{
print_debug(3,"Saving affect");
fprintf( fp, "A\n" );
fprintf( fp, "%d ", paf->location );
fprintf( fp, "%d\n", paf->modifier );
} else
{
print_debug(3,"Saving flags");
fprintf( fp, "F\n" );
if (paf->where == TO_AFFECTS)
fprintf( fp, "A " );
else if (paf->where == TO_IMMUNE)
fprintf( fp, "I " );
else if (paf->where == TO_RESIST)
fprintf( fp, "R " );
else if (paf->where == TO_VULN)
fprintf( fp, "V " );
else if (paf->where == TO_SHIELDS)
fprintf( fp, "S " );
fprintf( fp, "%d ", paf->location );
fprintf( fp, "%d ", paf->modifier );
fprintf( fp, "%s\n", print_flags(paf->bitvector) );
}
}
for (ed = pObjIndex->extra_descr; ed != NULL; ed = ed->next)
{
print_debug(3,"Saving extra description");
fprintf( fp, "E\n" );
str_replace(ed->keyword, buf, buf2);
fprintf( fp, "%s~\n", ed->keyword );
str_replace(ed->description, buf, buf2);
fprintf( fp, "%s~\n", ed->description );
}
}
}
fprintf( fp, "#0\n" );
return;
}
void save_shops( FILE *fp )
{
MOB_INDEX_DATA *pMobIndex;
int vnum;
printf("Saving SHOPS.\n");
fprintf( fp, "\n#SHOPS\n" );
for (vnum = first_mobile; vnum <= last_mobile; vnum++ )
{
if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
{
SHOP_DATA *pShop;
if ( ( pShop = pMobIndex->pShop ) != NULL )
{
int iTrade;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
if (changevnum)
fprintf( fp, "%-7d", pShop->keeper + newvnum );
else
fprintf( fp, "%-7d", pShop->keeper );
for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
fprintf( fp, "%4d", pShop->buy_type[iTrade] );
fprintf( fp, "%7d", pShop->profit_buy );
fprintf( fp, "%5d", pShop->profit_sell );
fprintf( fp, "%5d", pShop->open_hour );
fprintf( fp, "%3d", pShop->close_hour );
fprintf( fp, " * " );
str_replace(pMobIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pMobIndex->short_descr );
}
}
}
fprintf( fp, "0\n" );
return;
}
void save_resets( FILE *fp )
{
RESET_DATA *pReset;
int last;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
bool found;
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
printf("Saving RESETS.\n");
fprintf( fp, "\n#RESETS\n" );
last = 0;
found = FALSE;
for (pReset = area_first->reset_first; pReset != NULL; pReset = pReset->next)
{
ROOM_INDEX_DATA *pRoomIndex;
switch( pReset->command )
{
default:
break;
case 'D':
found = TRUE;
fprintf( fp, "D 0 " );
if (changevnum)
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
fprintf( fp, "%1d * ", pReset->arg3 );
if ( ( pRoomIndex = get_room_index( pReset->arg1 ) ) != NULL )
{
str_replace(pRoomIndex->name, buf, buf2);
fprintf( fp, "%s\n", pRoomIndex->name );
} else
{
fprintf( fp, "\n" );
}
break;
}
}
if (found)
fprintf( fp, "\n" );
found = FALSE;
for (pReset = area_first->reset_first; pReset != NULL; pReset = pReset->next)
{
ROOM_INDEX_DATA *pRoomIndex;
switch( pReset->command )
{
default:
break;
case 'R':
found = TRUE;
fprintf( fp, "R 0 " );
if (changevnum)
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
fprintf( fp, " * " );
if ( ( pRoomIndex = get_room_index( pReset->arg1 ) ) != NULL )
{
str_replace(pRoomIndex->name, buf, buf2);
fprintf( fp, "%s\n", pRoomIndex->name );
} else
{
fprintf( fp, "\n" );
}
break;
}
}
if (found)
fprintf( fp, "\n" );
found = FALSE;
for (pReset = area_first->reset_first; pReset != NULL; pReset = pReset->next)
{
OBJ_INDEX_DATA *pObjIndex;
switch( pReset->command )
{
default:
last = 0;
break;
case 'O':
found = TRUE;
last = 1;
fprintf( fp, "O 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
if ((changevnum)
&& (pReset->arg3 >= area_first->min_vnum)
&& (pReset->arg3 <= area_first->max_vnum))
fprintf( fp, "%5d * ", pReset->arg3 + newvnum );
else
fprintf( fp, "%5d * ", pReset->arg3 );
if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) != NULL )
{
str_replace(pObjIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pObjIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
case 'P':
if (last == 0)
break;
found = TRUE;
fprintf( fp, "P 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
if ((changevnum)
&& (pReset->arg3 >= area_first->min_vnum)
&& (pReset->arg3 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg3 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg3 );
fprintf( fp, "%3d * ", pReset->arg4 );
if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) != NULL )
{
str_replace(pObjIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pObjIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
}
}
if (found)
fprintf( fp, "\n" );
found = FALSE;
for (pReset = area_first->reset_first; pReset != NULL; pReset = pReset->next)
{
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
switch( pReset->command )
{
default:
last = 0;
break;
case 'M':
found = TRUE;
last = 0;
fprintf( fp, "M 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
if ((changevnum)
&& (pReset->arg3 >= area_first->min_vnum)
&& (pReset->arg3 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg3 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg3 );
fprintf( fp, "%3d * ", pReset->arg4 );
if ( ( pMobIndex = get_mob_index( pReset->arg1 ) ) != NULL )
{
str_replace(pMobIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pMobIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
case 'E':
found = TRUE;
last = 1;
fprintf( fp, "E 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
fprintf( fp, "%2d * ", pReset->arg3 );
if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) != NULL )
{
str_replace(pObjIndex->name, buf, buf2);
fprintf( fp, "%s\n", pObjIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
case 'G':
found = TRUE;
last = 1;
fprintf( fp, "G 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
fprintf( fp, " * " );
if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) != NULL )
{
str_replace(pObjIndex->name, buf, buf2);
fprintf( fp, "%s\n", pObjIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
case 'P':
if (last == 0)
break;
found = TRUE;
fprintf( fp, "P 0 " );
if ((changevnum)
&& (pReset->arg1 >= area_first->min_vnum)
&& (pReset->arg1 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg1 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg1 );
fprintf( fp, "%3d ", pReset->arg2 );
if ((changevnum)
&& (pReset->arg3 >= area_first->min_vnum)
&& (pReset->arg3 <= area_first->max_vnum))
fprintf( fp, "%5d ", pReset->arg3 + newvnum );
else
fprintf( fp, "%5d ", pReset->arg3 );
fprintf( fp, "%3d * ", pReset->arg4 );
if ( ( pObjIndex = get_obj_index( pReset->arg1 ) ) != NULL )
{
str_replace(pObjIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pObjIndex->short_descr );
} else
{
fprintf( fp, "\n" );
}
break;
}
}
if (found)
fprintf( fp, "\n" );
found = FALSE;
fprintf( fp, "S\n" );
return;
}
void save_specials( FILE *fp )
{
MOB_INDEX_DATA *pMobIndex;
int vnum;
printf("Saving SPECIALS.\n");
fprintf( fp, "\n#SPECIALS\n" );
for (vnum = first_mobile; vnum <= last_mobile; vnum++ )
{
if ( ( pMobIndex = get_mob_index( vnum ) ) != NULL )
{
if ( pMobIndex->spec_fun != NULL )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
fprintf( fp, "M " );
if ((changevnum)
&& (vnum >= area_first->min_vnum)
&& (vnum <= area_first->max_vnum))
fprintf( fp, "%5d ", vnum + newvnum );
else
fprintf( fp, "%5d ", vnum );
fprintf( fp, "%-30s * ", pMobIndex->spec_fun );
str_replace(pMobIndex->short_descr, buf, buf2);
fprintf( fp, "%s\n", pMobIndex->short_descr );
}
}
}
fprintf( fp, "S\n" );
return;
}
void save_dreams( FILE *fp )
{
DRM_INDEX_DATA *pDrmIndex;
int vnum;
if (drm_index == NULL)
return;
printf("Saving DREAMS.\n");
fprintf( fp, "\n#DREAMS\n" );
vnum = newmin;
for (pDrmIndex = drm_index; pDrmIndex != NULL; pDrmIndex = pDrmIndex->next )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
DREAM_ACT_DATA *pat;
DREAM_CHANGE_DATA *pch;
DREAM_OBJECT_DATA *pob;
sprintf(buf, "%c%c", 10, 13 );
sprintf(buf2, "%c", 10 );
fprintf( fp, "#%d\n", vnum );
str_replace(pDrmIndex->description, buf, buf2);
fprintf( fp, "%s~\n", pDrmIndex->description );
for (pat = pDrmIndex->act; pat != NULL; pat = pat->next)
{
str_replace(pat->string, buf, buf2);
fprintf( fp, "A %s~\n", pat->string );
}
if (pDrmIndex->move)
fprintf( fp, "M %d\n", pDrmIndex->move );
for (pch = pDrmIndex->change; pch != NULL; pch = pch->next)
fprintf( fp, "C %s %s\n", pch->keyword, pch->value );
for (pob = pDrmIndex->object; pob != NULL; pob = pob->next)
{
fprintf( fp, "O %d %s ", pob->vnum, pob->roomchar );
fprintf( fp, "%d ", pob->variable );
fprintf( fp, "%d %d\n", pob->t_min, pob->t_max );
}
fprintf( fp, "S\n" );
vnum++;
}
fprintf( fp, "#0\n" );
return;
}