SC/finger/
SC/notes/
SC/player/s/
/* Original by Alathon */



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


void do_rage( CHAR_DATA *ch, char *argument )
{
  int gain, gain2;

  if (IS_NPC(ch))
    return;

  if ( ch->class != CLASS_SAIYAN )
    return;

  if ( ch->pcdata->powers[S_POWER] >= ch->pcdata->powers[S_POWER_MAX] )
  { send_to_char( "You are already at full power!\n\r", ch );
    return;
  }

  gain = dice(ch->pcdata->body,ch->pcdata->spirit/2) + ch->pcdata->powers[S_POWER_MAX]/100;

  gain2 = isquare( gain );

  if ( ch->move <= UMIN(gain/10,1000) )
  { send_to_char( "Your body is too exhausted for you to power up.\n\r", ch );
    return;
  }

  act( "As your rage builds, your inner power increases!", ch, NULL, NULL, TO_CHAR );
  act( "$n screams with rage, and $s body ripples with power!", ch, NULL, NULL, TO_ROOM );
  ch->pcdata->powers[S_POWER] = UMIN( ch->pcdata->powers[S_POWER] + gain,
  					ch->pcdata->powers[S_POWER_MAX]);
  ch->pcdata->powers[S_SPEED] = UMIN( ch->pcdata->powers[S_SPEED] + gain2,
  					ch->pcdata->powers[S_SPEED_MAX]);
  ch->pcdata->powers[S_STRENGTH] = UMIN( ch->pcdata->powers[S_STRENGTH] + gain2,
					ch->pcdata->powers[S_STRENGTH_MAX] );
  ch->pcdata->powers[S_AEGIS] = UMIN( ch->pcdata->powers[S_AEGIS] + gain2,
  					ch->pcdata->powers[S_AEGIS_MAX]);
  ch->move -= UMIN( gain / 10, 1000 );
  WAIT_STATE( ch, 4 );

  return;
}

void do_focus( CHAR_DATA *ch, char *argument )
{
  char arg[MAX_INPUT_LENGTH];
  char arg2[MAX_INPUT_LENGTH];
  char buf[MAX_STRING_LENGTH];
  int increase;
 
  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Huh?\n\r", ch );
    return;
  }

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

  if ( arg[0] == '\0' || arg[1] == '\0' )
  { send_to_char( "You must specify what ability you wish to focus, and how much power.\n\r", ch );
    return;
  }

  increase = is_number( arg2 ) ? atoi( arg2 ) : 0;
  if ( increase == 0 )
  { send_to_char( "How much power do you want to focus?\n\r", ch );
    return;
  }

  if ( increase < 0 )
  { send_to_char( "Uhhhh why?\n\r", ch );
    return;
  }
  if ( increase >= ch->pcdata->powers[S_POWER] )
  { send_to_char( "You don't have that much power.\n\r", ch );
    return;
  }

  if ( !str_prefix( arg, "strength" ) )
  { ch->pcdata->powers[S_STRENGTH] = UMIN( ch->pcdata->powers[S_STRENGTH] + increase,
					ch->pcdata->powers[S_STRENGTH_MAX] );
    act( "$n's muscles bulge with strength.", ch, NULL, NULL, TO_ROOM );
  }
  else if ( !str_prefix( arg, "speed" ) )
  { ch->pcdata->powers[S_SPEED] = UMIN( ch->pcdata->powers[S_SPEED] + increase,
					ch->pcdata->powers[S_SPEED_MAX] );
    act( "$n blurs as their movements speed up.", ch, NULL, NULL, TO_ROOM );
  }
  else if ( !str_prefix( arg, "aegis" ) )
  { ch->pcdata->powers[S_AEGIS] = UMIN( ch->pcdata->powers[S_AEGIS] + increase,
					ch->pcdata->powers[S_AEGIS_MAX] );
    act( "The aegis around $n flares with renewed energy.", ch, NULL, NULL, TO_ROOM );
  }
  else
  { send_to_char( "Focus on what?\n\r", ch );
    return;
  }

  ch->pcdata->powers[S_POWER] -= increase;
  sprintf( buf, "You channel %d points of power into your %s.\n\r", increase, arg );
  send_to_char( buf, ch );
  WAIT_STATE( ch, 4 );
  return;
}

