wileymud-1.187b/
wileymud-1.187b/attic/
wileymud-1.187b/attic/bin/
wileymud-1.187b/attic/lib/
wileymud-1.187b/attic/lib/adm/
wileymud-1.187b/attic/lib/man/
wileymud-1.187b/attic/lib/new-wld/
wileymud-1.187b/attic/lib/new-wld/default/
wileymud-1.187b/attic/lib/old/
wileymud-1.187b/attic/lib/wld/
wileymud-1.187b/attic/public_html/
wileymud-1.187b/attic/public_html/gfx/
wileymud-1.187b/attic/src/bin/
wileymud-1.187b/attic/src/etc/
wileymud-1.187b/attic/src/libauth-4.0-p5/
wileymud-1.187b/attic/src/sedna/
wileymud-1.187b/backups/
wileymud-1.187b/bin/
wileymud-1.187b/docs/
wileymud-1.187b/etc/
wileymud-1.187b/lib/
wileymud-1.187b/lib/adm/
wileymud-1.187b/lib/boards/
wileymud-1.187b/lib/log/
wileymud-1.187b/lib/man/
wileymud-1.187b/lib/ply/
wileymud-1.187b/lib/ply/a/
wileymud-1.187b/lib/ply/b/
wileymud-1.187b/lib/ply/c/
wileymud-1.187b/lib/ply/d/
wileymud-1.187b/lib/ply/g/
wileymud-1.187b/lib/ply/k/
wileymud-1.187b/lib/ply/m/
wileymud-1.187b/lib/ply/s/
wileymud-1.187b/lib/ply/t/
wileymud-1.187b/public_html/gfx/
wileymud-1.187b/src/bin/
wileymud-1.187b/src/convert/attic/
wileymud-1.187b/src/convert/obj/
wileymud-1.187b/src/convert/perl/
wileymud-1.187b/src/convert/perl/MudConvert/
wileymud-1.187b/src/convert/perl/MudConvert/DUMP/
wileymud-1.187b/src/convert/perl/MudConvert/Report/
wileymud-1.187b/src/convert/perl/MudConvert/WileyMUD/
wileymud-1.187b/src/convert/perl/output/
wileymud-1.187b/src/convert/perl/output/DUMP/
wileymud-1.187b/src/convert/perl/output/Report/
wileymud-1.187b/src/convert/perl/output/WileyMUD/
wileymud-1.187b/src/etc/
wileymud-1.187b/src/etc/init.d/
wileymud-1.187b/src/etc/rc.d/
wileymud-1.187b/src/etc/rc.d/init.d/
wileymud-1.187b/src/lib/
wileymud-1.187b/src/lib/adm/
wileymud-1.187b/src/lib/boards/
wileymud-1.187b/src/lib/log/
wileymud-1.187b/src/lib/man/
wileymud-1.187b/src/lib/ply/
wileymud-1.187b/src/lib/ply/a/
wileymud-1.187b/src/lib/ply/b/
wileymud-1.187b/src/lib/ply/c/
wileymud-1.187b/src/lib/ply/d/
wileymud-1.187b/src/lib/ply/e/
wileymud-1.187b/src/lib/ply/f/
wileymud-1.187b/src/lib/ply/g/
wileymud-1.187b/src/lib/ply/h/
wileymud-1.187b/src/lib/ply/i/
wileymud-1.187b/src/lib/ply/j/
wileymud-1.187b/src/lib/ply/k/
wileymud-1.187b/src/lib/ply/l/
wileymud-1.187b/src/lib/ply/m/
wileymud-1.187b/src/lib/ply/n/
wileymud-1.187b/src/lib/ply/o/
wileymud-1.187b/src/lib/ply/p/
wileymud-1.187b/src/lib/ply/q/
wileymud-1.187b/src/lib/ply/r/
wileymud-1.187b/src/lib/ply/s/
wileymud-1.187b/src/lib/ply/t/
wileymud-1.187b/src/lib/ply/u/
wileymud-1.187b/src/lib/ply/v/
wileymud-1.187b/src/lib/ply/w/
wileymud-1.187b/src/lib/ply/x/
wileymud-1.187b/src/lib/ply/y/
wileymud-1.187b/src/lib/ply/z/
wileymud-1.187b/src/obj/
wileymud-1.187b/src/utils/
wileymud-1.187b/src/utils/mobmaker/
/*
 * 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 <stdlib.h>
/* #include <unistd.h> */
#include <sys/types.h>
#include <signal.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

#include "global.h"
#include "bug.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "mudlimits.h"
#include "constants.h"
#include "spell_parser.h"
#include "board.h"
#include "whod.h"
#include "reception.h"
#include "spec_procs.h"
#include "multiclass.h"
#include "act_skills.h"
#include "act_info.h"
#include "fight.h"
#include "hash.h"
#include "weather.h"
#include "modify.h"
#include "tracking.h"
#define _ACT_WIZ_C
#include "act_wiz.h"

void do_polymorph(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    return;
}

void do_highfive(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[80] = "\0\0\0\0\0\0\0";
    struct char_data                       *tch = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (argument) {
	only_argument(argument, buf);
	if ((tch = get_char_vis(ch, buf)) != 0) {
	    if ((GetMaxLevel(tch) >= DEMIGOD) && (!IS_NPC(tch))) {
		allprintf("Time stops for a moment as %s and %s high five.\r\n",
			  ch->player.name, tch->player.name);
	    } 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 {
	    cprintf(ch, "I don't see anyone here like that.\r\n");
	}
    }
}

void do_rentmode(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    double                                  it = 0.0;
    FILE                                   *pfd = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch)) {
	cprintf(ch, "You cannot toggle rent costs.\r\n");
	return;
    }
    if (argument && *argument) {
	only_argument(argument, buf);
	if (sscanf(buf, " %lf ", &it) == 1)
	    RENT_RATE = it;
	sprintf(buf, "Rent now costs %f normal.", RENT_RATE);
	cprintf(ch, "%s\r\n", buf);
	log_info("%s", buf);
    } else {
	if (RENT_RATE != 0.0) {
	    cprintf(ch, "Rent is now free!\r\n");
	    log_info("Rent cost is now ZERO.");
	    RENT_RATE = 0.0;
	} else {
	    cprintf(ch, "Rent is now normal.\r\n");
	    log_info("Rent cost is now normal.");
	    RENT_RATE = 1.0;
	}
    }
    if (!(pfd = fopen(RENTCOST_FILE, "w"))) {
	log_info("Cannot save rent cost!");
    } else {
	fprintf(pfd, "%f\n", RENT_RATE);
	FCLOSE(pfd);
    }
}

void do_wizlock(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch)) {
	cprintf(ch, "You cannot WizLock.\r\n");
	return;
    }
    if (WizLock) {
	cprintf(ch, "WizLock is now off\r\n");
	log_info("Wizlock is now off.");
	WizLock = FALSE;
    } else {
	cprintf(ch, "WizLock is now on\r\n");
	log_info("WizLock is now on.");
	WizLock = TRUE;
    }
}

void do_emote(struct char_data *ch, const char *argument, int cmd)
{
    int                                     i = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch) && (cmd != 0) && (cmd != 214))
	return;

    for (i = 0; *(argument + i) == ' '; i++);

    if (!*(argument + i))
	cprintf(ch, "Yes.. But what?\r\n");
    else {
	act("$n %s", FALSE, ch, 0, 0, TO_ROOM, argument + i);
	if (IS_NPC(ch) || (IS_SET(ch->specials.act, PLR_ECHO))) {
	    cprintf(ch, "You emote: '%s'\r\n", argument + i);
	}
    }
}

void do_echo(struct char_data *ch, const char *argument, int cmd)
{
    int                                     i = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    for (i = 0; *(argument + i) == ' '; i++);

    if (!*(argument + i)) {
	if (IS_SET(ch->specials.act, PLR_ECHO)) {
	    cprintf(ch, "echo off\r\n");
	    REMOVE_BIT(ch->specials.act, PLR_ECHO);
	} else {
	    SET_BIT(ch->specials.act, PLR_ECHO);
	    cprintf(ch, "echo on\r\n");
	}
    } else {
	if (IS_IMMORTAL(ch)) {
	    reprintf(ch->in_room, ch, "%s\r\n", argument + i);
	    cprintf(ch, "Ok.\r\n");
	}
    }
}

void do_system(struct char_data *ch, const char *argument, int cmd)
{
    int                                     i = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    for (i = 0; *(argument + i) == ' '; i++);

    if (!*(argument + i))
	cprintf(ch, "That must be a mistake...\r\n");
    else {
	allprintf("\r\n%s\r\n", argument + i);
    }
}

void do_trans(struct char_data *ch, const char *argument, int cmd)
{
    struct descriptor_data                 *i = NULL;
    struct char_data                       *victim = NULL;
    char                                    buf[100] = "\0\0\0\0\0\0\0";
    short int                               target = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);
    if (!*buf)
	cprintf(ch, "Who do you wich to transfer?\r\n");
    else if (str_cmp("all", buf)) {
	if (!(victim = get_char_vis_world(ch, buf, NULL)))
	    cprintf(ch, "No-one by that name around.\r\n");
	else if (GetMaxLevel(victim) > GetMaxLevel(ch)) {
	    cprintf(ch, "You are not strong enough to force %s to appear.\r\n", NAME(victim));
	    cprintf(victim, "%s would like to transfer you.\r\n", NAME(ch));
	} else {
	    act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM);
	    target = ch->in_room;
	    if (MOUNTED(victim)) {
		char_from_room(victim);
		char_from_room(MOUNTED(victim));
		char_to_room(victim, target);
		char_to_room(MOUNTED(victim), target);
	    } else {
		char_from_room(victim);
		char_to_room(victim, target);
	    }
	    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, "", 15);
	    cprintf(ch, "Ok.\r\n");
	}
    } else {						       /* Trans All */
	for (i = descriptor_list; i; i = i->next)
	    if (i->character != ch && !i->connected) {
		victim = i->character;
		if (MOUNTED(victim))
		    Dismount(victim, MOUNTED(victim), POSITION_STANDING);
		target = ch->in_room;
		char_from_room(victim);
		char_to_room(victim, target);
		act("$n disappears in a mushroom cloud.", FALSE, victim, 0, 0, TO_ROOM);
		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, "", 15);
	    }
	cprintf(ch, "Ok.\r\n");
    }
}

