atd/area/
atd/build/
atd/clans/
atd/log/
atd/player/store/
atd/site/
atd/src/bin/
/* Tracker's coding stuff -DONT- touch! */

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "merc.h"
#include "angel.h"
#include "commands.h"
#include "player.h"

int    col_str_len        args( ( char * text ) );
char * goodie_time        args( ( int time ) );
extern int dxpcount;

char * status_level       args( ( char * buf, int status, int class ) );
char * status_level3	  args( ( char * buf, int status, int class ) );

void do_login( CHAR_DATA *ch, char *argument )
{
   send_to_char("This does nothing.\n\r",ch);
   return;
}

void do_slicestorm( CHAR_DATA *ch, char *argument )
{
   send_to_char("This does nothing.\n\r",ch);
   return;
}

void do_dtoken( CHAR_DATA *ch, char *argument )
{
   send_to_char("This does nothing.\n\r",ch);
   return;
}

void do_rnumber( CHAR_DATA *ch, char *argument )
{
    ch_printf( ch, "Random Number: %d", number_range( 1000, 9999));
    return;
}

void do_gpull( CHAR_DATA *ch, char *argument )
{
   send_to_char("This does nothing.\n\r",ch);
   return;
}

void do_immtitle( CHAR_DATA *ch, char *argument )
{
   send_to_char("This does nothing.\n\r",ch);
   return;
}

void do_show( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char rep[MAX_STRING_LENGTH];
    int pkRatio;
    int a_c = char_ac(ch);

    if( IS_NPC(ch) )
	return;
                if ((ch->pkill + ch->pdeath) != 0)
                {
                        pkRatio = (int)((float)ch->pkill/(float)(ch->pkill + ch->pdeath)*100);
                        sprintf(rep, "%4d#+", pkRatio);
                }
                else 
                {
                        pkRatio = 100;
                        sprintf(rep, "%4d#+", pkRatio);
                }

divide2_to_char(ch);
sprintf(buf,"{C({w-{W>{c Score Sheet for {w%s {W<{w-{C){x",ch->name);
centre_text(buf,ch);
divide2_to_char(ch);
sprintf(buf,"{w   Hps {D[{R %7ld{D/{r%7ld {D]{w Hitroll {D[{R %5d {D]{w Str {D[{R %3d {D]{w    Exp {D[{R %10d {D]{x\n\r",
    ch->hit,
    ch->max_hit,
    char_hitroll(ch), 
    get_curr_str(ch),
    ch->exp);
send_to_char(buf,ch);
sprintf(buf,"{w  Mana {D[{Y %7ld{D/{y%7ld {D]{w Damroll {D[{R %5d {D]{w Int {D[{R %3d {D]{w    Qps {D[{R %10d {D]{x\n\r",
    ch->mana,
    ch->max_mana,
    char_damroll(ch),
    get_curr_int(ch),
    IS_NPC(ch) ? 0 : ch->pcdata->quest);
send_to_char(buf,ch);
sprintf(buf,"{w  Move {D[{C %7ld{D/{c%7ld {D]{w  Damcap {D[{R %5d {D]{w Wis {D[{R %3d {D]{w Primal {D[{R %10d {D]{x\n\r",
     ch->move,
     ch->max_move,
     ch->damcap[0],
     get_curr_wis(ch),
     ch->practice);
send_to_char(buf,ch);
sprintf(buf,"{w Items {D[{M   %5d{D/{m%5d   {D]{w      AC {D[{R %5d {D]{w Dex {D[{R %3d {D]{w  Hours {D[{R %10d {D]{x\n\r",
     ch->carry_number, can_carry_n(ch),
     a_c,
     get_curr_dex(ch),
     (get_age(ch) - 17) * 2);
send_to_char(buf,ch);
sprintf(buf,"{wWeight {D[{G%8d{D/{G%-8d{D]{w   Align {D[{R %5d {D]{w Con {D[{R %3d {D]{w  Wimpy {D[{R %10d {D]{x\n\r",
     ch->carry_weight, can_carry_w(ch),
     ch->alignment,
     get_curr_con(ch),
     ch->wimpy);
send_to_char(buf,ch);
sprintf(buf,"{wTot.Qp {D[{R     %7d     {D]{w  Vs. Sp {D[{R %5d {D]{w            Q.Compl {D[{R      %5d {D]{x\n\r",
        IS_NPC( ch ) ? 0 : ch->pcdata->score[SCORE_QUEST],
	ch->saving_throw,
        IS_NPC( ch ) ? 0 : ch->pcdata->score[SCORE_NUM_QUEST] );
send_to_char(buf,ch);
divide2_to_char(ch);
centre_text("{C({w-{W>{c PK Stats/Misc. {W<{w-{C){x",ch);
divide2_to_char(ch);
sprintf(buf,"{w Pkills {D[{R %5d {D]{w  Ratio {D[{R%4s {D]{w    Autoexit {D[{R %s {D]{w Autohead{D [{R %s {D]{x\n\r",
        IS_NPC( ch ) ? 0 : ch->pkill,
        rep,
        (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOEXIT)) ? "yes" : "no ",
        PLR_FLAGS(ch, PLR_AUTOHEAD) ? "yes" : "no " );
send_to_char(buf,ch);
sprintf(buf,"{w Pdeath {D[{R %5d {D]{w Status {D[{R %4d {D]{w    Autoloot {D[{R %s {D]{x   Mapper{D [{R %s {D]{x\n\r",
        IS_NPC( ch ) ? 0 : ch->pdeath,
        ch->race,
        (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOLOOT)) ? "yes" : "no ",
	(!IS_NPC(ch) && PLR_FLAGS(ch,PLR_AUTOMAPPER) ) ? "yes" : "no " );
send_to_char(buf,ch);
sprintf(buf,"{w Mkills {D[{R %5d {D]{w None   {D[{R n/a  {D]{w     Autosac {D[{R %s {D]  {wExtraSc {D[{R %s {D]{x\n\r",
        IS_NPC( ch ) ? 0 : ch->mkill,
/*        ch->lstatus,*/
        (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOSAC)) ? "yes" : "no ",
        (!IS_NPC(ch) && PLR_FLAGS(ch,PLR_AUTOLEVEL)) ? "yes" : "no" );
send_to_char(buf,ch);
sprintf(buf,"{w Mdeath {D[{R %5d {D]{w  Timer {D[{R %4d {D]{w   Autocrack {D[{R %s {D]{x\n\r",
       IS_NPC( ch ) ? 0 : ch->mdeath,
       ch->fight_timer,
       (!IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOCRACK)) ? "yes" : "no " );               
send_to_char(buf,ch);
divide2_to_char(ch);
	if( PLR_FLAGS(ch,PLR_AUTOLEVEL ) )
	{
		centre_text("{C({w-{W>{cCombat Stuff{W<{w-{C){x",ch);
	        divide2_to_char(ch);
sprintf(buf,"{w   Bull {D[{R %3d {D]{w  Viper {D[{R %3d {D]{w  Crane {D[{R %3d {D]{w    Crab {D[{R %3d {D]{w Mongoose {D[{R %3d {D]{x\n\r",
ch->stance[STANCE_BULL], ch->stance[STANCE_VIPER], ch->stance[STANCE_CRANE], ch->stance[STANCE_CRAB],
ch->stance[STANCE_MONGOOSE] );
send_to_char(buf,ch);
sprintf(buf,"{w  Tiger {D[{R %3d {D]{w Mantis {D[{R %3d {D]{w Dragon {D[{R %3d {D]{w Swallow {D[{R %3d {D]{w   Monkey {D[{R %3d {D]{x\n\r",
ch->stance[STANCE_TIGER], ch->stance[STANCE_MANTIS], ch->stance[STANCE_DRAGON], ch->stance[STANCE_SWALLOW], ch->stance[STANCE_MONKEY] );
send_to_char(buf,ch);
sprintf(buf,"{M Purple {D[{R %3d {D]{R    Red {D[{R %3d {D]{G  Green {D[{R %3d {D]{B    Blue {D[{R %3d {D]{Y   Yellow {D[{R %3d {D]{x\n\r",
ch->spl[0],       ch->spl[1],     ch->spl[3],       ch->spl[2],      ch->spl[4]);
send_to_char(buf,ch);
sprintf(buf,"{wUnarmed {D[{R %3d {D]{w  Slash {D[{R %3d {D]{w  Slice {D[{R %3d {D]{w    Stab {D[{R %3d {D]{w     Whip {D[{R %3d {D]{x\n\r",
ch->wpn[0],         ch->wpn[3],       ch->wpn[1],       ch->wpn[2],       ch->wpn[4]);
send_to_char(buf,ch);
sprintf(buf,"{w  Blast {D[{R %3d {D]{w   Claw {D[{R %3d {D]{w  Pound {D[{R %3d {D]{w   Crush {D[{R %3d {D]{w     Grep {D[{R %3d {D]{x\n\r",
ch->wpn[6],        ch->wpn[5],      ch->wpn[7],        ch->wpn[8],       ch->wpn[9]);
send_to_char(buf,ch);
sprintf(buf,"{w   Bite {D[{R %3d {D]{w   Suck {D[{R %3d {D]{w Pierce {D[{R %3d {D]{x\n\r",
ch->wpn[10],     ch->wpn[12],     ch->wpn[11]);
send_to_char(buf,ch);
divide2_to_char(ch);
	}

