/* ************************************************************************ * File: act.wizard1.c Part of CircleMUD * * Usage: Player-level god commands and other goodies * * * * All rights reserved. See license.doc for complete information. * * * * Copyright (C) 1993 by the Trustees of the Johns Hopkins University * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ /* Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "limits.h" #include "screen.h" #include "shop.h" /* external vars */ extern FILE *player_fl; extern struct shop_data *shop_index; extern struct room_data *world; extern struct char_data *character_list; extern struct obj_data *object_list; extern struct descriptor_data *descriptor_list; extern struct index_data *mob_index; extern struct char_data *mob_proto; extern struct index_data *obj_index; extern struct int_app_type int_app[36]; extern struct wis_app_type wis_app[36]; extern struct list_index_type npc_races[]; extern struct zone_data *zone_table; extern struct player_index_element *player_table; extern struct obj_limit_list_type *obj_limit_table; extern struct obj_data *obj_proto; extern int top_of_zone_table; extern int restrict; extern int top_of_world; extern int top_of_mobt; extern int top_of_objt; extern int top_of_p_table; extern int top_of_ol_table; extern struct str_app_type str_app[]; /* for objects */ extern char *item_types[]; extern char *wear_bits[]; extern char *extra_bits[]; extern char *drinks[]; extern char *sizes[]; extern char *damage_state[]; /* for rooms */ extern char *dirs[]; extern char *room_bits[]; extern char *exit_bits[]; extern char *sector_types[]; /* for chars */ extern char *spells[]; extern char *skills_list[]; extern char *equipment_types[]; extern char *affected_bits[]; extern char *apply_types[]; extern char *pc_race_types[]; extern char *npc_class_types[]; extern char *action_bits[]; extern char *player_bits[]; extern char *preference_bits[]; extern char *position_types[]; extern char *connected_types[]; extern struct dual_list_type attack_hit_text[]; extern struct list_index_type TechForms[]; /* external functs */ void reset_zone(int zone); char *find_spell_name(int spl); char *find_skill_name(int spl); char *rev_search_list(int num, struct list_index_type *list); void zone_save_equipment(int zone,struct char_data *ch,struct char_data *victm); void zone_save_put_obj(int zone,struct char_data *ch, struct obj_data *obj); ACMD(do_look); void parse_text(struct char_data *c,struct char_data *vict,int mode,char *text); void print_obj(struct descriptor_data *d); void print_mob(struct descriptor_data *d); void print_room(struct descriptor_data *d); void print_shop(struct descriptor_data *d); void save_all_object_limit_data(void); int save_zone(int zone); int save_mobiles(int zone); int save_objects(int zone); int save_shops(int zone); int save_rooms(int zone); int create_zreset(int zn); int destroy_zreset(int zn, int no); int create_zone(int zone); int create_mob(int zone); int create_obj(int zone); int create_room(int zone); int create_shop(int zone); void make_dummy_mob(int i); void make_dummy_obj(int i); void make_dummy_room(int i); void clone_mob(int from, int to); void clone_room(int from, int to); void copy_room(struct room_data *from, struct room_data *to); void copy_shop(struct shop_data *from, struct shop_data *to); void copy_mob(struct char_data *from, struct char_data *to); void copy_obj(struct obj_data *from, struct obj_data *to, bool copy_extra); void do_stat_shop(struct char_data *ch, struct shop_data *shop); ACMD(do_emote) { int i; if (IS_NPC(ch)) return; for (i = 0; *(argument + i) == ' '; i++) ; if (!*(argument + i)) send_to_char("Yes.. But what?\r\n", ch); else { sprintf(buf, "$n %s", argument + i); act(buf, FALSE, ch, 0, 0, TO_ROOM); if (PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char("Ok.\r\n", ch); else act(buf, FALSE, ch, 0, 0, TO_CHAR); } } ACMD(do_send) { struct char_data *vict; half_chop(argument, arg, buf); if (!*arg) { send_to_char("Send what to who?\r\n", ch); return; } if (!(vict = get_char_vis(ch, arg))) { send_to_char("No such person around.\r\n", ch); return; } send_to_char(buf, vict); send_to_char("\r\n", vict); if (PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char("Sent.\r\n", ch); else { sprintf(buf2, "You send '%s' to %s.\r\n", buf, GET_NAME(vict)); send_to_char(buf2, ch); } } ACMD(do_echo) { int i; if (IS_NPC(ch)) return; for (i = 0; *(argument + i) == ' '; i++) ; if (!*(argument + i)) send_to_char("That must be a mistake...\r\n", ch); else { sprintf(buf, "%s\r\n", argument + i); send_to_room_except(buf, ch->in_room, ch, FALSE); if (PRF_FLAGGED(ch, PRF_NOREPEAT)) send_to_char("Ok.\r\n", ch); else send_to_char(buf, ch); if(GET_LEVEL(ch) < LEVEL_IMPL){ sprintf(buf,"(GC) %s echoed %s in %d",GET_NAME(ch),argument + i, world[ch->in_room].number); mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE); } } } /* take a string, and return an rnum.. used for goto, at, etc. -je 4/6/93 */ sh_int find_target_room(struct char_data *ch, char *rawroomstr) { int tmp; sh_int location; struct char_data *target_mob; struct obj_data *target_obj; char roomstr[MAX_INPUT_LENGTH]; one_argument(rawroomstr, roomstr); if (!*roomstr) { send_to_char("You must supply a room number or name.\r\n", ch); return NOWHERE; } if (isdigit(*roomstr) && !strchr(roomstr, '.')) { tmp = atoi(roomstr); if ((location = real_room(tmp)) < 0) { send_to_char("No room exists with that number.\r\n", ch); return NOWHERE; } } else if ((target_mob = get_char_vis(ch, roomstr))) location = target_mob->in_room; else if ((target_obj = get_obj_vis(ch, roomstr))) { if (target_obj->in_room != NOWHERE) location = target_obj->in_room; else { send_to_char("That object is not available.\r\n", ch); return NOWHERE; } } else { send_to_char("No such creature or object around.\r\n", ch); return NOWHERE; } /* a location has been found. */ if (IS_SET(world[location].room_flags, GODROOM) && GET_LEVEL(ch) < LEVEL_GRGOD) { send_to_char("You are not godly enough to use that room!\r\n", ch); return NOWHERE; } if (IS_SET(world[location].room_flags, UNFINISHED) && (GET_LEVEL(ch) < LEVEL_BUILDER)){ send_to_char("That room is not ready yet.\r\n", ch); return NOWHERE; } if (!zone_table[world[location].zone].open && (GET_LEVEL(ch) < LEVEL_BUILDER)){ send_to_char("That zone is closed.\r\n", ch); return NOWHERE; } if (IS_SET(world[location].room_flags, PRIVATE) && GET_LEVEL(ch) < LEVEL_GRGOD) if (world[location].people && world[location].people->next_in_room) { send_to_char("There's a private conversation going on in that room.\r\n", ch); return NOWHERE; } return location; } ACMD(do_at) { char command[MAX_INPUT_LENGTH]; int location, original_loc; if (IS_NPC(ch)) return; half_chop(argument, buf, command); if (!*buf) { send_to_char("You must supply a room number or a name.\r\n", ch); return; } if ((location = find_target_room(ch, buf)) < 0) return; /* a location has been found. */ original_loc = ch->in_room; char_from_room(ch); char_to_room(ch, location, FALSE); command_interpreter(ch, command); /* check if the guy's still there */ if (ch->in_room == location) { char_from_room(ch); char_to_room(ch, original_loc, FALSE); } } ACMD(do_goto) { sh_int location; struct char_data *tch; if (IS_NPC(ch)) return; if ((GET_LEVEL(ch) < LEVEL_BUILDER) && ch->specials.fighting){ send_to_char("No Way! You are fighting for your life!\r\n",ch); return; } if ((location = find_target_room(ch, argument)) < 0) return; for (tch=world[ch->in_room].people;tch;tch = tch->next_in_room){ parse_text(ch,tch,2,buf2); sprintf(buf, "%s", buf2); if (!(GET_INVIS_LEV(ch) > GET_LEVEL(tch) && GET_LEVEL(ch) >= LEVEL_ASS_IMPL)) act(buf, TRUE, ch, 0, tch, TO_VICT);} char_from_room(ch); char_to_room(ch, location, FALSE); for (tch=world[location].people;tch;tch = tch->next_in_room){ parse_text(ch,tch,1,buf2); sprintf(buf, "%s", buf2); if (!(GET_INVIS_LEV(ch) > GET_LEVEL(tch) && GET_LEVEL(ch) >= LEVEL_ASS_IMPL)) act(buf, TRUE, ch, 0, tch, TO_VICT);} do_look(ch, "", 0, 0); } ACMD(do_trans) { struct descriptor_data *i; struct char_data *victim; if (IS_NPC(ch)) return; one_argument(argument, buf); if (!*buf) send_to_char("Whom do you wish to transfer?\r\n", ch); else if (str_cmp("all", buf)) { if (!(victim = get_char_vis(ch, buf))) send_to_char("No-one by that name around.\r\n", ch); else if (victim == ch) send_to_char("That doesn't make much sense, does it?\r\n", ch); else { if ((GET_LEVEL(ch) < GET_LEVEL(victim)) && !IS_NPC(victim)) { send_to_char("Go transfer someone your own size.\r\n", ch); return; } act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM); char_from_room(victim); char_to_room(victim, ch->in_room, FALSE); act("$n arrives from a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM); act("$n has transferred you!", FALSE, ch, 0, victim, TO_VICT); do_look(victim, "", 0, 0); sprintf(buf, "(GC) %s transed %s to %d",GET_NAME(ch),GET_NAME(victim), world[ch->in_room].number); if (GET_LEVEL(ch) < LEVEL_IMPL && (GET_LEVEL(victim) < LEVEL_BUILDER) ) mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)+1), TRUE); } } else { /* Trans All */ for (i = descriptor_list; i; i = i->next) if (!i->connected && i->character && i->character != ch) { victim = i->character; if ((GET_LEVEL(ch) < GET_LEVEL(victim)) && !IS_NPC(victim)) { send_to_char("Go transfer someone your own size.\r\n", ch); } else { act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM); char_from_room(victim); char_to_room(victim, ch->in_room, FALSE); act("$n arrives from a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM); act("$n has transferred you!", FALSE, ch, 0, victim, TO_VICT); do_look(victim, "", 0, 0); sprintf(buf, "(GC) %s transed all to %d",GET_NAME(ch),world[ch->in_room].number); mudlog(buf, CMP, MAX(LEVEL_GRGOD, GET_LEVEL(ch)), TRUE); } } send_to_char("Ok.\r\n", ch); } } ACMD(do_teleport) { struct char_data *victim; sh_int target; if (IS_NPC(ch)) return; half_chop(argument, buf, buf2); if (!*buf) send_to_char("Who do you wish to teleport?\r\n", ch); else if (!(victim = get_char_vis(ch, buf))) send_to_char("No-one by that name around.\r\n", ch); else if (victim == ch) send_to_char("Use 'goto' to teleport yourself.\r\n", ch); else if (!*buf2) send_to_char("Where do you wish to send this person?\r\n", ch); else if ((target = find_target_room(ch, buf2)) >= 0) { if (GET_LEVEL(victim) > GET_LEVEL(ch) && !IS_NPC(victim)){ send_to_char("Go teleport someone your sown size.\r\n",ch); return; } act("$n disappears in a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM); char_from_room(victim); char_to_room(victim, target, FALSE); act("$n arrives from a puff of smoke.", FALSE, victim, 0, 0, TO_ROOM); act("$n has teleported you!", FALSE, ch, 0, (char *)victim, TO_VICT); do_look(victim, "", 0, 0); } } ACMD(do_savezone) { int zone,saved; if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} zone= ch->specials2.edit_zone; saved = save_zone(zone); sprintf(buf,"%s stored %d zone resets for zone %d.", GET_NAME(ch),saved,zone); mudlog(buf , CMP, LEVEL_BUILDER, TRUE); REMOVE_BIT(ch->specials2.builder_flag,BUILD_ZONE); } ACMD(do_savemobs) { int zone,saved; if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} zone= ch->specials2.edit_zone; saved = save_mobiles(zone); sprintf(buf,"%s stored %d mobiles for zone %d.", GET_NAME(ch),saved,zone); mudlog(buf , CMP, LEVEL_BUILDER, TRUE); REMOVE_BIT(ch->specials2.builder_flag,BUILD_MOBS); } void saveshops(struct char_data *ch) { int zone,saved; if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} zone= ch->specials2.edit_zone; saved = save_shops(zone); sprintf(buf,"%s stored %d shops for zone %d.", GET_NAME(ch),saved,zone); mudlog(buf , CMP, LEVEL_IMPL, TRUE); REMOVE_BIT(ch->specials2.builder_flag,BUILD_SHOPS); } ACMD(do_saveobjs) { int zone,saved; if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} zone= ch->specials2.edit_zone; saved = save_objects(zone); sprintf(buf,"%s stored %d objects for zone %d.", GET_NAME(ch),saved,zone); mudlog(buf , CMP, LEVEL_BUILDER, TRUE); } ACMD(do_saverooms) { int zone,saved; if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} zone= ch->specials2.edit_zone; saved = save_rooms(zone); sprintf(buf,"%s stored %d rooms for zone %d.", GET_NAME(ch),saved,zone); mudlog(buf , CMP, LEVEL_BUILDER, TRUE); REMOVE_BIT(ch->specials2.builder_flag,BUILD_ROOMS); } ACMD(do_zpurge) { char value[100]; char buffer[100]; int zn,cmd_no,no; bool tidyup=FALSE; one_argument(argument, value); if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} for (zn = 0; zone_table[zn].number != ch->specials2.edit_zone && zn <= top_of_zone_table; zn++) if (zn > top_of_zone_table) { send_to_char("Zone does not exist, ask an imp to create it.\r\n",ch); return; } if (!is_number(value)){ send_to_char("What sort of a zone reset number is that? - do show zone.\r\n",ch); return;} no = atoi(value); for (cmd_no=0;;cmd_no++) if (zone_table[zn].cmd[cmd_no].command == 'S') break; if (no > cmd_no || no < 0){ send_to_char("What sort of a zone reset number is that? - do show zone.\r\n",ch); return;} if (zone_table[zn].cmd[no].command == 'm' || zone_table[zn].cmd[no].command == 'o' ) tidyup = TRUE; sprintf(buffer,"%s destroying zreset %d in zone %ld.",GET_NAME(ch),no,ch->specials2.edit_zone); mudlog(buffer, CMP, LEVEL_BUILDER, TRUE); destroy_zreset(zn,no); no++; if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); if (tidyup) while(zone_table[zn].cmd[no].command != 'S'){ if (zone_table[zn].cmd[no].command == 'm' || zone_table[zn].cmd[no].command == 'o' || zone_table[zn].cmd[no].command == 'd' || zone_table[zn].cmd[no].command == 'S') break; else{ destroy_zreset(zn,no); no++; } } } ACMD(do_zset) { char num[100],amount[100]; int zn,cmd_no,no,val, next_zone, zone_top; half_chop(argument, buf, buf2); one_argument(buf, num); half_chop(buf2, buf1, amount); if (!ch->desc) return; if (!*buf || !*buf1 || (!is_abbrev(buf1, "if") && !is_abbrev(buf1, "number") && !is_abbrev(buf1, "percent"))){ send_to_char("Usage: zset reset# {if | [number | percent] value }\r\n",ch); return; } if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} for (zn = 0; zone_table[zn].number != ch->specials2.edit_zone && zn <= top_of_zone_table; zn++) if (zn > top_of_zone_table){ send_to_char("Zone does not exist, ask an imp to create it.\r\n",ch); return; } if (!is_number(num)){ send_to_char("What sort of a zone reset number is that?\r\n",ch); return; } no = atoi(num); for (cmd_no=0;;cmd_no++) if (zone_table[zn].cmd[cmd_no].command == 'S') break; cmd_no--; if (no > cmd_no || no < 0){ send_to_char("What sort of a zone reset number is that? - do show zone.\r\n",ch); return; } if(is_abbrev(buf1, "if")){ if (zone_table[zn].cmd[no].if_flag == 1){ sprintf(buf,"Zone reset #%d will now always repop.\r\n",no); send_to_char(buf,ch); zone_table[zn].cmd[no].if_flag = 0; } else{ sprintf(buf,"Zone reset #%d will now repop only if preceeding reset repops.\r\n",no); send_to_char(buf,ch); zone_table[zn].cmd[no].if_flag = 1; } if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); return; } else if (is_abbrev(buf1,"number")){ if (zone_table[zn].cmd[no].command != 'S'){ val = atoi(amount); if (val < 0 || val > 40){ send_to_char("What sort of a number is that?\r\n",ch); return; } if (zone_table[zn].cmd[no].command != 'd' || zone_table[zn].cmd[no].command != 'S' || zone_table[zn].cmd[no].command != '*') zone_table[zn].cmd[no].arg2 = val; sprintf(buf,"Setting the max loadable for zonerest #%d to %d.\r\n",no,val); send_to_char(buf,ch); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); } } else if (is_abbrev(buf1, "percent")){ if (zone_table[zn].cmd[no].command != 'S'){ val = atoi(amount); if (val < 0 || val > 100){ send_to_char("What sort of a percentage is that?\r\n",ch); return; } zone_table[zn].cmd[no].percent = val; sprintf(buf,"Setting the load percent for zonerest #%d to %d%%.\r\n",no,val); send_to_char(buf,ch); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); } } } ACMD(do_zsave) { int zone,comm,dirn,state; struct char_data *victm; struct follow_type *f, *ff; struct obj_data *victo; static char *keywords[] = { "north", "east", "south", "west", "up", "down", "\n"}; half_chop(argument,buf,buf2); if (!*buf || !*buf2){ send_to_char("Usage: zsave [mob|obj name | door direction].\r\n",ch); return;} if (ch->specials2.edit_zone <0 ){ send_to_char("You are not authorised to edit any zones.\r\n",ch); return;} for (zone = 0; zone_table[zone].number != ch->specials2.edit_zone && zone <= top_of_zone_table; zone++) if (zone > top_of_zone_table) { send_to_char("Zone does not exist, ask an imp to create it.\r\n",ch); return; } if (world[ch->in_room].zone != zone){ send_to_char("You are not authorised to edit this zone.\r\n",ch); return;} if (!strcmp("mob",buf)){ if (!(victm = get_char_vis(ch,buf2))) { send_to_char("No such mobile about.\r\n",ch); return; } comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); zone_table[zone].cmd[comm].command = 'm'; zone_table[zone].cmd[comm].if_flag = 0; zone_table[zone].cmd[comm].arg1 = victm->nr; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].arg3 = ch->in_room; zone_table[zone].cmd[comm].percent = 100; zone_table[zone].cmd[comm].num = 0; zone_save_equipment(zone,ch,victm); for (f = victm->followers; f; f = f->next) if (IS_MOB(f->follower)) { comm = create_zreset(zone); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); if (f->follower->specials.rider && (f->follower->specials.rider == victm)) zone_table[zone].cmd[comm].command = 'r'; else if (f->follower->specials.carried_by && (f->follower->specials.carried_by == victm)) zone_table[zone].cmd[comm].command = 'c'; else zone_table[zone].cmd[comm].command = 'f'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = f->follower->nr; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].percent = 100; zone_table[zone].cmd[comm].num = 0; zone_save_equipment(zone,ch,f->follower); } } else if (!strcmp("obj",buf)){ if (!(victo = get_obj_vis(ch,buf2))) { send_to_char("No such object about.\r\n",ch); return; } comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); zone_table[zone].cmd[comm].command = 'o'; zone_table[zone].cmd[comm].if_flag = 0; zone_table[zone].cmd[comm].arg1 = victo->item_number; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].arg3 = ch->in_room; zone_table[zone].cmd[comm].percent = 100; zone_table[zone].cmd[comm].num = 0; if (victo->contains) zone_save_put_obj(zone,ch,victo->contains); if (victo->pulled_by){ for (f = victo->pulled_by; f; f = f->next){ comm = create_zreset(zone); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); zone_table[zone].cmd[comm].command = 'h'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = f->follower->nr; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].percent = 100; zone_table[zone].cmd[comm].num = 0; zone_save_equipment(zone,ch,f->follower); if (f->follower->followers){ for (ff = f->follower->followers; ff;ff = ff->next) if(IS_MOB(ff->follower)) { comm = create_zreset(zone); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); zone_table[zone].cmd[comm].command = 'f'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = ff->follower->nr; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].percent = 100; zone_table[zone].cmd[comm].num = 0; zone_save_equipment(zone,ch,ff->follower); } } } } } else if (!strcmp("door", buf)) { dirn = search_block(buf2,keywords,FALSE); if (dirn == -1){ send_to_char("What sort of direction is that?\r\n",ch); return;} if (!EXIT(ch,dirn)){ send_to_char("No exit in that direction.\r\n",ch); return;} else if (!IS_SET(EXIT(ch, dirn)->exit_info, EX_ISDOOR)){ send_to_char("No door in that direction.\r\n",ch); return;} if (IS_SET(EXIT(ch, dirn)->exit_info, EX_CLOSED) && !IS_SET(EXIT(ch, dirn)->exit_info, EX_LOCKED) && !IS_SET(EXIT(ch, dirn)->exit_info, EX_SECRET)) state = 1; else if (IS_SET(EXIT(ch, dirn)->exit_info, EX_CLOSED) && IS_SET(EXIT(ch, dirn)->exit_info, EX_LOCKED) && !IS_SET(EXIT(ch, dirn)->exit_info, EX_SECRET)) state = 2; else if (IS_SET(EXIT(ch, dirn)->exit_info, EX_CLOSED) && !IS_SET(EXIT(ch, dirn)->exit_info, EX_LOCKED) && IS_SET(EXIT(ch, dirn)->exit_info, EX_SECRET)) state = 3; else if (IS_SET(EXIT(ch, dirn)->exit_info, EX_CLOSED) && IS_SET(EXIT(ch, dirn)->exit_info, EX_LOCKED) && IS_SET(EXIT(ch, dirn)->exit_info, EX_SECRET)) state = 4; else state = 0; comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); send_to_char("Now check the other side of the door.\r\n",ch); zone_table[zone].cmd[comm].command = 'd'; zone_table[zone].cmd[comm].if_flag = 0; zone_table[zone].cmd[comm].arg1 = ch->in_room; zone_table[zone].cmd[comm].arg2 = dirn; zone_table[zone].cmd[comm].arg3 = state; zone_table[zone].cmd[comm].percent = 100; } } void zone_save_equipment(int zone,struct char_data *ch,struct char_data *victm) { int j, comm; struct obj_data *tmp; for (j=0;j < MAX_WEAR; j++) if (victm->equipment[j]) { comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); zone_table[zone].cmd[comm].command = 'e'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = victm->equipment[j]->item_number; zone_table[zone].cmd[comm].arg2 = 20; zone_table[zone].cmd[comm].arg3 = j; zone_table[zone].cmd[comm].num = 0; zone_table[zone].cmd[comm].percent = 100; if (victm->equipment[j]->contains) zone_save_put_obj(zone,ch,victm->equipment[j]->contains); } for (tmp= victm->inventory;tmp;tmp = tmp->next_content) { comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); zone_table[zone].cmd[comm].command = 'g'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = tmp->item_number; zone_table[zone].cmd[comm].arg2 = 20; zone_table[zone].cmd[comm].num = 0; zone_table[zone].cmd[comm].percent = 100; /* ok now object contents */ if (tmp->contains) zone_save_put_obj(zone,ch,tmp->contains); } } void zone_save_put_obj(int zone,struct char_data *ch, struct obj_data *obj) { struct obj_data *tmp; int comm; if (!obj) return; for (tmp = obj;tmp;tmp = tmp->next_content){ comm = create_zreset(zone); if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); sprintf(buf,"Creating zone reset #%d in Zone: %d.\r\n",comm,zone); send_to_char(buf,ch); zone_table[zone].cmd[comm].command = 'p'; zone_table[zone].cmd[comm].if_flag = 1; zone_table[zone].cmd[comm].arg1 = tmp->item_number; zone_table[zone].cmd[comm].arg2 = 1; zone_table[zone].cmd[comm].arg3 = tmp->in_obj->item_number; zone_table[zone].cmd[comm].num = 0; zone_table[zone].cmd[comm].percent = 100; if (tmp->contains) zone_save_put_obj(zone,ch,tmp->contains); } } ACMD(do_ocreate) { int zone,num; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} zone = ch->specials2.edit_zone; num = create_obj(zone); if (num == 0){ sprintf(buf,"No slots available in zone: %d. Object not created\r\n",zone); send_to_char(buf,ch); return;} else sprintf(buf,"Object %d created.\r\n",obj_index[num].virtual); send_to_char(buf,ch); sprintf(buf,"Object %d created by %s.",obj_index[num].virtual,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); } ACMD(do_screate) { int num; if (GET_LEVEL(ch) < LEVEL_ASS_IMPL) return; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} num = create_shop(ch->specials2.edit_zone); sprintf(buf,"Shop #%d created\r\nSaving shops in zone: %d\r\n", num,ch->specials2.edit_zone); send_to_char (buf,ch); save_shops(ch->specials2.edit_zone); } ACMD(do_rcreate) { int zone,num; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} zone = ch->specials2.edit_zone; num = create_room(zone); if (num == 0){ sprintf(buf,"No slots available in zone: %d. room not created\r\n",zone); send_to_char(buf,ch); return;} else sprintf(buf,"room %d created.\r\n",world[num].number); send_to_char(buf,ch); sprintf(buf,"room %d created by %s.",world[num].number,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); if (!IS_SET(ch->specials2.builder_flag,BUILD_ROOMS)) SET_BIT(ch->specials2.builder_flag,BUILD_ROOMS); } ACMD(do_zcreate) { int zone,num, zn; if (GET_LEVEL(ch) < LEVEL_IMPL){ send_to_char ("You are not authorised to create zones..\r\n",ch); return;} if (!*argument){ send_to_char ("Usage: zcreate zone_number.\r\n",ch); return; } one_argument(argument,buf); if (!is_number(buf)){ send_to_char("What sort of a zone number is that?\r\n",ch); return; } zone = atoi(buf); if (zone <= 0){ send_to_char("What sort of a zone number is that?\r\n",ch); return; } for (zn = 0;zn <= top_of_zone_table && zone_table[zn].number < zone;zn++) ; if (zn <= top_of_zone_table){ if (zone_table[zn-1].top > (zone*100 -1)){ sprintf(buf,"Zone: %d would overlap Zone: %d\r\n",zone, zone_table[zn-1].number); sprintf(buf,"%sZone not created\r\n", buf,zone); send_to_char(buf,ch); return; } } num = create_zone(zone); if (num >= 0){ sprintf(buf,"Zone %d created.\r\n",zone_table[num].number); send_to_char(buf,ch); sprintf(buf,"Zone %d created by %s.",zone_table[num].number,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); ch->specials2.edit_zone = zone; if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); } else{ sprintf(buf,"Problem allocating memory for Zone %d.\r\n",zone_table[num].number); send_to_char(buf,ch); } } ACMD(do_mcreate) { int zone,num; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} zone = ch->specials2.edit_zone; num = create_mob(zone); if (num == 0){ sprintf(buf,"No slots available in zone: %d. Mobile not created\r\n",zone); send_to_char(buf,ch); return;} else sprintf(buf,"Mobile %d created.\r\n",mob_index[num].virtual); send_to_char(buf,ch); sprintf(buf,"Mobile %d created by %s.",mob_index[num].virtual,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); if (!IS_SET(ch->specials2.builder_flag,BUILD_MOBS)) SET_BIT(ch->specials2.builder_flag,BUILD_MOBS); } ACMD(do_rclone) { int zone,num,numberl,numberu,r_numu,r_num,ntoclone,i; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} half_chop(argument,buf,buf2); if (!*buf){ send_to_char ("Usage rclone < lower room vnum upper room vnum | room vnum>.\r\n",ch); return;} if (!*buf2){ r_num = -1; if (is_number(buf)) { if ((numberl = atoi(buf)) < 0) { send_to_char("A negative room number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_room(numberl)) < 0){ send_to_char("There is no such room with that number.\r\n",ch); return;} ntoclone = 1; } else{ send_to_char("Huh?\r\n",ch); return;} } else{ r_num = -1; if (is_number(buf2) && is_number(buf2)) { if ((numberl = atoi(buf)) < 0 || (numberu = atoi(buf2)) < 0 ) { send_to_char("A negative room number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_room(numberl)) < 0 || (r_numu = real_room(numberu)) < 0){ send_to_char("There is no such room with that number.\r\n",ch); return;} if (r_numu < r_num) { r_num = r_numu; r_numu = real_room(numberl); } ntoclone = r_numu - r_num +1; } else{ send_to_char("Huh?\r\n",ch); return;} } zone = ch->specials2.edit_zone; for (i=0; i< ntoclone;i++){ num = create_room(zone); if (num == 0){ sprintf(buf,"No more slots available in zone: %d. Cloning only %d rooms\r\n",zone,i); send_to_char(buf,ch); break; } if (r_num >= num) r_num++; sprintf(buf,"Rooms # %d cloned to # %d.\r\n",world[r_num+i].number,world[num].number); send_to_char(buf,ch); sprintf(buf,"Room # %d cloned to # %d by %s.",world[r_num+1].number,world[num].number,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); clone_room(r_num+i,num); } if (i == 0) return; if (!IS_SET(ch->specials2.builder_flag,BUILD_ROOMS)) SET_BIT(ch->specials2.builder_flag,BUILD_ROOMS); } ACMD(do_mclone) { int zone,num,number,r_num,nr; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage mclone < mob virtual number | mob name >.\r\n",ch); return;} /* ok mob by number */ r_num = -1; if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative mob number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_mobile(number)) < 0){ send_to_char("Error: There is no such mob with than number.\r\n",ch); return;} ch->desc->mob_edit = mob_proto + r_num; } /* mob by name */ else { for (nr = 0; nr <= top_of_mobt;nr++) if (isname(buf, mob_proto[nr].player.name)){ ch->desc->mob_edit = mob_proto + nr ; break;} r_num = nr;} if(!(ch->desc->mob_edit)){ send_to_char("No such mobile! sorry.\r\n",ch); return;} ch->desc->mob_edit = 0; zone = ch->specials2.edit_zone; num = create_mob(zone); if (num == 0){ sprintf(buf,"No slots available in zone: %d. Mobile not created\r\n",zone); send_to_char(buf,ch); return;} if (r_num >= num) r_num++; sprintf(buf,"Mobile # %d cloned to # %d.\r\n",mob_index[r_num].virtual,mob_index[num].virtual); send_to_char(buf,ch); sprintf(buf,"Mobile # %d cloned to # %d by %s.",mob_index[r_num].virtual,mob_index[num].virtual,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); clone_mob(r_num,num); if (!IS_SET(ch->specials2.builder_flag,BUILD_MOBS)) SET_BIT(ch->specials2.builder_flag,BUILD_MOBS); } ACMD(do_oclone) { struct obj_data *from, *to; int zone,num,number,r_num,nr, toitemnr; if (ch->specials2.edit_zone < 0){ send_to_char ("You are not authorised to edit any zone..\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage oclone < mob virtual number | mob name >.\r\n",ch); return;} /* ok object by number */ r_num = -1; if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative obj number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_object(number)) < 0){ send_to_char("There is no such obj with than number.\r\n",ch); return;} from = obj_proto + r_num; } /* object by name */ else { for (nr = 0; nr <= top_of_objt;nr++) if (isname(buf, obj_proto[nr].name)){ from = obj_proto +nr ; break;} r_num = nr;} if(!(from)){ send_to_char("No such object! sorry.\r\n",ch); return;} zone = ch->specials2.edit_zone; num = create_obj(zone); if (num == 0){ sprintf(buf,"No slots available in zone: %d. Object not created\r\n",zone); send_to_char(buf,ch); return;} /* if (r_num >= num) r_num++; from = obj_proto + r_num; */ to = obj_proto + num; sprintf(buf,"Object # %d cloned to # %d.\r\n",obj_index[r_num].virtual,obj_index[num].virtual); send_to_char(buf,ch); sprintf(buf,"Object # %d cloned to # %d by %s.",obj_index[r_num].virtual,obj_index[num].virtual,GET_NAME(ch)); mudlog(buf, CMP, LEVEL_BUILDER, TRUE); toitemnr = to->item_number; copy_obj(from,to, TRUE); to->item_number = toitemnr; } ACMD(do_medit) { struct char_data *edit_mob; int r_num,number,nr,zone,zn,next_zone; if (!ch->desc) return; if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char ("You aren't holy enough to edit mobiles.\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage medit < mob virtual number | mob name >.\r\n",ch); return;} /* ok mob by number */ zone = ch->specials2.edit_zone; if (zone>0){ for (zn = 0; zone_table[zn].number != zone && zn <= top_of_zone_table; zn++) ; if (zn +1 <= top_of_zone_table) next_zone = zone_table[zn+1].number; else next_zone = zone +10; } else { send_to_char("You aren't authorised to edit any zones.\r\n",ch); return;} if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative mob number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_mobile(number)) < 0){ send_to_char("There is no such mob with than number.\r\n",ch); return;} if ((number < ch->specials2.edit_zone*100 || number > next_zone*100)){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->virtual = 0; ch->desc->mob_edit = 0; return;} ch->desc->mob_edit = mob_proto + r_num; ch->desc->virtual = number; } else /* mob by name */ for (nr = 0; nr <= top_of_mobt;nr++) if (isname(buf, mob_proto[nr].player.name)){ ch->desc->mob_edit = mob_proto +nr; ch->desc->virtual = mob_index[nr].virtual; break;} if(!(ch->desc->mob_edit)){ send_to_char("No such mobile! sorry.\r\n",ch); return;} if(!(ch->desc->virtual)){ send_to_char("Bogus virtual number! sorry.\r\n",ch); return;} number = mob_index[ch->desc->mob_edit->nr].virtual; if ((number < ch->specials2.edit_zone*100 || number >= next_zone*100)){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->mob_edit = 0; ch->desc->virtual = 0; return;} act("$n wanders off to create part of the world.",TRUE,ch,0, 0,TO_ROOM); CREATE(edit_mob, struct char_data, 1); copy_mob(ch->desc->mob_edit, edit_mob); ch->desc->mob_edit = edit_mob; print_mob(ch->desc); send_to_char("\r\n**Enter Q to Quit**\r\n",ch); ch->desc->prompt_mode = 0; REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING); SET_BIT(PLR_FLAGS(ch), PLR_BUILDING); if (!IS_SET(ch->specials2.builder_flag,BUILD_MOBS)) SET_BIT(ch->specials2.builder_flag,BUILD_MOBS); } ACMD(do_oedit) { struct obj_data *edit_obj; int r_num,number,nr,zone,zn,next_zone; if (!ch->desc) return; if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char ("You aren't holy enough to edit objects.\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage oedit < obj virtual number | obj name >.\r\n",ch); return;} zone = ch->specials2.edit_zone; if (zone>0){ for (zn = 0; zone_table[zn].number != zone && zn <= top_of_zone_table; zn++) ; /* if (zn +1 <= top_of_zone_table) next_zone = zone_table[zn+1].number; else next_zone = zone +10; */ next_zone = (zone_table[zn].top +1) / 100; } else { send_to_char("You aren't authorised to edit any zones.\r\n",ch); return;} if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative obj number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_object(number)) < 0){ send_to_char("There is no such obj with than number.\r\n",ch); return;} if ((number < zone*100 || number > next_zone*100)){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->obj_edit = 0; ch->desc->virtual = 0; return;} ch->desc->obj_edit = obj_proto + r_num; ch->desc->virtual = obj_index[r_num].virtual; } else /* obj by name */ for (nr = 0; nr <= top_of_objt;nr++) if (isname(buf, obj_proto[nr].name)){ ch->desc->obj_edit = obj_proto +nr ; ch->desc->virtual = obj_index[ch->desc->obj_edit->item_number].virtual; break;} if(!(ch->desc->obj_edit)){ send_to_char("No such object! sorry.\r\n",ch); return;} if(!(ch->desc->virtual)){ send_to_char("Bogus virtual number! sorry.\r\n",ch); return;} number = obj_index[ch->desc->obj_edit->item_number].virtual; if ((number < zone*100 || number > next_zone*100)){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->obj_edit = 0; ch->desc->virtual = 0; return;} act("$n wanders off to create part of the world.",TRUE,ch,0, 0,TO_ROOM); CREATE(edit_obj, struct obj_data, 1); copy_obj(ch->desc->obj_edit, edit_obj, TRUE); ch->desc->obj_edit = edit_obj; print_obj(ch->desc); send_to_char("\r\n**Enter Q to Quit**\r\n",ch); ch->desc->prompt_mode = 0; REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING); SET_BIT(PLR_FLAGS(ch), PLR_BUILDING); if (!IS_SET(ch->specials2.builder_flag,BUILD_OBJS)) SET_BIT(ch->specials2.builder_flag,BUILD_OBJS); } ACMD(do_redit) { int r_num,number,zone,j; struct room_data *edit_room; if (!ch->desc) return; if (GET_LEVEL(ch) < LEVEL_BUILDER){ send_to_char ("You aren't holy enough to edit rooms.\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage redit room number >.\r\n",ch); return;} j = ch->specials2.edit_zone; for (zone = 0; zone_table[zone].number != j && zone <= top_of_zone_table; zone++) ; if (zone > top_of_zone_table) return; if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative room number .... an interesting concept.\r\n",ch); return; } if ((r_num = real_room(number)) < 0){ send_to_char("There is no such room with than number.\r\n",ch); return;} if (world[r_num].zone != zone){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->room_edit = 0; return;} ch->desc->room_edit = world + r_num; } else{ send_to_char("Sorry have to give a room number.\r\n",ch); return;} act("$n wanders off to create part of the world.",TRUE,ch,0, 0,TO_ROOM); CREATE(edit_room, struct room_data, 1); copy_room(ch->desc->room_edit, edit_room); ch->desc->room_edit = edit_room; print_room(ch->desc); send_to_char("\r\n**Enter Q to Quit**\r\n",ch); ch->desc->prompt_mode = 0; if (!IS_SET(ch->specials2.builder_flag,BUILD_ROOMS)) SET_BIT(ch->specials2.builder_flag,BUILD_ROOMS); REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING); SET_BIT(PLR_FLAGS(ch), PLR_BUILDING); } ACMD(do_sedit) { int s_num,number,zone,j; struct shop_data *edit_shop; struct char_data *keeper; if (!ch->desc) return; if (GET_LEVEL(ch) < LEVEL_ASS_IMPL){ send_to_char ("You aren't holy enough to edit shops.\r\n",ch); return;} one_argument(argument,buf); if (!*buf){ send_to_char ("Usage sedit shop number >.\r\n",ch); return;} j = ch->specials2.edit_zone; if (is_number(buf)) { if ((number = atoi(buf)) < 0) { send_to_char("A negative shop number .... an interesting concept.\r\n",ch); return; } if ((s_num = real_shop(number)) < 0){ send_to_char("There is no such shop with than number.\r\n",ch); return;} if (number/100 != j){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->shop_edit = 0; return;} ch->desc->shop_edit = shop_index + s_num; } else{ send_to_char("Sorry have to give a shop number.\r\n",ch); return;} act("$n wanders off to create part of the world.",TRUE,ch,0, 0,TO_ROOM); CREATE(edit_shop, struct shop_data, 1); copy_shop(ch->desc->shop_edit, edit_shop); ch->desc->shop_edit = edit_shop; if (edit_shop->keeper > 0) if (mob_index[edit_shop->keeper].func) mob_index[edit_shop->keeper].func = 0; print_shop(ch->desc); send_to_char("\r\n**Enter Q to Quit**\r\n",ch); ch->desc->prompt_mode = 0; REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING); SET_BIT(PLR_FLAGS(ch), PLR_BUILDING); if (!IS_SET(ch->specials2.builder_flag,BUILD_SHOPS)) SET_BIT(ch->specials2.builder_flag,BUILD_SHOPS); } ACMD(do_zedit) { int zn,number=-1,zone,j; bool ok = FALSE; struct zone_data *zone_edit; if (!ch->desc) return; one_argument(argument,buf); if (buf) if (is_number(buf)) { if ((number = atoi(buf)) < 0){ send_to_char("A negative zone number .... an interesting concept.\r\n",ch); return; } } if (number <= -1) number = ch->specials2.edit_zone; for (zn =0;zn <= top_of_zone_table; zn++) if (zone_table[zn].number == number){ ok = TRUE; break; } if (!ok){ send_to_char("There is no such zone with than number.\r\n",ch); return; } if (GET_LEVEL(ch) < LEVEL_ASS_IMPL && number != ch->specials2.edit_zone){ send_to_char ("You are not authorised to edit that zone.\r\n",ch); ch->desc->zone_edit = 0; return;} act("$n wanders off to create part of the world.",TRUE,ch,0, 0,TO_ROOM); CREATE(zone_edit, struct zone_data, 1); copy_zone(zone_table + zn, zone_edit); ch->desc->zone_edit = zone_edit; print_zonedata(ch->desc); send_to_char("\r\n**Enter Q to Quit**\r\n",ch); ch->desc->prompt_mode = 0; REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING); SET_BIT(PLR_FLAGS(ch), PLR_BUILDING); ch->specials2.edit_zone = number; if (!IS_SET(ch->specials2.builder_flag,BUILD_ZONE)) SET_BIT(ch->specials2.builder_flag,BUILD_ZONE); } ACMD(do_vnum) { if (IS_NPC(ch)) { send_to_char("What would a monster do with a vnum?\r\n", ch); return; } half_chop(argument, buf, buf2); if (!*buf || !*buf2 || (!is_abbrev(buf, "mob") && !is_abbrev(buf, "obj") && !is_abbrev(buf, "zone"))) { send_to_char("Usage: vnum { obj | mob | zone } <name>\r\n", ch); return; } if (is_abbrev(buf, "mob")) if (!vnum_mobile(buf2, ch)) send_to_char("No mobiles by that name.\r\n", ch); if (is_abbrev(buf, "obj")) if (!vnum_object(buf2, ch)) send_to_char("No objects by that name.\r\n", ch); if (is_abbrev(buf, "zone")) if (!vnum_zone(buf2, ch)) send_to_char("No matching zresets in this zone.\r\n", ch); } void do_stat_room(struct char_data *ch) { struct extra_descr_data *desc=0; struct room_data *rm = &world[ch->in_room]; int i, found = 0; struct obj_data *j = 0; struct char_data *k = 0; sprintf(buf, "Room name: %s%s%s Light_Level: %s%d%s\r\n", CCCYN(ch, C_NRM), rm->name,CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), compute_room_light_value(rm),CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprinttype(rm->sector_type, sector_types, buf2); sprintf(buf, "Zone: [%3d], VNum: [%s%5d%s], RNum: [%5d], Type: %s\r\n", rm->zone, CCGRN(ch, C_NRM), rm->number, CCNRM(ch, C_NRM), ch->in_room, buf2); send_to_char(buf, ch); sprintbit((long) rm->room_flags, room_bits, buf2); sprintf(buf, "SpecProc: %s, Flags: %s\r\n", (rm->funct) ? "Exists" : "No", buf2); send_to_char(buf, ch); send_to_char("Description:\r\n", ch); if (rm->description) send_to_char(rm->description, ch); else send_to_char(" None.\r\n", ch); if (rm->tele_delay > -1){ sprintf(buf, "Teleport to: %s%d%s, Delay: %s%d%s\r\n",CCYEL(ch,C_NRM), rm->tele_to_room,CCNRM(ch,C_NRM),CCYEL(ch,C_NRM),rm->tele_delay, CCNRM(ch,C_NRM)); send_to_char(buf,ch); } if (rm->ex_description) { sprintf(buf, "Extra descs:%s", CCCYN(ch, C_NRM)); for (desc = rm->ex_description; desc; desc = desc->next) { strcat(buf, " "); strcat(buf, (desc->keyword ? desc->keyword : "no-keyword")); } strcat(buf, CCNRM(ch, C_NRM)); send_to_char(strcat(buf, "\r\n"), ch); } sprintf(buf, "Chars present:%s", CCYEL(ch, C_NRM)); for (found = 0, k = rm->people; k; k = k->next_in_room) { if (!CAN_SEE(ch, k)) continue; sprintf(buf2, "%s %s(%s)", found++ ? "," : "", GET_NAME(k), (!IS_NPC(k) ? "PC" : (!IS_MOB(k) ? "NPC" : "MOB"))); strcat(buf, buf2); if (strlen(buf) >= 62) { if (k->next_in_room) send_to_char(strcat(buf, ",\r\n"), ch); else send_to_char(strcat(buf, "\r\n"), ch); *buf = found = 0; } } if (*buf) send_to_char(strcat(buf, "\r\n"), ch); send_to_char(CCNRM(ch, C_NRM), ch); if (rm->contents) { sprintf(buf, "Contents:%s", CCGRN(ch, C_NRM)); for (found = 0, j = rm->contents; j; j = j->next_content) { if (!CAN_SEE_OBJ(ch, j)) continue; sprintf(buf2, "%s %s", found++ ? "," : "", j->short_description); strcat(buf, buf2); if (strlen(buf) >= 62) { if (j->next_content) send_to_char(strcat(buf, ",\r\n"), ch); else send_to_char(strcat(buf, "\r\n"), ch); *buf = found = 0; } } if (*buf) send_to_char(strcat(buf, "\r\n"), ch); send_to_char(CCNRM(ch, C_NRM), ch); } for (i = 0; i < NUM_OF_DIRS; i++) { if (rm->dir_option[i]) { if (rm->dir_option[i]->to_room == NOWHERE) sprintf(buf1, " %sNONE%s", CCCYN(ch, C_NRM), CCNRM(ch, C_NRM)); else sprintf(buf1, "%s%5d%s", CCCYN(ch, C_NRM), rm->dir_option[i]->to_room, CCNRM(ch, C_NRM)); sprintbit(rm->dir_option[i]->exit_info, exit_bits, buf2); sprintf(buf, "Exit %s%-5s%s: To: [%s], Key: [%5d], Keywrd: %s, Type: %s\r\n ", CCCYN(ch, C_NRM), dirs[i], CCNRM(ch, C_NRM), buf1, rm->dir_option[i]->key, rm->dir_option[i]->keyword ? rm->dir_option[i]->keyword : "None", buf2); send_to_char(buf, ch); if (rm->dir_option[i]->general_description) strcpy(buf, rm->dir_option[i]->general_description); else strcpy(buf, " No exit description.\r\n"); send_to_char(buf, ch); } } } void do_stat_shop(struct char_data *ch, struct shop_data *shop) { int i; if (shop->in_room) sprintf(buf, "Number: %s%d%s, Room: %s%d%s\r\n", CCBYEL(ch,C_NRM),shop->virtual,CCNRM(ch, C_NRM), CCBYEL(ch,C_NRM),shop->in_room,CCNRM(ch, C_NRM)); else sprintf(buf, "Number: %s%d%s, Room: %sWANDERER%s\r\n", CCBYEL(ch,C_NRM),shop->virtual,CCNRM(ch, C_NRM), CCBYEL(ch,C_NRM),CCNRM(ch, C_NRM)); send_to_char(buf,ch); if (shop->keeper > 0) sprintf(buf, "Keeper: [%s%d%s] %s%s%s\r\n", CCBBLU(ch,C_NRM),mob_index[shop->keeper].virtual,CCNRM(ch, C_NRM), CCBCYN(ch,C_NRM),mob_proto[shop->keeper].player.short_descr, CCNRM(ch, C_NRM)); else sprintf(buf, "Keeper: None set\r\n"); send_to_char(buf,ch); sprintf(buf, "Temper1: %s%d%s, Temper2: %s%d%s\r\n", CCCYN(ch,C_NRM),shop->temper1,CCNRM(ch, C_NRM), CCCYN(ch,C_NRM),shop->temper2,CCNRM(ch, C_NRM)); send_to_char(buf,ch); sprintf(buf, "Open1: %s%d%s, Close1: %s%d%s, ", CCCYN(ch,C_NRM),shop->open1 ,CCNRM(ch, C_NRM), CCCYN(ch,C_NRM),shop->close1,CCNRM(ch, C_NRM)); send_to_char(buf,ch); sprintf(buf, "Open2: %s%d%s, Close2: %s%d%s\r\n", CCCYN(ch,C_NRM),shop->open2 ,CCNRM(ch, C_NRM), CCCYN(ch,C_NRM),shop->close2,CCNRM(ch, C_NRM)); send_to_char(buf,ch); sprintf(buf, "Sell markup: %s%f%s, Buy markdown: %s%f%s\r\n", CCGRN(ch,C_NRM),shop->profit_buy ,CCNRM(ch, C_NRM), CCGRN(ch,C_NRM),shop->profit_sell,CCNRM(ch, C_NRM)); send_to_char(buf,ch); if (shop->tradetype > 0) { sprintbit(shop->tradetype,item_types, buf2); sprintf(buf, "Trades: %s%s%s\r\n",CCGRN(ch,C_NRM), buf2, CCNRM(ch, C_NRM)); } else if (shop->tradetype == 0) sprintf(buf, "Trades: %sANYTHING%s\r\n",CCGRN(ch,C_NRM),CCNRM(ch,C_NRM)); else sprintf(buf, "Trades: %sOnly Sells%s\r\n",CCGRN(ch,C_NRM),CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "No such item 1: %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->no_such_item1,CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "No such item 2: %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->no_such_item2,CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "Do not buy : %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->do_not_buy,CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "Missing cash 1: %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->missing_cash1,CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "Missing cash 2: %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->missing_cash2,CCNRM(ch,C_NRM)); send_to_char(buf,ch); sprintf(buf, "Message buy : %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->message_buy,CCNRM(ch,C_NRM)); send_to_char(buf,ch); if (shop->tradetype >=0) { sprintf(buf, "Message sell : %s%s%s\r\n", CCBWHT(ch,C_NRM),shop->message_sell,CCNRM(ch,C_NRM)); send_to_char(buf,ch); } for ( i = 0; i< MAX_PROD; i++) { if (shop->producing[i] >= 0) { sprintf(buf, "Producing: [%s%d%s] %s%s%s\r\n", CCCYN(ch,C_NRM), obj_index[shop->producing[i]].virtual, CCNRM(ch,C_NRM),CCCYN(ch,C_NRM), obj_proto[shop->producing[i]].short_description, CCNRM(ch,C_NRM)); send_to_char(buf,ch); } } } void do_stat_object(struct char_data *ch, struct obj_data *j) { bool found; int i; struct obj_data *j2; struct extra_descr_data *desc=0; int virtual; virtual = (j->item_number >= 0) ? obj_index[j->item_number].virtual : 0; sprintf(buf, "Name: '%s%s%s', Aliases: %s\r\n", CCYEL(ch, C_NRM), ((j->short_description) ? j->short_description : "<None>"), CCNRM(ch, C_NRM), j->name); send_to_char(buf, ch); sprinttype(GET_ITEM_TYPE(j), item_types, buf1); if (j->item_number >= 0) strcpy(buf2, (obj_index[j->item_number].func ? "Exists" : "None")); else strcpy(buf2, "None"); sprintf(buf, "VNum: [%s%5d%s], RNum: [%5d], Type: %s, SpecProc: %s\r\n", CCGRN(ch, C_NRM), virtual, CCNRM(ch, C_NRM), j->item_number, buf1, buf2); send_to_char(buf, ch); sprintf(buf, "L-Des: %s\r\n", ((j->description) ? j->description : "None")); send_to_char(buf, ch); if (j->ex_description) { sprintf(buf, "Extra descs:%s", CCCYN(ch, C_NRM)); for (desc = j->ex_description; desc; desc = desc->next) { strcat(buf, " "); strcat(buf, (desc->keyword ? desc->keyword : "no-keyword")); } strcat(buf, CCNRM(ch, C_NRM)); send_to_char(strcat(buf, "\r\n"), ch); } send_to_char("Can be worn on: ", ch); sprintbit(j->obj_flags.wear_flags, wear_bits, buf); strcat(buf, "\r\n"); send_to_char(buf, ch); send_to_char("Setting char bits : ", ch); sprintbit(j->obj_flags2.bitvector_aff, affected_bits, buf); strcat(buf, "\r\nCan set char bits : "); sprintbit(j->obj_flags.bitvector, affected_bits, buf2); strcat(buf, buf2); strcat(buf, "\r\n"); send_to_char(buf, ch); send_to_char("Timers : ", ch); sprintf(buf, "Aff dur: %d, No Use Dur: %d, Aff Time: %d, No Use Time: %d\r\n",j->obj_flags2.aff_dur,j->obj_flags2.no_use_dur,j->obj_flags2.aff_timer,j->obj_flags2.no_use_timer); send_to_char(buf,ch); send_to_char("Extra flags : ", ch); sprintbit(j->obj_flags.extra_flags, extra_bits, buf); strcat(buf, "\r\n"); send_to_char(buf, ch); sprintf(buf, "Weight: %d, Value: %d, Cost/day: %d, Timer: %d, Creation Pts: %d\r\n", j->obj_flags.weight, j->obj_flags.cost, j->obj_flags.cost_per_day, j->obj_flags.timer, assess_item(j)); send_to_char(buf, ch); strcpy(buf, "In room: "); if (j->in_room == NOWHERE) strcat(buf, "Nowhere"); else { sprintf(buf2, "%d", world[j->in_room].number); strcat(buf, buf2); } strcat(buf, ", In object: "); strcat(buf, j->in_obj ? j->in_obj->short_description: "None"); strcat(buf, ", Carried by: "); strcat(buf, j->carried_by ? GET_NAME(j->carried_by) : "Nobody"); strcat(buf, ", Worn by: "); strcat(buf, j->worn_by ? GET_NAME(j->worn_by) : "Nobody"); strcat(buf, "\r\n"); send_to_char(buf, ch); switch (j->obj_flags.type_flag) { case ITEM_LIGHT : sprintf(buf, "Color: [%d], Type: [%d], Hours: [%d]", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2]); break; case ITEM_SCROLL : case ITEM_POTION : sprintf(buf, "Spells: %d, %d, %d, %d", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]); break; case ITEM_WAND : case ITEM_STAFF : sprintf(buf, "Spell: %d, Mana/power: %d", j->obj_flags.value[0], j->obj_flags.value[1]); break; case ITEM_ROD: sprintf(buf, "Spell: %s%s%s, max charges: %d, charges remaining: %d", CCCYN(ch, C_NRM),find_spell_name(j->obj_flags.value[1]), CCNRM(ch, C_NRM),j->obj_flags.value[2],j->obj_flags.value[3] ); break; case ITEM_CANTRIP: case ITEM_PHILTRE: sprintf(buf, "Spell: %s%s%s", CCCYN(ch, C_NRM), find_spell_name(j->obj_flags.value[1]),CCNRM(ch, C_NRM)); break; case ITEM_FIREWEAPON : case ITEM_WEAPON : sprintf(buf, "Tohit: %d, Todam: %dd%d, Type: %d", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]); break; case ITEM_MISSILE : sprintf(buf, "Tohit: %d, Todam: %d, Type: %d", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3]); break; case ITEM_ARMOR : sprintf(buf, "AC-apply [%d] Stopping [%d] Damage: [%d] Size: [%d] Limit: [%d]", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[4], j->obj_flags.value[5], j->obj_flags.value[6]); break; case ITEM_TRAP : sprintf(buf, "Spell: %d, - Hitpoints: %d", j->obj_flags.value[0], j->obj_flags.value[1]); break; case ITEM_CONTAINER : sprintf(buf, "Max-contains: %d, Locktype: %d, Corpse: %s", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3] < 0 ? "Yes" : "No"); break; case ITEM_DRINKCON : case ITEM_FOUNTAIN : sprinttype(j->obj_flags.value[2], drinks, buf2); sprintf(buf, "Max-contains: %d, Contains: %d, Poisoned: %s, Liquid: %s", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3] ? "Yes" : "No", buf2); break; case ITEM_NOTE : sprintf(buf, "Tounge: %d", j->obj_flags.value[0]); break; case ITEM_KEY : sprintf(buf, "Keytype: %d", j->obj_flags.value[0]); break; case ITEM_FOOD : sprintf(buf, "Makes full: %d, Poisoned: %d", j->obj_flags.value[0], j->obj_flags.value[3]); break; default : sprintf(buf, "Values 0-3: [%d] [%d] [%d] [%d]", j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]); break; } send_to_char(buf, ch); sprintf(buf,"\r\nSize: %s, Damage State: %s, ", sizes[j->obj_flags.value[5]], damage_state[j->obj_flags.value[4]]); send_to_char(buf,ch); if (j->obj_flags.value[6]) sprintf(buf,"Limit: [%d]",j->obj_flags.value[6]); else sprintf(buf,"Limit: [unlimited]"); send_to_char(buf,ch); strcpy(buf, "\r\nEquipment Status: "); if (!j->carried_by) strcat(buf, "None"); else { found = FALSE; for (i = 0; i < MAX_WEAR; i++) { if (j->carried_by->equipment[i] == j) { sprinttype(i, equipment_types, buf2); strcat(buf, buf2); found = TRUE; } } if (!found) strcat(buf, "Inventory"); } send_to_char(strcat(buf, "\r\n"), ch); if (j->contains) { sprintf(buf, "Contents:%s", CCGRN(ch, C_NRM)); for (found = 0, j2 = j->contains; j2; j2 = j2->next_content) { sprintf(buf2, "%s %s", found++ ? "," : "", j2->short_description); strcat(buf, buf2); if (strlen(buf) >= 62) { if (j2->next_content) send_to_char(strcat(buf, ",\r\n"), ch); else send_to_char(strcat(buf, "\r\n"), ch); *buf = found = 0; } } if (*buf) send_to_char(strcat(buf, "\r\n"), ch); send_to_char(CCNRM(ch, C_NRM), ch); } found = 0; send_to_char("Light Value:", ch); sprintf(buf2," %s%d%s\r\n",CCBYEL(ch,C_NRM),j->obj_flags2.light,CCNRM(ch,C_NRM)); send_to_char(buf2, ch); send_to_char("Affections:", ch); for (i = 0; i < MAX_OBJ_AFFECT; i++) if (j->affected[i].modifier) { sprinttype(j->affected[i].location, apply_types, buf2); sprintf(buf, "%s %+d to %s", found++ ? "," : "", j->affected[i].modifier, buf2); send_to_char(buf, ch); } if (!found) send_to_char(" None", ch); send_to_char("\r\n", ch); } void do_stat_character(struct char_data *ch, struct char_data *k) { int i, ii, i2, found = 0,attck; char *name, *tmp; struct obj_data *j; struct follow_type *fol; struct affected_type *aff; memory_rec *curr; switch (k->player.sex) { case SEX_NEUTRAL : strcpy(buf, "NEUTRAL-SEX"); break; case SEX_MALE : strcpy(buf, "MALE"); break; case SEX_FEMALE : strcpy(buf, "FEMALE"); break; default : strcpy(buf, "ILLEGAL-SEX!!"); break; } sprintf(buf2, " %s '%s' IDNum: [%5ld], In room [%5d], Illum Lev: %d\r\n", (!IS_NPC(k) ? "PC" : (!IS_MOB(k) ? "NPC" : "MOB")), GET_NAME(k), GET_IDNUM(k), world[k->in_room].number, illumination_level(world[ch->in_room].light, ch)); send_to_char(strcat(buf, buf2), ch); if (IS_MOB(k)) { sprintf(buf, "Alias: %s, VNum: [%5d], RNum: [%5d]\r\n", k->player.name, mob_index[k->nr].virtual, k->nr); send_to_char(buf, ch); } sprintf(buf,"Height: %2d'%2d'', Weight %4d lbs\r\n", (int) (100*GET_HEIGHT(k)/254)/12, (int) (100*GET_HEIGHT(k)/254) - 12*((100*GET_HEIGHT(k)/254)/12), GET_WEIGHT(k)/10); send_to_char(buf, ch); sprintf(buf, "Title: %s\r\n", (k->player.title ? k->player.title : "<None>")); send_to_char(buf, ch); sprintf(buf, "L-Des: %s", (k->player.long_descr ? k->player.long_descr : "<None>\r\n")); send_to_char(buf, ch); if (IS_NPC(k)) { strcpy(buf, "Monster Class: "); tmp = rev_search_list(GET_RACE(k), npc_races); sprintf(buf2,"%s%s%s Mob Fame: %s%d%s",CCBBLU(ch, C_NRM), ((tmp) ? tmp : "Unknown Class"),CCNRM(ch, C_NRM), CCBBLU(ch, C_NRM), GET_FAME(ch), CCNRM(ch, C_NRM)); } else { strcpy(buf, "Class: "); sprinttype(k->player.race, pc_race_types, buf2); strcat(buf, buf2); sprintf(buf2," Social Standing: %s%d%s", CCBBLU(ch, C_NRM), GET_FAME(ch), CCNRM(ch, C_NRM)); } strcat(buf, buf2); sprintf(buf2, "\r\nLev:[%s%2d%s], XP:[%s%7d%s], Align:[%s%4d%s], Mood:[%s%4d%s]\r\n", CCYEL(ch, C_NRM), GET_LEVEL(k), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), GET_EXP(k), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM), GET_ALIGNMENT(k), CCNRM(ch, C_NRM), CCYEL(ch, C_NRM) , GET_MOOD(k), CCNRM(ch, C_NRM)); strcat(buf, buf2); send_to_char(buf, ch); if (!IS_NPC(k)) { strcpy(buf1, (char *)asctime(localtime(&(k->player.time.birth)))); strcpy(buf2, (char *)asctime(localtime(&(k->player.time.logon)))); buf1[10] = buf2[10] = '\0'; sprintf(buf, "Created:[%s], Last Logon:[%s], Played[%dh %dm], Age[%d]\r\n", buf1, buf2, k->player.time.played / 3600, ((k->player.time.played / 3600) % 60), age(k).year); send_to_char(buf, ch); sprintf(buf, "Edit Zone:[%3ld], Hometown:[%d], Speaks:[%d/%d/%d], (STL[%d]/per[%d]/NSTL[%d])\r\n",k->specials2.edit_zone, k->player.hometown, k->player.talks[0], k->player.talks[1], k->player.talks[2], SPELLS_TO_LEARN(k), int_app[GET_INT(k)].learn, wis_app[GET_WIS(k)].bonus); send_to_char(buf, ch); } send_to_char("Current/Base Stats:\r\n",ch); sprintf(buf, "Str:[%s%d/%d%s] Int:[%s%d/%d%s] Wis:[%s%d/%d%s] Dex:[%s%d/%d%s] Con:[%s%d/%d%s]\r\n", CCCYN(ch, C_NRM), GET_STR(k),GET_RAW_STR(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_INT(k),GET_RAW_INT(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_WIS(k),GET_RAW_WIS(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_DEX(k),GET_RAW_DEX(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_CON(k),GET_RAW_CON(k), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf, "Foc:[%s%d/%d%s] Chr:[%s%d/%d%s] Per:[%s%d/%d%s] Gui:[%s%d/%d%s] Luc:[%s%d/%d%s]\r\n", CCCYN(ch, C_NRM), GET_FOC(k),GET_RAW_FOC(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_CHR(k),GET_RAW_CHR(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_PER(k),GET_RAW_PER(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_GUI(k),GET_RAW_GUI(k), CCNRM(ch, C_NRM), CCCYN(ch, C_NRM), GET_LUC(k),GET_RAW_LUC(k), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf, "Hit p.:[%s%4d/%4d+%d%s] Move p.:[%s%4d/%4d+%d%s]\r\n", CCGRN(ch, C_NRM), GET_HIT(k), GET_MAX_HIT(k), hit_gain(k), CCNRM(ch, C_NRM), CCGRN(ch, C_NRM), GET_MOVE(k), GET_MAX_MOVE(k), move_gain(k), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf,"%sAC/Stopping: %s",CCBBLU(ch,C_NRM), CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintf(buf,"Head [%s%d/%d%s], Body [%s%d/%d%s], ", CCWHT(ch, C_NRM),GET_HEAD_AC(k),GET_HEAD_STOPPING(k),CCNRM(ch,C_NRM), CCWHT(ch, C_NRM),GET_BODY_AC(k),GET_BODY_STOPPING(k),CCNRM(ch,C_NRM)); send_to_char(buf, ch); sprintf(buf,"Arm [%s%d/%d%s], Leg [%s%d/%d%s]\r\n", CCWHT(ch, C_NRM),GET_ARMS_AC(k),GET_ARMS_STOPPING(k),CCNRM(ch,C_NRM), CCWHT(ch, C_NRM),GET_LEGS_AC(k),GET_LEGS_STOPPING(k),CCNRM(ch,C_NRM)); send_to_char(buf, ch); if (k->specials.attack_type < TYPE_HIT) attck = TYPE_HIT; else attck = k->specials.attack_type; sprintf(buf, "%sHitroll:%s [%2d], %sDamroll:%s [%2d], %sHitroll2:%s [%2d], %sDamroll2:%s [%2d]\r\n%sCombat Bonus:%s [%2d]\r\n%sSaving throws:%s [%d/%d/%d/%d/%d]", CCBYEL(ch, C_NRM), CCNRM(ch, C_NRM), k->points.hitroll, CCBYEL(ch, C_NRM), CCNRM(ch, C_NRM), k->points.damroll, CCBYEL(ch, C_NRM), CCNRM(ch, C_NRM), k->specials.hitroll, CCBYEL(ch, C_NRM), CCNRM(ch, C_NRM), k->specials.damroll, CCBYEL(ch, C_NRM), CCNRM(ch, C_NRM), combat_bonus(k), CCBGRN(ch, C_NRM), CCNRM(ch, C_NRM), k->specials2.apply_saving_throw[0], k->specials2.apply_saving_throw[1], k->specials2.apply_saving_throw[2], k->specials2.apply_saving_throw[3], k->specials2.apply_saving_throw[4] ); sprintf(buf,"%s %sAttack Type:%s %s\r\n", buf, CCBMAG(ch, C_NRM), CCNRM(ch, C_NRM), attack_hit_text[attck-TYPE_HIT].singular); send_to_char(buf, ch); sprintf(buf, "Coins: [%9d], Bank: [%9d] (Total: %d)\r\n", GET_GOLD(k), GET_BANK_GOLD(k), GET_GOLD(k) + GET_BANK_GOLD(k)); send_to_char(buf, ch); sprinttype(GET_POS(k), position_types, buf2); sprintf(buf, "Pos: %s, Fighting: %s", buf2, ((k->specials.fighting) ? GET_NAME(k->specials.fighting) : "Nobody") ); if (k->desc) { sprinttype(k->desc->connected, connected_types, buf2); strcat(buf, ", Connected: "); strcat(buf, buf2); } send_to_char(strcat(buf, "\r\n"), ch); strcpy(buf, "Default position: "); sprinttype((k->specials.default_pos), position_types, buf2); strcat(buf, buf2); sprintf(buf2, ", Idle Timer (in tics) [%d]\r\n", k->specials.timer); strcat(buf, buf2); send_to_char(buf, ch); if (IS_MOB(k)) { sprintf(buf, "Mob Spec-Proc: %s, NPC Bare Hand Dam: %dd%d\r\n", (mob_index[k->nr].func ? "Exists" : "None"), k->specials.damnodice, k->specials.damsizedice); send_to_char(buf, ch); } sprintf(buf, "Carried/Max: weight: %d/%d, items: %d/%d; ", IS_CARRYING_W(k)/10, CAN_CARRY_W(k)/10, IS_CARRYING_N(k), CAN_CARRY_N(k)); for (i = 0, j = k->inventory; j; j = j->next_content, i++) ; sprintf(buf, "%sItems in: inventory: %d, ", buf, i); for (i = 0, i2 = 0; i < MAX_WEAR; i++) if (k->equipment[i]) i2++; sprintf(buf2, "eq: %d, ", i2); strcat(buf, buf2); sprintf(buf2, "Encumberance Level: %d\r\n",encumberance_level(k)); strcat(buf, buf2); send_to_char(buf, ch); sprintf(buf, "Light Value: %s%d%s, Hunger: %d, Thirst: %d, Drunk: %d\r\n", CCBYEL(ch,C_NRM),k->light,CCNRM(ch,C_NRM), GET_COND(k, FULL), GET_COND(k, THIRST), GET_COND(k, DRUNK)); send_to_char(buf, ch); sprintf(buf2," "); if (IS_MOB(k)){ sprintf(buf,"Hates:"); if (!k->specials.memory) sprintf(buf2," no-one"); else{ for(curr=k->specials.memory;curr;curr=curr->next) for (ii=0;ii<=top_of_p_table;ii++){ if (player_table[ii].id_num == curr->id) sprintf(buf2,"%s %s",buf2,player_table[ii].name);}} sprintf(buf,"%s %s\r\n",buf,buf2); send_to_char(buf,ch); } sprintf(buf, "Master is: %s, Followers are:", ((k->master) ? GET_NAME(k->master) : "<none>")); for (fol = k->followers; fol; fol = fol->next) { sprintf(buf2, "%s %s", found++ ? "," : "", PERS(fol->follower, ch)); strcat(buf, buf2); if (strlen(buf) >= 62) { if (fol->next) send_to_char(strcat(buf, ",\r\n"), ch); else send_to_char(strcat(buf, "\r\n"), ch); *buf = found = 0; } } if (*buf) send_to_char(strcat(buf, "\r\n"), ch); if (IS_NPC(k)) { sprintbit(MOB_FLAGS(k), action_bits, buf2); sprintf(buf, "NPC flags: %s%s%s\r\n", CCCYN(ch, C_NRM), buf2, CCNRM(ch, C_NRM)); send_to_char(buf, ch); } else { sprintbit(PLR_FLAGS(k), player_bits, buf2); sprintf(buf, "PLR: %s%s%s\r\n", CCCYN(ch, C_NRM), buf2, CCNRM(ch, C_NRM)); send_to_char(buf, ch); sprintbit(PRF_FLAGS(k), preference_bits, buf2); sprintf(buf, "PRF: %s%s%s\r\n", CCGRN(ch, C_NRM), buf2, CCNRM(ch, C_NRM)); send_to_char(buf, ch); } /* Showing the bitvector */ sprintbit(k->specials.affected_by, affected_bits, buf2); sprintf(buf, "AFF: %s%s%s\r\n", CCYEL(ch, C_NRM), buf2, CCNRM(ch, C_NRM)); send_to_char(buf, ch); /* Routine to show what spells a char is affected by */ if (k->affected) { for (aff = k->affected; aff; aff = aff->next) { *buf2 = '\0'; if ((name = find_skill_name(aff->type))){ sprintf(buf, "SKL: (%3dhr) %s%-21s%s ", aff->duration+1, CCCYN(ch, C_NRM), name, CCNRM(ch, C_NRM)); if (aff->modifier && aff->type < 400) sprintf(buf, "%s %+d to %s ", buf, aff->modifier, apply_types[(int)aff->location]); } else if ((name = find_spell_name(aff->type))){ sprintf(buf, "SPL: (%3dhr) %s%-21s %slevel: %3d%s ", aff->duration+1, CCCYN(ch, C_NRM), name, CCGRN(ch,C_NRM),aff->level,CCNRM(ch, C_NRM) ); if (aff->modifier && aff->type < 400) sprintf(buf, "%s %+d to %s ", buf, aff->modifier, apply_types[(int)aff->location]); } if (aff->bitvector) { if (*buf2) strcat(buf, ", sets: "); else strcat(buf, "sets: "); sprintbit(aff->bitvector, affected_bits, buf2); strcat(buf, buf2); } send_to_char(strcat(buf, "\r\n"), ch); } } } ACMD(do_whohas) { int vnum, total=0,gtotal=0,i; struct rent_info rent; char fname[MAX_INPUT_LENGTH]; FILE *rf; if (!(*argument)) { send_to_char("Usage: whohas object_vnum#.\r\n",ch); return; } if (IS_NPC(ch)) { send_to_char("Why would a monster want to know?\r\n", ch); return; } one_argument(argument, arg); vnum = atoi(arg); if (real_object(vnum) < 0){ send_to_char("No such object sorry.\r\n",ch); return;} sprintf(buf,"Checking object vnum: %d\r\n",vnum); send_to_char(buf,ch); for (i=0;i <= top_of_p_table;i++){ if(!Crash_get_filename((player_table +i)->name,fname)) return; if (!(rf = fopen(fname,"r+b"))){ if (errno != ENOENT) { /* if it fails, NOT because of no file */ sprintf(buf1, "SYSERR: READING OBJECT FILE %s", fname); perror(buf1); send_to_char(buf1,ch); } continue; } fread(&rent, sizeof(struct rent_info),1, rf); total =0; if (rent.version == 0){ struct obj_file_elem_0 tmp_p; while (!feof(rf)) { fread(&tmp_p, sizeof(struct obj_file_elem_0),1,rf); if (tmp_p.item_number == vnum) total++; tmp_p.item_number =0; } } else if (rent.version == 1) { struct obj_file_elem_1 tmp_p; while (!feof(rf)) { fseek( rf,1,1); fread(&tmp_p, sizeof(struct obj_file_elem_1),1,rf); if (tmp_p.item_number == vnum) total++; tmp_p.item_number =0; } } else if (rent.version == 2) { struct obj_file_elem tmp_p; while (!feof(rf)) { fseek( rf,1,1); fread(&tmp_p, sizeof(struct obj_file_elem),1,rf); if (tmp_p.item_number == vnum) total++; tmp_p.item_number =0; } } fclose(rf); if (total >0){ gtotal += total; sprintf(buf,"%s has %d.\r\n",(player_table +i)->name, total); send_to_char(buf,ch); } } sprintf(buf,"total in rent %d.\r\n", gtotal); send_to_char(buf,ch); if (obj_proto[real_object(vnum)].obj_flags.value[6] >0){ for (i=0;i<top_of_ol_table;i++) if (obj_limit_table[i].obj_num == vnum) break; sprintf(buf,"Limit data says: %d on chars.\r\n", obj_limit_table[i].no_stored); send_to_char(buf,ch); if (obj_limit_table[i].no_stored != gtotal){ obj_limit_table[i].no_stored = gtotal; send_to_char("Limit data corrected.\r\n",ch); save_all_object_limit_data();} } }