#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 "rok.h"

bool  check_disabled (const struct cmd_type *command);
BAN_DATA *ban_first;
DISABLED_DATA *disabled_first;
#define END_MARKER    "END" /* for load_disabled() and save_disabled()*/

void do_class( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
        
    if ( IS_NPC(ch) ) return;
    
    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: class <char> <class>.\n\r", ch );
	send_to_char("      Classes:\n\r", ch );
    send_to_char("None, ", ch);
    send_to_char("Demon, ", ch);
    send_to_char("Demon Lord, ", ch);

    send_to_char("Purple Mage, Blue Mage, Yellow Mage, Green Mage, Red Mage, ", ch);
    send_to_char( "Vampire, ", ch);
    send_to_char("Werewolf, ", ch);
    send_to_char("Highlander, ", ch);
    send_to_char("Ninja, ", ch);
    send_to_char("Battlerager, ", ch);
	return;
    }
    
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "That player is not here.\n\r", ch);
	return;
    }

    if ( !str_cmp( arg2, "none"       ) ) 
    {
    /* Used to make sure the person has enough "stuff" to change */
	victim->pcdata->condition[COND_THIRST] = 10000;
	victim->move = 10000;
	victim->mana = 10000;

	if ( IS_CLASS(victim, CLASS_WEREWOLF)
	     || IS_CLASS(victim, CLASS_VAMPIRE) ) do_unwerewolf(victim,"");
	if (IS_VAMPAFF(victim,VAM_DISGUISED) ) do_mask(victim,"self");
    victim->pcdata->stats[UNI_FORM0] = 0;
 
/* All classes in general */   
    if (IS_VAMPAFF(victim,VAM_FANGS) )
    {
	 send_to_char("Your fangs slide back into your gums.\n\r",victim);
	 act("$N's fangs slide back into $s gums.", ch, NULL, victim, TO_ROOM);
	 REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_FANGS);
    }
    if (IS_CLASS(victim, CLASS_VAMPIRE) && IS_VAMPAFF(victim,VAM_CLAWS) ) 
	{
	    send_to_char("Your claws slide back under your nails.\n\r",victim);
	    act("$N's claws slide back under $s nails.", ch, NULL, victim, TO_ROOM);
	    REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_CLAWS);
	}
    else if (IS_CLASS(victim, CLASS_WEREWOLF) && IS_VAMPAFF(victim,VAM_CLAWS) ) 
    {
    	send_to_char("Your talons slide back into your fingers.\n\r",victim);
	    act("$N's talons slide back into $s fingers.",ch,NULL,victim,TO_ROOM);
    	REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_CLAWS);
    }

    if (IS_VAMPAFF(victim,VAM_NIGHTSIGHT) )
    {
	 send_to_char("The red glow in your eyes fades.\n\r",victim);
	 act("The red glow in $N's eyes fades.", ch, NULL, victim, TO_ROOM);
	 REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
    }
    if (IS_AFFECTED(victim,AFF_SHADOWSIGHT) )
    {
	 send_to_char("You can no longer see between planes.\n\r",victim);
	 REMOVE_BIT(victim->affected_by, AFF_SHADOWSIGHT);
    }
    
    if (IS_IMMUNE(victim,IMM_SHIELDED) )
    {
     send_to_char("You stop shielding your aura.\n\r",victim);
     REMOVE_BIT(victim->immune, IMM_SHIELDED);
    }
    
    if (IS_VAMPAFF(victim,VAM_DISGUISED) )
    {
     free_string( victim->morph );
     victim->morph = str_dup( victim->name );
     send_to_char("You transform into yourself.\n\r", victim);
     REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_DISGUISED);
    }
    
    if (IS_AFFECTED(victim,AFF_SHADOWPLANE) )
    {
     send_to_char("You fade back into the real world.\n\r",victim);
	 act("The shadows flicker and $N fades into existance.",ch,NULL,victim,TO_ROOM);
	 REMOVE_BIT(victim->affected_by,AFF_SHADOWPLANE);
	 do_look(ch,"auto");
	}
	
	if (IS_SET(victim->act, PLR_WIZINVIS) )
	{
	 REMOVE_BIT(victim->act, PLR_WIZINVIS);
	 send_to_char( "You slowly fade into existence.\n\r", victim );
	}
	
	if (IS_SET(victim->act, PLR_HOLYLIGHT) )
	{
	 REMOVE_BIT(victim->act, PLR_HOLYLIGHT);
	 send_to_char( "Your senses return to normal.\n\r", victim );
	}
	