centre_text("{C({w-{W>{cClass Stuff{W<{w-{C){x",ch);
divide2_to_char(ch);

     if (!IS_NPC(ch))
    {
        sprintf( buf,
        "{WYou have{w %d {Wclass points.",
        ch->pcdata->stats[DEMON_CURRENT] ); /* ch->pcdata->stats[DEMON_TOTAL] );*/
        centre_text( buf, ch );
    }
    if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_MAGE))
    {
        sprintf( buf, "{WYou have{M %d {Wpoints of magic resistance.",
        ch->pcdata->stats[DROW_MAGIC] );
        centre_text( buf, ch ); 
    }
    if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_DROW)) 
    {
        sprintf( buf, "{WYou have{M %d {Wpoints of magic resistance.",
        ch->pcdata->stats[DROW_MAGIC] );
        centre_text( buf, ch ); 
    }

    if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_MONK) )
    {
      sprintf( buf,"{WYour current level of chi{D:{w %d",
	ch->chi[CURRENT] );
        centre_text( buf, ch ); 
      sprintf( buf, "{WYour maximum level of chi{D:{w %d",
	ch->chi[MAXIMUM] );
        centre_text( buf, ch ); 
      sprintf( buf, "{WYour current focus points{D:{w %d",
	ch->focus[CURRENT] );
        centre_text( buf, ch ); 
      sprintf( buf, "{WYour maximum focus points{D:{w %d",
	ch->focus[MAXIMUM] );
        centre_text( buf, ch ); 
    }

    if ( !IS_NPC(ch) && IS_CLASS(ch,CLASS_VAMPIRE) )
    {
        sprintf( buf, "{WBlood:{r %d{w     {WBeast:{y %d{w.", ch->pcdata->condition[COND_THIRST],ch->beast );
        centre_text( buf, ch ); 
    }

    if ( IS_CLASS(ch, CLASS_WEREWOLF) )
    {
      sprintf( buf, "{WYou have {y%d{w/{y%d {WGnosis Points", 
	ch->gnosis[GCURRENT],
	ch->gnosis[GMAXIMUM] );
        centre_text( buf, ch ); 
    }

	if ( IS_CLASS(ch,CLASS_WEREWOLF) && ch->pcdata->powers[WPOWER_SILVER] > 0)
	{
	    sprintf(buf,"{WYou have attained{w %d {Wpoints of silver tolerance.",ch->pcdata->powers[WPOWER_SILVER]);
	    centre_text( buf, ch );
	}
	if ( IS_CLASS(ch, CLASS_NINJA) )
	{
	    sprintf(buf,"{WYou currently have{m %d{W out of {m500{W Ki store.",ch->pcdata->powers[NINJAKI] );
            centre_text(buf,ch);
        }
	if ( IS_CLASS(ch,CLASS_VAMPIRE) && ch->pcdata->stats[UNI_RAGE] > 0)
	{
	    sprintf(buf,"{WThe beast is in control of your actions:" );
	    centre_text( buf, ch );
	    sprintf(buf,"{WAffects Hitroll and Damroll by +{y%d{w.",ch->pcdata->stats[UNI_RAGE]);
	    centre_text( buf, ch );
	}
	else if ( IS_SET(ch->special,SPC_WOLFMAN) && ch->pcdata->stats[UNI_RAGE] > 0)
	{
	    sprintf(buf,"{WYou are raging:  Affects Hitroll and Damroll by +{y%d{w.",ch->pcdata->stats[UNI_RAGE]);
        centre_text( buf, ch ); 
	}
	else if ( IS_CLASS(ch,CLASS_NINJA) && ch->pcdata->stats[UNI_RAGE] > 0)
	{
	    sprintf(buf,"{WMichi:  Affects Hitroll and Damroll by +{y%d{w.",ch->pcdata->stats[UNI_RAGE]);
        centre_text( buf, ch ); 
	}
		if (IS_CLASS(ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_CHIKYU] >= 6
	&& ch->pcdata->powers[HARA_KIRI] > 0) {
	sprintf(buf,"{WYou receive the power of HaraKiri for{m %d {Wmore ticks.",ch->pcdata->powers[HARA_KIRI]);
        centre_text( buf, ch ); 
	}
	else if ( IS_CLASS( ch, CLASS_DEMON) && ch->pcdata->stats[DEMON_POWER] > 0)
	{
	    sprintf(buf,"{WYou are wearing demonic armour:  Affects Hitroll and Damroll by +{r%d{W.",
		((ch->pcdata->stats[DEMON_POWER]) *
		ch->pcdata->stats[DEMON_POWER]));
        centre_text( buf, ch ); 
	}
	else if ( IS_SET(ch->special,SPC_CHAMPION) && ch->pcdata->stats[DEMON_POWER] > 0)
	{
	    sprintf(buf,"{WYou are wearing demonic armour:  Affects Hitroll and Damroll by +{r%d{W.",
			((ch->pcdata->stats[DEMON_POWER]) *
			ch->pcdata->stats[DEMON_POWER]));
        centre_text( buf, ch ); 
	}
	else if ( IS_EXTRA(ch, EXTRA_PREGNANT) )
	{
		divide2_to_char(ch);
		birth_date(ch, FALSE);
		centre_text( buf, ch );
	}
	divide2_to_char(ch);
        return;
}

void do_gemote( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
     
    if ( argument[0] == '\0' )
    {
        return;
    }
         
    
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if ( d->connected == CON_PLAYING &&
                !IS_SET(d->character->deaf, CHANNEL_INFO) )
        {
            send_to_char( "{D[{RGemote{D]{w ", d->character );
            sprintf(buf, "{W%s{w %s{x", ch->name, argument);
            send_to_char( buf, d->character);
            send_to_char( "{x\n\r",   d->character );
        }
    }
     
    return;
}

void do_gsocial(CHAR_DATA *ch, char *argument)
{
    char command[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    int cmd;  
    bool found;
    char arg[MAX_INPUT_LENGTH];
    DESCRIPTOR_DATA *d;
    char buf[MAX_STRING_LENGTH];
    int counter;
    int count;
    char buf2[MAX_STRING_LENGTH];
        
    argument = one_argument(argument,command);
 
    if (command[0] == '\0')
    {
        send_to_char("What do you wish to gocial?\n\r",ch);
        return;
    }
    
    found = FALSE;
    for (cmd = 0; social_table[cmd].name[0] != '\0'; cmd++)
    {
        if (command[0] == social_table[cmd].name[0]
        && !str_prefix( command,social_table[cmd].name ) )
        {
            found = TRUE;
            break;
        }
    }
    
    if (!found)
    {
        send_to_char("What kind of social is that?!?!\n\r",ch);
        return;
    }
    
    
    if ( !IS_NPC(ch) && IS_SET(ch->deaf, CHANNEL_GSOCIAL))
    {
        send_to_char("But you have the gsocial channel turned off!\n\r",ch);
        return;
    }
            
    if ( !IS_NPC(ch) && IS_SET(ch->act, PLR_SILENCE))
    {
        send_to_char("The gods have revoked your channel priviliges.\n\r",ch);
        return;
    }
        
    switch (ch->position)
    {
    case POS_DEAD:
        send_to_char("Lie still; you are DEAD!\n\r",ch);
        return;
    case POS_INCAP:
    case POS_MORTAL:
        send_to_char("You are hurt far too bad for that.\n\r",ch);
        return;
    case POS_STUNNED:
        send_to_char("You are too stunned for that.\n\r",ch);
        return;
    }
        
    one_argument(argument,arg);
    victim = NULL;
    if (arg[0] == '\0')  
    {
        sprintf(buf, "{D[{RSocial{D]{W %s{x", social_table[cmd].char_no_arg );
        act3(buf,ch,NULL,NULL,TO_CHAR,POS_DEAD);
        sprintf(buf, "{D[{RSocial{D]{W %s{x", social_table[cmd].others_no_arg );
        for (d = descriptor_list; d != NULL; d = d->next)
        {
            CHAR_DATA *vch;
            vch = d->original ? d->original : d->character;
            if (d->connected == CON_PLAYING &&
                d->character != ch &&
                !IS_SET(vch->deaf, CHANNEL_GSOCIAL))
            {
                act3(buf,ch,NULL,vch,TO_VICT,POS_DEAD);
            }
        }
    }
    else if ((victim = get_char_world(ch,arg)) == NULL)
    {
        send_to_char("They aren't here.\n\r",ch);
        return;
    }
    else if (victim == ch)
    {
        sprintf(buf, "{D[{RSocial{D]{W %s{x",  social_table[cmd].char_auto);
        act3(buf,ch,NULL,NULL,TO_CHAR,POS_DEAD);
        sprintf(buf, "{D[{RSocial{D]{W %s{x",  social_table[cmd].others_auto);
        for (d = descriptor_list; d != NULL; d = d->next)
        {
            CHAR_DATA *vch;
            vch = d->original ? d->original : d->character;
            if (d->connected == CON_PLAYING &&
                d->character != ch &&
                !IS_SET(vch->deaf, CHANNEL_GSOCIAL))   
            {
                act3(buf,ch,NULL,vch,TO_VICT,POS_DEAD);
            }  
        }
    }
    else
    {
        sprintf(buf, "{D[{RSocial{D]{W %s{x",  social_table[cmd].char_found);
        act3(buf,ch,NULL,victim,TO_CHAR,POS_DEAD);
        sprintf(buf, "{D[{RSocial{D]{W %s{x", social_table[cmd].vict_found);
        act3(buf,ch,NULL,victim,TO_VICT,POS_DEAD);
            
        sprintf(buf, "{D[{RSocial{D]{W %s{x",  social_table[cmd].others_found);
        for (counter = 0; buf[counter+1] != '\0'; counter++)
        {
            if (buf[counter] == '$' && buf[counter + 1] == 'N')
            {
                strcpy(buf2,buf);
                buf2[counter] = '\0';
                strcat(buf2,victim->name);
                for (count = 0; buf[count] != '\0'; count++)
                {
                    buf[count] = buf[count+counter+2];
                }
                strcat(buf2,buf);
                strcpy(buf,buf2);
        
            }
            else if (buf[counter] == '$' && buf[counter + 1] == 'E')
            {
                switch (victim->sex)
                {
                default:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"it");
                    for (count = 0; buf[count] != '\0'; count ++)
                    {
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf);
                    strcpy(buf,buf2);
                    break;
                case 1:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"it");
                    for (count = 0; buf[count] != '\0'; count++)
                    {   
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf); 
                    strcpy(buf,buf2);
                    break;
                case 2:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"it");
                    for (count = 0; buf[count] != '\0'; count++)
                    {  
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf); 
                    strcpy(buf,buf2);
                    break;
                }
            }
            else if (buf[counter] == '$' && buf[counter + 1] == 'M')
            {
                buf[counter] = '%';
                buf[counter + 1] = 's';
                switch (victim->sex) 
                {
                default:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"it");
                    for (count = 0; buf[count] != '\0'; count++)
                    {
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf);
                    strcpy(buf,buf2);
                    break;
                case 1:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"him");
                    for (count = 0; buf[count] != '\0'; count++)
                    {   
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf); 
                    strcpy(buf,buf2);
                    break;
                case 2:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"her");
                    for (count = 0; buf[count] != '\0'; count++);
                    {  
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf);  
                    strcpy(buf,buf2);
                    break;
                }
            }
            else if (buf[counter] == '$' && buf[counter + 1] == 'S')
            {
                switch (victim->sex)
                {
                default:
                strcpy(buf2,buf);
                buf2[counter] = '\0';  
                strcat(buf2,"its");
                for (count = 0;buf[count] != '\0'; count++)
                {
                    buf[count] = buf[count+counter+2];
                }
                strcat(buf2,buf);
                strcpy(buf,buf2);
                break;
                case 1:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"his");
                    for (count = 0; buf[count] != '\0'; count++)
                    {   
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf);
                    strcpy(buf,buf2);
                    break;
                case 2:
                    strcpy(buf2,buf);
                    buf2[counter] = '\0';
                    strcat(buf2,"hers");
                    for (count = 0; buf[count] != '\0'; count++)
                    {  
                        buf[count] = buf[count+counter+2];
                    }
                    strcat(buf2,buf);  
                    strcpy(buf,buf2);
                    break;
                }
            }
                    
        }
        for (d=descriptor_list; d != NULL; d = d->next)
        {
            CHAR_DATA *vch;
            vch = d->original ? d->original : d->character;
            if (d->connected == CON_PLAYING &&
                d->character != ch &&
                d->character != victim &&
                !IS_SET(vch->deaf, CHANNEL_GSOCIAL))
            {
                act3(buf,ch,NULL,vch,TO_VICT,POS_DEAD);
            }
        }
    }
    return;  
}                   

