#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; }