void do_technique( CHAR_DATA *ch, char *argument )
{
  int cost = 0;
  int skill;
  char buf[MAX_STRING_LENGTH];
  char *yes = "x";
  char *no  = " ";
  char name[20];

  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuuh what?\n\r", ch );
    return;
  }

  if ( argument[0] == '\0' )
  { send_to_char( "\n\rSaiyans can learn the following techniques:\n", ch );
    send_to_char( "Kiwave      Kibomb      Kibolt      Kiblast     Kiwall\n", ch );
    send_to_char( "Kikouhou    Masenkou    Kamehameha  Solarflare  Ryuken\n", ch );
    send_to_char( "Zanzouken   Kaiouken    Flight      Kisense     Battlesense\n", ch );
    send_to_char( "Hawkeyes    Shunkanidou Kiaihou\n\r", ch );
    send_to_char( "Enter 'technique <tech>' to learn one, i.e. 'technique kibolt'\n\r", ch );
    send_to_char( "Enter 'technique learned' to see which battle skills you have mastered.\n\r", ch );
    send_to_char( "Enter 'techinque cost' to see their costs in primal.\n\r", ch );
    return;
  }

  if ( !str_cmp( argument, "kiwave" ) )
  { skill	= S_KIWAVE;
    cost	= 50;
    sprintf( name, "Ki Wave" );
  }
  else if ( !str_cmp( argument, "kibomb" ) )
  { skill	= S_KIBOMB;
    cost	= 50;
    sprintf( name, "Ki Bomb" );
  }
  else if ( !str_cmp( argument, "kibolt" ) )
  { skill	= S_KIBOLT;
    cost	= 50;
    sprintf( name, "Ki Bolt" );
  }
  else if ( !str_cmp( argument, "kiblast" ) )
  { skill	= S_KIBLAST;
    cost	= 25;
    sprintf( name, "Ki Blast" );
  }
  else if ( !str_cmp( argument, "kiwall" ) )
  { skill	= S_KIWALL;
    cost	= 75;
    sprintf( name, "Ki Wall" );
  }
  else if ( !str_cmp( argument, "kikouhou" ) )
  { skill	= S_KIKOUHOU;
    cost	= 100;
    sprintf( name, "Kikouhou" );
  }
  else if ( !str_cmp( argument, "masenkouha" ) )
  { skill	= S_MASENKOUHA;
    cost	= 125;
    sprintf( name, "Masenkou Ha" );
  }
  else if ( !str_cmp( argument, "kamehameha" ) )
  { skill	= S_KAMEHAMEHA;
    cost	= 200;
    sprintf( name, "Kame Hame Ha" );
  }
  else if ( !str_cmp( argument, "solarflare" ) )
  { skill	= S_SOLARFIST;
    cost	= 100;
    sprintf( name, "Solar Flare" );
  }
  else if ( !str_cmp( argument, "ryuken" ) )
  { skill	= S_RYUKEN;
    cost	= 150;
    sprintf( name, "Ryuken" );
  }
  else if ( !str_cmp( argument, "zanzouken" ) )
  { skill	= S_ZANZOUKEN;
    cost	= 100;
    sprintf( name, "Zanzouken" );
  }
  else if ( !str_cmp( argument, "kaiouken" ) )
  { skill	= S_KAIOUKEN;
    cost	= 200;
    sprintf( name, "Kaiouken" );
  }
  else if ( !str_cmp( argument, "flight" ) )
  { skill	= S_FLIGHT;
    cost	= 50;
    sprintf( name, "Flight" );
  }
  else if ( !str_cmp( argument, "kisense" ) )
  { skill	= S_KISENSE;
    cost	= 100;
    sprintf( name, "Ki Sense" );
  }
  else if ( !str_cmp( argument, "battlesense" ) )
  { skill	= S_BATTLESENSE;
    cost	= 75;
    sprintf( name, "Battlesense" );
  }
  else if ( !str_cmp( argument, "shunkanidou" ) )
  { skill	= S_KIMOVE;
    cost	= 125;
    sprintf( name, "Shunkan Idou" );
  }
  else if ( !str_cmp( argument, "hawkeyes" ) )
  { skill	= S_HAWKEYES;
    cost	= 50;
    sprintf( name, "Hawk Eyes" );
  }
  else if ( !str_cmp( argument, "kiaihou" ) )
  { skill	= S_KIAIHOU;
    cost	= 200;
    sprintf( name, "Kiaihou" );
  }
  else if ( !str_cmp( argument, "cost" ) )
  { send_to_char( "\n\rThese are the costs of developing Saiyan combat techniques, in primal.\n", ch );
    send_to_char( "Ki Wave      50  Ki Bomb     50  Ki Bolt     50  Ki Blast    25  Ki Wall     75\n", ch );
    send_to_char( "Kikouhou    100  Masenkou   125  Kamehameha 200  Solarflare 100  Ryuken     150\n", ch );
    send_to_char( "Zanzouken   100  Kaiouken   200  Flight      50  Ki Sense   100  Bat. Sense  75\n", ch );
    send_to_char( "ShunkanIdou 125  Hawkeyes    50  Kiaihou    200\n\r", ch );
    return;
  }
  else if ( !str_cmp( argument, "learned" ) )
  { send_to_char( "\n\r\n\rSaiyan battle techniques learned:\n", ch );
    sprintf( buf, "Ki Wave    [%s]  Ki Bomb    [%s]  Ki Bolt    [%s]  Ki Blast  [%s]  Ki Wall    [%s]\n",
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIWAVE) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIBOMB) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIBOLT) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIBLAST) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIWALL) ? yes : no) );
    send_to_char( buf, ch );
    sprintf( buf, "Kikouhou   [%s]  Masenkouha [%s]  Kamehameha [%s]  Solarflar [%s]  Ryuken     [%s]\n",
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIKOUHOU) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_MASENKOUHA) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KAMEHAMEHA) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_SOLARFIST) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_RYUKEN) ? yes : no) );
    send_to_char( buf, ch );
    sprintf( buf, "Zanzouken  [%s]  Kaiouken   [%s]  Flight     [%s]  Ki Sense  [%s]  Bat. Sense [%s]\n",
	(IS_SET(ch->pcdata->powers[S_TECH], S_ZANZOUKEN) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KAIOUKEN) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_FLIGHT) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KISENSE) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_BATTLESENSE) ? yes : no) );
    send_to_char( buf, ch );
    sprintf( buf, "Shunkan I. [%s]  Hawkeyes   [%s]  Kiaihou    [%s]\n\r",
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIMOVE) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_HAWKEYES) ? yes : no),
	(IS_SET(ch->pcdata->powers[S_TECH], S_KIAIHOU) ? yes : no) );
    send_to_char( buf, ch ); 
    return;
  }
  else
  { send_to_char( "That is not a Saiyan battle technique.\n\r", ch );
    return;
  }


  if ( ch->pcdata->primal < cost )
  { sprintf( buf, "The %s technique requires %d primal to learn.\n\r", name, cost );
    send_to_char( buf, ch );
    return;
  }

  if ( IS_SET( ch->pcdata->powers[S_TECH], skill ) )
  { sprintf( buf, "You have already mastered the %s technique.\n\r", name );
    send_to_char( buf, ch );
    return;
  }
  
  ch->pcdata->primal -= cost;
  sprintf( buf, "You have now mastered the %s technique.\n\r", name );
  send_to_char( buf, ch );
  SET_BIT( ch->pcdata->powers[S_TECH], skill );
  return;
  
}