void do_at(struct char_data *ch, const char *argument, int cmd)
{
    char                                    command_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    loc_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     location = 0;
    int                                     original_loc = 0;
    struct char_data                       *target_mob = NULL;
    struct obj_data                        *target_obj = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    half_chop(argument, loc_str, command_str);
    if (!*loc_str) {
	cprintf(ch, "You must supply a room number or a name.\r\n");
	return;
    }
    if (!(target_mob = get_char_room_vis(ch, loc_str))) {
	if (!(target_mob = get_char(loc_str))) {
	    if (!(target_obj = get_obj_vis_world(ch, loc_str, NULL))) {
		if (!(location = atoi(loc_str))) {
		    cprintf(ch, "I have no idea where \"%s\" is...\r\n", loc_str);
		    return;
		} else if (!(real_roomp(location))) {
		    cprintf(ch, "That room exists only in your imagination.\r\n");
		    return;
		}
	    } else {
		if ((location = target_obj->in_room) == NOWHERE) {
		    cprintf(ch, "The object is not available.\r\n");
		    return;
		}
	    }
	} else {
	    if ((location = target_mob->in_room) == NOWHERE) {
		cprintf(ch, "The target mobile is not available.\r\n");
		return;
	    }
	}
    } else {
	if ((location = target_mob->in_room) == NOWHERE) {
	    cprintf(ch, "The target mobile is not available.\r\n");
	    return;
	}
    }
    /*
     * a location has been found. 
     */

    original_loc = ch->in_room;
    char_from_room(ch);
    char_to_room(ch, location);
    command_interpreter(ch, command_str);

    /*
     * check if the guy's still there 
     */
    for (target_mob = real_roomp(location)->people; target_mob; target_mob =
	 target_mob->next_in_room)
	if (ch == target_mob) {
	    char_from_room(ch);
	    char_to_room(ch, original_loc);
	}
}

void do_form(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     loc_nr = 0;
    struct room_data                       *rp = NULL;
    int                                     zone = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);
    if (!*buf) {
	cprintf(ch, "Usage: FORM virtual_number.\r\n");
	return;
    }
    if (!(isdigit(*buf))) {
	cprintf(ch, "Usage: FORM virtual_number.\r\n");
	return;
    }
    loc_nr = atoi(buf);
    if (real_roomp(loc_nr)) {
	cprintf(ch, "A room exists with that Vnum!\r\n");
	return;
    } else if (loc_nr < 0) {
	cprintf(ch, "You must use a positive Vnum!\r\n");
	return;
    }
    cprintf(ch, "You have formed a room.\r\n");
    allocate_room(loc_nr);
    rp = real_roomp(loc_nr);
    bzero(rp, sizeof(*rp));
    rp->number = loc_nr;
    if (top_of_zone_table >= 0) {
	for (zone = 0; rp->number > zone_table[zone].top && zone <= top_of_zone_table; zone++);
	if (zone > top_of_zone_table) {
	    log_info("Room %d is outside of any zone.\n", rp->number);
	    zone--;
	}
	rp->zone = zone;
    }
    sprintf(buf, "%d", loc_nr);
    rp->name = (char *)strdup(buf);
    rp->description = (char *)strdup("New Room\n");
}

void do_goto(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     loc_nr = 0;
    int                                     location = 0;
    int                                     i = 0;
    struct char_data                       *target_mob = NULL;
    struct char_data                       *pers = NULL;
    struct char_data                       *v = NULL;
    struct obj_data                        *target_obj = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);
    if (!*buf) {
	cprintf(ch, "You must supply a room number or a name.\r\n");
	return;
    }
    if (isdigit(*buf) && NULL == index(buf, '.')) {
	loc_nr = atoi(buf);
	if (NULL == real_roomp(loc_nr)) {
	    cprintf(ch, "No room exists with that number.\r\n");
	    return;
	}
	location = loc_nr;
    } else if ((target_mob = get_char_vis_world(ch, buf, NULL)))
	location = target_mob->in_room;
    else if ((target_obj = get_obj_vis_world(ch, buf, NULL)))
	if (target_obj->in_room != NOWHERE)
	    location = target_obj->in_room;
	else {
	    cprintf(ch, "The object is not available.\r\n");
	    cprintf(ch, "Try where #.object to nail its room number.\r\n");
	    return;
    } else {
	cprintf(ch, "No such creature or object around.\r\n");
	return;
    }

    /*
     * a location has been found. 
     */

    if (!real_roomp(location)) {
	log_error("Massive error in do_goto. Everyone Off NOW.");
	return;
    }
    if (IS_SET(real_roomp(location)->room_flags, PRIVATE)) {
	for (i = 0, pers = real_roomp(location)->people; pers; pers = pers->next_in_room, i++);
	if (i > 1 && IS_MORTAL(ch)) {
	    cprintf(ch, "There's a private conversation going on in that room.\r\n");
	    return;
	}
    }
    if (IS_SET(ch->specials.act, PLR_STEALTH)) {
	for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
	    if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
		act("$n disappears into a cloud of mist.", FALSE, ch, 0, v, TO_VICT);
	    }
	}
    } else {
	act("$n disappears into a cloud of mist.", FALSE, ch, 0, 0, TO_ROOM);
    }

    if (ch->specials.fighting)
	stop_fighting(ch);
    if (MOUNTED(ch)) {
	char_from_room(ch);
	char_to_room(ch, location);
	char_from_room(MOUNTED(ch));
	char_to_room(MOUNTED(ch), location);
    } else {
	char_from_room(ch);
	char_to_room(ch, location);
    }

    if (IS_SET(ch->specials.act, PLR_STEALTH)) {
	for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
	    if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
		act("$n appears from a cloud of mist.", FALSE, ch, 0, v, TO_VICT);
	    }
	}
    } else {
	act("$n appears from a cloud of mist.", FALSE, ch, 0, 0, TO_ROOM);
    }
    do_look(ch, "", 15);
}

void do_home(struct char_data *ch, const char *argument, int cmd)
{
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     location = 0;
    struct char_data                       *v = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);
    if (!*buf) {
	location = GET_HOME(ch);
    } else {
	cprintf(ch, "You can't just barge into someone else's home (yet)!\r\n");
	location = GET_HOME(ch);
    }
    if (!real_roomp(location)) {
	cprintf(ch, "Hmmmm... homeless, peniless, but surely not alone.\r\n");
	return;
    }
    if (IS_SET(ch->specials.act, PLR_STEALTH)) {
	for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
	    if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
		act("$n stretches sensually and elongates into a wisp of vapour.", FALSE, ch, 0,
		    v, TO_VICT);
	    }
	}
    } else {
	act("$n stretches sensually and elongates into a wisp of vapour.", FALSE, ch, 0, 0,
	    TO_ROOM);
    }

    if (ch->specials.fighting)
	stop_fighting(ch);
    if (MOUNTED(ch)) {
	char_from_room(ch);
	char_to_room(ch, location);
	char_from_room(MOUNTED(ch));
	char_to_room(MOUNTED(ch), location);
    } else {
	char_from_room(ch);
	char_to_room(ch, location);
    }

    if (IS_SET(ch->specials.act, PLR_STEALTH)) {
	for (v = real_roomp(ch->in_room)->people; v; v = v->next_in_room) {
	    if ((ch != v) && (GetMaxLevel(v) >= GetMaxLevel(ch))) {
		act("$n arrives and immediately curls up in $s spot.", FALSE, ch, 0, v,
		    TO_VICT);
	    }
	}
    } else {
	act("$n arrives and immediately curls up in $s spot.", FALSE, ch, 0, 0, TO_ROOM);
    }
    do_look(ch, "", 15);
}

void do_apraise(struct char_data *ch, const char *argument, int cmd)
{
    char                                    arg1[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    struct obj_data                        *j = NULL;
    int                                     i = 0;
    int                                     found_one = FALSE;
    int                                     chance = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, arg1);

    if (GET_MANA(ch) < 3) {
	cprintf(ch, "You can't seem to concentrate enough at the moment.\r\n");
	return;
    }
    chance = number(1, 101);

    if (chance > ch->skills[SKILL_APRAISE].learned) {
	cprintf(ch, "You are unable to apraise this item.\r\n");
	GET_MANA(ch) -= 1;
	return;
    }
    GET_MANA(ch) -= 3;

    if (!*arg1) {
	cprintf(ch, "apraise what?\r\n");
	return;
    } else {
	if (ch->skills[SKILL_APRAISE].learned < 50)
	    ch->skills[SKILL_APRAISE].learned++;

	/*
	 * apraise on object 
	 */
	if ((j = (struct obj_data *)get_obj_in_list_vis(ch, arg1, ch->carrying))) {
	    cprintf(ch, "Object name: [%s]\r\nItem type: ", j->name);
	    sprinttype(GET_ITEM_TYPE(j), item_types, buf);
	    cprintf(ch, "%s\r\n", buf);

	    cprintf(ch, "Can be worn on :");
	    sprintbit(j->obj_flags.wear_flags, wear_bits, buf);
	    cprintf(ch, "%s\r\n", buf);

	    cprintf(ch, "Weight: %d, Value: %d, Cost/day: %d\r\n",
		    j->obj_flags.weight, j->obj_flags.cost, j->obj_flags.cost_per_day);

	    switch (j->obj_flags.type_flag) {
		case ITEM_LIGHT:
		    cprintf(ch, "Light hours of Use : [%d]", j->obj_flags.value[2]);
		    break;
		case ITEM_WEAPON:
		    sprintf(buf, "Weapon Class:");
		    switch (j->obj_flags.value[3]) {
			case 0:
			    strcat(buf, "Smiting Class.\r\n");
			    break;
			case 1:
			    strcat(buf, "Stabbing Class.\r\n");
			    break;
			case 2:
			    strcat(buf, "Whipping Class.\r\n");
			    break;
			case 3:
			    strcat(buf, "Slashing Class.\r\n");
			    break;
			case 4:
			    strcat(buf, "Smashing Class.\r\n");
			    break;
			case 5:
			    strcat(buf, "Cleaving Class.\r\n");
			    break;
			case 6:
			    strcat(buf, "Crushing Class.\r\n");
			    break;
			case 7:
			    strcat(buf, "Bludgeoning Class.\r\n");
			    break;
			case 11:
			    strcat(buf, "Piercing Class.\r\n");
			    break;
			default:
			    strcat(buf, "Foreign Class to you....\r\n");
			    break;
		    }

		    found_one = 0;

		    for (i = 0; i < MAX_OBJ_AFFECT; i++) {
			if (j->affected[i].location == APPLY_HITROLL
			    || j->affected[i].location == APPLY_HITNDAM) {
			    found_one = 1;
			    switch (j->affected[i].modifier) {
				case 1:
				    strcat(buf, "It is well balanced.\r\n");
				    break;
				case 2:
				    strcat(buf, "It is very well balanced.\r\n");
				    break;
				case 3:
				    strcat(buf, "It is a superb weapon.\r\n");
				    break;
				case 4:
				    strcat(buf, "It was forged by the gods.\r\n");
				    break;
				case 5:
				    strcat(buf, "It should not be in your hands.\r\n");
				    break;
				default:
				    strcat(buf, "It will crack with the next blow.\r\n");
				    break;
			    }
			}
		    }

		    if (!found_one)
			strcat(buf, "It is common in accuracy.\r\n");

		    found_one = 0;
		    for (i = 0; i < MAX_OBJ_AFFECT; i++) {
			if (j->affected[i].location == APPLY_DAMROLL
			    || j->affected[i].location == APPLY_HITNDAM) {
			    found_one = 1;
			    switch (j->affected[i].modifier) {
				case 0:
				    strcat(buf, "It will surely damage its target.\r\n");
				    break;
				case 1:
				    strcat(buf, "It looks to be made from a strong metal.\r\n");
				    break;
				case 2:
				    strcat(buf, "This was forged from a mystical flame.\r\n");
				    break;
				case 3:
				    strcat(buf, "It has definite magical charms.\r\n");
				    break;
				case 4:
				    strcat(buf,
					   "This is definitately blessed by the gods.\r\n");
				    break;
				case 5:
				    strcat(buf, "It is ready to lose its hilt.\r\n");
				    break;
				default:
				    strcat(buf,
					   "It is checked badly and most likely will break.\r\n");
				    break;
			    }
			}
		    }
		    if (!found_one)
			strcat(buf, "It has a common strength to its making.\r\n");
		    cprintf(ch, "%s", buf);

		    break;
		case ITEM_ARMOR:
		    sprintf(buf, "Effective AC points: [%d]\r\nWhen Repaired: [%d]",
			    j->obj_flags.value[0], j->obj_flags.value[1]);
		    if (j->obj_flags.value[0] != 0 && j->obj_flags.value[1] == 0) {
			strcat(buf,
			       "\r\nYou should take it to be updated at the Blacksmith\r\n");
		    }
		    cprintf(ch, "%s", buf);
		    break;

	    }
	} else {
	    cprintf(ch, "I don't see that here.\r\n");
	}
    }
}