/* Demon Stuff */
    if (IS_DEMAFF(victim,DEM_HORNS) && IS_CLASS(victim, CLASS_DEMON) )
    {
	 send_to_char("Your horns slide back into your head.\n\r",victim);
	 act("$N's horns slide back into $s head.", ch, NULL, victim, TO_ROOM);
	 REMOVE_BIT(victim->pcdata->powers[DPOWER_CURRENT], DEM_HORNS);
	}
	
	if (IS_DEMAFF(victim,DEM_HOOVES) && IS_CLASS(victim, CLASS_DEMON) )
    {
	 send_to_char("Your hooves transform into feet.\n\r",victim);
	 act("$N's hooves transform back into $s feet.", ch, NULL,victim,TO_ROOM);
	 REMOVE_BIT(victim->pcdata->powers[DPOWER_CURRENT], DEM_HOOVES);
    }
    
    if (IS_DEMAFF(victim,DEM_WINGS) && IS_CLASS(victim, CLASS_DEMON) )
    {
	if (IS_DEMAFF(victim,DEM_UNFOLDED) && IS_CLASS(victim, CLASS_DEMON) )
	{
	    send_to_char("Your wings fold up behind your back.\n\r",victim);
	    act("$N's wings fold up behind $s back.", ch, NULL, victim, TO_ROOM);
	    REMOVE_BIT(victim->pcdata->powers[DPOWER_CURRENT], DEM_UNFOLDED);
	}
	send_to_char("Your wings slide into your back.\n\r",victim);
	act("$N's wings slide into $s back.", ch, NULL, victim, TO_ROOM);
	REMOVE_BIT(victim->pcdata->powers[DPOWER_CURRENT], DEM_WINGS);
    }
    
	if ( IS_EXTRA(victim, EXTRA_OSWITCH) ) 
	{
	 do_humanform(victim,"");
	}
	
	REMOVE_BIT(victim->special, SPC_CHAMPION );
	REMOVE_BIT(victim->special, SPC_INCONNU );
	REMOVE_BIT(victim->special, SPC_ANARCH );
    REMOVE_BIT(victim->special, SPC_DEMON_LORD);
	REMOVE_BIT(victim->affected_by, AFF_POLYMORPH);
	REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_CHANGED);
    REMOVE_BIT(victim->pcdata->powers[WOLF_POLYAFF], POLY_MIST);
	REMOVE_BIT(victim->affected_by, AFF_ETHEREAL);
	REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_FLYING);
	REMOVE_BIT(victim->pcdata->stats[UNI_AFF], VAM_SONIC);
	REMOVE_BIT(victim->pcdata->powers[WOLF_POLYAFF], POLY_BAT);
	REMOVE_BIT(victim->pcdata->powers[WOLF_POLYAFF], POLY_WOLF);
	
	victim->pcdata->powers[DPOWER_FLAGS] = 0;
  	victim->pcdata->stats[DEMON_TOTAL] = 0;
	victim->pcdata->stats[DEMON_CURRENT] = 0;
	victim->pcdata->powers[1] = 0;
	victim->pcdata->condition[COND_THIRST] = 0;
	victim->move = victim->max_move;
	victim->mana = victim->max_mana;
	victim->hit = victim->max_hit;
	victim->pcdata->rank = 0;
	
    free_string(victim->lord);
    victim->lord     = str_dup( "" );
    victim->pcdata->stats[UNI_GEN]     = 0;
    victim->pcdata->stats[UNI_AFF]     = 0;
    victim->pcdata->stats[UNI_CURRENT] = -1;
    victim->beast = 15;
    victim->special = 0;

    victim->class = 0;
    if (victim->trust < 7)
	victim->trust = 0;
    victim->level = 2;
    send_to_char("You are classless now!\n\r", victim);
    }
else if ( !str_cmp( arg2, "demon"      ) ) 
    {
    victim->class = CLASS_DEMON;
    SET_BIT(victim->special, SPC_CHAMPION);
    send_to_char("You are now a demon!\n\r", victim);
    }
else if ( !str_cmp( arg2, "dlord" ))
    {
    victim->class = CLASS_DEMON;
    SET_BIT(victim->special, SPC_DEMON_LORD);
    victim->level = 3;
    send_to_char("You are now a demon!\n\r", victim);
    }
else if ( !str_cmp( arg2, "purplemage"     ) )
    {
    victim->class = 2;
    if ( victim->trust > 6 )
    {
    victim->trust = victim->trust;     
    }
    else
    {
    victim->trust = 6;
    }
    victim->level = 6;
    victim->pcdata->powers[MPOWER_RUNE0] = 0;
    victim->pcdata->powers[MPOWER_RUNE1] = 2047;
    victim->pcdata->powers[MPOWER_RUNE2] = 1023;
    victim->pcdata->powers[MPOWER_RUNE3] = 15;    
    send_to_char("You are now a purple mage!\n\r", victim);
    }
    else if ( !str_cmp( arg2, "redmage"     ) )
    {
    victim->class = 2;
    if ( victim->trust > 6 )
    {
      victim->trust=victim->trust;
    }
    else
    {
    victim->trust = 6;
    }
    victim->level = 6;
    victim->pcdata->powers[MPOWER_RUNE0] = 1;
    victim->pcdata->powers[MPOWER_RUNE1] = 2047;
    victim->pcdata->powers[MPOWER_RUNE2] = 1023;
    victim->pcdata->powers[MPOWER_RUNE3] = 15;    
    send_to_char("You are now a red mage!\n\r", victim);
    }
    else if ( !str_cmp( arg2, "yellowmage"     ) )
    {
    victim->class = 2;
    if ( victim->trust > 6 )
    {
    victim->trust=victim->trust;
    }
    else
    {
    victim->trust = 6;
    }
    victim->level = 6;
    victim->pcdata->powers[MPOWER_RUNE0] = 4;
    victim->pcdata->powers[MPOWER_RUNE1] = 2047;
    victim->pcdata->powers[MPOWER_RUNE2] = 1023;
    victim->pcdata->powers[MPOWER_RUNE3] = 15;    
    send_to_char("You are now a yellow mage!\n\r", victim);
    }
    else if ( !str_cmp( arg2, "bluemage"     ) )
    {
    victim->class = 2;
    if ( victim->trust > 6 )
    {
      victim->trust=victim->trust;
    }
    else
    {
    victim->trust = 6;
    }
    victim->level = 6;
    victim->pcdata->powers[MPOWER_RUNE0] = 2;
    victim->pcdata->powers[MPOWER_RUNE1] = 2047;
    victim->pcdata->powers[MPOWER_RUNE2] = 1023;
    victim->pcdata->powers[MPOWER_RUNE3] = 15;
    send_to_char("You are now a blue mage!\n\r", victim);
    }
    else if ( !str_cmp( arg2, "greenmage"     ) )
    {
    victim->class = 2;
    if ( victim->trust > 6 )
    {
    victim->trust=victim->trust;
    }
    else
    {
    victim->trust = 6;
    }
    victim->level = 6;
    victim->pcdata->powers[MPOWER_RUNE0] = 3;
    victim->pcdata->powers[MPOWER_RUNE1] = 2047;
    victim->pcdata->powers[MPOWER_RUNE2] = 1023;
    victim->pcdata->powers[MPOWER_RUNE3] = 15;
    send_to_char("You are now a green mage!\n\r", victim);
    }
    else if ( !str_cmp( arg2, "werewolf"   ) ) 
    {
    victim->class = CLASS_WEREWOLF;
    victim->pcdata->stats[UNI_GEN]     = 0;
    send_to_char("You are now a werewolf!\n\r", victim);
    }