void do_whotype (CHAR_DATA *ch, char *argument)
{
   char arg1 [MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];
   argument = one_argument ( argument, arg1 );

   if ( arg1[0] == '\0' )
   {
      send_to_char("Syntax: whotype <standard/informal/new>\n\r\n\r",ch);
   if (ch->pcdata->stats[WHOTYPE] == 1) {sprintf(buf,"Your whotype is set to standard.\n\r");}
   else if (ch->pcdata->stats[WHOTYPE] == 2) {sprintf(buf,"Your whotype is set to informal.\n\r");}
   else if (ch->pcdata->stats[WHOTYPE] == 3) {sprintf(buf,"Your whotype is set to new.\n\r");}
   else {sprintf(buf,"Your whotype is set to standard.\n\r");}
   send_to_char(buf,ch);
      return;
   }

   if (!str_cmp(arg1, "standard"))
   {
      ch->pcdata->stats[WHOTYPE] = 1;
      send_to_char("Your whotype has been changed to standard.\n\r",ch);
     return;
   }

   if (!str_cmp(arg1,"informal"))
   {
      ch->pcdata->stats[WHOTYPE] = 2;
      send_to_char("Your whotype has been changed to informal.\n\r",ch);
      return;
   }

   if (!str_cmp(arg1,"new"))
   {
      ch->pcdata->stats[WHOTYPE] = 3;
      send_to_char("Your whotype has been changed to new.\n\r",ch);
      return;
   }
   return;
}

void do_immadv( CHAR_DATA *ch, char *argument)
 {   
     CHAR_DATA *victim;
     char     arg1 [MAX_INPUT_LENGTH];
     char     arg2 [MAX_INPUT_LENGTH];

     smash_tilde(argument);
     argument = one_argument( argument, arg1 );
     argument = one_argument( argument, arg2 );

     if (IS_NPC(ch)) return;
 
     if (!IS_IMMORTAL( ch))
     {
       send_to_char("Huh?\n\r",ch);
       return;
     }
     
     if ( arg1[0] == '\0' || arg2[0] == '\0' )
     {
       send_to_char("Syntax: immadv (person) (rank) \n\r",ch);
       send_to_char("Possible ranks: ldr deldr prince deprince archmage\n\r             : mudcop moron\n\r",ch);
       return;
     }
       
     if ( ( victim = get_char_room( ch, arg1) ) == NULL )
     {
       send_to_char( "They aren't here.\n\r",ch);
       return;
     }
       
     if ( IS_NPC(victim) )
     {
       send_to_char("Not on NPC's.\n\r",ch);
       return;
     }
    if (!str_cmp(arg2,"deprince"))
    {
        if (victim == ch)
        {
            send_to_char("Not on yourself!\n\r",ch);
            return;
        }
        if (IS_SET(victim->special,SPC_PRINCE))
        {
            send_to_char("You have lost your princehood!\n\r",victim);
            send_to_char("You remove their princehood.\n\r",ch);
            REMOVE_BIT(victim->special, SPC_PRINCE);
        }
      save_char_obj(victim);
      return;
    }

    if (!str_cmp(arg2,"prince"))
    {
        {
            send_to_char("You have been made a prince!\n\r",victim);
            send_to_char("You make them a prince.\n\r",ch);
            SET_BIT(victim->special, SPC_PRINCE);
        }
        save_char_obj(victim);
        return;
    }

    if (!str_cmp(arg2,"mastery"))
    {    REMOVE_BIT(victim->newbits, NEW_MASTERY); return; }

    if (!str_cmp(arg2,"adrnk"))
    {
         victim->pcdata->stats[KINGDOM_RANK] += 1;
         return;
    }

    if (!str_cmp(arg2,"dlrnk"))
    {
        victim->pcdata->stats[KINGDOM_RANK] -= 1;
        return;
    }

    if (!str_cmp(arg2,"deldr"))
    {
        if (victim == ch)
        {
            send_to_char("Not on yourself!\n\r",ch);
            return;
        }

        if (IS_CLASS(victim, CLASS_ANGEL) && (IS_SET(victim->special,SPC_ANGEL_LORD)))
        {
            send_to_char("You are no longer a Seraphim!\n\r",victim);
            send_to_char("They are no longer a Seraphim.\n\r",ch);
            REMOVE_BIT(victim->special, SPC_ANGEL_LORD);
            return;
        }

        else if (IS_CLASS(ch, CLASS_DEMON) && (IS_SET(victim->special,SPC_DEMON_LORD)))
        {
            send_to_char("You are no longer a Demon Lord!\n\r",victim);
            send_to_char("You remove their demon lord status.\n\r",ch);
            REMOVE_BIT(victim->special, SPC_DEMON_LORD);
            return;
        }
        save_char_obj(victim);
        return;
      }

/*    if (!str_cmp(arg2,"moron"))
    {
        if (!IS_SET(victim->flag2, AFF2_LHIDE))
        {
            send_to_char("Stupid Moron!\n\r",victim);
            send_to_char("You make them a Moron.\n\r",ch);
            SET_BIT(victim->flag2, AFF2_LHIDE);
            return;
        }
        
        else if (IS_SET(victim->flag2, AFF2_LHIDE))
        {
            send_to_char("You're no longer a moron.\n\r",victim);
            send_to_char("You remove their moron flag.\n\r",ch);
            REMOVE_BIT(victim->flag2, AFF2_LHIDE);
            return;
        }
        save_char_obj(victim);
        return;
    }*/

    if (!str_cmp(arg2,"ldr"))
    {
        if (IS_CLASS(victim, CLASS_ANGEL) && (!IS_SET(victim->special,SPC_ANGEL_LORD)))
        {
            send_to_char("You have been made a Seraphim!\n\r",victim);
            send_to_char("You make them a Seraphim.\n\r",ch);
            SET_BIT(victim->special, SPC_ANGEL_LORD);
            return;
        }

        else if (IS_CLASS(victim, CLASS_DEMON) && (!IS_SET(victim->special,SPC_DEMON_LORD)))
        {
            send_to_char("You have been made a Demon Lord!\n\r",victim);
            send_to_char("You make them a Demon Lord.\n\r",ch);
            SET_BIT(victim->special, SPC_DEMON_LORD);
            return;
        }
        save_char_obj(victim);
        return;
    }

    if (!str_cmp(arg2,"archmage") || !str_cmp( arg2, "rubicant") )
    {
        if (IS_CLASS(victim, CLASS_MAGE)
            && (!IS_SET(victim->newbits, NEW_ARCHMAGE)))
         {
             SET_BIT(victim->newbits, NEW_ARCHMAGE);
            send_to_char("You are now a RUBICANT!\n\r",victim);
            send_to_char("Done.\n\r",ch);
            return;
         }
     
        if (IS_CLASS(victim, CLASS_MAGE)
            && (IS_SET(victim->newbits, NEW_ARCHMAGE)))
         {
            REMOVE_BIT(victim->newbits, NEW_ARCHMAGE);
            send_to_char("You are no longer a Rubicant!\n\r",victim);
            send_to_char("Done.\n\r",ch);
            return;
         }
    }

    if (!str_cmp(arg2,"mudcop"))
    {
        if (!IS_NPC(victim) && (!IS_SET(victim->newbits, NEW_MUDCOP)))
         {
            SET_BIT(victim->newbits, NEW_MUDCOP);
            send_to_char("You are now a Mud Cop!\n\r",victim);
            send_to_char("Done.\n\r",ch);
            return;
         }
            
         if (!IS_NPC(victim) && (IS_SET(victim->newbits, NEW_MUDCOP)))
         {
            REMOVE_BIT(victim->newbits, NEW_MUDCOP);
            send_to_char("You are no longer an Mud Cop!\n\r",victim);
            send_to_char("Done.\n\r",ch);
            return;
         }
    }

    if (!str_cmp(arg2,"helper"))
    {
/*        if (victim == ch)
        {
            send_to_char("Not on yourself!\n\r",ch);
            return;
        }   */
        if (!IS_NPC(victim) && (IS_SET(victim->flag2,AFF2_HELPER)))
        {
            send_to_char("You are no longer a Newbie Helper!\n\r",victim);
            send_to_char("They are no longer a Newbie Helper!\n\r",ch);
            REMOVE_BIT(victim->flag2, AFF2_HELPER);
            return;
        }
        else if (!IS_NPC(victim) && (!IS_SET(victim->flag2, AFF2_HELPER)))
        {
            send_to_char("You have been made a Newbie Helper!\n\r",victim);
            send_to_char("You make them a Newbie Helper!\n\r",ch);
            SET_BIT(victim->flag2, AFF2_HELPER);
            return;
        }
     }

     send_to_char("Ok.\n\r",ch);
     save_char_obj(victim);
     return;
}

bool free_helps( CHAR_DATA *ch, char *arg )
{
    char buf[MAX_STRING_LENGTH];
    HELP_DATA *h, *h_next;
    HELP_DATA *prev = NULL;
    bool found = FALSE;

    prev = help_first;
    for ( h = help_first; h; h = h_next )
    {
	h_next = h->next;

        if ( !str_cmp( h->keyword, arg ) )
        {
            free_string( h->keyword );
            free_string( h->text );
            if ( h == help_first )
                help_first = h->next;
            else
            prev->next = h->next;
            if ( h == help_last )
               help_last = prev;
            free_mem( h, sizeof(*h) );
            found = TRUE;
        }
        prev = h;
    }

    if ( !found )
    {
        sprintf( buf, "Help entry %s not found.\n\r", arg );
        send_to_char( buf, ch );
        return FALSE;
    }

    return TRUE;
}


bool read_entry( CHAR_DATA *ch, FILE *fp, char *filename, char *arg )
{
    char buf[MAX_STRING_LENGTH];
    HELP_DATA *new;
    HELP_DATA *debug;
    char *test_keyword = 0;
    char *test_text = 0;
    int test_level = 0;

    if ( fread_letter( fp ) != '#' )
    {
        sprintf( buf, "read_entry: # not in %s.\n\r", filename );
        send_to_char( buf, ch );
        return FALSE;
    }

    fread_word( fp ); /* read the word HELPS */

    new          = alloc_mem( sizeof(*new) );
    new->next    = NULL;

    for ( ; ; )
    {
        test_level   = fread_number( fp );
        test_keyword = fread_string( fp );

        if ( !str_cmp( test_keyword, "$" )) /* end of file */
        {
            free_string( test_keyword );
            free_string( test_text );
            free_mem( new, sizeof(*new) );
            return FALSE;
        }

        test_text    = fread_string( fp );

        if ( !str_cmp( test_keyword, arg ))  /* match */
        {
            new->keyword = test_keyword;
            new->level   = test_level;
            new->text    = test_text;

            debug = help_last;
            if ( help_last ) 
                help_last->next = new;
            help_last = new;
            
            sprintf( buf, "entry %s updated.\n\r", new->keyword );
            send_to_char( buf, ch );
            return TRUE;
        }
        else
        {
            free_string( test_keyword );
            free_string( test_text );
        }
    }

    return FALSE;
}