void do_kiblast( CHAR_DATA *ch, char *argument )
{
  int dam;
  CHAR_DATA *victim;

  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?", ch );
    return;
  }

  if ( !IS_SET( ch->pcdata->powers[S_TECH], S_KIBLAST ) )
  { send_to_char( "You don't know that technique.\n\r", ch );
    return;
  }

  if ( ch->pcdata->powers[S_POWER] <= 500 )
  { send_to_char( "You need 500 points of power to use the Ki blast technique.\n\r", ch );
    return;
  }

  if ( argument[0] == '\0' && ch->fighting == NULL )
  {
    send_to_char( "Blast who?\n\r", ch );
    return;
  }

  if ( ch->fighting != NULL && argument[0] == '\0' )
    victim = ch->fighting;
  else if ( ( victim = get_char_room( ch, argument ) )== NULL )
  {
    send_to_char( "They aren't here.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }

  dam = dice( 7, ch->pcdata->spirit * 5 );
  act( "You blast $N with energy!", ch, NULL, victim, TO_CHAR );
  act( "$n blasts you with energy!", ch, NULL, victim, TO_VICT );
  act( "$n blasts $N with energy.", ch, NULL, victim, TO_NOTVICT );
  damage( ch, victim, dam, DAM_KIFLAME );
  ch->pcdata->powers[S_POWER] -= 500;
  WAIT_STATE( ch, 5 );
  return;
}

void do_kibolt( CHAR_DATA *ch, char *argument )
{
  int dam;
  CHAR_DATA *victim;

  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?", ch );
    return;
  }

  if ( !IS_SET( ch->pcdata->powers[S_TECH], S_KIBOLT ) )
  { send_to_char( "You don't know that technique.\n\r", ch );
    return;
  }

  if ( ch->pcdata->powers[S_POWER] <= 2000 )
  { send_to_char( "You need 2000 points of power to use the Ki bolt technique.\n\r", ch );
    return;
  }

  if ( argument[0] == '\0' && ch->fighting == NULL )
  { send_to_char( "Bolt who?\n\r", ch );
    return;
  }

  if ( ch->fighting != NULL && argument[0] == '\0' )
    victim = ch->fighting;
  else if ( ( victim = get_char_room( ch, argument ) ) == NULL )
  {
    send_to_char( "They aren't here.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }

  ch->pcdata->powers[S_POWER] -= 2000;
  dam = dice( ch->pcdata->spirit / 7, ch->pcdata->spirit * 5 );
  act( "You fire a concentrated bolt of energy at $N.", ch, NULL, victim, TO_CHAR );
  act( "$n fires a concentrated bolt of energy at you!", ch, NULL, victim, TO_VICT );
  act( "$n fires a concentrated bolt of energy at $N.", ch, NULL, victim, TO_NOTVICT );
  damage( ch, victim, dam, DAM_KIFLAME );
  WAIT_STATE( ch, 8 );
  return;
}


void do_kibomb( CHAR_DATA *ch, char *argument )
{
  int dam;
  CHAR_DATA *vch;
  CHAR_DATA *vch_next;

  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?", ch );
    return;
  }

  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KIBOMB) )
  { send_to_char( "You don't know that technique.\n\r", ch );
    return;
  }

  if ( ch->pcdata->powers[S_POWER] <= 2000 )
  { send_to_char( "You need 2000 points of power to use the Ki bomb technique.\n\r", ch );
    return;
  }

  act( "You spread your arms and release an explosion of energy!", ch, NULL, NULL, TO_CHAR );
  act( "$n spreads $s arms and releases an explosion of energy!", 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 ( vch->in_room == ch->in_room )
      if ( vch != ch && !is_same_group( ch, vch ) )
      { dam = dice( 10, ch->pcdata->spirit * 4 );
        damage( ch, vch, dam, DAM_KIFLAME );
      }
  }

  ch->pcdata->powers[S_POWER] -= 2000;
  WAIT_STATE( ch, 8 );
  return;
}

