#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"













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

  argument = one_argument( argument, arg );

  if (IS_NPC(ch)) return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT4))
        {
                send_to_char("#0You need combat four for this.#n\n\r", ch);
                return;
        }

  if ((victim = get_char_room(ch, arg)) ==NULL)
  {
    send_to_char("They are not here.\n\r", ch);
    return;
  }
  if (IS_NPC(victim) || victim->level < 3)
  {
    send_to_char("Not on them\n\r",ch);
    return;
  }
  do_say(ch, "Kara, Kara, Xenos!");
  if (number_percent() > 40) do_berserk2(victim,"");
  else send_to_char("#RSomeone is trying to control your actions!!!#n\n\r",victim);
  WAIT_STATE(ch,18);
  return;
}







void do_dtrick(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        OBJ_DATA *obj;
        char      arg1[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       randnum;
        int       successchance;

        argument = one_argument(argument, arg1);

        if (IS_NPC(ch))
                return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT3))
        {
                send_to_char("#0You need combat three for this.#n\n\r", ch);
                return;
        }

        if (ch->move < 2500)
        {
                stc("#0You don't have the required amount of move to preform a Dirty Trick!#n\n\r", ch);
                return;
        }

        if (arg1[0] == '\0')
        {
                stc("#0Preform a Dirty Trick on whom?#n\n\r", ch);
                return;
        }

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


        randnum = number_range(1, 4);   //Disarm, Trip, Foot Stomp, Hilt Smash.

        if (randnum == 1)   //<----Disarm
        {
                if (((obj = get_eq_char(victim, WEAR_WIELD)) == NULL)
                    || obj->item_type != ITEM_WEAPON)
                {
                        if (((obj = get_eq_char(victim, WEAR_HOLD)) == NULL)
                            || obj->item_type != ITEM_WEAPON)
                                stc("They're not wielding anything to disarm!!#n\n\r", ch);
                        return;
                }

                if (IS_IMMUNE(victim, IMM_DISARM))
                {
                        successchance = number_range(1, 75);
                }

                else
                {
                        successchance = number_range(1, 100);
                }

                if (successchance < 50)
                {
                        stc("#0You try to preform a dirty trick, but fail!#n\n\r", ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }

                if (successchance >= 50)
                {
                        sprintf(buf,
                                "#R$n #0slices $s #7dagger #0sneakily accross your wrist, causing you too lose your grip!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        sprintf(buf,
                                "#0You sneakily slice your dagger across #R$N's #0wrist, causing them to lose their grip!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);

                        obj_from_char(obj);
                        obj_to_room(obj, victim->in_room);
                        ch->move -= 2500;
                        hurt_person(ch, victim, 250);
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }
        }

        else if (randnum == 2)  //<----Trip
        {
                if (IS_AFFECTED(victim, AFF_FLYING))
                        return;

                successchance = number_range(1, 100);

                if (successchance < 50)
                {
                        stc("#0You attempt a dirty trick but fail!#n\n\r",
                            ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }
                if (successchance >= 50 && victim->wait == 0)
                {
                        sprintf(buf,
                                "#R$n #0kicks your shins, causing your legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        sprintf(buf,
                                "#0You kick #R$N #0in the shins, causing $S legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);
                        sprintf(buf,
                                "#R$n #0kicks #R$N #0in the shins, causing $S legs to buckle!#n\n\r");
                        act(buf, ch, NULL, victim, TO_NOTVICT);
                        ch->move -= 2500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        hurt_person(ch, victim, 500);
                        WAIT_STATE(victim, 2 * PULSE_VIOLENCE);
                        victim->position = POS_RESTING;
                        return;
                }
        }

        else if (randnum == 3)  //<---Foot Stomp
        {
                if (IS_AFFECTED(victim, AFF_FLYING))
                        return;

                successchance = number_range(1, 100);

                if (successchance < 50)
                {
                        stc("#0You attempt to preform a Dirty Trick but fail!#n\n\r", ch);
                        ch->move -= 500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        return;
                }

                if (successchance >= 50)
                {
                        sprintf(buf, "#R$n #0stomps on your feet! OW!#n\n\r");
                        act(buf, ch, NULL, victim, TO_VICT);
                        sprintf(buf, "#0You stomp on #R$N's #0feet!#n\n\r");
                        act(buf, ch, NULL, victim, TO_CHAR);
                        sprintf(buf, "#R$n #0stomps on #R$N's #0feet!#n\n\r");
                        act(buf, ch, NULL, victim, TO_NOTVICT);
                        ch->move -= 2500;
                        WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                        hurt_person(ch, victim, 500);
                        WAIT_STATE(victim, 3 * PULSE_VIOLENCE);
                        return;
                }
        }

        else if (randnum == 4)  //<---Hilt Bash
        {
                successchance = number_range(1, 100);
                {
                        if (successchance < 50)
                        {
                                stc("#0You attempt a Dirty Trick, but fail!#n\n\r", ch);
                                ch->move -= 500;
                                WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                                return;
                        }
                        if (successchance >= 50)
                        {
                                sprintf(buf,
                                        "#R$n BASHES #0his jeweled dagger hilt into your face! You reel back, stunned!#n\n\r");
                                act(buf, ch, NULL, victim, TO_VICT);
                                sprintf(buf,
                                        "#0You BASH your dagger hilt into #R$N's #0face!#n\n\r");
                                act(buf, ch, NULL, victim, TO_CHAR);
                                sprintf(buf,
                                        "#R$n #RBASHES #0his dagger hilt into #R$N's #0face, causing them to reel back stunned!#n\n\r");
                                act(buf, ch, NULL, victim, TO_NOTVICT);
                                act("Your nose shatters under the impact of the blow!", victim, NULL, NULL, TO_CHAR);
                                act("$n's nose shatters under the impact of the blow!", victim, NULL, NULL, TO_ROOM);
                                SET_BIT(victim->loc_hp[LOC_HEAD],
                                        BROKEN_NOSE);
                                ch->move -= 2500;
                                hurt_person(ch, victim, 1000);
                                WAIT_STATE(ch, 1 * PULSE_VIOLENCE);
                                WAIT_STATE(victim, 1 * PULSE_VIOLENCE);
                                victim->position = POS_STUNNED;
                                return;
                        }
                        return;
                }
        }
}

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

        if (!IS_SPHERE(ch, SPHERE_COMBAT1))
        {
                send_to_char("#0You need combat one for this.#n\n\r", ch);
                return;
        }
	if (IS_SET(ch->newbits, NEW_FIGHTDANCE)) {
	send_to_char("You will no longer dance The Dance of Lloth.\n\r", ch );
	REMOVE_BIT(ch->newbits, NEW_FIGHTDANCE);
	}
	else {
	send_to_char("You will start dancing The Dance of Lloth while fighting.\n\r", ch );
	SET_BIT(ch->newbits, NEW_FIGHTDANCE);
	}

	return;
}




void do_unnerve(CHAR_DATA *ch, char *argument)
{
    CHAR_DATA *victim;

        if (!IS_SPHERE(ch, SPHERE_COMBAT3))
        {
                send_to_char("#0You need combat three for this.#n\n\r", ch);
                return;
        }

    if (argument[0] == '\0')
    {
	stc("Who do you wish to unnerve?\n\r", ch);
	return;
    }

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

    WAIT_STATE(ch, 7);
    do_say(ch,"#1Xeus Dominus Mortai!#n");
    do_stance(victim, "");
}


void do_spikes(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim;
        char      arg1[MAX_INPUT_LENGTH];
        char      arg2[MAX_INPUT_LENGTH];
        char      buf[MAX_STRING_LENGTH];
        int       cost = 0;
        int       spikes = 0;
        int       urin = 0;
        int       urin_counter = 0;
        int       dam;

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

        if (IS_NPC(ch))
                return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT3))
        {
                send_to_char("#0You need combat three for this.#n\n\r", ch);
                return;
        }


        if (arg1[0] == '\0' && arg2[0] == '\0')
        {
                stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch);
                printf(buf, "    #gY#Gou have #Y%d #Gspikes!#n\n\r",
                        ch->pcdata->stats[DRACONIAN_SPIKES]);
                stc(buf, ch);
                stc("#R+#Y------#G------#g---#G------#Y------#R+#n\n\r", ch);
                return;
        }

        if (!str_cmp(arg1, "release"))
        {
                if (ch->fighting == NULL)
                {
                        stc("Not unless fighting!\n\r", ch);
                        return;
                }

                if (ch->pcdata->stats[DRACONIAN_SPIKES] < 1)
                {
                        stc("You have no spikes to shoot!\n\r", ch);
                        return;
                }
                victim = ch->fighting;
                dam = number_range(ch->pcdata->stats[DRACONIAN_SPIKES] * 20,
                                   ch->pcdata->stats[DRACONIAN_SPIKES] * 40);

                printf(buf,
                        "#GYour spikes shoot from your body, #Rimpaling #y$N!  #0[#R%d#0]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_CHAR);
                printf(buf,
                        "#GA plethora of sharp spikes shoot from #y$n's #Gbody, #Rimpaling #Gyou!  #0[#R%d#0]#n",
                        dam);
                act(buf, ch, NULL, victim, TO_VICT);
                act("#g$n #Gshoots a plethora of sharp spikes from $s body at #y$N, #Rimpaling #Gthem!#n", ch, NULL, victim, TO_NOTVICT);

                hurt_person(ch, victim, dam);
                ch->pcdata->stats[DRACONIAN_SPIKES] = 0;
                return;
        }

        else if (!str_cmp(arg1, "grow"))
        {
                if (arg2[0] == '\0')
                {
                        stc("#gSyntax: #Gspikes grow <amount>#n\n\r", ch);
                        return;
                }

                if (ch->position <= POS_FIGHTING)
                {
                        stc("You must be idle and standing to do this!\n\r",
                            ch);
                        return;
                }

                if (ch->fight_timer > 0)
                {
                        stc("Not with a fight timer!\n\r", ch);
                        return;
                }

                if (arg2[0] == '\0')
                {
                        stc("#GHow many spikes do you wish to grow?#n\n\r",
                            ch);
                        return;
                }

                if (!is_number(arg2))
                {
                        stc("Please enter a numeric value between 1 and 200!\n\r", ch);
                        return;
                }

                if (ch->pcdata->stats[DRACONIAN_SPIKES] >= 200)
                {
                        stc("You cannot grow any more spikes!\n\r", ch);
                        return;
                }

                if (is_number(arg2))
                {

                        spikes = atoi(arg2);

                        cost = spikes * 10000;

                        if (spikes > 200 || spikes < 1)
                        {
                                stc("Please enter a numeric value between 1 and 200!\n\r", ch);
                                return;
                        }

                        for (urin = 0; urin < spikes; urin++)
                        {
                                if (ch->exp >= 10000
                                    && ch->pcdata->stats[DRACONIAN_SPIKES] <
                                    200)
                                {
                                        ch->exp -= 10000;
                                        ch->pcdata->stats[DRACONIAN_SPIKES]++;
                                        urin_counter += 1;
                                }
                        }

                        if (urin_counter == 0)
                        {
                                send_to_char
                                        ("You need more exp to gain any more spikes.\n\r",
                                         ch);
                        }
                        if (urin_counter == 1)
                        {
                                send_to_char("#GYou gain #y1 #Gspike.#n\n\r",
                                             ch);
                        }
                        if (urin_counter > 1)
                        {
                                printf(buf,
                                        "#GYou gain #y%d #Gspikes.#n\n\r",
                                        urin_counter);
                                send_to_char(buf, ch);
                        }
                        return;
                }


        }
        else
        {
                stc("Syntax: spikes grow <amount>\n\r", ch);
                stc("        spikes release\n\r", ch);
                stc("        spikes\n\r", ch);
                return;
        }
}



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

  char buf[MAX_STRING_LENGTH];
  int damage;
  int damage2;
  int oldl;
  CHAR_DATA *victim;

  if (IS_NPC (ch))
    return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT4))
        {
                send_to_char("#0You need combat four for this.#n\n\r", ch);
                return;
        }

  if (ch->fighting == NULL || IS_NPC ((victim = ch->fighting)))
    {
      stc ("Only against players in combat!\n\r", ch);
      return;
    }
  if (number_range (1,4) == 1)
    {
      stc ("You failed!\n\r", ch);
      WAIT_STATE (ch, 12);
      return;
    }
  damage = number_range (1000, 5000);
  ch->hit -= damage;
  damage2 = damage *2;
  victim->hit -= damage2;
  sprintf (buf,
	   "You burst into a pile of bones as your enemy attacks to avoid them! [#R%d#n]\n\r",
	   damage);
  stc (buf, ch);
  sprintf (buf,
	   "%s bursts into a pile of bones from your attack! [#7%d#n]\n\r",
	   ch->pcdata->switchname, damage2);
  stc (buf, victim);
  hurt_person (ch, ch, damage);
  hurt_person (ch, victim, damage);
  oldl = ch->level;
  ch->level = 12;
  do_peace (ch, "");
  ch->level = oldl;
  WAIT_STATE (ch, 10);
  WAIT_STATE (victim, 20);

}


