/* ************************************************************************ * file: actwiz.c , Implementation of commands. Part of DIKUMUD * * Usage : Wizard Commands. * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ************************************************************************* */ #include <stdio.h> #include <string.h> #include <ctype.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 "race.h" /* external vars */ extern int DEBUG; extern int DEBUG2; extern struct zone_data *zone_table; extern int top_of_zone_table; extern struct hash_header room_db; extern struct char_data *character_list; extern struct descriptor_data *descriptor_list; extern struct title_type titles[4][ABS_MAX_LVL]; extern struct index_data *mob_index; extern struct index_data *obj_index; extern int top_of_mobt; extern int top_of_objt; extern struct int_app_type int_app[26]; extern struct wis_app_type wis_app[26]; /* external functs */ void set_title(struct char_data *ch); int str_cmp(char *arg1, char *arg2); struct time_info_data age(struct char_data *ch); void sprinttype(int type, char *names[], char *result); void sprintbit(unsigned long, char *[], char *); int mana_limit(struct char_data *ch); int hit_limit(struct char_data *ch); int move_limit(struct char_data *ch); int mana_gain(struct char_data *ch); int hit_gain(struct char_data *ch); int move_gain(struct char_data *ch); void RoomSave(struct char_data *ch, int start, int end); void RoomLoad(struct char_data *ch, int start, int end); void do_look(struct char_data *ch, char *argument, int cmd); void do_polymorph(struct char_data *ch, char *argument, int cmdnum) { } void do_instazone(struct char_data *ch, char *argument, int cmdnum) { char cmd, c, buf[80]; int i, start_room, end_room, j, arg1, arg2, arg3; struct char_data *p; struct obj_data *o; struct room_data *room; FILE *fp; if(DEBUG) dlog("do_instazone"); if (IS_NPC(ch)) return; /* * read in parameters (room #s) */ start_room = -1; end_room = -1; sscanf(argument, "%d%c%d", &start_room, &c, &end_room); if ((start_room == -1) || (end_room == -1)) { send_to_char("mkzone <start_room> <end_room>\n\r", ch); return; } fp = (FILE *)MakeZoneFile(ch); if (!fp) { send_to_char("Couldn't make file.. try again later\n\r", ch); return; } for (i = start_room; i<=end_room; i++) { room = real_roomp(i); if (room) { /* * first write out monsters */ for (p = room->people; p; p = p->next_in_room) { if (IS_NPC(p)) { cmd = 'M'; arg1 = MobVnum(p); arg2 = mob_index[p->nr].number; arg3 = i; Zwrite(fp, cmd, 0, arg1, arg2, arg3, p->player.short_descr); for (j = 0; j<MAX_WEAR; j++) { if (p->equipment[j]) { if (p->equipment[j]->item_number >= 0) { cmd = 'E'; arg1 = ObjVnum(p->equipment[j]); arg2 = obj_index[p->equipment[j]->item_number].number; arg3 = j; strcpy(buf, p->equipment[j]->short_description); Zwrite(fp, cmd,1,arg1, arg2, arg3, buf); RecZwriteObj(fp, p->equipment[j]); } } } for (o = p->carrying; o; o=o->next_content) { if (o->item_number >= 0) { cmd = 'G'; arg1 = ObjVnum(o); arg2 = obj_index[o->item_number].number; arg3 = 0; strcpy(buf, o->short_description); Zwrite(fp, cmd, 1, arg1, arg2, arg3, buf); RecZwriteObj(fp, o); } } } } /* * write out objects in rooms */ for (o = room->contents; o; o= o->next_content) { if (o->item_number >= 0) { cmd = 'O'; arg1 = ObjVnum(o); arg2 = obj_index[o->item_number].number; arg3 = i; strcpy(buf, o->short_description); Zwrite(fp, cmd, 0, arg1, arg2, arg3, buf); RecZwriteObj(fp, o); } } /* * lastly.. doors */ for (j = 0; j < 6; j++) { /* * if there is an door type exit, write it. */ if (room->dir_option[j]) { /* is a door */ if (room->dir_option[j]->exit_info) { cmd = 'D'; arg1 = i ; arg2 = j; arg3 = 0; if (IS_SET(room->dir_option[j]->exit_info, EX_CLOSED)) { arg3 = 1; } if (IS_SET(room->dir_option[j]->exit_info, EX_LOCKED)) { arg3 = 2; } Zwrite(fp, cmd, 0, arg1, arg2, arg3, room->name); } } } } } fclose(fp); } do_highfive(struct char_data *ch, char *argument, int cmd) { char buf[80]; char mess[120]; struct char_data *tch; if(DEBUG) dlog("do_highfive"); if (argument) { only_argument(argument, buf); if ((tch = get_char_vis(ch,buf)) != 0) { if ((GetMaxLevel(tch) >= DEMIGOD) && (!IS_NPC(tch))) { sprintf(mess, "Time stops for a moment as %s and %s high five.\n\r", ch->player.name, tch->player.name); send_to_all(mess); } else { act("$n gives you a high five", TRUE, ch, 0, tch, TO_VICT); act("You give a hearty high five to $N", TRUE, ch, 0, tch, TO_CHAR); act("$n and $N do a high five.", TRUE, ch, 0, tch, TO_NOTVICT); } } else { sprintf(buf,"I don't see anyone here like that.\n\r"); send_to_char(buf,ch); } } } do_wizlock(struct char_data *ch, char *argument, int cmd) { extern int WizLock; if(DEBUG) dlog("do_wizlock"); if (IS_NPC(ch)) { send_to_char("You cannot WizLock.\n\r",ch); return(FALSE); } if (WizLock) { send_to_char("WizLock is now off\n\r",ch); log("Wizlock is now off."); WizLock = FALSE; } else { send_to_char("WizLock is now on\n\r",ch); log("WizLock is now on."); WizLock = TRUE; } return; } do_rload(struct char_data *ch, char *argument, int cmd) { char i; int start= -1, end = -2; if(DEBUG) dlog("do_rload"); if (IS_NPC(ch)) return; if (GetMaxLevel(ch) < IMMORTAL) return; for (i = 0; *(argument + i) == ' '; i++); if (!*(argument + i)) { send_to_char("lroom <start> <end>\n\r", ch); return; } sscanf(argument,"%d %d", &start, &end); if ((start <= end) && (start != -1) && (end != -2)) { RoomLoad(ch,start,end); } } do_rsave(struct char_data *ch, char *argument, int cmd) { char i, buf[256]; int start= -1, end = -2; if(DEBUG) dlog("do_rsave"); if (IS_NPC(ch)) return; if (GetMaxLevel(ch) < IMMORTAL) return; for (i = 0; *(argument + i) == ' '; i++); if (!*(argument + i)) { send_to_char("sroom <start> <end>\n\r", ch); return; } sscanf(argument,"%d %d", &start, &end); if ((start <= end) && (start != -1) && (end != -2)) { sprintf(buf,"mv %s %s.bak", GET_NAME(ch), GET_NAME(ch)); system(buf); RoomSave(ch,start,end); } } do_emote(struct char_data *ch, char *argument, int cmd) { int i; char buf[MAX_INPUT_LENGTH]; if(DEBUG) dlog("do_emote"); if (IS_NPC(ch) && (cmd != 0)) return; for (i = 0; *(argument + i) == ' '; i++); if (!*(argument + i)) send_to_char("Yes.. But what?\n\r", ch); else { sprintf(buf,"$n %s", argument + i); act(buf,FALSE,ch,0,0,TO_ROOM); send_to_char("Ok.\n\r", ch); } } do_set(struct char_data *ch, char *argument, int cmd) { char field[20], name[20], parmstr[50]; int index; struct char_data *mob; int parm, parm2; char *pset_list[] = { "align", "exp", "sex", "race", "hit", "mhit", "tohit", "bank", "gold", "prac", "str", "int", "wis", "dex", "con", "stradd", '\0' }; char tmp[80]; if(DEBUG) dlog("do_set"); if (IS_NPC(ch)) return; argument = one_argument(argument, name); argument = one_argument(argument, field); strncpy(tmp,argument,79); argument = one_argument(argument, parmstr); if ((mob = get_char_vis(ch, name)) == NULL) { send_to_char("I don't see them here? \n\r\n\r",ch); send_to_char("Usage: pset <name> <att> <val>\n\r",ch); send_to_char("att: align, exp, sex, race, hit, mhit\n\r",ch); send_to_char(" tohit, bank, gold, prac\n\r",ch); return; } for(index=0;pset_list[index];index++) if(!strcmp(field,pset_list[index])) { sscanf(parmstr,"%d",&parm); if(!parm) { send_to_char("You must also supply a value\n\r",ch); return; } break; } switch(index) { case 0: GET_ALIGNMENT(mob) = parm; break; case 1: GET_EXP(mob) = parm; break; case 2: GET_SEX(mob) = parm; break; case 3: GET_RACE(mob) = parm; break; case 4: GET_HIT(mob) = parm; break; case 5: mob->points.max_hit = parm; break; case 6: GET_HITROLL(mob)=parm; break; case 7: GET_BANK(mob) = parm; break; case 8: GET_GOLD(mob) = parm; break; case 9: mob->specials.spells_to_learn = parm; break; case 10: mob->abilities.str = parm; mob->tmpabilities = mob->abilities; break; case 11: mob->abilities.intel = parm; mob->tmpabilities = mob->abilities; break; case 12: mob->abilities.wis = parm; mob->tmpabilities = mob->abilities; break; case 13: mob->abilities.dex = parm; mob->tmpabilities = mob->abilities; break; case 14: mob->abilities.con = parm; mob->tmpabilities = mob->abilities; break; case 15: mob->abilities.str_add = parm; mob->tmpabilities = mob->abilities; break; default: { send_to_char("Usage: pset <name> <att> <val>\n\r",ch); send_to_char("att: align, exp, sex, race, hit, mhit\n\r",ch); send_to_char(" tohit, bank, gold, prac,\n\r",ch); send_to_char(" str,int,wis,dex,con,stradd,\n\r",ch); }; } } do_give_priv(struct char_data *ch, char *argument, int cmd) { char field[20], name[20], parmstr[50]; char buf[256]; int index; struct char_data *mob; int parm, parm2; char *pset_list[] = { "privs", "force", "trans", "shutdown", "load", "restore", "restore_a", "stat", "switch", "reroll", "snoop", "string", "builder", "pretitle", "whod", "system", "logs", "debug", "goto", "at", '\0' }; char tmp[80]; if (IS_NPC(ch)) return; if(strcmp("cyric",GET_NAME(ch)) || IS_NOT_SET(GET_PRIV(ch),PRIV_GIVE_PRIV)) return; argument = one_argument(argument, name); argument = one_argument(argument, field); strncpy(tmp,argument,79); argument = one_argument(argument, parmstr); if ((mob = get_char_vis(ch, name)) == NULL) { send_to_char("I don't see them here? \n\r\n\r",ch); send_to_char("Usage: priv <name> <att> <1/0>\n\r",ch); for(index=0;pset_list[index];index++) { sprintf(buf,"\t%s\n\r",pset_list[index]); send_to_char(buf,ch); } return; } for(index=0;pset_list[index];index++) if(!strcmp(field,pset_list[index])) { parm2 = sscanf(parmstr,"%d",&parm); if(!parm2) { send_to_char("You must also supply a 1 or 0\n\r",ch); return; } break; } switch(index) { case 0: if(parm) SET_BIT(GET_PRIV(mob),PRIV_GIVE_PRIV); else REMOVE_BIT(GET_PRIV(mob),PRIV_GIVE_PRIV); break; case 1: if(parm) SET_BIT(GET_PRIV(mob),PRIV_FORCE); else REMOVE_BIT(GET_PRIV(mob),PRIV_FORCE); break; case 2: if(parm) SET_BIT(GET_PRIV(mob),PRIV_TRANS); else REMOVE_BIT(GET_PRIV(mob),PRIV_TRANS); break; case 3: if(parm) SET_BIT(GET_PRIV(mob),PRIV_SHUTDOWN); else REMOVE_BIT(GET_PRIV(mob),PRIV_SHUTDOWN); break; case 4: if(parm) SET_BIT(GET_PRIV(mob),PRIV_LOAD_PURGE); else REMOVE_BIT(GET_PRIV(mob),PRIV_LOAD_PURGE); break; case 5: if(parm) SET_BIT(GET_PRIV(mob),PRIV_RESTORE); else REMOVE_BIT(GET_PRIV(mob),PRIV_RESTORE); break; case 6: if(parm) SET_BIT(GET_PRIV(mob),PRIV_RESTORE_A); else REMOVE_BIT(GET_PRIV(mob),PRIV_RESTORE_A); break; case 7: if(parm) SET_BIT(GET_PRIV(mob),PRIV_STAT); else REMOVE_BIT(GET_PRIV(mob),PRIV_STAT); break; case 8: if(parm) SET_BIT(GET_PRIV(mob),PRIV_SWITCH); else REMOVE_BIT(GET_PRIV(mob),PRIV_SWITCH); break; case 9: if(parm) SET_BIT(GET_PRIV(mob),PRIV_SWITCH); else REMOVE_BIT(GET_PRIV(mob),PRIV_SWITCH); break; if(parm) SET_BIT(GET_PRIV(mob),PRIV_REROLL_ADVANCE_PSET); else REMOVE_BIT(GET_PRIV(mob),PRIV_REROLL_ADVANCE_PSET); break; case 11: if(parm) SET_BIT(GET_PRIV(mob),PRIV_SNOOP); else REMOVE_BIT(GET_PRIV(mob),PRIV_SNOOP); break; case 12: if(parm) SET_BIT(GET_PRIV(mob),PRIV_STRING_TITLE); else REMOVE_BIT(GET_PRIV(mob),PRIV_STRING_TITLE); break; case 13: if(parm) SET_BIT(GET_PRIV(mob),PRIV_BUILDER); else REMOVE_BIT(GET_PRIV(mob),PRIV_BUILDER); break; case 14: if(parm) SET_BIT(GET_PRIV(mob),PRIV_PRETITLE); else REMOVE_BIT(GET_PRIV(mob),PRIV_PRETITLE); break; case 15: if(parm) SET_BIT(GET_PRIV(mob),PRIV_WHOD); else REMOVE_BIT(GET_PRIV(mob),PRIV_WHOD); break; case 16: if(parm) SET_BIT(GET_PRIV(mob),PRIV_SYSTEM); else REMOVE_BIT(GET_PRIV(mob),PRIV_SYSTEM); break; case 17: if(parm) SET_BIT(GET_PRIV(mob),PRIV_LOGS); else REMOVE_BIT(GET_PRIV(mob),PRIV_LOGS); break; case 18: if(parm) SET_BIT(GET_PRIV(mob),PRIV_DEBUG); else REMOVE_BIT(GET_PRIV(mob),PRIV_DEBUG); break; case 19: if(parm) SET_BIT(GET_PRIV(mob),PRIV_GOTO_AT); else REMOVE_BIT(GET_PRIV(mob),PRIV_GOTO_AT); break; default: { send_to_char("You wrote it, you should know how to use it.\n",ch); }; } } void do_shutdow(struct char_data *ch, char *argument, int cmd) { if(DEBUG) dlog("do_shutdow"); send_to_char("If you want to shut something down - say so!\n\r", ch); } void do_shutdown(struct char_data *ch, char *argument, int cmd) { extern int shutdown, reboot; char buf[100], arg[MAX_INPUT_LENGTH]; if(DEBUG) dlog("do_shutdown"); if (IS_NPC(ch)) return; one_argument(argument, arg); if (!*arg) { sprintf(buf, "Shutdown by %s.", GET_NAME(ch) ); send_to_all(buf); log(buf); shutdown = 1; } else if (!str_cmp(arg, "reboot")) { sprintf(buf, "Reboot by %s.", GET_NAME(ch)); send_to_all(buf); log(buf); shutdown = reboot = 1; } else send_to_char("Go shut down someone your own size.\n\r", ch); } void do_snoop(struct char_data *ch, char *argument, int cmd) { static char arg[MAX_STRING_LENGTH]; struct char_data *victim; if(DEBUG) dlog("do_snoop"); if (!ch->desc) return; if (IS_NPC(ch)) return; only_argument(argument, arg); if(!*arg) { send_to_char("Snoop who ?\n\r",ch); return; } if(!(victim=get_char_vis(ch, arg))) { send_to_char("No such person around.\n\r",ch); return; } if(!victim->desc) { send_to_char("There's no link.. nothing to snoop.\n\r",ch); return; } if(victim == ch) { send_to_char("Ok, you just snoop yourself.\n\r",ch); if(ch->desc->snoop.snooping) { if (ch->desc->snoop.snooping->desc) ch->desc->snoop.snooping->desc->snoop.snoop_by = 0; else { char buf[MAX_STRING_LENGTH]; sprintf(buf, "caught %s snooping %s who didn't have a descriptor!", ch->player.name, ch->desc->snoop.snooping->player.name); log(buf); } ch->desc->snoop.snooping = 0; } return; } if(victim->desc->snoop.snoop_by) { send_to_char("Busy already. \n\r",ch); return; } if (GetMaxLevel(victim)>=GetMaxLevel(ch)) { send_to_char("You failed.\n\r",ch); return; } send_to_char("Ok. \n\r",ch); if(ch->desc->snoop.snooping) if (ch->desc->snoop.snooping->desc) ch->desc->snoop.snooping->desc->snoop.snoop_by = 0; ch->desc->snoop.snooping = victim; victim->desc->snoop.snoop_by = ch; return; } void do_switch(struct char_data *ch, char *argument, int cmd) { static char arg[80]; struct char_data *victim; if(DEBUG) dlog("do_switch"); if (IS_NPC(ch)) return; only_argument(argument, arg); if (!*arg) { send_to_char("Switch with who?\n\r", ch); } else { if (!(victim = get_char(arg))) send_to_char("They aren't here.\n\r", ch); else { if (ch == victim) { send_to_char("He he he... We are jolly funny today, eh?\n\r", ch); return; } if (!ch->desc || ch->desc->snoop.snoop_by || ch->desc->snoop.snooping) { send_to_char("Mixing snoop & switch is bad for your health.\n\r", ch); return; } if(victim->desc || (!IS_NPC(victim))) { send_to_char( "You can't do that, the body is already in use!\n\r",ch); } else { send_to_char("Ok.\n\r", ch); ch->desc->character = victim; ch->desc->original = ch; victim->desc = ch->desc; ch->desc = 0; } } } } void do_return(struct char_data *ch, char *argument, int cmd) { struct char_data *mob, *per; if(DEBUG) dlog("do_return"); if(!ch->desc) return; if(!ch->desc->original) { send_to_char("Huh? Talk sense I cant understand you\n\r", ch); return; } else { send_to_char("You return to your original body.\n\r",ch); if (IS_SET(ch->specials.act, ACT_POLYSELF) && cmd) { mob = ch; per = ch->desc->original; act("$n turns liquid, and reforms as $N", TRUE, mob, 0, per, TO_ROOM); char_from_room(per); char_to_room(per,mob->in_room); SwitchStuff(mob, per); } ch->desc->character = ch->desc->original; ch->desc->original = 0; ch->desc->character->desc = ch->desc; ch->desc = 0; if (IS_SET(ch->specials.act, ACT_POLYSELF) && cmd) { extract_char(mob); } } } void do_force(struct char_data *ch, char *argument, int cmd) { struct descriptor_data *i; struct char_data *vict; extern struct char_data *board_kludge_char; char name[100], to_force[100],buf[100]; if(DEBUG) dlog("do_force"); if (IS_NPC(ch) && (cmd != 0)) return; half_chop(argument, name, to_force); if (!*name || !*to_force) send_to_char("Who do you wish to force to do what?\n\r", ch); else if (str_cmp("all", name)) { if (!(vict = get_char_vis(ch, name))) send_to_char("No-one by that name here..\n\r", ch); else { if ((GetMaxLevel(ch) <= GetMaxLevel(vict)) && (!IS_NPC(vict))) send_to_char("Oh no you don't!!\n\r", ch); else { sprintf(buf, "$n has forced you to '%s'.", to_force); act(buf, FALSE, ch, 0, vict, TO_VICT); send_to_char("Ok.\n\r", ch); command_interpreter(vict, to_force); } } } else { /* force all */ for (i = descriptor_list; i; i = i->next) if (i->character != ch && !i->connected && i->character != board_kludge_char) { vict = i->character; if ((GetMaxLevel(ch) <= GetMaxLevel(vict)) && (!IS_NPC(vict))) send_to_char("Oh no you don't!!\n\r", ch); else { sprintf(buf, "$n has forced you to '%s'.", to_force); act(buf, FALSE, ch, 0, vict, TO_VICT); command_interpreter(vict, to_force); } } send_to_char("Ok.\n\r", ch); } } void do_load(struct char_data *ch, char *argument, int cmd) { struct char_data *mob; struct obj_data *obj; char type[100], num[100]; int number; extern int top_of_mobt; extern int top_of_objt; if(DEBUG) dlog("do_load"); if (IS_NPC(ch)) return; argument = one_argument(argument, type); only_argument(argument, num); if (isdigit(*num)) number = atoi(num); else number = -1; if (is_abbrev(type, "mobile")) { if (number<0) { for (number = 0; number<=top_of_mobt; number++) if (isname(num, mob_index[number].name)) break; if (number>top_of_mobt) number = -1; } else { number = real_mobile(number); } if ( number<0 || number>top_of_mobt) { send_to_char("There is no such monster.\n\r", ch); return; } mob = read_mobile(number, REAL); char_to_room(mob, ch->in_room); act("$n makes a quaint, magical gesture with one hand.", TRUE, ch, 0, 0, TO_ROOM); act("$n has summoned $N from the ether!", FALSE, ch, 0, mob, TO_ROOM); act("You bring forth $N from the the cosmic ether.", FALSE, ch, 0, mob, TO_CHAR); } else if (is_abbrev(type, "object")) { if (number<0) { for (number = 0; number<=top_of_objt; number++) if (isname(num, obj_index[number].name)) break; if (number>top_of_objt) number = -1; } else { number = real_object(number); } if ( number<0 || number>top_of_mobt) { send_to_char("There is no such object.\n\r", ch); return; } obj = read_object(number, REAL); obj_to_char(obj, ch); act("$n makes a strange magical gesture.", TRUE, ch, 0, 0, TO_ROOM); act("$n has created $p!", FALSE, ch, obj, 0, TO_ROOM); act("You now have $p.", FALSE, ch, obj, 0, TO_CHAR); } else if (is_abbrev(type, "room")) { int start, end; if (GetMaxLevel(ch) < CREATOR) return; switch (sscanf(num, "%d %d", &start, &end)) { case 2: /* we got both numbers */ RoomLoad(ch, start, end); break; case 1: /* we only got one, load it */ RoomLoad(ch, start, start); break; default: send_to_char("Load? Fine! Load we must, But what?\n\r", ch); break; } } else { send_to_char("Usage: load (object|mobile) (number|name)\n\r" " load room start [end]\n\r", ch); } } static void purge_one_room(int rnum, struct room_data *rp, int *range) { struct char_data *ch; struct obj_data *obj; if(DEBUG) dlog("purge_one_room"); if (rnum==0 || rnum < range[0] || rnum > range[1]) return; while (rp->people) { ch = rp->people; send_to_char("The gods strike down from the heavens making the", ch); send_to_char("world tremble. All that's left is the Void.", ch); char_from_room(ch); char_to_room(ch, 0); /* send character to the void */ do_look(ch, "", 15); act("$n tumbles into the Void.", TRUE, ch, 0, 0, TO_ROOM); } while (rp->contents) { obj = rp->contents; obj_from_room(obj); obj_to_room(obj, 0); /* send item to the void */ } completely_cleanout_room(rp); /* clear out the pointers */ hash_remove(&room_db, rnum); /* remove it from the database */ } /* clean a room of all mobiles and objects */ void do_purge(struct char_data *ch, char *argument, int cmd) { struct char_data *vict, *next_v; struct obj_data *obj, *next_o; char name[100]; if(DEBUG) dlog("do_purge"); if (IS_NPC(ch)) return; only_argument(argument, name); if (*name) { /* argument supplied. destroy single object or char */ if (vict = get_char_room_vis(ch, name)) { if ((!IS_NPC(vict) || IS_SET(vict->specials.act, ACT_POLYSELF)) && (GetMaxLevel(ch)<IMPLEMENTOR)) { send_to_char("I'm sorry, Dave. I can't let you do that.\n\r", ch); return; } act("$n disintegrates $N.", FALSE, ch, 0, vict, TO_NOTVICT); if (IS_NPC(vict) || (!IS_SET(ch->specials.act, ACT_POLYSELF))) { extract_char(vict); } else { if (vict->desc) { close_socket(vict->desc); vict->desc = 0; extract_char(vict); } else { extract_char(vict); } } } else if (obj = get_obj_in_list_vis (ch, name, real_roomp(ch->in_room)->contents)) { act("$n destroys $p.", FALSE, ch, obj, 0, TO_ROOM); extract_obj(obj); } else { argument = one_argument(argument, name); if (0==str_cmp("room", name)) { int range[2]; if (GetMaxLevel(ch)<IMPLEMENTOR) { send_to_char("I'm sorry, Dave. I can't let you do that.\n\r", ch); return; } argument = one_argument(argument,name); if (!isdigit(*name)) { send_to_char("purge room start [end]",ch); return; } range[0] = atoi(name); argument = one_argument(argument,name); if (isdigit(*name)) range[1] = atoi(name); else range[1] = range[0]; if (range[0]==0 || range[1]==0) { send_to_char("usage: purge room start [end]\n\r", ch); return; } hash_iterate(&room_db,purge_one_room,range); } else { send_to_char("I don't see that here.\n\r", ch); return; } } send_to_char("Ok.\n\r", ch); } else { /* no argument. clean out the room */ if (GetMaxLevel(ch) < DEMIGOD) return; if (IS_NPC(ch)) { send_to_char("You would only kill yourself..\n\r", ch); return; } act("$n gestures, the world erupts around you in flames!", FALSE, ch, 0, 0, TO_ROOM); send_to_room("The world seems a little cleaner.\n\r", ch->in_room); for (vict = real_roomp(ch->in_room)->people; vict; vict = next_v) { next_v = vict->next_in_room; if (IS_NPC(vict) && (!IS_SET(vict->specials.act, ACT_POLYSELF))) extract_char(vict); } for (obj = real_roomp(ch->in_room)->contents; obj; obj = next_o) { next_o = obj->next_content; extract_obj(obj); } } } /* Give pointers to the five abilities */ void roll_abilities(struct char_data *ch) { int i, j, k, temp; ubyte table[5]; ubyte rools[4]; if(DEBUG) dlog("roll_abilities"); for(i=0; i<5; table[i++]=0) ; for(i=0; i<5; i++) { for(j=0; j<4; j++) rools[j] = number(1,6); temp = rools[0]+rools[1]+rools[2]+rools[3] - MIN(rools[0], MIN(rools[1], MIN(rools[2],rools[3]))); for(k=0; k<5; k++) if (table[k] < temp) SWITCH(temp, table[k]); } ch->abilities.str_add = 0; switch (ch->player.class) { case CLASS_MAGIC_USER: { ch->abilities.intel = table[0]; ch->abilities.wis = table[1]; ch->abilities.dex = table[2]; ch->abilities.str = table[3]; ch->abilities.con = table[4]; } break; case CLASS_DRUID: { ch->abilities.wis = table[0]; ch->abilities.intel = table[1]; ch->abilities.str = table[2]; ch->abilities.dex = table[3]; ch->abilities.con = table[4]; } break; case CLASS_CLERIC: { ch->abilities.wis = table[0]; ch->abilities.intel = table[1]; ch->abilities.str = table[2]; ch->abilities.dex = table[3]; ch->abilities.con = table[4]; } break; case CLASS_CLERIC+CLASS_MAGIC_USER: { ch->abilities.wis = table[0]; ch->abilities.intel = table[1]; ch->abilities.dex = table[2]; ch->abilities.str = table[3]; ch->abilities.con = table[4]; } break; case CLASS_THIEF: { ch->abilities.dex = table[0]; ch->abilities.intel = table[1]; ch->abilities.str = table[2]; ch->abilities.con = table[3]; ch->abilities.wis = table[4]; } break; case CLASS_THIEF+CLASS_MAGIC_USER: { ch->abilities.intel = table[0]; ch->abilities.dex = table[1]; ch->abilities.str = table[2]; ch->abilities.con = table[3]; ch->abilities.wis = table[4]; } break; case CLASS_THIEF+CLASS_CLERIC: { ch->abilities.wis = table[0]; ch->abilities.dex = table[1]; ch->abilities.intel = table[2]; ch->abilities.str = table[3]; ch->abilities.con = table[4]; } break; case CLASS_THIEF+CLASS_MAGIC_USER+CLASS_CLERIC : { ch->abilities.wis = table[0]; ch->abilities.intel = table[1]; ch->abilities.dex = table[2]; ch->abilities.str = table[3]; ch->abilities.con = table[4]; } break; case CLASS_RANGER: { ch->abilities.str = table[0]; ch->abilities.con = table[3]; ch->abilities.dex = table[2]; ch->abilities.wis = table[1]; ch->abilities.intel = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR: { ch->abilities.str = table[0]; ch->abilities.con = table[1]; ch->abilities.dex = table[2]; ch->abilities.wis = table[3]; ch->abilities.intel = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = number(0,100); } break; case CLASS_WARRIOR+CLASS_MAGIC_USER: { ch->abilities.str = table[0]; ch->abilities.intel = table[1]; ch->abilities.con = table[2]; ch->abilities.dex = table[3]; ch->abilities.wis = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR+CLASS_CLERIC: { ch->abilities.wis = table[0]; ch->abilities.str = table[1]; ch->abilities.intel = table[2]; ch->abilities.con = table[3]; ch->abilities.dex = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR+CLASS_THIEF: { ch->abilities.str = table[0]; ch->abilities.dex = table[1]; ch->abilities.con = table[2]; ch->abilities.intel = table[3]; ch->abilities.wis = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR+CLASS_MAGIC_USER+CLASS_CLERIC: { ch->abilities.wis = table[0]; ch->abilities.str = table[1]; ch->abilities.intel = table[2]; ch->abilities.dex = table[3]; ch->abilities.con = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR+CLASS_MAGIC_USER+CLASS_THIEF: { ch->abilities.intel = table[0]; ch->abilities.str = table[1]; ch->abilities.dex = table[2]; ch->abilities.con = table[3]; ch->abilities.wis = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; case CLASS_WARRIOR+CLASS_THIEF+CLASS_CLERIC: { ch->abilities.str = table[0]; ch->abilities.wis = table[1]; ch->abilities.dex = table[2]; ch->abilities.intel = table[3]; ch->abilities.con = table[4]; if (ch->abilities.str == 18) ch->abilities.str_add = 0; } break; default: log("Error on class (do_reroll)"); } switch(GET_RACE(ch)) { case RACE_ELVEN: ch->abilities.intel +=1; break; case RACE_DWARF: ch->abilities.con +=1; ch->abilities.intel -=1; break; case RACE_HALFLING: ch->abilities.dex +=1; ch->abilities.con -=1; break; case RACE_GNOME: ch->abilities.wis +=1; ch->abilities.dex -=1; break; } if(ch->abilities.str > 18) ch->abilities.str = 18; if(ch->abilities.dex > 18) ch->abilities.dex = 18; if(ch->abilities.intel > 18) ch->abilities.intel = 18; if(ch->abilities.wis > 18) ch->abilities.wis = 18; if(ch->abilities.con > 18) ch->abilities.con = 18; ch->tmpabilities = ch->abilities; } void do_start(struct char_data *ch) { int i, r_num; struct obj_data *obj; extern struct dex_skill_type dex_app_skill[]; void advance_level(struct char_data *ch, int i); if(DEBUG) dlog("do_start"); StartLevels(ch); GET_EXP(ch) = 1; set_title(ch); roll_abilities(ch); ch->points.max_hit=20; /* Heafty Bread */ if ((r_num = real_object(5016)) >= 0) { obj = read_object(r_num, REAL); obj_to_char(obj,ch); /* */ obj = read_object(r_num, REAL); obj_to_char(obj,ch); } /* Bottle of Water */ if ((r_num = real_object(3003)) >= 0) { obj = read_object(r_num, REAL); obj_to_char(obj,ch); obj = read_object(r_num, REAL); obj_to_char(obj,ch); } /* Club */ if ((r_num = real_object(3048)) >= 0 ) { obj = read_object(r_num,REAL); obj_to_char(obj,ch); } /* Map of Shylar */ if((r_num = real_object(3050)) >= 0) { obj = read_object(r_num,REAL); obj_to_char(obj,ch); } if (IS_SET(ch->player.class, CLASS_RANGER)) { ch->skills[SKILL_HUNT].learned = 1; ch->skills[SKILL_DISARM].learned = 1; } if (IS_SET(ch->player.class, CLASS_THIEF)) { ch->skills[SKILL_SNEAK].learned = 1; ch->skills[SKILL_HIDE].learned = 1; ch->skills[SKILL_STEAL].learned = 1; ch->skills[SKILL_BACKSTAB].learned = 1; ch->skills[SKILL_PICK_LOCK].learned = 1; } GET_HIT(ch) = GET_MAX_HIT(ch); GET_MANA(ch) = GET_MAX_MANA(ch); ch->points.max_move = GET_MAX_MOVE(ch); GET_MOVE(ch) = GET_MAX_MOVE(ch); GET_COND(ch,THIRST) = 24; GET_COND(ch,FULL) = 24; GET_COND(ch,DRUNK) = 0; ch->player.time.played = 0; ch->player.time.logon = time(0); } void do_advance(struct char_data *ch, char *argument, int cmd) { struct char_data *victim; char name[100], level[100], class[100]; int adv, newlevel, lin_class; void gain_exp(struct char_data *ch, int gain); if(DEBUG) dlog("do_advance"); if (IS_NPC(ch)) return; argument = one_argument(argument, name); if (*name) { if (!(victim = get_char_room_vis(ch, name))) { send_to_char("That player is not here.\n\r", ch); return; } } else { send_to_char("Advance who?\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("NO! Not on NPC's.\n\r", ch); return; } argument = one_argument(argument, class); if (!*class) { send_to_char("Classes you may suply: [ M C W T R ]\n\r",ch); return; } switch(*class) { case 'M': case 'm': lin_class = MAGE_LEVEL_IND; break; case 'T': case 't': lin_class = THIEF_LEVEL_IND; break; case 'W': case 'w': case 'F': case 'f': lin_class = WARRIOR_LEVEL_IND; break; case 'C': case 'c': case 'P': case 'p': lin_class = CLERIC_LEVEL_IND; break; case 'R': case 'r': lin_class = RANGER_LEVEL_IND; break; case 'D': case 'd': lin_class = DRUID_LEVEL_IND; break; default: send_to_char("Classes you may use [ M C W T R ]\n\r", ch); return; break; } argument = one_argument(argument, level); if (GET_LEVEL(victim, lin_class) == 0) adv = 1; else if (!*level) { send_to_char("You must supply a level number.\n\r", ch); return; } else { if (!isdigit(*level)) { send_to_char("Third argument must be a positive integer.\n\r",ch); return; } if ((newlevel = atoi(level)) < GET_LEVEL(victim, lin_class)) { send_to_char("Can't dimish a players status (yet).\n\r", ch); return; } adv = newlevel - GET_LEVEL(victim,lin_class); } if(((adv + GET_LEVEL(victim, lin_class))>1) && (GetMaxLevel(ch) < IMPLEMENTOR)) { send_to_char("Thou art not godly enough.\n\r", ch); return; } if ((adv + GET_LEVEL(victim, lin_class)) > IMPLEMENTOR) { send_to_char("Implementor is the highest possible level.\n\r", ch); return; } if (((adv + GET_LEVEL(victim, lin_class)) < 1)&& ((adv + GET_LEVEL(victim, lin_class)) != 1)) { send_to_char("1 is the lowest possible level.\n\r", ch); return; } send_to_char("You feel generous.\n\r", ch); act("$n makes some strange gestures.\n\rA strange feeling comes upon you," "\n\rLike a giant hand, light comes down from\n\rabove, grabbing your " "body, that begins\n\rto pulse with coloured lights from inside.\n\rYo" "ur head seems to be filled with daemons\n\rfrom another plane as your" " body dissolves\n\rinto the elements of time and space itself.\n\rSudde" "nly a silent explosion of light snaps\n\ryou back to reality. You fee" "l slightly\n\rdifferent.",FALSE,ch,0,victim,TO_VICT); if (GET_LEVEL(victim, lin_class) == 0) { do_start(victim); } else { if (GET_LEVEL(victim, lin_class) < IMPLEMENTOR) { int amount_needed,amount_have; amount_needed=titles[lin_class][GET_LEVEL(victim,lin_class)+adv].exp+1; amount_have = GET_EXP(victim); gain_exp_regardless(victim,amount_needed-amount_have,lin_class); send_to_char("Character is now advanced.\n\r", ch); } else { send_to_char("Some idiot just tried to advance your level.\n\r", victim); send_to_char("IMPOSSIBLE! IDIOTIC!\n\r", ch); } } } void do_reroll(struct char_data *ch, char *argument, int cmd) { struct char_data *victim; char buf[100]; if(DEBUG) dlog("do_reroll"); if (IS_NPC(ch)) return; only_argument(argument,buf); if (!*buf) send_to_char("Who do you wish to reroll?\n\r",ch); else if(!(victim = get_char(buf))) send_to_char("No-one by that name in the world.\n\r",ch); else { send_to_char("Rerolled...\n\r", ch); roll_abilities(victim); } } void do_restore_all(struct char_data *ch,char *arg,int cmd) { struct descriptor_data *i; extern struct char_data *board_kludge_char; struct char_data *vict; void do_restore(struct char_data *ch,char *arg,int cmd); if(DEBUG) dlog("do_restore_all"); for (i = descriptor_list; i; i = i->next) if(i->character!=ch&&!i->connected && i->character != board_kludge_char) { vict = i->character; do_restore(ch,GET_NAME(vict),0); } } void do_restore(struct char_data *ch, char *argument, int cmd) { struct char_data *victim; char buf[100]; int i; void update_pos( struct char_data *victim ); if(DEBUG) dlog("do_restore"); only_argument(argument,buf); if (!*buf) send_to_char("Who do you wish to restore?\n\r",ch); else if(!(victim = get_char(buf))) send_to_char("No-one by that name in the world.\n\r",ch); else { GET_MANA(victim) = GET_MAX_MANA(victim); if(!affected_by_spell(victim,SPELL_AID)) { GET_HIT(victim) = GET_MAX_HIT(victim); } else { if(GET_HIT(victim) < GET_MAX_HIT(victim)) GET_HIT(victim) = GET_MAX_HIT(victim); } GET_MOVE(victim) = GET_MAX_MOVE(victim); if (IS_NPC(victim)) return; if (GetMaxLevel(victim) < LOW_IMMORTAL) { GET_COND(victim,THIRST) = 24; GET_COND(victim,FULL) = 24; } else { GET_COND(victim,THIRST) = -1; GET_COND(victim,FULL) = -1; } if (GetMaxLevel(victim) >= CREATOR) { for (i = 0; i < MAX_SKILLS; i++) { victim->skills[i].learned = 100; victim->skills[i].recognise = TRUE; } if (GetMaxLevel(victim) >= SILLYLORD) { victim->abilities.str_add = 100; victim->abilities.intel = 25; victim->abilities.wis = 25; victim->abilities.dex = 25; victim->abilities.str = 25; victim->abilities.con = 25; } victim->tmpabilities = victim->abilities; } update_pos( victim ); send_to_char("Done.\n\r", ch); act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR); } } do_show_logs(struct char_data *ch,char *argument, int cmd) { if(DEBUG) dlog("do_show_logs"); if(IS_SET(ch->specials.act,PLR_LOGS)) { send_to_char("You will no longer recieve the logs to your screen.\n\r",ch); REMOVE_BIT(ch->specials.act,PLR_LOGS); return; } else { send_to_char("You WILL recieve the logs to your screen.\n\r",ch); SET_BIT(ch->specials.act,PLR_LOGS); return; } } do_noshout(struct char_data *ch, char *argument, int cmd) { struct char_data *vict; struct obj_data *dummy; char buf[MAX_INPUT_LENGTH]; if(DEBUG) dlog("do_noshout"); if (IS_NPC(ch)) return; only_argument(argument, buf); if (!*buf) if (IS_SET(ch->specials.act, PLR_NOSHOUT)) { send_to_char("You can now hear shouts again.\n\r", ch); REMOVE_BIT(ch->specials.act, PLR_NOSHOUT); } else { send_to_char("From now on, you won't hear shouts.\n\r", ch); SET_BIT(ch->specials.act, PLR_NOSHOUT); } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy)) send_to_char("Couldn't find any such creature.\n\r", ch); else if (IS_NPC(vict)) send_to_char("Can't do that to a beast.\n\r", ch); else if (GetMaxLevel(vict) >= GetMaxLevel(ch)) act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR); else if (IS_SET(vict->specials.act, PLR_NOSHOUT) && (GetMaxLevel(ch) >= SAINT)) { send_to_char("You can shout again.\n\r", vict); send_to_char("NOSHOUT removed.\n\r", ch); REMOVE_BIT(vict->specials.act, PLR_NOSHOUT); } else if (GetMaxLevel(ch) >= SAINT) { send_to_char("The gods take away your ability to shout!\n\r", vict); send_to_char("NOSHOUT set.\n\r", ch); SET_BIT(vict->specials.act, PLR_NOSHOUT); } else { send_to_char("Sorry, you can't do that\n\r",ch); } } void do_pager(struct char_data *ch,char *arg,int cmd) { if(DEBUG) dlog("do_pager"); if(IS_SET(ch->specials.act,PLR_PAGER)) { send_to_char("You stop using the Wiley Pager.\n\r",ch); REMOVE_BIT(ch->specials.act,PLR_PAGER); } else { send_to_char("You now USE the Wiley Pager.\n\r",ch); SET_BIT(ch->specials.act,PLR_PAGER); } } void do_nohassle(struct char_data *ch, char *argument, int cmd) { struct char_data *vict; struct obj_data *dummy; char buf[MAX_INPUT_LENGTH]; if(DEBUG) dlog("do_nohassle"); if (IS_NPC(ch)) return; only_argument(argument, buf); if (!*buf) if (IS_SET(ch->specials.act, PLR_NOHASSLE)) { send_to_char("You can now be hassled again.\n\r", ch); REMOVE_BIT(ch->specials.act, PLR_NOHASSLE); } else { send_to_char("From now on, you won't be hassled.\n\r", ch); SET_BIT(ch->specials.act, PLR_NOHASSLE); } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy)) send_to_char("Couldn't find any such creature.\n\r", ch); else if (IS_NPC(vict)) send_to_char("Can't do that to a beast.\n\r", ch); else if (GetMaxLevel(vict) > GetMaxLevel(ch)) act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR); else send_to_char("The implementor won't let you set this on mortals...\n\r",ch); } void do_stealth(struct char_data *ch, char *argument, int cmd) { struct char_data *vict; struct obj_data *dummy; char buf[MAX_INPUT_LENGTH]; if(DEBUG) dlog("do_stealth"); if (IS_NPC(ch)) return; only_argument(argument, buf); if (!*buf) if (IS_SET(ch->specials.act, PLR_STEALTH)) { send_to_char("STEALTH mode OFF.\n\r", ch); REMOVE_BIT(ch->specials.act, PLR_STEALTH); } else { send_to_char("STEALTH mode ON.\n\r", ch); SET_BIT(ch->specials.act, PLR_STEALTH); } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy)) send_to_char("Couldn't find any such creature.\n\r", ch); else if (IS_NPC(vict)) send_to_char("Can't do that to a beast.\n\r", ch); else if (GetMaxLevel(vict) > GetMaxLevel(ch)) act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR); else send_to_char("The implementor won't let you set this on mortals...\n\r",ch); } static print_room(int rnum, struct room_data *rp, struct string_block *sb) { char buf[MAX_STRING_LENGTH]; int dink,bits, scan; extern char *room_bits[]; extern char *sector_types[]; if(DEBUG) dlog("print_room"); sprintf(buf, "%5d %4d %-12s %s", rp->number, rnum, sector_types[rp->sector_type], rp->name); strcat(buf, " ["); dink=0; for (bits=rp->room_flags, scan=0; bits; scan++) { if (bits & (1<<scan)) { if (dink) strcat(buf, " "); strcat(buf, room_bits[scan]); dink=1; bits ^= (1<<scan); } } strcat(buf, "]\n\r"); append_to_string_block(sb, buf); } static void print_death_room(int rnum, struct room_data *rp, struct string_block *sb) { if(DEBUG) dlog("print_death_room"); if (rp && rp->room_flags&DEATH) print_room(rnum, rp, sb); } static void print_private_room(int rnum, struct room_data *rp, struct string_block *sb) { if(DEBUG) dlog("print_private_room"); if (rp && rp->room_flags&PRIVATE) print_room(rnum, rp, sb); } struct show_room_zone_struct { int blank; int startblank, lastblank; int bottom, top; struct string_block *sb; }; static void show_room_zone(int rnum, struct room_data *rp, struct show_room_zone_struct *srzs) { char buf[MAX_STRING_LENGTH]; if(DEBUG) dlog("show_room_zone"); if (!rp || rp->number<srzs->bottom || rp->number>srzs->top) return; /* optimize later*/ if (srzs->blank && (srzs->lastblank+1 != rp->number) ) { sprintf(buf, "rooms %d-%d are blank\n\r", srzs->startblank, srzs->lastblank); append_to_string_block(srzs->sb, buf); srzs->blank = 0; } if (1==sscanf(rp->name, "%d", &srzs->lastblank) && srzs->lastblank==rp->number) { if (!srzs->blank) { srzs->startblank = srzs->lastblank; srzs->blank = 1; } return; } else if (srzs->blank) { sprintf(buf, "rooms %d-%d are blank\n\r", srzs->startblank, srzs->lastblank); append_to_string_block(srzs->sb, buf); srzs->blank = 0; } print_room(rnum, rp, srzs->sb); } void do_show(struct char_data *ch, char *argument, int cmd) { int zone; char buf[MAX_STRING_LENGTH], zonenum[MAX_INPUT_LENGTH]; struct index_data *which_i; int bottom, top, topi; struct string_block sb; if(DEBUG) dlog("do_show"); if (IS_NPC(ch)) return; argument = one_argument(argument, buf); init_string_block(&sb); if (is_abbrev(buf, "zones")) { struct zone_data *zd; int bottom=0; append_to_string_block(&sb, "# Zone name lifespan age rooms reset\n\r"); for(zone=0; zone<=top_of_zone_table; zone++) { char *mode; zd = zone_table+zone; switch(zd->reset_mode) { case 0: mode = "never"; break; case 1: mode = "ifempty"; break; case 2: mode = "always"; break; default: mode = "!unknown!"; break; } sprintf(buf,"%4d %-40s %4dm %4dm %6d-%-6d %s\n\r", zone, zd->name, zd->lifespan, zd->age, bottom, zd->top, mode); append_to_string_block(&sb, buf); bottom = zd->top+1; } } else if (is_abbrev(buf, "objects") && (which_i=obj_index,topi=top_of_objt) || is_abbrev(buf, "mobiles") && (which_i=mob_index,topi=top_of_mobt) ) { int objn; struct index_data *oi; only_argument(argument, zonenum); zone = -1; if (1==sscanf(zonenum,"%i", &zone)&&(zone<0 || zone>top_of_zone_table )) { append_to_string_block(&sb, "That is not a valid zone_number\n\r"); return; } if (zone>=0) { bottom = zone ? (zone_table[zone-1].top+1) : 0; top = zone_table[zone].top; } append_to_string_block(&sb, "VNUM rnum count names\n\r"); for (objn=0; objn<=topi; objn++) { oi = which_i + objn; if (zone>=0 && (oi->virtual<bottom || oi->virtual>top) || zone<0 && !isname(zonenum, oi->name)) continue; /* optimize later*/ sprintf(buf,"%5d %4d %3d %s\n\r",oi->virtual,objn,oi->number,oi->name); append_to_string_block(&sb, buf); } } else if (is_abbrev(buf, "rooms")) { only_argument(argument, zonenum); append_to_string_block(&sb, "VNUM rnum type name [BITS]\n\r"); if (is_abbrev(zonenum, "death")) { hash_iterate(&room_db, print_death_room, &sb); } else if (is_abbrev(zonenum, "private")) { hash_iterate(&room_db, print_private_room, &sb); } else if (1!=sscanf(zonenum,"%i", &zone) || zone<0 || zone>top_of_zone_table) { append_to_string_block(&sb, "I need a zone number with this command\n\r"); } else { struct show_room_zone_struct srzs; srzs.bottom = zone ? (zone_table[zone-1].top+1) : 0; srzs.top = zone_table[zone].top; srzs.blank = 0; srzs.sb = &sb; hash_iterate(&room_db, show_room_zone, &srzs); if (srzs.blank) { sprintf(buf,"rooms %d-%d are blank\n\r",srzs.startblank,srzs.lastblank); append_to_string_block(&sb, buf); srzs.blank = 0; } } } else { append_to_string_block(&sb,"Usage:\n\r" " show zones\n\r" " show (objects|mobiles) (zone#|name)\n\r" " show rooms (zone#|death|private)\n\r", ch); } page_string_block(&sb,ch); destroy_string_block(&sb); } void do_debug(struct char_data *ch, char *argument, int cmd) { char arg[MAX_INPUT_LENGTH]; int i; i=0; one_argument(argument, arg); i = atoi(arg); if (i<0 || i>2) { send_to_char("valid values are 0, 1, 2\n\r", ch); } else { switch(i) { case 0: DEBUG = 0; DEBUG2 = 0; break; case 1: DEBUG = 1; DEBUG2 = 0; break; case 2: DEBUG = 0; DEBUG2 = 1; break; } sprintf(arg, "debug level set to %d\n\r", i); send_to_char(arg, ch); } } void do_invis(struct char_data *ch, char *argument, int cmd) { char buf[MAX_STRING_LENGTH]; int level; if(DEBUG) dlog("do_invis"); if (scan_number(argument, &level)) { if (level<=0) level=0; else { if (level>GetMaxLevel(ch)) { send_to_char("Sorry, you cant invis that high yet!\n\r",ch); return; } } ch->invis_level = level; sprintf(buf,"Invis level set to %d.\n\r", level); send_to_char(buf, ch); } else { if (ch->invis_level>0) { ch->invis_level = 0; send_to_char("You are now totally VISIBLE.\n\r",ch); } else { ch->invis_level = GetMaxLevel(ch) - 1; sprintf(buf,"You are now invisible to level %d.\n\r",GetMaxLevel(ch) - 1); send_to_char(buf,ch); } } }