void do_loadhelp( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    FILE *fp;
    bool found = FALSE;
    int i;

    /* in order of 'importance' */
    char *helpfile[ ] = {
        "help.are",
	"greetings.are",
	"rules.are",
	"imm-ref.hlp",
	NULL
        };

    argument = one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
        send_to_char( "Usage: reload <help-keyword>\n\r", ch );
	send_to_char( "Help files: \n\r", ch );
	for( i = 0; helpfile[i]; i++ )
		ch_printf( ch, "     %s\n\r", helpfile[i] );
        return;
    }

    /* remove help entry from the list */
    if ( !free_helps( ch, arg ))
        return;

    /* here we go */
    fclose( fpReserve );
    for ( i = 0; helpfile[i]; i++ )
    {
        if ( ( fp = fopen( helpfile[i], "r" ) ) == NULL )
        {
            sprintf( buf, "do_reload: couldn't open %s.\n\r", helpfile[i] );
            send_to_char( buf, ch );
	    break;
        }
            if ( ( found = read_entry( ch, fp, helpfile[i], arg ) ) == TRUE )
            {
                fclose( fp );
                break;
            }
    }
    fpReserve = fopen( NULL_FILE, "r" );
    return;
}

void do_idle(CHAR_DATA *ch, char *argument)
{

    CHAR_DATA *vch;
    char        buf[MAX_INPUT_LENGTH];

    send_to_char("Players     Idle  Hours  Host\n\r-----------------------------------------------------------------------------------------------------------\n\r",ch);
    for(vch=char_list; vch != NULL; vch = vch->next)
    {         
        if ( IS_NPC( vch ) || !can_see( ch, vch ) )
            continue;
         
        sprintf(buf,"%-12s%4d%7d %-30.30s %s {D[{R%d{D]{x\n\r",vch->name, vch->timer,
            ( vch->played + (int) (current_time - vch->logon) ) / 3600, 
                vch->desc ? vch->desc->host : "No descriptor.",
              vch->createtime,
              vch->pcdata->stats[LOGINS] );
        send_to_char(buf,ch);
    }
    if (number_percent() == 1 )
        send_to_char( "You have become better at idleness!\n\r", ch );
    send_to_char( "\n\r", ch );
}

void do_omni(CHAR_DATA *ch, char *argument)
{
	char buf[MAX_STRING_LENGTH];
	DESCRIPTOR_DATA *d;

	if (IS_NPC(ch)) return;

	sprintf(buf, "        Name|Level|Trust|Class|    Hit|  Mana|  Move|   HR|  DR|    AC|Quest| Stat\n\r");
	send_to_char(buf,ch);
	sprintf(buf,
"------------|-----|-----|-----|-------|------|------|-----|----|------|-----|-----|\n\r");
	send_to_char(buf,ch);

	for (d = descriptor_list; d != NULL; d = d->next)
	{
		CHAR_DATA *wch;

		if (d->connected != CON_PLAYING) continue;
		wch = ( d->original != NULL) ? d->original : d->character;


sprintf(buf,"%12s|%5d|%5d|%5d|%7ld|%6ld|%6ld|%5d|%4d|%6d|%5d|%5d|\n\r",
		wch->name,
		wch->level,
		wch->trust,
		wch->class,
		wch->max_hit,
		wch->max_mana,
		wch->max_move,
		char_hitroll(wch),
		char_damroll(wch),
		char_ac(wch),
		wch->pcdata->quest,
		wch->race
		);	


		send_to_char(buf,ch);
	}

	return;
}

void sysmes( char *argument )
{
    DESCRIPTOR_DATA *d;
    
    if ( argument[0] == '\0' )
    {
	return;
    }

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	if ( d->connected == CON_PLAYING )
	{
	    send_to_char( "{D[{BSYSTEM{w:{W ",d->character );
	    send_to_char( argument, d->character );
	    send_to_char( "{D]{x\n\r",   d->character );
	}
    }

    return;
}

void do_goodiexp( CHAR_DATA *ch, char *argument ) 
{
/*    DESCRIPTOR_DATA *d;*/
    char buf [MAX_STRING_LENGTH];
    char buf2 [256];
    char arg [MIL];
    extern int dxpcount;
    int dxptime;
    int max = 8640;
    
    argument = one_argument( argument, arg );
    if (arg[0] == '\0')
    {
       send_to_char("Syntax: goodiexp <stop/how many seconds 1-86400>\n\r",ch);
       return;
    }

    if (!str_cmp(arg,"stop"))
    {
	strcpy(buf,"{WGoodie Exp terminated.");
	sysmes(buf);
	dxpcount = 0;
        REMOVE_BIT( sysdata.world, WORLD_DOUBLEXP );
	return;
    }

    if (!is_number(arg))
    {
	send_to_char("Syntax: goodiexp <STOP/number of seconds>\n\r",ch);
	return;
    }

    if( argument[0] != '\0' )
    {
	if ( !str_cmp(argument, "minutes" ) )
	{
		max /= 60;
		strcpy( buf2, "minutes" );
	}
	else if( !str_cmp( argument, "hours" ) )
	{
		max /= 3600;
		strcpy( buf2, "hours" );
	}
    }
    else
	strcpy( buf2, "seconds" );

    if ( ( dxptime = atoi(arg) ) < 1 || dxptime > max )
    {
	ch_printf(ch,"Please enter between 1 and %d %s.\n\r",max,
		buf2 );
	return;
    }

    if( !str_cmp( buf2, "minutes" ) )
	dxptime *= 60;
    else if( !str_cmp( buf2, "hours" ) )
	dxptime *= 3600;
	
    dxpcount = ++dxptime * 4;
    SET_BIT( sysdata.world, WORLD_DOUBLEXP );
    
    if( dxptime >= 8640 )
    {
	sprintf( buf2, "%d day%s",
		dxptime / 8640,
		(dxptime % 8640) > 1 ? "s" : "" );
    }
    else if( dxptime >= 3600 )
    {
	sprintf( buf2, "%d hour%s",
		dxptime / 3600,
		(dxptime % 3600) > 1 ? "s" : "" );
    }
    else if ( dxptime >= 60 )
    {
	sprintf( buf2, "%d minute%s",
		dxptime / 60,
		(dxptime % 60) > 1 ? "s" : "" );
    }
    else
	sprintf( buf2, "%d second%s",
		dxptime,
		(dxptime) > 1 ? "s" : "" );
    sprintf( buf,"{WGoodie Exp activated [%s]", buf2);    
    
    sysmes(buf);
    return;
}

void do_call( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    OBJ_DATA *obj;
    CHAR_DATA *victim = NULL;
    ROOM_INDEX_DATA *chroom;
    ROOM_INDEX_DATA *objroom;

    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char( "What object do you wish to call?\n\r", ch );
	return;
    }

    if (IS_NPC(ch)) {send_to_char("Not while switched.\n\r",ch); return;}

    if (!IS_HEAD(ch, LOST_HEAD))
    {
    	act("Your eyes flicker with yellow energy.",ch,NULL,NULL,TO_CHAR);
    	act("$n's eyes flicker with yellow energy.",ch,NULL,NULL,TO_ROOM);
    }

    if (!str_cmp(arg,"all"))
    {
	call_all(ch);
	return;
    }

    if ( ( obj = get_obj_world( ch, arg ) ) == NULL )
    {
	send_to_char( "Nothing like that in hell, earth, or heaven.\n\r", ch );
	return;
    }

    if (obj->questowner == NULL || strlen(obj->questowner) < 2 ||
	str_cmp(obj->questowner,ch->name) || obj->item_type == ITEM_PAGE
	|| obj->item_type == ITEM_CORPSE_PC)
    {
	send_to_char( "Nothing happens.\n\r", ch );
	return;
    }

    if (obj->carried_by != NULL && obj->carried_by != ch)
    {
	victim = obj->carried_by;
	if (!IS_NPC(victim) && victim->desc != NULL && victim->desc->connected != CON_PLAYING) return;
    	act("$p suddenly vanishes from your hands!",victim,obj,NULL,TO_CHAR);
    	act("$p suddenly vanishes from $n's hands!",victim,obj,NULL,TO_ROOM);
	obj_from_char(obj);
    }
    else if (obj->in_room != NULL)
    {
    	chroom = ch->in_room;
    	objroom = obj->in_room;
    	char_from_room(ch);
    	char_to_room(ch,objroom);
    	act("$p vanishes from the ground!",ch,obj,NULL,TO_ROOM);
	if (chroom == objroom) act("$p vanishes from the ground!",ch,obj,NULL,TO_CHAR);
    	char_from_room(ch);
    	char_to_room(ch,chroom);
	obj_from_room(obj);
    }
    else if (obj->in_obj != NULL) obj_from_obj(obj);
    else
    {
	if (!IS_HEAD(ch, LOST_HEAD))
	    send_to_char( "Nothing happens.\n\r", ch );
	return;
    }

    obj_to_char(obj,ch);
    if (IS_SET(obj->extra_flags,ITEM_SHADOWPLANE))
	REMOVE_BIT(obj->extra_flags,ITEM_SHADOWPLANE);
    act("$p materializes in your hands.",ch,obj,NULL,TO_CHAR);
    act("$p materializes in $n's hands.",ch,obj,NULL,TO_ROOM);
    do_autosave(ch,"");
    if (victim != NULL) do_autosave(victim,"");
    return;
}

void call_all( CHAR_DATA *ch )
{
    OBJ_DATA *obj;
    OBJ_DATA *in_obj;
    CHAR_DATA *victim = NULL;
    DESCRIPTOR_DATA *d;
    ROOM_INDEX_DATA *chroom;
    ROOM_INDEX_DATA *objroom;
    bool found = FALSE;

    for ( obj = object_list; obj != NULL; obj = obj->next )
    {
	if ( obj->questowner == NULL || strlen(obj->questowner) < 2 || 
	    str_cmp( ch->name, obj->questowner ) || obj->item_type == ITEM_PAGE
	    || obj->item_type == ITEM_CORPSE_PC)
	    continue;

	found = TRUE;

	for ( in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj )
	    ;

	if (in_obj->carried_by != NULL)
	{
	    if (in_obj->carried_by == ch) continue;
	}

	if (obj->carried_by != NULL)
	{
	    if (obj->carried_by == ch || obj->carried_by->desc == NULL || 
		obj->carried_by->desc->connected != CON_PLAYING) 
	    {
		if (!IS_NPC(obj->carried_by)) return;
	    }
	    act("$p suddenly vanishes from your hands!",obj->carried_by,obj,NULL,TO_CHAR);
	    act("$p suddenly vanishes from $n's hands!",obj->carried_by,obj,NULL,TO_ROOM);
	    SET_BIT(obj->carried_by->extra, EXTRA_CALL_ALL);
	    obj_from_char(obj);
	}
	else if (obj->in_room != NULL)
	{
	    chroom = ch->in_room;
	    objroom = obj->in_room;
	    char_from_room(ch);
	    char_to_room(ch,objroom);
	    act("$p vanishes from the ground!",ch,obj,NULL,TO_ROOM);
	    if (chroom == objroom) act("$p vanishes from the ground!",ch,obj,NULL,TO_CHAR);
	    char_from_room(ch);
	    char_to_room(ch,chroom);
	    obj_from_room(obj);
	}
	else if (obj->in_obj != NULL) obj_from_obj(obj);
	else continue;
	obj_to_char(obj,ch);
	if (IS_SET(obj->extra_flags,ITEM_SHADOWPLANE))
	    REMOVE_BIT(obj->extra_flags,ITEM_SHADOWPLANE);
	if (!IS_HEAD(ch, LOST_HEAD))
	{
	    act("$p materializes in your hands.",ch,obj,NULL,TO_CHAR);
	    act("$p materializes in $n's hands.",ch,obj,NULL,TO_ROOM);
	}
    }

    if ( !found && !IS_HEAD(ch, LOST_HEAD) )
	send_to_char( "Nothing happens.\n\r", ch );

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	if ( d->connected != CON_PLAYING ) continue;
	if ( (victim = d->character) == NULL ) continue;
	if ( IS_NPC(victim) ) continue;
	if ( ch != victim && !IS_EXTRA(victim,EXTRA_CALL_ALL) ) continue;
	REMOVE_BIT(victim->extra, EXTRA_CALL_ALL);
	do_autosave(victim,"");
    }
    return;
}