void do_stat(struct char_data *ch, const char *argument, int cmd)
{
    struct affected_type                   *aff = NULL;
    struct room_data                       *rm = NULL;
    struct char_data                       *k = NULL;
    struct obj_data                        *j = NULL;
    struct obj_data                        *j2 = NULL;
    struct extra_descr_data                *desc = NULL;
    struct follow_type                     *fol = NULL;
    struct room_data                       *rp = NULL;
    char                                    type[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    num[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    buf2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     i = 0;
    int                                     virtual = 0;
    int                                     i2 = 0;
    int                                     count = 0;
    int                                     found = FALSE;
    int                                     anumber = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    argument = one_argument(argument, type);
    only_argument(argument, num);
    if (!*num)
	anumber = -2;
    else if (isdigit(*num))
	anumber = atoi(num);
    else
	anumber = -1;

    /*
     * no argument 
     */
    if (!*type) {
	cprintf(ch, "Usage: stat < pc|mob|obj|room > [ name|vnum ]\r\n");
	return;
    }
    /*
     * ROOM 
     */
    if (!str_cmp("room", type) || !str_cmp("here", type)) {
	if (anumber < 0) {
	    if (anumber == -2)
		anumber = ch->in_room;
	    else {
		cprintf(ch, "Usage: stat room [vnum]\r\n");
		return;
	    }
	}
	rm = real_roomp(anumber);
	cprintf(ch,
		"Room Description: ---------------------------------------------------------\r\n%s",
		rm->description);
	if ((desc = rm->ex_description)) {
	    cprintf(ch,
		    "---------------------------------------------------------------------------\r\n");
	    *buf = '\0';
	    for (; desc; desc = desc->next) {
		strcat(buf, desc->keyword);
		strcat(buf, " ");
	    }
	    cprintf(ch, "Extras: %s\r\n", buf);
	}
	cprintf(ch,
		"---------------------------------------------------------------------------\r\n");
	sprinttype(rm->sector_type, sector_types, buf2);
	cprintf(ch, "%s [#%d], in Zone %s [#%d] is %s.\r\n",
		rm->name, rm->number, zone_table[rm->zone].name, rm->zone, buf2);
	if (rm->tele_targ > 0) {			       /* teleport room */
	    double                                  ttime =
		(double)rm->tele_time / (double)10.0;

	    rp = real_roomp(rm->tele_targ);
	    cprintf(ch, "Teleports to %s [#%d] every %3.1lf second%s",
		    rp ? rp->name : "Swirling CHAOS", rm->tele_targ,
		    ttime, (ttime != 1.0) ? "s.\r\n" : ".\r\n");
	}
	if ((rm->sector_type == SECT_WATER_SWIM) || (rm->sector_type == SECT_WATER_NOSWIM)) {
	    if (rm->river_dir != -1 && rm->dir_option[rm->river_dir]) {
		double                                  ttime =
		    (double)rm->river_speed / (double)10.0;

		rp = real_roomp(rm->dir_option[rm->river_dir]->to_room);
		cprintf(ch,
			"A River flows %s into %s [#%d] every %3.1lf second%s",
			dirs[rm->river_dir], rp ? rp->name : "Swirling CHAOS",
			rp ? rp->number : -1, ttime, (ttime != 1.0) ? "s.\r\n" : ".\r\n");
	    }
	}
	if (rm->room_flags) {
	    sprintbit((long)rm->room_flags, room_bits, buf);
	    cprintf(ch, "Flags: %s\r\n", buf);
	}
	if (rm->room_flags & SOUND) {
	    cprintf(ch, "Sound: %s", rm->sound);
	    cprintf(ch, "Sound: %s", rm->distant_sound);
	}
	if (rm->funct) {
	    cprintf(ch, "Special Procedure: %s.\r\n",
		    name_special_proc(SPECIAL_ROOM, rm->number));
	}
	for (i = 0; i < MAX_NUM_EXITS; i++) {
	    if (rm->dir_option[i]) {
		rp = real_roomp(rm->dir_option[i]->to_room);
		cprintf(ch, "Exit %s to %s [#%d] is called %s.\r\n", dirs[i],
			rp ? rp->name : "Swirling CHAOS", rp ? rp->number : -1,
			rm->dir_option[i]->keyword ? rm->dir_option[i]->keyword : dirs[i]);
		if (rm->dir_option[i]->general_description)
		    cprintf(ch, "     %s", rm->dir_option[i]->general_description);
		if (rm->dir_option[i]->exit_info) {
		    sprintbit(rm->dir_option[i]->exit_info, exit_bits, buf2);
		    cprintf(ch, "     Flags: %s\r\n", buf2);
		}
		if (rm->dir_option[i]->key > 0) {
		    cprintf(ch, "     Key: %s [#%d]\r\n",
			    obj_index[rm->dir_option[i]->key].name,
			    obj_index[rm->dir_option[i]->key].virtual);
		}
	    }
	}
	if ((k = rm->people)) {
	    cprintf(ch, "Lifeforms present:\r\n");
	    for (; k; k = k->next_in_room) {
		if (CAN_SEE(ch, k)) {
		    int                                     v = 0;

		    sprintf(buf, "%s", GET_NAME(k));
		    if (!(v = MobVnum(k)))
			strcat(buf, "(PC)");
		    else if (v < 0)
			strcat(buf, "(NPC)");
		    else
			sprintf(buf + strlen(buf), " [#%d]", v);
		    cprintf(ch, "     %s\r\n", buf);
		}
	    }
	}
	if ((j = rm->contents)) {
	    cprintf(ch, "Objects present:\r\n");
	    for (; j; j = j->next_content)
		cprintf(ch, "     %s [#%d]\r\n", j->name, ObjVnum(j));
	}
	return;
    } else if (!str_cmp("mob", type) || !str_cmp("pc", type)) {
	count = 1;

	k = NULL;
	if (anumber < 0) {
	    if (anumber == -2)
		k = ch;
	}
	/*
	 * MOBILE in world 
	 */
	if (anumber >= 0) {
	    if (!(k = get_char_num(anumber))) {
		cprintf(ch, "Noone with that vnum exists, I shall load one!\r\n");
		if (!(k = read_mobile(anumber, VIRTUAL))) {
		    cprintf(ch, "No such creature exists in Reality!\r\n");
		    return;
		} else {
		    cprintf(ch, "%s appears for your inspection.\r\n", NAME(k));
		    char_to_room(k, ch->in_room);
		}
	    }
	} else if (!k) {
	    if (!str_cmp("me", num)) {
		k = ch;
	    } else if (!(k = get_char_room_vis(ch, num))) {
		if (!(k = get_char_vis_world(ch, num, &count))) {
		    int                                     x = 0;

		    cprintf(ch, "No creature exists by that name, I shall make one!\r\n");
		    for (x = 0; x < top_of_mobt; x++) {
			if (isname(num, mob_index[x].name)) {
			    if (!(k = read_mobile(x, REAL))) {
				cprintf(ch, "No such creature exists in Reality!\r\n");
				return;
			    } else {
				cprintf(ch, "%s appears for your inspection.\r\n", NAME(k));
				char_to_room(k, ch->in_room);
				x = -1;
				break;
			    }
			}
		    }
		    if (x > -1) {
			cprintf(ch, "No such creature exists in Reality!\r\n");
			return;
		    }
		}
	    }
	}
	cprintf(ch, "Name: %s  :  [R-Number %d]  ", GET_NAME(k), k->nr);
	if (IS_MOB(k))
	    cprintf(ch, "[Load Number %d]", mob_index[k->nr].virtual);
	cprintf(ch, "\r\n");

	cprintf(ch, "Location [%d]\r\n", k->in_room);

	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;
	}

	cprintf(ch, "Sex : %s - %s\r\n",
		buf, (!IS_NPC(k) ? "Pc" : (!IS_MOB(k) ? "Npc" : "Mob")));

	cprintf(ch, "Short description: %s\r\n",
		(k->player.short_descr ? k->player.short_descr : "None"));
	cprintf(ch, "Title: %s\r\n", (k->player.title ? k->player.title : "None"));
	cprintf(ch, "Pre-Title: %s\r\n", (GET_PRETITLE(k) ? GET_PRETITLE(k) : "None"));
	cprintf(ch, "Long description: %s\r\n",
		(k->player.long_descr ? k->player.long_descr : "None"));

	if (IS_NPC(k)) {
	    strcpy(buf, "Monster Class: ");
	    sprinttype(k->player.class, npc_class_types, buf2);
	} else {
	    strcpy(buf, "Class: ");
	    sprintbit(k->player.class, pc_class_types, buf2);
	}
	strcat(buf, buf2);

	sprintf(buf2, " :  Level [%d/%d/%d/%d/%d] : Alignment[%d]\r\n",
		k->player.level[0], k->player.level[1],
		k->player.level[2], k->player.level[3], k->player.level[4], GET_ALIGNMENT(k));

	strcat(buf, buf2);
	cprintf(ch, "%s", buf);

	if (IS_PC(k)) {
	    cprintf(ch, "Birth : [%ld] secs, Logon[%ld] secs, Played[%d] secs\r\n",
		    k->player.time.birth, k->player.time.logon, k->player.time.played);

	    cprintf(ch, "Age: [%d] Years,  [%d] Months,  [%d] Days,  [%d] Hours\r\n",
		    age(k).year, age(k).month, age(k).day, age(k).hours);
	}
	cprintf(ch, "Height [%d]cm  Weight [%d]pounds \r\n", GET_HEIGHT(k), GET_WEIGHT(k));
	cprintf(ch, "+----------------------------+\r\n");
	cprintf(ch, "Str:[%d/%d]  Int:[%d]  Wis:[%d]  Dex:[%d]  Con:[%d]\r\n",
		GET_STR(k), GET_ADD(k), GET_INT(k), GET_WIS(k), GET_DEX(k), GET_CON(k));

	cprintf(ch,
		"Mana p.:[%d/%d+%d]  Hit p.:[%d/%d+%d]  Move p.:[%d/%d+%d]\r\n",
		GET_MANA(k), mana_limit(k), mana_gain(k),
		GET_HIT(k), hit_limit(k), hit_gain(k), GET_MOVE(k), move_limit(k),
		move_gain(k));

	cprintf(ch,
		"AC:[%d/10], Coins: [%d], Exp: [%d], Hitroll: [%d], Damroll: [%d]\r\n",
		GET_AC(k), GET_GOLD(k), GET_EXP(k), k->points.hitroll, k->points.damroll);

	if (IS_NPC(k)) {
	    cprintf(ch, "Npc Bare Hand Damage %dd%d.\r\n",
		    k->specials.damnodice, k->specials.damsizedice);
	}
	if (IS_PC(k)) {
	    cprintf(ch, "\r\nTimer [%d] \r\n", k->specials.timer);
	}
	cprintf(ch, "+----------------------------+\r\n");

	sprinttype(GET_POS(k), position_types, buf2);
	sprintf(buf, "Position: %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);
	}
	cprintf(ch, "%s\r\n", buf);

	strcpy(buf, "Default position: ");
	sprinttype((k->specials.default_pos), position_types, buf2);
	strcat(buf, buf2);
	if (IS_NPC(k)) {
	    strcat(buf, "\r\nNPC flags: ");
	    sprintbit(k->specials.act, action_bits, buf2);
	} else {
	    strcat(buf, ",PC flags: ");
	    sprintbit(k->specials.act, player_bits, buf2);
	}

	strcat(buf, buf2);

	if (IS_MOB(k)) {
	    /*
	     * strcpy(buf, "\r\nMobile Special procedure : "); strcat(buf, (mob_index[k->nr].func ? "Exists\r\n" :
	     * "None\r\n")); cprintf(ch, buf); 
	     */
	    cprintf(ch, "\r\nMobile Special procedure : %s\r\n",
		    (mob_index[k->nr].func ? MobFunctionNameByFunc(mob_index[k->nr].func) :
		     "None"));
	}
	cprintf(ch, "Carried weight: %d   Carried items: %d\r\n",
		IS_CARRYING_W(k), IS_CARRYING_N(k));

	for (i = 0, j = k->carrying; j; j = j->next_content, i++);
	sprintf(buf, "Items in inventory: %d, ", i);

	for (i = 0, i2 = 0; i < MAX_WEAR; i++)
	    if (k->equipment[i])
		i2++;
	sprintf(buf2, "Items in equipment: %d\r\n", i2);
	strcat(buf, buf2);
	cprintf(ch, "%s", buf);

	cprintf(ch, "Apply saving throws: [%d] [%d] [%d] [%d] [%d]\r\n",
		k->specials.apply_saving_throw[0],
		k->specials.apply_saving_throw[1],
		k->specials.apply_saving_throw[2],
		k->specials.apply_saving_throw[3], k->specials.apply_saving_throw[4]);

	if (IS_PC(k)) {
	    cprintf(ch, "Thirst: %d, Hunger: %d, Drunk: %d\r\n",
		    k->specials.conditions[THIRST],
		    k->specials.conditions[FULL], k->specials.conditions[DRUNK]);
	}
	cprintf(ch, "Master is '%s'\r\n", ((k->master) ? GET_NAME(k->master) : "NOBODY"));
	cprintf(ch, "Followers are:\r\n");
	for (fol = k->followers; fol; fol = fol->next)
	    if (CAN_SEE(ch, fol->follower))
		act("    $N", FALSE, ch, 0, fol->follower, TO_CHAR);

	/*
	 * immunities 
	 */
	cprintf(ch, "Immune to:");
	sprintbit(k->M_immune, immunity_names, buf);
	cprintf(ch, "%s\r\n", buf);
	/*
	 * resistances 
	 */
	cprintf(ch, "Resistant to:");
	sprintbit(k->immune, immunity_names, buf);
	cprintf(ch, "%s\r\n", buf);
	/*
	 * Susceptible 
	 */
	cprintf(ch, "Susceptible to:");
	sprintbit(k->susc, immunity_names, buf);
	cprintf(ch, "%s\r\n", buf);

	/*
	 * Showing the bitvector 
	 */
	sprintbit(k->specials.affected_by, affected_bits, buf);
	cprintf(ch, "Affected by: ");
	cprintf(ch, "%s\r\n", buf);

	/*
	 * Routine to show what spells a char is affected by 
	 */
	if (k->affected) {
	    cprintf(ch, "\r\nAffecting Spells:\r\n--------------\r\n");
	    for (aff = k->affected; aff; aff = aff->next) {
		cprintf(ch, "Spell : '%s'\r\n", spell_info[aff->type].name);
		cprintf(ch, "     Modifies %s by %d points\r\n",
			apply_types[(int)aff->location], aff->modifier);
		cprintf(ch, "     Expires in %3d hours, Bits set ", aff->duration);
		sprintbit(aff->bitvector, affected_bits, buf);
		cprintf(ch, "%s\r\n", buf);
	    }
	}
	return;
    } else if (!str_cmp("obj", type)) {
	count = 1;

	j = NULL;
	if (anumber == -2) {
	    cprintf(ch, "Usage: stat obj <name|vnum>\r\n");
	    return;
	}
	/*
	 * OBJECT in world 
	 */
	if (anumber >= 0) {
	    if (!(j = get_obj_num(anumber))) {
		cprintf(ch, "Nothing with that vnum exists, I shall load one!\r\n");
		if (!(j = read_object(anumber, VIRTUAL))) {
		    cprintf(ch, "No such object exists in Reality!\r\n");
		    return;
		} else {
		    cprintf(ch, "A new %s appears for your inspection.\r\n",
			    j->short_description);
		    obj_to_room(j, ch->in_room);
		}
	    }
	} else if (!j) {
	    if (!(j = get_obj_vis(ch, num))) {
		cprintf(ch, "No such object is visible in the Realm.\r\n");
		return;
	    }
	}
	virtual = (j->item_number >= 0) ? obj_index[j->item_number].virtual : 0;
	sprintf(buf, "Object name: [%s]\r\nR-number: [%d], Load Number: [%d]\r\nItem type: ",
		j->name, j->item_number, virtual);
	sprinttype(GET_ITEM_TYPE(j), item_types, buf2);
	strcat(buf, buf2);
	cprintf(ch, "%s\r\n", buf);
	cprintf(ch, "Short description: %s\r\nLong description:\r\n%s\r\n",
		((j->short_description) ? j->short_description : "None"),
		((j->description) ? j->description : "None"));
	if (j->ex_description) {
	    strcpy(buf, "Extra description keyword(s):\r\n----------\r\n");
	    for (desc = j->ex_description; desc; desc = desc->next) {
		strcat(buf, desc->keyword);
		strcat(buf, "\r\n");
	    }
	    strcat(buf, "----------\r\n");
	    cprintf(ch, "%s", buf);
	} else {
	    strcpy(buf, "Extra description keyword(s): None\r\n");
	    cprintf(ch, "%s", buf);
	}

	cprintf(ch, "Can be worn on :");
	sprintbit(j->obj_flags.wear_flags, wear_bits, buf);
	cprintf(ch, "%s\r\n", buf);

	cprintf(ch, "Set char bits  :");
	sprintbit(j->obj_flags.bitvector, affected_bits, buf);
	cprintf(ch, "%s\r\n", buf);

	cprintf(ch, "Extra flags: ");
	sprintbit(j->obj_flags.extra_flags, extra_bits, buf);
	cprintf(ch, "%s\r\n", buf);

	cprintf(ch, "Weight: %d, Value: %d, Cost/day: %d, Timer: %d\r\n",
		j->obj_flags.weight, j->obj_flags.cost,
		j->obj_flags.cost_per_day, j->obj_flags.timer);

	strcpy(buf, "In room: ");
	if (j->in_room == NOWHERE)
	    strcat(buf, "Nowhere");
	else {
	    sprintf(buf2, "%d", j->in_room);
	    strcat(buf, buf2);
	}
	strcat(buf, " ,In object: ");
	strcat(buf, (!j->in_obj ? "None" : fname(j->in_obj->name)));

	/*
	 * strcat(buf," ,Carried by:");
	 * if (j->carried_by) 
	 * {
	 * if (GET_NAME(j->carried_by)) 
	 * {
	 * if (strlen(GET_NAME(j->carried_by)) > 0) 
	 * {
	 * strcat(buf, (!j->carried_by) ? "Nobody" : GET_NAME(j->carried_by));
	 * }
	 * else
	 * {
	 * strcat(buf, "NonExistantPlayer");
	 * }
	 * }
	 * else 
	 * {
	 * strcat(buf, "NonExistantPlayer");
	 * }
	 * }
	 * else 
	 * {
	 * strcat(buf, "Nobody");
	 * }
	 * strcat(buf,"\r\n");
	 * cprintf(ch, buf);
	 */
	switch (j->obj_flags.type_flag) {
	    case ITEM_LIGHT:
		sprintf(buf, "Colour : [%d]\r\nType : [%d]\r\nHours : [%d]",
			j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[2]);
		break;
	    case ITEM_SCROLL:
		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:
		sprintf(buf, "Spell : %d\r\nMana : %d", j->obj_flags.value[0],
			j->obj_flags.value[1]);
		break;
	    case ITEM_STAFF:
		sprintf(buf, "Spell : %d\r\nMana : %d", j->obj_flags.value[0],
			j->obj_flags.value[1]);
		break;
	    case ITEM_WEAPON:
		sprintf(buf, "Tohit : %d\r\nTodam : %dD%d\r\nType : %d",
			j->obj_flags.value[0],
			j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
		break;
	    case ITEM_FIREWEAPON:
		sprintf(buf, "Tohit : %d\r\nTodam : %dD%d\r\nType : %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\r\nTodam : %d\r\nType : %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]\r\nFull Strength : [%d]",
			j->obj_flags.value[0], j->obj_flags.value[1]);

		break;
	    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_TRAP:
		sprintf(buf, "level: %d, att type: %d, damage class: %d, charges: %d",
			j->obj_flags.value[0],
			j->obj_flags.value[1], j->obj_flags.value[2], j->obj_flags.value[3]);
		break;
	    case ITEM_CONTAINER:
		sprintf(buf, "Max-contains : %d\r\nLocktype : %d\r\nCorpse : %s",
			j->obj_flags.value[0],
			j->obj_flags.value[1], j->obj_flags.value[3] ? "Yes" : "No");
		break;
	    case ITEM_DRINKCON:
		sprinttype(j->obj_flags.value[2], drinks, buf2);
		sprintf(buf,
			"Max-contains : %d\r\nContains : %d\r\nPoisoned : %d\r\nLiquid : %s",
			j->obj_flags.value[0], j->obj_flags.value[1], j->obj_flags.value[3],
			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\r\nPoisoned : %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;
	}
	cprintf(ch, "%s", buf);

	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");
	}
	cprintf(ch, "%s", buf);

	strcpy(buf, "\r\nSpecial procedure : ");
	if (j->item_number >= 0)
	    strcat(buf, (obj_index[j->item_number].func ? "exists\r\n" : "No\r\n"));
	else
	    strcat(buf, "No\r\n");
	cprintf(ch, "%s", buf);

	strcpy(buf, "Contains :\r\n");
	found = FALSE;
	for (j2 = j->contains; j2; j2 = j2->next_content) {
	    strcat(buf, fname(j2->name));
	    strcat(buf, "\r\n");
	    found = TRUE;
	}
	if (!found)
	    strcpy(buf, "Contains : Nothing\r\n");
	cprintf(ch, "%s", buf);

	cprintf(ch, "Can affect char :\r\n");
	for (i = 0; i < MAX_OBJ_AFFECT; i++) {
	    sprinttype(j->affected[i].location, apply_types, buf2);
	    cprintf(ch, "    Affects : %s By %d\r\n", buf2, j->affected[i].modifier);
	}
	return;
    } else {
	cprintf(ch, "Usage: stat < pc|mob|obj|room > [ name|vnum ]\r\n");
	return;
    }
}

void do_pretitle(struct char_data *ch, const char *argument, int cmd)
{
    char                                    name[20] = "\0\0\0\0\0\0\0";
    char                                    pretitle[50] = "\0\0\0\0\0\0\0";
    struct char_data                       *vict = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    argument = one_argument(argument, name);
    if (*argument == ' ')
	argument++;
    strcpy(pretitle, argument);

    if (!(vict = get_char_vis(ch, name))) {
	cprintf(ch, "I don't see them here?\r\n");
	return;
    }
    if (!strlen(pretitle)) {
	GET_PRETITLE(vict) = NULL;
	return;
    }
    CREATE(GET_PRETITLE(vict), char, strlen(pretitle) + 1);
    strcpy(GET_PRETITLE(vict), pretitle);
}

void do_set(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *mob = NULL;
    char                                    field[20] = "\0\0\0\0\0\0\0";
    char                                    name[20] = "\0\0\0\0\0\0\0";
    char                                    parmstr[50] = "\0\0\0\0\0\0\0";
    char                                    tmp[80] = "\0\0\0\0\0\0\0";
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     index_value = 0;
    int                                     parm = 0;
    int                                     i = 0;
    int                                     no = 0;

    const char                             *pset_list[] = {
	"align", "exp", "sex", "race", "tohit", "dmg",
	"bank", "gold", "prac",
	"str", "int", "wis", "dex", "con", "stradd",
	"hit", "mhit", "mana", "mmana", "move", "mmove",
	"mlvl", "clvl", "wlvl", "tlvl", "rlvl", "dlvl",
	"aggr", "wander",
	NULL
    };

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    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) {
	cprintf(ch, "I don't see them here? \r\n\r\n");
	*buf = '\0';
	strcpy(buf, "Usage:  pset <name> <attrib> <value>\r\n");
	for (no = 1, i = 0; pset_list[i]; i++) {
	    sprintf(buf + strlen(buf), "%-10s", pset_list[i]);
	    if (!(no % 7))
		strcat(buf, "\r\n");
	    no++;
	}
	cprintf(ch, "%s\r\n", buf);
	return;
    }
    for (index_value = 0; pset_list[index_value]; index_value++)
	if (!strcmp(field, pset_list[index_value])) {
	    int                                     x;

	    x = sscanf(parmstr, "%d", &parm);
	    if (!x) {
		cprintf(ch, "You must also supply a value\r\n");
		return;
	    }
	    break;
	}
    if (IS_PC(mob) && mob != ch && GetMaxLevel(mob) >= GetMaxLevel(ch)) {
	cprintf(ch, "You wish you could set %s's stats...\r\n", GET_NAME(mob));
	return;
    }
    switch (index_value) {
	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_HITROLL(mob) = parm;
	    break;
	case 5:
	    GET_DAMROLL(mob) = parm;
	    break;
	case 6:
	    GET_BANK(mob) = parm;
	    break;
	case 7:
	    GET_GOLD(mob) = parm;
	    break;
	case 8:
	    mob->specials.pracs = parm;
	    break;
	case 9:
	    if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    mob->abilities.str = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 10:
	    if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    mob->abilities.intel = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 11:
	    if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    mob->abilities.wis = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 12:
	    if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    mob->abilities.dex = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 13:
	    if (ch == mob && parm > 25 && GetMaxLevel(ch) < LOKI) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    mob->abilities.con = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 14:
	    mob->abilities.str_add = parm;
	    mob->tmpabilities = mob->abilities;
	    break;
	case 15:
	    GET_HIT(mob) = parm;
	    break;
	case 16:
	    mob->points.max_hit = parm;
	    break;
	case 17:
	    GET_MANA(mob) = parm;
	    break;
	case 18:
	    mob->points.max_mana = parm;
	    break;
	case 19:
	    GET_MOVE(mob) = parm;
	    break;
	case 20:
	    mob->points.max_move = parm;
	    break;
	case 21:
	    if (ch == mob && parm > GET_LEVEL(ch, MAGE_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, MAGE_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_MAGIC_USER;
	    } else {
		GET_CLASS(mob) |= CLASS_MAGIC_USER;
	    }
	    GET_LEVEL(mob, MAGE_LEVEL_IND) = parm;
	    break;
	case 22:
	    if (ch == mob && parm > GET_LEVEL(ch, CLERIC_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, CLERIC_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_CLERIC;
	    } else {
		GET_CLASS(mob) |= CLASS_CLERIC;
	    }
	    GET_LEVEL(mob, CLERIC_LEVEL_IND) = parm;
	    break;
	case 23:
	    if (ch == mob && parm > GET_LEVEL(ch, WARRIOR_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, WARRIOR_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_WARRIOR;
	    } else {
		GET_CLASS(mob) |= CLASS_WARRIOR;
	    }
	    GET_LEVEL(mob, WARRIOR_LEVEL_IND) = parm;
	    break;
	case 24:
	    if (ch == mob && parm > GET_LEVEL(ch, THIEF_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, THIEF_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_THIEF;
	    } else {
		GET_CLASS(mob) |= CLASS_THIEF;
	    }
	    GET_LEVEL(mob, THIEF_LEVEL_IND) = parm;
	    break;
	case 25:
	    if (ch == mob && parm > GET_LEVEL(ch, RANGER_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, RANGER_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_RANGER;
	    } else {
		GET_CLASS(mob) |= CLASS_RANGER;
	    }
	    GET_LEVEL(mob, RANGER_LEVEL_IND) = parm;
	    break;
	case 26:
	    if (ch == mob && parm > GET_LEVEL(ch, DRUID_LEVEL_IND)) {
		cprintf(ch, "Sure, we all want to be more powerful.\r\n");
		return;
	    }
	    if (ch != mob && IS_IMMORTAL(mob) && str_cmp(GET_NAME(ch), "Quixadhal")
		&& parm > GET_LEVEL(ch, DRUID_LEVEL_IND)) {
		cprintf(ch, "Ask the Dread Lord to make %s mightier!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm < 1) {
		GET_CLASS(mob) &= ~CLASS_DRUID;
	    } else {
		GET_CLASS(mob) |= CLASS_DRUID;
	    }
	    GET_LEVEL(mob, DRUID_LEVEL_IND) = parm;
	    break;
	case 27:
	    if (!IS_NPC(mob)) {
		cprintf(ch, "You should tell %s to be more aggressive!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm) {
		if (!IS_SET(mob->specials.act, ACT_AGGRESSIVE)) {
		    SET_BIT(mob->specials.act, ACT_AGGRESSIVE);
		    cprintf(ch, "%s is now AGGRESSIVE!\r\n", NAME(mob));
		}
	    } else {
		if (IS_SET(mob->specials.act, ACT_AGGRESSIVE)) {
		    REMOVE_BIT(mob->specials.act, ACT_AGGRESSIVE);
		    cprintf(ch, "%s is now nice.\r\n", NAME(mob));
		}
	    }
	    break;
	case 28:
	    if (!IS_NPC(mob)) {
		cprintf(ch, "You should tell %s to wander about more!\r\n", GET_NAME(mob));
		return;
	    }
	    if (parm) {
		if (IS_SET(mob->specials.act, ACT_SENTINEL)) {
		    REMOVE_BIT(mob->specials.act, ACT_SENTINEL);
		    cprintf(ch, "%s is now wandering!\r\n", NAME(mob));
		}
	    } else {
		if (!IS_SET(mob->specials.act, ACT_SENTINEL)) {
		    SET_BIT(mob->specials.act, ACT_SENTINEL);
		    cprintf(ch, "%s is now lazy.\r\n", NAME(mob));
		}
	    }
	    break;
	default:
	    *buf = '\0';
	    strcpy(buf, "Usage:  pset <name> <attrib> <value>\r\n");
	    for (no = 1, i = 0; pset_list[i]; i++) {
		sprintf(buf + strlen(buf), "%-10s", pset_list[i]);
		if (!(no % 7))
		    strcat(buf, "\r\n");
		no++;
	    }
	    cprintf(ch, "%s\r\n", buf);
    }
}

void do_shutdow(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    cprintf(ch, "If you want to shut something down - say so!\r\n");
}

void do_shutdown(struct char_data *ch, const char *argument, int cmd)
{
    time_t                                  tc = (time_t) 0;
    struct tm                              *t_info = NULL;
    char                                   *tmstr = NULL;
    char                                    arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    tc = time(0);
    t_info = localtime(&tc);
    tmstr = asctime(t_info);
    *(tmstr + strlen(tmstr) - 1) = '\0';

    one_argument(argument, arg);

    if (!*arg) {
	log_boot("SHUTDOWN by %s at %d:%d", GET_NAME(ch), t_info->tm_hour + 1, t_info->tm_min);
	allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
		  tmstr);
	allprintf("\x007The system is going down NOW !!\r\n\x007\r\n");
	diku_shutdown = 1;
	update_time_and_weather();
    } else if (!str_cmp(arg, "-k")) {
	log_info("FAKE REBOOT by %s at %d:%d", GET_NAME(ch),
		 t_info->tm_hour + 1, t_info->tm_min);
	allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
		  tmstr);
	allprintf("\x007Rebooting.  Come back in a few minutes!\r\n");
	allprintf("\x007The system is going down NOW !!\r\n\r\n");
    } else if (!str_cmp(arg, "-r")) {
	log_boot("REBOOT by %s at %d:%d", GET_NAME(ch), t_info->tm_hour + 1, t_info->tm_min);
	allprintf("\x007\r\nBroadcast message from %s (tty0) %s...\r\n\r\n", GET_NAME(ch),
		  tmstr);
	allprintf("\x007Rebooting.  Come back in a few minutes!\r\n");
	allprintf("\x007The system is going down NOW !!\r\n\r\n");
	diku_shutdown = diku_reboot = 1;
	update_time_and_weather();
    } else
	cprintf(ch, "Go shut down someone your own size.\r\n");
}

void do_snoop(struct char_data *ch, const char *argument, int cmd)
{
    static char                             arg[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    struct char_data                       *victim = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!ch->desc)
	return;

    if (IS_NPC(ch))
	return;

    only_argument(argument, arg);

    if (!*arg) {
	cprintf(ch, "Snoop who ?\r\n");
	return;
    }
    if (!(victim = get_char_vis(ch, arg))) {
	cprintf(ch, "No such person around.\r\n");
	return;
    }
    if (!victim->desc) {
	cprintf(ch, "There's no link.. nothing to snoop.\r\n");
	return;
    }
    if (victim == ch) {
	cprintf(ch, "Ok, you just snoop yourself.\r\n");
	if (ch->desc->snoop.snooping) {
	    if (ch->desc->snoop.snooping->desc)
		ch->desc->snoop.snooping->desc->snoop.snoop_by = 0;
	    else
		log_info("caught %s snooping %s who didn't have a descriptor!",
			 ch->player.name, ch->desc->snoop.snooping->player.name);
	    ch->desc->snoop.snooping = 0;
	}
	return;
    }
    if (victim->desc->snoop.snoop_by) {
	cprintf(ch, "Busy already. \r\n");
	return;
    }
    if (GetMaxLevel(victim) >= GetMaxLevel(ch)) {
	cprintf(ch, "You failed.\r\n");
	return;
    }
    cprintf(ch, "Ok. \r\n");

    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, const char *argument, int cmd)
{
    static char                             arg[80] = "\0\0\0\0\0\0\0";
    struct char_data                       *victim = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, arg);

    if (!*arg) {
	cprintf(ch, "Switch with who?\r\n");
    } else {
	if (!(victim = get_char_room_vis(ch, arg))) {
	    if (!(victim = get_char(arg))) {
		cprintf(ch, "They aren't here.\r\n");
		return;
	    }
	}
	{
	    if (ch == victim) {
		cprintf(ch, "He he he... We are jolly funny today, eh?\r\n");
		return;
	    }
	    if (!ch->desc || ch->desc->snoop.snoop_by || ch->desc->snoop.snooping) {
		cprintf(ch, "Mixing snoop & switch is bad for your health.\r\n");
		return;
	    }
	    if (victim->desc || (!IS_NPC(victim)) || IS_SET(victim->specials.act, ACT_SWITCH)) {
		cprintf(ch, "You can't do that, the body is already in use!\r\n");
	    } else {
		cprintf(ch, "Ok.\r\n");

		ch->desc->character = victim;
		ch->desc->original = ch;

		SET_BIT(victim->specials.act, ACT_SWITCH);
		victim->desc = ch->desc;
		ch->desc = 0;
	    }
	}
    }
}

void do_return(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *mob = NULL;
    struct char_data                       *per = NULL;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (!ch->desc)
	return;

    if (!ch->desc->original || (IS_NOT_SET(ch->specials.act, ACT_SWITCH) &&
				IS_NOT_SET(ch->specials.act, ACT_POLYSELF) &&
				IS_NOT_SET(ch->specials.act, ACT_POLYOTHER))) {
	cprintf(ch, "Huh?  Talk sense I can't understand you.\r\n");
	return;
    } else {
	cprintf(ch, "You return to your original body.\r\n");

	if ((IS_SET(ch->specials.act, ACT_POLYSELF) ||
	     IS_SET(ch->specials.act, ACT_POLYOTHER)) && 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); 
	     */
	}
	if (IS_SET(ch->specials.act, ACT_SWITCH))
	    REMOVE_BIT(ch->specials.act, ACT_SWITCH);
	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) ||
	     IS_SET(ch->specials.act, ACT_POLYOTHER)) && cmd) {
	    extract_char(mob);
	}
    }
}

void do_force(struct char_data *ch, const char *argument, int cmd)
{
    struct descriptor_data                 *i = NULL;
    struct char_data                       *vict = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";
    char                                    to_force[100] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch) && (cmd != 0))
	return;

    half_chop(argument, name, to_force);

    if (!*name || !*to_force)
	cprintf(ch, "Who do you wish to force to do what?\r\n");
    else if (str_cmp("all", name)) {
	if (!(vict = get_char_vis(ch, name)))
	    cprintf(ch, "No-one by that name here..\r\n");
	else {
	    if ((GetMaxLevel(ch) <= GetMaxLevel(vict)) && (!IS_NPC(vict)))
		cprintf(ch, "Oh no you don't!!\r\n");
	    else {
		if (!IS_SET(ch->specials.act, PLR_STEALTH))
		    act("$n has forced you to '%s'.", FALSE, ch, 0, vict, TO_VICT, to_force);
		cprintf(ch, "Ok.\r\n");
		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)))
		    cprintf(ch, "Oh no you don't!!\r\n");
		else {
		    if (!IS_SET(ch->specials.act, PLR_STEALTH))
			act("$n has forced you to '%s'.", FALSE, ch, 0, vict, TO_VICT,
			    to_force);
		    command_interpreter(vict, to_force);
		}
	    }
	cprintf(ch, "Ok.\r\n");
    }
}