else if ( !str_cmp( arg2, "vampire"    ) ) 
    {
    victim->class = CLASS_VAMPIRE;
    victim->pcdata->stats[UNI_GEN]     = 0;
    victim->beast = 15;
    send_to_char("You are now a vampire!\n\r", victim);
    }
else if ( !str_cmp( arg2, "highlander" ) ) 
    {
    victim->class = 16;
    victim->level = 3;
    send_to_char("You are now a highlander!\n\r", victim);
    }
else if ( !str_cmp( arg2, "battlerager" ) )
    {
    victim->class = 64;
    victim->level = 3;
    send_to_char("You are now a battlerager!\n\r", victim);
    }
else if ( !str_cmp( arg2, "ninja" ) )
    {
    victim->class = 32;
    victim->level = 3;
    send_to_char("You are now a ninja!\n\r", victim);
    }
else
    {
	send_to_char( "Syntax: class <char> <class>.\n\r", ch );
	send_to_char("      Classes:\n\r", ch );
    send_to_char("None, ", ch);
    send_to_char("Demon, ", ch);
    send_to_char("Demon Lord,", ch);   
    send_to_char("Purple Mage, Blue Mage, Yellow Mage, \n\rGreen Mage, Red Mage, ", ch);
    send_to_char("Werewolf, ", ch);
    send_to_char("Vampire, ", ch);
    send_to_char("Highlander, ", ch);
    send_to_char("Battlerager, ", ch);
    send_to_char("Ninja,", ch);   
	return;
    }
    send_to_char("Class Set.\n\r",ch);
    return;
}


void do_dagger( CHAR_DATA *ch, char *argument )
 
{
OBJ_DATA *obj;
 
if (IS_NPC(ch)) return;
 
if (!IS_CLASS(ch, CLASS_NINJA))
{
send_to_char("Huh?\n\r",ch);
return;
}
 
if ( 60 > ch->practice)
{
send_to_char("It costs 60 points of primal to create a ninjitsu dagger.\n\r",ch);
return;
}
ch->practice   -= 60;
obj = create_object(get_obj_index(29700)  ,0 );
obj->level = 70;
obj_to_char(obj, ch);
act("A ninjitsu dagger appears in your hands in a flash of light.",ch,NULL,NULL,TO_CHAR);
act("A ninjitsu dagger appears in $n's hands in a flash of light.",ch,NULL,NULL,TO_ROOM);
return;
}
 
void do_sword( CHAR_DATA *ch, char *argument )
 
{
OBJ_DATA *obj;
 
if (IS_NPC(ch)) return;

if (!IS_CLASS(ch, CLASS_NINJA))
{
send_to_char("Huh?\n\r",ch);
return;
}
 
if ( 60 > ch->practice)
{
send_to_char("It costs 60 points of primal to create a ninjitsu sword.\n\r",ch);
return;
}
ch->practice   -= 60;
obj = create_object(get_obj_index(29701)  ,0 );
obj->level = 70;
obj_to_char(obj, ch);
act("A ninjitsu sword appears in your hands in a flash of light.",ch,NULL,NULL,TO_CHAR);
act("A ninjitsu sword appears in $n's hands in a flash of light.",ch,NULL,NULL,TO_ROOM);
return;
}


void stc( const char *txt, CHAR_DATA *ch )
{
    const       char    *point;
                char    *point2;
                char    buf[ MAX_STRING_LENGTH*4 ];
                int     skip = 0;
 
    buf[0] = '\0';
    point2 = buf;
    if( txt && ch->desc )
        {
            if( IS_SET( ch->act, PLR_COLOUR ) )
            {
                for( point = txt ; *point ; point++ )
                {
                    if( *point == '{' )
                    {
                        point++;
                        skip = colour( *point, ch, point2 );
                        while( skip-- > 0 )
++point2;
                        continue;
                    }
                    *point2 = *point;
                    *++point2 = '\0';
                }
                *point2 = '\0';
                write_to_buffer( ch->desc, buf, point2 - buf );
            }
            else
            {
                for( point = txt ; *point ; point++ )
                {
                    if( *point == '{' )
                    {
                        point++;
                        continue;
                    }
                    *point2 = *point;
                    *++point2 = '\0';
}
                *point2 = '\0';
                write_to_buffer( ch->desc, buf, point2 - buf );
            }
        }
    return;
}


/*by Xkilla*/
char * plr_bit_name( int arg )
{
    static char buf[512];

    buf[0] = '\0';

    if ( arg & PLR_IS_NPC       ) strcat( buf, " npc"           );
    if ( arg & PLR_AUTOEXIT     ) strcat( buf, " autoexit"      );
    if ( arg & PLR_AUTOLOOT     ) strcat( buf, " autoloot"      );
    if ( arg & PLR_AUTOSAC      ) strcat( buf, " autosac"       );
    if ( arg & PLR_BLANK        ) strcat( buf, " blank"         );
    if ( arg & PLR_BRIEF        ) strcat( buf, " brief"         );
    if ( arg & PLR_COMBINE      ) strcat( buf, " combine"       );
    if ( arg & PLR_PROMPT       ) strcat( buf, " prompt"        );
    if ( arg & PLR_TELNET_GA    ) strcat( buf, " telnet_ga"     );
    if ( arg & PLR_HOLYLIGHT    ) strcat( buf, " holylight"     );
    if ( arg & PLR_WIZINVIS     ) strcat( buf, " wizinvis"      );
    if ( arg & PLR_INCOG        ) strcat( buf, " incog"         );
    if ( arg & PLR_ANSI         ) strcat( buf, " ansi"          );
    if ( arg & PLR_SILENCE      ) strcat( buf, " silenced"      );
    if ( arg & PLR_NO_TELL      ) strcat( buf, " no_tell"       );
    if ( arg & PLR_LOG          ) strcat( buf, " log"           );
    if ( arg & PLR_FREEZE       ) strcat( buf, " freeze"        );
    if ( arg & PLR_GODLESS      ) strcat( buf, " godless"       );
    return ( buf[0] != '\0' ) ? buf+1 : "none";
}