void do_idlekick( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];   
    char buf[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
    CHAR_DATA *victim;
     
/*    if (!IS_SET(ch->flag2, AFF2_HELPER))
    {
        send_to_char("You're not a part of the NH Team!\n\r",ch);
        return;
    }*/

    one_argument( argument, arg );
    if ( arg[0] == '\0' )
    {
        send_to_char( "Disconnect whom?\n\r", ch );
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if ( victim->desc == NULL )
    {
        act( "$N doesn't have a descriptor.", ch, NULL, victim, TO_CHAR );
        return;
    }
     
    if (victim->timer <= 10)
    {
       send_to_char("They need to be atleast 11 seconds idle.\n\r",ch);
       return;
    }

    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if ( d == victim->desc )
        {
/*            close_socket( d );*/
            sprintf(buf,"%s has idlekicked %s!\n\r",ch->name,victim->name);
            do_info(ch,buf);
            do_quit(victim,"");
            send_to_char( "Ok.\n\r", ch );
           return;
        }
    }
    
    bug( "Do_disconnect: desc not found.", 0 );
    send_to_char( "Descriptor not found!\n\r", ch );
    return;
}

void do_nuke( CHAR_DATA *ch, char *argument)
{
   char strsave[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   one_argument( argument, arg );

   if ( arg[0] == '\0' ) 
   {
        send_to_char( "Syntax:nuke  <character name> \n\r", ch );
        return;
   }

   if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        send_to_char( "They are not logged on.\n\r", ch );
        return;
    }

   if (IS_NPC(victim))
    {
     send_to_char( "This command only works on players.\n\r", ch);
     return;
    }

   if (IS_IMP(victim))
    {
     return;
     }

    sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( victim->name ) );
    stop_fighting(victim,TRUE);
/*    sprintf( buf,"%s has been nuked by %s",victim->name,ch->name);
    do_info( ch,buf);*/
sprintf( buf,"#C%s#c flies down from the heavens.#n",ch->name);
do_echo(ch,buf);
sprintf( buf,"#C%s#c points a finger at #e%s#c.#n",ch->name,victim->name);
do_echo(ch,buf);
sprintf( buf,"#C%s#c says, #g'You've made one too many mistakes, #r%s#g!'#n",ch->name,victim->name);
do_echo(ch,buf);
sprintf( buf,"#cA #wb#el#wi#en#wd#ei#wn#eg #cblast of energy erupts from #C%s's#c fingertip and #rINCINERATES #C%s#n!", ch->name,victim->name);
do_echo(ch,buf);
sprintf( buf,"#cOnly a small puddle of #ggoo#c remains where #C%s#c was standing.#n",victim->name);
do_echo(ch,buf);
sprintf( buf,"#C%s #chas been vaped.#n",victim->name);
do_echo(ch,buf);
    do_quit(victim,"");
    unlink(strsave);
    return;
}

void do_fire( CHAR_DATA *ch, char *argument)
{
   char strsave[MAX_INPUT_LENGTH];
   CHAR_DATA *victim;
   char arg[MAX_INPUT_LENGTH];
   char buf[MAX_STRING_LENGTH];

   one_argument( argument, arg );

   if (!str_cmp(ch->name,"Tracker"))
   {
      send_to_char("Authorization accepted. Proceeding.\n\r",ch);
   }
   else
   {
      send_to_char("Only Tracker may use this.\n\r",ch);
      return;
   }

   if ( arg[0] == '\0' ) 
   {
        send_to_char( "Syntax: fire  <character name> \n\r", ch );
        return;
   }

   if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        send_to_char( "They are not logged on.\n\r", ch );
        return;
    }

   if (IS_NPC(victim))
    {
     send_to_char( "This command only works on players.\n\r", ch);
     return;
    }

/*   if (IS_IMP(victim))
    {
     return;
     }*/

    sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( victim->name ) );
    stop_fighting(victim,TRUE);
    sprintf( buf,"%s has been fired by %s",victim->name,ch->name);
    do_info( ch,buf);
    do_quit(victim,"");
    unlink(strsave);
    return;
}

void do_chide( CHAR_DATA *ch, char *argument )
{
    if (IS_NPC(ch)) return;
        

    if( ch->fight_timer > 0 )
    {
	stc( "Not with a fight timer.\n\r", ch);
	return;
    }
        
    if ( IS_SET(ch->act, PLR_WIZINVIS ) )
    {
        REMOVE_BIT( ch->act, PLR_WIZINVIS );
        act( "$n appears in a flash of light.", ch, NULL, NULL, TO_ROOM );
        send_to_char( "You appear out of nowhere.\n\r", ch );
    }
    else
    {
        act( "$n uses $s class skills to vanish.", ch, NULL, NULL, TO_ROOM );
        send_to_char( "You use your class skills to vanish.\n\r", ch );
        SET_BIT( ch->act, PLR_WIZINVIS );
    }
    return;
}
        
void do_whois ( CHAR_DATA *ch, char *argument )
{
    char        arg[MAX_INPUT_LENGTH];
    char        buf[MAX_STRING_LENGTH];
    char        sex[MAX_STRING_LENGTH];
    char        rep[MAX_STRING_LENGTH];
    CHAR_DATA   *victim;
    int hours;
    int pkRatio;

    argument = one_argument( argument, arg );


    if ( arg[0] == '\0' )
    {
        send_to_char("Whois whom?\n\r", ch );
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
       send_to_char("They aren't here.\n\r", ch );
        return;
    }

    if (IS_NPC(victim)) return;

    if ((victim->pkill + victim->pdeath) != 0)
    {
      pkRatio = (int)((float)victim->pkill/(float)(victim->pkill + victim->pdeath)*100);
      sprintf(rep, "%4d", pkRatio);
    }
    else
    {
      pkRatio = 100;
      sprintf(rep, "%4d", pkRatio);
    }

    if (IS_SET(victim->sex, SEX_MALE))
    sprintf(sex,"Male");
    else if (IS_SET(victim->sex, SEX_FEMALE))
    sprintf(sex,"Female");
    else
    sprintf(sex,"None");

        hours = get_hours_played(victim);

    sprintf( buf, "{m  _____________________________________________________{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m /                                                     \\{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{w                     Whois for{B %-15s{m         |{x\n\r",victim->name);
    send_to_char( buf, ch );
    sprintf( buf, "{m|                                                       |{x\n\r");
    send_to_char( buf, ch );
if ( !IS_SET(victim->flag2, AFF2_ANONYMOUS ) )
{   
    sprintf( buf, "{m|{C                        Stats                          {m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{r+++++++++++++++++++++++++++++++++++++++++++++++++++++++{m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{G   Hitroll{D:{w %-5d    {YDamroll{D:{w %-5d    {RAC{D:{w %-5d       {m|{x\n\r",
       char_hitroll( victim ),
        char_damroll( victim ),
        char_ac( victim ) );
    send_to_char( buf, ch );
    sprintf( buf, "{m|{C     Str{D:{w %-2d {MInt{D:{w %-2d {RWis{D:{w %-2d {WDex{D:{w %-2d {bCon{D:{w %-2d           {m|{x\n\r",
        get_curr_str(victim),
        get_curr_int(victim),
        get_curr_wis(victim),
        get_curr_dex(victim),
        get_curr_con(victim) );
    send_to_char( buf, ch );
   sprintf( buf, "{m|                                                       |{x\n\r");
}
    send_to_char( buf, ch );
    sprintf( buf, "{m|{R                      PK Stuff                         {m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{r+++++++++++++++++++++++++++++++++++++++++++++++++++++++{m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{c       Player kills{D:{w %-3d {yPlayer Deaths{D:{w %-3d            {m|{x\n\r",
        IS_NPC( victim ) ? 0 : victim->pkill,
        IS_NPC( victim ) ? 0 : victim->pdeath);
    send_to_char( buf, ch );
    sprintf( buf, "{m|{b         Mob Deaths{D:{w %-3d     {rMob Kills{D:{w %-6d{m         |{x\n\r",
        IS_NPC( victim ) ? 0 : victim->mdeath,
       IS_NPC( victim ) ? 0 : victim->mkill );
    send_to_char( buf, ch );
    sprintf( buf, "{m|{B             Status{D:{w %-3d   {YPK Ratio{D:{w %-3s%%             {m|{x\n\r",
      IS_NPC(victim) ? 0 : victim->race,
      IS_NPC(victim) ? 0 : rep);
    send_to_char( buf, ch );
    sprintf( buf, "{m|                                                       |{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{Y                     Misc Stuff                        {m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{r+++++++++++++++++++++++++++++++++++++++++++++++++++++++{m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{G               Sex{D:{w %-6s  {WHours{D:{w %-4d                {m|{x\n\r",
      IS_NPC(victim) ? 0 : sex,
      IS_NPC(victim) ? 0 : hours);
    send_to_char( buf, ch );
    sprintf( buf, "{m|{R               Total Quest Points{D:{w %-10d          {m|{x\n\r",
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_QUEST] );
    send_to_char( buf, ch );
    sprintf( buf, "{m|{B                 Quests Completed{D:{w %-5d               {m|{x\n\r",
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_NUM_QUEST] );
    send_to_char( buf, ch );
    sprintf( buf, "{m|                                                       |{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{R                   Kingdom Stuff                       {m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{r+++++++++++++++++++++++++++++++++++++++++++++++++++++++{m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{C                 Kingdom Rank{D:{w n\\a                     {m|{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m|{c                    Kingdom: %-4s                     {m|{x\n\r",
        king_table[victim->pcdata->kingdom].who_name);
    send_to_char( buf, ch );
    sprintf( buf, "{m|                                                       |{x\n\r");
    send_to_char( buf, ch );
    sprintf( buf, "{m \\_____________________________________________________/{x\n\r");
    send_to_char( buf, ch );

    return;
}