void do_load(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *mob = NULL;
    struct obj_data                        *obj = NULL;
    char                                    type[100] = "\0\0\0\0\0\0\0";
    char                                    num[100] = "\0\0\0\0\0\0\0";
    int                                     anumber = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    argument = one_argument(argument, type);

    only_argument(argument, num);
    if (isdigit(*num))
	anumber = atoi(num);
    else
	anumber = -1;

    if (is_abbrev(type, "mobile")) {
	if (anumber < 0) {
	    for (anumber = 0; anumber <= top_of_mobt; anumber++)
		if (isname(num, mob_index[anumber].name))
		    break;
	    if (anumber > top_of_mobt)
		anumber = -1;
	} else {
	    anumber = real_mobile(anumber);
	}
	if (anumber < 0 || anumber > top_of_mobt) {
	    cprintf(ch, "There is no such monster.\r\n");
	    return;
	}
	mob = read_mobile(anumber, 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 (anumber < 0) {
	    for (anumber = 0; anumber <= top_of_objt; anumber++)
		if (isname(num, obj_index[anumber].name))
		    break;
	    if (anumber > top_of_objt)
		anumber = -1;
	} else {
	    anumber = real_object(anumber);
	}
	if (anumber < 0 || anumber > top_of_objt) {
	    cprintf(ch, "There is no such object.\r\n");
	    return;
	}
	obj = read_object(anumber, 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 {
	cprintf(ch, "Usage:  load <object|mobile> <vnum|name>\r\n");
    }
}

static void purge_one_room(int rnum, struct room_data *rp, int *range)
{
    struct char_data                       *ch = NULL;
    struct obj_data                        *obj = NULL;

    if (DEBUG > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) range);

    if (rnum == 0 || rnum < range[0] || rnum > range[1])
	return;

    while (rp->people) {
	ch = rp->people;
	cprintf(ch, "The gods strike down from the heavens making the");
	cprintf(ch, "world tremble.  All that's left is the Void.");
	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, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    struct char_data                       *next_v = NULL;
    struct obj_data                        *obj = NULL;
    struct obj_data                        *next_o = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    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)) {
		cprintf(ch, "I'm sorry, Dave.  I can't let you do that.\r\n");
		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) {
		    cprintf(ch, "I'm sorry, Dave.  I can't let you do that.\r\n");
		    return;
		}
		argument = one_argument(argument, name);
		if (!isdigit(*name)) {
		    cprintf(ch, "purge room start [end]");
		    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) {
		    cprintf(ch, "usage: purge room start [end]\r\n");
		    return;
		}
		hash_iterate(&room_db, (funcp)purge_one_room, range);
	    } else {
		cprintf(ch, "I don't see that here.\r\n");
		return;
	    }
	}

	cprintf(ch, "Ok.\r\n");
    } else {						       /* no argument. clean out the room */
	if (GetMaxLevel(ch) < DEMIGOD)
	    return;
	if (IS_NPC(ch)) {
	    cprintf(ch, "You would only kill yourself..\r\n");
	    return;
	}
	act("$n gestures, the world erupts around you in flames!", FALSE, ch, 0, 0, TO_ROOM);
	rprintf(ch->in_room, "The world seems a little cleaner.\r\n");

	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 = 0;
    int                                     j = 0;
    int                                     k = 0;
    int                                     temp = 0;
    unsigned char                           table[5];
    unsigned char                           rools[4];

    if (DEBUG > 2)
	log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch));

    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 = number(0, 100);
	    }
	    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("Error on class");
    }

    switch (GET_RACE(ch)) {
	case RACE_ELVEN:
	    ch->abilities.dex += 1;
	    ch->abilities.con -= 1;
	    break;
	case RACE_DWARF:
	    ch->abilities.con += 1;
	    ch->abilities.intel -= 1;
	    break;
	case RACE_HALFLING:
	    ch->abilities.dex += 1;
	    ch->abilities.str -= 1;
	    break;
	case RACE_GNOME:
	    ch->abilities.intel += 1;
	    ch->abilities.wis -= 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 start_character(struct char_data *ch)
{
    struct obj_data                        *obj = NULL;
    int                                     r_num = 0;

    if (DEBUG > 2)
	log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(ch));

    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);
    }
