#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "mud.h"
extern int top_affect;
void fskill_refresh(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
fskill = force_test_skill_use("meditate",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
switch(ch->substate)
{
default:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[0]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[0]));
add_timer ( ch , TIMER_DO_FUN , 5 , fskill_refresh , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_REFRESH])
{
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
ch->substate = SUB_NONE;
return;
}
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[1]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[1]));
ch->mana+=number_range(10,ch->force_control*40/100)*ch->force_level_status;
if(ch->mana > ch->max_mana)
ch->mana = ch->max_mana;
force_learn_from_success(ch,fskill);
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_awareness(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
fskill = force_test_skill_use("awareness",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
if(IS_AFFECTED(ch, AFF_TRUESIGHT))
{
send_to_char("You are already fully aware.\n\r", ch);
return;
}
switch(ch->substate)
{
default:
send_to_char("You close your eyes, and focus on nothing.\n\r", ch);
act(AT_PLAIN, "$n closes $s eyes.", ch, NULL, NULL, TO_ROOM);
add_timer ( ch , TIMER_DO_FUN , 3 , fskill_awareness , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_AWARENESS])
{
send_to_char("You open your eyes, but everything looks the same.\n\r", ch);
act(AT_PLAIN, "$n opens $s eyes.", ch, NULL, NULL, TO_ROOM);
force_learn_from_failure(ch,fskill);
ch->substate = SUB_NONE;
return;
}
send_to_char("You open your eyes with greater awareness of your surroundings.\n\r", ch);
act(AT_PLAIN, "$n opens $s eyes.", ch, NULL, NULL, TO_ROOM);
ch->mana-=fskill->cost;
break;
case SUB_TIMER_DO_ABORT:
send_to_char("You open your eyes, but everything looks the same.\n\r", ch);
act(AT_PLAIN, "$n opens $s eyes.", ch, NULL, NULL, TO_ROOM);
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_finfo(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill,*skill;
int count;
fskill = force_test_skill_use("finfo",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_FINFO])
{
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_learn_from_failure(ch,fskill);
return;
}
force_learn_from_success(ch,fskill);
draw_force_line(ch, 69);
if(ch->force_type == FORCE_JEDI)
send_to_char("\n\r &bYou are a &BJedi&b. ",ch);
if(ch->force_type == FORCE_SITH)
send_to_char("\n\r &rYou are a &RSith&r. ",ch);
ch_printf(ch," Mana: %s%d%s/%s%d ",
ch->force_type == FORCE_JEDI ? "&B" : "&R", ch->mana,
ch->force_type == FORCE_JEDI ? "&b" : "&r",
ch->force_type == FORCE_JEDI ? "&B" : "&R", ch->max_mana);
ch_printf(ch,"%sLevel: %s\r\n",
ch->force_type == FORCE_JEDI ? "&b" : "&r",
ch->force_type == FORCE_JEDI ? force_parse_string(ch,NULL,"&B$nfl") : force_parse_string(ch, NULL, "&R$nfl"));
draw_force_line_rev(ch, 69);
ch_printf(ch,"\r\n\r\n");
// Level 1 skills
if(ch->force_type == FORCE_JEDI)
send_to_char(" &z(&BApprentice &bskills&z)", ch);
else
send_to_char(" &z(&RApprentice &rskills&z)", ch);
send_to_char("\n\r", ch);
for(count=1,skill = first_force_skill;skill;skill = skill->next,count++)
{
if(skill->status != 1) { count--; continue; }
if(ch->force_skill[skill->index] == 0 || skill->notskill == 1)
{
count--;
continue;
}
/*
if(ch->force_converted)
{
if(fskill->status > ch->force_level_status && fskill->type == ch->force_type)
{
count--;
continue;
}
}
else if(fskill->status > ch->force_level_status)
{
count--;
continue;
}*/
ch_printf(ch," %s %s%-15s %s(%s%3d%%%s)&w ",
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", skill->name,
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", ch->force_skill[skill->index],
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W");
if(count == 3)
{
send_to_char("\n\r",ch);
count = 0;
}
}
send_to_char("\n\r", ch);
// Level 2 skills
if(ch->force_level_status >= 2)
{
if(ch->force_type == FORCE_JEDI)
send_to_char(" &z(&BJedi Knight &bskills&z)", ch);
else
send_to_char(" &z(&RSith Lord &rskills&z)", ch);
send_to_char("\n\r", ch);
for(count=1,skill = first_force_skill;skill;skill = skill->next,count++)
{
if(skill->status != 2) { count--; continue; }
if(ch->force_skill[skill->index] == 0 || skill->notskill == 1)
{
count--;
continue;
}
/*
if(ch->force_converted)
{
if(fskill->status > ch->force_level_status && fskill->type == ch->force_type)
{
count--;
continue;
}
}
else if(fskill->status > ch->force_level_status)
{
count--;
continue;
}*/
ch_printf(ch," %s %s%-15s %s(%s%3d%%%s)&w ",
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", skill->name,
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", ch->force_skill[skill->index],
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W");
if(count == 3)
{
send_to_char("\n\r",ch);
count = 0;
}
}
send_to_char("\n\r\n\r", ch);
}
if(ch->force_level_status >= 3)
{
// Level 3 skills
if(ch->force_type == FORCE_JEDI)
send_to_char(" &z(&BJedi Master &bskills&z)", ch);
else
send_to_char(" &z(&RSith Master &rskills&z)", ch);
send_to_char("\n\r", ch);
for(count=1,skill = first_force_skill;skill;skill = skill->next,count++)
{
if(skill->status != 3) { count--; continue; }
if(ch->force_skill[skill->index] == 0 || skill->notskill == 1)
{
count--;
continue;
}
/*
if(ch->force_converted)
{
if(fskill->status > ch->force_level_status && fskill->type == ch->force_type)
{
count--;
continue;
}
}
else if(fskill->status > ch->force_level_status)
{
count--;
continue;
}*/
ch_printf(ch," %s %s%-15s %s(%s%3d%%%s)&w ",
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", skill->name,
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W",
skill->type == FORCE_JEDI ? "&B" :
skill->type == FORCE_SITH ? "&R" : "&w", ch->force_skill[skill->index],
skill->type == FORCE_JEDI ? "&b" :
skill->type == FORCE_SITH ? "&r" : "&W");
if(count == 3)
{
send_to_char("\n\r",ch);
count = 0;
}
}
}
if(count != 0)
send_to_char("\n\r\n\r",ch);
return;
}
void fskill_student(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
fskill = force_test_skill_use("apprentice",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_IMMORTAL(ch))
{
send_to_char("You cannot have an apprentice.\r\n",ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to make them an apprentice.\r\n",ch);
return;
}
if(victim->force_identified != 1)
{
send_to_char("You must sense if the force lies in that one first.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You cannot be your own master.\r\n",ch);
return;
}
if(victim->force_type != FORCE_GENERAL && victim->force_type != ch->force_type)
{
send_to_char("You cannot make that person your apprentice.\r\n",ch);
return;
}
if(victim->force_level_status > FORCE_KNIGHT)
{
send_to_char("You cannot take a master as your apprentice.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
STRFREE( victim->force_temp_master );
victim->force_temp_master = STRALLOC( ch->name );
return;
}
void fskill_master(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
fskill = force_test_skill_use("master",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to take them as your master.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You cannot be your own apprentice.\r\n",ch);
return;
}
if(strcmp(ch->force_temp_master,victim->name))
{
send_to_char("They havn't asked you to be their apprentice.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
STRFREE( ch->force_master );
ch->force_master = STRALLOC( ch->force_temp_master );
if(ch->force_level_status < FORCE_APPRENTICE)
ch->force_level_status = FORCE_APPRENTICE;
if(victim->force_type != ch->force_type && ch->force_type != FORCE_GENERAL)
{
ch->force_converted = 1;
ch->force_level_status = FORCE_APPRENTICE;
}
ch->force_type = victim->force_type;
ch->max_mana = (ch->force_control + ch->force_sense + ch->force_alter) * 3 * ch->force_level_status;
ch->mana = ch->max_mana;
return;
}
void fskill_identify(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
int force_calc;
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
fskill = force_test_skill_use("sense",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_NPC(victim))
{
send_to_char("You cannot sense a NPC.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You sense much force in yourself...\r\n",ch);
return;
}
switch(ch->substate)
{
default:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
ch->dest_buf = str_dup(argument);
add_timer ( ch , TIMER_DO_FUN , 5 , fskill_identify , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_IDENTIFY])
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
force_learn_from_failure(ch,fskill);
ch->substate = SUB_NONE;
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
if(victim->force_identified == 0)
{
bug("(%s)Force_chance: %d",victim->name,victim->force_chance);
if(victim->force_chance != 0)
force_calc = number_range(victim->force_chance,20);
else
force_calc = number_range(-300,10);
bug("(%s)Force_calc: %d",victim->name,force_calc);
}
if(force_calc > 0 && victim->force_identified == 0)
{
int base,x;
base = force_calc*100/20;
victim->perm_frc = force_calc;
victim->force_control = number_range(base,100);
victim->force_alter = number_range(base,100);
victim->force_sense = number_range(base,100);
victim->force_identified = 1;
x=victim->force_control+victim->force_alter+victim->force_sense;
if(x < 150)
send_to_char(force_parse_string(ch,victim,"The force is with this one.\r\n"),ch);
else if(x >= 150 && x < 200)
send_to_char(force_parse_string(ch,victim,"The force is strong with this one.\n\r"), ch);
else if(x >= 200 && x < 225)
send_to_char(force_parse_string(ch,victim,"The force is very strong with this one.\n\r"), ch);
else if(x >= 225 && x < 250)
send_to_char(force_parse_string(ch,victim,"The force is exceedingly strong with this one...\n\r"), ch);
else
send_to_char(force_parse_string(ch,victim,"You feel briefly lightheaded...the force possesses this one like few others..."), ch);
}
else if(victim->force_identified == 1 || victim->force_identified == 2)
{
int x;
victim->force_identified =1;
x=victim->force_control+victim->force_alter+victim->force_sense;
if(x < 150)
send_to_char(force_parse_string(ch,victim,"The force is with this one.\r\n"),ch);
else if(x >= 150 && x < 200)
send_to_char(force_parse_string(ch,victim,"The force is strong with this one.\n\r"), ch);
else if(x >= 200 && x < 225)
send_to_char(force_parse_string(ch,victim,"The force is very strong with this one.\n\r"), ch);
else if(x >= 225 && x < 250)
send_to_char(force_parse_string(ch,victim,"The force is exceedingly strong with this one...\n\r"), ch);
else
send_to_char(force_parse_string(ch,victim,"You feel briefly lightheaded...the force possesses this one like few others..."), ch);
}
else
{
send_to_char(force_parse_string(ch,victim,"The force is not with that one.\r\n"),ch);
victim->force_identified = -1;
}
force_learn_from_success(ch,fskill);
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_promote(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
fskill = force_test_skill_use("promote",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to promote them.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You cannot promote yourself.\r\n",ch);
return;
}
if(victim->force_identified != 1)
{
send_to_char(force_parse_string(ch,victim,"$n has not been identified as having ability in the force.\r\n"),ch);
return;
}
if(victim->force_level_status == FORCE_MASTER)
{
send_to_char(force_parse_string(ch,victim,"$n has no need to be promoted!\r\n"),ch);
return;
}
/*
if(victim->force_level_status == FORCE_KNIGHT && victim->force_type == FORCE_JEDI)
{
send_to_char(force_parse_string(ch,victim,"$n cannot be promoted until the Jedi council is finished!\r\n"),ch);
return;
}
*/
if(strcmp(victim->force_master,ch->name))
{
send_to_char("You can only promote your own student.\r\n",ch);
return;
}
if(!force_promote_ready(victim))
{
send_to_char("They are not ready to be promoted yet.\r\n",ch);
return;
}
victim->force_level_status++;
if(victim->force_level_status == FORCE_MASTER)
victim->force_converted = 0;
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
victim->max_mana = (victim->force_control + victim->force_sense + victim->force_alter) * 3 * victim->force_level_status;
victim->mana = ch->max_mana;
return;
}
void fskill_instruct(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill,*skill;
CHAR_DATA *victim;
bool SKILL_FOUND = FALSE;
char name[MAX_STRING_LENGTH];
fskill = force_test_skill_use("instruct",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to instruct them.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You cannot instruct yourself.\r\n",ch);
return;
}
argument = one_argument(argument,name);
if(argument[0] == '\0')
{
send_to_char("You must specify what to instruct them in.\r\n",ch);
return;
}
for(skill = first_force_skill;skill;skill = skill->next)
{
if(skill->status <= ch->force_level_status && !strcmp(argument,skill->name) && (skill->type == FORCE_GENERAL || skill->type == ch->force_type) && skill->notskill == 0)
{
SKILL_FOUND = TRUE;
break;
}
}
if(!SKILL_FOUND)
{
send_to_char("That is not a force skill.\r\n",ch);
return;
}
if(skill->status > victim->force_level_status)
{
send_to_char("You cannot teach that person that force skill.\r\n",ch);
return;
}
if(ch->force_skill[skill->index] < 1)
{
send_to_char("You can only instruct a skill that you know.\r\n",ch);
return;
}
if(skill->type != ch->force_type && skill->type != FORCE_GENERAL)
{
send_to_char("You cannot teach that skill.\r\n",ch);
return;
}
if(victim->force_skill[skill->index] != 0)
{
send_to_char("You cannot teach that person that force skill.\r\n",ch);
return;
}
if(victim->force_type != ch->force_type && skill->type != FORCE_GENERAL)
{
send_to_char("You cannot teach that person that force skill.\r\n",ch);
return;
}
if(ch->force_type == FORCE_SITH && victim->force_master != ch->name)
{
send_to_char("You are only allowed to teach your own student.\r\n",ch);
return;
}
victim->force_skill[skill->index] = 1;
send_to_char(force_parse_string(ch,victim,strrep(fskill->ch_effect[0],"$s",skill->name)),ch);
send_to_char(force_parse_string(ch,victim,strrep(fskill->victim_effect[0],"$s",skill->name)),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,strrep(fskill->room_effect[0],"$s",skill->name)));
return;
}
void fskill_heal(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
fskill = force_test_skill_use("heal",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
switch(ch->substate)
{
default:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[0]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[0]));
add_timer ( ch , TIMER_DO_FUN , 10 , fskill_heal , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_HEAL])
{
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
ch->substate = SUB_NONE;
return;
}
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[1]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[1]));
ch->hit+=number_range(1,ch->force_control*500/100);
if(ch->hit > ch->max_hit)
ch->hit = ch->max_hit;
force_learn_from_success(ch,fskill);
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_protect(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
AFFECT_DATA af;
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
fskill = force_test_skill_use("protect",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to protect them.\r\n",ch);
return;
}
if(ch == victim)
{
send_to_char("You cannot protect yourself.\r\n",ch);
return;
}
switch(ch->substate)
{
default:
if(IS_AFFECTED(victim, AFF_SANCTUARY))
{
send_to_char("They already have protection.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
ch->dest_buf = str_dup(argument);
add_timer ( ch , TIMER_DO_FUN , 5 , fskill_protect , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_PROTECT])
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
victim->hit-=ch->force_alter*25/100;
ch->substate = SUB_NONE;
return;
}
af.type = TYPE_HIT;
af.duration = ch->force_alter*50/100;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_SANCTUARY;
affect_to_char(victim,&af);
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
force_learn_from_success(ch,fskill);
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
victim->hit-=ch->force_alter*25/100;
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_fshield(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
AFFECT_DATA af;
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
fskill = force_test_skill_use("fshield",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = ch;
switch(ch->substate)
{
default:
if(IS_AFFECTED(victim, AFF_SANCTUARY))
{
send_to_char("You already have a shield.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[0]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[0]));
ch->dest_buf = str_dup(argument);
add_timer ( ch , TIMER_DO_FUN , 5 , fskill_fshield , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_SHIELD])
{
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
victim->hit-=ch->force_alter*25/100;
ch->substate = SUB_NONE;
return;
}
af.type = skill_lookup("sanctuary");
af.duration = ch->force_alter*50/100*2;
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_SANCTUARY;
affect_to_char(victim,&af);
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[1]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[1]));
force_learn_from_success(ch,fskill);
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
victim->hit-=ch->force_alter*25/100;
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void secondslash(CHAR_DATA *ch, CHAR_DATA *victim)
{
int dam;
if(!ch || !victim) return;
ch_printf(ch, "You follow through with the other end of your saber.\n\r", PERS(victim, ch));
ch_printf(victim, "%s follows through with the other end of their saber!\n\r", PERS(ch, victim));
act(AT_WHITE, "$n follows through with the other end of their saber!\n\r", ch, NULL, victim, TO_NOTVICT);
if(number_range(0,4) != 0 && number_range(0,125) > URANGE(1,ch->force_skill[FORCE_SKILL_STRIKE],75))
{
ch_printf(ch, "The slash barely misses them.\n\r");
ch_printf(victim,"The other end of the saber cuts the air inches away from you.\n\r");
act(AT_WHITE, "$n's slash barely misses $N.", ch, NULL, victim, TO_NOTVICT);
set_fighting(victim, ch);
return;
}
ch_printf(ch, "Your attack cleanly slices into them!\n\r");
ch_printf(victim, "The other end of the saber slides along your torso!\n\r");
act(AT_WHITE, "$N grimaces as $n's lightsaber slices into them!", ch, NULL, victim, TO_NOTVICT);
dam = URANGE(40,number_range(0,ch->force_skill[FORCE_SKILL_STRIKE] * ch->force_control / (20 * (4-ch->force_level_status))),100);
if(IS_AFFECTED(victim, AFF_SANCTUARY))
dam /= 2;
victim->hit-=dam/2;
return;
}
void fskill_slash(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
OBJ_DATA *wield;
CHAR_DATA *victim;
int dam;
fskill = force_test_skill_use("slash",ch,FORCE_COMBAT);
if(fskill == NULL)
return;
if(!ch->fighting)
{
if ( ( wield = get_eq_char( ch, WEAR_WIELD ) ) == NULL || ( ( wield->value[3] != WEAPON_LIGHTSABER ) && (wield->value[3] != WEAPON_DUAL_LIGHTSABER) ))
{
if ( ( wield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) == NULL || (( wield->value[3] != WEAPON_LIGHTSABER ) && (wield->value[3] != WEAPON_DUAL_LIGHTSABER) ))
{
send_to_char("You must be wielding a lightsaber to use this skill.\r\n",ch);
return;
}
}
if ( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
ch_printf(ch, "You swing your lightsaber at %s!\n\r", PERS(victim, ch));
ch_printf(victim, "%s swings their lightsaber at you!\n\r", PERS(ch, victim));
act(AT_WHITE, "$n swings their lightsaber at $N!\n\r", ch, NULL, victim, TO_NOTVICT);
if(number_range(0,4) != 0 && number_range(0,100) > URANGE(1,ch->force_skill[FORCE_SKILL_STRIKE],75))
{
ch_printf(ch, "Your lightsaber cuts the air inches away from them.\n\r");
ch_printf(victim,"Their lightsaber cuts the air inches away from your midsection.\n\r");
act(AT_WHITE, "$n's slash barely misses $N.", ch, NULL, victim, TO_NOTVICT);
if(wield->value[3] == WEAPON_DUAL_LIGHTSABER) secondslash(ch, victim);
force_learn_from_failure(ch,fskill);
return;
}
ch_printf(ch, "Your attack cleanly slices across their midsection!\n\r");
ch_printf(victim, "Their attack cleanly slices across your midsection!\n\r");
act(AT_WHITE, "$N grimaces as $n's lightsaber slices into them!", ch, NULL, victim, TO_NOTVICT);
dam = URANGE(40,number_range(0,ch->force_skill[FORCE_SKILL_STRIKE] * ch->force_control / (20 * (4-ch->force_level_status))),100);
if(IS_AFFECTED(victim, AFF_SANCTUARY))
dam /= 2;
victim->hit-=dam*1.5;
if(wield->value[3] == WEAPON_DUAL_LIGHTSABER) secondslash(ch, victim);
set_fighting(victim, ch);
force_learn_from_success(ch,fskill);
return;
}
victim = ch->fighting->who;
if ( ( wield = get_eq_char( ch, WEAR_WIELD ) ) == NULL || (( wield->value[3] != WEAPON_LIGHTSABER ) && (wield->value[3] != WEAPON_DUAL_LIGHTSABER)) )
{
if ( ( wield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) == NULL || (( wield->value[3] != WEAPON_LIGHTSABER ) && (wield->value[3] != WEAPON_DUAL_LIGHTSABER)))
{
send_to_char("You must be wielding a lightsaber to use this skill.\r\n",ch);
return;
}
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
if(number_range(0,4) != 0 && number_range(0,100) > URANGE(1,ch->force_skill[FORCE_SKILL_STRIKE],75))
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[4]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[4]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[4]));
if(wield->value[3] == WEAPON_DUAL_LIGHTSABER) secondslash(ch, victim);
force_learn_from_failure(ch,fskill);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
dam = URANGE(40,number_range(0,ch->force_skill[FORCE_SKILL_STRIKE] * ch->force_control / (20 * (4-ch->force_level_status))),100);
if(IS_AFFECTED(victim, AFF_SANCTUARY))
dam /= 2;
victim->hit-=dam;
if(wield->value[3] == WEAPON_DUAL_LIGHTSABER) secondslash(ch, victim);
force_learn_from_success(ch,fskill);
return;
}
void fskill_whirlwind(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
OBJ_DATA *wield;
CHAR_DATA *victim;
int dam;
fskill = force_test_skill_use("whirlwind",ch,FORCE_COMBAT);
if(fskill == NULL)
return;
victim = ch->fighting->who;
if ( ( wield = get_eq_char( ch, WEAR_WIELD ) ) == NULL || ( wield->value[3] != WEAPON_LIGHTSABER ) )
{
if ( ( wield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) == NULL || ( (wield->value[3] != WEAPON_LIGHTSABER ) && (wield->value[3] != WEAPON_DUAL_LIGHTSABER)))
{
send_to_char("You must be wielding a lightsaber to use this skill.\r\n",ch);
return;
}
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
if(number_range(0,4) != 0 && number_range(0,100) > URANGE(1,ch->force_skill[FORCE_SKILL_WHIRLWIND],75))
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[4]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[4]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[4]));
force_learn_from_failure(ch,fskill);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
dam = URANGE(40,number_range(0,ch->force_skill[FORCE_SKILL_WHIRLWIND] * ch->force_control / (20 * (4-ch->force_level_status))),100);
if(IS_AFFECTED(victim, AFF_SANCTUARY))
dam /= 2;
victim->hit-=dam;
force_learn_from_success(ch,fskill);
return;
}
void fskill_squeeze(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
AFFECT_DATA af;
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
fskill = force_test_skill_use("choke",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
{
ch->substate = SUB_NONE;
return;
}
if(ch == victim)
{
send_to_char("You cannot squeeze yourself.\r\n",ch);
return;
}
if(IS_AFFECTED(victim, AFF_PARALYSIS))
{
send_to_char("They already are paralyzed.\r\n",ch);
return;
}
switch(ch->substate)
{
default:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
ch->dest_buf = str_dup(argument);
add_timer ( ch , TIMER_DO_FUN , 2 , fskill_squeeze , 1 );
return;
case 1:
if(number_range(0,4) != 0 && (number_range(0,100) > ch->force_skill[FORCE_SKILL_SQUEEZE] || number_range(0,100) > ch->force_control))
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
ch->hit-=ch->force_alter*25/100;
ch->substate = SUB_NONE;
return;
}
af.type = TYPE_HIT;
af.duration = number_range(ch->force_alter*30/100,30);
af.location = APPLY_NONE;
af.modifier = 0;
af.bitvector = AFF_PARALYSIS;
affect_to_char(victim,&af);
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
force_learn_from_success(ch,fskill);
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
victim->hit-=ch->force_alter*25/100;
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_force_lightning(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
OBJ_DATA *wield;
CHAR_DATA *victim;
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
fskill = force_test_skill_use("lightning",ch,FORCE_COMBAT);
if(fskill == NULL)
return;
victim = ch->fighting->who;
if(!victim)
{
ch->substate = SUB_NONE;
return;
}
if(ch == victim)
{
send_to_char("You cannot cast force lightning on yourself.\r\n",ch);
return;
}
victim = ch->fighting->who;
if ( ( wield = get_eq_char( ch, WEAR_WIELD ) ) != NULL || ( wield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) != NULL)
{
send_to_char("You cannot be wielding anything when you use this skill.\r\n",ch);
return;
}
switch(ch->substate)
{
default:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
ch->dest_buf = str_dup(argument);
add_timer ( ch , TIMER_DO_FUN , 2 , fskill_force_lightning , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_FORCE_LIGHTNING])
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
ch->hit-=((ch->force_alter*40/100)+(ch->force_sense*40/100)+(ch->force_control*40/100));
ch->substate = SUB_NONE;
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
victim->hit-=number_range(50,((ch->force_alter*200/100)+(ch->force_sense*200/100)+(ch->force_control*200/100)));
force_learn_from_success(ch,fskill);
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[2]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[2]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[2]));
ch->hit-=((ch->force_alter*40/100)+(ch->force_sense*40/100)+(ch->force_control*40/100));
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void fskill_fdisguise(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
fskill = force_test_skill_use("fdisguise",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
if(argument[0] == '\0' && !ch->dest_buf)
{
send_to_char("You have to specify a disguise.\r\n",ch);
return;
}
if(argument[0] == '\0')
argument = str_dup(ch->dest_buf);
if(!strcmp(argument,"clear"))
{
if(!ch->pcdata->disguise)
{
send_to_char("You are not disguised right now.\r\n",ch);
return;
}
STRFREE(ch->pcdata->disguise);
ch->pcdata->disguise = STRALLOC( "" );
send_to_char("Disguise removed.\r\n",ch);
ch->mana+=fskill->cost;
ch->substate = SUB_NONE;
if ( !ch->dest_buf )
return;
DISPOSE( ch->dest_buf );
return;
}
switch(ch->substate)
{
default:
ch->dest_buf = str_dup(argument);
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[0]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[0]));
add_timer ( ch , TIMER_DO_FUN , 5 , fskill_fdisguise , 1 );
return;
case 1:
if(number_range(0,4) != 0 && number_range(0,100) > ch->force_skill[FORCE_SKILL_DISGUISE])
{
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
force_learn_from_failure(ch,fskill);
ch->substate = SUB_NONE;
DISPOSE( ch->dest_buf );
return;
}
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[1]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[1]));
force_learn_from_success(ch,fskill);
ch->pcdata->disguise = str_dup( argument );
if ( !ch->dest_buf )
break;
DISPOSE( ch->dest_buf );
break;
case SUB_TIMER_DO_ABORT:
send_to_char(force_parse_string(ch,NULL,fskill->ch_effect[2]),ch);
force_send_to_room(ch,NULL,force_parse_string(ch,NULL,fskill->room_effect[2]));
DISPOSE( ch->dest_buf );
break;
}
ch->substate = SUB_NONE;
return;
}
void do_make_master(CHAR_DATA *ch,char *argument)
{
char force_type[MAX_STRING_LENGTH];
int ft;
CHAR_DATA *victim;
FORCE_SKILL *skill;
/* if(str_cmp(ch->name,"bambua"))
return;
*/ argument = one_argument(argument,force_type);
ft = atoi(force_type);
if (ft < 1 || ft > 2) {
send_to_char ("Invalid option; use 1 for Jedi, 2 for Sith.\r\n", ch);
return;
}
victim = get_char_world( ch, argument );
if (!victim)
return;
victim->force_identified = 1;
victim->force_type = ft;
victim->force_level_status = 3;
if(ft == 1)
victim->force_align = 100;
else
victim->force_align = -100;
for(skill = first_force_skill;skill;skill = skill->next)
if((skill->type == ft || skill->type == FORCE_GENERAL) && (strcmp(skill->name,"master") && strcmp(skill->name,"student") && strcmp(skill->name,"promote") && strcmp(skill->name,"instruct")))
{
if(victim->force_skill[skill->index] < 50)
victim->force_skill[skill->index] = 50;
}
else
victim->force_skill[skill->index] = 0;
send_to_char("Set.\r\n",ch);
return;
}
void fskill_makelightsaber( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkdura, checkbatt,
checkoven, checkcond, checkcirc, checklens, checkgems, checkmirr;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, level, gems, charge, gemtype;
AFFECT_DATA *paf;
AFFECT_DATA *paf2;
FORCE_SKILL *fskill;
fskill = force_test_skill_use("makelightsaber",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makelightsaber <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
if ( !IS_SET( ch->in_room->room_flags, ROOM_SAFE ) || !IS_SET( ch->in_room->room_flags, ROOM_SILENCE ))
{
send_to_char( "&RYou need to be in a quiet peaceful place to craft a lightsaber.\n\r", ch);
return;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_LENS)
checklens = TRUE;
if (obj->item_type == ITEM_CRYSTAL)
checkgems = TRUE;
if (obj->item_type == ITEM_MIRROR)
checkmirr = TRUE;
if (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL )
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_SUPERCONDUCTOR)
checkcond = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a lightsaber.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your lightsaber.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat and shape the components.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit board.\n\r", ch);
return;
}
if ( !checkcond )
{
send_to_char( "&RYou still need a small superconductor for your lightsaber.\n\r", ch);
return;
}
if ( !checklens )
{
send_to_char( "&RYou still need a lens to focus the beam.\n\r", ch);
return;
}
if ( !checkgems )
{
send_to_char( "&RLightsabers require 1 to 3 gems to work properly.\n\r", ch);
return;
}
if ( !checkmirr )
{
send_to_char( "&RYou need a high intesity reflective cup to create a lightsaber.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->force_skill[FORCE_SKILL_MAKELIGHTSABER]);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the long process of crafting a lightsaber.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , fskill_makelightsaber , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou can't figure out how to fit the parts together.\n\r",ch);
force_learn_from_failure(ch, fskill);
return;
case 1:
if ( !ch->dest_buf )
return;
strcpy(arg, ch->dest_buf);
DISPOSE( ch->dest_buf);
break;
case SUB_TIMER_DO_ABORT:
DISPOSE( ch->dest_buf );
ch->substate = SUB_NONE;
send_to_char("&RYou are interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (ch->force_skill[FORCE_SKILL_MAKELIGHTSABER]);
vnum = SABER_VNUM;
if ( ( pObjIndex = get_obj_index( vnum ) ) == NULL )
{
send_to_char( "&RThe item you are trying to create is missing from the database.\n\rPlease inform the administration of this error.\n\r", ch );
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
gems = 0;
charge = 0;
gemtype = 0;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if ( (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL) && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE)
{
charge = UMIN(obj->value[1], 10);
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
if (obj->item_type == ITEM_SUPERCONDUCTOR && checkcond == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcond = TRUE;
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
if (obj->item_type == ITEM_LENS && checklens == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checklens = TRUE;
}
if (obj->item_type == ITEM_MIRROR && checkmirr == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkmirr = TRUE;
}
if (obj->item_type == ITEM_CRYSTAL && gems < 3)
{
gems++;
if ( gemtype < obj->value[0] )
gemtype = obj->value[0];
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkgems = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->force_skill[FORCE_SKILL_MAKELIGHTSABER]) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven )
|| ( !checkmirr ) || ( !checklens ) || ( !checkgems ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RYou hold up your new lightsaber and press the switch hoping for the best.\n\r", ch);
send_to_char( "&RInstead of a blade of light, smoke starts pouring from the handle.\n\r", ch);
send_to_char( "&RYou drop the hot handle and watch as it melts on away on the floor.\n\r", ch);
force_learn_from_failure(ch, fskill);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
SET_BIT( obj->extra_flags, ITEM_CONTRABAND);
obj->level = level;
obj->weight = 5;
STRFREE( obj->name );
obj->name = STRALLOC( "lightsaber saber" );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
STRFREE( obj->action_desc );
strcpy( buf, arg );
strcat( buf, " ignites with a hum and a soft glow." );
obj->action_desc = STRALLOC( buf );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "hitroll" );
paf->modifier = URANGE( 0, gems, level/30 );
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
CREATE( paf2, AFFECT_DATA, 1 );
paf2->type = -1;
paf2->duration = -1;
paf2->location = get_atype( "parry" );
paf2->modifier = ( level/3 );
paf2->bitvector = 0;
paf2->next = NULL;
LINK( paf2, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
obj->value[0] = INIT_WEAPON_CONDITION; /* condition */
obj->value[1] = (int) (level/10+gemtype*2)*ch->force_level_status; /* min dmg */
obj->value[2] = (int) (level/5+gemtype*6)*ch->force_level_status; /* max dmg */
obj->value[3] = WEAPON_LIGHTSABER;
obj->value[4] = (1000+charge)*ch->force_level_status;
obj->value[5] = (1000+charge)*ch->force_level_status;
obj->cost = 50000;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created lightsaber.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new lightsaber.", ch, NULL, argument , TO_ROOM );
{
// xpgain = UMIN( obj->cost/6.25 ,( exp_level(ch->skill_level[FORCE_ABILITY]+1) - exp_level(ch->skill_level[ENGINEERING_ABILITY]) ) );
// gain_exp(ch, xpgain, FORCE_ABILITY);
// ch_printf( ch , "You gain %d force experience.", xpgain );
}
force_learn_from_success( ch, fskill );
}
void fskill_makedualsaber( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkdura, checkbatt,
checkoven, checkcond, checkcirc, checklens, checkgems, checkmirr;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, level, gems, charge, gemtype;
AFFECT_DATA *paf;
FORCE_SKILL *fskill;
fskill = force_test_skill_use("makedualsaber",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makedualsaber <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
if ( !IS_SET( ch->in_room->room_flags, ROOM_SAFE ) || !IS_SET( ch->in_room->room_flags, ROOM_SILENCE ))
{
send_to_char( "&RYou need to be in a quiet peaceful place to craft a lightsaber.\n\r", ch);
return;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_LENS)
checklens = TRUE;
if (obj->item_type == ITEM_CRYSTAL)
checkgems = TRUE;
if (obj->item_type == ITEM_MIRROR)
checkmirr = TRUE;
if (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL )
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_SUPERCONDUCTOR)
checkcond = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a dual-bladed lightsaber.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your dual-bladed lightsaber.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat and shape the components.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit board.\n\r", ch);
return;
}
if ( !checkcond )
{
send_to_char( "&RYou still need a small superconductor for your dual-bladed lightsaber.\n\r", ch);
return;
}
if ( !checklens )
{
send_to_char( "&RYou still need a lens to focus the beams.\n\r", ch);
return;
}
if ( !checkgems )
{
send_to_char( "&RLightsabers require 1 to 3 gems to work properly.\n\r", ch);
return;
}
if ( !checkmirr )
{
send_to_char( "&RYou need a high intesity reflective cup to create a lightsaber.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->force_skill[FORCE_SKILL_MAKEDUALSABER]);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the long process of crafting a dual-bladed lightsaber.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , fskill_makedualsaber , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou can't figure out how to fit the parts together.\n\r",ch);
force_learn_from_failure(ch, fskill);
return;
case 1:
if ( !ch->dest_buf )
return;
strcpy(arg, ch->dest_buf);
DISPOSE( ch->dest_buf);
break;
case SUB_TIMER_DO_ABORT:
DISPOSE( ch->dest_buf );
ch->substate = SUB_NONE;
send_to_char("&RYou are interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (ch->force_skill[FORCE_SKILL_MAKEDUALSABER]);
vnum = SABER_VNUM;
if ( ( pObjIndex = get_obj_index( vnum ) ) == NULL )
{
send_to_char( "&RThe item you are trying to create is missing from the database.\n\rPlease inform the administration of this error.\n\r", ch );
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
gems = 0;
charge = 0;
gemtype = 0;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if ( (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL) && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE)
{
charge = UMIN(obj->value[1], 10);
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
if (obj->item_type == ITEM_SUPERCONDUCTOR && checkcond == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcond = TRUE;
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
if (obj->item_type == ITEM_LENS && checklens == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checklens = TRUE;
}
if (obj->item_type == ITEM_MIRROR && checkmirr == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkmirr = TRUE;
}
if (obj->item_type == ITEM_CRYSTAL && gems < 3)
{
gems++;
if ( gemtype < obj->value[0] )
gemtype = obj->value[0];
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkgems = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->force_skill[FORCE_SKILL_MAKEDUALSABER]) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven )
|| ( !checkmirr ) || ( !checklens ) || ( !checkgems ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RYou hold up your new dual-bladed lightsaber and press the switch.\n\r", ch);
send_to_char( "&RInstead of a blade of light, smoke starts pouring from the handle.\n\r", ch);
send_to_char( "&RYou drop the hot handle and watch as it melts on away on the floor.\n\r", ch);
force_learn_from_failure(ch, fskill);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
SET_BIT( obj->extra_flags, ITEM_CONTRABAND);
obj->level = level;
obj->weight = 5;
STRFREE( obj->name );
obj->name = STRALLOC( "lightsaber saber dual" );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
STRFREE( obj->action_desc );
strcpy( buf, arg );
strcat( buf, " ignites with a hum and a soft glow." );
obj->action_desc = STRALLOC( buf );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "hitroll" );
paf->modifier = URANGE( 0, gems+4, 8 );
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
obj->value[0] = INIT_WEAPON_CONDITION; /* condition */
obj->value[1] = (int) (level/10+gemtype*2)*ch->force_level_status; /* min dmg */
obj->value[2] = (int) (level/5+gemtype*6)*ch->force_level_status; /* max dmg */
obj->value[3] = 12;
obj->value[4] = (1000+charge)*ch->force_level_status;
obj->value[5] = (1000+charge)*ch->force_level_status;
obj->cost = 50000;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created dual-bladed lightsaber.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new dual-bladed lightsaber.", ch, NULL, argument , TO_ROOM );
{
// xpgain = UMIN( obj->cost/6.25 ,( exp_level(ch->skill_level[FORCE_ABILITY]+1) - exp_level(ch->skill_level[ENGINEERING_ABILITY]) ) );
// gain_exp(ch, xpgain, FORCE_ABILITY);
// ch_printf( ch , "You gain %d force experience.", xpgain );
}
force_learn_from_success( ch, fskill );
}
void fskill_finish(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
OBJ_DATA *wield;
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
fskill = force_test_skill_use("finish",ch,FORCE_COMBAT);
if(fskill == NULL)
return;
victim = ch->fighting->who;
if ( ( wield = get_eq_char( ch, WEAR_WIELD ) ) == NULL || (( wield->value[3] != WEAPON_LIGHTSABER ) && wield->value[3] != WEAPON_DUAL_LIGHTSABER) )
{
if ( ( wield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) == NULL || ( wield->value[3] != WEAPON_LIGHTSABER ) )
{
send_to_char("You must be wielding a lightsaber to use this skill.\r\n",ch);
return;
}
}
if((IS_DROID(victim) && victim->hit > 125) || victim->hit > 75)
{
ch->mana += fskill->cost;
send_to_char("They are not ready to be finished off yet.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
if(number_range(0,4) != 0 && number_range(0,100) > URANGE(1,ch->force_skill[FORCE_SKILL_FINISH],75))
{
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[4]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[4]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[4]));
force_learn_from_failure(ch,fskill);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[1]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[1]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[1]));
/* if (IS_SET( victim->in_room->room_flags, ROOM_MINIARENA ) && !IS_NPC(victim) )
{
char minibuf[MAX_STRING_LENGTH];
sprintf(minibuf,"&C[&B-&c=&b| &G&W$n is surrounded by a blue glow before $e is killed &b|&c=&B-&C]&G&w\r\n");
act( AT_PLAIN, minibuf, victim,
NULL, minibuf , TO_ROOM );
send_to_char("&C[&B-&c=&b| &G&WYou are surrounded by a blue glow before you are killed &b|&c=&B-&C]&G&w\r\n",victim);
stop_fighting( victim, TRUE );
stop_fighting( ch, TRUE );
victim->hit = victim->max_hit;
victim->mana = victim->max_mana;
victim->move = victim->max_move;
ch->hit = ch->max_hit;
ch->mana = ch->max_mana;
ch->move = ch->max_move;
}
*/
if(IS_IMMORTAL(victim))
{
send_to_char("Normally this is the part where you die, considering you were just cut in half.\r\n",victim);
send_to_char("Due to your immortality though, you have surrvived the incredible trauma of being\r\n",victim);
send_to_char("severed in two.\r\n",victim);
stop_fighting(victim,TRUE);
}
else
{
sprintf(buf, "%s killed by %s at %d, using finish.\n\r",
victim->name, ch->name, ch->in_room->vnum);
log_string(buf);
raw_kill( ch, victim );
//add_plr_death(victim->name, "cut into two");
}
force_learn_from_success(ch,fskill);
return;
}
void fskill_fhelp(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
FORCE_HELP *fhelp,*fdefault;
bool match = FALSE;
int x,len;
fskill = force_test_skill_use("fhelp",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
if(!argument || argument[0] == '\0')
argument = STRALLOC( "force" );
for(fhelp = first_force_help;fhelp;fhelp = fhelp->next)
{
if(fhelp->type != ch->force_type && fhelp->type != FORCE_GENERAL)
continue;
if(fhelp->status > ch->force_level_status)
continue;
if(!strcmp(argument,fhelp->name))
{
match = TRUE;
break;
}
if(!strcmp("force",fhelp->name))
fdefault = fhelp;
}
if(!match)
{
fhelp = fdefault;
send_to_char("\r\nNo such Force Help file.\r\n\r\n",ch);
}
if(fhelp->skill != -1 && ch->force_skill[fhelp->skill] == 0)
{
send_to_char("You can only read help files on skills that you know.\r\n",ch);
return;
}
draw_force_line(ch,55);
send_to_char("\r\n",ch);
len = strlen(fhelp->name);
for(x=0;x<(70-len)/2;x++)
send_to_char(" ",ch);
x+=len;
ch_printf(ch,"&G&W%s\r\n",capitalize(strrep(fhelp->name,"_"," ")));
draw_force_line_rev(ch,55);
send_to_char("\r\n",ch);
send_to_char(force_parse_string(ch,NULL,fhelp->desc),ch);
return;
}
bool check_reflect(CHAR_DATA *ch,CHAR_DATA *victim, int dam)
{
OBJ_DATA *wield,*chwield;
CHAR_DATA *rch;
int chances;
if ( !IS_AWAKE(victim) )
return FALSE;
if(!IS_NPC(victim) && victim->force_skill[FORCE_SKILL_REFLECT] < 1)
return FALSE;
if ( ( wield = get_eq_char( victim, WEAR_WIELD ) ) == NULL ||
( wield->value[3] != WEAPON_LIGHTSABER ) )
{
if ( ( wield = get_eq_char( victim, WEAR_DUAL_WIELD ) ) == NULL ||
( wield->value[3] != WEAPON_LIGHTSABER ) )
return FALSE;
}
if( get_eq_char(ch,WEAR_WIELD) == NULL && get_eq_char( ch,WEAR_DUAL_WIELD) == NULL)
return FALSE;
if ( ( chwield = get_eq_char( ch, WEAR_WIELD ) ) == NULL || (
chwield->value[3] != WEAPON_BLASTER &&
chwield->value[3] != WEAPON_BOWCASTER ) )
{
if ( ( chwield = get_eq_char( ch, WEAR_DUAL_WIELD ) ) == NULL || (
chwield->value[3] != WEAPON_BLASTER &&
chwield->value[3] != WEAPON_BOWCASTER ) )
return FALSE;
}
chances = (int) (victim->force_skill[FORCE_SKILL_REFLECT] );
chances = chances*number_range(10,(25*victim->force_level_status))/100;
if ( number_range( 1, 100 ) > chances )
{
if(victim->force_level_status > 0)
force_learn_from_failure(victim,get_force_skill("reflect"));
return FALSE;
}
victim->pcdata->lost_attacks++;
{
char roombuf[MAX_STRING_LENGTH];
if(IS_NPC(ch))
{
ch_printf(victim,"&G&YYou swing your lightsaber in an arc, reflecting %s's blast!&w\r\n",ch->short_descr);
sprintf(roombuf,"&GY%s swings their lightsaber in an arc, reflecting %s's blast!&w\r\n",victim->name,ch->short_descr);
force_send_to_room(victim,NULL,roombuf);
}
else
{
ch_printf(victim,"&G&YYou swing your lightsaber in an arc, reflecting %s's blast!&G&w\r\n",ch->name);
sprintf(roombuf,"&G&Y%s swings their lightsaber in an arc, reflecting %s's blast!&w\r\n",victim->name,ch->name);
force_send_to_room(victim,NULL,roombuf);
}
}
if(number_range(1,100) > chances)
{
if(number_range(1,100) < URANGE(0,chances*victim->force_level_status,60))
{
char roombuf[MAX_STRING_LENGTH];
rch = ch;
if(rch)
{
if(IS_NPC(rch))
{
if(!rch->short_descr || rch->short_descr[0] == '\0')
bug("Fskill_reflect: Rch has no short %d",rch->pIndexData->vnum);
else if(!victim->name || victim->name[0] == '\0')
bug("Fskill_reflect: victim has no name");
else
{
ch_printf(victim,"You hit %s with a reflected shot.\r\n",rch->short_descr);
sprintf(roombuf,"%s hits %s with a reflected shot.\r\n",victim->name,rch->short_descr);
force_send_to_room(victim,rch,roombuf);
}
}
else
{
if(!rch->name || rch->name[0] == '\0')
bug("Fskill_reflect: Rch has no name");
else if(!victim->name || victim->name[0] == '\0')
bug("Fskill_reflect: victim has no name");
else
{
ch_printf(victim,"You hit %s with a reflected shot.\r\n",rch->name);
sprintf(roombuf,"%s hits %s with a reflected shot.\r\n",victim->name,rch->name);
force_send_to_room(victim,rch,roombuf);
ch_printf(rch,"%s hits you with a reflected shot.\r\n",victim->name);
}
}
rch->hit -= number_range(50,URANGE(50,dam/2,200));
if(rch->hit < 0)
rch->hit = 0;
}
}
else
{
for ( rch = ch->in_room->first_person; rch ; rch = rch->next_in_room )
{
if(number_range(1,100) > chances && rch != victim)
{
char roombuf[MAX_STRING_LENGTH];
if(!rch)
continue;
if(IS_NPC(rch))
{
if(!rch->short_descr || rch->short_descr[0] == '\0')
bug("Fskill_reflect: Rch has no short %d",rch->pIndexData->vnum);
else if(!victim->name || victim->name[0] == '\0')
bug("Fskill_reflect: victim has no name");
else
{
ch_printf(victim,"You hit %s with a reflected shot.\r\n",rch->short_descr);
sprintf(roombuf,"%s hits %s with a reflected shot.\r\n",victim->name,rch->short_descr);
force_send_to_room(victim,rch,roombuf);
}
}
else
{
if(!rch->name || rch->name[0] == '\0')
bug("Fskill_reflect: Rch has no name");
else if(!victim->name || victim->name[0] == '\0')
bug("Fskill_reflect: victim has no name");
else
{
ch_printf(victim,"You hit %s with a reflected shot.\r\n",rch->name);
sprintf(roombuf,"%s hits %s with a reflected shot.\r\n",victim->name,rch->name);
force_send_to_room(victim,rch,roombuf);
ch_printf(rch,"%s hits you with a reflected shot.\r\n",victim->name);
}
}
rch->hit -= number_range(50,URANGE(50,dam/2,200));
if(rch->hit < 0)
rch->hit = 0;
break;
}
}
}
}
if(victim->force_level_status > 0)
force_learn_from_success(victim,get_force_skill("reflect"));
return TRUE;
}
void fskill_convert(CHAR_DATA *ch, char *argument)
{
FORCE_SKILL *fskill;
CHAR_DATA *victim;
fskill = force_test_skill_use("convert",ch,FORCE_NONCOMBAT);
if(fskill == NULL)
return;
victim = force_get_victim(ch,argument,FORCE_INROOM);
if(!victim)
return;
if(IS_IMMORTAL(ch))
{
send_to_char("You cannot have a student.\r\n",ch);
return;
}
if(IS_NPC(victim))
{
send_to_char("You cannot find that player to convert them.\r\n",ch);
return;
}
if(victim->force_identified != 1)
{
send_to_char("That player has not been identified as having the force.\r\n",ch);
return;
}
if(victim == ch)
{
send_to_char("You cannot convert yourself.\r\n",ch);
return;
}
if(ch->force_type == FORCE_JEDI && victim->force_align < 0)
{
send_to_char("You cannot convert them until they control their anger.\r\n",ch);
return;
}
if(ch->force_type == FORCE_SITH && victim->force_align > 0)
{
send_to_char("You cannot convert them, the light side is still too strong in them.\r\n",ch);
return;
}
send_to_char(force_parse_string(ch,victim,fskill->ch_effect[0]),ch);
send_to_char(force_parse_string(ch,victim,fskill->victim_effect[0]),victim);
force_send_to_room(ch,victim,force_parse_string(ch,victim,fskill->room_effect[0]));
STRFREE( victim->force_temp_master );
victim->force_temp_master = STRALLOC( ch->name );
return;
}