char * extra_plr_bit_name( int arg )
{
    static char buf[512];
    
    buf[0] = '\0';
    
    if ( arg & EXTRA_TRUSTED            ) strcat( buf, " q_trusted" );
    if ( arg & EXTRA_NEWPASS            ) strcat( buf, " newpass" );
    if ( arg & EXTRA_OSWITCH            ) strcat( buf, " oswitch" );
    if ( arg & EXTRA_SWITCH             ) strcat( buf, " switch" );
    if ( arg & EXTRA_FAKE_CON           ) strcat( buf, " fake_con" );
    if ( arg & TIED_UP                  ) strcat( buf, " tied_up" );
    if ( arg & GAGGED                   ) strcat( buf, " gagged" );
    if ( arg & BLINDFOLDED              ) strcat( buf, " blindfolded" );
    if ( arg & EXTRA_DONE               ) strcat( buf, " non_virgin" );
    if ( arg & EXTRA_EXP                ) strcat( buf, " got_exp" );
    if ( arg & EXTRA_PREGNANT           ) strcat( buf, " pregnant" );
    if ( arg & EXTRA_LABOUR             ) strcat( buf, " labour" );
    if ( arg & EXTRA_BORN               ) strcat( buf, " born" );
    if ( arg & EXTRA_PROMPT             ) strcat( buf, " prompt" );
    if ( arg & EXTRA_MARRIED            ) strcat( buf, " married" );
    if ( arg & EXTRA_CALL_ALL           ) strcat( buf, " call_all" );
    return ( buf[0] != '\0' ) ? buf+1 : "none";
}
   char * get_position_name( int arg )
{
    switch( arg )
    {
        case 0: return "dead";
        case 1: return "mortal";
        case 2: return "incap";
        case 3: return "stunned";
        case 4: return "sleeping";
        case 5: return "meditating";
        case 6: return "sitting";
        case 7: return "resting";
        case 8: return "fighting";
        case 9: return "standing";
    }
    bug( "Get_position_name: unknown type %d.", arg );
    return "(unknown)";
}

/*
 * Itemaffect bit names :)
 */
char * itemaffect_bit_name( int arg )
{
    static char buf[512];
    
    buf[0] = '\0';

    if ( arg & ITEMA_SHOCKSHIELD        ) strcat( buf, " Shockshield"  ); 
    if ( arg & ITEMA_FIRESHIELD         ) strcat( buf, " Fireshield"    );
    if ( arg & ITEMA_ICESHIELD          ) strcat( buf, " Iceshield"     );
    if ( arg & ITEMA_ACIDSHIELD         ) strcat( buf, " Acidshield"    );
    if ( arg & ITEMA_DBPASS             ) strcat( buf, " Pass Door"     );
    if ( arg & ITEMA_CHAOSSHIELD        ) strcat( buf, " Chaoshield"    );
    if ( arg & ITEMA_ARTIFACT           ) strcat( buf, " Artifact"      );
    if ( arg & ITEMA_REGENERATE         ) strcat( buf, " Regeneration"  );
    if ( arg & ITEMA_SPEED              ) strcat( buf, " Speed"         );
    if ( arg & ITEMA_VORPAL             ) strcat( buf, " Vorpal"        );
    if ( arg & ITEMA_PEACE              ) strcat( buf, " Peace"         );
    if ( arg & ITEMA_RIGHT_SILVER       ) strcat( buf, " Right Silver"  );
    if ( arg & ITEMA_LEFT_SILVER        ) strcat( buf, " Left Silver"   );
    if ( arg & ITEMA_REFLECT            ) strcat( buf, " Darkshield"    );
    if ( arg & ITEMA_RESISTANCE         ) strcat( buf, " Resistance"    );
    if ( arg & ITEMA_VISION             ) strcat( buf, " Vision"        );
    if ( arg & ITEMA_STALKER            ) strcat( buf, " Stalker"       );
    if ( arg & ITEMA_VANISH             ) strcat( buf, " Vanish"        );
    if ( arg & ITEMA_RAGER              ) strcat( buf, " Rager"         );
    return ( buf[0] != '\0' ) ? buf+1 : "none";
}