void do_desanc (CHAR_DATA *ch, char *argument)
{
  char arg[MAX_STRING_LENGTH];
  CHAR_DATA *victim;
  int sn, random, level;

  argument=one_argument(argument,arg);
  level = ch->spl[RED_MAGIC]/4;

  if (IS_NPC(ch)) return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT4))
        {
                send_to_char("#0You need combat four for this.#n\n\r", ch);
                return;
        }

  if (ch->mana < 1500)
  {
    send_to_char("You need more mana.\n\r",ch);
    return;
  }
  if (arg[0] == '\0' && ch->fighting != NULL) victim = ch->fighting;
  else if ((victim = get_char_room(ch, arg)) == NULL)
  {
    send_to_char("They are not here.\n\r", ch );
    return;
  }
  if(is_safe(ch, victim)) return;

  random = number_range(1,3);
  if (random == 1) sn = skill_lookup("desanct");
  else if (random >= 2) 
  {
    send_to_char("Failed.\n\r",ch);
    return;
  }

//    do_force(ch,"all save");

  else sn = 0;
  if (sn  > 0) (*skill_table[sn].spell_fun) (sn,level,ch,victim);
  ch->mana -= 1500;
  WAIT_STATE(ch,8);
  return;
}


void do_shouldercharge( CHAR_DATA *ch, char *argument )
{
  char arg[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  CHAR_DATA *victim;
  OBJ_DATA *obj;
  
  argument = one_argument( argument, arg );
  argument = one_argument( argument, arg2 );
  if (IS_NPC(ch)) return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT2))
        {
                send_to_char("You need combat two for this.\n\r", ch);
                return;
        }

    if (!(arg2[0] == '\0') || ch->fighting != NULL)
    {
      if (arg2[0] == '\0') victim = ch->fighting;
      else if ((victim = get_char_room(ch, arg2)) == NULL)
      {
        send_to_char("They are not here.\n\r", ch );
        return;
      }
}
      if (is_safe(ch, victim)) return;
  act("You take a step back, then launch yourself straight at $N...",ch,NULL,victim,TO_CHAR);
  act("$n takes a step back, then launches $mself straight at you...",ch,NULL,victim,TO_VICT);
  act("$n takes a step back, then launches $mself straight at $N...",ch,NULL,victim,TO_NOTVICT);
  if ( number_range(1,4) == 4 )
  {
    act("$N sidesteps, leaving you wide open!",ch,NULL,victim,TO_CHAR);
    act("You sidestep, leaving $n wide open!",ch,NULL,victim,TO_VICT);
    act("$N sidesteps, leaving $n wide open!",ch,NULL,victim,TO_NOTVICT);
    if ( number_range(1,2) == 1 )
    {
      act("$N takes the opportunity to strike back!",ch,NULL,victim,TO_CHAR);
      act("You take the opportunity to strike back!",ch,NULL,victim,TO_VICT);
      act("$N takes the opportunity to strike back!",ch,NULL,victim,TO_NOTVICT);
      multi_hit(victim,ch,TYPE_UNDEFINED);
    }
    else
    {
      act("You recover yourself before $N can strike back.",ch,NULL,victim,TO_CHAR);
      act("$n recovers $mself before you can strike back.",ch,NULL,victim,TO_VICT);
      act("$n recovers $mself before $N can strike back.",ch,NULL,victim,TO_NOTVICT);
    }
    return;
  }
  if ( number_range(1,4) == 4 )
  {
      if ( IS_LEG_L(victim,LOST_LEG) && IS_LEG_R(victim,LOST_LEG) )
      {
	act("Your body hits nothing but air.",ch,NULL,victim,TO_CHAR);
	act("$n hits nothing but air.",ch,NULL,victim,TO_ROOM);
	return;
      }
      act("You collide with $N, tearing away $S legs.",ch,NULL,victim,TO_CHAR);
      act("$n collides with you, tearing away your legs.",ch,NULL,victim,TO_VICT);
      act("$n collides with $N, tearing away $S legs.",ch,NULL,victim,TO_NOTVICT);
      if ( !IS_LEG_L(victim,LOST_LEG) )
      {
	SET_BIT(victim->loc_hp[4], LOST_LEG);
	if ( IS_BLEEDING(victim, BLEEDING_LEG_L) ) REMOVE_BIT(victim->loc_hp[6], BLEEDING_LEG_L);
	if ( IS_BLEEDING(victim, BLEEDING_FOOT_L) ) REMOVE_BIT(victim->loc_hp[6], BLEEDING_FOOT_L);
      }
      if ( !IS_LEG_R(victim,LOST_LEG) )
      {
	SET_BIT(victim->loc_hp[5], LOST_LEG);
	if ( IS_BLEEDING(victim, BLEEDING_LEG_R) ) REMOVE_BIT(victim->loc_hp[6], BLEEDING_LEG_R);
	if ( IS_BLEEDING(victim, BLEEDING_FOOT_R) ) REMOVE_BIT(victim->loc_hp[6], BLEEDING_FOOT_R);
      }
      if ( (obj = get_eq_char(victim,WEAR_LEGS)) != NULL ) take_item(victim,obj);
      if ( (obj = get_eq_char(victim,WEAR_FEET)) != NULL ) take_item(victim,obj);
  }

    else
    {
      send_to_char("Bash whom?\n\r",ch);
      return;
    }
      WAIT_STATE(victim, 24);
      WAIT_STATE(ch, 18);
      return;
    }




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

        argument = one_argument(argument, arg1);

        if (IS_NPC(ch))
                return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT2))
        {
                send_to_char("You need combat two for this.\n\r", ch);
                return;
        }
        if (ch->in_room != NULL)
        {
                if (IS_SET(ch->in_room->room_flags, ROOM_SAFE))
                {
                        send_to_char
                                ("You cannot use this power in a safe room.\n\r",
                                 ch);
                        return;
                }
        }


        if (arg1[0] == '\0')
        {
                send_to_char("Bomb who?\n\r", ch);
                return;
        }

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

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

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

        if (ch->move < 500)
        {
                send_to_char("You don't have enough movement points.\n\r",
                             ch);
                return;
        }

        if (victim->in_room == ch->in_room)
        {
                act("You toss your bomb onto the floor and put $N to sleep.",
                    ch, NULL, victim, TO_CHAR);
                act("$n tosses a bomb onto the floor.  You feel sleepy.", ch,
                    NULL, victim, TO_VICT);
                victim->position = POS_SLEEPING;
                ch->move -= 500;
                WAIT_STATE(ch, 1);
                return;
        }

        return;
}



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

        if (!IS_SPHERE(ch, SPHERE_COMBAT1))
        {
                send_to_char("You need combat one for superior hideing.\n\r", ch);
                return;
        }

        if (ch->move < 500)
        {
                send_to_char
                        ("You don't have 500 move to activate your power.\n\r",
                         ch);
                return;
        }

        if (ch->fight_timer > 0)
        {
                send_to_char("Not until your fight timer expires.\n\r", ch);
                return;
        }

        if (IS_SET(ch->act, AFF_HIDE))
        {
                REMOVE_BIT(ch->act, AFF_HIDE);
                act("$n appears from the shadows.", ch, NULL, NULL, TO_ROOM);
                send_to_char("You appear from the shadows.\n\r", ch);
        }
        else
        {
                act("$n disappears into the shadows.", ch, NULL, NULL,
                    TO_ROOM);
                send_to_char("You disappear into the shadows.\n\r", ch);
                ch->move -= 500;
                SET_BIT(ch->act, AFF_HIDE);
        }
        return;
}



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

	if (IS_NPC(ch)) return;

        if (!IS_SPHERE(ch, SPHERE_COMBAT1))
        {
                stc("You need the combat 1 sphere for this.\n\r", ch);
                return;
        }

	if (IS_VAMPAFF(ch, VAM_CLAWS)) 
	{
	send_to_char("You remove the IronClaws from your wrists.\n\r", ch );
	REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
	return;
	}
	else
	{
	send_to_char("You attach IronClaws to your wrists.\n\r", ch );
	SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_CLAWS);
	return;
	}
}


