mcloud/
/*			  <(()Seeds of Hate:  Swords & Sorcery Edition())>					 |
|					    _\|::>< Ghoul Class ><::|/_								 |
|						  |Class Tier Number: I|								 |
|							  |Coder: Trent|									 |
|  *Ghoul is an original class made for Seeds of Hate, Swords & Sorcery Edition! |
|	Please don't copy without permission and due credit!						 |
|	Thanks.																	     |
|		 -Trent, God of PaiN!   (ASDF!)											 |
X--------------------------------------------------------------------------------X
*/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"

#define GPTS(ch)	(ch->pcdata->stats[GHOUL_PTS])

void do_realms( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];

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

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_GHOUL))
    {
	send_to_char("Huh?\n\r",ch);
	return;
    }

    if (arg1[0] == '\0' && arg2[0] == '\0')
    {
	sprintf(buf,"#cRealms of Power#n: #GS#chadow#n #g(#G%d#g)#n, #GZ#combie#n #g(#G%d#g), #GU#cndead #GM#cight#n #g(#G%d#g).#n\n\r",
	ch->pcdata->powers[GPOWER_SHADOW], ch->pcdata->powers[GPOWER_ZOMBIE],
	ch->pcdata->powers[GPOWER_UNDEADMIGHT]);
	send_to_char(buf,ch);
	return;
    }
    if (arg2[0] == '\0')
    {
	if (!str_cmp(arg1,"shadow"))
	{
	    send_to_char("#cShadows - #GThe realm of darkness and night, which a ghoul thrives in.\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_SHADOW] < 1) 
			send_to_char("#cYou have no knowledge of the Shadow Realm.\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_SHADOW] > 0) 
			send_to_char("#cShadowsight - #GThe ability to see into the nether realm#n.\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_SHADOW] > 1) 
			send_to_char("#cTruesight - #GThe power to see all.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_SHADOW] > 2) 
			send_to_char("#cShadowplane - #GThe ability to merge into the Shadow Realm.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_SHADOW] > 3) 
			stc("#cPerception  - #GThe ability to make your attacks more efficient.  Adds hit/dam.#n\n\r",ch);
		if (ch->pcdata->powers[GPOWER_SHADOW] > 4) 
			send_to_char("#cGore - #GA vicious attack from the Shadow Plane#n\n\r",ch);
	    return;
	}
	else if (!str_cmp(arg1,"zombie"))
	{
	    send_to_char("#cZombie - #GThe Innate gifts of the Undead.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_ZOMBIE] < 1) 
			send_to_char("#cYou have no knowledge of the frightening powers the Undead possess.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_ZOMBIE] > 0) 
			send_to_char("#cClaws - #GThe god of Death grants you special, razor sharp claws.#n\n\r         #gSyntax: Gcreate Claws#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_ZOMBIE] > 1) 
			send_to_char("#cDisease - #GYour claws infect others with the essence of disease.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_ZOMBIE] > 2) 
			send_to_char("#cRavage - #GA ferenzical clawing attack.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_ZOMBIE] > 3) 
			send_to_char("#cStench of Decay - #GRemoves a characters Protection.#n\n\r",ch);
		if (ch->pcdata->powers[GPOWER_ZOMBIE] > 4)
			send_to_char("#cStench of Death - #GRemoves a characters Sanctuary#n.\n\r", ch);
	    return;
	}
	else if (!str_cmp(arg1,"undeadmight"))
	{
	    send_to_char("#cUndead Might - #GYour Strength from Beyond the Grave!.#n\n\r",ch);
	    if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] < 1) 
		send_to_char("#cUndead Might: [     ]#n\n\r",ch);
	    else if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] > 4) 
			send_to_char("#cUndead Might: [#G*****#c]#n\n\r",ch);
	    else if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] > 3) 
			send_to_char("#cUndead Might: [#G**** #c]#n\n\r",ch);
	    else if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] > 2) 
			send_to_char("#cUndead Might: [#G***  #c]#n\n\r",ch);
	    else if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] > 1) 
			send_to_char("#cUndead Might: [#G**   #c]#n\n\r",ch);
		else if (ch->pcdata->powers[GPOWER_UNDEADMIGHT] > 0)
			send_to_char("#cUndead Might: [#G*    #c]#n\n\r", ch);
	    return;
	}
	sprintf(buf,"#cRealms of Power#n: #GS#chadow#n #g(#G%d#g)#n, #GZ#combie#n #g(#G%d#g), #GU#cndead #GM#cight#n #g(#G%d#g).#n\n\r",
	ch->pcdata->powers[GPOWER_SHADOW], ch->pcdata->powers[GPOWER_ZOMBIE],
	ch->pcdata->powers[GPOWER_UNDEADMIGHT]);
	send_to_char(buf,ch);
	return;
    }
    if (!str_cmp(arg2,"manifest"))
    {
	int improve;
	int cost;
	int max;

	     if (!str_cmp(arg1,"shadow"   )) {improve = GPOWER_SHADOW;   max=5;}
	else if (!str_cmp(arg1,"zombie"   )) {improve = GPOWER_ZOMBIE;   max=5;}
	else if (!str_cmp(arg1,"undeadmight"   )) {improve = GPOWER_UNDEADMIGHT;   max=5;}
	else
	{
	    send_to_char("#GR#cealms#n: #GS#chadow#n, #GZ#combie#n, #GU#cndead#GM#cight#n.\n\r",ch);
	    return;
	}							
	cost = (ch->pcdata->powers[improve]+1) * 1000;
	arg1[0] = UPPER(arg1[0]);
	if ( ch->pcdata->powers[improve] >= max )
	{
	    sprintf(buf,"#cYou have already gained all the powers of the #0%s #crealms.#n\n\r", arg1);
	    send_to_char(buf,ch);
	    return;
	}
	if ( cost > ch->pcdata->stats[GHOUL_PTS] )
	{
	    sprintf(buf,"#cYou need #G%d #cGhoul Points to manifest in the #0%s #crealm.#n\n\r", cost, arg1);
	    send_to_char(buf,ch);
	    return;
	}
	ch->pcdata->powers[improve] += 1;
	ch->pcdata->stats[GHOUL_PTS] -= cost;
	sprintf(buf,"#cYou manifest deeper into the #0%s #crealm!.#n\n\r", arg1);
	send_to_char(buf,ch);
    }
    else send_to_char("#cTo learn powers, type #Grealm <realm> manifest.#n\n\r",ch);
	return;
}