void do_testwho( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char mort[MAX_STRING_LENGTH];
    char avat[MAX_STRING_LENGTH];
    char rep[MAX_STRING_LENGTH];
    char a1[MSL];
    char a2[MSL];
    char a3[MSL];
    char a4[MSL];
    char a5[MSL];
    char a6[MSL];
    char a7[MSL];
    char a0[MSL];
    char immo[MAX_STRING_LENGTH];
    char kav[MAX_STRING_LENGTH];
    char bty[MAX_STRING_LENGTH];
    char wizi[MAX_STRING_LENGTH];
    char pkthing[MAX_STRING_LENGTH];
    char namething[MAX_STRING_LENGTH];
/*    char openb[5];
    char closeb[5];*/
    DESCRIPTOR_DATA *d;
    int iLevelLower;
    int iLevelUpper;
    int nNumber;
    int immMatch, nMatch;
    int mor, ava, imm;
    int pkRatio; /* Added by Rowan */
	bool fClassRestrict;
    bool fImmortalOnly;
    if (IS_NPC(ch)) return;

    /*
     * Set default arguments.
     */
    iLevelLower    = 0;
    iLevelUpper    = MAX_LEVEL +1;
    fClassRestrict = FALSE;
    fImmortalOnly  = FALSE;

    /*
     * Parse arguments.
     */
    nNumber = 0;
    for ( ;; )
    {
	char arg[MAX_STRING_LENGTH];

	argument = one_argument( argument, arg );
	if ( arg[0] == '\0' )
	    break;

	if ( is_number( arg ) )
	{
	    send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
	    return;
	}
	else
	{
	    /*
	     * Look for classes to turn on.
	     */
	    arg[3]    = '\0';
	    if (   !str_cmp( arg, "imm" ) || !str_cmp( arg, "immortal" )
		|| !str_cmp( arg, "ava" ) || !str_cmp( arg, "avatar"   ) )
	    {
		fClassRestrict = TRUE;
	    }
	    else if ( !str_cmp( arg, "god" ) || !str_cmp( arg, "imp" ) )
	    {
		fImmortalOnly = TRUE;
	    }
	    else
	    {
		send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
		return;
	    }
	}
    }

    /*
     * Now show matching chars.
     */
    immMatch = 0;
    nMatch = 0;
    buf[0] = '\0';
    mort[0] = '\0';
    avat[0] = '\0';
    immo[0] = '\0';
    a1[0] = '\0';
    a2[0] = '\0';
    a3[0] = '\0';
    a4[0] = '\0';
    a5[0] = '\0';
    a6[0] = '\0';
    a7[0] = '\0';
    a0[0] = '\0';

    mor = ava = imm = 0;
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
	CHAR_DATA *wch;
	char const *class;

	/*
	 * Check for match against restrictions.
	 * Don't use trust as that exposes trusted mortals.
	 */
        if ( d->connected != CON_PLAYING )
		continue;
        nMatch++;

        if( !can_see( ch, d->character ) && (!IS_SET(ch->act,PLR_WATCHER)) ) 
	    continue;

	wch   = ( d->original != NULL ) ? d->original : d->character;
        if ( wch->level < iLevelLower
             ||   wch->level > iLevelUpper
             || ( fImmortalOnly  && wch->level <  LEVEL_IMMORTAL )
             || ( fClassRestrict && wch->level != LEVEL_HERO     ) )
            continue;

       /*
        * Figure out what to print for class.
        */
       class = " ";

       switch ( wch->level )
       {
       default: break;
       case MAX_LEVEL:      class = "{R Implementor #n"; break;
       case MAX_LEVEL -  1: class = "{R  HighJudge  {x"; break;
       case MAX_LEVEL -  2: class = "{R    Judge    {x"; break;
       case MAX_LEVEL -  3: class = "{R   Enforcer  {x"; break;
       case MAX_LEVEL -  4: class = "{R QuestMaster {x"; break;
       case MAX_LEVEL -  5: class = "{R   Helper    {x"; break;
       case MAX_LEVEL -  6:
       case MAX_LEVEL -  7:
       case MAX_LEVEL -  8:
       case MAX_LEVEL -  9:
		  class = status_level( buf, wch->race, wch->class );
           break;
       case MAX_LEVEL - 10: class = "{RMortal       {x"; break;
       case MAX_LEVEL - 11: class = "{RMortal       {x"; break;
       case MAX_LEVEL - 12: class = "{RNewbie       {x"; break;
       }

       /*
        * Format it up.
        */
/*
       if ( ch->class > 0 || IS_IMMORTAL( ch ))
       {
           if ( IS_CLASS(wch, CLASS_VAMPIRE))
               sprintf( kav, "{rVampire{x");
           else if ( IS_CLASS(wch, CLASS_MAGE) )
           {
               char *mage_col;
               switch ( wch->pcdata->powers[MPOWER_RUNE0] )
               {
               default:
               case PURPLE_MAGIC:  mage_col = "{M";   break;
               case RED_MAGIC:     mage_col = "{R";  break;
               case BLUE_MAGIC:    mage_col = "{B"; break;
               case GREEN_MAGIC:   mage_col = "{G"; break;
               case YELLOW_MAGIC:  mage_col = "{Y";break;
               }

               switch ( PC(wch,stats[UNI_GEN]) )
               {
               default:
               case WRL_NOVICE:
                   sprintf( kav, "%sWarmage{x",mage_col);
                   break;
               case WRL_ACOLYTE:
                   sprintf( kav, "%sWarlock{x",mage_col);
                   break;
               case WRL_MASTER:
                   sprintf( kav, "%sRubicant{x", mage_col);
                   break;
               }
           }
           else if ( IS_CLASS(wch, CLASS_ANGEL))
           {
               sprintf( kav, "{WAngel{x");
           }
           else if ( IS_CLASS(wch, CLASS_PRIEST))
           {
               sprintf( kav, "{bPriest{x");
           }
           else if ( IS_CLASS(wch, CLASS_MONK))
           {
               sprintf( kav, "{cMonk{x");
           }
           else if ( IS_CLASS(wch, CLASS_DEMON))
           {
               sprintf( kav, "{RDemon{x");
           }
           else if ( IS_CLASS(wch, CLASS_DROW))
           {
               sprintf( kav, "{MDrow{x");
           }
           else if ( IS_CLASS(wch, CLASS_WEREWOLF))
           {
               sprintf( kav, "{yWerewolf{x");
           }
           else if ( IS_CLASS(wch, CLASS_HIGHLANDER))
           {
               sprintf( kav, "{CKensai{x");
           }
           else if ( IS_CLASS(wch, CLASS_NINJA))
           {
               sprintf( kav, "{mNinja{x");
           }
           else if ( IS_CLASS(wch, CLASS_BARD))
           {
               sprintf( kav, "{yBard{x");
           }
           else
           {
               strcpy( kav, "{cHuman{x" );
           }
       }
       else */
           strcpy( kav, "" );

       if (wch->pcdata->bounty > 0)
           sprintf( bty, "%d", wch->pcdata->bounty);
       else
           strcpy( bty, " ");

       /*
	* 1 - Newbie?
        * 2 - Kingdom
        * 3 - PkRange
        * 4 - Nosafe
        */
       if ( wch->name == ch->name)
           sprintf(pkthing,"{Y({Yx{Y){x");
       else if ( (( get_age(wch) - 17) * 2 ) < 2 )
           sprintf(pkthing, "{c({Cn{c){x");
       else if ( wch->pcdata->kingdom == ch->pcdata->kingdom
           && ch->pcdata->kingdom > 0 )
           sprintf(pkthing, "{y({Yx{y){x" );
       else if ( wch->race == 0 && ch->race == 0 )
           sprintf(pkthing, "{r({Rx{r){x");
       else if ( wch->race == 0 && ch->race > 0)
	   sprintf(pkthing, "{c({Cx{c){x" );
       else if ( wch->race +4 > ch->race )
           sprintf(pkthing, "{r({Rx{r){x");
       else
	   sprintf(pkthing,"{b({Bx{b){x" );
       if (wch->pcdata->wizinvis> 6)
           sprintf( wizi, "(%d)", wch->pcdata->wizinvis);
       else
           strcpy( wizi, "");
       sprintf(namething,"{w%s%s{x",wch->name,wch->pcdata->title);

       if ((wch->pkill + wch->pdeath) != 0)
       {
           pkRatio = (int)((float)wch->pkill/(float)(wch->pkill + wch->pdeath)*100);
           sprintf(rep, "%4d#+", pkRatio);
       }
       else
       {
           pkRatio = 100;
           sprintf(rep, "%4d#+", pkRatio);
       }

       if ( wch->level > 6 )
       {
           sprintf( immo + strlen(immo), 
		"{D[{x%s{D]{D#!{w%-5s{D#$   {W%s %s{x\n\r",
                    class,
                    king_table[wch->pcdata->kingdom].who_name,
                    wizi,
                    wch->name);
       }
       else if ( wch->level > 2 && wch->level < 7 )
       {
           sprintf( a0 + strlen(a0), 
"{D[{x%s{D][{m%-3d{D]{w%s{D#!{w%-5s{D#${x %s%-s{x\n\r",
                    class,
                    wch->pcdata->stats[LEVEL],
                    pkthing,
                    king_table[wch->pcdata->kingdom].who_name,
		    IS_SET(wch->newbits, NEW_MUDCOP) ? "{R*{n" : " ",
                    namething);
           ava++;
       }
       else
       {
           sprintf( mort + strlen(mort), "{D[%s{D]{D   #!{w%-5s{D#${x{c %s{x\n\r",
                    class,
                    king_table[wch->pcdata->kingdom].who_name,
                    wch->name);
       }
    }

    stc("\n\r",ch);

    send_to_char("{b--------------------------------------------------------------------------------\n\r",ch);
    sprintf( buf, "                             {bA{Bs{Wce{wns{Dion {wto {bD{Ba{Wrk{wne{Dss{x %37s\n\r",
	IS_SET(sysdata.world, WORLD_DOUBLEXP) 
	? goodie_time(dxpcount) : "" );
    send_to_char( buf, ch );	
    send_to_char("{b--------------------------------------------------------------------------------\n\r", ch);
    if( immo[0] != '\0' )
    {
	    stc(immo,ch);
	    stc(LINE_SEPERATOR, ch );
    }

    if ( a0[0] != '\0' )
    {
      stc(a0,ch);
      stc(LINE_SEPERATOR, ch );
    }

    if ( mort[0] != '\0')
    {
      stc(mort,ch);
      stc(LINE_SEPERATOR, ch );
    }


    send_to_char("{b--------------------------------------------------------------------------------\n\r", ch);
    sprintf( buf, "{W[{Y%2d{W] Players connected to Ascension to Darkness{x",
		nMatch );
    centre_text( buf, ch );
    if( ch->level > 2 )
    centre_text( "{WType AVATAR to show info about the avatars connected.",ch );
    send_to_char("{b--------------------------------------------------------------------------------\n\r", ch);


    return;
}

void set_entermsg( CHAR_DATA *ch, char *entermsg )
{
    char buf[MAX_STRING_LENGTH];
     
    if ( IS_NPC(ch) )
    {
        bug( "Set_entermsg: NPC.", 0 );
        return;
    }
    
    if ( isalpha(entermsg[0]) || isdigit(entermsg[0]) )
    {
        buf[0] = ' ';
        strcpy( buf+1, entermsg );
    }
    else
    {
        strcpy( buf, entermsg );
    }
 
    free_string( ch->pcdata->entermsg );
    ch->pcdata->entermsg = str_dup( buf );
    return;
}