/* Newbie note: added 9-25-95 by Sedna */
    if ((r_num = real_object(3105)) >= 0) {
	obj = read_object(r_num, REAL);
	obj_to_char(obj, ch);
    }
/* Torch */
    if ((r_num = real_object(3015)) >= 0) {
	obj = read_object(r_num, REAL);
	obj_to_char(obj, ch);
    }
    if (IS_SET(ch->player.class, CLASS_RANGER)) {
	ch->skills[SKILL_TRACK].learned = 13;
	ch->skills[SKILL_DISARM].learned = 7;
    }
    if (IS_SET(ch->player.class, CLASS_THIEF)) {
	ch->skills[SKILL_SNEAK].learned = 1;
	ch->skills[SKILL_HIDE].learned = 13;
	ch->skills[SKILL_STEAL].learned = 7;
	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, const char *argument, int cmd)
{
    struct char_data                       *victim = NULL;
    char                                    name[100] = "\0\0\0\0\0\0\0";
    char                                    level[100] = "\0\0\0\0\0\0\0";
    char                                    class[100] = "\0\0\0\0\0\0\0";
    int                                     adv = 0;
    int                                     newlevel = 0;
    int                                     lin_class = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    argument = one_argument(argument, name);

    if (*name) {
	if (!(victim = get_char_room_vis(ch, name))) {
	    cprintf(ch, "That player is not here.\r\n");
	    return;
	}
    } else {
	cprintf(ch, "Advance who?\r\n");
	return;
    }

    if (IS_NPC(victim)) {
	cprintf(ch, "NO! Not on NPC's.\r\n");
	return;
    }
    if (IS_IMMORTAL(victim)) {
	cprintf(ch, "But they are already as powerful as you can imagine!\r\n");
	return;
    }
    argument = one_argument(argument, class);

    if (!*class) {
	cprintf(ch, "Classes you may suply: [ M C W T R ]\r\n");
	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:
	    cprintf(ch, "Classes you may use [ M C W T R ]\r\n");
	    return;
	    break;

    }

    argument = one_argument(argument, level);

    if (GET_LEVEL(victim, lin_class) == 0)
	adv = 1;
    else if (!*level) {
	cprintf(ch, "You must supply a level number.\r\n");
	return;
    } else {
	if (!isdigit(*level)) {
	    cprintf(ch, "Third argument must be a positive integer.\r\n");
	    return;
	}
	if ((newlevel = atoi(level)) < GET_LEVEL(victim, lin_class)) {
	    int                                     i;

	    if ((i = GET_LEVEL(victim, lin_class) - newlevel) < 1) {
		cprintf(ch, "Sorry, must leave them at level 1 at least!\r\n");
		return;
	    }
	    for (; i > 0; i--)
		drop_level(victim, lin_class);
	    set_title(victim);
	    return;
	}
	adv = newlevel - GET_LEVEL(victim, lin_class);
    }

    if (((adv + GET_LEVEL(victim, lin_class)) > 1) && (GetMaxLevel(ch) < IMPLEMENTOR)) {
	cprintf(ch, "Thou art not godly enough.\r\n");
	return;
    }
    if ((adv + GET_LEVEL(victim, lin_class)) > IMPLEMENTOR) {
	cprintf(ch, "Implementor is the highest possible level.\r\n");
	return;
    }
    if (((adv + GET_LEVEL(victim, lin_class)) < 1)
	&& ((adv + GET_LEVEL(victim, lin_class)) != 1)) {
	cprintf(ch, "1 is the lowest possible level.\r\n");
	return;
    }
    cprintf(ch, "You feel generous.\r\n");
    act("$n makes some strange gestures.\r\nA strange feeling comes upon you,"
	"\r\nLike a giant hand, light comes down from\r\nabove, grabbing your "
	"body, that begins\r\nto pulse with coloured lights from inside.\r\nYo"
	"ur head seems to be filled with daemons\r\nfrom another plane as your"
	" body dissolves\r\ninto the elements of time and space itself.\r\nSudde"
	"nly a silent explosion of light snaps\r\nyou back to reality. You fee"
	"l slightly\r\ndifferent.", FALSE, ch, 0, victim, TO_VICT);

    if (GET_LEVEL(victim, lin_class) == 0) {
	start_character(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);
	    cprintf(ch, "Character is now advanced.\r\n");
	} else {
	    cprintf(victim, "Some idiot just tried to advance your level.\r\n");
	    cprintf(ch, "IMPOSSIBLE! IDIOTIC!\r\n");
	}
    }
}

