Here's a command (for version 3.1) that prints out to a file a quick snapshot of some key database files. In case you've ever wanted to peruse the data base from outside the game, but in a format more readable then the database files themselves (.obj, .mob, .zon, etc.) I didn't bother with the .wld files, since there are way too many rooms for this to be practical. Remember to add the command to the command table in interpreter.c! ACMD(do_output) { char buf[MAX_INPUT_LENGTH], buf2[MAX_STRING_LENGTH]; char output[PATH_MAX]; FILE *fpOut; int i, nr, dam = 0, cnt; one_argument(argument, buf); if (!*buf) { send_to_char(ch, "USAGE: output <mob | obj | zone>\r\n"); return; } else if (is_abbrev(buf, "mob")) { snprintf(output, sizeof(output), "%smob.db", MOB_PREFIX); fpOut = fopen(output, "wt"); if (!fpOut) { send_to_char(ch, "Couldn't open %smob.db for writing!\r\n", MOB_PREFIX); return; } for (cnt = 0; cnt <= LVL_IMPL; cnt++) { for (nr = 0; nr <= top_of_mobt; nr++) { if (mob_proto[nr].player.level == cnt) fprintf(fpOut, "[%5d] [Level %2d] %s\r\n", mob_index[nr].vnum, mob_proto[nr].player.level, mob_proto[nr].player.short_descr); } } } else if (is_abbrev(buf, "obj")) { snprintf(output, sizeof(output), "%sobj.db", OBJ_PREFIX); fpOut = fopen(output, "wt"); if (!fpOut) { send_to_char(ch, "Couldn't open %sobj.db for writing!\r\n", OBJ_PREFIX); return; } for (cnt = 1; cnt < NUM_ITEMS; cnt++) { for (nr = 0; nr <= top_of_objt; nr++) { if (obj_proto[nr].obj_flags.type_flag != cnt) continue; fprintf(fpOut, "[%5d] [Type: %13s] %33s", obj_index[nr].vnum, item_types[obj_proto[nr].obj_flags.type_flag], obj_proto[nr].short_description); if (obj_proto[nr].obj_flags.type_flag == ITEM_WEAPON) { dam = (obj_proto[nr].obj_flags.value[2] + 1.0) / 2.0; dam *= (obj_proto[nr].obj_flags.value[1]); for (i = 0; i < MAX_OBJ_AFFECT; i++) { if (obj_proto[nr].affected[i].location == APPLY_DAMROLL || obj_proto[nr].affected[i].location == APPLY_HIT_N_DAM) dam += obj_proto[nr].affected[i].modifier; } fprintf(fpOut, ", Avg Dam: %2d, Type: %s", dam, attack_hit_text[obj_proto[nr].obj_flags.value[3]].singular); } /* If it is a weapon */ else if (obj_proto[nr].obj_flags.type_flag == ITEM_ARMOR) { fprintf(fpOut, ", AC: %2d", obj_proto[nr].obj_flags.value[0]); for (dam = 0, i = 0; i < MAX_OBJ_AFFECT; i++) { if (obj_proto[nr].affected[i].location == APPLY_AC) dam += obj_proto[nr].affected[i].modifier; } if (dam) fprintf(fpOut, ", APPLY_AC: %d", dam); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_LIGHT) { fprintf(fpOut, ", Duration: %2d", obj_proto[nr].obj_flags.value[2]); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_SCROLL || obj_proto[nr].obj_flags.type_flag == ITEM_POTION) { fprintf(fpOut, ", Spells: (Level %2d) %s, %s, %s", obj_proto[nr].obj_flags.value[0], skill_name(obj_proto[nr].obj_flags.value[1]), skill_name(obj_proto[nr].obj_flags.value[2]), skill_name(obj_proto[nr].obj_flags.value[3])); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_WAND || obj_proto[nr].obj_flags.type_flag == ITEM_STAFF) { fprintf(fpOut, ", Level: %2d, Charges: %2d, Spell: %s", obj_proto[nr].obj_flags.value[0], obj_proto[nr].obj_flags.value[1], skill_name(obj_proto[nr].obj_flags.value[3])); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_CONTAINER) { fprintf(fpOut, ", Capacity: %d", obj_proto[nr].obj_flags.value[0]); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_TREASURE) { fprintf(fpOut, ", Cost: %d", obj_proto[nr].obj_flags.cost); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_DRINKCON || obj_proto[nr].obj_flags.type_flag == ITEM_FOUNTAIN) { sprinttype(obj_proto[nr].obj_flags.value[2], drinks, buf2, sizeof(buf2)); fprintf(fpOut, ", Capacity: %5d, Poisoned: %3s, Liquid: %s", obj_proto[nr].obj_flags.value[0], YESNO(obj_proto[nr].obj_flags.value[3]), buf2); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_FOOD) { fprintf(fpOut, ", Makes Full: %2d, Posioned: %3s", obj_proto[nr].obj_flags.value[0], YESNO(obj_proto[nr].obj_flags.value[3])); } else if (obj_proto[nr].obj_flags.type_flag == ITEM_MONEY) { fprintf(fpOut, ", Coins: %d", obj_proto[nr].obj_flags.value[0]); } fprintf(fpOut, "\r\n"); } } } else if (is_abbrev(buf, "zone")) { snprintf(output, sizeof(output), "%szon.db", ZON_PREFIX); fpOut = fopen(output, "wt"); if (!fpOut) { send_to_char(ch, "Couldn't open %szon.db for writing!\r\n", ZON_PREFIX); return; } for (i = 0; i <= top_of_zone_table; i++) { fprintf(fpOut, "[%5d] %s\r\n", zone_table[i].number, zone_table[i].name); } } else { send_to_char(ch, "USAGE: output <mob | obj | zone>\r\n"); return; } if (fpOut) fclose(fpOut); send_to_char(ch, "%s", OK); } ____________________________________________________________ Get 25MB of email storage with Lycos Mail Plus! Sign up today -- http://www.mail.lycos.com/brandPage.shtml?pageId=plus -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | | Newbie List: http://groups.yahoo.com/group/circle-newbies/ | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/26/03 PDT