void do_leech(CHAR_DATA * ch, char *argument)
{
        CHAR_DATA *victim = NULL;
        char      buf[MAX_STRING_LENGTH];

	if (!IS_SPHERE(ch, SPHERE_COMBAT1))
	{
	        stc("You need the combat 1 sphere for this.\n\r", ch);
                return;
	}
        if (argument[0] == '\0')
        {
                stc("Who's life do you wish to leech off of?\n\r", ch);
                return;
        }

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

        if (is_safe(ch, victim))
                return;

        WAIT_STATE(ch, 10);

        act("$n stares intently at $N.", ch, NULL, victim, TO_NOTVICT);
        act("You stare intently at $N.", ch, NULL, victim, TO_CHAR);
        act("$n stares intently at you.", ch, NULL, victim, TO_VICT);

        if (victim->hit >= 1000)
        {
                sh_int    power;
                sh_int    dam;

                power = 20;
                dam = dice(power, power * 2);
                if (dam > 300)
                        dam = 300 + (dam / 10);
                hurt_person(ch, victim, dam);
                ch->hit += dam;
                if (ch->hit >= ch->max_hit + 500)
                        ch->hit = ch->max_hit + 500;
                printf(buf, "#RYou absorb %d hitpoints.#n\n\r", dam);
                stc(buf, ch);
                printf(buf, "#R%s absorbed %d of your hitpoints!#n\n\r",
                        ch->name, dam);
                stc(buf, victim);
        }
        else
                stc("Nothing seemed to happen.\n\r", ch);
        return;

}

