/*********************************************************************************** * * * _______.____ __ ____ _______ _______ * * / |\ \ / \ / / _ | ____| __ | ____| * * | (----` \ \/ \/ / (_) | |__ ____ _/ |_ | |__ * * \ \ \ / _ | __| / _ \ \ __\ | __| * * .----) | \ /\ / (_) | | ( <_> ) | | | |____ * * |_______/ \__/ \__/ |__| \____/ |__| |_______| * * * * SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded) by: * * Greg (Keberus) Mosley * * Roman (Trelar) Arnold * * * * SWFotE v1 & v1.1 copyright (c) 2002 was created by * * Chris 'Tawnos' Dary (cadary@uwm.edu), * * Korey 'Eleven' King (no email), * * Matt 'Trillen' White (mwhite17@ureach.com), * * Daniel 'Danimal' Berrill (danimal924@yahoo.com), * * Richard 'Bambua' Berrill (email unknown), * * Stuart 'Ackbar' Unknown (email unknown) * * * * SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper * * based on a concept and ideas from the original SWR immortals: * * Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn), * * Ackbar, Satin, Streen and Bib as well as much input from our other builders * * and players. * * * * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag, * * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard, * * Grishnakh, Fireblade, and Nivek. * * * * Original MERC 2.1 code by Hatchet, Furey, and Kahn. * * * * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen, * * Michael Seifert, and Sebastian Hammer. * * * ***********************************************************************************/ #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" /* local defs */ void write_all_forceskills(); void save_forceskill( FORCE_SKILL *fskill ); void write_forceskill_list( ); bool load_forceskill( char *forceskillfile ); void fread_forceskill( FORCE_SKILL *fskill, FILE *fp ); void write_all_forcehelps(); void save_forcehelp( FORCE_HELP *fhelp ); void write_forcehelp_list( ); bool load_forcehelp( char *forcehelpfile ); void fread_forcehelp( FORCE_HELP *fhelp, FILE *fp ); int check_force_skill args( (CHAR_DATA *ch, char *command, char *argument) ); void load_force_skills args( ( void ) ); void load_force_help args( ( void ) ); DO_FUN *get_force_skill_function args( (char *name) ); FORCE_SKILL *get_force_skill(char *argument); FORCE_HELP *get_force_help(char *fname,char *type); void force_send_to_room args( (CHAR_DATA *ch, CHAR_DATA *victim, char *msg) ); CHAR_DATA *force_get_victim args( (CHAR_DATA *ch,char *argument,int loc) ); char *force_get_possessive( CHAR_DATA *ch ); char *force_get_objective( CHAR_DATA *ch ); char *force_get_pronoun( CHAR_DATA *ch ); char *force_parse_string( CHAR_DATA *ch, CHAR_DATA *victim, char *msg); void force_learn_from_failure args( (CHAR_DATA *ch,FORCE_SKILL *fskill) ); void force_learn_from_success args( (CHAR_DATA *ch,FORCE_SKILL *fskill) ); FORCE_SKILL *force_test_skill_use args( (char *skill_name,CHAR_DATA *ch,int skill_type) ); char *force_get_level( CHAR_DATA *ch ); int force_promote_ready(CHAR_DATA *ch); void draw_force_line(CHAR_DATA *ch,int length); void update_force args( ( void ) ); void free_forceskill( FORCE_SKILL * fskill ); void free_forcehelp( FORCE_HELP * fhelp ); int check_force_skill (CHAR_DATA *ch, char *command, char *argument) { FORCE_SKILL *fskill; bool SKILL_FOUND = FALSE; DO_FUN *fun; for(fskill = first_force_skill;fskill;fskill = fskill->next) { if(!str_cmp(command,fskill->name)) { SKILL_FOUND = TRUE; break; } } if(!SKILL_FOUND) return 0; fun = get_force_skill_function(fskill->code) ; if ( fun == skill_notfound ) return 0; (*fskill->do_fun) (ch,argument); return 1; } void force_send_to_room(CHAR_DATA *ch, CHAR_DATA *victim, char *msg) { DESCRIPTOR_DATA *i; CHAR_DATA *dch; for (i = first_descriptor; i; i = i->next) { if (i->connected || !i->character) continue; dch = i->original ? i->original : i->character; if(ch->in_room != dch->in_room) continue; if((!victim || dch != victim) && (!ch || dch != ch)) send_to_char(msg,dch); } } CHAR_DATA *force_get_victim(CHAR_DATA *ch,char *argument,int loc) { CHAR_DATA *victim; char target[MAX_STRING_LENGTH]; if(!argument || argument[0] == '\0') { send_to_char("You don't see anyone like that here.\r\n",ch); return NULL; } argument = one_argument(argument,target); victim = get_char_world( ch, target ); if(!victim || (loc == FORCE_INROOM && victim->in_room != ch->in_room)) { send_to_char("You don't see anyone like that here.\r\n",ch); return NULL; } return victim; } char *force_get_possessive( CHAR_DATA *ch ) { if(ch->sex == SEX_MALE) return "his"; else if(ch->sex == SEX_FEMALE) return "her"; return "its"; } char *force_get_objective( CHAR_DATA *ch ) { if(ch->sex == SEX_MALE) return "him"; else if(ch->sex == SEX_FEMALE) return "her"; return "it"; } char *force_get_pronoun( CHAR_DATA *ch ) { if(ch->sex == SEX_MALE) return "he"; else if(ch->sex == SEX_FEMALE) return "she"; return "it"; } char *force_get_level( CHAR_DATA *ch ) { switch(ch->force_level_status) { case FORCE_APPRENTICE: if(ch->force_type == FORCE_JEDI) return "Jedi Apprentice"; else if(ch->force_type == FORCE_SITH) return "Sith Apprentice"; else return "Force Apprentice"; case FORCE_KNIGHT: if(ch->force_type == FORCE_JEDI) return "Jedi Knight"; else if(ch->force_type == FORCE_SITH) return "Sith Lord"; else return "Force Knight"; case FORCE_MASTER: if(ch->force_type == FORCE_JEDI) return "Jedi Master"; else if(ch->force_type == FORCE_SITH) return "Sith Master"; else return "Force Master"; default: return ""; } } char *force_parse_string( CHAR_DATA * ch, CHAR_DATA * victim, char *srcmsg ) { static char msg[MAX_STRING_LENGTH]; strncpy( msg, srcmsg, MAX_STRING_LENGTH ); if( victim ) { strncpy( msg, strrep( msg, "$vfl", force_get_level( victim ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$vp", force_get_possessive( victim ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$vo", force_get_objective( victim ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$vn", force_get_pronoun( victim ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$v", PERS( victim, ch ) ), MAX_STRING_LENGTH ); } if( ch ) { strncpy( msg, strrep( msg, "$nfl", force_get_level( ch ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$np", force_get_possessive( ch ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$no", force_get_objective( ch ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$nn", force_get_pronoun( ch ) ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$n", ch->name ), MAX_STRING_LENGTH ); if( ch->force_type == FORCE_JEDI ) { strncpy( msg, strrep( msg, "$FC", "&C" ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$fc", "&B" ), MAX_STRING_LENGTH ); } else if( ch->force_type == FORCE_SITH ) { strncpy( msg, strrep( msg, "$FC", "&R" ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$fc", "&r" ), MAX_STRING_LENGTH ); } else { strncpy( msg, strrep( msg, "$FC", "&W" ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$fc", "&w" ), MAX_STRING_LENGTH ); } } strncpy( msg, strrep( msg, "$RN$$RN$", "\r\n\r\n" ), MAX_STRING_LENGTH ); strncpy( msg, strrep( msg, "$RN$", "\r\n" ), MAX_STRING_LENGTH ); return msg; } void force_learn_from_failure (CHAR_DATA *ch,FORCE_SKILL *fskill) { int total=0; int amt; int MOD; if(fskill->mastertrain && ch->force_level_status != FORCE_MASTER) { MOD = 2; if(ch->fighting && IS_NPC(ch->fighting->who)) if(ch->force_master && ch->force_master[0] != '\0') if(ch->fighting->who->name && ch->fighting->who->name[0] != '\0') if(!strcmp(ch->fighting->who->name,ch->force_master)) MOD = 5; } else MOD = 5; if(number_range(1,100) < 90) return; if(fskill->control) total+= ch->force_control; if(fskill->sense) total+= ch->force_sense; if(fskill->control) total+= ch->force_alter; amt = number_range(1,total)*MOD/300; if(amt < 1) amt = 1; ch->force_skill[fskill->index] += amt; if(ch->force_skill[fskill->index] > 100) ch->force_skill[fskill->index] = 100; } void force_learn_from_success (CHAR_DATA *ch,FORCE_SKILL *fskill) { int total=0; int amt; int MOD; if(fskill->mastertrain && ch->force_level_status != FORCE_MASTER) { MOD = 5; if(ch->fighting && IS_NPC(ch->fighting->who)) if(ch->force_master && ch->force_master[0] != '\0') if(ch->fighting->who->name && ch->fighting->who->name[0] != '\0') if(!strcmp(ch->fighting->who->name,ch->force_master)) MOD = 10; } else MOD = 10; if(number_range(1,100) < 0) return; if(fskill->control) total+= ch->force_control; if(fskill->sense) total+= ch->force_sense; if(fskill->control) total+= ch->force_alter; amt = number_range(1,total)*MOD/300; if(amt < 1) amt = 1; ch->force_skill[fskill->index] += amt; if(ch->force_skill[fskill->index] > 100) ch->force_skill[fskill->index] = 100; } FORCE_SKILL *force_test_skill_use(char *skill_name,CHAR_DATA *ch,int skill_type) { FORCE_SKILL *fskill; bool SKILL_FOUND = FALSE; for(fskill = first_force_skill;fskill;fskill = fskill->next) { if(!str_cmp(skill_name,fskill->name)) { SKILL_FOUND = TRUE; break; } } if(!SKILL_FOUND) { send_to_char("ERROR: skill not found.\r\n",ch); return NULL; } if(ch->force_identified != 1) { send_to_char("Huh?\r\n",ch); return NULL; } if(ch->force_level_status < fskill->status && !ch->force_converted) { send_to_char("Huh?\r\n",ch); return NULL; } if(ch->force_converted && fskill->type == ch->force_type && ch->force_level_status < fskill->status) { send_to_char("Huh?\r\n",ch); return NULL; } if(ch->force_skill[fskill->index] == 0 && fskill->notskill == 0) { send_to_char("Huh?\r\n",ch); return NULL; } if(fskill->disabled == 1) { send_to_char("That force skill is disabled.\r\n",ch); return NULL; } if(skill_type != FORCE_NORESTRICT) { if(skill_type == FORCE_COMBAT && ch->fighting == NULL && str_cmp(fskill->name, "slash")) { send_to_char("You must be fighting to use this skill!\r\n",ch); return NULL; } if(skill_type == FORCE_NONCOMBAT && ch->fighting != NULL) { send_to_char("You cannot use this skill while fighting.\r\n",ch); return NULL; } } if(ch->substate == 1 || ch->substate == SUB_TIMER_DO_ABORT) return fskill; if(fskill->wait_state > 0 && ch->wait_state != 0) { send_to_char("You have not recovered yet.\r\n",ch); return NULL; } if(fskill->cost < 0) fskill->cost = 0; if(fskill->cost != 0 && ch->mana < fskill->cost) { send_to_char("You do not feel strong enough in the force.\r\n",ch); return NULL; } if(fskill->cost != 0) { ch->mana-=fskill->cost; } if(fskill->wait_state) ch->wait_state = fskill->wait_state; if(ch->force_type == FORCE_JEDI && fskill->type == FORCE_SITH) { send_to_char("&RYou feel the hatred grow within you.&G&w\r\n",ch); force_send_to_room(ch,NULL,force_parse_string(ch,NULL,"&R$n's eyes glow red.&G&w\r\n")); ch->force_align -= number_range(1,5); } if(ch->force_type == FORCE_SITH && fskill->type == FORCE_JEDI) { send_to_char("&BYou grimace in pain as you embrace the light side of the force.&G&w\r\n",ch); force_send_to_room(ch,NULL,force_parse_string(ch,NULL,"&B$n grimaces in pain.&G&w\r\n")); ch->force_align += number_range(1,5); } if(ch->force_align > MAX_FORCE_ALIGN) ch->force_align = MAX_FORCE_ALIGN; if(ch->force_align < MIN_FORCE_ALIGN) ch->force_align = MIN_FORCE_ALIGN; return fskill; } void update_force() { DESCRIPTOR_DATA *i; FORCE_SKILL *fskill; CHAR_DATA *ch; int change; for (i = first_descriptor; i; i = i->next) { if (i->connected || !i->character) continue; ch = i->original ? i->original : i->character; if(IS_NPC(ch)) continue; if(ch->force_identified != 1 || !ch->force_level_status) continue; if(ch->force_disguise_count > 0) ch->force_disguise_count--; if(ch->force_type == FORCE_JEDI && ch->alignment < 0) { change = number_range(-10,5); if(change < 0) change = 0; else send_to_char("&RYou feel the hatred grow within you.&G&w\r\n",ch); ch->force_align-=change; } else if(ch->force_type == FORCE_JEDI) { change = number_range(-30,5); if(change < 0) change = 0; ch->force_align+=change; } if(ch->force_type == FORCE_SITH && ch->alignment > 0) { change = number_range(-30,5); if(change < 0) change = 0; else send_to_char("&BYou grimace in pain as the light side of the force grows within you.&G&w\r\n",ch); ch->force_align+=change; } else if(ch->force_type == FORCE_SITH) { change = number_range(-10,5); if(change < 0) change = 0; ch->force_align-=change; } if(ch->force_align > MAX_FORCE_ALIGN) ch->force_align = MAX_FORCE_ALIGN; if(ch->force_align < MIN_FORCE_ALIGN) ch->force_align = MIN_FORCE_ALIGN; for(fskill = first_force_skill;fskill;fskill = fskill->next) { if(fskill->type != FORCE_GENERAL && fskill->type != ch->force_type && ch->force_skill[fskill->index] > 0) { change = number_range(0,1); if(change != 0) { //ch_printf(ch,"You feel your ability decrease in: %s.\r\n",capitalize(fskill->name)); ch->force_skill[fskill->index] -= change; if(ch->force_skill[fskill->index] < 0) ch->force_skill[fskill->index] = 0; } } if(fskill->type == FORCE_JEDI && ch->force_type == FORCE_JEDI && ch->force_align < 0 && ch->force_skill[fskill->index] > 0) { change = number_range(0,1); if(change == 1) { //ch_printf(ch,"You feel your ability decrease in: %s.\r\n",capitalize(fskill->name)); ch->force_skill[fskill->index] -= change; if(ch->force_skill[fskill->index] < 0) ch->force_skill[fskill->index] = 0; } } if(fskill->type == FORCE_SITH && ch->force_type == FORCE_SITH && ch->force_align > 0 && ch->force_skill[fskill->index] > 0) { change = number_range(0,1); if(change == 1) { //ch_printf(ch,"You feel your ability decrease in: %s.\r\n",capitalize(fskill->name)); ch->force_skill[fskill->index] -= change; if(ch->force_skill[fskill->index] < 0) ch->force_skill[fskill->index] = 0; } } } } } int force_promote_ready(CHAR_DATA *ch) { FORCE_SKILL *fskill; int count=0; int total=0; for(fskill = first_force_skill;fskill;fskill = fskill->next) { if(fskill->status == ch->force_level_status) { count++; total+=ch->force_skill[fskill->index]; } } if(total/count < 50) return 0; return 1; } void draw_force_line_rev(CHAR_DATA *ch,int length) { int x; for(x=0;x<length;x++) { if(ch->force_type == FORCE_JEDI) { if(x == 0) send_to_char("&b-",ch); else send_to_char("&B=",ch); } else if(ch->force_type == FORCE_SITH) { if(x == 0) send_to_char("&r-",ch); else send_to_char("&R=",ch); } else { if(x == 0) send_to_char("&g-",ch); else send_to_char("&G=",ch); } } send_to_char("&z)[::&wo&z::::)", ch); send_to_char("&G&w",ch); } void draw_force_line(CHAR_DATA *ch,int length) { int x; send_to_char("&z(::::&wo&z::](", ch); for(x=0;x<length;x++) { if(ch->force_type == FORCE_JEDI) { if(x == length-1) send_to_char("&b-",ch); else send_to_char("&B=",ch); } else if(ch->force_type == FORCE_SITH) { if(x == length-1) send_to_char("&r-",ch); else send_to_char("&R=",ch); } else { if(x == length-1) send_to_char("&g-",ch); else send_to_char("&G=",ch); } } send_to_char("&G&w",ch); } FORCE_SKILL *get_force_skill(char *argument) { FORCE_SKILL *fskill; for(fskill = first_force_skill; fskill; fskill = fskill->next) if(nifty_is_name_prefix(argument,fskill->name)) break; return fskill; } void do_fstat(CHAR_DATA *ch,char *argument) { FORCE_SKILL *fskill; char arg1[MAX_STRING_LENGTH]; int x; argument = one_argument(argument,arg1); fskill = get_force_skill(arg1); if(!fskill) { send_to_char("No such skill.\r\n",ch); send_to_char("USAGE: fstat <skill> [mesg]\r\n",ch); return; } ch_printf(ch,"&G&WSkill Name: &G&w%-20s\r\n",fskill->name); draw_force_line(ch,70); send_to_char("\r\n",ch); ch_printf(ch,"&G&WLevel: &G&w%-9d &G&WType: &G&w%-10s &G&WIndex: &G&w%-9d &G&WCost: &G&w%-10d\r\n",fskill->status,fskill->type == FORCE_JEDI ? "Jedi" : fskill->type == FORCE_SITH ? "Sith" : "General",fskill->index,fskill->cost); ch_printf(ch,"&G&WControl: &G&w%-7s &G&WAlter: &G&w%-9s &G&WSense: &G&w%-9s &G&WWaitState: &G&w%-5d\r\n",fskill->control ? "Yes" : "No",fskill->alter ? "Yes" : "No",fskill->sense ? "Yes" : "No",fskill->wait_state); ch_printf(ch,"&G&WDisabled: &G&w%-6s &G&WNotskill: &G&w%-6s &G&WMastertrain: &G&w%-6s\r\n\r\n",fskill->disabled ? "Yes" : "No",fskill->notskill ? "Yes" : "No",fskill->mastertrain ? "Yes" : "No",fskill->wait_state); if(!argument || argument[0] == '\0') return; if(strcmp(argument,"mesg")) return; for(x=0;x<5;x++) { if(fskill->room_effect[x][0] != '\0' || fskill->room_effect[x][0] != '\0' || fskill->room_effect[x][0] != '\0') ch_printf(ch,"Effect Messages [%d]\r\n",x); if(fskill->room_effect[x][0] != '\0') ch_printf(ch,"&G&W[&GR&G&W] %s\r\n",force_parse_string(NULL,NULL,fskill->room_effect[x])); if(fskill->victim_effect[x][0] != '\0') ch_printf(ch,"&G&W[&GV&G&W] %s\r\n",force_parse_string(NULL,NULL,fskill->victim_effect[x])); if(fskill->ch_effect[x][0] != '\0') ch_printf(ch,"&G&W[&GC&G&W] %s\r\n",force_parse_string(NULL,NULL,fskill->ch_effect[x])); } return; } void do_fset(CHAR_DATA *ch, char *argument) { FORCE_SKILL *fskill; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; if ( !ch->desc ) { bug( "do_fset: no descriptor", 0 ); return; } argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); fskill = get_force_skill(arg1); if(fskill && arg2[0] != '\0') { if(!strcmp(arg2,"type")) { if(!argument || argument[0] == '\0') { send_to_char("You have to specify a type: general/jedi/sith\r\n",ch); return; } if(!strcmp(argument,"jedi")) { fskill->type = FORCE_JEDI; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"sith")) { fskill->type = FORCE_SITH; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"general")) { fskill->type = FORCE_GENERAL; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You have to specify a type: general/jedi/sith\r\n",ch); save_forceskill(fskill); return; } } else if(!strcmp(arg2,"control")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->control = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->control = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"sense")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->sense = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->sense = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"alter")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->alter = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->alter = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"disabled")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->disabled = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->disabled = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"notskill")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->notskill = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->notskill = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"mastertrain")) { if(!argument || argument[0] == '\0') { send_to_char("You must specify yes or no.\r\n",ch); return; } if(!strcmp(argument,"yes") || !strcmp(argument,"Yes") || !strcmp(argument,"y") || !strcmp(argument,"Y")) { fskill->mastertrain = 1; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(argument,"no") || !strcmp(argument,"No") || !strcmp(argument,"n") || !strcmp(argument,"N")) { fskill->mastertrain = 0; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else { send_to_char("You must specify yes or no.\r\n",ch); return; } } else if(!strcmp(arg2,"cost")) { int level; level = atoi(argument); if(level < 0) { send_to_char("Valid costs are greater than -1.\r\n",ch); return; } fskill->cost = level; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(arg2,"index")) { int level; level = atoi(argument); if(level < 0 || level > MAX_FORCE_SKILL-1) { ch_printf(ch,"Valid indices are between 0 and %d",MAX_FORCE_SKILL-1); return; } fskill->index = level; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(arg2,"waitstate")) { int level; level = atoi(argument); if(level < 1 || level > 3) { send_to_char("Valid waitstates are greater than -1.\r\n",ch); return; } fskill->wait_state = level; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if(!strcmp(arg2,"level")) { int level; level = atoi(argument); if(level < 1 || level > 3) { send_to_char("Valid levels are 1 thru 3.\r\n",ch); return; } fskill->status = level; send_to_char("Set.\r\n",ch); save_forceskill(fskill); return; } else if( !strcmp( arg2, "remove" ) ) { UNLINK( fskill, first_force_skill, last_force_skill, next, prev ); free_forceskill( fskill ); write_all_forceskills( ); send_to_char( "Done.\r\n", ch ); return; } else if(!strcmp(arg2,"ch0")) { ch->substate = SUB_FORCE_CH0; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->ch_effect[0] ); set_editor_desc( ch, fskill->ch_effect[0] ); return; } else if(!strcmp(arg2,"ch1")) { ch->substate = SUB_FORCE_CH1; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->ch_effect[1] ); set_editor_desc( ch, fskill->ch_effect[1] ); return; } else if(!strcmp(arg2,"ch2")) { ch->substate = SUB_FORCE_CH2; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->ch_effect[2] ); set_editor_desc( ch, fskill->ch_effect[2] ); return; } else if(!strcmp(arg2,"ch3")) { ch->substate = SUB_FORCE_CH3; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->ch_effect[3] ); set_editor_desc( ch, fskill->ch_effect[3] ); return; } else if(!strcmp(arg2,"ch4")) { ch->substate = SUB_FORCE_CH4; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->ch_effect[4] ); set_editor_desc( ch, fskill->ch_effect[4] ); return; } else if(!strcmp(arg2,"room0")) { ch->substate = SUB_FORCE_ROOM0; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->room_effect[0] ); set_editor_desc( ch, fskill->room_effect[0] ); return; } else if(!strcmp(arg2,"room1")) { ch->substate = SUB_FORCE_ROOM1; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->room_effect[1] ); set_editor_desc( ch, fskill->room_effect[1] ); return; } else if(!strcmp(arg2,"room2")) { ch->substate = SUB_FORCE_ROOM2; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->room_effect[2] ); set_editor_desc( ch, fskill->room_effect[2] ); return; } else if(!strcmp(arg2,"room3")) { ch->substate = SUB_FORCE_ROOM3; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->room_effect[3] ); set_editor_desc( ch, fskill->room_effect[3] ); return; } else if(!strcmp(arg2,"room4")) { ch->substate = SUB_FORCE_ROOM4; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->room_effect[4] ); set_editor_desc( ch, fskill->room_effect[4] ); return; } else if(!strcmp(arg2,"victim0")) { ch->substate = SUB_FORCE_VICTIM0; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->victim_effect[0] ); set_editor_desc( ch, fskill->victim_effect[0] ); return; } else if(!strcmp(arg2,"victim1")) { ch->substate = SUB_FORCE_VICTIM1; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->victim_effect[1] ); set_editor_desc( ch, fskill->victim_effect[1] ); return; } else if(!strcmp(arg2,"victim2")) { ch->substate = SUB_FORCE_VICTIM2; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->victim_effect[2] ); set_editor_desc( ch, fskill->victim_effect[2] ); return; } else if(!strcmp(arg2,"victim3")) { ch->substate = SUB_FORCE_VICTIM3; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->victim_effect[3] ); set_editor_desc( ch, fskill->victim_effect[3] ); return; } else if(!strcmp(arg2,"victim4")) { ch->substate = SUB_FORCE_VICTIM4; ch->dest_buf = ch; ch->spare_ptr = fskill; start_editing( ch, fskill->victim_effect[4] ); set_editor_desc( ch, fskill->victim_effect[4] ); return; } } if(!strcmp(arg2,"create")) { char code[MAX_STRING_LENGTH]; DO_FUN *fun; CREATE(fskill,FORCE_SKILL,1); fskill->name = STRALLOC(arg1); sprintf(code,"fskill_%s",fskill->name); fskill->code = STRALLOC(code); fun = get_force_skill_function(fskill->code); fskill->do_fun = fun; fskill->ch_effect[0] = STRALLOC( "\0"); fskill->ch_effect[1] = STRALLOC( "\0"); fskill->ch_effect[2] = STRALLOC( "\0"); fskill->ch_effect[3] = STRALLOC( "\0"); fskill->ch_effect[4] = STRALLOC( "\0"); fskill->room_effect[0] = STRALLOC( "\0"); fskill->room_effect[1] = STRALLOC( "\0"); fskill->room_effect[2] = STRALLOC( "\0"); fskill->room_effect[3] = STRALLOC( "\0"); fskill->room_effect[4] = STRALLOC( "\0"); fskill->victim_effect[0] = STRALLOC( "\0"); fskill->victim_effect[1] = STRALLOC( "\0"); fskill->victim_effect[2] = STRALLOC( "\0"); fskill->victim_effect[3] = STRALLOC( "\0"); fskill->victim_effect[4] = STRALLOC( "\0"); fskill->index = MAX_FORCE_SKILL-1; LINK(fskill,first_force_skill,last_force_skill,next,prev); send_to_char("Created.\r\n",ch); write_all_forceskills(); return; } switch( ch->substate ) { default: bug( "do_fset: illegal substate", 0 ); return; case SUB_RESTRICTED: send_to_char( "You cannot use this command from within another command.\n\r", ch ); return; case SUB_NONE: send_to_char("USAGE: fset <skill> <field> [<value>]\r\n\r\n",ch); send_to_char("PUT VALID FIELDS HERE\r\n",ch); return; case SUB_FORCE_CH0: fskill = ch->spare_ptr; STRFREE(fskill->ch_effect[0]); fskill->ch_effect[0] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_CH1: fskill = ch->spare_ptr; STRFREE(fskill->ch_effect[1]); fskill->ch_effect[1] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_CH2: fskill = ch->spare_ptr; STRFREE(fskill->ch_effect[2]); fskill->ch_effect[2] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_CH3: fskill = ch->spare_ptr; STRFREE(fskill->ch_effect[3]); fskill->ch_effect[3] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_CH4: fskill = ch->spare_ptr; STRFREE(fskill->ch_effect[4]); fskill->ch_effect[4] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_ROOM0: fskill = ch->spare_ptr; STRFREE(fskill->room_effect[0]); fskill->room_effect[0] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_ROOM1: fskill = ch->spare_ptr; STRFREE(fskill->room_effect[1]); fskill->room_effect[1] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_ROOM2: fskill = ch->spare_ptr; STRFREE(fskill->room_effect[2]); fskill->room_effect[2] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_ROOM3: fskill = ch->spare_ptr; STRFREE(fskill->room_effect[3]); fskill->room_effect[3] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_ROOM4: fskill = ch->spare_ptr; STRFREE(fskill->room_effect[4]); fskill->room_effect[4] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_VICTIM0: fskill = ch->spare_ptr; STRFREE(fskill->victim_effect[0]); fskill->victim_effect[0] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_VICTIM1: fskill = ch->spare_ptr; STRFREE(fskill->victim_effect[1]); fskill->victim_effect[1] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_VICTIM2: fskill = ch->spare_ptr; STRFREE(fskill->victim_effect[2]); fskill->victim_effect[2] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_VICTIM3: fskill = ch->spare_ptr; STRFREE(fskill->victim_effect[3]); fskill->victim_effect[3] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; case SUB_FORCE_VICTIM4: fskill = ch->spare_ptr; STRFREE(fskill->victim_effect[4]); fskill->victim_effect[4] = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forceskill(fskill); return; } } void do_fhstat(CHAR_DATA *ch, char *argument) { FORCE_HELP *fhelp,*ghelp,*shelp,*jhelp; char type[MAX_STRING_LENGTH]; char fname[MAX_STRING_LENGTH]; bool found_general = FALSE; bool found_jedi = FALSE; bool found_sith = FALSE; bool match = FALSE; if(!argument || argument[0] == '\0') { send_to_char("USAGE: fhstat <help file> [jedi/sith/general]\r\n",ch); return; } argument = one_argument(argument,fname); strcpy(type,argument); for(fhelp = first_force_help;fhelp;fhelp = fhelp->next) { if(nifty_is_name_prefix(fname,fhelp->name)) { if(fhelp->type == FORCE_JEDI) { found_jedi = TRUE; jhelp = fhelp; } else if(fhelp->type == FORCE_SITH) { found_sith = TRUE; shelp = fhelp; } else { found_general = TRUE; ghelp = fhelp; } match = TRUE; } } if(!match) { send_to_char("No such help file found.\r\n",ch); return; } if(found_jedi+found_sith+found_general > 1 && strcmp(type,"jedi") && strcmp(type,"general") && strcmp(type,"sith")) { send_to_char("More than one help file was found, you must specify jedi/sith/general.\r\n",ch); return; } if(!strcmp(type,"jedi") && !found_jedi) { send_to_char("No such help file found.\r\n",ch); return; } if(!strcmp(type,"sith") && !found_sith) { send_to_char("No such help file found.\r\n",ch); return; } if(!strcmp(type,"general") && !found_general) { send_to_char("No such help file found.\r\n",ch); return; } if(found_jedi && !strcmp(type,"jedi")) fhelp = jhelp; else if(found_sith && !strcmp(type,"sith")) fhelp = shelp; else fhelp = ghelp; ch_printf(ch,"Name: %-20.20s Level: %-3d Type: %-10s Skill Number: %-3d\r\n",fhelp->name,fhelp->status,fhelp->type == FORCE_GENERAL ? "General" : fhelp->type == FORCE_JEDI ? "Jedi" : "Sith", fhelp->skill); draw_force_line(ch,79); ch_printf(ch,"\r\n"); send_to_char(strrep(strrep(fhelp->desc,"$RN$","\r\n"),"$RN$","\r\n"),ch); return; } void do_fhset(CHAR_DATA *ch, char *argument) { FORCE_HELP *fhelp; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; char arg4[MAX_STRING_LENGTH]; int type=-1; if ( !ch->desc ) { bug( "do_fset: no descriptor", 0 ); return; } argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); argument = one_argument(argument,arg3); argument = one_argument(argument,arg4); fhelp = get_force_help(arg1,arg2); if(!strcmp(arg3,"create")) { if(strcmp(arg2,"jedi")) type = FORCE_JEDI; if(strcmp(arg2,"sith")) type = FORCE_SITH; if(strcmp(arg2,"GENERAL")) type = FORCE_GENERAL; if(type == -1) { send_to_char("You must specify a valid type for the help file to create it.\r\n",ch); return; } CREATE(fhelp,FORCE_HELP,1); fhelp->name = STRALLOC(arg1); fhelp->desc = STRALLOC( "\0"); fhelp->type = type; LINK(fhelp,first_force_help,last_force_help,next,prev); send_to_char("Created.\r\n",ch); write_all_forcehelps(); return; } if(fhelp && arg3[0] != '\0') { if(!strcmp(arg3,"desc")) { ch->substate = SUB_FORCE_HELP; ch->dest_buf = ch; ch->spare_ptr = fhelp; if(fhelp->desc && fhelp->desc[0] != '\0') fhelp->desc = STRALLOC(strrep(strrep(fhelp->desc,"$RN$","\r\n"),"$RN$","\r\n")); start_editing( ch, fhelp->desc ); set_editor_desc( ch, fhelp->desc ); return; } else if(!strcmp(arg3,"level")) { type = atoi(arg4); if(type > 3 || type < 1) { send_to_char("The valid level range is 1 to 3.\r\n",ch); return; } fhelp->status = type; send_to_char("Set.\r\n",ch); save_forcehelp(fhelp); return; } else if(!strcmp(arg3,"skill")) { type = atoi(arg4); if(type < -1) { send_to_char("The valid skill numbers are above -1.\r\n",ch); return; } fhelp->skill = type; send_to_char("Set.\r\n",ch); save_forcehelp(fhelp); return; } else if( !strcmp( arg3, "remove" ) ) { UNLINK( fhelp, first_force_help, last_force_help, next, prev ); free_forcehelp( fhelp ); write_all_forcehelps( ); send_to_char( "Done.\r\n", ch ); return; } } switch( ch->substate ) { default: bug( "do_fhset: illegal substate", 0 ); return; case SUB_RESTRICTED: send_to_char( "You cannot use this command from within another command.\n\r", ch ); return; case SUB_NONE: send_to_char("USAGE: fhset <helpfile> <jedi/sith/general> <field> [value]\r\n\r\n",ch); send_to_char("PUT VALID FIELDS HERE\r\n",ch); return; case SUB_FORCE_HELP: fhelp = ch->spare_ptr; STRFREE(fhelp->desc); fhelp->desc = STRALLOC( copy_buffer( ch ) ); stop_editing( ch ); save_forcehelp(fhelp); return; } } FORCE_HELP *get_force_help(char *fname,char *type) { FORCE_HELP *fhelp,*ghelp,*shelp,*jhelp; bool found_general = FALSE; bool found_jedi = FALSE; bool found_sith = FALSE; bool match = FALSE; if(!fname || fname == '\0') return NULL; if(!type || type == '\0') return NULL; for(fhelp = first_force_help;fhelp;fhelp = fhelp->next) { if(nifty_is_name_prefix(fname,fhelp->name)) { if(fhelp->type == FORCE_JEDI) { found_jedi = TRUE; jhelp = fhelp; } else if(fhelp->type == FORCE_SITH) { found_sith = TRUE; shelp = fhelp; } else { found_general = TRUE; ghelp = fhelp; } match = TRUE; } } if(!match) return NULL; if(found_jedi+found_sith+found_general > 1 && strcmp(type,"jedi") && strcmp(type,"general") && strcmp(type,"sith")) return NULL;; if(!strcmp(type,"jedi") && !found_jedi) return NULL; if(!strcmp(type,"sith") && !found_sith) return NULL; if(!strcmp(type,"general") && !found_general) return NULL; if(found_jedi && !strcmp(type,"jedi")) fhelp = jhelp; else if(found_sith && !strcmp(type,"sith")) fhelp = shelp; else fhelp = ghelp; return fhelp; } void free_forceskill( FORCE_SKILL * fskill ) { short x; if( !fskill ) { bug( "free_forceskill: null forceskill pointer!", 0 ); return; } STRFREE( fskill->name ); STRFREE( fskill->code ); for( x = 0; x < 5; x++ ) { STRFREE( fskill->room_effect[x] ); STRFREE( fskill->victim_effect[x] ); STRFREE( fskill->ch_effect[x] ); } DISPOSE( fskill ); return; } void free_forcehelp( FORCE_HELP * fhelp ) { if( !fhelp ) { bug( "free_forcehelp: null forcehelp pointer!", 0 ); return; } STRFREE( fhelp->desc ); STRFREE( fhelp->name ); DISPOSE( fhelp ); return; }