/*************************************************************************** * File: olc_save.c * * * * 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. * * * * This code was freely distributed with the The Isles 1.1 source code, * * and has been used here for OLC - OLC would not be what it is without * * all the previous coders who released their source code. * ***************************************************************************/ /* * olc_save.c * This takes care of saving all the .are information. * Notes: * If a good syntax checker is used for setting vnum ranges of areas * then it would become possible to just cycle through vnums instead * of using the iHash stuff and checking that the room or reset or * mob etc is part of that area. */ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "olc.h" /* * Name: fix_string * Purpose: Returns a string without \r and ~. */ char *fix_string(const char *str) { static char strfix[4 * MAX_STRING_LENGTH]; int i; int o; if (str == NULL) return '\0'; for (o = i = 0; str[i + o] != '\0'; i++) { if (str[i + o] == '\r' || str[i + o] == '~') o++; strfix[i] = str[i + o]; } strfix[i] = '\0'; return strfix; } /* * Name: save_area_list * Purpose: Saves the listing of files to be loaded at startup. * Called by: do_asave(olc_save.c). */ void save_area_list() { FILE *fp; AREA_DATA *pArea; if ((fp = fopen("AREA.LST", "w")) == NULL) { bug("Save_area_list: fopen", 0); perror("AREA.LST"); } else { /* * Add any help files that need to be loaded at * startup to this section. */ fprintf(fp, "help.are\n"); fprintf(fp, "olc.hlp\n"); for (pArea = area_first; pArea; pArea = pArea->next) { fprintf(fp, "%s\n", pArea->filename); } fprintf(fp, "$\n"); fclose(fp); } return; } /* * Name: save_mobiles * Purpose: Save #MOBILES secion of an area file. * Called by: save_area(olc_save.c). */ void save_mobiles(FILE * fp, AREA_DATA * pArea) { int vnum; MOB_INDEX_DATA *pMobIndex; fprintf(fp, "#MOBILES\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pMobIndex = get_mob_index(vnum))) { if (pMobIndex->area == pArea) { fprintf(fp, "#%d\n", pMobIndex->vnum); fprintf(fp, "%s~\n", pMobIndex->player_name); fprintf(fp, "%s~\n", pMobIndex->short_descr); fprintf(fp, "%s~\n", fix_string(pMobIndex->long_descr)); fprintf(fp, "%s~\n", fix_string(pMobIndex->description)); fprintf(fp, "%d ", pMobIndex->act); fprintf(fp, "%d ", pMobIndex->affected_by); fprintf(fp, "%d S\n", pMobIndex->alignment); fprintf(fp, "%d ", pMobIndex->level); fprintf(fp, "%d ", pMobIndex->hitroll); fprintf(fp, "%d ", pMobIndex->ac); fprintf(fp, "%dd%d+%d ", pMobIndex->hitnodice, pMobIndex->hitsizedice, pMobIndex->hitplus); fprintf(fp, "%dd%d+%d\n", pMobIndex->damnodice, pMobIndex->damsizedice, pMobIndex->damplus); fprintf(fp, "%d ", pMobIndex->gold); fprintf(fp, "0\n0 "); fprintf(fp, "%s~ ", race_table[pMobIndex->race].name); fprintf(fp, "%d\n", pMobIndex->sex); /* * This is responsible for writing MOBprograms in_file. * By Farix of Oz. */ if (pMobIndex->mobprogs) { MPROG_DATA *mPtr; for (mPtr = pMobIndex->mobprogs; mPtr; mPtr = mPtr->next) { fprintf(fp, ">%s ", mprog_type_to_name( mPtr->type)); fprintf(fp, "%s~\n", mPtr->arglist); fprintf(fp, "%s~\n", fix_string(mPtr->comlist)); } fprintf(fp, "|\n"); } } } } fprintf(fp, "#0\n\n\n\n"); return; } /* * Name: save_objects * Purpose: Save #OBJECTS section of an area file. * Called by: save_area(olc_save.c). (Disabled by Zen) */ void save_objects(FILE * fp, AREA_DATA * pArea) { int vnum; OBJ_INDEX_DATA *pObjIndex; AFFECT_DATA *pAf; EXTRA_DESCR_DATA *pEd; fprintf(fp, "#OBJECTS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pObjIndex = get_obj_index(vnum))) { if (pObjIndex->area == pArea) { fprintf(fp, "#%d\n", pObjIndex->vnum); fprintf(fp, "%s~\n", pObjIndex->name); fprintf(fp, "%s~\n", pObjIndex->short_descr); fprintf(fp, "%s~\n", fix_string(pObjIndex->description)); fprintf(fp, "~\n"); fprintf(fp, "%d ", pObjIndex->item_type); fprintf(fp, "%d ", pObjIndex->extra_flags); fprintf(fp, "%d\n", pObjIndex->wear_flags); switch (pObjIndex->item_type) { default: fprintf(fp, "%d~ %d~ %d~ %d~\n", pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[3]); break; case ITEM_PILL: case ITEM_POTION: case ITEM_SCROLL: fprintf(fp, "%d~ %s~ %s~ %s~\n", pObjIndex->value[0], pObjIndex->value[1] != -1 ? skill_table[pObjIndex->value[1]].name : " ", pObjIndex->value[2] != -1 ? skill_table[pObjIndex->value[2]].name : " ", pObjIndex->value[3] != -1 ? skill_table[pObjIndex->value[3]].name : " "); break; case ITEM_STAFF: case ITEM_WAND: fprintf(fp, "%d~ %d~ %d~ %s~\n", pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[3] != -1 ? skill_table[pObjIndex->value[3]].name : " "); break; } fprintf(fp, "%d ", pObjIndex->weight); fprintf(fp, "%d 0\n", pObjIndex->cost); for (pAf = pObjIndex->affected; pAf; pAf = pAf->next) { fprintf(fp, "A\n%d %d\n", pAf->location, pAf->modifier); } for (pEd = pObjIndex->extra_descr; pEd; pEd = pEd->next) { fprintf(fp, "E\n%s~\n%s~\n", pEd->keyword, fix_string(pEd->description)); } } } } fprintf(fp, "#0\n\n\n\n"); return; } /* * Name: new_save_objects * Purpose: Save #OBJECTS section of an area file. * Called by: save_area(olc_save.c). */ void new_save_objects(FILE * fp, AREA_DATA * pArea) { int vnum; OBJ_INDEX_DATA *pObjIndex; AFFECT_DATA *pAf; EXTRA_DESCR_DATA *pEd; fprintf(fp, "#NEWOBJECTS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pObjIndex = get_obj_index(vnum))) { if (pObjIndex->area == pArea) { fprintf(fp, "#%d\n", pObjIndex->vnum); fprintf(fp, "%s~\n", pObjIndex->name); fprintf(fp, "%s~\n", pObjIndex->short_descr); fprintf(fp, "%s~\n", fix_string(pObjIndex->description)); fprintf(fp, "~\n"); fprintf(fp, "%d ", pObjIndex->item_type); fprintf(fp, "%d ", pObjIndex->extra_flags); fprintf(fp, "%d\n", pObjIndex->wear_flags); switch (pObjIndex->item_type) { default: fprintf(fp, "%d~ %d~ %d~ %d~ %d~\n", pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[3], pObjIndex->value[4]); break; case ITEM_PILL: case ITEM_POTION: case ITEM_SCROLL: fprintf(fp, "%d~ %s~ %s~ %s~ %s~\n", pObjIndex->value[0], pObjIndex->value[1] != -1 ? skill_table[pObjIndex->value[1]].name : " ", pObjIndex->value[2] != -1 ? skill_table[pObjIndex->value[2]].name : " ", pObjIndex->value[3] != -1 ? skill_table[pObjIndex->value[3]].name : " ", pObjIndex->value[4] != -1 ? skill_table[pObjIndex->value[4]].name : " "); break; case ITEM_STAFF: case ITEM_WAND: fprintf(fp, "%d~ %d~ %d~ %s~ %d~\n", pObjIndex->value[0], pObjIndex->value[1], pObjIndex->value[2], pObjIndex->value[3] != -1 ? skill_table[pObjIndex->value[3]].name : " ", pObjIndex->value[4]); break; } fprintf(fp, "%d ", pObjIndex->weight); fprintf(fp, "%d 0\n", pObjIndex->cost); for (pAf = pObjIndex->affected; pAf; pAf = pAf->next) { fprintf(fp, "A\n%d %d\n", pAf->location, pAf->modifier); } for (pEd = pObjIndex->extra_descr; pEd; pEd = pEd->next) { fprintf(fp, "E\n%s~\n%s~\n", pEd->keyword, fix_string(pEd->description)); } } } } fprintf(fp, "#0\n\n\n\n"); return; } /* * OLC 1.1b * * Name: save_rooms * Purpose: Save #ROOMDATA section of an area file. * Called by: save_area(olc_save.c). */ void save_rooms(FILE * fp, AREA_DATA * pArea) { ROOM_INDEX_DATA *pRoomIndex; EXTRA_DESCR_DATA *pEd; EXIT_DATA *pExit; int vnum; int door; fprintf(fp, "#ROOMDATA\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pRoomIndex = get_room_index(vnum))) { if (pRoomIndex->area == pArea) { fprintf(fp, "#%d\n", pRoomIndex->vnum); fprintf(fp, "%s~\n", pRoomIndex->name); fprintf(fp, "%s~\n", fix_string(pRoomIndex->description)); fprintf(fp, "0 "); fprintf(fp, "%d ", pRoomIndex->room_flags); fprintf(fp, "%d\n", pRoomIndex->sector_type); for (pEd = pRoomIndex->extra_descr; pEd; pEd = pEd->next) { fprintf(fp, "E\n%s~\n%s~\n", pEd->keyword, fix_string(pEd->description)); } for (door = 0; door < MAX_DIR; door++) { if ((pExit = pRoomIndex->exit[door])) { fprintf(fp, "D%d\n", door); fprintf(fp, "%s~\n", fix_string(pExit->description)); fprintf(fp, "%s~\n", pExit->keyword); fprintf(fp, "%d %d %d\n", pExit->rs_flags, pExit->key, pExit->to_room ? pExit->to_room->vnum : 0); } } fprintf(fp, "S\n"); } } } fprintf(fp, "#0\n\n\n\n"); return; } /* * OLC 1.1b * * Name: save_specials * Purpose: Save #SPECIALS section of area file. * Called by: save_area(olc_save.c). */ void save_specials(FILE * fp, AREA_DATA * pArea) { int vnum; MOB_INDEX_DATA *pMobIndex; fprintf(fp, "#SPECIALS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pMobIndex = get_mob_index(vnum))) { if (pMobIndex->area == pArea && pMobIndex->spec_fun) { fprintf(fp, "M %d %s\n", pMobIndex->vnum, spec_string(pMobIndex->spec_fun)); } } } fprintf(fp, "S\n\n\n\n"); return; } /* * OLC 1.1b * * Name: vsave_specials * Purpose: Save #SPECIALS section of area file. * New formating thanks to Rac. * Called by: save_area(olc_save.c). */ void vsave_specials(FILE * fp, AREA_DATA * pArea) { int vnum; MOB_INDEX_DATA *pMobIndex; fprintf(fp, "#SPECIALS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pMobIndex = get_mob_index(vnum))) { if (pMobIndex->area == pArea && pMobIndex->spec_fun) { fprintf(fp, "M %d %s \t; %s\n", pMobIndex->vnum, spec_string(pMobIndex->spec_fun), pMobIndex->short_descr); } } } fprintf(fp, "S\n\n\n\n"); return; } /* * OLC 1.1b * Name: save_resets * Purpose: Saves the #RESETS section of an area file. * New format thanks to Rac. * Called by: save_area(olc_save.c) */ void save_resets(FILE * fp, AREA_DATA * pArea) { RESET_DATA *pReset; MOB_INDEX_DATA *pLastMob = NULL; OBJ_INDEX_DATA *pLastObj; ROOM_INDEX_DATA *pRoomIndex; char buf[MAX_STRING_LENGTH]; int vnum; fprintf(fp, "#RESETS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pRoomIndex = get_room_index(vnum))) { if (pRoomIndex->area == pArea) { for (pReset = pRoomIndex->reset_first; pReset; pReset = pReset->next) { switch (pReset->command) { default: bug("Save_resets: bad command %c.", pReset->command); break; case 'M': pLastMob = get_mob_index(pReset->arg1); fprintf(fp, "M 0 %d %d %d\n", pReset->arg1, pReset->arg2, pReset->arg3); break; case 'O': pLastObj = get_obj_index(pReset->arg1); fprintf(fp, "O 0 %d 0 %d\n", pReset->arg1, pReset->arg3); break; case 'P': pLastObj = get_obj_index(pReset->arg1); fprintf(fp, "P 0 %d 0 %d\n", pReset->arg1, pReset->arg3); break; case 'G': fprintf(fp, "G 0 %d 0\n", pReset->arg1); if (!pLastMob) { sprintf(buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename); bug(buf, 0); } break; case 'E': fprintf(fp, "E 0 %d 0 %d\n", pReset->arg1, pReset->arg3); if (!pLastMob) { sprintf(buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename); bug(buf, 0); } break; case 'D': break; case 'R': fprintf(fp, "R 0 %d %d\n", pReset->arg1, pReset->arg2); break; } /* * End switch */ } /* * End for pReset */ } /* * End if correct area */ } /* * End if pRoomIndex */ } /* * End for vnum */ fprintf(fp, "S\n\n\n\n"); return; } /* * OLC 1.1b * * Name: save_resets * Purpose: Saves the #RESETS section of an area file. * New format thanks to Rac. * Called by: save_area(olc_save.c) */ void vsave_resets(FILE * fp, AREA_DATA * pArea) { RESET_DATA *pReset; MOB_INDEX_DATA *pLastMob = NULL; OBJ_INDEX_DATA *pLastObj; ROOM_INDEX_DATA *pRoomIndex; char buf[MAX_STRING_LENGTH]; int vnum; fprintf(fp, "#RESETS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pRoomIndex = get_room_index(vnum))) { if (pRoomIndex->area == pArea) { for (pReset = pRoomIndex->reset_first; pReset; pReset = pReset->next) { switch (pReset->command) { default: bug("Save_resets: bad command %c.", pReset->command); break; case 'M': pLastMob = get_mob_index(pReset->arg1); fprintf(fp, "M 0 %d %2d %-5d \t; %s to %s\n", pReset->arg1, pReset->arg2, pReset->arg3, pLastMob->short_descr, pRoomIndex->name); break; case 'O': pLastObj = get_obj_index(pReset->arg1); fprintf(fp, "O 0 %d 0 %-5d \t; %s to %s\n", pReset->arg1, pReset->arg3, capitalize(pLastObj->short_descr), pRoomIndex->name); break; case 'P': pLastObj = get_obj_index(pReset->arg1); fprintf(fp, "P 0 %d 0 %-5d \t; %s inside %s\n", pReset->arg1, pReset->arg3, capitalize(get_obj_index(pReset->arg1)->short_descr), pLastObj ? pLastObj->short_descr : "!NO_OBJ!"); if (!pLastObj) /* * Thanks Rac! */ { sprintf(buf, "Save_resets: P with !NO_OBJ! in [%s]", pArea->filename); bug(buf, 0); } break; case 'G': pLastObj = get_obj_index(pReset->arg1); fprintf(fp, "G 0 %d 0 \t; %s\n", pReset->arg1, capitalize(pLastObj->short_descr)); if (!pLastMob) { sprintf(buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename); bug(buf, 0); } break; case 'E': fprintf(fp, "E 0 %d 0 %-5d \t; %s %s\n", pReset->arg1, pReset->arg3, capitalize(get_obj_index(pReset->arg1)->short_descr), flag_string(wear_loc_strings, pReset->arg3)); if (!pLastMob) { sprintf(buf, "Save_resets: !NO_MOB! in [%s]", pArea->filename); bug(buf, 0); } break; case 'D': break; case 'R': fprintf(fp, "R 0 %d %2d \t; Randomize %s\n", pReset->arg1, pReset->arg2, pRoomIndex->name); break; } /* * End switch */ } /* * End for pReset */ } /* * End if correct area */ } /* * End if pRoomIndex */ } /* * End for vnum */ fprintf(fp, "S\n\n\n\n"); return; } /* * OLC 1.1b * * Name: save_shops * Purpose: Saves the #SHOPS section of an area file. * Called by: save_area(olc_save.c) */ void save_shops(FILE * fp, AREA_DATA * pArea) { SHOP_DATA *pShopIndex; MOB_INDEX_DATA *pMobIndex; int iTrade; int vnum; fprintf(fp, "#SHOPS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pMobIndex = get_mob_index(vnum))) { if (pMobIndex->area == pArea && pMobIndex->pShop) { pShopIndex = pMobIndex->pShop; fprintf(fp, "%d ", pShopIndex->keeper); for (iTrade = 0; iTrade < MAX_TRADE; iTrade++) { if (pShopIndex->buy_type[iTrade] != 0) { fprintf(fp, "%d ", pShopIndex->buy_type[iTrade]); } else fprintf(fp, "0 "); } fprintf(fp, "%d %d ", pShopIndex->profit_buy, pShopIndex->profit_sell); fprintf(fp, "%d %d\n", pShopIndex->open_hour, pShopIndex->close_hour); } } } fprintf(fp, "0\n\n\n\n"); return; } /* * OLC 1.1b * * Name: vsave_shops * Purpose: Saves the #SHOPS section of an area file. * New formating thanks to Rac. * Called by: save_area(olc_save.c) */ void vsave_shops(FILE * fp, AREA_DATA * pArea) { SHOP_DATA *pShopIndex; MOB_INDEX_DATA *pMobIndex; int iTrade; int vnum; fprintf(fp, "#SHOPS\n"); for (vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++) { if ((pMobIndex = get_mob_index(vnum))) { if (pMobIndex->area == pArea && pMobIndex->pShop) { pShopIndex = pMobIndex->pShop; fprintf(fp, "%d ", pShopIndex->keeper); for (iTrade = 0; iTrade < MAX_TRADE; iTrade++) { if (pShopIndex->buy_type[iTrade] != 0) { fprintf(fp, "%2d ", pShopIndex->buy_type[iTrade]); } else fprintf(fp, " 0 "); } fprintf(fp, "%3d %3d ", pShopIndex->profit_buy, pShopIndex->profit_sell); fprintf(fp, "%2d %2d ", pShopIndex->open_hour, pShopIndex->close_hour); fprintf(fp, "\t; %s\n", get_mob_index(pShopIndex->keeper)->short_descr); } } } fprintf(fp, "0\n\n\n\n"); return; } /* * Name: save_helps * Purpose: Save #HELPS section of an area file. * Written by: Walker <nkrendel@evans.Denver.Colorado.EDU> * Called by: save_area(olc_save.c). */ void save_helps(FILE * fp, AREA_DATA * pArea) { HELP_DATA *pHelp; bool found = FALSE; for (pHelp = help_first; pHelp; pHelp = pHelp->next) { if (pHelp->area && pHelp->area == pArea) { if (!found) { fprintf(fp, "#HELPS\n\n"); found = TRUE; } fprintf(fp, "%d %s~\n%s~\n", pHelp->level, all_capitalize(pHelp->keyword), fix_string(pHelp->text)); } } if (found) fprintf(fp, "\n0 $~\n\n"); return; } /* * Name: save_area * Purpose: Save an area, note that this format is new. * Called by: do_asave(olc_save.c). */ void save_area(AREA_DATA * pArea) { FILE *fp; fclose(fpReserve); if (!(fp = fopen(pArea->filename, "w"))) { bug("Open_area: fopen", 0); perror(pArea->filename); } fprintf(fp, "#AREADATA\n"); fprintf(fp, "Name %s~\n", pArea->name); fprintf(fp, "Builders %s~\n", fix_string(pArea->builders)); fprintf(fp, "VNUMs %d %d\n", pArea->lvnum, pArea->uvnum); fprintf(fp, "Security %d\n", pArea->security); fprintf(fp, "Recall %d\n", pArea->recall); fprintf(fp, "End\n\n\n\n"); save_helps(fp, pArea); /* * OLC 1.1b */ save_mobiles(fp, pArea); new_save_objects(fp, pArea); /* * by Zen */ save_rooms(fp, pArea); if (IS_SET(pArea->area_flags, AREA_VERBOSE)) /* * OLC 1.1b */ { vsave_specials(fp, pArea); vsave_resets(fp, pArea); vsave_shops(fp, pArea); } else { save_specials(fp, pArea); save_resets(fp, pArea); save_shops(fp, pArea); } fprintf(fp, "#$\n"); fclose(fp); fpReserve = fopen(NULL_FILE, "r"); return; } /* * OLC 1.1b * * Name: do_asave * Purpose: Entry point for saving area data. * Called by: interpreter(interp.c) */ void do_asave(CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; AREA_DATA *pArea; int value; if (!ch) /* * Do an autosave */ { send_to_all_char("A gentle breeze comes from the east.\n\r"); save_area_list(); for (pArea = area_first; pArea; pArea = pArea->next) { save_area(pArea); REMOVE_BIT(pArea->area_flags, AREA_CHANGED | AREA_ADDED); } send_to_all_char("After the breeze all seems calm.\n\r"); return; } argument = one_argument(argument, arg1); if (arg1[0] == '\0') { send_to_char("Syntax:\n\r", ch); send_to_char(" asave <vnum> - saves a particular area\n\r", ch); send_to_char(" asave list - saves the AREA.LST file\n\r", ch); send_to_char(" asave area - saves the area being edited\n\r", ch); send_to_char(" asave changed - saves all changed zones\n\r", ch); send_to_char(" asave world - saves the world! (db dump)\n\r", ch); send_to_char(" asave ^ verbose - saves in verbose mode\n\r", ch); send_to_char("\n\r", ch); return; } /* * Snarf the value (which need not be numeric). */ value = atoi(arg1); /* * Save the area of given vnum. */ /* * ---------------------------- */ if (!(pArea = get_area_data(value)) && is_number(arg1)) { send_to_char("That area does not exist.\n\r", ch); return; } if (is_number(arg1)) { if (!is_builder(ch, pArea)) { send_to_char("You are not a builder for this area.\n\r", ch); return; } save_area_list(); if (!str_cmp("verbose", argument)) SET_BIT(pArea->area_flags, AREA_VERBOSE); save_area(pArea); REMOVE_BIT(pArea->area_flags, AREA_VERBOSE); return; } /* * Save the world, only authorized areas. */ /* * -------------------------------------- */ if (!str_cmp("world", arg1)) { save_area_list(); for (pArea = area_first; pArea; pArea = pArea->next) { /* * Builder must be assigned this area. */ if (!is_builder(ch, pArea)) continue; if (!str_cmp("verbose", argument)) SET_BIT(pArea->area_flags, AREA_VERBOSE); save_area(pArea); REMOVE_BIT(pArea->area_flags, AREA_CHANGED | AREA_ADDED | AREA_VERBOSE); } send_to_char("You saved the world.\n\r", ch); send_to_all_char("Database saved.\n\r"); return; } /* * Save changed areas, only authorized areas. */ /* * ------------------------------------------ */ if (!str_cmp("changed", arg1)) { char buf[MAX_INPUT_LENGTH]; save_area_list(); send_to_char("Saved zones:\n\r", ch); sprintf(buf, "None.\n\r"); for (pArea = area_first; pArea; pArea = pArea->next) { /* * Builder must be assigned this area. */ if (!is_builder(ch, pArea)) continue; /* * Save changed areas. */ if (IS_SET(pArea->area_flags, AREA_CHANGED) || IS_SET(pArea->area_flags, AREA_ADDED)) { if (!str_cmp("verbose", argument)) SET_BIT(pArea->area_flags, AREA_VERBOSE); save_area(pArea); REMOVE_BIT(pArea->area_flags, AREA_CHANGED | AREA_ADDED | AREA_VERBOSE); sprintf(buf, "%24s - '%s'\n\r", pArea->name, pArea->filename); send_to_char(buf, ch); } } if (!str_cmp(buf, "None.\n\r")) send_to_char(buf, ch); return; } /* * Save the AREA.LST file. */ /* * ----------------------- */ if (!str_cmp(arg1, "list")) { save_area_list(); return; } /* * Save area being edited, if authorized. */ /* * -------------------------------------- */ if (!str_cmp(arg1, "area")) { /* * Find the area to save. */ switch (ch->desc->editor) { case ED_AREA: pArea = (AREA_DATA *) ch->desc->pEdit; break; case ED_ROOM: pArea = ch->in_room->area; break; case ED_OBJECT: pArea = ((OBJ_INDEX_DATA *) ch->desc->pEdit)->area; break; case ED_MOBILE: pArea = ((MOB_INDEX_DATA *) ch->desc->pEdit)->area; break; default: pArea = ch->in_room->area; break; } if (!is_builder(ch, pArea)) { send_to_char("You are not a builder for this area.\n\r", ch); return; } save_area_list(); if (!str_cmp("verbose", argument)) SET_BIT(pArea->area_flags, AREA_VERBOSE); save_area(pArea); REMOVE_BIT(pArea->area_flags, AREA_CHANGED | AREA_ADDED | AREA_VERBOSE); send_to_char("Area saved.\n\r", ch); return; } /* * Show correct syntax. */ /* * -------------------- */ do_asave(ch, ""); return; }