void do_shunkanidou( CHAR_DATA *ch, char *argument )
{
  int vnum;
  CHAR_DATA *victim;

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KIMOVE) )
  { send_to_char( "You don't know that technique.\n\r", ch );
    return;
  }
  if ( argument[0] == '\0' )
  { send_to_char( "Your attempt to move to yourself has failed.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 10000 )
  { send_to_char( "Shunkan Idou requires 10000 points of energy.\n\r", ch );
    return;
  }
  if ( IS_SET(ch->pcdata->actnew,NEW_RETIRED) )
  {
    return;
  }
  if ( IS_SET(ch->in_room->room_flags, ROOM_HQ ) )
  { send_to_char( "You may not teleport from a headquarters.\n\r", ch );
    return;
  }
  if ( ( victim = get_char_world( ch, argument ) ) == NULL )
  { send_to_char( "You cannot sense any such Ki.\n\r", ch );
    return;
  }
  if ( !IS_NPC(victim) )
  { send_to_char( "Their Ki is shielded.\n\r", ch );
    return;
  }
  if ( victim->level > (ch->pcdata->spirit/2) || victim->fighting != NULL
	|| victim->in_room == NULL || !IS_NPC(victim))
  { send_to_char( "You can't get a lock on their Ki.\n\r", ch );
    return;
  }
  if ( ch->pcdata->extras[TIMER] > 0 )
  { send_to_char( "Not with a fight timer.\n\r", ch );
    return;
  }

  vnum = victim->in_room->vnum;
  if ( (vnum >= 8900 && vnum <= 8999)
    || (vnum >= 5300 && vnum <= 5399)
    || (vnum >= 8400 && vnum <= 8599)
    || (vnum >= 8100 && vnum <= 8299) )
    vnum = 5148;

  ch->pcdata->powers[S_POWER] -= 10000;
  act( "You concentrate on $N's location, and will yourself there.", ch, NULL, victim, TO_CHAR );
  act( "$n vanishes into thin air!", ch, NULL, victim, TO_ROOM );
  char_from_room( ch );
  char_to_room( ch, get_room_index( vnum ) );
  act( "$n pops out of thin air!", ch, NULL, victim, TO_ROOM );
  do_look( ch, "auto" );
  WAIT_STATE( ch, 12 );
  return;
}

void do_kisense( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  char buf[MAX_STRING_LENGTH];
  char areaname[MAX_STRING_LENGTH];
  int i;

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KISENSE) )
  { send_to_char( "You have not learned that technique.\n\r", ch );
    return;
  }
  if ( argument[0] == '\0' )
  { send_to_char( "Sense who?\n\r", ch );
    return;
  }
  if ( ( victim = get_char_world( ch, argument ) ) == NULL )
  { send_to_char( "You cannot sense their Ki.\n\r", ch );
    return;
  }
  if ( victim->in_room == NULL )
  { send_to_char( "Their Ki is oddly fuzzy, and you can't lock on to it.\n\r", ch );
    return;
  }

  if ( IS_CLASS(victim,CLASS_PATRYN) && get_runes(victim,RUNE_FIRE,TORSO) > 0
    && victim->level >= 2 && IS_SET(victim->pcdata->powers[P_BITS],P_DEFENSES) )
  { 
    if ( get_runes(victim,RUNE_FIRE,TORSO) == 1 )
      act( "Your tattoos glow with a dull red aura.", victim, NULL, NULL, TO_CHAR );
    else
      act( "Your tattoos glow dull red, as you feel $N's Ki brush against you.", victim, NULL, ch, TO_CHAR );

    act( "$n's tattoos glow with a dull red aura.", victim, NULL, NULL, TO_ROOM );
  }

  /* crummy way to get the "{ 5 15 } Larsen" part outta it */
  for ( i = 16; victim->in_room->area->name[i] != '\0'; i++ )
    areaname[i-16] = victim->in_room->area->name[i];
  areaname[i-16] = '\0';

  sprintf( buf, "\n\rYou locate %s in the vicinity of %s.\n\r", victim->name, areaname );
  send_to_char( buf, ch );
  WAIT_STATE( ch, 8 );
  return;
}