void do_entermsg( CHAR_DATA *ch, char *argument )
{
    if ( IS_NPC(ch) )
        return;
   
    if ( argument[0] == '\0' )
    {
	if( PC(ch,entermsg) && PC(ch,entermsg[0]) != '\0' )
	   ch_printf( ch, "Your enter message reads:\n\r   %s\n\r",
		PC(ch,entermsg) );
	else
	   do_help( ch, "enter" );
        return;
    }
      
    if (ch->pcdata->stats[DEMON_CURRENT] < 2000)
    {
         send_to_char("This costs 2000 cps to use.\n\r",ch);
         return;
    }


    if ( col_str_len(argument) > 200 )
    {
        argument[200] = ' ';
        argument[200] = '\0';
    }
     
    smash_tilde( argument );
    set_entermsg(ch, argument);
    send_to_char( "Ok.\n\rIf you've messed up, there will be -=no=- refunds.\n\r", ch );
    ch->pcdata->stats[DEMON_CURRENT] -= 2000;
}

void set_exitmsg( CHAR_DATA *ch, char *exitmsg )
{
    char buf[MAX_STRING_LENGTH];
        
    if ( IS_NPC(ch) )
    {
        bug( "Set_exitmsg: NPC.", 0 );
        return;
    }
        
    if ( isalpha(exitmsg[0]) || isdigit(exitmsg[0]) )
    {
        buf[0] = ' ';
        strcpy( buf+1, exitmsg );
    }
    else
    {
        strcpy( buf, exitmsg );
    }

    free_string( ch->pcdata->exitmsg );
    ch->pcdata->exitmsg = str_dup( buf );
    return;
}

void do_exitmsg( CHAR_DATA *ch, char *argument )
{
/*    int i;*/
    if ( IS_NPC(ch) )
        return;
     
 
    if ( argument[0] == '\0' )
    {
	if( PC(ch,exitmsg) && PC(ch,exitmsg[0]) != '\0')
	   ch_printf( ch, "Your exit message reads:\n\r   %s\n\r",
		PC(ch,exitmsg) );
	else
	   do_help( ch, "exit" );
        return;
    }
    if (ch->pcdata->stats[DEMON_CURRENT] < 2000)
    {
         send_to_char("This costs 2000 cps to use.\n\r",ch);
         return;
    }

    if ( col_str_len(argument) > 150 )
    {
        argument[150] = ' ';
        argument[150] = '\0';
    }
     
    smash_tilde( argument );
    set_exitmsg(ch, argument);
    send_to_char( "Ok.\n\rIf you've messed up, there will be -=no=- refunds.\n\r", ch );
    ch->pcdata->stats[DEMON_CURRENT] -= 2000;
}

void do_donate( CHAR_DATA *ch, char *argument)
{
    OBJ_DATA *pit;
    OBJ_DATA *obj;
    ROOM_INDEX_DATA *original, *pitroom;
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    int ddp;
    int amount;
    int fail;
   
    argument = one_argument(argument, arg);

    if (arg[0] == '\0' )
    {
        send_to_char("Donate what?\n\r",ch);
        return;
    }

    if (ch->position == POS_FIGHTING)
    {
        send_to_char(" You're {Yfighting!{x\n\r",ch);
        return;
    }

    /* gotta be in your inventory */
/*    if ( (obj = get_obj_carry (ch, arg, ch)) == NULL)
    {
        send_to_char("You do not have that!\n\r",ch);
        return;
    }*/

        if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
        {
            send_to_char( "You do not have that item.\n\r", ch );
            return;
        }

    if (!can_drop_obj(ch, obj) && ch->level < LEVEL_IMMORTAL)
    {
        send_to_char("Its stuck to you.\n\r",ch);
        return;
    }

    /* no donating corpses */
    if ((obj->item_type == ITEM_CORPSE_NPC) ||
       (obj->item_type == ITEM_CORPSE_PC))
    {
        send_to_char("You cannot donate that!\n\r",ch);
        return;
    }

    /* anything with ROT_DEATH is not worth the effort */
    if (obj->timer > 0)
    {
        send_to_char("You cannot donate that.\n\r",ch);
        return;
    }

    /* make sure the room is there */
    if ((pitroom = get_room_index(ROOM_VNUM_ALTAR)) == NULL)
    {
        send_to_char("No Pit Room, report to immortal.\n\r", ch );
        return;
    }

    /* kinda dumb to donte in to your pit WHEN your in the same room! */
    if (ch->in_room == pitroom)
    {
        send_to_char("Just put it in there!\n\r", ch );
        return;
    }

    if (obj->cost == 0)
    {
       send_to_char("You cannot donate that item anymore.\n\r",ch);
       return;
    }

    if ( obj->questowner != NULL && strlen(obj->questowner) > 1 )
    {
       send_to_char("You cannot donate claimed items.\n\r",ch);
       return;
    }

    fail = number_range(0,5);

    if (fail == 5)
    {
        send_to_char("Your donate failed! Object has been removed.\n\r.",ch);
        obj_from_char(obj);
        return;
    }

    original = ch->in_room;
    char_from_room(ch);
    char_to_room(ch,pitroom);
    if ((pit = get_obj_list(ch, "pit", ch->in_room->contents)) == NULL)
    {
        send_to_char("Sorry, the pit isnt available, inform an imm immediately.\n\r", ch );
        char_from_room(ch);
        char_to_room(ch,original);
        return;
    }

    obj_from_char(obj);
    obj_to_obj(obj, pit);
    char_from_room(ch);
    char_to_room(ch,original);
    act("{w$n donates {Y$p{x.",ch,obj,NULL,TO_ROOM);
    act("{wYou donate {Y$p{x.",ch,obj,NULL,TO_CHAR);
    if ((!IS_OBJ_STAT(obj ,ITEM_ANTI_EVIL) && IS_EVIL(ch)) ||
       (!IS_OBJ_STAT(obj ,ITEM_ANTI_GOOD) && IS_GOOD(ch)) ||
       IS_NEUTRAL(ch)) 
       if (obj->cost > 0 && obj->level > 0)
       {
           amount = UMAX(1, obj->cost/5);
           ddp    = number_range(0,10);
           obj->cost = 0;
           sprintf( buf, "{wYou receive{B %d {Gcps{w for your donation.{x\n\r",ddp);
           send_to_char(buf,ch);
             
           ch->pcdata->stats[DEMON_CURRENT] += ddp;
       }
    save_char_obj(ch);
    return;
   
}
/*
 * Put different max's in here for class's
 */
bool check_wpn_mastery ( CHAR_DATA *ch )
{
    if ( IS_CLASS(ch,CLASS_MONK ) )
    {    
       if ( ch->wpn[0] < 700 )
	   return FALSE;

       if( ch->wpn[1] < 200 || ch->wpn[2] < 200 || ch->wpn[3] < 200 
	|| ch->wpn[4] < 200 || ch->wpn[5] < 200 || ch->wpn[6] < 200 
	|| ch->wpn[7] < 200 || ch->wpn[8] < 200 || ch->wpn[9] < 200 
	|| ch->wpn[10] < 200 || ch->wpn[11] < 200 || ch->wpn[12] < 200)
	   return FALSE;
       return TRUE;
    }
    if ( ch->wpn[0] < 500 || ch->wpn[1] < 500 || ch->wpn[2] < 500
      || ch->wpn[3] < 500 || ch->wpn[4] < 500 || ch->wpn[5] < 500
      || ch->wpn[6] < 500 || ch->wpn[7] < 500 || ch->wpn[8] < 500 
      || ch->wpn[9] < 500 || ch->wpn[10] < 500 
      || ch->wpn[11] < 500 || ch->wpn[12] < 500)
	return FALSE;

    return TRUE;
}
void do_mastery( CHAR_DATA *ch, char *argument )
{
    OBJ_INDEX_DATA *pObjIndex;
    OBJ_DATA *obj;
    int vnum = 0;  
      
        if (IS_SET(ch->newbits, NEW_MASTERY))
        {   
            send_to_char("You've already made a mastery! MORON!\n\r",ch);
            return;
        }
        
        if (ch->pcdata->stats[DEMON_CURRENT] < 500000)
        {   
            send_to_char("Mastery's cost 500k cps.\n\r",ch);
            return;
        }

	if( !check_wpn_mastery( ch ) )    
        {
	       send_to_char("You need to max all your weapons first.\n\r",ch);
	       return;
        }

    if ((ch->spl[0] < 200) || (ch->spl[1] < 200) || (ch->spl[2] < 200) || (ch->spl[3] < 200) || (ch->spl[4] < 200))
    {
       send_to_char("You need to max all your spells first.\n\r",ch);
       return;
    }

    if ((ch->stance[1] < 200) || (ch->stance[2] < 200) || (ch->stance[3] < 200) || (ch->stance[4] < 200) ||
        (ch->stance[5] < 200) || (ch->stance[6] < 200) || (ch->stance[7] < 200) || (ch->stance[8] < 200) ||
        (ch->stance[9] < 200))
    {
       send_to_char("You need to max all your stances first.\n\r",ch);
       return;
    }

    if (ch->pcdata->quest < 1000)
    {
       send_to_char("You need 1000 quest points.\n\r",ch);
       return;
    }

    if (IS_CLASS(ch, CLASS_DEMON))
    {
       vnum = 4;
    }
    else if (IS_CLASS(ch, CLASS_WEREWOLF))
    {
       vnum = 5;
    }
    else if (IS_CLASS(ch, CLASS_VAMPIRE))
    {
       vnum = 6;
    }
    else if (IS_CLASS(ch, CLASS_DROW))
    {
       vnum = 7;
    }
    else if (IS_CLASS(ch, CLASS_NINJA))
    {
       vnum = 8;
    }
    else if (IS_CLASS(ch, CLASS_ANGEL))
    {
       vnum = 9;
    }
    else if (IS_CLASS(ch, CLASS_MAGE))
    {
       vnum = 17;
    }
    else if (IS_CLASS(ch, CLASS_PRIEST))
    {
       vnum = 18;
    }
    else if (IS_CLASS(ch, CLASS_MONK))
    {
       vnum = 19;
    }
    else
    {
        send_to_char("Would help if you were classed.\n\r", ch );
        return;
    }

    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
        send_to_char("Missing object, please inform Tracker.\n\r",ch);
        return;
    }
    obj = create_object(pObjIndex, 50);
    obj_to_char(obj, ch);
    act("$p appears in your hands.",ch,obj,NULL,TO_CHAR);
    act("$p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
    ch->pcdata->stats[DEMON_CURRENT] -= 500000;
    ch->pcdata->quest -= 1000;
    do_save(ch,""); 
   SET_BIT(ch->newbits, NEW_MASTERY);    
   SET_BIT(obj->quest, QUEST_MASTERY);
      return;
}

void do_linkdead(CHAR_DATA *ch, char *argument)
{
  CHAR_DATA *gch;
  char buf[MAX_STRING_LENGTH];
  bool found = FALSE;

    sprintf(buf, "{c+{C={w-{D<{w L i n k  -  D e a d   P e o p l e {D>{w-{C={c+{x\n\r");
    send_to_char(buf,ch);
    
  for (gch = char_list; gch != NULL; gch = gch->next)
  {
    if (IS_NPC(gch) || gch->desc) continue;
    found = TRUE;
    sprintf(buf, "Name: %12s. (Room: %5d)\n\r", gch->name, gch->in_room == NULL ? : gch->in_room->vnum);
    send_to_char(buf,ch);
  }
  if(!found) send_to_char("No Linkdead Players found\n\r",ch);
  return;
}

