#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
void do_alchemy( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
int chance, diff, cost, dam;
argument = one_argument( argument, arg1 );
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[ALCHEMY_SKILL] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( arg1[0] == '\0' )
{
send_to_char( "&GSyntax: &w&WAlchemy <Modification> <Victim>\n\r", ch );
send_to_char( " &GMods: &w&Wclaws, horns, darkvision, defense,\n\r", ch );
send_to_char( " &w&Wstrength, dexterity, constitution,\n\r", ch );
send_to_char( " &w&Wintelligence, wisdom, charisma\n\r", ch );
return;
}
if( str_cmp(arg1, "claw") && str_cmp(arg1, "claws") && str_cmp(arg1, "horn")
&& str_cmp(arg1, "horns") && str_cmp(arg1, "dark") && str_cmp(arg1, "darkvision")
&& str_cmp(arg1, "defense") && str_cmp(arg1, "str") && str_cmp(arg1, "strength")
&& str_cmp(arg1, "dex") && str_cmp(arg1, "dexterity") && str_cmp(arg1, "con")
&& str_cmp(arg1, "constitution") && str_cmp(arg1, "int") && str_cmp(arg1, "intelligence")
&& str_cmp(arg1, "wis") && str_cmp(arg1, "wisdom") && str_cmp(arg1, "cha")
&& str_cmp(arg1, "charisma") )
{
do_alchemy( ch, "" );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat person isn't here.&w\n\r", ch );
return;
}
if( IS_NPC(victim) )
{
send_to_char( "&rNot on my NPCs!&w\n\r", ch );
return;
}
if( victim->position > POS_SITTING )
{
send_to_char( "&rYou can't do that while they are in that position.&w\n\r", ch );
return;
}
if( !str_cmp(arg1, "claw") || !str_cmp(arg1, "claws") )
{
if( HAS_BODYPART(ch, PART_CLAWS) || IS_SET(ch->pcdata->alchemy, ALCHEMY_CLAWS) )
{
if( victim == ch )
send_to_char( "&rYou already possess claws.&w\n\r", ch );
else
ch_printf( ch, "&G%s&w&W already possesses claws.\n\r", victim->name );
return;
}
}
if( ( !str_cmp(arg1, "horn") || !str_cmp(arg1, "horns") ) && HAS_BODYPART(victim, PART_HORNS) )
{
if( victim == ch )
send_to_char( "&rYou already possess horns.&w\n\r", ch );
else
ch_printf( ch, "&G%s&w&W already possesses horns.&w\n\r", victim->name );
return;
}
if( ( !str_cmp(arg1, "dark") || !str_cmp(arg1, "darkvision") ) && ( IS_AFFECTED(victim, AFF_DARKVISION) || IS_SET(victim->pcdata->alchemy, ALCHEMY_DARKVISION) ) )
{
if( victim == ch )
send_to_char( "&rYou already possess darkvision.&w\n\r", ch );
else
ch_printf( ch, "&G%s&w&W already possesses darkvision.&w\n\r", victim->name );
return;
}
chance = ( number_range(1, 20) + ch->force_level[ALCHEMY_SKILL] + stat_table[get_curr_int(ch)].mod );
if( IS_TAINTED(ch) )
chance += 2;
if( IS_DARK(ch) )
chance += 4;
if( !str_cmp( arg1, "horn" ) || !str_cmp( arg1, "horns" ) )
diff = 15;
else if( !str_cmp( arg1, "claw" ) || !str_cmp( arg1, "claws" ) )
diff = 15;
else if( !str_cmp( arg1, "darkvision" ) )
diff = 20;
else if( !str_cmp( arg1, "defense" ) )
diff = ( 20 + ( victim->pcdata->alchemy_mod * 5 ) );
else
diff = ( 25 + ( victim->pcdata->alchemy_mod * 5 ) );
cost = ( 10000 + (victim->pcdata->alchemy_mod * 500) );
if( ch->gold < cost )
{
ch_printf( ch, "&w&WIt will cost you &G%d&w&W credits, which you do not have.\n\r", cost );
return;
}
gain_darkpoint( ch );
ch->gold -= cost;
if( chance < diff )
{
act( AT_BLOOD, "There is a slight error during the process, causing $N great harm.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "There is a slight error during the process, causing you great harm.\n\r", ch, NULL, victim, TO_VICT );
act( AT_BLOOD, "There is a slight error during the process, causing $N great harm.\n\r", ch, NULL, victim, TO_NOTVICT );
dam = number_range( 3, 12 );
victim->max_hit -= dam;
victim->hit -= dam;
update_pos( victim );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
return;
}
if( !str_cmp( arg1, "claw" ) || !str_cmp( arg1, "claws" ) )
{
SET_BIT(victim->xflags, PART_CLAWS);
SET_BIT(victim->pcdata->alchemy, ALCHEMY_CLAWS);
act( AT_YELLOW, "Through the dark side's alchemical arts, $N's hands grow into fierce claws.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_YELLOW, "Through the dark side's alchemical arts, your hands grow into fierce claws.\n\r", ch, NULL, victim, TO_VICT );
act( AT_YELLOW, "Through the dark side's alchemical arts, $N's hands grow into fierce claws.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "horn" ) || !str_cmp( arg1, "horns" ) )
{
SET_BIT(victim->xflags, PART_HORNS);
SET_BIT(victim->pcdata->alchemy, ALCHEMY_HORNS);
act( AT_YELLOW, "Through the dark side's alchemical arts, $N sprouts two horns.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_YELLOW, "Through the dark side's alchemical arts, your head sprouts two horns.\n\r", ch, NULL, victim, TO_VICT );
act( AT_YELLOW, "Through the dark side's alchemical arts, $N sprouts two horns.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "dark" ) || !str_cmp( arg1, "darkvision" ) )
{
SET_BIT(victim->pcdata->alchemy, ALCHEMY_DARKVISION);
act( AT_BLUE, "$N's eyes glaze over as the Dark Side takes its effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLUE, "You feels your eyes glaze over ad the Dark Side takes its effect.\n\r", ch, NULL, victim, TO_VICT );
act( AT_BLUE, "$N's eyes glaze over as the Dark Side takes its effect.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "defense" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_DEFENSE) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_DEFENSE);
victim->armor += 3;
act( AT_WHITE, "$N's skin hardens as the alchemy takes hold.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "Your skin hardens as the alchemy takes hold.\n\r", ch, NULL, victim, TO_VICT );
act( AT_WHITE, "$N's skin hardens as the alchemy takes hold.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "str" ) || !str_cmp( arg1, "strength" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_STRENGTH) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_STRENGTH);
victim->perm_str += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "You feel your body grow stronger as the alchemy changes your body.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "dex" ) || !str_cmp( arg1, "dexterity" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_DEXTERITY) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_DEXTERITY);
victim->perm_dex += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "You feel your body grow more dexterous as the alchemy effects you.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "con" ) || !str_cmp( arg1, "constitution" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_CONSTITUTION) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_CONSTITUTION);
victim->perm_con += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "You feel your body grow more resilant as the alchemy takes effect.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "int" ) || !str_cmp( arg1, "intelligence" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_INTELLIGENCE) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_INTELLIGENCE);
victim->perm_int += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "You feel your mind open to the mysteries of the Force.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "wis" ) || !str_cmp( arg1, "wisdom" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_WISDOM) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_WISDOM);
victim->perm_wis += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "The Dark Force Spirits bestow upon you great wisdom.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
else if( !str_cmp( arg1, "cha" ) || !str_cmp( arg1, "charisma" ) )
{
if( !IS_SET(victim->pcdata->alchemy, ALCHEMY_CHARISMA) )
SET_BIT(victim->pcdata->alchemy, ALCHEMY_CHARISMA);
victim->perm_cha += 1;
act( AT_WHITE, "You watch as the alchemy takes effect.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_WHITE, "Your charisma grows as your body adjusts to the presense of the alchemy.\n\r", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
WAIT_STATE( victim, PULSE_PER_SECOND * 2 );
victim->pcdata->alchemy_mod += 1;
return;
}
do_alchemy( ch, "" );
return;
}
void do_battlemind( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
int chance;
int bonus=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[BATTLEMIND_SKILL] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( IS_AFFECTED( ch, AFF_BATTLEMIND ) )
{
send_to_char( "&w&WYou are already affected by Battlemind.\n\r", ch );
return;
}
chance = ( number_range( 1, 20 ) + ch->force_level[BATTLEMIND_SKILL] + stat_table[get_curr_con(ch)].mod );
if( ch->hit < 9 )
{
send_to_char( "&rYou lack the hitpoints required to do this.&w\n\r", ch );
return;
}
if( chance < 1 )
{
ch->hit -= 2;
update_pos( ch );
send_to_char( "&rYou could not harness the power of the force.&w\n\r", ch );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
return;
}
if( chance >= 1 && chance < 5 )
bonus = 1;
else if( chance >= 5 && chance < 15 )
bonus = 2;
else if( chance >= 15 && chance < 25 )
bonus = 3;
else if( chance >= 25 && chance < 35 )
bonus = 4;
else if( chance >= 35 )
bonus = 5;
ch->hit -= ( bonus + 2 );
update_pos( ch );
af.type = gsn_battlemind;
af.duration = ( 10 * ch->force_level[BATTLEMIND_SKILL]);
af.location = APPLY_HITROLL;
af.modifier = bonus;
af.bitvector = AFF_BATTLEMIND;
affect_to_char(ch, &af);
send_to_char( "Your combat prowess increases.\n\r", ch );
return;
}
void do_enhance( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
int chance, bonus;
if( IS_NPC( ch ) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[ENHANCE_ABILITY] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&GEnhance strength or dexterity?&w\n\r", ch );
return;
}
if( str_cmp( argument, "str" ) && str_cmp( argument, "strength" )
&& str_cmp( argument, "dex" ) && str_cmp( argument, "dexterity" ) )
{
do_enhance( ch, "" );
return;
}
if( IS_AFFECTED( ch, AFF_ENHANCE ) )
{
send_to_char( "&rThe Force is already affecting one of your abilities.&w\n\r", ch );
return;
}
chance = ( number_range( 1, 20 ) + ch->force_level[ENHANCE_ABILITY] + stat_table[get_curr_con(ch)].mod );
ch->hit -= 3;
if( chance < 15 )
{
act( AT_BLUE, "You fail to harness the power of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n fails to harness the power of the Force.\n\r", ch, NULL, NULL, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
return;
}
if( chance >= 15 && chance < 20 )
bonus = 2;
else if( chance >= 20 && chance < 25 )
bonus = 4;
else if( chance >= 25 && chance < 30 )
bonus = 6;
else if( chance >= 30 )
bonus = 8;
if( !str_cmp( argument, "str" ) || !str_cmp( argument, "strength" ) )
{
act( AT_BLUE, "Your strength is enhanced through the power of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n appears stronger.\n\r", ch, NULL, NULL, TO_NOTVICT );
af.location = APPLY_STR;
}
else if( !str_cmp( argument, "dex" ) || !str_cmp( argument, "dexterity" ) )
{
act( AT_BLUE, "Your dexterity is enhanced through the power of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n appears more dexterous.\n\r", ch, NULL, NULL, TO_NOTVICT );
af.location = APPLY_DEX;
}
af.type = gsn_enhance_ability;
af.duration = ( 5 * ch->force_level[ENHANCE_ABILITY] );
af.modifier = bonus;
af.bitvector = AFF_ENHANCE;
affect_to_char( ch, &af );
WAIT_STATE( ch, PULSE_PER_SECOND * 2 );
return;
}
void do_enhancesenses( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af1;
AFFECT_DATA af2;
AFFECT_DATA af3;
int chance;
int bonus=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[ENHANCE_SENSES] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( IS_AFFECTED( ch, AFF_ENHANCESENSES ) )
{
send_to_char( "&rYou are already affected by this Force Skill.&w\n\r", ch );
return;
}
chance = ( number_range(1, 20) + ch->force_level[ENHANCE_SENSES] + stat_table[get_curr_wis(ch)].mod );
ch->hit -= 3;
update_pos( ch );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
if( chance < 10 )
{
act( AT_BLUE, "You meditate for a moment and fail to harness the power of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n meditates for a moment.\n\r", ch, NULL, NULL, TO_NOTVICT );
return;
}
if( chance >= 10 && chance <= 14 )
bonus = 2;
else if( chance >= 15 && chance <= 19 )
bonus = 4;
else if( chance >= 20 && chance <= 24 )
bonus = 6;
else if( chance >= 25 )
bonus = 8;
af1.type = gsn_enhance_senses;
af1.duration = ( 5 * ch->force_level[ENHANCE_SENSES] );
af1.modifier = bonus;
af1.location = APPLY_LISTEN;
af1.bitvector = AFF_ENHANCESENSES;
affect_to_char( ch, &af1 );
af2.type = gsn_enhance_senses;
af2.duration = ( 5 * ch->force_level[ENHANCE_SENSES] );
af2.modifier = bonus;
af2.location = APPLY_SEARCH;
af2.bitvector = AFF_ENHANCESENSES;
affect_to_char( ch, &af2 );
af3.type = gsn_enhance_senses;
af3.duration = ( 5 * ch->force_level[ENHANCE_SENSES] );
af3.modifier = bonus;
af3.location = APPLY_SPOT;
af3.bitvector = AFF_ENHANCESENSES;
affect_to_char( ch, &af3 );
act( AT_BLUE, "You harness the power of the Force to increase your senses.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n opens $s eyes after meditating, appearing more aware.\n\r", ch, NULL, NULL, TO_NOTVICT );
return;
}
void do_farseeing( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
ROOM_INDEX_DATA *iRoom;
int chance, resist;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FARSEEING_SKILL] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&rWhom do you wish to attempt to find?&w\n\r", ch );
return;
}
if( ch->hit < 5 )
{
send_to_char( "&rYou lack the energy required to do this.&w\n\r", ch );
return;
}
if( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character isn't online.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "&rThats just foolish.&w\n\r", ch );
return;
}
if( IS_DROID(victim) )
{
send_to_char( "&rYou should know Droids aren't linked to the Force.&w\n\r", ch );
return;
}
iRoom = get_room_index( victim->in_room->vnum );
if( !iRoom )
{
send_to_char( "&rBad victim room, inform an Immortal.&w\n\r", ch );
return;
}
ch->hit -= 3;
update_pos( ch );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
chance = ( number_range( 1, 20 ) + ch->force_level[FARSEEING_SKILL] + stat_table[get_curr_wis(ch)].mod );
if( !IS_NPC(victim) )
resist = ( number_range( 1, 20 ) + ch->willpower );
else
resist = ( number_range( 10, 30 ) );
if( IS_AFFECTED( victim, AFF_FORCE_RESIST ) )
resist += 6;
if( resist > chance )
{
act( AT_BLOOD, "You scan the galaxy for your target, but fail to locate $M.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "$n closes $s eyes for a moment.\n\r", ch, NULL, victim, TO_NOTVICT );
return;
}
send_to_char( "\n\r", ch );
ch_printf(ch, "&R-=&r( &G&W%s &G&r)&R=-&C&w\n\r", iRoom->name);
set_char_color( AT_RMDESC, ch );
if ( !IS_NPC(ch) && !IS_SET(ch->act, PLR_BRIEF) )
send_to_char( iRoom->description, ch );
show_ships_to_char( iRoom->first_ship, ch );
show_list_to_char( iRoom->first_content, ch, FALSE, FALSE );
show_char_to_char( iRoom->first_person, ch );
return;
}
void do_fear( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
CHAR_DATA *victim;
int chance;
int penalty=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FEAR_SKILL] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&rWho's deepest fears do you wish to uncover?&w\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character isn't in this room.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "&rYou already frighten even yourself.&w\n\r", ch );
return;
}
if( IS_DROID(victim) )
{
send_to_char( "&rNot on Droids.&w\n\r", ch );
return;
}
if( IS_AFFECTED( victim, AFF_FEAR ) )
{
send_to_char( "&rThey are already scared.&w\n\r", ch );
return;
}
if( ch->hit < 3 )
{
send_to_char( "&rYou lack the vitality to do this.&w\n\r", ch );
return;
}
ch->hit -= 2;
update_pos( ch );
WAIT_STATE( ch, PULSE_VIOLENCE );
gain_darkpoint( ch );
chance = ( number_range( 1, 20 ) + ch->force_level[FEAR_SKILL] + stat_table[get_curr_wis(ch)].mod );
if( IS_TAINTED(ch) )
chance += 2;
if( IS_DARK(ch) )
chance += 4;
if( chance < 10 )
{
act( AT_YELLOW, "$N laughs at your attempts to be frightening.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_YELLOW, "You laugh at $n's attempts to be frightening.\n\r", ch, NULL, victim, TO_VICT );
act( AT_YELLOW, "$N laughs at $n's attempts to be frightening.\n\r", ch, NULL, victim, TO_NOTVICT );
return;
}
if( chance >= 10 && chance <= 14 )
penalty = 2;
else if( chance >= 15 && chance <= 19 )
penalty = 4;
else if( chance >= 20 && chance <= 24 )
penalty = 6;
else if( chance >= 25 && chance <= 29 )
penalty = 8;
else if( chance >= 30 )
penalty = 10;
af.type = gsn_fear;
af.duration = ( 4 * ch->force_level[FEAR_SKILL] );
af.modifier = -penalty;
af.location = APPLY_HITROLL;
af.bitvector = AFF_FEAR;
affect_to_char( victim, &af );
act( AT_RED, "$n stares at you menacingly and a strong wave of fear washes over you.\n\r", ch, NULL, victim, TO_VICT );
act( AT_RED, "You stare menacingly at $N.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_RED, "$n stares at $N menacingly and $N shudders in fear.\n\r", ch, NULL, victim, TO_NOTVICT );
return;
}
void do_forcedefense( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
int chance;
int bonus=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FORCE_DEFENSE] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( IS_AFFECTED( ch, AFF_FDEFENSE ) )
{
send_to_char( "&rYou are already protected by the power of the Force.&w\n\r", ch );
return;
}
if( ch->hit < 4 )
{
send_to_char( "&rYou lack the strength to do this.&w\n\r", ch );
return;
}
ch->hit -= 3;
update_pos( ch );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
chance = ( number_range( 1, 20 ) + ch->force_level[FORCE_DEFENSE] + stat_table[get_curr_cha(ch)].mod );
if( chance < 10 )
{
act( AT_RED, "You fail to harness the power of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_RED, "$n closes $s eyes, looking slightly unsettled.\n\r", ch, NULL, NULL, TO_NOTVICT );
return;
}
if( chance >= 10 && chance <= 14 )
bonus = 2;
else if( chance >= 15 && chance <= 19 )
bonus = 4;
else if( chance >= 20 && chance <= 24 )
bonus = 6;
else if( chance >= 25 && chance <= 29 )
bonus = 8;
else if( chance >= 30 )
bonus = 10;
act( AT_BLUE, "You harness the power of the Force and you feel more protected.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n emits an aura of protection.\n\r", ch, NULL, NULL, TO_NOTVICT );
af.type = gsn_force_defense;
af.duration = ( 3 * ch->force_level[FORCE_DEFENSE] );
af.location = APPLY_WILLPOWER;
af.modifier = bonus;
af.bitvector = AFF_FDEFENSE;
affect_to_char( ch, &af );
return;
}
void do_forcegrip( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *vict;
int chance, resist, diff;
int dam=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FORCE_GRIP] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&rChoke who?&w\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character isn't here.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "&rWhat good would that do?&w\n\r", ch );
return;
}
if( IS_DROID(victim) )
{
send_to_char( "&rNot on Droids.&w\n\r", ch );
return;
}
if( IS_SET(ch->in_room->room_flags, ROOM_SAFE ) )
{
send_to_char( "&rYou will have to do that someplace else.&w\n\r", ch );
return;
}
if( ch->hit < 5 )
{
send_to_char( "&rYou lack the strength to do this.&w\n\r", ch );
return;
}
gain_darkpoint( ch );
ch->hit -= 4;
update_pos( ch );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
chance = ( number_range( 1, 20 ) + ch->force_level[FORCE_GRIP] + stat_table[get_curr_int(ch)].mod );
if( IS_DARK(ch) )
chance += 4;
if( IS_TAINTED(ch) )
chance += 2;
if( !IS_NPC(victim) )
resist = ( number_range( 1, 20 ) + ch->willpower );
else
resist = 18;
if( chance < 10 )
diff = 10;
else if( chance >= 10 && chance <= 19 )
diff = 15;
else if( chance >= 20 )
diff = 20;
dam = number_range( 3, 18 );
if( resist >= diff )
dam = dam/2;
act( AT_BLOOD, "You harness the deadly power of the Force to choke $N.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "$n harnesses the deadly power of the Force to choke you.\n\r", ch, NULL, victim, TO_VICT );
act( AT_BLOOD, "$n harnesses the deadly power of the Force to choke $N.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( victim, PULSE_PER_SECOND*2);
victim->hit -= dam;
update_pos( victim );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
return;
}
void do_forcelightning( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *vict;
int chance, resist, diff;
int dam=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FORCE_LIGHTNING] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&rShock who with a jolt of lightning?&w\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character isn't in this room.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "&rThere's no point in that.&w\n\r", ch );
return;
}
if( IS_SET(ch->in_room->room_flags, ROOM_SAFE ) )
{
send_to_char( "&rYou will have to do that someplace else.&w\n\r", ch );
return;
}
if( ch->hit < 7 )
{
send_to_char( "&rYou lack the strength to do this.&w\n\r", ch );
return;
}
ch->hit -= 6;
update_pos( ch );
gain_darkpoint( ch );
WAIT_STATE( ch, PULSE_VIOLENCE );
chance = ( number_range( 1, 20 ) + ch->force_level[FORCE_LIGHTNING] + stat_table[get_curr_int(ch)].mod );
if( IS_TAINTED(ch) )
chance += 2;
if( IS_DARK(ch) )
chance += 2;
if( !IS_NPC(victim) )
resist = ( number_range( 1, 20 ) + ch->reflexes );
else
resist = 18;
if( chance < 10 )
diff = 10;
else if( chance >= 10 && chance <= 14 )
diff = 15;
else if( chance >= 15 && chance <= 19 )
diff = 20;
else if( chance >= 20 )
diff = 25;
dam = number_range(3, 24);
if( resist >= diff && ch->class_level[SCOUT_ABILITY] >= 6 )
{
act( AT_YELLOW, "$N rolls out of the way of your lightning bolts.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_YELLOW, "You narrowly avoid $n's lightning bolts by rolling out of the way.\n\r", ch, NULL, victim, TO_VICT );
act( AT_YELLOW, "$N narrowly rolls out of the way of $n's lightning bolts.\n\r", ch, NULL, victim, TO_NOTVICT );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
return;
}
if( resist >= diff )
dam = dam/2;
victim->hit -= dam;
update_pos( victim );
act( AT_RED, "You draw upon the darkside of the Force and jolt $N with a lightning blast.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_RED, "$n draws upon the darkside of the Force and jolts you with a lightning blast.\n\r", ch, NULL, victim, TO_VICT );
act( AT_RED, "$n draws upon the darkside of the Force and jolts $N with a lightning blast.\n\r", ch, NULL, victim, TO_NOTVICT );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
return;
}
void do_forcestrike( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *vict;
int chance, resist, diff;
int dam=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[FORCE_STRIKE] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&bStrike who with the Force?&w\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character is not here.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "&rNow why would you do that?&w\n\r", ch );
return;
}
if( ch->hit < 3 )
{
send_to_char( "&rYou lack the strength to do that.&w\n\r", ch );
return;
}
if( IS_SET(ch->in_room->room_flags, ROOM_SAFE ) )
{
send_to_char( "&rYou will have to do that someplace else.&w\n\r", ch );
return;
}
ch->hit -= 2;
update_pos( ch );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
chance = ( number_range( 1, 20 ) + ch->force_level[FORCE_STRIKE] + stat_table[get_curr_int(ch)].mod );
resist = ( number_range( 1, 20 ) + ch->reflexes );
if( chance < 10 )
diff = 10;
else if( chance >= 10 && chance <= 19 )
diff = 15;
else if( chance >= 20 )
diff = 20;
dam = number_range( 3, 12 );
if( resist >= diff && ch->class_level[SCOUT_ABILITY] >= 6 )
{
act( AT_YELLOW, "$N rolls out of the way of your Force strike.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_YELLOW, "You narrowly roll out of the way of $n's Force strike.\n\r", ch, NULL, NULL, TO_VICT );
act( AT_YELLOW, "$N narrowly rolls out of the way of $n's Force strike.\n\r", ch, NULL, victim, TO_NOTVICT );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
return;
}
if( resist >= diff )
dam = dam/2;
victim->hit -= dam;
update_pos( victim );
act( AT_BLUE, "You strike $N with a blast of the Force.\n\r", ch, NULL, NULL, TO_CHAR );
act( AT_BLUE, "$n strikes you with a blast of the Force.\n\r", ch, NULL, NULL, TO_VICT );
act( AT_BLUE, "$n strikes $N with a blast of the Force.\n\r", ch, NULL, NULL, TO_NOTVICT );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
return;
}
void do_heal( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int chance;
int gain=0;
int loss=0;
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[HEAL_SELF] == 0 && ch->force_level[HEAL_OTHER] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "&GHeal whom?&w\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "&rThat character is not here.&w\n\r", ch );
return;
}
if( victim == ch && ch->force_level[HEAL_SELF] == 0 )
{
send_to_char( "&rYou lack the skill required for this.&w\n\r", ch );
return;
}
if( victim != ch && ch->force_level[HEAL_OTHER] == 0 )
{
send_to_char( "&rYou lack the skill required for this.&w\n\r", ch );
return;
}
if( victim == ch )
{
if( ch->position < POS_RESTING )
{
send_to_char( "&rNot in this position.&w\n\r", ch );
return;
}
if( ch->hit >= ch->max_hit )
{
send_to_char( "&bYou don't require any healing.&w\n\r", ch );
return;
}
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
chance = ( number_range( 1, 20 ) + ch->force_level[HEAL_SELF] + stat_table[get_curr_cha(ch)].mod );
if( chance < 10 )
{
ch->hit -= 1;
act( AT_RED, "You fail to harness the healing power of the Force and cause slight damage to yourself.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_RED, "$n fails to harness the healing power of the Force and injures $mself.\n\r", ch, NULL, victim, TO_NOTVICT );
update_pos( ch );
return;
}
else if( chance >= 10 && chance <= 14 )
gain = ( number_range( 1, 4 ) + 1 );
else if( chance >= 15 && chance <= 19 )
gain = ( number_range( 1, 6 ) + 2 );
else if( chance >= 20 && chance <= 24 )
gain = ( number_range( 1, 8 ) + 4 );
else if( chance >= 25 )
gain = ( number_range( 2, 12 ) + 6 );
ch->hit = URANGE( ch->hit, ( ch->hit + gain ), ch->max_hit );
act( AT_BLUE, "You harness the healing powers of the Force and ease your wounds.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLUE, "$n harnesses the healing powers of the Force and eases $s wounds.\n\r", ch, NULL, victim, TO_NOTVICT );
update_pos( ch );
return;
}
if( IS_DROID(victim) )
{
send_to_char( "&rThat wont help a Droid much.&w\n\r", ch );
return;
}
if( ch->position < POS_RESTING )
{
send_to_char( "&rNot in this position.&w\n\r", ch );
return;
}
if( victim->hit >= victim->max_hit )
{
send_to_char( "&rThey don't need any healing.&w\n\r", ch );
return;
}
if( ch->hit < 7 )
{
send_to_char( "&rYou lack the required strength for this.&w\n\r", ch );
return;
}
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
chance = ( number_range( 1, 20 ) + ch->force_level[HEAL_OTHER] + stat_table[get_curr_wis(ch)].mod );
if( chance < 10 )
{
ch->hit -= 1;
act( AT_RED, "You fail to harness the healing powers of the Force and cause yourself minor damage.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_RED, "$n fails to harness the healing powers of the Force and causes $sself minor damage.\n\r", ch, NULL, victim, TO_VICT );
act( AT_RED, "$n fails to harness the healing powers of the Force and causes $sself minor damage.\n\r", ch, NULL, victim, TO_NOTVICT );
update_pos( ch );
return;
}
else if( chance >= 10 && chance <= 14 )
{
if( victim->hit < 0 )
{
victim->hit = 0;
ch->hit -= 1;
act( AT_BLUE, "$n harnesses the healing powers of the Force enough to stabilize $N.\n\r", ch, NULL, victim, TO_NOTVICT );
act( AT_BLUE, "You harness the healing powers of the Force enough to stabilize $N.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLUE, "$n harnesses the healing powers of the Force enough to stabilize you.\n\r", ch, NULL, victim, TO_VICT );
update_pos( ch );
update_pos( victim );
return;
}
act( AT_RED, "You fail to harness the healing powers of the Force and cause minor damage to yourself.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_RED, "$n fails to harness the healing powers of the Force and causes minor damage to $sself.\n\r", ch, NULL, victim, TO_VICT );
act( AT_RED, "$n fails to harness the healing powers of the Forceand causes minor damage to $sself.\n\r", ch, NULL, victim, TO_NOTVICT );
ch->hit -= 1;
update_pos( ch );
return;
}
else if( chance >= 15 && chance <= 19 )
{
gain = ( number_range( 1, 4 ) + 1 );
loss = 1;
}
else if( chance >= 20 && chance <= 24 )
{
gain = ( number_range( 1, 6 ) + 2 );
loss = 2;
}
else if( chance >= 25 && chance <= 29 )
{
gain = ( number_range( 1, 8 ) + 4 );
loss = 4;
}
else if( chance >= 30 )
{
gain = ( number_range( 2, 12 ) + 6 );
loss = 6;
}
victim->hit = URANGE( victim->hit, victim->hit + gain, victim->max_hit );
ch->hit -= loss;
act( AT_BLUE, "You harness the healing powers of the Force and heal $N.\n\r", ch, NULL, victim, TO_CHAR );
act( AT_BLUE, "$n harnesses the healing powers of the Force and heals you.\n\r", ch, NULL, victim, TO_VICT );
act( AT_BLUE, "$n harnesses the healing powers of the Force and heals $N.\n\r", ch, NULL, victim, TO_NOTVICT );
update_pos( ch );
update_pos( victim );
return;
}
void do_meditate( CHAR_DATA *ch, char *argument )
{
switch ( ch->position )
{
case POS_SLEEPING:
if ( IS_AFFECTED(ch, AFF_SLEEP) )
{
send_to_char( "You can't seem to wake up!\n\r", ch );
return;
}
send_to_char( "You stir from your slumber and begin to meditate.\n\r", ch );
act( AT_ACTION, "$n stirs from $s slumber and begins to meditate.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_MEDITATING;
break;
case POS_MEDITATING:
send_to_char( "You are already meditating.\n\r", ch );
return;
case POS_RESTING:
send_to_char( "You adjust your position slightly and begin to meditate.\n\r", ch );
act( AT_ACTION, "$n adjusts $s position slightly and begins to meditate.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_MEDITATING;
return;
case POS_STANDING:
send_to_char( "You sit down and begin to meditate.\n\r", ch );
act( AT_ACTION, "$n sits down and begins to meditate.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_MEDITATING;
break;
case POS_SITTING:
send_to_char( "You leans back slightly and begins to meditate.\n\r", ch );
act( AT_ACTION, "$n leans back slightly and begins to meditate.", ch, NULL, NULL, TO_ROOM );
ch->position = POS_MEDITATING;
break;
case POS_FIGHTING:
send_to_char( "You are busy fighting!\n\r", ch );
return;
case POS_MOUNTED:
send_to_char( "You'd better dismount first.\n\r", ch );
return;
}
rprog_rest_trigger( ch );
return;
}
void do_callforce( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
int bonus, duration;
bool call_light=FALSE;
bool call_neutral=FALSE;
bool call_dark=FALSE;
if( IS_NPC(ch) )
return;
if( IS_DROID(ch) )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( ch->forcepoints < 1 )
{
send_to_char( "You lack the Force Points to do this.\n\r", ch );
return;
}
if( HAS_FEAT( ch, FORCE_SENSITIVE ) && !IS_DARK(ch) && argument[0] == '\0' )
{
send_to_char( "&rCall upon the Light or the Dark side of the Force?&w&W\n\r", ch );
return;
}
if( !str_cmp( argument, "light" ) )
call_light = TRUE;
if( !str_cmp( argument, "dark" ) )
call_dark = TRUE;
if( !HAS_FEAT( ch, FORCE_SENSITIVE ) )
{
call_light = FALSE;
call_dark = FALSE;
call_neutral = TRUE;
}
if( IS_DARK(ch) )
{
call_light = FALSE;
call_neutral = FALSE;
call_dark = TRUE;
}
duration = ( ch->top_level * 2 );
if( call_neutral )
{
if( ch->top_level < 11 )
bonus = number_range(1, 6);
else if( ch->top_level >= 11 && ch->top_level < 21 )
bonus = number_range(2, 12);
else if( ch->top_level >= 21 && ch->top_level < 26 )
bonus = number_range(3, 18);
else if( ch->top_level >= 26 )
bonus = number_range(4, 24);
}
else if( call_light )
{
if( ch->top_level < 6 )
bonus = number_range(1, 6);
else if( ch->top_level >= 6 && ch->top_level < 11 )
bonus = number_range(2, 12);
else if( ch->top_level >= 11 && ch->top_level < 16 )
bonus = number_range(3, 18);
else if( ch->top_level >= 16 && ch->top_level < 21 )
bonus = number_range(4, 24);
else if( ch->top_level >= 21 && ch->top_level < 26 )
bonus = number_range(5, 30);
else if( ch->top_level >= 26 )
bonus = number_range(7, 42);
}
else if( call_dark )
{
if( ch->top_level < 6 )
bonus = number_range(2, 12);
else if( ch->top_level >= 6 && ch->top_level < 11 )
bonus = number_range(3, 18);
else if( ch->top_level >= 11 && ch->top_level < 21 )
bonus = number_range(4, 18);
else if( ch->top_level >= 21 && ch->top_level < 26 )
bonus = number_range(5, 30);
else if( ch->top_level >= 26 )
bonus = number_range(6, 36);
gain_darkpoint(ch);
}
ch->forcepoints -= 1;
af.type = gsn_callforce;
af.duration = duration;
af.location = APPLY_HITROLL;
af.modifier = bonus;
af.bitvector = AFF_FORCE;
affect_to_char(ch, &af);
if( call_dark )
{
send_to_char( "&rYou call upon the dark side of the Force to aid you!&w&W\n\r", ch );
act( AT_BLOOD, "$n calls upon the dark side of the Force to aid $s.", ch, NULL, NULL, TO_ROOM );
}
else if( call_light )
{
send_to_char( "&CYou call upon the light side of the Force to aid you!&w&W\n\r", ch );
act( AT_MAGIC, "$n calls upon the light side of the Force to aid $s.", ch, NULL, NULL, TO_ROOM );
}
else
{
send_to_char( "&w&WThe luck of the universe is aiding you!\n\r", ch );
act( AT_PLAIN, "$n is surrounded by the luck of the Universe.", ch, NULL, NULL, TO_ROOM );
}
WAIT_STATE( ch, PULSE_VIOLENCE );
return;
}
void do_forcemind( CHAR_DATA *ch, char *argument )
{
AFFECT_DATA af;
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
int bonus=0;
int cost=0;
argument = one_argument( argument, arg );
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && !HAS_FFEAT( ch, FORCE_MIND ) )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( ch->position < POS_FIGHTING )
{
send_to_char( "You can't do that in this position.\n\r", ch );
return;
}
if( HAS_FFEAT( ch, FORCE_MIND ) )
cost += 5;
if( HAS_FFEAT( ch, IMP_FORCE_MIND ) )
cost += 3;
if( HAS_FFEAT( ch, KNIGHT_MIND ) )
cost += 4;
if( HAS_FFEAT( ch, MASTER_MIND ) )
cost += 4;
if( ch->hit <= cost )
{
send_to_char( "&RYou lack the vitality to do this.&w&W\n\r", ch );
return;
}
if( arg[0] == '\0' || argument[0] == '\0' )
{
send_to_char( "&GSyntax: &w&WForcemind <victim> <attribute>\n\r", ch );
send_to_char( "&GValid Attributes: &w&Wstr dex con int wis cha\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "I don't see them here.\n\r", ch );
return;
}
if( IS_AFFECTED( victim, AFF_MIND ) )
{
send_to_char( "They are already affected by Force Mind.\n\r", ch );
return;
}
if( IS_NPC(victim) )
{
send_to_char( "Leave my NPCs alone.\n\r", ch );
return;
}
if( IS_DROID(victim) )
{
send_to_char( "Not on Droids.\n\r", ch );
return;
}
if( HAS_FFEAT( ch, FORCE_MIND ) )
bonus += 2;
if( HAS_FFEAT( ch, IMP_FORCE_MIND ) )
bonus += 2;
if( HAS_FFEAT( ch, KNIGHT_MIND ) )
bonus += 2;
if( HAS_FFEAT( ch, MASTER_MIND ) )
bonus += 2;
if( str_cmp( argument, "str" ) && str_cmp( argument, "dex" ) && str_cmp( argument, "con" ) && str_cmp( argument, "int" ) && str_cmp( argument, "wis" ) && str_cmp( argument, "cha" ) )
{
do_forcemind( ch, "" );
return;
}
ch->hit -= cost;
update_pos( ch );
af.type = gsn_forcemind;
af.duration = ( 3 * ch->top_level );
af.modifier = bonus;
if( !str_cmp( argument, "str" ) )
af.location = APPLY_STR;
else if( !str_cmp( argument, "dex" ) )
af.location = APPLY_DEX;
else if( !str_cmp( argument, "con" ) )
af.location = APPLY_CON;
else if( !str_cmp( argument, "int" ) )
af.location = APPLY_INT;
else if( !str_cmp( argument, "wis" ) )
af.location = APPLY_WIS;
else if( !str_cmp( argument, "cha" ) )
af.location = APPLY_CHA;
af.bitvector = AFF_MIND;
affect_to_char( victim, &af );
if( victim == ch )
{
act( AT_BLUE, "You become empowered by the Force.", ch, NULL, victim, TO_CHAR );
act( AT_BLUE, "$n glowes with the power of the Force.", ch, NULL, victim, TO_NOTVICT );
}
else
{
act( AT_BLUE, "$n empowers $N through the Force.", ch, NULL, victim, TO_NOTVICT );
act( AT_BLUE, "$n empowers you through the Force.", ch, NULL, victim, TO_VICT );
act( AT_BLUE, "You emplower $N through the Force.", ch, NULL, victim, TO_CHAR );
}
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}
void do_drainenergy( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
CHAR_DATA *vict;
AFFECT_DATA af;
OBJ_DATA *obj;
char arg[MAX_INPUT_LENGTH];
int cost=0;
int save=0;
int diff=0;
int roll=0;
argument = one_argument( argument, arg );
if( IS_NPC(ch) )
return;
if( !IS_IMMORTAL(ch) && ch->force_level[DRAIN_ENERGY] == 0 )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if( ch->position < POS_FIGHTING )
{
send_to_char( "Not in your current position.\n\r", ch );
return;
}
if( arg[0] == '\0' )
{
send_to_char( "&GSyntax: &w&Wdrainenergy <victim> <object>\n\r", ch );
return;
}
if( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "&RI don't see them here.&w\n\r", ch );
return;
}
if( victim == ch )
{
send_to_char( "That would be rather pointless.\n\r", ch );
return;
}
roll = ( number_range(1,20) + ch->force_level[DRAIN_ENERGY] + stat_table[get_curr_con(ch)].mod );
if( roll < 15 )
diff = 10;
else if( roll > 15 && roll < 26 )
diff = 15;
else
diff = 20;
if( argument[0] == '\0' )
{
if( !IS_DROID(victim) )
{
send_to_char( "You can't drain energy out of living creatures.\n\r", ch );
return;
}
if( ch->hit < 12 )
{
send_to_char( "You lack the vitality to do this.\n\r", ch );
return;
}
if( IS_NPC(victim) )
save = ( number_range(1,20) + victim->top_level/2 );
else
save = ( number_range(1,20) + GET_WILL(victim) );
ch->hit -= 12;
update_pos( ch );
gain_darkpoint( ch );
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
if( save >= diff )
{
act( AT_BLOOD, "You fail to drain $N of energy.", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "$n fails to drain you of energy.", ch, NULL, victim, TO_VICT );
act( AT_BLOOD, "$n fails to drain $N of energy.", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}
victim->hit -= (number_range(1, 8) + stat_table[get_curr_con(ch)].mod);
if( !IS_AFFECTED( victim, AFF_PARALYSIS ) )
{
int fort=0;
if( IS_NPC(victim) )
fort = ( number_range(1,20) + victim->top_level/2 );
else
fort = ( number_range(1,20) + GET_FORT(victim) );
if( 16 > fort )
{
af.type = gsn_stun;
af.location = APPLY_AC;
af.modifier = (stat_table[get_curr_dex(victim)].mod);
af.duration = number_range(15,40);
af.bitvector = AFF_PARALYSIS;
affect_to_char( victim, &af );
update_pos( victim );
act( AT_BLOOD, "You drain $N of energy, stunning it momentarily.", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "$n drains you of energy, stunning you momentarily.", ch, NULL, victim, TO_VICT );
act( AT_BLOOD, "$n drains $N of energy, stunning $E momentarily.", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}
}
update_pos( victim );
act( AT_BLOOD, "You drain $N of some energy.", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "$n drains you of some energy.", ch, NULL, victim, TO_VICT );
act( AT_BLOOD, "$n drains $N of some energy.", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}
if ( ( obj = get_obj_wear( victim, argument ) ) == NULL )
{
send_to_char( "They are not using that item.\n\r", ch );
return;
}
if( !can_see_obj( ch, obj ) )
{
send_to_char( "They are not suing that item.\n\r", ch );
return;
}
if( obj->item_type != ITEM_WEAPON )
{
send_to_char( "This is only used on weapons.\n\r", ch );
return;
}
if( obj->value[3] != WEAPON_BLASTER && obj->value[3] != WEAPON_BLASTER_RIFLE && obj->value[3] != WEAPON_HEAVY
&& obj->value[3] != WEAPON_BOWCASTER && obj->value[3] != WEAPON_FORCE_PIKE && obj->value[3] != WEAPON_LIGHTSABER
&& obj->value[3] != WEAPON_DUAL_LIGHTSABER )
{
send_to_char( "That weapon doesn't have an energy source.\n\r", ch );
return;
}
if( IS_NPC(victim) )
save = ( number_range(1,20) + victim->top_level/2 );
else
save = ( number_range(1,20) + GET_WILL(victim) );
if( obj->value[3] == WEAPON_LIGHTSABER || obj->value[3] == WEAPON_DUAL_LIGHTSABER )
cost = 8;
else
cost = 4;
if( ch->hit <= cost )
{
send_to_char( "You lack the vitality for this.\n\r", ch );
return;
}
if( ( vict = who_fighting( ch ) ) == NULL )
set_fighting( ch, victim );
ch->hit -= cost;
gain_darkpoint( ch );
update_pos( ch );
if( save >= diff )
{
act( AT_BLOOD, "$n fails in $e attempt to drain your $o of energy.", ch, obj, victim, TO_VICT );
act( AT_BLOOD, "You fail in your attempt to drain $N's $o of energy.", ch, obj, victim, TO_CHAR );
act( AT_BLOOD, "$n fails in $e attempt to drain $N's $o of energy.", ch, obj, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}
obj->value[4] = 0;
act( AT_BLOOD, "Your $o sputters as $n drains it of energy.", ch, obj, victim, TO_VICT );
act( AT_BLOOD, "$N's $o sputters as you drain it of energy.", ch, obj, victim, TO_CHAR );
act( AT_BLOOD, "$n's $o sputters as $n drains it of energy.", ch, obj, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
return;
}