void do_pstat ( CHAR_DATA *ch, char *argument )
{
    char        arg[MAX_INPUT_LENGTH];
    char        buf[MAX_STRING_LENGTH];
    CHAR_DATA   *victim;
        
    argument = one_argument( argument, arg );
  
    if ( arg[0] == '\0' )
    {
        send_to_char("Pstat 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 ) && IS_SET( victim->act, PLR_GODLESS ) &&
         get_trust( ch ) < NO_GODLESS )
    {
        send_to_char( "You failed.\n\r", ch );
        return;
    }
        
    sprintf( buf, "Name : %s.\n\r",
        IS_NPC( victim )        ? victim->short_descr : victim->name );
  send_to_char( buf, ch );
    sprintf( buf, "Sex : %s. Room : %d. Align : %d. Primal : %d. Quest : %d.\n\r",
        victim->sex == SEX_MALE         ? "Male"        :
      victim->sex == SEX_FEMALE       ? "Female"      : "None",
        victim->in_room == NULL         ? 0             : victim->in_room->vnum,
        victim->alignment,
        victim->practice,
        IS_NPC( victim )                ? 0             : victim->pcdata->quest
        );
    send_to_char( buf, ch );
        
    sprintf( buf, "Level : %d. Trust : %d. Gold : %d. Exp : %d.\n\r",
        victim->level,
        victim->trust,
        victim->gold,
        victim->exp );
   send_to_char( buf, ch );
    
    sprintf( buf, "Hit : %d. Dam : %d. AC : %d. Position : %s\n\r",
       char_hitroll( victim ),
        char_damroll( victim ),
        char_ac( victim ),
        capitalize( get_position_name( victim->position ) ));
    send_to_char( buf, ch );
          
    sprintf( buf, "HP %d/%d. Mana %d/%d. Move %d/%d.\n\r",
        victim->hit, victim->max_hit,
        victim->mana, victim->max_mana,
        victim->move, victim->max_move );
    send_to_char( buf, ch );
        
    sprintf( buf, "Str: %d.  Int: %d.  Wis: %d.  Dex: %d.  Con: %d.\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, "Fighting : %s. (%d)\n\r",
        victim->fighting ? victim->fighting->name  : "(None)",
        victim->fighting ? victim->fighting->level : 0 ); 
   send_to_char( buf, ch );
        
    sprintf( buf, "Pkill : %d. Pdeath : %d. Mkill : %d. Mdeath : %d.\n\r",
        IS_NPC( victim ) ? 0 : victim->pkill,
        IS_NPC( victim ) ? 0 : victim->pdeath,
        IS_NPC( victim ) ? 0 : victim->mkill,
       IS_NPC( victim ) ? 0 : victim->mdeath );
    send_to_char( buf, ch ); 
        
    sprintf( buf, "TotExp  : %12d. TotMobLev  : %10d. TotQuestPoints : %10d.\n\r",
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_TOTAL_XP],
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_TOTAL_LEVEL],
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_QUEST] );
    send_to_char( buf, ch );
        
    sprintf( buf, "HighExp : %12d. HighMobLev : %10d. TotQuests     : %10d.\n\r",
      IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_HIGH_XP],
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_HIGH_LEVEL],
        IS_NPC( victim ) ? 0 : victim->pcdata->score[SCORE_NUM_QUEST] );  
    send_to_char( buf, ch );
        
    if ( !IS_NPC( victim ) )
   {
        sprintf( buf, "Unarmed : %4d.", victim->wpn[0] );
        send_to_char( buf, ch );
        sprintf( buf, " Slice   : %4d.", victim->wpn[1] );
        send_to_char( buf, ch );
        sprintf( buf, " Stab    : %4d.", victim->wpn[2] );
        send_to_char( buf, ch );
        sprintf( buf, " Slash   : %4d.", victim->wpn[3] );
        send_to_char( buf, ch );
        sprintf( buf, " Whip    : %4d.\n\r", victim->wpn[4] );
        send_to_char( buf, ch );
        sprintf( buf, "Claw    : %4d.", victim->wpn[5] );
        send_to_char( buf, ch );
        sprintf( buf, " Blast   : %4d.", victim->wpn[6] );
        send_to_char( buf, ch );
        sprintf( buf, " Pound   : %4d.", victim->wpn[7] );
send_to_char( buf, ch );
        sprintf( buf, " Crush   : %4d.", victim->wpn[8] );
        send_to_char( buf, ch );
        sprintf( buf, " Grep    : %4d.\n\r", victim->wpn[9] );
        send_to_char( buf, ch );
        sprintf( buf, "Bite    : %4d.", victim->wpn[10] );
     send_to_char( buf, ch );   
        sprintf( buf, " Pierce  : %4d.", victim->wpn[11] );
        send_to_char( buf, ch );
        sprintf( buf, " Suck    : %4d.\n\r",victim->wpn[12] );
        send_to_char( buf, ch );
        
        sprintf( buf, "%-8s : %3d. %-8s : %3d. %-8s : %3d. %-8s : %3d. %-8s : %3d.\n\r",
            "Purple",   victim->spl[PURPLE_MAGIC],
            "Red",      victim->spl[RED_MAGIC],
            "Blue",     victim->spl[BLUE_MAGIC],
           "Green",    victim->spl[GREEN_MAGIC],
            "Yellow",   victim->spl[YELLOW_MAGIC] );
        send_to_char( buf, ch );
        sprintf( buf, "%-8s : %3d. %-8s : %3d. %-8s : %3d. %-8s : %3d. %-8s : %3d.\n\r",
            "Viper",    victim->stance[STANCE_VIPER],
            "Crane",    victim->stance[STANCE_CRANE],
            "Crab",     victim->stance[STANCE_CRAB],
            "Mongoose", victim->stance[STANCE_MONGOOSE],   
            "Bull",     victim->stance[STANCE_BULL] );
        send_to_char( buf, ch );
        
        sprintf( buf, "%-8s : %3d. %-8s : %3d. %-8s : %3d. %-8s : %-3d. %-8s : %3d.\n\r",
            "Mantis",   victim->stance[STANCE_MANTIS],
            "Dragon",   victim->stance[STANCE_DRAGON],
            "Tiger",    victim->stance[STANCE_TIGER],
            "Monkey",   victim->stance[STANCE_MONKEY],
           "Swallow",  victim->stance[STANCE_SWALLOW] );
        send_to_char( buf, ch );
        
	sprintf( buf, "Act         : %s\n\r", plr_bit_name(victim->act ));
    	send_to_char( buf, ch );
	sprintf( buf, "Extra       : %s\n\r",
        victim->extra <= 0 ? "(None)" : extra_plr_bit_name( victim->extra ) );
    	send_to_char( buf, ch );
	sprintf( buf, "ItemAff     : %s\n\r",
        victim->itemaffect <= 0 ? "(None)" : itemaffect_bit_name(victim->itemaffect ) );
    	send_to_char( buf, ch );
            
              sprintf( buf, "Affected by : %s.\n\r",  
        affect_bit_name( victim->affected_by ) );
    	send_to_char( buf, ch );
            
    return;
}       
}


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

    sprintf(buf,"%s: System: %s",ch->name,argument); 
    if (ch->level < NO_WATCH) do_watching(ch,buf);
 
    if ( argument[0] == '\0' )
    {
        send_to_char( "System: NULL DATA\n\r", ch );
        return;
    }
 
    for ( d = descriptor_list; d != NULL; d = d->next )
    {
        if ( d->connected == CON_PLAYING )
        {
	    send_to_char( "#i#1Sys#2tem#n#4:", d->character);
            send_to_char( argument, d->character );
            send_to_char( "\n\r",   d->character );
        }
    }
 
    return;
}