void do_kiwall( CHAR_DATA *ch, char *argument )
{
  AFFECT_DATA af;
  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KIWALL ) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 2500 )
  { send_to_char( "It takes 2500 points of energy to raise a wall of Ki.\n\r", ch );
    return;
  }

  act( "You raise your arms and bring up a wall of Ki around you.", ch, NULL, NULL, TO_CHAR );
  act( "$n raises a wall of blazing energy around $mself.", ch, NULL, NULL, TO_ROOM );
  ch->pcdata->powers[S_POWER] -= 2500;

  af.type      = gsn_kiwall;
  if ( is_affected( ch, gsn_kiwall ) )
  {
    affect_strip( ch, gsn_kiwall );
    af.duration	= dice(1,3);
  }
  else if ( !str_cmp( ch->name, "Piccolo" ) )
    af.duration	= dice(2,2);
  else
    af.duration = dice(2,4);
  af.modifier  = -1 * ch->pcdata->powers[S_AEGIS] / 50;
  af.location  = APPLY_AC;
  af.bitvector = 0;
  affect_to_char( ch, &af );
  WAIT_STATE( ch, 8 );
  return;
}

void do_kiwave( CHAR_DATA *ch, char *argument )
{
  int dam;
  CHAR_DATA *victim;

  if ( IS_NPC(ch) )
    return;

  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?", ch );
    return;
  }

  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KIWAVE) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }

  if ( ch->pcdata->powers[S_POWER] <= 2000 )
  { send_to_char( "You need 2000 points of power to use the Ki wave technique.\n\r", ch );
    return;
  }

  if ( argument[0] == '\0' && ch->fighting == NULL )
  { 
    send_to_char( "Ki wave who?\n\r", ch );
    return;
  }

  if ( ch->fighting != NULL && argument[0] == '\0')
    victim = ch->fighting;
  else if ( ( victim = get_char_room( ch, argument ) )== NULL )
  {
    send_to_char( "They aren't here.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }

  dam = dice( 5, ch->pcdata->spirit * 7);
  act( "You launch a wave of Ki at $N.", ch, NULL, victim, TO_CHAR );
  act( "$n launches a wave of energy at you!", ch, NULL, victim, TO_VICT );
  act( "$n launches a wave of energy at $N.", ch, NULL, victim, TO_NOTVICT );
  damage( ch, victim, dam, DAM_KIFLAME );
  if ( victim != NULL && !IS_NPC(victim) )
  {
    if ( IS_CLASS(victim,CLASS_FIST) && number_percent() > (victim->pcdata->body/2) )
    { if ( victim->pcdata->powers[F_KI] > 0 )
        victim->pcdata->powers[F_KI] -= dice(2,3)+1;
      if ( IS_SET(victim->pcdata->actnew,NEW_FIGUREEIGHT) )
	REMOVE_BIT(victim->pcdata->actnew,NEW_FIGUREEIGHT);
      act( "Your Ki wave staggers $N!", ch, NULL, victim, TO_CHAR );
      act( "$n's wave of energy breaks your rhythm!", ch, NULL, victim, TO_VICT );
      act( "$n's wave of energy staggers $N.", ch, NULL, victim, TO_NOTVICT );
    }
    else if ( victim->class == CLASS_SAIYAN )
    { if ( is_affected(victim,gsn_kiwall) )
      { affect_strip(victim,gsn_kiwall);
        act( "Your Ki wave staggers $N!", ch, NULL, victim, TO_CHAR );
        act( "$n's wave of energy collapes your wall of Ki!", ch, NULL, victim, TO_VICT );
        act( "$n's wave of energy staggers $N.", ch, NULL, victim, TO_NOTVICT );
      }
    }
    else if ( IS_CLASS(victim,CLASS_SORCERER) )
    {
      act( "Your Ki wave staggers $N!", ch, NULL, victim, TO_CHAR );
      act( "$n's wave of energy disrupts your casting!", ch, NULL, victim, TO_VICT );
      act( "$n's wave of energy staggers $N.", ch, NULL, victim, TO_NOTVICT );
      lose_chant( victim );
    }
    else if ( IS_CLASS(victim,CLASS_MAZOKU) && victim->pcdata->powers[M_CTYPE] != 0 )
    {
      act( "Your Ki wave staggers $N!", ch, NULL, victim, TO_CHAR );
      act( "Stunned, you lose control of your charge!", ch, NULL, victim, TO_VICT );
      act( "$n's wave of energy staggers $N.", ch, NULL, victim, TO_NOTVICT );
      victim->pcdata->powers[M_CTYPE] = 0;
      victim->pcdata->powers[M_CTIME] = 0;
    }

  }
  WAIT_STATE( ch, 8 );
  ch->pcdata->powers[S_POWER] -= 2000;
  return;
}

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

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_MASENKOUHA) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 5000 )
  { send_to_char( "The Masenkou technique requires 5000 points of energy.\n\r", ch );
    return;
  }

  argument = one_argument( argument, arg );

  if ( arg[0] == '\0' && ch->fighting == NULL )
  { send_to_char( "Attack who?\n\r", ch );
    return;
  }
  if ( ch->fighting != NULL && arg[0] == '\0' )
  {
    victim = ch->fighting;
    free_string( ch->pcdata->target );
    one_argument( victim->name, vname );
    ch->pcdata->target = str_dup( vname );
  }
  else if ( (victim = get_char_room(ch, arg)) != NULL )
  {
    free_string( ch->pcdata->target );
    ch->pcdata->target = str_dup( arg );
  }
  else
  {
    send_to_char( "They aren't here.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }
  
  SET_BIT(ch->pcdata->actnew,NEW_MASENKOUHA);
  do_say( ch, "Masenkou.." );
  WAIT_STATE( ch, 9 );
  ch->pcdata->powers[S_POWER] -= 5000;
  return;
}

void do_kikouhou( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  int dam;

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KIKOUHOU) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 5000 )
  { send_to_char( "The Kikouhou technique requires 5000 points of energy.\n\r", ch );
    return;
  }
  if ( argument[0] == '\0' )
  { send_to_char( "Attack who?\n\r", ch );
    return;
  }
  if ( (victim = get_char_area(ch, argument)) == NULL )
  { send_to_char( "They are out of range.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }
  if ( IS_NPC(victim) && victim->level > 95 )
  { send_to_char( "You are unable to target them.\n\r", ch );
    return;
  }
  if ( !IS_NPC(victim) && victim->fighting != NULL && !IS_NPC(victim->fighting) )
  {
    stc( "Don't interfere in other peoples' fights you fuckin' lamer.\n\r", ch );
    WAIT_STATE(ch,20);
    return;
  }

  ch->pcdata->powers[S_POWER] -= 5000;
  if ( ch->pcdata->extras[TIMER] < 16 )
    ch->pcdata->extras[TIMER] = 16;
  dam = dice( ch->pcdata->spirit / 10, ch->pcdata->spirit * 10 );
  do_yell( ch, "Kikouhou!!!" );
  act( "$n launches a tremendous bolt of energy at $N!", ch, NULL, victim, TO_ROOM );
  act( "A tremendous bolt of energy crashes into $n!", victim, NULL, NULL, TO_ROOM );
  act( "A tremendous bolt of energy crashes into you!", victim, NULL, NULL, TO_CHAR );
  damage( ch, victim, dam, DAM_KIFLAME );
  if ( victim != NULL && victim->fighting == ch
  && !(!IS_NPC(victim) && IS_SET(victim->act,PLR_FIREBACK)) )
    stop_fighting( victim, FALSE );
  WAIT_STATE( ch, 20 );
  return;
}

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

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KAMEHAMEHA) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] < 15000 )
  { send_to_char( "The Kame-hame-ha requires 15000 points of energy.\n\r", ch );
    return;
  }
  argument = one_argument( argument, arg );
  if ( arg[0] == '\0' && ch->fighting == NULL )
  { send_to_char( "Attack who?\n\r", ch );
    return;
  }
  if ( ch->fighting != NULL && arg[0] == '\0' )
  {
    victim = ch->fighting;
    free_string( ch->pcdata->target );
    one_argument( victim->name, vname );
    ch->pcdata->target = str_dup( vname );
  }
  else if ( (victim = get_char_room(ch, arg)) != NULL )
  {
    free_string( ch->pcdata->target );
    ch->pcdata->target = str_dup( arg );
  }
  else
  {
    send_to_char( "They aren't here.\n\r", ch );
    WAIT_STATE( ch, 4 );
    return;
  }

  SET_BIT(ch->pcdata->actnew,NEW_KAME_1);
  ch->pcdata->powers[S_POWER] -= 15000;
  do_say( ch, "Kame.." );

  /* damage now done in update.c
  dam = dice( ch->pcdata->spirit*2, ch->pcdata->spirit * 5/4 );
  dam = ch->pcdata->spirit * 115 + dice( 10, ch->pcdata->spirit );
  do_yell( ch, "Kame-hame-HA!!!!" );
  act( "You focus your Ki into a tight beam and release it on $N!", ch, NULL, victim, TO_CHAR );
  act( "$n fires an incandescent bolt of energy at you!!", ch, NULL, victim, TO_VICT );
  act( "$n hurls an incandescent bolt of energy at $N!", ch, NULL, victim, TO_NOTVICT );
  damage( ch, victim, dam, DAM_KIFLAME );
  */
  WAIT_STATE( ch, 16 );
  return;
}