void do_ghouleq( CHAR_DATA *ch, char *argument )
{
  OBJ_INDEX_DATA *pObjIndex;
  OBJ_DATA *obj;
  char arg[MAX_INPUT_LENGTH];
  int vnum = 0;

  argument = one_argument( argument, arg );
  if (IS_NPC(ch)) return;
  if (!IS_CLASS(ch, CLASS_GHOUL))
  {
      send_to_char("What?\n\r",ch);
      return;
  }
  if (arg[0] == '\0')
  {
    send_to_char("#GPlease specify which piece of ghoulish armor you wish to make: #wRing Bands Choker Vest
Helmet Boots Gloves Sleeves Pants Cloak Rope Mask.\n\r",ch);
    return;
  }

    if ( ch->practice < 200 )
    {
        send_to_char("It costs 200 points of primal to create ghoul equipment.\n\r",ch);
        return;
    }

    if      (!str_cmp(arg,"ring"	)) vnum = 6204;    
    else if (!str_cmp(arg,"bands"	)) vnum = 6205;
    else if (!str_cmp(arg,"choker"	)) vnum = 6206;
    else if (!str_cmp(arg,"vest"        )) vnum = 6207;
    else if (!str_cmp(arg,"helmet"      )) vnum = 6208;
    else if (!str_cmp(arg,"boots"       )) vnum = 6209;
    else if (!str_cmp(arg,"gloves"      )) vnum = 6210;
    else if (!str_cmp(arg,"sleeves"     )) vnum = 6211;
    else if (!str_cmp(arg,"pants"       )) vnum = 6212;
    else if (!str_cmp(arg,"cloak"       )) vnum = 6213;
    else if (!str_cmp(arg,"rope"        )) vnum = 6214;
    else if (!str_cmp(arg,"mask"        )) vnum = 6215;
    else
    {
    do_ghouleq(ch,"");
    return;
    }
    
    if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
    {
    send_to_char("Missing object, please inform a God.\n\r",ch);
    return;
    }

    ch->practice -= 200;
    obj = create_object(pObjIndex, 50);
    obj->questowner = str_dup(ch->pcdata->switchname);
    obj->ownerid = ch->pcdata->playerid;
    obj_to_char(obj, ch);
    act("You form some living flesh into $p.",ch,obj,NULL,TO_CHAR);
    act("$n forms some living flesh into $p.",ch,obj,NULL,TO_ROOM);
    return;
}


void do_gcreate( CHAR_DATA *ch, char *argument )
{
  OBJ_INDEX_DATA *pObjIndex;
  OBJ_DATA *obj;
  char arg[MAX_INPUT_LENGTH];
  int vnum = 0;
    
  argument = one_argument( argument, arg );
  if (IS_NPC(ch)) return;
  if( !IS_CLASS(ch, CLASS_GHOUL))
  {
    send_to_char("What?\n\r",ch);
    return;
  }
  	if (ch->pcdata->powers[GPOWER_ZOMBIE] < 1) 
	{
	send_to_char("Huh?\n\r",ch);
	return;
	}
  
  if (arg[0] == '\0')
  {
    send_to_char("syntax: gcreate claws\n\r",ch);
    return;
  }
  if ( ch->practice < 500 )
  {
    send_to_char("It costs 500 primal to create a pair of Ghoul Claws.\n\r",ch);
    return;
  }
  if (!str_cmp(arg,"claws")) vnum = 33015;
  else
  {
    do_gcreate(ch,"");
    return;
  } 
  if ( vnum == 0 || (pObjIndex = get_obj_index( vnum )) == NULL)
  {
    send_to_char("Missing object, please inform a God.\n\r",ch);
    return;
  }
  obj = create_object(pObjIndex, 50);
  obj->questowner = str_dup(ch->pcdata->switchname);
  obj->ownerid = ch->pcdata->playerid;
  obj_to_char(obj, ch);
 
  obj = create_object(pObjIndex, 50);
  obj->questowner = str_dup(ch->pcdata->switchname);
  obj->ownerid = ch->pcdata->playerid;
  obj_to_char(obj, ch);

  ch->practice -= 500;
  act("A pair of $p appears in your hands.",ch,obj,NULL,TO_CHAR);
  act("A pair of $p appears in $n's hands.",ch,obj,NULL,TO_ROOM);
  return;
  }

void do_gore( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA *obj;

    one_argument( argument, arg );

        if (IS_NPC(ch)) return;
    
    if (!IS_CLASS(ch, CLASS_GHOUL))
    {
            send_to_char("Huh?\n\r",ch);
            return;
    }    
	
	if (ch->pcdata->powers[GPOWER_SHADOW] < 5) 
	{
	send_to_char("Huh?\n\r",ch);
	return;
	}

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

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

    if ( victim == ch )
    {
	send_to_char( "#cWhatever#n\n\r", ch );
	return;
    }
    
	if ( ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL
    ||   obj->value[3] != 5 )
    &&   ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL
    ||   obj->value[3] != 5 ) )
    {
	send_to_char( "#cYou cannot gore without Claws!!#n\n\r", ch );
	return;
    }

    if (!IS_AFFECTED(ch, AFF_SHADOWPLANE))
	{
	send_to_char( "#cYou must be in Shadowplane to do this!#n\n\r", ch );
	return;
	}

	if (ch->move < 10000)
	{
	send_to_char( "#cYou need 10000 move to use this!#n\n\r", ch );
	return;
	}

    if (IS_NPC(victim))
	{
	    REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE);
    send_to_char("#cYou materialize in front of your opponent and #Rgore him with your sharp claws!#n\n\r",ch);
	act("#G$n #cmaterializes out of thin air, screaming wildly, and #Rgores $s opponent with $s razor sharp claws!!#n",ch,NULL,NULL,TO_ROOM);
	ch->move -= 10000;
    WAIT_STATE( ch, 3 * PULSE_VIOLENCE );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );	
	return;
	}

    REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE);
    send_to_char("#cYou materialize in front of your opponent and #Rgore him with your sharp claws!#n\n\r",ch);
	act("#G$n #cmaterializes out of thin air, screaming wildly, and #Rgores you with $s razor sharp claws!!#n",ch,NULL,NULL,TO_VICT);
	ch->move -= 10000;
    WAIT_STATE( ch, 3 * PULSE_VIOLENCE );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	return;
	}

