I can't think of how many times I've had to jump into zedit just to peek at what a room would load up on a reset. This is a handy way to get around that chaos. ;) All in act.wizard.c ******************** +/* Check the previous command in the list to determine whether + * it was used in the same room or not + */ +bool check_same_room(int zone, int subcmd, room_rnum rnum) +{ + sprintf(buf, "subcmd is %d", subcmd); + log(buf); + + if (subcmd <= 0) /* Looks like we're already at the bottom, tough luck */ + return FALSE; + + if (ZCMD(zone, (subcmd-1)).if_flag) { /* Need to go back another command */ + if (check_same_room(zone, (subcmd - 1), rnum) != TRUE) + return FALSE; /* Checking previous command found no match to the rnum */ + else + return TRUE; /* Found it! */ + } else { + switch (ZCMD(zone, (subcmd-1)).command){ + case 'M': /* Mobile */ + case 'V': /* Variable - Used with DG Scripts, omit this case if you don't use them*/ + case 'O': /* Object */ + if (ZCMD(zone, (subcmd-1)).arg3 == rnum) + return TRUE; + break; + case 'R': /* Room */ + case 'D': /* Door */ + if (ZCMD(zone, (subcmd-1)).arg1 == rnum) + return TRUE; + break; + default: break; + } + } + return FALSE; +} + +/* Called from vstat - show the zone reset information for + * the specified room + */ +void do_zstat_room(struct char_data *ch, zone_rnum rnum) +{ + int zone = world[rnum].zone; + int subcmd = 0, counter = 0; + room_vnum rvnum = GET_ROOM_VNUM(rnum); + extern struct char_data *mob_proto; + extern struct obj_data *obj_proto; + char output[MAX_STRING_LENGTH]; + bool found; + + sprintbit(zone_table[zone].zone_flags, zone_bits, buf1); + + sprintf(buf, + "Zone number : %d [%4d]\r\n" + "Zone name : %s\r\n" + "Builders : %s\r\n" + "Zone Flags : %s\r\n", + zone_table[zone].number, rvnum, zone_table[zone].name ? zone_table[zone].name : "", + zone_table[zone].builders ? zone_table[zone].builders : "", buf1); + send_to_char(buf, ch); + + if (!(ZCMD(zone, subcmd).command)){ + send_to_char("No zone loading information.\r\n", ch); + return; + } + + sprintf(output, "--------------------------------------------------\r\n"); + while ((ZCMD(zone, subcmd).command) && (ZCMD(zone, subcmd).command != 'S')) { + found = FALSE; + /* + * Translate what the command means. + */ + + /* If this is a "then do this" command, we need to check that the previous + * command was issued in this room + */ + if (ZCMD(zone, subcmd).if_flag == TRUE){ + if (check_same_room(zone, subcmd, rnum) == FALSE){ + subcmd++; + continue; /* not this room */ + } + } + switch (ZCMD(zone, subcmd).command) { + case 'M': + if (ZCMD(zone, subcmd).arg3 != rnum) + break; /* not this room */ + sprintf(buf2, "%sLoad %s [%d], Max : %d", + ZCMD(zone, subcmd).if_flag ? " then " : "", + mob_proto[ZCMD(zone, subcmd).arg1].player.short_descr, + mob_index[ZCMD(zone, subcmd).arg1].vnum, ZCMD(zone, subcmd).arg2); + found = TRUE; + break; + case 'G': + sprintf(buf2, "%sGive it %s [%d], Max : %d", + ZCMD(zone, subcmd).if_flag ? " then " : "", + obj_proto[ZCMD(zone, subcmd).arg1].short_description, + obj_index[ZCMD(zone, subcmd).arg1].vnum, + ZCMD(zone, subcmd).arg2); + found = TRUE; + break; + case 'O': + if (ZCMD(zone, subcmd).arg3 != rnum) + break; /* not this room */ + sprintf(buf2, "%sLoad %s [%d], Max : %d", + ZCMD(zone, subcmd).if_flag ? " then " : "", + obj_proto[ZCMD(zone, subcmd).arg1].short_description, + obj_index[ZCMD(zone, subcmd).arg1].vnum, + ZCMD(zone, subcmd).arg2); + found = TRUE; + break; + case 'E': + sprintf(buf2, "%sEquip with %s [%d], %s, Max : %d", + ZCMD(zone, subcmd).if_flag ? " then " : "", + obj_proto[ZCMD(zone, subcmd).arg1].short_description, + obj_index[ZCMD(zone, subcmd).arg1].vnum, + equipment_types[ZCMD(zone, subcmd).arg3], + ZCMD(zone, subcmd).arg2); + + found = TRUE; + break; + case 'P': + sprintf(buf2, "%sPut %s [%d] in %s [%d], Max : %d", + ZCMD(zone, subcmd).if_flag ? " then " : "", + obj_proto[ZCMD(zone, subcmd).arg1].short_description, + obj_index[ZCMD(zone, subcmd).arg1].vnum, + obj_proto[ZCMD(zone, subcmd).arg3].short_description, + obj_index[ZCMD(zone, subcmd).arg3].vnum, + ZCMD(zone, subcmd).arg2); + found = TRUE; + break; + case 'R': + if (ZCMD(zone, subcmd).arg1 != rnum) + break; // not this room + sprintf(buf2, "%sRemove %s [%d] from room.", + ZCMD(zone, subcmd).if_flag ? " then " : "", + obj_proto[ZCMD(zone, subcmd).arg2].short_description, + obj_index[ZCMD(zone, subcmd).arg2].vnum); + found = TRUE; + break; + case 'D': + if (ZCMD(zone, subcmd).arg1 != rnum) + break; /* not this room */ + sprintf(buf2, "%sSet door %s as %s.", + ZCMD(zone, subcmd).if_flag ? " then " : "", + dirs[ZCMD(zone, subcmd).arg2], + ZCMD(zone, subcmd).arg3 ? ((ZCMD(zone, subcmd).arg3 == 1) ? ((ZCMD(zone, subcmd).arg3 == 2) ? "hidden" : "closed") : "locked") : "open"); + found = TRUE; + break; + case 'T': /* Omit this case if the latest version of DGScripts is not installed */ + sprintf(buf2, "%sAttach trigger %s [%d] to %s", + ZCMD(zone, subcmd).if_flag ? " then " : "", + trig_index[real_trigger(ZCMD(zone, subcmd).arg2)]->proto->name, + ZCMD(zone, subcmd).arg2, + ((ZCMD(zone, subcmd).arg1 == MOB_TRIGGER) ? "mobile" : + ((ZCMD(zone, subcmd).arg1 == OBJ_TRIGGER) ? "object" : + ((ZCMD(zone, subcmd).arg1 == WLD_TRIGGER)? "room" : "????")))); + found = TRUE; + break; + case 'V': /* Omit this case if the latest version of DGScripts is not installed */ + if (ZCMD(zone, subcmd).arg1 != WLD_TRIGGER) + break; /* not a world trigger then it doesn't concern us. */ + if (ZCMD(zone, subcmd).arg3 != rnum) + break; /* not this room */ + sprintf(buf2, "%sAssign global %s:%d to %s = %s", + ZCMD(zone, subcmd).if_flag ? " then " : "", + ZCMD(zone, subcmd).sarg1, ZCMD(zone, subcmd).arg2, + ((ZCMD(zone, subcmd).arg1 == MOB_TRIGGER) ? "mobile" : + ((ZCMD(zone, subcmd).arg1 == OBJ_TRIGGER) ? "object" : + ((ZCMD(zone, subcmd).arg1 == WLD_TRIGGER)? "room" : "????"))), + ZCMD(zone, subcmd).sarg2); + found = TRUE; + break; + default: /* Catch all */ + sprintf(buf2, ""); + found = TRUE; + break; + } + /* + * Build the display buffer for this command. + * Only show things that apply to this room. + */ + if (found == TRUE){ + sprintf(buf1, "%d - %s\r\n", counter++, buf2); + strcat(output, buf1); + } + subcmd++; + } + send_to_char(output, ch); + +} + ACMD(do_vstat) { struct char_data *mob; struct obj_data *obj; mob_vnum number; /* or obj_vnum ... */ mob_rnum r_num; /* or obj_rnum ... */ two_arguments(argument, buf, buf2); if (!*buf || !*buf2 || !isdigit(*buf2)) { ! send_to_char("Usage: vstat { obj | mob | room } \r\n", ch); return; } if ((number = atoi(buf2)) < 0) { send_to_char("A NEGATIVE number??\r\n", ch); return; } if (is_abbrev(buf, "mob")) { if ((r_num = real_mobile(number)) < 0) { send_to_char("There is no monster with that number.\r\n", ch); return; } mob = read_mobile(r_num, REAL); char_to_room(mob, 0); do_stat_character(ch, mob); extract_char(mob); } else if (is_abbrev(buf, "obj")) { if ((r_num = real_object(number)) < 0) { send_to_char("There is no object with that number.\r\n", ch); return; } obj = read_object(r_num, REAL); do_stat_object(ch, obj); extract_obj(obj); + } else if (is_abbrev(buf, "room")){ + if ((r_num = real_room(number)) < 0) { + send_to_char("That room does not exist.\r\n", ch); + return; + } + do_zstat_room(ch, r_num); } else ! send_to_char("That'll have to be either 'obj' or 'mob' or 'room'.\r\n", ch); }