void do_reroll(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *victim = NULL;
    char                                    buf[100] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    if (IS_IMMORTAL(ch)) {
	only_argument(argument, buf);
	if (!*buf)
	    cprintf(ch, "Who do you wish to reroll?\r\n");
	else if (!(victim = get_char(buf)))
	    cprintf(ch, "No-one by that name in the world.\r\n");
	else {
	    cprintf(ch, "Rerolled...\r\n");
	    roll_abilities(victim);
	}
    } else {
	cprintf(ch, "You feel... different!\r\n");
	roll_abilities(ch);
    }
}

void do_restore_all(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    do_restore(ch, "all", 0);
}

void restore_one_victim(struct char_data *victim)
{
    int                                     i = 0;

    if (DEBUG > 1)
	log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_NAME(victim));

    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) {
	if (GetMaxLevel(victim) >= LOKI) {
	    for (i = 0; i < MAX_SKILLS; i++) {
		victim->skills[i].learned = 100;
		victim->skills[i].recognise = TRUE;
	    }
	    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;
	} else
	    for (i = 0; i < MAX_SKILLS; i++) {
		victim->skills[i].learned = number(50, 100);
		victim->skills[i].recognise = TRUE;
	    }
	if (GetMaxLevel(victim) >= LOKI) {
	    if ((strcasecmp(GET_NAME(victim), "Quixadhal"))) {
		int                                     x = 0;

		cprintf(victim, "Fool!  You DARE challenge the Dread Lord?\r\n");
		for (x = 0; x < ABS_MAX_CLASS; x++)
		    if (HasClass(victim, 1 << x))
			GET_LEVEL(victim, x) = LOW_IMMORTAL;
		save_char(victim, NOWHERE);
	    }
	}
    }
    update_pos(victim);
}