void do_undeny( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];
        char *oldname;
        CHAR_DATA *victim;
        DESCRIPTOR_DATA *d;
        ROOM_INDEX_DATA *in_room;
 
    sprintf(buf,"%s: Undeny %s",ch->name,argument);
    if (ch->level < NO_WATCH) do_watching(ch,buf);
 
    one_argument( argument, arg );
 
    if ( arg[0] == '\0' )
    {
        send_to_char( "Undeny whom?", ch );
        return;
    }

        if ((victim = get_char_world(ch, arg)) != NULL) {
        send_to_char("They are already online.\n\r", ch );
        return;}
 
    if (!char_exists(FALSE,arg))
    {
        send_to_char( "They aren't here.\n\r", ch );
        return;
    }
        oldname = str_dup(ch->name);
        d = ch->desc;
        do_autosave(ch,"");
        in_room = ch->in_room;
        extract_char(ch, TRUE);
        d->character = NULL;
        load_char_obj(d, arg);
        ch = d->character;
        ch->next = char_list;
        char_list = ch;
        char_to_room(ch,in_room);

    if ( IS_SET(ch->act, PLR_DENY) )
    {
        REMOVE_BIT(ch->act, PLR_DENY);
        send_to_char( "DENY removed.\n\r", ch );
    } else {
        send_to_char("They are not DENIED.\n\r", ch ); }
 
        d = ch->desc;
        do_autosave(ch,"");
        in_room = ch->in_room;
        extract_char(ch, TRUE);
        d->character = NULL;
        load_char_obj(d, oldname);
        ch = d->character;
        ch->next = char_list;
        char_list = ch;
        char_to_room(ch,in_room);

    return;
}

void set_switchname( CHAR_DATA *ch, char *title )
{
    char buf[MAX_STRING_LENGTH];
 
    if ( IS_NPC(ch) )
    {
        bug( "Set_switchname: NPC.", 0 );
        return;
    }
    strcpy( buf, title );
    free_string( ch->pcdata->switchname );
    ch->pcdata->switchname = str_dup( buf );
    return;
}
 
void set_pc_name( CHAR_DATA *ch, char *title )
{
    char buf[MAX_STRING_LENGTH];
 
    if ( IS_NPC(ch) )
{
        bug( "Set_pc_name: NPC.", 0 );
        return;
    }
    strcpy( buf, title );
    free_string( ch->name);
    ch->name = str_dup( buf );
    return;
}


void reset_weapon( CHAR_DATA *ch, int dtype )
{
        if ( ch->wpn[dtype] > 200 )
                ch->wpn[dtype] = 200;
        return;
}
 
void reset_spell( CHAR_DATA *ch, int dtype )
{
        if ( ch->spl[dtype] > 200 )
                ch->spl[dtype] = 200;
        return;
}


void do_checkstats(CHAR_DATA *ch, char *argument)
{
    DESCRIPTOR_DATA *d;

    if (IS_NPC(ch))
    {
	send_to_char("Switch Back!\r\n", ch);
	return;
    }

    send_to_char("Name      Lvl Tst Class Gen Hit  Mana  Move  HR   DR   AC    QC   QP\r\n", ch);
    for (d = descriptor_list; d!=NULL; d = d->next)
    {
	char buf[MAX_STRING_LENGTH];
	CHAR_DATA *wch;
	char *class;

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

	if (IS_CLASS(wch, CLASS_DEMON))
	    class = "Demon";
	else if (IS_CLASS(wch, CLASS_VAMPIRE))
	    class = "Vamp";
	else if (IS_CLASS(wch, CLASS_WEREWOLF))
	    class = "Wolf";
	else if (IS_CLASS(wch, CLASS_HIGHLANDER))
	    class = "HighL";
	else if (IS_CLASS(wch, CLASS_MAGE))
	    class = "Mage";
	else
	    class = "None";

	sprintf(buf, "%-10s %-2d %-2d %-6s %-2d %-5d %-5d %-5d %-4d %-4d %-5d %-3d %-3d\r\n",
		wch->name, wch->level, wch->trust, class,
		wch->pcdata->stats[UNI_GEN], wch->max_hit,
		wch->max_mana, wch->max_move,
		char_hitroll(wch), char_damroll(wch), char_ac(wch),
		wch->pcdata->score[SCORE_NUM_QUEST], wch->pcdata->quest);
	send_to_char(buf, ch);
    }
	return;
}