/* you really must take a look at this Jobo */
void do_entomb(CHAR_DATA * ch, char *argument)
{
        char      buf[MAX_STRING_LENGTH];
        OBJ_DATA *obj = NULL;
        OBJ_DATA *objc;

        if (!IS_SPHERE(ch, SPHERE_COMBAT3))
        {
                stc("You need the combat 3 sphere for this.\n\r", ch);
                return;
        }

        if (ch->in_room->sector_type == SECT_AIR)
        {
                send_to_char("This ability cannot be used in the air.\n\r",
                             ch);
                return;
        }

        if (!TIME_UP(ch, TIMER_ENTOMB) && ch->level < 12)
        {
                send_to_char
                        ("This ability can only be used once every 12 hours.\n\r",
                         ch);
                return;
        }

        if ((objc = get_obj_list(ch, "walln", ch->in_room->contents)) != NULL)
                objc = NULL;
        else
        {
                obj = create_object(get_obj_index(30043), 0);
                printf(buf,
                        "A wall of ice is here, blocking your exit north.");
                free_string(obj->description);
                obj->description = str_dup(buf);
                obj_to_room(obj, ch->in_room);
                obj->timer = 5;
                obj->item_type = ITEM_WALL;
        }
        if ((objc = get_obj_list(ch, "walls", ch->in_room->contents)) != NULL)
                objc = NULL;
        else
        {
                obj = create_object(get_obj_index(30044), 0);
                printf(buf,
                        "A wall of ice is here, blocking your exit south.");
                free_string(obj->description);
                obj->description = str_dup(buf);
                obj_to_room(obj, ch->in_room);
                obj->timer = 5;
                obj->item_type = ITEM_WALL;
        }
        if ((objc = get_obj_list(ch, "walle", ch->in_room->contents)) != NULL)
                objc = NULL;
        else
        {
                obj = create_object(get_obj_index(30045), 0);
                printf(buf,
                        "A wall of ice is here, blocking your exit east.");
                free_string(obj->description);
                obj->description = str_dup(buf);
                obj_to_room(obj, ch->in_room);
                obj->timer = 5;
                obj->item_type = ITEM_WALL;
        }
        if ((objc = get_obj_list(ch, "wallw", ch->in_room->contents)) != NULL)
                objc = NULL;
        else
        {
                obj = create_object(get_obj_index(30046), 0);
                printf(buf,
                        "A wall of ice is here, blocking your exit west.");
                free_string(obj->description);
                obj->description = str_dup(buf);
                obj_to_room(obj, ch->in_room);
                obj->timer = 5;
                obj->item_type = ITEM_WALL;
        }

        ch->hit += ch->max_hit * 0.1;
        if (ch->hit > ch->max_hit)
                ch->hit = ch->max_hit;
        SET_TIMER(ch, TIMER_ENTOMB, 12);

        act("$n calls forth sheets of ice, blocking your path in every direction.", ch, NULL, NULL, TO_ROOM);
        send_to_char("You call forth sheets of ice to entrap your prey.\n\r",
                     ch);
        send_to_char("You grin wickedly.\n\r", ch);
        do_say(ch, "Prepare to die! Muahahahaha.");
        WAIT_STATE(ch, 10);
        return;
}