void do_kaiouken( CHAR_DATA *ch, char *argument )
{
  AFFECT_DATA af;

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Duuuuh what?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_KAIOUKEN) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 20000 )
  { send_to_char( "It costs 20000 points of energy to power up the Kaiouken attack.\n\r", ch );
    return;
  }

  do_yell( ch, "Kaiouken Attack!!" );
  act( "You initiate the Kaiouken attack and are encased in crimson flame!", ch, NULL, NULL, TO_CHAR );
  act( "`R$n bursts into crimson flame!`n", ch, NULL, NULL, TO_ROOM );
  ch->pcdata->powers[S_POWER] -= 20000;
  af.type      = gsn_kaiouken;
  af.duration  = 1;
  af.location  = APPLY_NONE;
  af.modifier  = 0;
  af.bitvector = 0;
  affect_to_char( ch, &af );
  WAIT_STATE( ch, 12 );
  return;
}

void do_solarflare( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  int sn, lev;

  if ( IS_NPC(ch) || ch->level < 2 )
    return;
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_SOLARFIST) )
  { send_to_char( "You have not learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] < 2500 )
  { send_to_char( "You need 2500 fighting power to use the Solarflare technique.\n\r", ch );
    return;
  }
  if ( argument[0] == '\0' )
  { send_to_char( "Solarflare who?\n\r", ch );
    return;
  }
  if ( ( victim = get_char_room( ch, argument ) ) == NULL )
  { send_to_char( "They aren't here.\n\r", ch );
    return;
  }
  if ( !IS_NPC(victim) && victim->level < 2 )
  { send_to_char( "Not on mortals.  This means you, Anonbert.\n\r", ch );
    return;
  }
  sn = skill_lookup( "blind" );
  lev = ch->pcdata->spirit/2;
  act( "You call forth the suns brightness, flashing $N with its brilliance.", ch, NULL, victim, TO_CHAR );
  act( "A brilliant flash of light bursts forth from $n's forehead!", ch, NULL, victim, TO_ROOM );
  if ( ch->fighting == NULL && ch != victim && victim->position > POS_STUNNED )
    set_fighting( ch, victim );
  if ( victim->fighting == NULL && ch != victim && victim->position > POS_STUNNED )
    set_fighting( victim, ch );
  ( skill_table[sn].spell_fun) ( sn, lev, ch, victim );
  ch->pcdata->powers[S_POWER] -= 2500;
  timer_check( ch, victim );
  WAIT_STATE( ch, 8 );
  return;
}


void do_hawkeyes( CHAR_DATA *ch, char *argument )
{
  if ( IS_NPC(ch) ) 
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Huh?\n\r", ch );
    return;
  }

  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_HAWKEYES) )
  { send_to_char( "You don't know that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] <= 500 )
  { send_to_char( "You need 500 power to enhance your vision.\n\r", ch );
    return;
  }

  if ( IS_SET(ch->act,PLR_TRUESIGHT) )
  { send_to_char( "You let your vision return to normal.\n\r", ch );
    REMOVE_BIT(ch->act, PLR_TRUESIGHT);
    return;
  }

  ch->pcdata->powers[S_POWER] -= 500;
  SET_BIT(ch->act,PLR_TRUESIGHT);
  send_to_char( "You concentrate, and your vision becomes crystal clear.\n\r", ch );
  return;
}

void do_flight( CHAR_DATA *ch, char *argument )
{
  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Huh?\n\r", ch );
    return;
  }

  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_FLIGHT) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }

  if ( ch->pcdata->powers[S_POWER] < 250 )
  { send_to_char( "You need 250 points of power to lift off.\n\r", ch );
    return;
  }

  ch->pcdata->powers[S_POWER] -= 250;
  act( "Your aegis flares with energy as you lift off.", ch, NULL, NULL, TO_CHAR );
  act( "$n glows with energy as $s jumps into the air.", ch, NULL, NULL, TO_ROOM );
  ( skill_table[skill_lookup( "fly" )].spell_fun ) ( skill_lookup( "fly" ), ch->pcdata->spirit, ch, ch );
  WAIT_STATE( ch, 12 );
  return;
}