void do_flower( CHAR_DATA *ch, char *argument )
{       
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    char buf3[MAX_STRING_LENGTH];
    CHAR_DATA *victim;
    OBJ_INDEX_DATA *pObjIndex;
    OBJ_DATA *obj; 
    int vnum = 0; 

    one_argument( argument, arg );
        
    if ( arg[0] == '\0' )
    {
        send_to_char( "Send a Flower to whom?\n\r", ch );
        return;
    }
            
    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }

    if (ch->pcdata->stats[DEMON_CURRENT] < 100)
    {
        send_to_char("It costs 100 cps to send a flower to someone.\n\r", ch);
        return;
    }

    if (IS_NPC(ch)) return;
    if (IS_NPC(victim)) return;

send_to_char("{x{x\n\r",victim);
send_to_char("{R           .{x\n\r",victim);
send_to_char("{R     ...  :````'.':{x\n\r",victim);
send_to_char("{R      : ```````````''   :''::'{x\n\r",victim);
send_to_char("{R    ..:..  :     .'' :{x\n\r",victim);
send_to_char("{R ````'    ``:    .'     :{x\n\r",victim);
send_to_char("{R     :    :   :        :{x\n\r",victim);
send_to_char("{R      :   :   :         :{x\n\r",victim);
send_to_char("{R      :    :   :        :{x\n\r",victim);
send_to_char("{R       :    :   :{G..''''````::.               {YA Special Gift From{x\n\r",victim);
sprintf(buf,"{R        : {G...:..'     .''                       {R   %s{x\n\r",ch->name);
send_to_char(buf,victim);
send_to_char("{G        .'   .'  .::::'{x\n\r",victim);
send_to_char("{G      :..'''````:::::::{x\n\r",victim);
send_to_char("{G                ``::::{x\n\r",victim);
send_to_char("{G                   ``::.{x\n\r",victim);
send_to_char("{G                    ``::{x\n\r",victim);
send_to_char("{G                     :::.{x\n\r",victim);
send_to_char("{G          ..:.:.::'``' ::'``'  . : : .{x\n\r",victim);
send_to_char("{G        ..'      ``:.: ::   :'       .:{x\n\r",victim);
send_to_char("{G       .:        .:````:::  :       .: ::{x\n\r",victim);
send_to_char("{G       .:    ..''     :::.'    :':    :{x\n\r",victim);
send_to_char("{G        : .''         .:: : : '{x\n\r",victim);
send_to_char("{G         :          .'``::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);
send_to_char("{G                       ::{x\n\r",victim);

    send_to_char("Your flower has been sent.\n\r",ch);
    ch->pcdata->stats[DEMON_CURRENT] -= 100;            

    vnum = 3055;

    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
        send_to_char("Missing object, please inform Tracker.\n\r",ch);
        return;
    }

    sprintf(buf3,"%s", ch->name);

    obj = create_object(pObjIndex, 50); 
      sprintf(buf,"{wA {RR{re{Dd {RR{ro{Rs{re{w sent by{Y %s{x", buf3);
      sprintf(buf2,"red rose");           
        free_string( obj->short_descr );
        obj->short_descr = str_dup( buf );
        free_string( obj->name );
        obj->name = str_dup( buf2 );
    obj->cost = 0;
    obj_to_char(obj, victim);
    act("$p appears in your hands.",victim,obj,NULL,TO_CHAR);
    act("$p appears in $n's hands.",victim,obj,NULL,TO_ROOM);
    return;
}

void do_newwho( CHAR_DATA *ch, char *argument )
{
    char buf[MAX_STRING_LENGTH];
    char mort[MAX_STRING_LENGTH];
    char avat[MAX_STRING_LENGTH];
    char a1[MSL];
    char a2[MSL];
    char a3[MSL];
    char a4[MSL];
    char a5[MSL];
    char a6[MSL];
    char a7[MSL];
    char a0[MSL];
    char immo[MAX_STRING_LENGTH]; 
    char kav[MAX_STRING_LENGTH];
    char bty[MAX_STRING_LENGTH];
    char wizi[MAX_STRING_LENGTH];
    char namething[MAX_STRING_LENGTH];
    char kingthing[MAX_STRING_LENGTH];
    char pkthing[MAX_STRING_LENGTH];
    DESCRIPTOR_DATA *d;
    int iLevelLower;
    int iLevelUpper;
    int nNumber;
    int immMatch, nMatch;
    int mor, ava, imm;
        bool fClassRestrict;
    bool fImmortalOnly;
    if (IS_NPC(ch)) return;
            
    /*
     * Set default arguments.
     */
    iLevelLower    = 0;
    iLevelUpper    = MAX_LEVEL +1;
    fClassRestrict = FALSE;
    fImmortalOnly  = FALSE;
    
    /*
     * Parse arguments.
     */
    nNumber = 0;
    for ( ;; )
    {
        char arg[MAX_STRING_LENGTH];
    
        argument = one_argument( argument, arg );
        if ( arg[0] == '\0' )
            break;
    
        if ( is_number( arg ) )
        {   
            send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
            return;
        }
        else
        {
            /*
             * Look for classes to turn on.
             */
            arg[3]    = '\0';
            if (   !str_cmp( arg, "imm" ) || !str_cmp( arg, "immortal" )
                || !str_cmp( arg, "ava" ) || !str_cmp( arg, "avatar"   ) )
            {   
                fClassRestrict = TRUE;
            }
            else if ( !str_cmp( arg, "god" ) || !str_cmp( arg, "imp" ) )
            {
                fImmortalOnly = TRUE;
            }
            else  
            {
                send_to_char("Enter 'Avatar' for level 3's, or 'God' for level 4's and 5's.\n\r",ch);
                return;
            }
        }
    }
        
    /*   
     * Now show matching chars.
     */
    immMatch = 0;
    nMatch = 0;
    buf[0] = '\0';
    mort[0] = '\0';
    avat[0] = '\0';
    immo[0] = '\0';
    a1[0] = '\0';
    a2[0] = '\0';
    a3[0] = '\0';
    a4[0] = '\0';
    a5[0] = '\0';
    a6[0] = '\0'; 
    a7[0] = '\0';
    a0[0] = '\0';
                
    mor = ava = imm = 0;
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        CHAR_DATA *wch;
        char const *class;
     
        /*
         * Check for match against restrictions.
         * Don't use trust as that exposes trusted mortals.
         */
        if ( d->connected != CON_PLAYING )
                continue;
        nMatch++;  
    
        if( !can_see( ch, d->character ) && (!IS_SET(ch->act,PLR_WATCHER)) )
            continue;
    
        wch   = ( d->original != NULL ) ? d->original : d->character;
        if ( wch->level < iLevelLower
             ||   wch->level > iLevelUpper
             || ( fImmortalOnly  && wch->level <  LEVEL_IMMORTAL )
             || ( fClassRestrict && wch->level != LEVEL_HERO     ) )
            continue;   
    
       /*
        * Figure out what to print for class.
        */
       class = " ";
          
       switch ( wch->level )
       {
       default: break;
       case MAX_LEVEL:      class = "{mImplementor"; break;
       case MAX_LEVEL -  1: class = "{mHighJudge"; break;
       case MAX_LEVEL -  2: class = "{mJudge"; break;
       case MAX_LEVEL -  3: class = "{mEnforcer"; break;
       case MAX_LEVEL -  4: class = "{mQuestMaster"; break;
       case MAX_LEVEL -  5: class = "{mHelper"; break;
       case MAX_LEVEL -  6:
       case MAX_LEVEL -  7:
       case MAX_LEVEL -  8:
       case MAX_LEVEL -  9:
                  class = status_level3( buf, wch->race, wch->class );
           break;
       case MAX_LEVEL - 10: class = "{mMortal"; break;
       case MAX_LEVEL - 11: class = "{mMortal"; break;
       case MAX_LEVEL - 12: class = "{mNewbie"; break;
       }
          
       /*
        * Format it up.
       */
           strcpy( kav, "" );
            
       if (wch->pcdata->bounty > 0)
           sprintf( bty, "%d", wch->pcdata->bounty);
       else
           strcpy( bty, " ");
               
       /*   
        * 1 - Newbie?
        * 2 - Kingdom
        * 3 - PkRange
        * 4 - Nosafe
        */
       if ( wch->name == ch->name)
           sprintf(pkthing,"{wx{x");  
       else if ( (( get_age(wch) - 17) * 2 ) < 2 )
           sprintf(pkthing, "{wn{x");
       else if ( wch->pcdata->kingdom == ch->pcdata->kingdom
           && ch->pcdata->kingdom > 0 )  
           sprintf(pkthing, "{yx{x" );
       else if ( wch->race == 0 && ch->race == 0 ) 
           sprintf(pkthing, "{rx{x");
       else if ( wch->race == 0 && ch->race > 0)
           sprintf(pkthing, "{cx{x" );
       else if ( wch->race +4 > ch->race )
           sprintf(pkthing, "{rx{x");
       else
           sprintf(pkthing,"{bx{x" );

       if (wch->pcdata->wizinvis> 6)
           sprintf( wizi, "(%d)", wch->pcdata->wizinvis);
       else
           strcpy( wizi, "");
       sprintf(namething,"{g%s%s %s{w", IS_SET(wch->newbits, NEW_MUDCOP) ? "{R*{x" : "{D  {x",wch->name,wch->prefix);

       if (wch->pcdata->kingdom == 0)
       { sprintf(kingthing,"%s",class); }
       else
       { sprintf(kingthing,"%-14s {gof {y%-5s{x",class,king_table[wch->pcdata->kingdom].name); }
       
       if ( wch->level > 6 )
       {
           sprintf( immo + strlen(immo),   
                "{g %35s {D%s {x%s{x\n\r",
                    namething,
                    pkthing,
                    kingthing );
       }
       else if ( wch->level > 2 && wch->level < 7 )
       {
           sprintf( a0 + strlen(a0), "{g %35s {D%s {x%s{x\n\r",
                    namething,
                    pkthing,
                    kingthing );
           ava++;
       }
       else
       {
           sprintf( mort + strlen(mort), "{g %35s {D%s {w%s\n\r",
                    wch->name,
                    pkthing,
                    kingthing );
       }
    }
                    
    stc("\n\r",ch);
       
    sprintf( buf, "                             {bA{Bs{Wce{wns{Dion {wto {bD{Ba{Wrk{wne{Dss{x %37s\n\r\n\r",
       IS_SET(sysdata.world, WORLD_DOUBLEXP)
        ? goodie_time(dxpcount) : "" );
    send_to_char( buf, ch );
    if( immo[0] != '\0' )
    {
            stc(immo,ch);
    }   
       
    if ( a0[0] != '\0' )
    {
      stc(a0,ch);
    }
        
    if ( mort[0] != '\0')
    {               
      stc(mort,ch);
    }
    
        
    sprintf( buf, "\n\r{w There are {Y%2d {wplayers connected to AtD{x\n\r",
                nMatch );
    send_to_char(buf,ch);
    return;
}