/
Archipelago/
Archipelago/doc/
Archipelago/lib/misc/
Archipelago/lib/plrobjs/
Archipelago/lib/plrobjs/P-T/
Archipelago/lib/world/mob/
Archipelago/lib/world/obj/
Archipelago/lib/world/shp/
Archipelago/lib/world/wld/
Archipelago/lib/world/zon/
Archipelago/slave/
/* ************************************************************************
*   File: mobedit.c                                   Part of Archipelago *
*  Usage: online mobile editing commands. A Neil - June 1994              *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  Archipelago is based on                                                *
*  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
*  Archipelago changes by Alastair J. Neil Copyright (C) 1993, 94, 95, 96 * 
 ************************************************************************ */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "limits.h"
#include "screen.h"
#include "mobedit.h"

void mobedit(struct descriptor_data *d, char *str);
void print_mob(struct descriptor_data *d);
int print_maff(struct descriptor_data *d);
int print_mflags(struct descriptor_data *d);
void print_mstats(struct descriptor_data *d);
void print_acsvs(struct descriptor_data *d);
void print_ac(struct descriptor_data *d);
void print_st(struct descriptor_data *d);
void print_sv(struct descriptor_data *d);
void print_mstr(struct descriptor_data *d);
void print_matt(struct descriptor_data *d);
int print_mpos(struct descriptor_data *d);
int print_mdpos(struct descriptor_data *d);
void print_msex(struct descriptor_data *d);
void print_mobstats(struct descriptor_data *d);
void    copy_mob(struct char_data *from, struct char_data *to);
void    free_mob(struct char_data *mob);
void print_races(struct descriptor_data *d);
int compute_mob_exp(struct char_data *mob);
int compute_mobproto_exp(struct char_data *mob);

extern struct str_app_type str_app[];
extern struct list_index_type npc_races[];
extern struct char_data *mob_proto;
extern char	*affected_bits[];
extern char	*action_bits[];
extern char	*position_types[];
extern char	*npc_class_types[];
extern struct index_data *mob_index;
extern struct dual_list_type attack_hit_text[];
char    *rev_search_list(int num, struct list_index_type *list);