void do_ryuken( CHAR_DATA *ch, char *argument )
{
  int dam;
  CHAR_DATA *victim;

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Huh?\n\r", ch );
    return;
  }
  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_RYUKEN) )
  { send_to_char( "You haven't learned that technique.\n\r", ch );
    return;
  }
  if ( ch->pcdata->powers[S_POWER] < 10000 )
  { send_to_char( "The ryuken technique requires 10000 fighting power.\n\r", ch );
    return;
  }
  if ( ch->hit < ch->max_hit/4 )
  {
    stc( "In your weakened condition, you can't summon the strength.\n\r", ch );
    return;
  }

  if ( ch->fighting != NULL )
    victim = ch->fighting;
  else
  { send_to_char( "But you aren't fighting.\n\r", ch );
    return;
  }

  if ( !IS_NPC(victim) && victim->hit < victim->max_hit/4  &&  ch->hit > ch->max_hit/2 )
  {
    stc( "No more lame run in ryuken.  Thank tander.\n\r", ch );
    return;
  }

  act( "You wind up and slam your fist into $N!", ch, NULL, victim, TO_CHAR );
  act( "$n winds up and slams $s fist into you!", ch, NULL, victim, TO_VICT );
  act( "$n winds up and slams $s fist into $N!", ch, NULL, victim, TO_NOTVICT );
  if (!IS_NPC(victim))
  { if ( victim->class == CLASS_FIST )
    { if ( IS_SET(victim->pcdata->actnew,NEW_FIGUREEIGHT) )
        REMOVE_BIT(victim->pcdata->actnew,NEW_FIGUREEIGHT);
      if ( victim->pcdata->powers[F_KI] > 0 )
        victim->pcdata->powers[F_KI] = 0;
    }
    else if ( victim->class == CLASS_SAIYAN && is_affected(victim,gsn_kiwall) )
      affect_strip(victim,gsn_kiwall);
    else if ( IS_CLASS(victim,CLASS_SORCERER) )
    {
      act( "Your dragon uppercut staggers $N!", ch, NULL, victim, TO_CHAR );
      act( "$n's dragon uppercut disrupts your casting!", ch, NULL, victim, TO_VICT );
      act( "$n's dragon uppercut staggers $N.", ch, NULL, victim, TO_NOTVICT );
      lose_chant(victim);
    }

  }
  dam = dice( ch->pcdata->body, ch->pcdata->body * 3 / 2 );
  damage( ch, victim, dam, F_UPPERCUT );
  if ( ch->fighting != NULL )
  { act( "An incandescent dragon curls up your arm and crashes into $N!", ch, NULL, victim, TO_CHAR );
    act( "An incancescent dragon spears through you!", ch, NULL, victim, TO_VICT );
    act( "An incandescent dragon spears through $N", ch, NULL, victim, TO_NOTVICT );
    dam = dice( ch->pcdata->spirit, ch->pcdata->spirit );
    damage( ch, victim, dam, DAM_KIFLAME );
  }
  ch->pcdata->powers[S_POWER] -= 10000;
  WAIT_STATE( ch, 42 );
  return;
}

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

  if ( IS_NPC(ch) )
    return;
  if ( ch->class != CLASS_SAIYAN )
  { send_to_char( "Huh?\n\r", ch );
    return;
  }

  if ( !IS_SET(ch->pcdata->powers[S_TECH],S_BATTLESENSE) )
  { send_to_char( "You do not know that technique.\n\r", ch );
    return;
  }


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

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

  if ( !IS_NPC(victim) && (ch->fighting == NULL || ch->position != POS_FIGHTING) )
  {
    stc( "Their Ki is shielded.\n\r", ch );
    return;
  }

  if ( IS_NPC(victim) )
    sprintf( buf, "%s is a mobile object.\n\r", victim->short_descr );
  else
    sprintf( buf, "%s is a %s\n\r", victim->name, class_table[victim->class].who_name );
  send_to_char( buf, ch );
  sprintf( buf, "They have %d hit points, %d mana, and %d moves.\n\r",
  		victim->hit, victim->mana, victim->move );
  send_to_char( buf, ch );
  if ( IS_CLASS(victim,CLASS_SAIYAN) )
  { sprintf( buf, "Their fighting power is at %d.\n\r", victim->pcdata->powers[S_POWER] );
    send_to_char( buf, ch );
  }

  if ( IS_CLASS(victim,CLASS_FIST) && victim->pcdata->powers[F_KI] > 0 )
  { if ( victim->pcdata->powers[F_KI] <= 9 )
      send_to_char( "They are charging their Ki.\n\r", ch );
    else if ( victim->pcdata->powers[F_KI] <= 19 )
      send_to_char( "They have focused their Ki.\n\r", ch );
    else
      send_to_char( "They are bursting with Ki.\n\r", ch );
  }

  if ( IS_CLASS(victim,CLASS_MAZOKU) )
  {
    if ( victim->pcdata->powers[M_NIHILISM] <= 25 )
      sprintf( buf, "%s's nihilistic tendencies are quiescent.\n\r", victim->name );
    else if ( victim->pcdata->powers[M_NIHILISM] <= 50 )
      sprintf( buf, "%s is deeply desturbed.. but that's normal for a Mazoku.\n\r", victim->name );
    else if ( victim->pcdata->powers[M_NIHILISM] <= 75 )
      sprintf( buf, "%s burns with self-destructive potential.\n\r", victim->name );
    else
      sprintf( buf, "%s is consumed by their hatred for all creation!\n\r", victim->name );

    stc( buf, ch );
  }
  return;
}