void do_bladejump(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_SPHERE(ch, SPHERE_COMBAT1))
        {
                stc("You need combat one for this.\n\r",ch);
                return;
        }

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

        if ((victim = get_char_world(ch, arg)) == NULL)
        {
                send_to_char("You cannot find them.\n\r", ch);
                return;
        }

        if (ch->move < 1000)
        {
                stc("You don't have enough movement points to bladejump to them.\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(ch->in_room->room_flags, ROOM_ASTRAL))
        {
                stc("Your body can't go there.\n\r", ch);
                return;
        }
        if (IS_SET(victim->act, ACT_NOTRAVEL))
        {
                send_to_char("No Can Do.\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) && ch->move < victim->max_move)
        {
                if (!IS_NPC(victim) && !IS_IMMUNE(victim, IMM_SUMMON))
                {
                        send_to_char("They are hiding from you.\n\r", ch);
                        return;
                }
                else
                        send_to_char
                                ("You need more move than you're opponent.\n\r",
                                 ch);
        }
        if (victim->in_room == ch->in_room)
        {
                send_to_char("But you're already there!\n\r", ch);
                return;
        }

        act("You jump into the clouds", ch, NULL, victim, TO_CHAR);
        act("$n jumps into the clouds", ch, NULL, victim, TO_ROOM);
        char_from_room(ch);
        char_to_room(ch, victim->in_room);
        ch->move -= 1000;
        act("$n jumps out of the clouds and lands infront of $N.", ch, NULL,
            victim, TO_NOTVICT);
        act("$n jumps out of the clouds and lands infront of you.", ch, NULL,
            victim, TO_VICT);
        do_look(ch, "auto");
        return;
}



void do_superberserk(CHAR_DATA *ch, char *argument)
{
  char arg [MAX_INPUT_LENGTH];
  CHAR_DATA *vch;
  CHAR_DATA *vch_next;

  argument = one_argument( argument, arg );
  if (IS_NPC(ch)) return;
  if ( ch->level < skill_table[gsn_berserk].skill_level)
  {
    send_to_char( "You are not wild enough to go berserk.\n\r", ch );
    return;
  }

  WAIT_STATE( ch, 6);
  if ( number_percent( ) > ch->pcdata->learned[gsn_berserk] )
  {
    act("You rant and rave, but nothing much happens.",ch,NULL,NULL,TO_CHAR);
    act("$n gets a wild look in $s eyes, but nothing much happens.",ch,NULL,NULL,TO_ROOM);
    return;
  }
	if (!IS_SPHERE(ch, SPHERE_COMBAT2))
	{
                stc("You need combat one for this.\n\r",ch);
                return;
        }


  act("#0You Roar with Rage and #7B#wE#7R#wS#7E#wR#7K#0 into a Barbarian style Frenzy.#n",ch,NULL,NULL,TO_CHAR);
  act("#0$n Roars with Rage and #7B#wE#7R#wS#7E#wR#7K#wS#0 into a Barbarian style Frenzy!#n",ch,NULL,NULL,TO_ROOM);
        for (vch = char_list; vch != NULL; vch = vch_next)
        {
                vch_next = vch->next;
                if (vch->in_room == NULL)
                        continue;
                if (!IS_NPC(vch)) continue;
                if (ch == vch)
                {
                        act("You throw back your head and howl with rage!",
                            ch, NULL, NULL, TO_CHAR);
                        continue;
                }
                if (!IS_NPC(vch) && vch->pcdata->chobj != NULL)
                        continue;
                if (!IS_NPC(vch))
                {
//                        if (vch->in_room == ch->in_room)
                        if (vch->in_room->area == ch->in_room->area)
                                send_to_char
                                        ("You hear a Warcry close by!\n\r",
                                         vch);
                        else if (!CAN_PK(vch))
                                continue;
                }
                if (vch->in_room == ch->in_room && can_see(ch, vch))
                {
                        multi_hit(ch, vch, TYPE_UNDEFINED);
                        if (vch == NULL || vch->position <= POS_STUNNED)
                                continue;
                        multi_hit(ch, vch, TYPE_UNDEFINED);
                }
        }
return;
}