void do_ravage( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA *obj;

    one_argument( argument, arg );

        if (IS_NPC(ch)) return;
    
    if (!IS_CLASS(ch, CLASS_GHOUL))
    {
            send_to_char("Huh?\n\r",ch);
            return;
    }    
	
	if (ch->pcdata->powers[GPOWER_ZOMBIE] < 3) 
	{
	send_to_char("Huh?\n\r",ch);
	return;
	}

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

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

    if ( victim == ch )
    {
	send_to_char( "#cWhatever#n\n\r", ch );
	return;
    }
    
	if ( ( ( obj = get_eq_char( ch, WEAR_WIELD ) ) == NULL
    ||   obj->value[3] != 5 )
    &&   ( ( obj = get_eq_char( ch, WEAR_HOLD ) ) == NULL
    ||   obj->value[3] != 5 ) )
    {
	send_to_char( "#cYou cannot ravage without Claws!!#n\n\r", ch );
	return;
    }

	if (ch->move < 2000)
	{
	send_to_char( "#cYou need 2000 move to use this!#n\n\r", ch );
	return;
	}

    if (IS_NPC(victim))
	{
    send_to_char("#cYou #rRA#RVA#rGE#c your opponent with your sharp claws!#n\n\r",ch);
	act("#G$n #rRA#RVAG#rES #c$s opponent with $s razor sharp claws!!#n",ch,NULL,NULL,TO_ROOM);
	ch->move -= 2000;
    ch->hitroll += 2000;
	WAIT_STATE( ch, 3 * PULSE_VIOLENCE );	
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	multi_hit( ch, victim, TYPE_UNDEFINED );
	ch->hitroll -= 2000;	
	return;
	}

    send_to_char("#cYou #rRA#RVA#rGE#c your opponent with your sharp claws!#n\n\r",ch);
	act("#G$n #rRA#RVAG#rES #cyou with $s razor sharp claws!!#n",ch,NULL,NULL,TO_VICT);
	ch->move -= 2000;
    ch->hitroll += 2000;
	WAIT_STATE( ch, 3 * PULSE_VIOLENCE );	
	multi_hit( ch, victim, TYPE_UNDEFINED );
	ch->hitroll -= 2000;	
	return;
	}

	void do_sdecay( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

        if (IS_NPC(ch)) return;
    
    if (!IS_CLASS(ch, CLASS_GHOUL))
    {
            send_to_char("Huh?\n\r",ch);
            return;
    }    
	
	if (ch->pcdata->powers[GPOWER_ZOMBIE] < 4) 
	{
	send_to_char("Huh?\n\r",ch);
	return;
	}

	if ( arg[0] == '\0' )
    {
	send_to_char( "Use Stench of Decay upon whom?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "#cWhatever#n\n\r", ch );
	return;
    }

	  if ( victim->position <= POS_FIGHTING )
  {
    send_to_char( "#cNot while fighting!#n\n\r", ch );
    return;
  }

	if ( !IS_AFFECTED(victim, AFF_PROTECT) )
  {
	send_to_char( "#cThey don't have protection on!#n\n\r", ch );
	return;
  }

	if (IS_AFFECTED(ch, AFF_SHADOWPLANE))
	{
	REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE);    
	}

    REMOVE_BIT(victim->affected_by, AFF_PROTECT);
	send_to_char("#cYour decaying body emits a most foul scent!#n\n\r",ch);
	act("#G$n's #cdecaying body emits a most foul scent, making you gag!#n\n\r",ch,NULL,NULL,TO_VICT);
    multi_hit( ch, victim, TYPE_UNDEFINED );
	WAIT_STATE( ch, 3 * PULSE_VIOLENCE );
	return;
	}

	void do_sdeath( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    one_argument( argument, arg );

        if (IS_NPC(ch)) return;
    
    if (!IS_CLASS(ch, CLASS_GHOUL))
    {
            send_to_char("Huh?\n\r",ch);
            return;
    }    
	
	if (ch->pcdata->powers[GPOWER_ZOMBIE] < 5) 
	{
	send_to_char("Huh?\n\r",ch);
	return;
	}

	if ( arg[0] == '\0' )
    {
	send_to_char( "Use Stench of Death upon whom?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "#cWhatever#n\n\r", ch );
	return;
    }

	  if ( victim->position <= POS_FIGHTING )
  {
    send_to_char( "#cNot while fighting!#n\n\r", ch );
    return;
  }

	if ( !IS_AFFECTED(victim, AFF_SANCTUARY) )
  {
	send_to_char( "#cThey don't have sanctuary on!#n\n\r", ch );
	return;
  }

	if (IS_AFFECTED(ch, AFF_SHADOWPLANE))
	{
	REMOVE_BIT(ch->affected_by, AFF_SHADOWPLANE);    
	}
	REMOVE_BIT(victim->affected_by, AFF_SANCTUARY);
	send_to_char("#cYour decaying body emits an #gUNGODLY #cscent!#n\n\r",ch);
	act("#G$n's #cdecaying body emits an #gUNGODLY #cscent, making you want to retch!#n\n\r",ch,NULL,NULL,TO_VICT);
    multi_hit( ch, victim, TYPE_UNDEFINED );
	WAIT_STATE( ch, 3 * PULSE_VIOLENCE );
	return;
	}

void do_swampwalk( CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;
    char arg[MAX_INPUT_LENGTH];

    if ( IS_NPC(ch) )
	return;

    argument = one_argument (argument, arg);

    if (!IS_CLASS(ch, CLASS_GHOUL) )
	{
         send_to_char("Huh?\n\r",ch);
	   return;
	}

    if ( arg[0] == '\0' )
    {
	send_to_char( "Use the swamps to find the path to whom?\n\r", ch );
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They are not of this world.\n\r", ch );
	return;
    }
    
   if( ch->move < 1500) 
    {
     stc( "The path escapes your senses as you loose control over your inner energies.\n\r",ch);
     return;
    }

 if( IS_SET(victim->in_room->room_flags, ROOM_ASTRAL))
  { 
    stc( "You can't find it's room.\n\r",ch);
    return; 
  } 
    if (IS_SET(victim->act, ACT_NOTRAVEL))
  {
  	send_to_char("No Can Do.\n\r", ch);
  	return;
  }
  if( IS_SET(ch->in_room->room_flags, ROOM_ASTRAL))
  {
    stc( "You cannot sense any paths leading from this room.\n\r",ch);
    return;
  }

    if (ch == victim)
    {
        send_to_char("But you're already at yourself!\n\r",ch);
	  return;
    }
    if ( room_is_private(victim->in_room ) )
    {
        send_to_char( "That room is private right now.\n\r", ch );
        return;
    }
    if ( !IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON) )
    {	
	send_to_char( "They don't want you near them.\n\r", ch );
        return;
    }
    if (victim->in_room == ch->in_room)
    {
	send_to_char("But you're already there!\n\r",ch);
        return;
    }

    act("You follow the path to $N.", ch, NULL, victim, TO_CHAR);
    act("$n sinks into the swamps.", ch, NULL, victim, TO_ROOM);
    char_from_room(ch);
    char_to_room(ch,victim->in_room);
    ch->move -= 1500;
    act("$n rises from the swamps in front of $N.", ch, NULL, victim, TO_NOTVICT);
    act("$n rises from the swamps in front of you.", ch, NULL, victim, TO_VICT);
    do_look(ch,"auto");
    return;
}