/*********************************************************************************** * * * _______.____ __ ____ _______ _______ * * / |\ \ / \ / / _ | ____| __ | ____| * * | (----` \ \/ \/ / (_) | |__ ____ _/ |_ | |__ * * \ \ \ / _ | __| / _ \ \ __\ | __| * * .----) | \ /\ / (_) | | ( <_> ) | | | |____ * * |_______/ \__/ \__/ |__| \____/ |__| |_______| * * * * 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" #if defined(KEY) #undef KEY #endif #define KEY( literal, field, value ) \ if ( !str_cmp( word, literal ) ) \ { \ field = value; \ fMatch = TRUE; \ break; \ } void fread_forcehelp( FORCE_HELP *fhelp, FILE *fp ) { char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'D': KEY( "Desc", fhelp->desc, fread_string(fp)); case 'E': if ( !str_cmp( word, "End" ) ) return; case 'N': KEY( "Name", fhelp->name, fread_string(fp)); case 'S': KEY( "Status", fhelp->status, fread_number(fp)); KEY( "Skill", fhelp->skill, fread_number(fp)); case 'T': KEY( "Type", fhelp->type, fread_number(fp)); } if ( !fMatch ) { sprintf( buf, "Fread_forcehelp: no match: %s", word ); bug( buf, 0 ); } } } bool load_forcehelp( char *forcehelpfile ) { char filename[256]; FORCE_HELP *fhelp; FILE *fp; bool found; CREATE( fhelp, FORCE_HELP, 1 ); found = FALSE; sprintf( filename, "%s%s", FORCE_HELP_DIR, forcehelpfile ); if ( ( fp = fopen( filename, "r" ) ) != NULL ) { found = TRUE; LINK( fhelp, first_force_help, last_force_help, next, prev ); for ( ; ; ) { char letter; char *word; letter = fread_letter( fp ); if ( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter != '#' ) { bug( "Load_forcehelp: # not found.", 0 ); break; } word = fread_word( fp ); if ( !str_cmp( word, "FORCE" ) ) { fread_forcehelp( fhelp, fp ); break; } else if ( !str_cmp( word, "END" ) ) break; else { char buf[MAX_STRING_LENGTH]; sprintf( buf, "Load_forcehelp: bad section: %s.", word ); bug( buf, 0 ); break; } } fclose( fp ); } if ( !(found) ) DISPOSE( fhelp ); return found; } void load_force_help( ) { FILE *fpList; char *filename; char forcehelpslist[256]; char buf[MAX_STRING_LENGTH]; first_force_help = NULL; last_force_help = NULL; log_string( "Loading force helps..." ); sprintf( forcehelpslist, "%sforcehelps.lst", FORCE_HELP_DIR ); fclose( fpReserve ); if ( ( fpList = fopen( forcehelpslist, "r" ) ) == NULL ) { perror( forcehelpslist ); exit( 1 ); } for ( ; ; ) { filename = feof( fpList ) ? "$" : fread_word( fpList ); if ( filename[0] == '$' ) break; if ( !load_forcehelp( filename ) ) { sprintf( buf, "Cannot load forcehelp file: %s", filename ); bug( buf, 0 ); } } fclose( fpList ); log_string(" Done force helps " ); fpReserve = fopen( NULL_FILE, "r" ); return; } void write_forcehelp_list( ) { FORCE_HELP *fhelp; FILE *fpout; char buf[MAX_STRING_LENGTH]; char filename[256]; sprintf( filename, "%s%s", FORCE_HELP_DIR, "forcehelps.lst" ); fpout = fopen( filename, "w" ); if ( !fpout ) { bug( "FATAL: cannot open forhelps.lst for writing!\n\r", 0 ); return; } for ( fhelp = first_force_help; fhelp; fhelp = fhelp->next ) { sprintf(buf,"%s_%d",fhelp->name,fhelp->type); fprintf( fpout, "%s\n", buf ); } fprintf( fpout, "$\n" ); fclose( fpout ); } void write_all_forcehelps() { FORCE_HELP *fhelp; for(fhelp = first_force_help; fhelp; fhelp = fhelp->next ) save_forcehelp(fhelp); write_forcehelp_list(); } void save_forcehelp( FORCE_HELP *fhelp ) { FILE *fp; char filename[256]; if ( !fhelp ) { bug( "save_forcehelp: null forcehelp pointer!", 0 ); return; } sprintf( filename, "%s%s_%d", FORCE_HELP_DIR, fhelp->name,fhelp->type ); fclose( fpReserve ); if ( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "save_forcehelp: fopen", 0 ); perror( filename ); } else { fprintf(fp,"#FORCE\n"); if(!fhelp->name || fhelp->name[0] == '\0') fprintf(fp,"Name ~\n"); else fprintf(fp,"Name %s~\n",fhelp->name); fprintf(fp, "Status %d\n",fhelp->status); fprintf(fp, "Type %d\n",fhelp->type); if(!fhelp->desc || fhelp->desc[0] == '\0') fprintf(fp,"Desc ~\n"); else fprintf(fp,"Desc %s~\n",fhelp->desc); fprintf(fp, "Skill %d\n",fhelp->skill); fprintf(fp,"End\n\n"); fprintf(fp,"#END\n"); } fclose( fp ); fpReserve = fopen( NULL_FILE, "r" ); return; } void fread_forceskill( FORCE_SKILL *fskill, FILE *fp ) { char buf[MAX_STRING_LENGTH]; char *word; bool fMatch; for ( ; ; ) { word = feof( fp ) ? "End" : fread_word( fp ); fMatch = FALSE; switch ( UPPER(word[0]) ) { case '*': fMatch = TRUE; fread_to_eol( fp ); break; case 'A': KEY( "Alter", fskill->alter, fread_number( fp ) ); case 'C': KEY( "ChEffect0", fskill->ch_effect[0], fread_string( fp ) ); KEY( "ChEffect1", fskill->ch_effect[1], fread_string( fp ) ); KEY( "ChEffect2", fskill->ch_effect[2], fread_string( fp ) ); KEY( "ChEffect3", fskill->ch_effect[3], fread_string( fp ) ); KEY( "ChEffect4", fskill->ch_effect[4], fread_string( fp ) ); KEY( "Code", fskill->code, fread_string( fp ) ); KEY( "Cost", fskill->cost, fread_number( fp ) ); KEY( "Control", fskill->control, fread_number( fp ) ); case 'D': KEY( "Disabled", fskill->disabled, fread_number( fp ) ); case 'E': if ( !str_cmp( word, "End" ) ) return; case 'I': KEY( "Index", fskill->index, fread_number( fp ) ); case 'M': KEY( "Mastertrain", fskill->mastertrain, fread_number( fp ) ); case 'N': KEY( "Name", fskill->name, fread_string( fp ) ); KEY( "Notskill", fskill->notskill, fread_number( fp ) ); case 'R': KEY( "RoomEffect0", fskill->room_effect[0], fread_string( fp ) ); KEY( "RoomEffect1", fskill->room_effect[1], fread_string( fp ) ); KEY( "RoomEffect2", fskill->room_effect[2], fread_string( fp ) ); KEY( "RoomEffect3", fskill->room_effect[3], fread_string( fp ) ); KEY( "RoomEffect4", fskill->room_effect[4], fread_string( fp ) ); case 'S': KEY( "Sense", fskill->sense, fread_number( fp ) ); KEY( "Status", fskill->status, fread_number( fp ) ); case 'T': KEY( "Type", fskill->type, fread_number( fp ) ); case 'V': KEY( "VictimEffect0", fskill->victim_effect[0], fread_string( fp ) ); KEY( "VictimEffect1", fskill->victim_effect[1], fread_string( fp ) ); KEY( "VictimEffect2", fskill->victim_effect[2], fread_string( fp ) ); KEY( "VictimEffect3", fskill->victim_effect[3], fread_string( fp ) ); KEY( "VictimEffect4", fskill->victim_effect[4], fread_string( fp ) ); case 'W': KEY( "WaitState", fskill->wait_state, fread_number( fp ) ); } if ( !fMatch ) { sprintf( buf, "Fread_forceskill: no match: %s", word ); bug( buf, 0 ); } } } bool load_forceskill( char *forceskillfile ) { char filename[256]; FORCE_SKILL *fskill; FILE *fp; DO_FUN *fun; bool found; CREATE( fskill, FORCE_SKILL, 1 ); found = FALSE; sprintf( filename, "%s%s", FORCE_DIR, forceskillfile ); if ( ( fp = fopen( filename, "r" ) ) != NULL ) { found = TRUE; LINK( fskill, first_force_skill, last_force_skill, next, prev ); for ( ; ; ) { char letter; char *word; letter = fread_letter( fp ); if ( letter == '*' ) { fread_to_eol( fp ); continue; } if ( letter != '#' ) { bug( "Load_forceskill: # not found.", 0 ); break; } word = fread_word( fp ); if ( !str_cmp( word, "FORCE" ) ) { fread_forceskill( fskill, fp ); break; } else if ( !str_cmp( word, "END" ) ) break; else { char buf[MAX_STRING_LENGTH]; sprintf( buf, "Load_forceskill: bad section: %s.", word ); bug( buf, 0 ); break; } } fclose( fp ); } if ( !(found) ) DISPOSE( fskill ); fun = get_force_skill_function(fskill->code); fskill->do_fun = fun; return found; } void load_force_skills( ) { FILE *fpList; char *filename; char forceskillslist[256]; char buf[MAX_STRING_LENGTH]; first_force_skill = NULL; last_force_skill = NULL; log_string( "Loading force skills..." ); sprintf( forceskillslist, "%sforceskills.lst", FORCE_DIR ); fclose( fpReserve ); if ( ( fpList = fopen( forceskillslist, "r" ) ) == NULL ) { perror( forceskillslist ); exit( 1 ); } for ( ; ; ) { filename = feof( fpList ) ? "$" : fread_word( fpList ); if ( filename[0] == '$' ) break; if ( !load_forceskill( filename ) ) { sprintf( buf, "Cannot load forceskill file: %s", filename ); bug( buf, 0 ); } } fclose( fpList ); log_string(" Done force skills " ); fpReserve = fopen( NULL_FILE, "r" ); return; } DO_FUN *get_force_skill_function(char *name) { if(!name || name[0] == '\0' || strlen(name) < 8) return skill_notfound; switch(name[7]) { case 'a': if ( !str_cmp( name, "fskill_awareness" )) return fskill_awareness; case 'c': if ( !str_cmp( name, "fskill_convert" )) return fskill_convert; break; case 'f': if ( !str_cmp( name, "fskill_fdisguise" )) return fskill_fdisguise; if ( !str_cmp( name, "fskill_fhelp" )) return fskill_fhelp; if ( !str_cmp( name, "fskill_finfo" )) return fskill_finfo; if ( !str_cmp( name, "fskill_finish" )) return fskill_finish; if ( !str_cmp( name, "fskill_force_lightning" )) return fskill_force_lightning; if ( !str_cmp( name, "fskill_fshield" )) return fskill_fshield; break; case 'h': if ( !str_cmp( name, "fskill_heal" )) return fskill_heal; break; case 'i': if ( !str_cmp( name, "fskill_identify" )) return fskill_identify; if ( !str_cmp( name, "fskill_instruct" )) return fskill_instruct; break; case 'm': if ( !str_cmp( name, "fskill_master" )) return fskill_master; if ( !str_cmp( name, "fskill_makelightsaber" )) return fskill_makelightsaber; if ( !str_cmp( name, "fskill_makedualsaber" )) return fskill_makedualsaber; break; case 'p': if ( !str_cmp( name, "fskill_promote" )) return fskill_promote; if ( !str_cmp( name, "fskill_protect" )) return fskill_protect; break; case 'r': if ( !str_cmp( name, "fskill_refresh" )) return fskill_refresh; break; case 's': if ( !str_cmp( name, "fskill_squeeze" )) return fskill_squeeze; if ( !str_cmp( name, "fskill_student" )) return fskill_student; if ( !str_cmp( name, "fskill_slash" )) return fskill_slash; break; case 'w': if ( !str_cmp( name, "fskill_whirlwind" )) return fskill_whirlwind; break; default: break; } return skill_notfound; } void write_forceskill_list( ) { FORCE_SKILL *fskill; FILE *fpout; char filename[256]; sprintf( filename, "%s%s", FORCE_DIR, "forceskills.lst" ); fpout = fopen( filename, "w" ); if ( !fpout ) { bug( "FATAL: cannot open forskills.lst for writing!\n\r", 0 ); return; } for ( fskill = first_force_skill; fskill; fskill = fskill->next ) fprintf( fpout, "%s\n", fskill->name ); fprintf( fpout, "$\n" ); fclose( fpout ); } void write_all_forceskills() { FORCE_SKILL *fskill; for(fskill = first_force_skill; fskill; fskill = fskill->next ) save_forceskill(fskill); write_forceskill_list(); } void save_forceskill( FORCE_SKILL *fskill ) { FILE *fp; char filename[256]; if ( !fskill ) { bug( "save_forceskill: null forceskill pointer!", 0 ); return; } sprintf( filename, "%s%s", FORCE_DIR, fskill->name ); fclose( fpReserve ); if ( ( fp = fopen( filename, "w" ) ) == NULL ) { bug( "save_forceskill: fopen", 0 ); perror( filename ); } else { fprintf(fp,"#FORCE\n"); fprintf(fp,"Alter %d\n",fskill->alter); if(fskill->ch_effect[0][0] != '\0') fprintf(fp,"ChEffect0 %s~\n", fskill->ch_effect[0]); else fprintf(fp,"ChEffect0 ~\n"); if(fskill->ch_effect[1][0] != '\0') fprintf(fp,"ChEffect1 %s~\n", fskill->ch_effect[1]); else fprintf(fp,"ChEffect1 ~\n"); if(fskill->ch_effect[2][0] != '\0') fprintf(fp,"ChEffect2 %s~\n", fskill->ch_effect[2]); else fprintf(fp,"ChEffect2 ~\n"); if(fskill->ch_effect[3][0] != '\0') fprintf(fp,"ChEffect3 %s~\n", fskill->ch_effect[3]); else fprintf(fp,"ChEffect3 ~\n"); if(fskill->ch_effect[4][0] != '\0') fprintf(fp,"ChEffect4 %s~\n", fskill->ch_effect[4]); else fprintf(fp,"ChEffect4 ~\n"); fprintf(fp,"Code %s~\n", fskill->code); fprintf(fp,"Cost %d\n", fskill->cost); fprintf(fp,"Control %d\n", fskill->control); fprintf(fp,"Disabled %d\n", fskill->disabled); fprintf(fp,"Mastertrain %d\n", fskill->mastertrain); fprintf(fp,"Index %d\n", fskill->index); fprintf(fp,"Name %s~\n", fskill->name); fprintf(fp,"Notskill %d\n", fskill->notskill); if(fskill->room_effect[0][0] != '\0') fprintf(fp,"RoomEffect0 %s~\n", fskill->room_effect[0]); else fprintf(fp,"RoomEffect0 ~\n"); if(fskill->room_effect[1][0] != '\0') fprintf(fp,"RoomEffect1 %s~\n", fskill->room_effect[1]); else fprintf(fp,"RoomEffect1 ~\n"); if(fskill->room_effect[2][0] != '\0') fprintf(fp,"RoomEffect2 %s~\n", fskill->room_effect[2]); else fprintf(fp,"RoomEffect2 ~\n"); if(fskill->room_effect[3][0] != '\0') fprintf(fp,"RoomEffect3 %s~\n", fskill->room_effect[3]); else fprintf(fp,"RoomEffect3 ~\n"); if(fskill->room_effect[4][0] != '\0') fprintf(fp,"RoomEffect4 %s~\n", fskill->room_effect[4]); else fprintf(fp,"RoomEffect4 ~\n"); fprintf(fp,"Sense %d\n", fskill->sense); fprintf(fp,"Status %d\n", fskill->status); fprintf(fp,"Type %d\n", fskill->type); if(fskill->victim_effect[0][0] != '\0') fprintf(fp,"VictimEffect0 %s~\n", fskill->victim_effect[0]); else fprintf(fp,"VictimEffect0 ~\n"); if(fskill->victim_effect[1][0] != '\0') fprintf(fp,"VictimEffect1 %s~\n", fskill->victim_effect[1]); else fprintf(fp,"VictimEffect1 ~\n"); if(fskill->victim_effect[2][0] != '\0') fprintf(fp,"VictimEffect2 %s~\n", fskill->victim_effect[2]); else fprintf(fp,"VictimEffect2 ~\n"); if(fskill->victim_effect[3][0] != '\0') fprintf(fp,"VictimEffect3 %s~\n", fskill->victim_effect[3]); else fprintf(fp,"VictimEffect3 ~\n"); if(fskill->victim_effect[4][0] != '\0') fprintf(fp,"VictimEffect4 %s~\n", fskill->victim_effect[4]); else fprintf(fp,"VictimEffect4 ~\n"); fprintf(fp,"WaitState %d\n", fskill->wait_state); fprintf(fp,"End\n\n"); fprintf(fp,"#END\n"); } fclose( fp ); fpReserve = fopen( NULL_FILE, "r" ); return; }