/* * Save all the zone_table for this zone to disk. This function now * writes simple comments in the form of (<name>) to each record. A * header for each field is also there. */ int save_zone(zone_rnum zone_num) { int subcmd, arg1 = -1, arg2 = -1, arg3 = -1, arg4 = -1, arg5 = -1; char fname[128], oldname[128]; const char *comment = NULL; FILE *zfile; char zbuf1[MAX_STRING_LENGTH]; char zbuf2[MAX_STRING_LENGTH]; char zbuf3[MAX_STRING_LENGTH]; char zbuf4[MAX_STRING_LENGTH]; #if CIRCLE_UNSIGNED_INDEX if (zone_num == NOWHERE || zone_num > top_of_zone_table) { #else if (zone_num < 0 || zone_num > top_of_zone_table) { #endif log("SYSERR: GenOLC: save_zone: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } snprintf(fname, sizeof(fname), "%s%d.new", ZON_PREFIX, zone_table[zone_num].number); if (!(zfile = fopen(fname, "w"))) { mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: save_zones: Can't write zone %d.", zone_table[zone_num].number); return FALSE; } /* * Print zone header to file */ sprintascii(zbuf1, zone_table[zone_num].zone_flags[0]); sprintascii(zbuf2, zone_table[zone_num].zone_flags[1]); sprintascii(zbuf3, zone_table[zone_num].zone_flags[2]); sprintascii(zbuf4, zone_table[zone_num].zone_flags[3]); fprintf(zfile, "@Version: %d\n", CUR_ZONE_VERSION); fprintf(zfile, "#%d\n" "%s~\n" "%s~\n" "%d %d %d %d %s %s %s %s %d %d\n", zone_table[zone_num].number, (zone_table[zone_num].builders && *zone_table[zone_num].builders) ? zone_table[zone_num].builders : "None.", (zone_table[zone_num].name && *zone_table[zone_num].name) ? zone_table[zone_num].name : "undefined", genolc_zone_bottom(zone_num), zone_table[zone_num].top, zone_table[zone_num].lifespan, zone_table[zone_num].reset_mode, zbuf1, zbuf2, zbuf3, zbuf4, zone_table[zone_num].min_level, zone_table[zone_num].max_level ); /* * Handy Quick Reference Chart for Zone Values. * * Field #1 Field #3 Field #4 Field #5 Field #6 Field #7 * ----------------------------------------------------------------------------------------- * M (Mobile) Mob-Vnum Wld-Max Room-Vnum room_max Percent load failure * O (Object) Obj-Vnum Wld-Max Room-Vnum room_max Percent load failure * G (Give) Obj-Vnum Wld-Max Unused unused Percent load failure * E (Equip) Obj-Vnum Wld-Max EQ-Position unused Percent load failure * P (Put) Obj-Vnum Wld-Max Target-Obj-Vnum unused Percent load failure * D (Door) Room-Vnum Door-Dir Door-State unused Percent load failure * R (Remove) Room-Vnum Obj-Vnum Unused unused Percent load failure * T (Trigger) Trig-type Trig-Vnum Room-Vnum unused Percent load failure * V (var) Trig-type Context Room-Vnum Varname unused Percent load failure * ----------------------------------------------------------------------------------------- */ for (subcmd = 0; ZCMD(zone_num, subcmd).command != 'S'; subcmd++) { switch (ZCMD(zone_num, subcmd).command) { case 'M': arg1 = mob_index[ZCMD(zone_num, subcmd).arg1].vnum; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = world[ZCMD(zone_num, subcmd).arg3].number; arg4 = ZCMD(zone_num, subcmd).arg4; arg5 = ZCMD(zone_num, subcmd).arg5; comment = mob_proto[ZCMD(zone_num, subcmd).arg1].player.short_descr; break; case 'O': arg1 = obj_index[ZCMD(zone_num, subcmd).arg1].vnum; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = world[ZCMD(zone_num, subcmd).arg3].number; arg4 = ZCMD(zone_num, subcmd).arg4; arg5 = ZCMD(zone_num, subcmd).arg5; comment = obj_proto[ZCMD(zone_num, subcmd).arg1].short_description; break; case 'G': arg1 = obj_index[ZCMD(zone_num, subcmd).arg1].vnum; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = -1; arg4 = -1; arg5 = ZCMD(zone_num, subcmd).arg5; comment = obj_proto[ZCMD(zone_num, subcmd).arg1].short_description; break; case 'E': arg1 = obj_index[ZCMD(zone_num, subcmd).arg1].vnum; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = ZCMD(zone_num, subcmd).arg3; arg4 = -1; arg5 = ZCMD(zone_num, subcmd).arg5; comment = obj_proto[ZCMD(zone_num, subcmd).arg1].short_description; break; case 'P': arg1 = obj_index[ZCMD(zone_num, subcmd).arg1].vnum; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = obj_index[ZCMD(zone_num, subcmd).arg3].vnum; arg4 = -1; arg5 = ZCMD(zone_num, subcmd).arg5; comment = obj_proto[ZCMD(zone_num, subcmd).arg1].short_description; break; case 'D': arg1 = world[ZCMD(zone_num, subcmd).arg1].number; arg2 = ZCMD(zone_num, subcmd).arg2; arg3 = ZCMD(zone_num, subcmd).arg3; comment = world[ZCMD(zone_num, subcmd).arg1].name; break; case 'R': arg1 = world[ZCMD(zone_num, subcmd).arg1].number; arg2 = obj_index[ZCMD(zone_num, subcmd).arg2].vnum; comment = obj_proto[ZCMD(zone_num, subcmd).arg2].short_description; arg3 = -1; break; case 'T': arg1 = ZCMD(zone_num, subcmd).arg1; /* trigger type */ arg2 = trig_index[ZCMD(zone_num, subcmd).arg2]->vnum; /* trigger vnum */ arg3 = world[ZCMD(zone_num, subcmd).arg3].number; /* room num */ arg4 = -1; arg5 = ZCMD(zone_num, subcmd).arg5; comment = GET_TRIG_NAME(trig_index[real_trigger(arg2)]->proto); break; case 'V': arg1 = ZCMD(zone_num, subcmd).arg1; /* trigger type */ arg2 = ZCMD(zone_num, subcmd).arg2; /* context */ arg3 = world[ZCMD(zone_num, subcmd).arg3].number; arg4 = -1; arg5 = ZCMD(zone_num, subcmd).arg5; break; case '*': /* * Invalid commands are replaced with '*' - Ignore them. */ continue; default: mudlog(BRF, LVL_BUILDER, TRUE, "SYSERR: OLC: z_save_to_disk(): Unknown cmd '%c' - NOT saving", ZCMD(zone_num, subcmd).command); continue; } if (ZCMD(zone_num, subcmd).command != 'V') fprintf(zfile, "%c %d %d %d %d %d %d \t(%s)\n", ZCMD(zone_num, subcmd).command, ZCMD(zone_num, subcmd).if_flag, arg1, arg2, arg3, arg4, arg5, comment); else fprintf(zfile, "%c %d %d %d %d %d %d %s %s\n", ZCMD(zone_num, subcmd).command, ZCMD(zone_num, subcmd).if_flag, arg1, arg2, arg3, arg4, arg5, ZCMD(zone_num, subcmd).sarg1, ZCMD(zone_num, subcmd).sarg2); } fputs("S\n$\n", zfile); fclose(zfile); snprintf(oldname, sizeof(oldname), "%s%d.zon", ZON_PREFIX, zone_table[zone_num].number); remove(oldname); rename(fname, oldname); if (in_save_list(zone_table[zone_num].number, SL_ZON)) { remove_from_save_list(zone_table[zone_num].number, SL_ZON); create_world_index(zone_table[zone_num].number, "zon"); log("GenOLC: save_zone: Saving zone '%s'", oldname); } return TRUE; } /*-------------------------------------------------------------------*/ /* * Some common code to count the number of comands in the list. */ int count_commands(struct reset_com *list) { int count = 0; while (list[count].command != 'S') count++; return count; }
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, j; 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 (;;) { j = 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, (long)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.race != PFDEF_RACE) fprintf(outfile, "Race: %d\n", (int)player.race); 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 Obj_to_store(struct obj_data *obj, FILE *fp, int locate) { int counter2; struct extra_descr_data *ex_desc; char buf1[MAX_STRING_LENGTH +1]; char flags[65]; struct obj_data *temp = NULL; if (GET_OBJ_VNUM(obj) != NOTHING) temp=read_object(GET_OBJ_VNUM(obj), VIRTUAL); else { temp = create_obj(); temp->item_number = -1; } if (obj->action_description) { strcpy(buf1, obj->action_description); strip_string(buf1); } else *buf1 = 0; fprintf(fp, "#%d\n", GET_OBJ_VNUM(obj)); if (locate) fprintf(fp, "Loc : %d\n", locate); if (GET_OBJ_VAL(obj, 0) != GET_OBJ_VAL(temp, 0) || GET_OBJ_VAL(obj, 1) != GET_OBJ_VAL(temp, 1) || GET_OBJ_VAL(obj, 2) != GET_OBJ_VAL(temp, 2) || GET_OBJ_VAL(obj, 3) != GET_OBJ_VAL(temp, 3)) fprintf(fp, "Vals: %d %d %d %d\n", GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3) ); if (GET_OBJ_EXTRA(obj) != GET_OBJ_EXTRA(temp)) { sprintascii(flags, GET_OBJ_EXTRA(obj)); fprintf(fp, "Flag: %s\n", flags); } #define TEST_OBJS(obj1, obj2, field) ((!obj1->field || !obj2->field || \ strcmp(obj1->field, obj2->field))) #define TEST_OBJN(field) (obj->obj_flags.field != temp->obj_flags.field) if (TEST_OBJS(obj, temp, name)) fprintf(fp, "Name: %s\n", obj->name ? obj->name : "Undefined"); if (TEST_OBJS(obj, temp, short_description)) fprintf(fp, "Shrt: %s\n", obj->short_description ? obj->short_description : "Undefined"); /* These two could be a pain on the read... we'll see... */ if (TEST_OBJS(obj, temp, description)) fprintf(fp, "Desc: %s\n", obj->description ? obj->description : "Undefined"); /* Only even try to process this if an action desc exists */ if (obj->action_description || temp->action_description) if (TEST_OBJS(obj, temp, action_description)) fprintf(fp, "ADes:\n%s~\n", buf1); if (TEST_OBJN(type_flag)) fprintf(fp, "Type: %d\n", GET_OBJ_TYPE(obj)); if (TEST_OBJN(weight)) fprintf(fp, "Wght: %d\n", GET_OBJ_WEIGHT(obj)); if (TEST_OBJN(cost)) fprintf(fp, "Cost: %d\n", GET_OBJ_COST(obj)); if (TEST_OBJN(cost_per_day)) fprintf(fp, "Rent: %d\n", GET_OBJ_RENT(obj)); if (TEST_OBJN(bitvector)) { sprintascii(flags, obj->obj_flags.bitvector); fprintf(fp, "Perm: %s\n", flags); } if (TEST_OBJN(wear_flags)) { sprintascii(flags, GET_OBJ_WEAR(obj)); fprintf(fp, "Wear: %s\n", flags); } /* Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier != temp->affected[counter2].modifier) fprintf(fp, "Aff : %d %d %d\n", counter2, obj->affected[counter2].location, obj->affected[counter2].modifier ); /* Do we have extra descriptions? */ if (obj->ex_description || temp->ex_description) { /* To be reimplemented. Need to handle this case in loading as well */ if ((obj->ex_description && temp->ex_description && obj->ex_description != temp->ex_description) || !obj->ex_description || !temp->ex_description) { for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /*. Sanity check to prevent nasty protection faults . */ if (!*ex_desc->keyword || !*ex_desc->description) { continue; } strcpy(buf1, ex_desc->description); strip_string(buf1); fprintf(fp, "EDes:\n" "%s~\n" "%s~\n", ex_desc->keyword, buf1 ); } } } fprintf(fp, "\n"); extract_obj(temp); return 1; }
int save_quests(zone_rnum zone_num) { FILE *sf; char filename[128], oldname[128], quest_flags[MAX_STRING_LENGTH]; char quest_desc[MAX_STRING_LENGTH], quest_info[MAX_STRING_LENGTH]; char quest_done[MAX_STRING_LENGTH], quest_quit[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; int i, num_quests = 0; #if CIRCLE_UNSIGNED_INDEX if (zone_num == NOWHERE || zone_num > top_of_zone_table) { #else if (zone_num < 0 || zone_num > top_of_zone_table) { #endif log("SYSERR: GenOLC: save_quests: Invalid zone number %d passed! (0-%d)", zone_num, top_of_zone_table); return FALSE; } log("GenOLC: save_quests: Saving quests in zone #%d (%d-%d).", zone_table[zone_num].number, genolc_zone_bottom(zone_num), zone_table[zone_num].top); snprintf(filename, sizeof(filename), "%s/%d.new", QST_PREFIX, zone_table[zone_num].number); if (!(sf = fopen(filename, "w"))) { perror("SYSERR: save_quests"); return FALSE; } for (i = genolc_zone_bottom(zone_num); i <= zone_table[zone_num].top; i++) { qst_rnum rnum; if ((rnum = real_quest(i)) != NOTHING) { /* Copy the text strings and strip off trailing newlines. */ strncpy(quest_desc, QST_DESC(rnum) ? QST_DESC(rnum) : "undefined", sizeof(quest_desc)-1 ); strncpy(quest_info, QST_INFO(rnum) ? QST_INFO(rnum) : "undefined", sizeof(quest_info)-1 ); strncpy(quest_done, QST_DONE(rnum) ? QST_DONE(rnum) : "undefined", sizeof(quest_done)-1 ); strncpy(quest_quit, QST_QUIT(rnum) ? QST_QUIT(rnum) : "undefined", sizeof(quest_quit)-1 ); strip_cr(quest_desc); strip_cr(quest_info); strip_cr(quest_done); strip_cr(quest_quit); /* Save the quest details to the file. */ sprintascii(quest_flags, QST_FLAGS(rnum)); sprintf(buf, "#%d\n" "%s%c\n" "%s%c\n" "%s%c\n" "%s%c\n" "%s%c\n" "%d %d %s %d %d %d %d\n" "%d %d %d %d %d %d %d\n" "%d %d %d\n" "S\n", QST_NUM(rnum), QST_NAME(rnum) ? QST_NAME(rnum) : "Untitled", STRING_TERMINATOR, quest_desc, STRING_TERMINATOR, quest_info, STRING_TERMINATOR, quest_done, STRING_TERMINATOR, quest_quit, STRING_TERMINATOR, QST_TYPE(rnum), QST_MASTER(rnum) == NOBODY ? -1 : QST_MASTER(rnum), quest_flags, QST_TARGET(rnum) == NOTHING ? -1 : QST_TARGET(rnum), QST_PREV(rnum) == NOTHING ? -1 : QST_PREV(rnum), QST_NEXT(rnum) == NOTHING ? -1 : QST_NEXT(rnum), QST_PREREQ(rnum) == NOTHING ? -1 : QST_PREREQ(rnum), QST_POINTS(rnum), QST_PENALTY(rnum), QST_MINLEVEL(rnum), QST_MAXLEVEL(rnum), QST_TIME(rnum), QST_RETURNMOB(rnum) == NOBODY ? -1 : QST_RETURNMOB(rnum), QST_QUANTITY(rnum), QST_GOLD(rnum), QST_EXP(rnum), QST_OBJ(rnum) ); fprintf(sf, convert_from_tabs(buf), 0); num_quests++; } } /* Write the final line and close it. */ fprintf(sf, "$~\n"); fclose(sf); /* Old file we're replacing. */ snprintf(oldname, sizeof(oldname), "%s/%d.qst", QST_PREFIX, zone_table[zone_num].number); remove(oldname); rename(filename, oldname); /* Do we need to update the index file? */ if (num_quests > 0) create_world_index(zone_table[zone_num].number, "qst"); if (in_save_list(zone_table[zone_num].number, SL_QST)) remove_from_save_list(zone_table[zone_num].number, SL_QST); return TRUE; }
int save_objects(zone_rnum zone_num) { char fname[128], buf[MAX_STRING_LENGTH]; char ebuf1[MAX_STRING_LENGTH], ebuf2[MAX_STRING_LENGTH]; char ebuf3[MAX_STRING_LENGTH], ebuf4[MAX_STRING_LENGTH]; char wbuf1[MAX_STRING_LENGTH], wbuf2[MAX_STRING_LENGTH]; char wbuf3[MAX_STRING_LENGTH], wbuf4[MAX_STRING_LENGTH]; char pbuf1[MAX_STRING_LENGTH], pbuf2[MAX_STRING_LENGTH]; char pbuf3[MAX_STRING_LENGTH], pbuf4[MAX_STRING_LENGTH]; int counter, counter2, realcounter; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; #if CIRCLE_UNSIGNED_INDEX if (zone_num == NOWHERE || zone_num > top_of_zone_table) { #else if (zone_num < 0 || zone_num > top_of_zone_table) { #endif log("SYSERR: GenOLC: save_objects: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } snprintf(fname, sizeof(fname), "%s%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(fname, "w+"))) { mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: Cannot open objects file %s!", fname); return FALSE; } /* * Start running through all objects in this zone. */ for (counter = genolc_zone_bottom(zone_num); counter <= zone_table[zone_num].top; counter++) { if ((realcounter = real_object(counter)) != NOTHING) { if ((obj = &obj_proto[realcounter])->action_description) { strncpy(buf, obj->action_description, sizeof(buf) - 1); strip_cr(buf); } else *buf = '\0'; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n", GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : "undefined", (obj->short_description && *obj->short_description) ? obj->short_description : "undefined", (obj->description && *obj->description) ? obj->description : "undefined", buf); sprintascii(ebuf1, GET_OBJ_EXTRA(obj)[0]); sprintascii(ebuf2, GET_OBJ_EXTRA(obj)[1]); sprintascii(ebuf3, GET_OBJ_EXTRA(obj)[2]); sprintascii(ebuf4, GET_OBJ_EXTRA(obj)[3]); sprintascii(wbuf1, GET_OBJ_WEAR(obj)[0]); sprintascii(wbuf2, GET_OBJ_WEAR(obj)[1]); sprintascii(wbuf3, GET_OBJ_WEAR(obj)[2]); sprintascii(wbuf4, GET_OBJ_WEAR(obj)[3]); sprintascii(pbuf1, GET_OBJ_PERM(obj)[0]); sprintascii(pbuf2, GET_OBJ_PERM(obj)[1]); sprintascii(pbuf3, GET_OBJ_PERM(obj)[2]); sprintascii(pbuf4, GET_OBJ_PERM(obj)[3]); fprintf(fp, "%d %s %s %s %s %s %s %s %s %s %s %s %s\n" "%d %d %d %d\n" "%d %d %d %d\n", GET_OBJ_TYPE(obj), ebuf1, ebuf2, ebuf3, ebuf4, wbuf1, wbuf2, wbuf3, wbuf4, pbuf1, pbuf2, pbuf3, pbuf4, GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj) ); /* * Do we have script(s) attached ? */ script_save_to_disk(fp, obj, OBJ_TRIGGER); /* * Do we have extra descriptions? */ if (obj->ex_description) { /* Yes, save them too. */ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* * Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { mudlog(BRF, LVL_IMMORT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); continue; } strncpy(buf, ex_desc->description, sizeof(buf) - 1); strip_cr(buf); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf); } } /* * Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, obj->affected[counter2].modifier); } } /* * Write the final line, close the file. */ fprintf(fp, "$~\n"); fclose(fp); snprintf(buf, sizeof(buf), "%s%d.obj", OBJ_PREFIX, zone_table[zone_num].number); remove(buf); rename(fname, buf); if (in_save_list(zone_table[zone_num].number, SL_OBJ)) { remove_from_save_list(zone_table[zone_num].number, SL_OBJ); create_world_index(zone_table[zone_num].number, "obj"); log("GenOLC: save_objects: Saving objects '%s'", buf); } return TRUE; } /* * Free all, unconditionally. */ void free_object_strings(struct obj_data *obj) { #if 0 /* Debugging, do not enable. */ extern struct obj_data *object_list; struct obj_data *t; int i = 0; for (t = object_list; t; t = t->next) { if (t == obj) { i++; continue; } assert(obj->name != t->name); assert(obj->description != t->description); assert(obj->short_description != t->short_description); assert(obj->action_description != t->action_description); assert(obj->ex_description != t->ex_description); } assert(i <= 1); #endif if (obj->name) free(obj->name); if (obj->description) free(obj->description); if (obj->short_description) free(obj->short_description); if (obj->action_description) free(obj->action_description); if (obj->ex_description) free_ex_descriptions(obj->ex_description); } /* * For object instances that are not the prototype. */ void free_object_strings_proto(struct obj_data *obj) { int robj_num = GET_OBJ_RNUM(obj); if (obj->name && obj->name != obj_proto[robj_num].name) free(obj->name); if (obj->description && obj->description != obj_proto[robj_num].description) free(obj->description); if (obj->short_description && obj->short_description != obj_proto[robj_num].short_description) free(obj->short_description); if (obj->action_description && obj->action_description != obj_proto[robj_num].action_description) free(obj->action_description); if (obj->ex_description) { struct extra_descr_data *thised, *plist, *next_one; /* O(horrible) */ int ok_key, ok_desc, ok_item; for (thised = obj->ex_description; thised; thised = next_one) { next_one = thised->next; for (ok_item = ok_key = ok_desc = 1, plist = obj_proto[robj_num].ex_description; plist; plist = plist->next) { if (plist->keyword == thised->keyword) ok_key = 0; if (plist->description == thised->description) ok_desc = 0; if (plist == thised) ok_item = 0; } if (thised->keyword && ok_key) free(thised->keyword); if (thised->description && ok_desc) free(thised->description); if (ok_item) free(thised); } } }
int save_rooms(zone_rnum zone_num) { int i; struct room_data *room; FILE *sf; char filename[128]; char buf[MAX_STRING_LENGTH], buf1[MAX_STRING_LENGTH]; char rbuf1[MAX_STRING_LENGTH], rbuf2[MAX_STRING_LENGTH]; char rbuf3[MAX_STRING_LENGTH], rbuf4[MAX_STRING_LENGTH]; #if CIRCLE_UNSIGNED_INDEX if (zone_num == NOWHERE || zone_num > top_of_zone_table) { #else if (zone_num < 0 || zone_num > top_of_zone_table) { #endif log("SYSERR: GenOLC: save_rooms: Invalid zone number %d passed! (0-%d)", zone_num, top_of_zone_table); return FALSE; } log("GenOLC: save_rooms: Saving rooms in zone #%d (%d-%d).", zone_table[zone_num].number, genolc_zone_bottom(zone_num), zone_table[zone_num].top); snprintf(filename, sizeof(filename), "%s%d.new", WLD_PREFIX, zone_table[zone_num].number); if (!(sf = fopen(filename, "w"))) { perror("SYSERR: save_rooms"); return FALSE; } for (i = genolc_zone_bottom(zone_num); i <= zone_table[zone_num].top; i++) { room_rnum rnum; if ((rnum = real_room(i)) != NOWHERE) { int j; room = (world + rnum); /* * Copy the description and strip off trailing newlines. */ strncpy(buf, room->description ? room->description : "Empty room.", sizeof(buf)-1 ); strip_cr(buf); /* * Save the numeric and string section of the file. */ sprintascii(rbuf1, room->room_flags[0]); sprintascii(rbuf2, room->room_flags[1]); sprintascii(rbuf3, room->room_flags[2]); sprintascii(rbuf4, room->room_flags[3]); fprintf(sf, "#%d\n" "%s%c\n" "%s%c\n" "%d %s %s %s %s %d\n", room->number, room->name ? room->name : "Untitled", STRING_TERMINATOR, buf, STRING_TERMINATOR, zone_table[room->zone].number, rbuf1, rbuf2, rbuf3, rbuf4, room->sector_type ); /* * Now you write out the exits for the room. */ for (j = 0; j < NUM_OF_DIRS; j++) { if (R_EXIT(room, j)) { int dflag; if (R_EXIT(room, j)->general_description) { strncpy(buf, R_EXIT(room, j)->general_description, sizeof(buf)-1); strip_cr(buf); } else *buf = '\0'; /* * Figure out door flag. */ if (IS_SET(R_EXIT(room, j)->exit_info, EX_ISDOOR)) { if (IS_SET(R_EXIT(room, j)->exit_info, EX_SECRET) && IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF)) dflag = 4; else if (IS_SET(R_EXIT(room, j)->exit_info, EX_SECRET)) dflag = 3; else if (IS_SET(R_EXIT(room, j)->exit_info, EX_PICKPROOF)) dflag = 2; else dflag = 1; } else dflag = 0; if (R_EXIT(room, j)->keyword) strncpy(buf1, R_EXIT(room, j)->keyword, sizeof(buf1)-1 ); else *buf1 = '\0'; /* * Now write the exit to the file. */ fprintf(sf, "D%d\n" "%s~\n" "%s~\n" "%d %d %d\n", j, buf, buf1, dflag, R_EXIT(room, j)->key != NOTHING ? R_EXIT(room, j)->key : -1, R_EXIT(room, j)->to_room != NOWHERE ? world[R_EXIT(room, j)->to_room].number : -1); } } if (room->ex_description) { struct extra_descr_data *xdesc; for (xdesc = room->ex_description; xdesc; xdesc = xdesc->next) { strncpy(buf, xdesc->description, sizeof(buf)); strip_cr(buf); fprintf(sf, "E\n" "%s~\n" "%s~\n", xdesc->keyword, buf); } } fprintf(sf, "S\n"); script_save_to_disk(sf, room, WLD_TRIGGER); } } /* * Write the final line and close it. */ fprintf(sf, "$~\n"); fclose(sf); /* Old file we're replacing. */ snprintf(buf, sizeof(buf), "%s%d.wld", WLD_PREFIX, zone_table[zone_num].number); remove(buf); rename(filename, buf); if (in_save_list(zone_table[zone_num].number, SL_WLD)) { remove_from_save_list(zone_table[zone_num].number, SL_WLD); create_world_index(zone_table[zone_num].number, "wld"); log("GenOLC: save_rooms: Saving rooms '%s'", buf); } return TRUE; } int copy_room(struct room_data *to, struct room_data *from) { free_room_strings(to); *to = *from; copy_room_strings(to, from); /* Don't put people and objects in two locations. Am thinking this shouldn't be done here... */ from->people = NULL; from->contents = NULL; return TRUE; }
/* * NOTE: This clobbers all of the global variable strings. Do not * save anything in them around calls to this function. * * buf, buf1, buf2, arg */ int save_objects(zone_rnum zone_num) { char buf[MAX_STRING_LENGTH]; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; char arg[MAX_STRING_LENGTH]; int counter, counter2, realcounter, i; FILE *fp; struct obj_data *obj; struct extra_descr_data *ex_desc; if (zone_num == NOTHING || zone_num > top_of_zone_table) { log("SYSERR: GenOLC: save_objects: Invalid real zone number %d. (0-%d)", zone_num, top_of_zone_table); return FALSE; } sprintf(buf, "%s/%d.new", OBJ_PREFIX, zone_table[zone_num].number); if (!(fp = fopen(buf, "w+"))) { mudlog(BRF, LVL_SAINT, TRUE, "SYSERR: OLC: Cannot open objects file!"); return FALSE; } /* * Start running through all objects in this zone. */ for (counter = genolc_zone_bottom(zone_num); counter <= zone_table[zone_num].top; counter++) { if ((realcounter = real_object(counter)) != NOTHING) { if ((obj = &obj_proto[realcounter])->action_description) { buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, obj->action_description, MAX_STRING_LENGTH - 1); strip_cr(buf1); } else *buf1 = '\0'; fprintf(fp, "#%d\n" "%s~\n" "%s~\n" "%s~\n" "%s~\n", GET_OBJ_VNUM(obj), (obj->name && *obj->name) ? obj->name : STRING_UNDEFINED, (obj->short_description && *obj->short_description) ? obj->short_description : STRING_UNDEFINED, (obj->description && *obj->description) ? obj->description : STRING_UNDEFINED, buf1); sprintasciilong(buf1, GET_OBJ_EXTRA(obj)); sprintasciilong(buf3, GET_OBJ_CLASS(obj)); sprintascii(buf2, GET_OBJ_WEAR(obj)); sprintasciilong(arg, GET_OBJ_PERM(obj)); fprintf(fp, "%d %s %s %s %s\n" "%d %d %d %d %d\n" "%d %d %d %d %d\n", GET_OBJ_TYPE(obj), buf1, buf2, arg, buf3, GET_OBJ_VAL(obj, 0), GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2), GET_OBJ_VAL(obj, 3), GET_OBJ_SIZE(obj), GET_OBJ_WEIGHT(obj), GET_OBJ_COST(obj), GET_OBJ_RENT(obj), GET_OBJ_LEVEL(obj), GET_OBJ_MAX_LEVEL(obj) ); /* * Do we have script(s) attached ? */ script_save_to_disk(fp, obj, OBJ_TRIGGER); /* save resists */ for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->resist[i] == 1) fprintf(fp, "R\n%d %d\n",i, obj->resist[i]); } for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->vulnerable[i] == 1) fprintf(fp, "V\n%d %d\n",i, obj->vulnerable[i]); } for (i = 0; i < MAX_ATTACK_TYPES; i++) { if(obj->immune[i] == 1) fprintf(fp, "I\n%d %d\n",i, obj->immune[i]); } /* * Do we have extra descriptions? */ if (obj->ex_description) { /* Yes, save them too. */ for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) { /* * Sanity check to prevent nasty protection faults. */ if (!ex_desc->keyword || !ex_desc->description || !*ex_desc->keyword || !*ex_desc->description) { mudlog(BRF, LVL_SAINT, TRUE, "SYSERR: OLC: oedit_save_to_disk: Corrupt ex_desc!"); continue; } buf1[MAX_STRING_LENGTH - 1] = '\0'; strncpy(buf1, ex_desc->description, MAX_STRING_LENGTH - 1); strip_cr(buf1); fprintf(fp, "E\n" "%s~\n" "%s~\n", ex_desc->keyword, buf1); } } /* * Do we have affects? */ for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++) if (obj->affected[counter2].modifier) fprintf(fp, "A\n" "%d %d\n", obj->affected[counter2].location, obj->affected[counter2].modifier); } } /* * Write the final line, close the file. */ fprintf(fp, "$~\n"); fclose(fp); sprintf(buf2, "%s/%d.obj", OBJ_PREFIX, zone_table[zone_num].number); remove(buf2); rename(buf, buf2); remove_from_save_list(zone_table[zone_num].number, SL_OBJ); return TRUE; }