/*by xkilla*/
void do_addlag(CHAR_DATA *ch, char *argument)
{
        CHAR_DATA *victim;
        char arg1[MAX_STRING_LENGTH];
        int x;
 
        argument = one_argument(argument, arg1);
 
        if (arg1[0] == '\0')
        {
                send_to_char("Addlag to who?", ch);
                return;
        }
 
        if ((victim = get_char_world(ch, arg1)) == NULL)
        {
                send_to_char("They're not here.", ch);
                return;
        }
 
        if ((x = atoi(argument)) <= 0)
        {
                send_to_char("That makes a LOT of sense, ya lag yourself *DUH*.", ch);
                return;
        }
 
        if (x > 100)
        {
                send_to_char("There's a limit to cruel and unusual punishment", ch);
                return;
        }
 
        send_to_char("Somebody REALLY dosen't like you", victim);
        WAIT_STATE(victim, x);
        send_to_char("That ought to show that nerdy bitch...", ch);
        return;
}


/*Color by Xkilla*/

int colour( char type, CHAR_DATA *ch, char *string )
{
    char        code[ 20 ];
    char        *p = '\0';

    if( IS_NPC( ch ) )
        return( 0 );

    switch( type )
    {
        default:
            sprintf( code, CLEAR );
            break;
        case 'x':
            sprintf( code, CLEAR );
            break;
        case 'b':
            sprintf( code, C_BLUE );
            break;
        case 'c':
            sprintf( code, C_CYAN );
            break;
        case 'g':
            sprintf( code, C_GREEN );
            break;
        case 'm':
            sprintf( code, C_MAGENTA );
            break;
        case 'r':
            sprintf( code, C_RED );
            break;
        case 'w':
            sprintf( code, C_WHITE );
            break;
        case 'y':
            sprintf( code, C_YELLOW );
            break;
        case 'B':
            sprintf( code, C_B_BLUE );
            break;
        case 'C':
            sprintf( code, C_B_CYAN );
            break;
        case 'G':
            sprintf( code, C_B_GREEN );
            break;
        case 'M':
            sprintf( code, C_B_MAGENTA );
            break;
        case 'R':
            sprintf( code, C_B_RED );
            break;
        case 'W':
            sprintf( code, C_B_WHITE );
            break;
        case 'Y':
            sprintf( code, C_B_YELLOW );
            break;
        case 'D':
            sprintf( code, C_D_GREY );
            break;
        case '*':
            sprintf( code, "%c", 007 );
            break;
        case '/':
            sprintf( code, "%c", 012 );
            break;
        case '{':
            sprintf( code, "%c", '{' );
            break;
		case '.':
		     switch(number_range(1,15))
		     {
 		 	case  1: sprintf( code, C_RED ); 	break;
 		 	case  2: sprintf( code, C_GREEN ); 	break;
 		 	case  3: sprintf( code, C_YELLOW ); 	break;
 		 	case  4: sprintf( code, C_BLUE ); 	break;
 		 	case  5: sprintf( code, C_MAGENTA ); 	break;
 		 	case  6: sprintf( code, C_CYAN ); 	break;
 		 	case  7: sprintf( code, C_WHITE ); 	break;
 		 	case  8: sprintf( code, C_D_GREY ); 	break;
 		 	case  9: sprintf( code, C_B_RED ); 	break;
 	 		case 10: sprintf( code, C_B_GREEN );	break;
 	 		case 11: sprintf( code, C_B_YELLOW );	break;
 	 		case 12: sprintf( code, C_B_BLUE ); 	break;
 	 		case 13: sprintf( code, C_B_MAGENTA );	break;
 		 	case 14: sprintf( code, C_B_CYAN );	break;
 		 	case 15: sprintf( code, C_B_WHITE );	break;
		     }
			break;
		
     }

     p = code;
     while( *p != '\0' )
     {
        *string = *p++;
        *++string = '\0';
     }

     return( strlen( code ) );
}


void colourconv( char *buffer, const char *txt , CHAR_DATA *ch )
{
    const       char    *point;
                int     skip = 0;

    if( ch->desc && txt )
    {
        if( IS_SET( ch->act, PLR_COLOUR ) )
        {
            for( point = txt ; *point ; point++ )
            {
                if( *point == '{' )
                {
                    point++;
                    skip = colour( *point, ch, buffer );
                    while( skip-- > 0 )
                        ++buffer;
                    continue;
                }

                *buffer = *point;
                *++buffer = '\0';
            }
            *buffer = '\0';
        }
        else
        {
            for( point = txt ; *point ; point++ )
            {
                if( *point == '{' )
                {
                    point++;
                    continue;
                }
                *buffer = *point;
                *++buffer = '\0';
            }
            *buffer = '\0';
        }
    }
    return;
}

void do_generation( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    int gen;
    char      arg1 [MAX_INPUT_LENGTH];
    char      arg2 [MAX_INPUT_LENGTH];
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
        
    if ( IS_NPC(ch) ) return;
    
    if ( arg1[0] == '\0' || arg2[0] == '\0' )
    {
	send_to_char( "Syntax: generation <char> <generation>.\n\r", ch );
    send_to_char("Generation 1 is a Master <Class> and 2 is clan leader.\n\r", ch);
	return;
    }
    
    if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
    {
	send_to_char( "That player is not here.\n\r", ch);
	return;
    }
    
    gen = is_number( arg2 ) ? atoi( arg2 ) : -1;

    send_to_char("Generation Set.\n\r",ch);
    victim->pcdata->stats[UNI_GEN] = gen;
    return;
}