void do_restore(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *victim = NULL;
    struct descriptor_data                 *i = NULL;
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    only_argument(argument, buf);
    if (!*buf) {
	cprintf(ch, "Who do you wish to restore?\r\n");
    } else if (!strcasecmp(buf, "all")) {
	for (i = descriptor_list; i; i = i->next) {
	    if ( /* i->character != ch && */ !i->connected &&
		i->character != board_kludge_char) {
		victim = i->character;
		restore_one_victim(victim);
		if (INVIS_LEVEL(victim) < GetMaxLevel(ch))
		    cprintf(ch, "%s restored.\r\n", GET_NAME(victim));
		act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
	    }
	}
    } else if (GetMaxLevel(ch) < GOD) {
	cprintf(ch, "You have not the power to restore a single mortal!\r\n");
    } else if (!(victim = get_char(buf))) {
	cprintf(ch, "No-one by that name in the world.\r\n");
    } else {
	restore_one_victim(victim);
	if (INVIS_LEVEL(victim) < GetMaxLevel(ch))
	    cprintf(ch, "%s restored.\r\n", GET_NAME(victim));
	act("You have been fully healed by $N!", FALSE, victim, 0, ch, TO_CHAR);
    }
}

void do_show_logs(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_SET(ch->specials.act, PLR_LOGS)) {
	cprintf(ch, "You will no longer recieve the logs to your screen.\r\n");
	REMOVE_BIT(ch->specials.act, PLR_LOGS);
	return;
    } else {
	cprintf(ch, "You WILL recieve the logs to your screen.\r\n");
	SET_BIT(ch->specials.act, PLR_LOGS);
	return;
    }
}

void do_noshout(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    struct obj_data                        *dummy = NULL;
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);

    if (!*buf || IS_MORTAL(ch))
	if (IS_SET(ch->specials.act, PLR_NOSHOUT)) {
	    cprintf(ch, "You can now hear shouts again.\r\n");
	    REMOVE_BIT(ch->specials.act, PLR_NOSHOUT);
	} else {
	    cprintf(ch, "From now on, you won't hear shouts.\r\n");
	    SET_BIT(ch->specials.act, PLR_NOSHOUT);
    } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
	cprintf(ch, "Couldn't find any such creature.\r\n");
    else if (IS_NPC(vict))
	cprintf(ch, "Can't do that to a beast.\r\n");
    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)) {
	cprintf(vict, "You can shout again.\r\n");
	cprintf(ch, "NOSHOUT removed.\r\n");
	REMOVE_BIT(vict->specials.act, PLR_NOSHOUT);
    } else if (GetMaxLevel(ch) >= SAINT) {
	cprintf(vict, "The gods take away your ability to shout!\r\n");
	cprintf(ch, "NOSHOUT set.\r\n");
	SET_BIT(vict->specials.act, PLR_NOSHOUT);
    } else {
	cprintf(ch, "Sorry, you can't do that\r\n");
    }
}

void do_pager(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_SET(ch->specials.act, PLR_PAGER)) {
	cprintf(ch, "You stop using the Wiley Pager.\r\n");
	REMOVE_BIT(ch->specials.act, PLR_PAGER);
    } else {
	cprintf(ch, "You now USE the Wiley Pager.\r\n");
	SET_BIT(ch->specials.act, PLR_PAGER);
    }
}

void do_nohassle(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    struct obj_data                        *dummy = NULL;
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);

    if (!*buf)
	if (IS_SET(ch->specials.act, PLR_NOHASSLE)) {
	    cprintf(ch, "You can now be hassled again.\r\n");
	    REMOVE_BIT(ch->specials.act, PLR_NOHASSLE);
	} else {
	    cprintf(ch, "From now on, you won't be hassled.\r\n");
	    SET_BIT(ch->specials.act, PLR_NOHASSLE);
    } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
	cprintf(ch, "Couldn't find any such creature.\r\n");
    else if (IS_NPC(vict))
	cprintf(ch, "Can't do that to a beast.\r\n");
    else if (GetMaxLevel(vict) > GetMaxLevel(ch))
	act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
    else
	cprintf(ch, "The implementor won't let you set this on mortals...\r\n");
}

void do_stealth(struct char_data *ch, const char *argument, int cmd)
{
    struct char_data                       *vict = NULL;
    struct obj_data                        *dummy = NULL;
    char                                    buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    only_argument(argument, buf);

    if (!*buf)
	if (IS_SET(ch->specials.act, PLR_STEALTH)) {
	    cprintf(ch, "STEALTH mode OFF.\r\n");
	    REMOVE_BIT(ch->specials.act, PLR_STEALTH);
	} else {
	    cprintf(ch, "STEALTH mode ON.\r\n");
	    SET_BIT(ch->specials.act, PLR_STEALTH);
    } else if (!generic_find(argument, FIND_CHAR_WORLD, ch, &vict, &dummy))
	cprintf(ch, "Couldn't find any such creature.\r\n");
    else if (IS_NPC(vict))
	cprintf(ch, "Can't do that to a beast.\r\n");
    else if (GetMaxLevel(vict) > GetMaxLevel(ch))
	act("$E might object to that.. better not.", 0, ch, 0, vict, TO_CHAR);
    else
	cprintf(ch, "The implementor won't let you set this on mortals...\r\n");

}

static void print_room(int rnum, struct room_data *rp, struct string_block *sb)
{
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     dink = 0;
    int                                     bits = 0;
    int                                     scan = 0;

    if (DEBUG > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) sb);

    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, "]\r\n");

    append_to_string_block(sb, buf);
}

static void print_death_room(int rnum, struct room_data *rp, struct string_block *sb)
{
    if (DEBUG > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) sb);

    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 > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) sb);

    if (rp && rp->room_flags & PRIVATE)
	print_room(rnum, rp, sb);
}