void do_bigbang( CHAR_DATA *ch, char *argument )
{
  CHAR_DATA *victim;
  int dam;

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

  if ( ch->pcdata->powers[S_POWER] < 250000 )
  {
    stc( "You need 250,000 fighting power to use this attack.\n\r", ch );
    return;
  }

  if ( argument[0] == '\0' && ch->fighting == NULL )
  { send_to_char( "Attack who?\n\r", ch );
    return;
  }

  if ( ch->fighting != NULL && argument[0] == '\0' )
    victim = ch->fighting;
  else if ( ( victim = get_char_room( ch, argument ) ) == NULL )
  { send_to_char( "They aren't here.\n\r", ch );
    return;
  }

  ch->pcdata->powers[S_POWER] -= 250000;
  dam = ch->level * ch->pcdata->body * ch->pcdata->spirit + dice(100,100);
  do_yell( ch, "BIG BANG ATTACK!!" );
  act( "$N is engulfed in a thunderous explosion of ki-flame!", ch, NULL, victim, TO_CHAR );
  act( "You is engulfed in a thunderous explosion of ki-flame!", ch, NULL, victim, TO_VICT );
  act( "$N is engulfed in a thunderous explosion of ki-flame!", ch, NULL, victim, TO_NOTVICT );
  WAIT_STATE(victim, 24);
  damage( ch, victim, dam, DAM_KIFLAME );
  WAIT_STATE( ch, 8 );
  return;
}