void do_disable (CHAR_DATA *ch, char *argument)
{
        int i;
        DISABLED_DATA *p,*q;
        char buf[100]; 
            
        if (IS_NPC(ch))
        {
                send_to_char ("RETURN first.\n\r",ch);
                return;
        }
    
        if (!argument[0]) /* Nothing specified. Show disabled commands. */
        {
                if (!disabled_first) /* Any disabled at all ? */
                {
                        send_to_char ("There are no commands disabled.\n\r",ch);
                        return;
                }

                send_to_char ("Disabled commands:\n\r"
                              "Command      Level   Disabled by\n\r",ch);
  
                for (p = disabled_first; p; p = p->next)
                {
                        sprintf (buf, "%-12s %5d   %-12s\n\r",p->command->name, 
p->level, p->disabled_by);
                        send_to_char (buf,ch);
                }
                return;
        }   
        
        /* command given */

       /* First check if it is one of the disabled commands */
        for (p = disabled_first; p ; p = p->next)
                if (!str_cmp(argument, p->command->name))
                        break;
         
        if (p) /* this command is disabled */
        {
                 
                if (get_trust(ch) < p->level)
                {
                        send_to_char ("This command was disabled by a higher  power.\n\r", ch );
                        return;
                }
                 
                /* Remove */
                        
                if (disabled_first == p) /* node to be removed == head ? */
                        disabled_first = p->next;
                else /* Find the node before this one */
                {
                        for (q = disabled_first; q->next != p; q = q->next); 
                        q->next = p->next;
                }
        
                free_string (p->disabled_by); /* free name of disabler */
                free_mem (p,sizeof(DISABLED_DATA)); /* free node */
         
                save_disabled(); /* save to disk */
                send_to_char ("Command enabled.\n\r",ch);
        }
        else /* not a disabled command, check if that command exists */
        {        
                /* IQ test */
                if (!str_cmp(argument,"disable"))
                {
                        send_to_char ("You cannot disable the disable  command.\n\r",ch);
                        return;
                }
                
                /* Search for the command */
                for (i = 0; cmd_table[i].name[0] != '\0'; i++)
                        if (!str_cmp(cmd_table[i].name, argument))
                                break;
                 
                /* Found? */
                if (cmd_table[i].name[0] == '\0')
                {
                        send_to_char ("No such command.\n\r",ch);
                        return;
                }
         
                if (cmd_table[i].level > get_trust(ch))  
                {
                        send_to_char ("You dot have access to that command; you cannot disable it.\n\r", ch );
                        return;
                }
                
                /* Disable the command */
                        
                p = alloc_mem (sizeof(DISABLED_DATA));
                 
                p->command = &cmd_table[i];
                p->disabled_by = str_dup (ch->name); /* save name of disabler */
                p->level = get_trust(ch); /* save trust */
                p->next = disabled_first;
                disabled_first = p; /* add before the current first element */
                 
                send_to_char ("Command disabled.\n\r",ch);
                save_disabled(); /* save to disk */

        }
}
                        
/* Check if that command is disabled
   Note that we check for equivalence of the do_fun pointers; this means
   that disabling 'chat' will also disable the '.' command
*/
bool check_disabled (const struct cmd_type *command)
{
        DISABLED_DATA *p;
                 
        for (p = disabled_first; p ; p = p->next)
                if (p->command->do_fun == command->do_fun)
                        return TRUE;
                
        return FALSE;
}
                
/* Load disabled commands */
void load_disabled()
{
        FILE *fp;
        DISABLED_DATA *p;
        char *name;
        int i;
 
        disabled_first = NULL;

        fp = fopen (DISABLED_FILE, "r");
   
        if (!fp) /* No disabled file.. no disabled commands : */
                return;
 
        name = fread_word (fp);
                 
        while (str_cmp(name, END_MARKER)) /* as long as name is NOT END_MARKER 
:) */
        {
                /* Find the command in the table */
                for (i = 0; cmd_table[i].name[0] ; i++)
                        if (!str_cmp(cmd_table[i].name, name))
                                break;
                
                if (!cmd_table[i].name[0]) /* command does not exist? */
                {   
                        bug ("Skipping uknown command in " DISABLED_FILE "  file.",0);
                        fread_number(fp); /* level */
                        fread_word(fp); /* disabled_by */
                }  
                else /* add new disabled command */
                {
                        p = alloc_mem(sizeof(DISABLED_DATA));
                        p->command = &cmd_table[i];
                        p->level = fread_number(fp);
                        p->disabled_by = str_dup(fread_word(fp));
                        p->next = disabled_first;
                
                        disabled_first = p;
        
                }
        
                name = fread_word(fp);
        }
                
        fclose (fp);
}
                
/* Save disabled commands */
void save_disabled()
{
        FILE *fp;
        DISABLED_DATA *p;
                        
        fp = fopen (DISABLED_FILE, "w");
                
        if (!fp)
        {
                bug ("Could not open " DISABLED_FILE " for writing",0);
                return;
        }
         
        for (p = disabled_first; p ; p = p->next)
                fprintf (fp, "%s %d %s\n", p->command->name, p->level, 
p->disabled_by);
 
        fprintf (fp, "%s\n",END_MARKER);

        fclose (fp);
        fpReserve = fopen( NULL_FILE, "r" );
}


void load_bans() {
        FILE *fp;
    BAN_DATA *ban_last;

    ban_last = NULL;
    fp = fopen ("ban.txt", "r");

    if (!fp) return;

    for ( ; ; ) {
        BAN_DATA *p;
    if (feof(fp))  {
    fclose(fp);
    return;}

    p = alloc_mem(sizeof(BAN_DATA));
    p->name = str_dup(fread_word(fp));
    fread_to_eol(fp);
    if (ban_list == NULL) 
    ban_list = p;
    else
    ban_last->next = p;
    ban_last = p;
    }
/*
    
    while (str_cmp(name, END_MARKER)) {
        p = alloc_mem(sizeof(BAN_DATA));
        p->name = name;
        p->next = ban_first;
        ban_first = p;
        name = fread_word(fp);}

    fclose(fp);*/
}

void save_bans(void)
{
        FILE *fp;
        BAN_DATA *p;

    fclose(fpReserve);
        fp = fopen ("ban.txt", "w");

        if (!fp) {bug("could not open ban.txt",0);
        return;}

    for (p = ban_list; p != NULL; p = p->next) {
    fprintf(fp, "%s\n", p->name);}
    fclose(fp);
    fpReserve = fopen(NULL_FILE, "r");

}