static void show_room_zone(int rnum, struct room_data *rp, struct show_room_zone_struct *srzs)
{
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) srzs);

    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\r\n", 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\r\n", 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, const char *argument, int cmd)
{
    char                                    buf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    zonenum[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     zone = 0;
    int                                     bottom = 0;
    int                                     top = 0;
    int                                     topi = 0;
    struct index_data                      *which_i = NULL;
    struct string_block                     sb;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;

    argument = one_argument(argument, buf);
    init_string_block(&sb);

    if (is_abbrev(buf, "zones")) {
	struct zone_data                       *zd = NULL;
	int                                     zone_bottom = 0;

	sprintf(buf,
		"# Zone   name                                lifespan age     rooms     reset\r\n");
	append_to_string_block(&sb, buf);

	for (zone = 0; zone <= top_of_zone_table; zone++) {
	    const char                             *mode = NULL;

	    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\r\n", zone, zd->name,
		    zd->lifespan, zd->age, zone_bottom, zd->top, mode);
	    append_to_string_block(&sb, buf);
	    zone_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)) {
	    sprintf(buf, "That is not a valid zone_number\r\n");
	    append_to_string_block(&sb, buf);
	    return;
	}
	if (zone >= 0) {
	    bottom = zone ? (zone_table[zone - 1].top + 1) : 0;
	    top = zone_table[zone].top;
	}
	sprintf(buf, "%5s %4s %5s %-40s %-16s %s\r\n", "VNUM", "rnum", "count", "names",
		"distance", "room");
	append_to_string_block(&sb, buf);
	for (objn = 0; objn <= topi; objn++) {
	    struct char_data                       *target_mob = NULL;
	    struct room_data                       *target_room = NULL;
	    char                                    tbuf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

	    oi = which_i + objn;
	    if ((zone >= 0 && (oi->virtual < bottom || oi->virtual > top)) ||
		(zone < 0 && !isname(zonenum, oi->name)))
		continue;				       /* optimize later */
	    target_mob = get_char_vis_world(ch, oi->name, NULL);
	    if (target_mob)
		target_room = real_roomp(target_mob->in_room);
	    if (target_mob && target_room)
		sprintf(tbuf, "[#%5d] %s", target_mob->in_room, target_room->name);
	    sprintf(buf, "%5d %4d %5d %-40s %-16s %s\r\n", oi->virtual, objn, oi->number,
		    oi->name, target_mob ? track_distance(ch, oi->name) : "",
		    target_room ? tbuf : "");
	    append_to_string_block(&sb, buf);
	}
    } else if (is_abbrev(buf, "rooms")) {
	only_argument(argument, zonenum);
	sprintf(buf, "VNUM  rnum type         name [BITS]\r\n");
	append_to_string_block(&sb, buf);
	if (is_abbrev(zonenum, "death")) {
	    hash_iterate(&room_db, (funcp)print_death_room, &sb);
	} else if (is_abbrev(zonenum, "private")) {
	    hash_iterate(&room_db, (funcp)print_private_room, &sb);
	} else if (1 != sscanf(zonenum, "%i", &zone) || zone < 0 || zone > top_of_zone_table) {
	    sprintf(buf, "I need a zone number with this command\r\n");
	    append_to_string_block(&sb, buf);
	} 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, (funcp)show_room_zone, &srzs);
	    if (srzs.blank) {
		sprintf(buf, "rooms %d-%d are blank\r\n", srzs.startblank, srzs.lastblank);
		append_to_string_block(&sb, buf);
		srzs.blank = 0;
	    }
	}
    } else {
	sprintf(buf, "Usage:\r\n"
		"  show zones\r\n"
		"  show (objects|mobiles) (zone#|name)\r\n"
		"  show rooms (zone#|death|private)\r\n");
	append_to_string_block(&sb, buf);
    }
    page_string_block(&sb, ch);
    destroy_string_block(&sb);
}

void do_debug(struct char_data *ch, const char *argument, int cmd)
{
    char                                    arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    int                                     level = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    one_argument(argument, arg);

    if (!*arg) {
	if (DEBUG) {
	    DEBUG = FALSE;
	    cprintf(ch, "Debug is now off.\r\n");
	} else {
	    DEBUG = TRUE;
	    cprintf(ch, "Debug is now on.\r\n");
	}
    } else if (!strcasecmp(arg, "on")) {
	DEBUG = TRUE;
	cprintf(ch, "Debug is now on.\r\n");
    } else if (!strcasecmp(arg, "off")) {
	DEBUG = FALSE;
	cprintf(ch, "Debug is now off.\r\n");
    } else if (scan_number(arg, &level)) {
	if (level <= 0) {
	    DEBUG = FALSE;
	    cprintf(ch, "Debug is now off.\r\n");
	} else {
	    DEBUG = level;
	    cprintf(ch, "Debug set to %d\r\n", DEBUG);
	}
    } else {
	cprintf(ch, "Usage:  debug [on|off|<level>]\r\n");
    }
    return;
}

void do_invis(struct char_data *ch, const char *argument, int cmd)
{
    int                                     level = 0;

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (scan_number(argument, &level)) {
	if (level <= 0)
	    level = 0;
	else {
	    if (level >= GetMaxLevel(ch)) {
		cprintf(ch, "Sorry, you cant invis that high yet!\r\n");
		return;
	    }
	}
	ch->invis_level = level;
	cprintf(ch, "Invis level set to %d.\r\n", level);
    } else {
	if (ch->invis_level > 0) {
	    ch->invis_level = 0;
	    cprintf(ch, "You are now totally VISIBLE.\r\n");
	} else {
	    ch->invis_level = GetMaxLevel(ch) - 1;
	    cprintf(ch, "You are now invisible to level %d.\r\n", GetMaxLevel(ch) - 1);
	}
    }
}

void do_reset(struct char_data *ch, const char *argument, int cmd)
{
    int                                     start = 0;
    int                                     finish = 0;
    int                                     i = 0;
    struct room_data                       *rp = NULL;
    char                                    start_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    finish_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;
    argument = one_argument(argument, start_level);
    if (!strcasecmp(start_level, "all")) {
	start = 0;
	finish = top_of_zone_table;
    } else if (*start_level) {
	start = atoi(start_level);
	if (start < 0)
	    start = 0;
	if (start > top_of_zone_table)
	    start = top_of_zone_table;
	argument = one_argument(argument, finish_level);
	if (*finish_level) {
	    finish = atoi(finish_level);
	    if (finish < start)
		finish = start;
	    if (finish > top_of_zone_table)
		finish = top_of_zone_table;
	} else {
	    finish = start;
	}
    } else {
	if ((rp = real_roomp(ch->in_room))) {
	    start = finish = rp->zone;
	} else {
	    return;
	}
    }
    for (i = start; i <= finish; i++) {
	if (zone_table[i].reset_mode) {
	    reset_zone(i);
	}
    }
    if (start != finish) {
	cprintf(ch, "You have reset Zones %d through %d.\r\n", start, finish);
	log_reset("Reset of Zones [#%d] to [#%d] by %s.", start, finish, GET_NAME(ch));
    } else {
	cprintf(ch, "You have reset Zone %d.\r\n", start);
	log_reset("Reset of Zone [#%d] by %s.", start, GET_NAME(ch));
    }
}

static void zone_purge_effect(int rnum, struct room_data *rp, int *zones)
{
    struct char_data                       *vict = NULL;
    struct char_data                       *next_v = NULL;
    struct obj_data                        *obj = NULL;
    struct obj_data                        *next_o = NULL;

    if (DEBUG > 2)
	log_info("called %s with %d, %08zx, %08zx", __PRETTY_FUNCTION__, rnum, (size_t) rp,
		 (size_t) zones);

    if (!rp || rp->zone < zones[0] || rp->zone > zones[1])
	return;
    rprintf(rnum, "Flames shoot skyward all around you, and it grows quiet.\r\n");

    for (vict = rp->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 = rp->contents; obj; obj = next_o) {
	next_o = obj->next_content;
	extract_obj(obj);
    }
}

void do_zone_purge(struct char_data *ch, const char *argument, int cmd)
{
    int                                     zones[2];
    struct room_data                       *rp = NULL;
    char                                    start_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    finish_level[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;
    argument = one_argument(argument, start_level);
    if (!strcasecmp(start_level, "all")) {
	zones[0] = 0;
	zones[1] = top_of_zone_table;
    } else if (*start_level) {
	zones[0] = atoi(start_level);
	if (zones[0] < 0)
	    zones[0] = 0;
	if (zones[0] > top_of_zone_table)
	    zones[0] = top_of_zone_table;
	argument = one_argument(argument, finish_level);
	if (*finish_level) {
	    zones[1] = atoi(finish_level);
	    if (zones[1] < zones[0])
		zones[1] = zones[0];
	    if (zones[1] > top_of_zone_table)
		zones[1] = top_of_zone_table;
	} else {
	    zones[1] = zones[0];
	}
    } else {
	if ((rp = real_roomp(ch->in_room))) {
	    zones[0] = zones[1] = rp->zone;
	} else {
	    return;
	}
    }
    hash_iterate(&room_db, (funcp)zone_purge_effect, zones);
    if (zones[0] != zones[1]) {
	cprintf(ch, "You have cleaned Zones %d through %d.\r\n", zones[0], zones[1]);
	log_reset("Purge of Zones [#%d] to [#%d] by %s.", zones[0], zones[1], GET_NAME(ch));
    } else {
	cprintf(ch, "You have cleaned Zone %d.\r\n", zones[0]);
	log_reset("Purge of Zone [#%d] by %s.", zones[0], GET_NAME(ch));
    }
}

void do_not_yet_implemented(struct char_data *ch, const char *argument, int cmd)
{
    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    cprintf(ch, "This command is not yet implemented.\r\n");
}

void do_setreboot(struct char_data *ch, const char *argument, int cmd)
{
    FILE                                   *pfd = NULL;
    int                                     first = 0;
    int                                     second = 0;
    char                                    first_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
    char                                    second_str[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";

    if (DEBUG)
	log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch),
		 VNULL(argument), cmd);

    if (IS_NPC(ch))
	return;
    argument = one_argument(argument, first_str);
    if (*first_str) {
	first = atoi(first_str);
	if (first < 0)
	    first = 0;
	argument = one_argument(argument, second_str);
	if (*second_str) {
	    second = atoi(second_str);
	    if (second < 0)
		second = 0;
	    if (second > 59)
		second = 59;
	} else {
	    second = first;
	}
    } else {
	first = 23;
	second = 0;
    }

    if (first > 0) {
        REBOOT_HOUR = first;
        REBOOT_MIN = second;
        REBOOT_FREQ = (REBOOT_HOUR * 60 * 60 ) + (REBOOT_MIN * 60);
        REBOOT_LASTCHECK = time(0);
        REBOOT_LEFT = REBOOT_FREQ;

        if (!(pfd = fopen(REBOOTTIME_FILE, "w"))) {
            log_info("Cannot save reboot times!");
        } else {
            fprintf(pfd, "%d %d\n", REBOOT_HOUR, REBOOT_MIN);
            FCLOSE(pfd);
        }
        cprintf(ch, "You have set the reboot frequency to %2d hours and %2d minutes.\r\n", REBOOT_HOUR, REBOOT_MIN);
        log_info("Reboot frequency set to %2d hours and %2d minutes by %s.\r\n", REBOOT_HOUR, REBOOT_MIN, GET_NAME(ch));
    } else {
        if (!(pfd = fopen(REBOOTTIME_FILE, "w"))) {
            log_info("Cannot save reboot times!");
        } else {
            fprintf(pfd, "%d %d\n", 0, 0);
            FCLOSE(pfd);
        }
    }

}