void mobedit(struct descriptor_data *d, char *str)
{
    
    struct char_data *mob_edit;
    int ja_flag,points, rmob;
    char *ctmp;
    char bufme[MAX_STRING_LENGTH];
    const char *save[] = {
	"Breath",
	"Paralysis",
	"Rods",
	"Petrification",
	"Spells"};
    const char *locs[] = {
	"Breath",
	"Paralysis",
	"Rods",
	"Petrification",
	"Spells"};


    mob_edit = d->mob_edit;
    switch (d->medit_mode){
    case MAIN_MODE:
	for (; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MAIN_MODE;
	    print_mob(d);	    
	    break;}
	*str = LOWER(*str);
	if (*str == 'q'){
	    if ((rmob = real_mobile(d->virtual)) < 0){
		SEND_TO_Q("Yikes mob doesn't exist.\r\nReport this!\r\n",d);
		free_mob(d->mob_edit);
		d->mob_edit = 0;
		d->virtual = 0;
		d->ia_flag = 0;
		d->n_att = 0;
		d->isave =0;
		d->iloc = 0;
		d->prompt_mode = 1;
		REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
                act("$n returns from creating part of the world.",TRUE, d->character,0, 0, TO_ROOM);
		return;}
	    d->mob_edit->nr = rmob;
	    copy_mob(d->mob_edit, mob_proto + rmob);
	    free_mob(d->mob_edit);		    
	    d->mob_edit = 0;
	    d->virtual = 0;	    
	    d->ia_flag = 0;
	    d->n_att = 0;
	    d->isave = 0;
	    d->iloc = 0;
	    d->prompt_mode = 1;
	    REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
            act("$n returns from creating part of the world.",TRUE, d->character,0, 0, TO_ROOM);
	    return;}
	else
	    switch (*str){
	    case 'm':
		d->medit_mode = MFLAG_EDIT;
		d->ia_flag = print_mflags(d);
		return;
	    case 'f':
		d->medit_mode = MAFF_EDIT;
		d->ia_flag = print_maff(d);
		return;
	    case 's':
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
	    case 'p':
		d->medit_mode = MSTAT_EDIT;
		print_mstats(d);
		return;
	    case 'a':
		d->medit_mode = MACS_EDIT;
		print_acsvs(d);
		return;		
	    case 't':
		if (mob_index[mob_edit->nr].number != 0)
		    {
			SEND_TO_Q("Cannot modify string info on active mobs.\r\n",d);
			SEND_TO_Q("Press return to continue.\r\n",d);
			d->medit_mode = MAIN_MODE;
			return;
		    }
		d->medit_mode = MSTRI_EDIT;
		print_mstr(d);
		return;		
	    default:
		SEND_TO_Q("Illegal Entry, try again\r\n",d);
		print_mob(d);
		SEND_TO_Q("\r\nEnter a letter a-w or  Q to Quit\r\n",d);
		return;
	    }
	break;
    case MMSTAT_EDIT:
	for( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);	    
	    break;}

	*str = LOWER(*str);
	if (*str != '1' && *str != '2' && *str != '3' && *str != '4' && *str != '5' && *str != 'q'){
	    SEND_TO_Q("No such option.",d);
	    break;}
	switch(*str){
	case '1':
	    d->medit_mode = MALIGN_EDIT;
	    sprintf(bufme,"%sAlignment: %s%s%d%s\r\n\r\n",cy,nrm,rd,GET_ALIGNMENT(mob_edit),nrm);
	    SEND_TO_Q(bufme,d);
	    SEND_TO_Q("Enter a new alignment >= -1000 <= 1000.\r\n",d);
	    return;
	case '2':
	    d->medit_mode = MNHD_EDIT;
	    sprintf(bufme,"%sHit Dice: %s%d%s\r\n",cy,rd,mob_edit->points.hit,nrm);
	    SEND_TO_Q(bufme,d);
	    SEND_TO_Q("Enter new Hit dice.\r\n",d);
	    return;
	case '3':
	    SEND_TO_Q("Enter new position.\r\n",d);
	    d->ia_flag = print_mpos(d);
	    d->medit_mode = MPOS_EDIT;
	    return;
	case '4':
	    d->medit_mode = MGOLD_EDIT;
	    sprintf(bufme,"%sHas Gold?:%s %s%s%s\r\n\r\n",cy,nrm,rd,(GET_GOLD(mob_edit) ? "yes": "no"),nrm);
	    SEND_TO_Q(bufme,d);
	    return;
	case '5':
	    d->medit_mode = MCLASS_EDIT;
	    print_races(d);
	    return;
	case 'q':
	    d->medit_mode = MAIN_MODE;
	    print_mob(d);
	    return;
	}
	    
    case MALIGN_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MLEVEL_EDIT;
	    sprintf(bufme,"Alignment Unchanged.\r\n\r\n%sLevel: %s%s%d%s\r\nEnter a new Mob Level:\r\n",cy,nrm,rd,GET_LEVEL(mob_edit),nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	points = atoi(str);
	    
	if (points > 1000 || points < -1000){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new Alignment, >= -1000, <= 1000:",d);
	    break;
	}
	    else{
		GET_ALIGNMENT(mob_edit) = points;
		d->medit_mode = MLEVEL_EDIT;
		sprintf(bufme,"%sLevel: %s%s%d%s\r\n\r\n",cy,nrm,rd,GET_LEVEL(mob_edit),nrm);
		SEND_TO_Q(bufme,d);
		SEND_TO_Q("Enter a new Mob Level:",d);
		return;
	    }
    case MLEVEL_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MTHACO_EDIT;
	    sprintf(bufme,"Level Unchanged.\r\n\r\n%sHitroll: %s%s%d%s\r\n\r\nEnter a new Mob Hitroll:\r\n",cy,nrm,rd,mob_edit->points.hitroll,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	points = atoi(str);

	if (points < 0 || points > 227){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob Level, >= 0, <= 227y:",d);
	    break;
	}
	else{
	    GET_LEVEL(mob_edit) = points;
	    d->medit_mode = MTHACO_EDIT;
	    sprintf(bufme,"%sHitroll: %s%s%d%s\r\n\r\nEnter a new Mob Hitroll:\r\n",cy,nrm,rd,mob_edit->points.hitroll,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
    case MTHACO_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MHEIGHT_EDIT;
	    sprintf(bufme,"Hitroll Unchanged.\r\n\r\n%sHeight: %s%s%d%s\r\n\r\nEnter a new Mob Height:\r\n",cy,nrm,rd,mob_edit->player.height,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	points = atoi(str);	
	if (points < 0 || points > 20){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob Hitroll, >= 0, <= 20:",d);
	    break;
	}
	else{
	    mob_edit->points.hitroll = points;
	    d->medit_mode = MHEIGHT_EDIT;
	    sprintf(bufme,"%sHeight: %s%s%d%s\r\n\r\nEnter a new Mob Height:\r\n",cy,nrm,rd,mob_edit->player.height,nrm);
	    SEND_TO_Q(bufme,d);
	    return;}
    case MHEIGHT_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MWEIGHT_EDIT;
	    sprintf(bufme,"Height Unchanged.\r\n\r\n%sWeight: %s%s%d%s\r\n\r\nEnter a new Mob Weight:\r\n",cy,nrm,rd,mob_edit->player.weight,nrm);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	points = atoi(str);		
	if (points < 0 || points > 1000){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob height, >= 0, <= 1000:",d);
	    break;
	}
	else{
	    mob_edit->player.height = points;
	    d->medit_mode = MWEIGHT_EDIT;
	    sprintf(bufme,"%sWeight: %s%s%d%s\r\n\r\nEnter a new Mob Weight:\r\n",cy,nrm,rd,mob_edit->player.weight,nrm);
	    SEND_TO_Q(bufme,d);	    	    
	    return;}
    case MWEIGHT_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MMSTAT_EDIT;
	    sprintf(bufme,"Weight Unchanged.\r\n\r\n");
	    print_mobstats(d);
	    SEND_TO_Q(bufme,d);	    
	    return;}
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}	
	points = atoi(str);			
	if (points < 0 || points > 10000){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new Mob weight, >= 0, <= 10000:",d);
	    break;
	}
	else{
	    mob_edit->player.weight = atoi(str);
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);
	    return;}
    case MNHD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSHD_EDIT;
	    sprintf(bufme,"Hit Dice unchanged.\r\n\r\n%sSize of Hit Dice: %s%d%s\r\n\r\nEnter a new Size of Hit Dice:\r\n",cy,rd,mob_edit->points.mana,nrm);
	    SEND_TO_Q(bufme,d);	    
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of hit dice, > 0, <= 100:",d);
	    break;
	}
	else if (atoi(str) <= 0 || atoi(str) > 100){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of hit dice, > 0, <= 100:",d);
	    break;
	}
	else{
	    mob_edit->points.hit = atoi(str);
	    d->medit_mode = MSHD_EDIT;
	    sprintf(bufme,"Size of Hit Dice: %s%s%d%s\r\n\r\nEnter a new Size of Hit Dice:\r\n",cy,rd,mob_edit->points.mana,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    
	    return;}
    case MSHD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MHBON_EDIT;
	    sprintf(bufme,"Size of Hit Dice unchanged.\r\n\r\n%sHit Bonus: %s%d%s\r\n\r\nEnter a new Hit bonus:\r\n",cy,rd,mob_edit->points.move,nrm);
	    SEND_TO_Q(bufme,d);	    	    
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of hit dice, > 0, <= 100:",d);
	    break;
	}
	else if (atoi(str) <= 0 || atoi(str) > 100){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of hit dice, > 0, <= 100:",d);
	    break;
	}
	else{
	    mob_edit->points.mana = atoi(str);
	    d->medit_mode = MHBON_EDIT;
	    sprintf(bufme,"%sHit Bonus: %s%d%s\r\n\r\nEnter a new Hit Bonus:",cy,rd,mob_edit->points.move,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    
	    sprintf(bufme,">= 0 <= %d:", 31999 - (mob_edit->points.hit*mob_edit->points.mana));
	    SEND_TO_Q(bufme,d);	    
	    return;}
    case MHBON_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MNDD_EDIT;
	    sprintf(bufme,"Size of Hit Bonus unchanged.\r\n\r\n%sDam Dice: %s%d%s\r\n\r\nEnter  new Dam Dice:\r\n",cy,rd,mob_edit->specials.damnodice,nrm);
	    SEND_TO_Q(bufme,d);	    	    
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    sprintf(bufme,"\r\nIllegal Value\r\nEnter new hit bonus, > 0, <= %d:",31999 - (mob_edit->points.hit*mob_edit->points.mana));
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else if (atoi(str) <= 0 || atoi(str) > 31999 - (mob_edit->points.hit*mob_edit->points.mana)){
	    sprintf(bufme,"\r\nIllegal Value\r\nEnter new hit bonus, > 0, <= %d:",31999 - (mob_edit->points.hit*mob_edit->points.mana));
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    mob_edit->points.move = atoi(str);
	    d->medit_mode = MNDD_EDIT;
	    sprintf(bufme,"%sDam Dice: %s%d%s\r\n\r\nEnter new Dam Dice:\r\n",cy,rd,mob_edit->specials.damnodice,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    
	    return;}
    case MNDD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSDD_EDIT;
	    sprintf(bufme,"Number of Dam Dice Unchanged.\r\n\r\n%sDam Dice Size: %s%s%d%s\r\n\r\nEnter new Dam Dice Size:\r\n",cy,nrm,rd,mob_edit->specials.damsizedice,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    	    
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of dam dice, > 0, <= 50:",d);
	    break;
	}
	else if (atoi(str) <= 0 || atoi(str) > 50){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new number of dam dice, > 0, <= 50:",d);
	    break;
	}
	else{
	    mob_edit->specials.damnodice = atoi(str);
	    d->medit_mode = MSDD_EDIT;
	    sprintf(bufme,"%sDam Dice Size: %s%s%d%s\r\n\r\nEnter new Dam Dice Size:\r\n",cy,nrm,rd,mob_edit->specials.damsizedice,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    	    	    
	    return;}
    case MSDD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MDBON_EDIT;
	    sprintf(bufme,"Dam Dice Size Unchanged.\r\n\r\n%sDam Bonus: %s%d%s\r\n\r\nEnter new Dam Bonus:\r\n",cy,rd,mob_edit->points.damroll,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    	    	    
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of dam dice, > 0, <= 50:",d);
	    break;
	}
	else if (atoi(str) < 0){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new size of dam dice, > 0, <= 50:",d);
	    break;
	}
	else{
	    mob_edit->specials.damsizedice = atoi(str);
	    d->medit_mode = MDBON_EDIT;
	    sprintf(bufme,"%sDam Bonus: %s%s%d%s\r\n\r\nEnter new Dam Bonus:\r\n\r\n",cy,nrm,rd,mob_edit->points.damroll,nrm);
	    SEND_TO_Q(bufme,d);	    	    	    	    	    	    
	    return;}
    case MDBON_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MATT_EDIT;
	    SEND_TO_Q("Dam bonus Unchanged.\r\nEnter a attack type:\r\n",d);
	    print_matt(d);
	    return;}	    
	if (*str == 'Q' || *str == 'q')
	    {
		d->medit_mode = MMSTAT_EDIT;
		print_mobstats(d);
		return;
		}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new dam bonus, > 0, <= 50:",d);
	    break;
	}
	else if (atoi(str) <= 0 || atoi(str) > 50){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new dam bonus, > 0, <= 50:",d);
	    break;
	}
	else{
	    mob_edit->points.damroll = atoi(str);
	    d->medit_mode = MATT_EDIT;
	    print_matt(d);
	    SEND_TO_Q("Enter a new attack type, Q to quit:",d);
	    return;}
    case MATT_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MATT_EDIT;
	    print_matt(d);
	    return;}
	if (is_number(str)){
	    d->n_att = atoi(str);
	    if (d->n_att >= TYPE_HIT && d->n_att <= TYPE_WHIP )
		{
		    mob_edit->specials.attack_type = d->n_att;
		}
	    print_matt(d);
	    break;
	}
	else if (*str == 'Q' || *str == 'q'){
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);
	    return;
	}
	else{
	    SEND_TO_Q("Illegal Attck.\r\n",d);
	    print_matt(d);
	    break;}
    case MPOS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MPOS_EDIT;
	    d->ia_flag = print_mpos(d);
	    return;}
	if (is_number(str)){
	    d->n_att = atoi(str);
	    if (d->n_att >= 0 && d->n_att <= d->ia_flag )
		{
		    mob_edit->specials.position = d->n_att;
		}
	    d->ia_flag = print_mpos(d);
	    break;
	}
	else if (*str == 'Q' || *str == 'q'){
	    d->ia_flag = print_mdpos(d);
	    d->medit_mode = MDPOS_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal Position.\r\n",d);
	    print_mpos(d);
	    break;}
    case MDPOS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MDPOS_EDIT;
	    d->ia_flag = print_mdpos(d);
	    return;}
	if (is_number(str)){
	    d->n_att = atoi(str);
	    if (d->n_att >= 0 && d->n_att <= d->ia_flag )
		{
		    mob_edit->specials.default_pos = d->n_att;
		}
	    d->ia_flag = print_mdpos(d);
	    break;
	}
	else if (*str == 'Q' || *str == 'q'){
	    print_msex(d);
	    d->medit_mode = MSEX_EDIT;
	    break;}
	else{
	    SEND_TO_Q("Illegal Position.\r\n",d);
	    ja_flag = print_mdpos(d);
	    break;}
	case MSEX_EDIT:
	    for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSEX_EDIT;
	    print_msex(d);	    
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'n' && *str != 'f' && *str != 'm' && *str != 'q'){
	    SEND_TO_Q("No such Sex.",d);
	    break;}
	switch (*str){
	case 'n':
	    mob_edit->player.sex = SEX_NEUTRAL;
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);	    
	    return;
	case 'm':
	    mob_edit->player.sex = SEX_MALE;
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);	    
	    return;
	case 'f':
	    mob_edit->player.sex = SEX_FEMALE;
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);	    
	    return;
	case 'q':
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);
	    return;	    
	}
    case MCLASS_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	print_races(d);
	break;
      }
      if (is_number(str)){
	ja_flag = atoi(str);
	if (rev_search_list(ja_flag, npc_races))
	  {
	    GET_RACE(d->mob_edit) = ja_flag;
	    print_races(d);
	    break;
	  }
	else {
	  SEND_TO_Q("Illegal class code.\r\n",d);
	  print_races(d);
	  break;
	}
      }
      else if (*str == 'Q' || *str == 'q'){
	d->medit_mode = MMSTAT_EDIT;
	print_mobstats(d);	    
	break;
      }
      else{
	SEND_TO_Q("Illegal class code.\r\n",d);
	print_races(d);
	break;
      }
    case MGOLD_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MFAME_EDIT;
	    sprintf(bufme,"Gold Unchanged.\r\n\r\n%sMob Fame:%s %s%d%s\r\n\r\n",cy,nrm,rd,GET_FAME(mob_edit),nrm);
	    SEND_TO_Q(bufme,d);
	    SEND_TO_Q("Enter Mob Fame:\r\n",d);
	    return;}
	if (*str == 'Q' || *str == 'q'){
	    d->medit_mode = MMSTAT_EDIT;
	    print_mobstats(d);
	    return;
	}
	if (!((*str == 'Y') || (*str == 'y')
	      || (*str == 'N') || (*str == 'n'))){
	  SEND_TO_Q("\r\nIllegal Value\r\nToggle Mob Gold:",d);
	  break;
	}
	else if (*str == 'Y' || *str == 'y')
	  GET_GOLD(mob_edit) = 1;
	else
	  GET_GOLD(mob_edit) = 0;
	d->medit_mode = MFAME_EDIT;
	sprintf(bufme,"%sMob Fame:%s %s%d%s\r\n\r\n",cy,nrm,rd,GET_FAME(mob_edit),nrm);
	SEND_TO_Q(bufme,d);
	SEND_TO_Q("Enter Mob Fame >= -1000 <= 1000:\r\n",d);		
	return;
    case MFAME_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	d->medit_mode = MAIN_MODE;
	SEND_TO_Q("Mob Fame Unchanged.\r\n",d);
	print_mob(d);
	return;
      }	    
      if (*str == 'Q' || *str == 'q'){
	d->medit_mode = MMSTAT_EDIT;
	print_mobstats(d);
	return;
      }
      points = atoi(str);
      if ((points > 1000) || (points < -1000)){
	SEND_TO_Q("\r\nIllegal Value\r\nEnter Mob Fame:",d);
	break;
      }
      else{
	GET_FAME(mob_edit) = points;
	d->medit_mode = MMSTAT_EDIT;
	print_mobstats(d);
	return;
      }
    case MSTRI_EDIT:
      for ( ; isspace(*str); str++)
	;
      if (!*str){
	d->medit_mode = MSTRI_EDIT;
	print_mstr(d);	    
	break;}	    
      *str = LOWER(*str);
      if (*str != 'n' && *str != 's' && *str != 'l' && *str != 'd' && *str != 'q'){
	SEND_TO_Q("No such string.",d);
	break;}
      switch(*str){
      case 'n':
	d->str = &(mob_edit->player.name);
	free(*d->str);
	*d->str = 0;
	d->max_str = 80;
	SEND_TO_Q("Enter a new name list, terminate with a @@.\r\n",d);
	return;
      case 's':
	d->str = &(mob_edit->player.short_descr);
	free(*d->str);
	*d->str = 0;
	d->max_str = 80;
	SEND_TO_Q("Enter a new short description, terminate with a @@.\r\n",d);
	return;
      case 'l':
	d->str = &(mob_edit->player.long_descr);
	free(*d->str);
	*d->str = 0;
	d->max_str = 80;
	SEND_TO_Q("Enter a new long decription. Remember the carriage return at the end\r\n, terminate with a @@.\r\n",d);
	return;
      case 'd':
	d->str = &(mob_edit->player.description);
	free(*d->str);
	*d->str = 0;
	d->max_str = 1440;
	SEND_TO_Q("Enter a new decription. Remember the carriage return at the end\r\n, terminate with a @@,\r\n",d);
	return;
      case 'q':
	d->medit_mode = MAIN_MODE;
	print_mob(d);
	return;	    
      }
    case MACS_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MACS_EDIT;
	    print_acsvs(d);	    
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'a' && *str != 's' && *str != 't' && *str != 'q'){
	    SEND_TO_Q("No such option.",d);
	    break;}
	switch(*str){
	case 'a':
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);
	    return;
	case 's':
	    d->medit_mode = MST_EDIT;
	    print_st(d);
	    return;
	case 't':
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);
	    return;	    
	case 'q':
	    d->medit_mode = MAIN_MODE;
	    print_mob(d);
	    return;
	}
	break;
    case MSV_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);	    
	    break;}

	*str = LOWER(*str);
	if (*str != 'b' && *str != '0' && *str != 'p' && *str != 'r' && *str != 's' && *str != 't' && *str != 'q'){
	    SEND_TO_Q("No such option.",d);
	    break;}
	switch(*str){
	case '0':
	    d->medit_mode = MSAVEA_EDIT;
	    SEND_TO_Q("\r\nEnter new Saving Throws, > 0, <= 100",d);
	    return;	    
	case 'b':
	    d->medit_mode = MSAVE_EDIT;
	    SEND_TO_Q("\r\nEnter new Breath Saving Throw, > 0, <= 100",d);
	    d->isave = 3;	    
	    return;
	case 'p':
	    d->medit_mode = MSAVE_EDIT;
	    SEND_TO_Q("\r\nEnter new Paralysis Saving Throw, > 0, <= 100",d);
	    d->isave = 0;	    
	    return;
	case 'r':
	    d->medit_mode = MSAVE_EDIT;
	    SEND_TO_Q("\r\nEnter new Rods Saving Throw, > 0, <= 100",d);
	    d->isave = 1;	    
	    return;	    
	case 't':
	    d->medit_mode = MSAVE_EDIT;
	    SEND_TO_Q("\r\nEnter new Petrification Saving Throw, > 0, <= 100",d);
	    d->isave = 2;
	    return;
	case 's':
	    d->medit_mode = MSAVE_EDIT;
	    SEND_TO_Q("\r\nEnter new Spell Saving Throw, > 0, <= 100",d);
	    d->isave = 4;
	    return;
	case 'q':
	    d->medit_mode = MACS_EDIT;
	    print_acsvs(d);
	    return;
	}

    case MSAVEA_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);
	    break;}
	points = atoi(str);
	if (points < 0 || points > 100){
	    sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new Saving Throws, > 0, <= 100:%s",rd,cy,nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    mob_edit->specials2.apply_saving_throw[0] = points;
	    mob_edit->specials2.apply_saving_throw[1] = points;
	    mob_edit->specials2.apply_saving_throw[2] = points;
	    mob_edit->specials2.apply_saving_throw[3] = points;
	    mob_edit->specials2.apply_saving_throw[4] = points;	    
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);
	    break;}
    case MSAVE_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);
	    break;}
	points = atoi(str);
	if (points < 0 || points > 100){
	    sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s Save, > 0, <= 100:%s",rd,cy,save[d->isave],nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    mob_edit->specials2.apply_saving_throw[d->isave] = points;
	    d->medit_mode = MSV_EDIT;
	    print_sv(d);
	    break;}
    case MST_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MST_EDIT;
	    print_st(d);	    
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'b' && *str != 'h' && *str != 's' && *str != 'a' && *str != 'l' && *str != 'q'){
	    SEND_TO_Q("No such option.",d);
	    break;}
	switch(*str){
	case 's':
	    d->medit_mode = MSTOPA_EDIT;
	    SEND_TO_Q("\r\nEnter new stopping value, >= 0, <= 20",d);
	    return;	    
	case 'b':
	    d->medit_mode = MSTOP_EDIT;
	    SEND_TO_Q("\r\nEnter new Body stopping value, >= 0, <= 20",d);
	    d->iloc = 0;
	    return;
	case 'h':
	    d->medit_mode = MSTOP_EDIT;
	    SEND_TO_Q("\r\nEnter new Head stopping value, >= 0, <= 20",d);
	    d->iloc = 3;	    
	    return;
	case 'a':
	    d->medit_mode = MSTOP_EDIT;
	    SEND_TO_Q("\r\nEnter new Arms stopping value, >= 0, <= 20",d);
	    d->iloc = 2;	    
	    return;	    
	case 'l':
	    d->medit_mode = MSTOP_EDIT;
	    SEND_TO_Q("\r\nEnter new Legs stopping value, >= 0, <= 20",d);
	    d->iloc = 1;	    
	    return;
	case 'q':
	    d->medit_mode = MACS_EDIT;
	    print_acsvs(d);
	    return;
	}
	
    case MSTOPA_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MST_EDIT;
	    print_st(d);
	    break;}
	points = atoi(str);
        if (points < 0 || points > 20){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new stopping value, >= 0, <= 30:",d);
	    break;
	}
	else{
	    GET_LEGS_STOPPING(mob_edit) = points;
	    GET_ARMS_STOPPING(mob_edit) = points;
	    GET_HEAD_STOPPING(mob_edit) = points;
	    GET_BODY_STOPPING(mob_edit) = points;	    
	    d->medit_mode = MST_EDIT;
	    print_st(d);
	    break;}
    case MSTOP_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MST_EDIT;
	    print_st(d);
	    break;}
	points = atoi(str);
	if (points < 0 || points > 20){
	    sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s stopping value, >= 0, <= 30:%s",rd,cy,locs[d->iloc],nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    mob_edit->points.stopping[d->iloc] = points;
	    d->medit_mode = MST_EDIT;
	    print_st(d);
	    break;}
    case MAC_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);	    
	    break;}	    
	*str = LOWER(*str);
	if (*str != 'b' && *str != 'h' && *str != 's' && *str != 'a' && *str != 'l' && *str != 'q'){
	    SEND_TO_Q("No such option.",d);
	    break;}
	switch(*str){
	case 's':
	    d->medit_mode = MARMORA_EDIT;
	    SEND_TO_Q("\r\nEnter new A/C values, >= -100, <= 100",d);
	    return;	    
	case 'b':
	    d->medit_mode = MARMOR_EDIT;
	    SEND_TO_Q("\r\nEnter new Body A/C value, >= -100, <= 100",d);
	    d->iloc = 0;
	    return;
	case 'h':
	    d->medit_mode = MARMOR_EDIT;
	    SEND_TO_Q("\r\nEnter new Head A/C value, >= -100, <= 100",d);
	    d->iloc = 3;	    
	    return;
	case 'a':
	    d->medit_mode = MARMOR_EDIT;
	    SEND_TO_Q("\r\nEnter new Arms A/C value, >= -100, <= 100",d);
	    d->iloc = 2;
	    return;	    
	case 'l':
	    d->medit_mode = MARMOR_EDIT;
	    SEND_TO_Q("\r\nEnter new Legs A/C value, >= -100, <= 100",d);
	    d->iloc = 1;
	    return;
	case 'q':
	    d->medit_mode = MACS_EDIT;
	    print_acsvs(d);
	    return;
	}
	
    case MARMORA_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);
	    break;}
	points = atoi(str);
	if (points <-100 || points > 100){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new A/C value, >= -100, <= 100:",d);
	    break;
	}
	else{
	    GET_LEGS_AC(mob_edit) = points;
	    GET_BODY_AC(mob_edit) = points;
	    GET_HEAD_AC(mob_edit) = points;
	    GET_ARMS_AC(mob_edit) = points;	    
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);
	    break;}
    case MARMOR_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);
	    break;}
	points = atoi(str);
	if (points <-100 || points > 100){
	    sprintf(bufme,"\r\n%sIllegal Value\r\n%sEnter new %s a/c value, >= -100, <= 100:%s",rd,cy,locs[d->iloc],nrm);
	    SEND_TO_Q(bufme,d);
	    break;
	}
	else{
	    mob_edit->points.armor[d->iloc] = points;
	    d->medit_mode = MAC_EDIT;
	    print_ac(d);
	    break;}
    case MSTAT_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}	    
	*str = LOWER(*str);
	if (*str != 's' && *str != 'i' && *str != 'w' && *str != 'c' &&
	    *str != 'h' && *str != 'd' && *str != 'p' && *str != 'g' &&
	    *str != 'v' && *str != 'f' && *str != 'l' && *str != 'q'){
	    SEND_TO_Q("That's not a stat.\r\nEnter a Stat to change, Q to quit: ",d);
	    break;}
	switch(*str){
	case 's':
	    d->medit_mode = MSTR_EDIT;
	    SEND_TO_Q("\r\nEnter new strength value, >= 0, <=30:",d);
	    return;
	case 'i':
	    d->medit_mode = MINT_EDIT;
	    SEND_TO_Q("\r\nEnter new intelligence value, >= 0, <30:",d);
	    return;
	case 'w':
	    d->medit_mode = MWIS_EDIT;
	    SEND_TO_Q("\r\nEnter new wisdom value, >= 0, <=30:",d);
	    return;
	case 'd':
	    d->medit_mode = MDEX_EDIT;
	    SEND_TO_Q("\r\nEnter new dexterity value, >= 0, <= 30:",d);
	    return;
	case 'c':
	    d->medit_mode = MCON_EDIT;
	    SEND_TO_Q("\r\nEnter new constitution value, >= 0, <= 30:",d);
	    return;
	case 'h':
	    d->medit_mode = MCHR_EDIT;
	    SEND_TO_Q("\r\nEnter new charisma value, >= 0, <= 30:",d);
	    return;
	case 'p':
	    d->medit_mode = MPER_EDIT;
	    SEND_TO_Q("\r\nEnter new perception value, >= 0, <= 30:",d);
	    return;
	case 'g':
	    d->medit_mode = MGUI_EDIT;
	    SEND_TO_Q("\r\nEnter new guile value, >= 0, <= 30:",d);
	    return;
	case 'v':
	    d->medit_mode = MDEV_EDIT;
	    SEND_TO_Q("\r\nEnter new devotion value, >= 0, <= 30:",d);
	    return;
	case 'f':
	    d->medit_mode = MFOC_EDIT;
	    SEND_TO_Q("\r\nEnter new focus value, >= 0, <= 30:",d);
	    return;
	case 'l':
	    d->medit_mode = MLUC_EDIT;
	    SEND_TO_Q("\r\nEnter new luck value, >= 0, <= 30:",d);
	    return;
	case 'q':
	    d->medit_mode = MAIN_MODE;
	    print_mob(d);
	    SEND_TO_Q("\r\nEnter a letter a-w or  Q to Quit\r\n",d);
	    return;
	default:
	    print_mstats(d);
	    return;
	}
    case MSTR_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new strength value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new strength value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);
	    GET_STR(mob_edit) = points;
	    GET_RAW_STR(mob_edit) = points;
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MINT_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new intelligence value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new intelligence value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);
	    GET_RAW_INT(mob_edit) = points;
	    GET_INT(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MWIS_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new wisdom value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new wisdom value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    
	    GET_RAW_WIS(mob_edit) = points;
	    GET_WIS(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MDEX_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new dexterity value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new dexterity value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    
	    GET_RAW_DEX(mob_edit) = points;
	    GET_DEX(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MCON_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new constitution value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new constitution value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    
	    GET_RAW_CON(mob_edit) = points;
	    GET_CON(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MCHR_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new charisma value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new charisma value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    	    
	    GET_RAW_CHR(mob_edit) = points;
	    GET_CHR(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MPER_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new perception value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new perception value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    	    	    
	    GET_RAW_PER(mob_edit) = points;
	    GET_PER(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MGUI_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new guile value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new guile value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    	    	    	    
	    GET_RAW_GUI(mob_edit) = points;
	    GET_GUI(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MDEV_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new devotion value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new devotion value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    	    	    	    	    
	    GET_RAW_DEV(mob_edit) = points;
	    GET_DEV(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MFOC_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new focus value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new focus value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    
	    GET_RAW_FOC(mob_edit) = points;
	    GET_FOC(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
    case MLUC_EDIT:
	for ( ; isspace(*str); str++ )
	    ;
	if (!*str){
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	if (!is_number(str)){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new luck value, > 0, <= 30:",d);
	    break;
	}
	else if (atoi(str) <0 || atoi(str) > 30){
	    SEND_TO_Q("\r\nIllegal Value\r\nEnter new luck value, > 0, <= 30:",d);
	    break;
	}
	else{
	    points = atoi(str);	    	    	    
	    GET_RAW_LUC(mob_edit) = points;
	    GET_LUC(mob_edit) = points;	    
	    d->medit_mode = MSTAT_EDIT;
	    print_mstats(d);
	    break;}
	
    case MAFF_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MAFF_EDIT;
	    print_maff(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag )
		{
		    if (!IS_SET(mob_edit->specials.affected_by, 1<<ja_flag))
			SET_BIT(mob_edit->specials.affected_by, 1<<ja_flag);
		    else
			REMOVE_BIT(mob_edit->specials.affected_by, 1<<ja_flag);
		    d->ia_flag =  print_maff(d);
		    break;

		}
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag =  print_maff(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    print_mob(d);	
	    d->medit_mode = MAIN_MODE;
	    break;}
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag =  print_maff(d);
	    break;}
    case MFLAG_EDIT:
	for ( ; isspace(*str); str++)
	    ;
	if (!*str){
	    d->medit_mode = MFLAG_EDIT;
	    d->ia_flag = print_mflags(d);
	    break;}
	if (is_number(str)){
	    ja_flag = atoi(str);
	    if (ja_flag >= 0 && ja_flag <= d->ia_flag
		&& ((1 << ja_flag) != MOB_ISNPC))
		{
		    if (!IS_SET(MOB_FLAGS(mob_edit), 1<<ja_flag))
			SET_BIT(MOB_FLAGS(mob_edit), 1<<ja_flag);
		    else
			REMOVE_BIT(MOB_FLAGS(mob_edit), 1<<ja_flag);
		    d->ia_flag =  print_mflags(d);
		    break;
		}
	    else{
		SEND_TO_Q("Illegal Flag.\r\n",d);
		d->ia_flag =  print_mflags(d);
		break;
	    }
	}
	else if (*str == 'Q' || *str == 'q'){
	    print_mob(d);	
	    d->medit_mode = MAIN_MODE;
	    break;}
	else{
	    SEND_TO_Q("Illegal Flag.\r\n",d);
	    d->ia_flag =  print_mflags(d);
	    break;}
    }
    

}
void print_matt(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    int i,attck;
    struct char_data *mob_edit;
    i = TYPE_HIT;

    mob_edit = d->mob_edit;
    
    if (mob_edit->specials.attack_type < TYPE_HIT)
	attck = TYPE_HIT;
    else
	attck = mob_edit->specials.attack_type;
    sprintf(bufme,"Attack Type: %s%s%s\r\n\r\n",rd,attack_hit_text[attck-TYPE_HIT].singular,nrm);
    SEND_TO_Q(bufme,d);
    while (i <= TYPE_WHIP)
	{
	    if (i+1 <= TYPE_KICK){
		sprintf(bufme,"[%3d]  %s%-20.20s%s      [%3d]  %s%-20.20s%s \r\n",i,rd,attack_hit_text[i-TYPE_HIT].singular,nrm,i+1,rd,attack_hit_text[i+1-TYPE_HIT].singular,nrm);
		i +=2;}
	    else{
		sprintf(bufme,"[%3d]  %s%-20.20s%s \r\n",i,rd,attack_hit_text[i-TYPE_HIT].singular,nrm);
		i +=1;}
	    SEND_TO_Q(bufme,d);        
	}
    
    sprintf(bufme ,"\r\n%sEnter attack # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufme,d);
 
}

int print_maff(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    int i;
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;
    
    sprintbit(mob_edit->specials.affected_by, affected_bits, bufme);
    sprintf(bufm ,"\r\n%sAffected by Flags:%s %s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*affected_bits[i] != '\n')
	{
	    if (*affected_bits[i+2] != '\n'&& *affected_bits[i+1] != '\n'){
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm,i+2,gn,affected_bits[i+2],nrm);
		i +=3;}
	    else if (*affected_bits[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,gn,affected_bits[i],nrm,i+1,gn,affected_bits[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,gn,affected_bits[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_mflags(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    int i;
    struct char_data *mob_edit;

    mob_edit = d->mob_edit;
    
    sprintbit(MOB_FLAGS(mob_edit), action_bits, bufme);
    sprintf(bufm ,"\r\n%sMob Flags: %s%s%s%s\r\n\r\n",cy,nrm,gn,bufme,nrm);
    SEND_TO_Q(bufm,d);
    i = 0;
    while (*action_bits[i] != '\n')
	{
	    if (*action_bits[i+1] != '\n'){
		sprintf(bufm,"[%2d]  %s%-20.20s%s      [%2d]  %s%-20.20s%s \r\n",i,gn,action_bits[i],nrm,i+1,gn,action_bits[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-20.20s%s \r\n",i,gn,action_bits[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter flag # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
void print_mstats(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct char_data *mob_edit;

    mob_edit = d->mob_edit;
    
    sprintf(bufme,"%sPlayer Stats:%s\r\n\r\n",cy,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"%s(S)tr: %2d, (I)nt: %2d, (W)is: %2d, (D)ex: %2d, (C)on: %2d, C(h)r %2d.\r\n",
	    yl,
	    GET_RAW_STR(mob_edit),
	    GET_RAW_INT(mob_edit),
	    GET_RAW_WIS(mob_edit),
	    GET_RAW_DEX(mob_edit),
	    GET_RAW_CON(mob_edit),
	    GET_RAW_CHR(mob_edit));
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"(P)er: %2d, (G)ui: %2d, De(v): %2d, (F)oc: %2d, (L)uc: %2d, (Q)uit.%s\r\n\r\n",
	    GET_RAW_PER(mob_edit),
	    GET_RAW_GUI(mob_edit),
	    GET_RAW_DEV(mob_edit),
	    GET_RAW_FOC(mob_edit),
	    GET_RAW_LUC(mob_edit),nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"%sEnter a Stat to change, Q to to Quit:%s ",cy,nrm);
    SEND_TO_Q(bufme,d);	
}
void print_acsvs(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    
    sprintf(bufme,"%s(A)rmour class, (S)topping and Saving (T)hrows:%s\r\n\r\n",cy,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme ,"%sEnter option to change or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufme,d);
}
void print_st(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;    
    sprintf(bufme,"%sStopping:%s\r\n\r\n",cy,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"%sStop:\r\n(%sS%s)et All, (%sB%s)ody: %s%3d%s (%sH%s)ead: %s%3d%s (%sA%s)rms: %s%3d%s (%sL%s)egs: %s%3d%s\r\n\r\n",
	    nrm,cy,nrm,cy,nrm,gn,
	    GET_BODY_STOPPING(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_HEAD_STOPPING(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_ARMS_STOPPING(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_LEGS_STOPPING(mob_edit),nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufme,d);
}
void print_ac(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct char_data *mob_edit;

    mob_edit = d->mob_edit;    
    sprintf(bufme,"%sArmour class:%s\r\n\r\n",cy,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"%sA/C:\r\n(%sS%s)et All, (%sB%s)ody: %s%3d%s (%sH%s)ead: %s%3d%s (%sA%s)rms: %s%3d%s (%sL%s)egs: %s%3d%s\r\n\r\n",
	    nrm,cy,nrm,cy,nrm,gn,
	    GET_BODY_AC(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_HEAD_AC(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_ARMS_AC(mob_edit),
	    nrm,cy,nrm,gn,
	    GET_LEGS_AC(mob_edit),nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufme,d);
}
void print_sv(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;
    
    sprintf(bufme,"%sSaving Throws:%s\r\n\r\n",cy,nrm);
    SEND_TO_Q(bufme,d);
    sprintf(bufme,"%sSave:\r\n(%s0%s) Set all (%sP%s)ARA: %s%3d%s (%sR%s)OD: %s %3d%s PE(%sT%s)R:%s %3d%s (%sB%s)RTH: %s%3d%s (%sS%s)PELL: %s%3d%s\r\n\r\n",nrm,cy,nrm,cy,nrm,gn,
	    mob_edit->specials2.apply_saving_throw[0],
	    nrm,cy,nrm,gn,
	    mob_edit->specials2.apply_saving_throw[1],
	    nrm,cy,nrm,gn,
	    mob_edit->specials2.apply_saving_throw[2],
	    nrm,cy,nrm,gn,
	    mob_edit->specials2.apply_saving_throw[3],	
	    nrm,cy,nrm,gn,
	    mob_edit->specials2.apply_saving_throw[4],nrm);    
    SEND_TO_Q(bufme,d);
    sprintf(bufme ,"%sEnter location to change or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufme,d);
}

void print_mstr(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;
    
    sprintf(bufme,"%sText:%s\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(N)ame:%s %s%s%s,  ",cy,nrm,wh,mob_edit->player.name,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(S)hort Descr:%s %s%s%s\r\n",cy,nrm,wh,mob_edit->player.short_descr,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(L)ong Descr:%s %s%s%s",cy,nrm,wh,mob_edit->player.long_descr,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%s(D)escription:%s\r\n%s%s%s",cy,nrm,wh,mob_edit->player.description,nrm);
    send_to_char(bufme,d->character);
    SEND_TO_Q("\r\nChoose a string to change, Q to quit:",d);

}
int print_mpos(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    int i;
    struct char_data *mob_edit;
    mob_edit = d->mob_edit;

    sprinttype(mob_edit->specials.position, position_types,bufm);
    sprintf(bufme,"Position: %s%s%s\r\n\r\n",rd,bufm,nrm);
    SEND_TO_Q(bufme,d);	

    i = 0;
    while (*position_types[i] != '\n')
	{
	   if (*position_types[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,rd,position_types[i],nrm,i+1,rd,position_types[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,rd,position_types[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter position type # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}
int print_mdpos(struct descriptor_data *d)
{
    char bufme[MAX_STRING_LENGTH];
    char bufm[MAX_STRING_LENGTH];
    int i;
    struct char_data *mob_edit;
    mob_edit = d->mob_edit;
    
    sprinttype(mob_edit->specials.default_pos, position_types,bufm);
    sprintf(bufme,"Default Position: %s%s%s\r\n\r\n",rd,bufm,nrm);
    SEND_TO_Q(bufme,d);	

    i = 0;
    while (*position_types[i] != '\n')
	{
	   if (*position_types[i+1] != '\n') {
		sprintf(bufm,"[%2d]  %s%-15.15s%s      [%2d]  %s%-15.15s%s \r\n",i,rd,position_types[i],nrm,i+1,rd,position_types[i+1],nrm);
		i +=2;}
	    else{
		sprintf(bufm,"[%2d]  %s%-15.15s%s\r\n",i,rd,position_types[i],nrm);
		i +=1;}
	    SEND_TO_Q(bufm,d);        
	}
    
    sprintf(bufm ,"\r\n%sEnter position type # to toggle or Q to quit.%s ",cy,nrm);
    SEND_TO_Q(bufm,d);
    return(i-1);

}

void print_msex(struct descriptor_data *d)
{
    char bufm[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;
    
    switch(mob_edit->player.sex)
	{
	case SEX_NEUTRAL:
	    send_to_char("Sex: NEUTER\r\n\r\n",d->character);
	    break;
	case SEX_MALE:
	    send_to_char("Sex: MALE\r\n\r\n",d->character);
	    break;	    
	case SEX_FEMALE:
	    send_to_char("Sex: FEMALE\r\n\r\n",d->character);
	    break;
	default:
	    send_to_char("Sex: ILLEGAL\r\n\r\n",d->character);
	}
    sprintf(bufm,"Sex: %s(N)euter, (F)emale, (M)ale%s\r\n\r\n",rd,nrm);
    SEND_TO_Q(bufm,d);

    SEND_TO_Q("Select a sex, Q to Quit.",d);
}

void print_mobstats(struct descriptor_data *d)
{
    int attck;
    char bufme[MAX_STRING_LENGTH], *tmp;
    char bufm[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    
    mob_edit = d->mob_edit;        
	
    sprintf(bufme,"(%sS)tats:%s\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%s1%s) Alignment:%s %d %sLevel:%s %d%s Hitroll:%s %d%s ",cy,nrm,gn,GET_ALIGNMENT(mob_edit),nrm,gn,GET_LEVEL(mob_edit),nrm,gn,mob_edit->points.hitroll,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Height:%s %d%s Weight:%s %d%s\r\n",gn,mob_edit->player.height,nrm,gn,mob_edit->player.weight,nrm);    
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%s2%s) Hit dice:%s %dd%d+%d%s ",cy,nrm,gn,mob_edit->points.hit,mob_edit->points.mana,mob_edit->points.move,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Dam dice: %s%dd%d+%d%s ",gn,mob_edit->specials.damnodice,mob_edit->specials.damsizedice,mob_edit->points.damroll,nrm);
    send_to_char(bufme,d->character);
    if (mob_edit->specials.attack_type >= 300)
	attck = mob_edit->specials.attack_type -300;
    else
	attck = mob_edit->specials.attack_type;
    sprintf(bufme,"Attack type: %s%s%s\r\n",gn,attack_hit_text[attck].singular,nrm);
    send_to_char(bufme,d->character);
    sprinttype(mob_edit->specials.position, position_types,bufm);
    sprintf(bufme,"(%s3%s) Position: %s%s%s ",cy,nrm,gn,bufm,nrm);
    send_to_char(bufme,d->character);	
    sprinttype(mob_edit->specials.default_pos, position_types,bufm);
    sprintf(bufme,"Def Position: %s%s%s ",gn,bufm,nrm);
    send_to_char(bufme,d->character);
    switch(mob_edit->player.sex)
	{
	case SEX_NEUTRAL:
	    sprintf(bufme,"%sNEUTRAL%s\r\n",gn,nrm);
	    break;
	case SEX_MALE:
	    sprintf(bufme,"%sMALE%s\r\n",gn,nrm);
	    break;	    
	case SEX_FEMALE:
	    sprintf(bufme,"%sFEMALE%s\r\n",gn,nrm);
	    break;
	default:
	    sprintf(bufme,"%sILLEGAL%s\r\n",gn,nrm);
	}
    sprintf(bufm,"Sex: %s",bufme);
    SEND_TO_Q(bufm,d);
    sprintf(bufme,"(%s4%s) Gold: %s%s%s Fame: %s%d%s.\r\n",cy,nrm,gn,(GET_GOLD(mob_edit) ? "yes" :"no"),nrm,gn,GET_FAME(mob_edit),nrm);
    send_to_char(bufme,d->character);
    tmp = rev_search_list(GET_RACE(mob_edit), npc_races);
    sprintf(bufme,"(%s5%s) Class: %s%s%s.\r\n",cy,nrm,gn,
	    ((tmp) ? tmp : "Unknown Class"),nrm);
    send_to_char(bufme,d->character);    
    sprintf(bufme,"(%sQ%s) uit.\r\n",cy,nrm);
    send_to_char(bufme,d->character);
	
}

void print_mob(struct descriptor_data *d)

{
    int attck;
    char bufme[MAX_STRING_LENGTH], *ctemp;
    char bufm[MAX_STRING_LENGTH];
    struct char_data *mob_edit;
    mob_edit = d->mob_edit;
    
    sprintf(cy,"%s",CCCYN(d->character,C_NRM));
    sprintf(wh,"%s",CCWHT(d->character,C_NRM));
    sprintf(ma,"%s",CCMAG(d->character,C_NRM));
    sprintf(nrm,"%s",CCNRM(d->character,C_NRM));
    sprintf(gn,"%s",CCGRN(d->character,C_NRM));
    sprintf(yl,"%s",CCBYEL(d->character,C_NRM));
    sprintf(rd,"%s",CCRED(d->character,C_NRM));                
    
    sprintf(bufme,"%sMob Number: %s%d%s Mob Creation Points: %s%d%s\r\n",
	    cy,gn,d->virtual,cy,yl,compute_mobproto_exp(mob_edit),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%sT%s)ext:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Name: %s%s%s,  ",wh,mob_edit->player.name,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Short Descr: %s%s%s\r\n",wh,mob_edit->player.short_descr,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Long Descr: %s%s%s",wh,mob_edit->player.long_descr,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Description:\r\n%s%s%s",wh,mob_edit->player.description,nrm);
    send_to_char(bufme,d->character);        

    sprintbit(MOB_FLAGS(mob_edit), action_bits, bufme);
    sprintf(bufm ,"(%sM%s)ob Flags: %s%s%s\r\n",cy,nrm,gn, bufme,nrm);
    send_to_char(bufm,d->character);        

    sprintbit(mob_edit->specials.affected_by, affected_bits, bufme);
    sprintf(bufm ,"Affect (%sF%s)lags: %s%s%s\r\n",cy,nrm,gn, bufme,nrm);
    send_to_char(bufm,d->character);        
    sprintf(bufme,"(%sP%s)layer Stats:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sStr:%s %2d,%s Int:%s %2d,%s Wis:%s %2d,%s Dex:%s %2d,%s Con:%s %2d,%s Chr:%s %2d\r\n"
	    ,nrm,gn,
	    GET_RAW_STR(mob_edit),
	    nrm,gn,
	    GET_RAW_INT(mob_edit),
	    nrm,gn,
	    GET_RAW_WIS(mob_edit),
	    nrm,gn,
	    GET_RAW_DEX(mob_edit),
	    nrm,gn,
	    GET_RAW_CON(mob_edit),
	    nrm,gn,
	    GET_RAW_CHR(mob_edit));
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sPer:%s %2d,%s Gui:%s %2d,%s Dev:%s %2d,%s Foc:%s %2d,%s Luc:%s %2d%s\r\n",
	    nrm,gn,
	    GET_RAW_PER(mob_edit),
	    nrm,gn,
	    GET_RAW_GUI(mob_edit),
	    nrm,gn,
	    GET_RAW_DEV(mob_edit),
	    nrm,gn,
	    GET_RAW_FOC(mob_edit),
	    nrm,gn,
	    GET_RAW_LUC(mob_edit),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%sA%s)rmour class, Stopping and Saving throws:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sa/c:   Body:%s %3d%s Head:%s %3d%s Arms: %s%3d%s Legs:%s %3d%s\r\n",
	    nrm,gn,
	    GET_BODY_AC(mob_edit),
	    nrm,gn,
	    GET_HEAD_AC(mob_edit),
	    nrm,gn,
	    GET_ARMS_AC(mob_edit),
	    nrm,gn,
	    GET_LEGS_AC(mob_edit),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sstop:  Body:%s %3d%s Head:%s %3d%s Arms:%s %3d%s Legs:%s %3d%s\r\n",
	    nrm,gn,
	    GET_BODY_STOPPING(mob_edit),
	    nrm,gn,
	    GET_HEAD_STOPPING(mob_edit),
	    nrm,gn,
	    GET_ARMS_STOPPING(mob_edit),
	    nrm,gn,
	    GET_LEGS_STOPPING(mob_edit),nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sSave:  PARA:%s %3d%s ROD:%s  %3d%s PETR:%s %3d%s BRTH:%s %3d%s SPELL:%s %3d%s\r\n",
	    nrm,gn,
	    mob_edit->specials2.apply_saving_throw[0],
	    nrm,gn,
	    mob_edit->specials2.apply_saving_throw[1],
	    nrm,gn,
	    mob_edit->specials2.apply_saving_throw[2],
	    nrm,gn,
	    mob_edit->specials2.apply_saving_throw[3],	
	    nrm,gn,
	    mob_edit->specials2.apply_saving_throw[4],nrm);    
    send_to_char(bufme,d->character);
    sprintf(bufme,"(%sS%s)tats:\r\n",cy,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"%sAlignment:%s %d %sLevel:%s %d%s Hitroll:%s %d%s ",nrm,gn,GET_ALIGNMENT(mob_edit),nrm,gn,GET_LEVEL(mob_edit),nrm,gn,mob_edit->points.hitroll,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Height:%s %d%s Weight:%s %d%s\r\n",gn,mob_edit->player.height,nrm,gn,mob_edit->player.weight,nrm);    
    send_to_char(bufme,d->character);
    sprintf(bufme,"Hit dice:%s %dd%d+%d%s ",gn,mob_edit->points.hit,mob_edit->points.mana,mob_edit->points.move,nrm);
    send_to_char(bufme,d->character);
    sprintf(bufme,"Dam dice: %s%dd%d+%d%s ",gn,mob_edit->specials.damnodice,mob_edit->specials.damsizedice,mob_edit->points.damroll,nrm);
    send_to_char(bufme,d->character);
    if (mob_edit->specials.attack_type >= 300)
	attck = mob_edit->specials.attack_type -300;
    else
	attck = mob_edit->specials.attack_type;
    sprintf(bufme,"Attack type: %s%s%s\r\n",gn,attack_hit_text[attck].singular,nrm);
    send_to_char(bufme,d->character);
    sprinttype(mob_edit->specials.position, position_types,bufm);
    sprintf(bufme,"Position: %s%s%s ",gn,bufm,nrm);
    send_to_char(bufme,d->character);	
    sprinttype(mob_edit->specials.default_pos, position_types,bufm);
    sprintf(bufme,"Def Position: %s%s%s ",gn,bufm,nrm);
    send_to_char(bufme,d->character);
    switch(mob_edit->player.sex)
	{
	case SEX_NEUTRAL:
	    sprintf(bufme,"%sNEUTRAL%s\r\n",gn,nrm);
	    break;
	case SEX_MALE:
	    sprintf(bufme,"%sMALE%s\r\n",gn,nrm);
	    break;	    
	case SEX_FEMALE:
	    sprintf(bufme,"%sFEMALE%s\r\n",gn,nrm);
	    break;
	default:
	    sprintf(bufme,"%sILLEGAL%s\r\n",gn,nrm);
	}
    sprintf(bufm,"Sex: %s",bufme);
    SEND_TO_Q(bufm,d);
    sprintf(bufme,"Gold: %s%s%s Fame: %s%d%s.\r\n",gn,
	    (GET_GOLD(mob_edit) ? "yes":"no"),nrm,gn,GET_FAME(mob_edit),nrm);
    send_to_char(bufme,d->character);
    ctemp = rev_search_list(GET_RACE(mob_edit), npc_races);
    sprintf(bufme,"Class: %s%s%s.\r\n",gn,
	    (ctemp ? ctemp: "Unknown Class"),nrm);
       send_to_char(bufme,d->character);	    
}

void print_races(struct descriptor_data *d)
{
  int i;
  char *race, bufm[MAX_STRING_LENGTH];

  bzero(bufm,MAX_STRING_LENGTH);
    
  race = rev_search_list(GET_RACE(d->mob_edit),npc_races);
  sprintf(bufm, "%sClass:%s %s%s%s\r\n\r\n",cy,nrm,rd,
	  (race ? race : "Unknown Class"),
	  nrm);	    
  SEND_TO_Q(bufm,d);
  for (i=0;*npc_races[i].entry != '\n';i++)
    sprintf(bufm, "%s[%s%3d%s]   %s%s%s\r\n", bufm, cy, npc_races[i].index,nrm
	    ,gn,npc_races[i].entry,nrm);
  SEND_TO_Q(bufm,d);  
  sprintf(bufm,"\r\nEnter New class code for the mobile 'Q' to quit");
  SEND_TO_Q(bufm,d);  
  return;
}

int compute_mobproto_exp(struct char_data *mob)
{
  
  int points=0, ac=0, stop=0, abils=0, maxhit=0;
  
  maxhit = (mob->points.hit*mob->points.mana + mob->points.move);
  points += (mob->points.hit*mob->points.mana + mob->points.move);
  points += str_app[STRENGTH_APPLY_INDEX(mob)].tohit;
  points += GET_HITROLL(mob);
  points += ((mob->specials.damnodice*mob->specials.damsizedice
	     + mob->specials.damnodice)/2);
  points += mob->points.damroll;
  points += str_app[STRENGTH_APPLY_INDEX(mob)].todam;  
  ac += (100 - GET_BODY_AC(mob))*4;
  ac += (100 - GET_LEGS_AC(mob))*3;
  ac += (100 - GET_ARMS_AC(mob))*2;
  ac += (100 - GET_HEAD_AC(mob));
  ac /= 10;
  stop += GET_BODY_STOPPING(mob)*4;
  stop += GET_ARMS_STOPPING(mob)*2;  
  stop += GET_LEGS_STOPPING(mob)*3;
  stop += GET_HEAD_STOPPING(mob);
  stop /= 10;
  abils += GET_STR(mob)*2;
  abils += GET_INT(mob)*2;  
  abils += GET_DEX(mob)*2;
  abils += GET_WIS(mob);
  abils += GET_CON(mob);
  abils += GET_PER(mob);
  abils += GET_FOC(mob);
  abils += GET_CHR(mob);  
  abils += GET_GUI(mob);
  abils /= 12;
  points += abils;
  points += stop;
  points += ac;
  points *= MAX(8, MIN(100,maxhit/20));
  return(points);
}

int compute_mob_exp(struct char_data *mob)
{
  
  int points=0, ac=0, stop=0, abils=0, maxhit;
  
  maxhit = GET_MAX_HIT(mob);
  points += GET_MAX_HIT(mob);
  points += str_app[STRENGTH_APPLY_INDEX(mob)].tohit;
  points += 3*GET_HITROLL(mob);
  points += 10*((mob->specials.damnodice*mob->specials.damsizedice
	     + mob->specials.damnodice)/2);
  points += 10*mob->points.damroll;
  points += 10*str_app[STRENGTH_APPLY_INDEX(mob)].todam;  

  ac += (100 - GET_BODY_AC(mob))*4;
  ac += (100 - GET_LEGS_AC(mob))*3;
  ac += (100 - GET_ARMS_AC(mob))*2;
  ac += (100 - GET_HEAD_AC(mob));
  ac /= 10;
  stop += GET_BODY_STOPPING(mob)*4;
  stop += GET_ARMS_STOPPING(mob)*2;  
  stop += GET_LEGS_STOPPING(mob)*3;
  stop += GET_HEAD_STOPPING(mob);
  stop /= 10;
  abils += GET_STR(mob)*2;
  abils += GET_INT(mob)*2;  
  abils += GET_DEX(mob)*2;
  abils += GET_WIS(mob);
  abils += GET_CON(mob);
  abils += GET_PER(mob);
  abils += GET_FOC(mob);
  abils += GET_CHR(mob);  
  abils += GET_GUI(mob);
  abils /= 12;
  points += 4*abils;
  points += 4*stop;
  points += 4*ac;
  points *= MAX(3, MIN(45,maxhit/30));
  return(points);
}