/*************************************************************************** * File: olc_help.c * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * * * * This work is a derivative of Talen's post to the Merc Mailing List. * * It has been modified by Jason Dinkel to work with the new OLC. * * * ***************************************************************************/ /********************************************************** *************** S U N D E R M U D *** 2 . 0 ************** ********************************************************** * The unique portions of the SunderMud code as well as * * the integration efforts for code from other sources is * * based primarily on the efforts of: * * * * Lotherius <aelfwyne@operamail.com> (Alvin W. Brinson) * * and many others, see "help sundermud" in the mud. * **********************************************************/ #include "everything.h" #include "olc.h" #define HEDIT( fun ) bool fun( CHAR_DATA *ch, char *argument ) #define EDIT_HELP(Ch, Help) ( Help = (HELP_DATA *)Ch->desc->pEdit ) /* * Help Editor Prototypes */ DECLARE_OLC_FUN ( hedit_create ); DECLARE_OLC_FUN ( hedit_delete ); DECLARE_OLC_FUN ( hedit_desc ); DECLARE_OLC_FUN ( hedit_level ); DECLARE_OLC_FUN ( hedit_keywords ); DECLARE_OLC_FUN ( hedit_show ); DECLARE_OLC_FUN ( hedit_save ); const struct olc_cmd_type hedit_table[] = { /* { command function }, */ {"commands", show_commands}, {"create", hedit_create}, {"delete", hedit_delete}, {"desc", hedit_desc}, {"level", hedit_level}, {"keywords", hedit_keywords}, {"show", hedit_show}, {"save", hedit_save}, {"?", show_help}, {"", 0,} }; /* * Stupid leading space muncher fix -Thoric */ /* char *help_fix( char *text ) { char *fixed; if ( !text ) return ""; fixed = strip_cr(text); if ( fixed[0] == ' ' ) fixed[0] = '.'; return fixed; } */ void hedit ( CHAR_DATA * ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; SLCPY ( arg, argument ); argument = one_argument ( argument, command ); if ( ch->pcdata->security == 0 ) send_to_char ( "HEdit: Insufficient security to modify area.\n\r", ch ); if ( command[0] == '\0' ) { hedit_show ( ch, argument ); return; } if ( !str_cmp ( command, "done" ) ) { edit_done ( ch ); return; } if ( ch->pcdata->security == 0 ) { interpret ( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; hedit_table[cmd].name[0] != '\0'; cmd++ ) { if ( !str_cmp ( command, hedit_table[cmd].name ) ) { ( *hedit_table[cmd].olc_fun ) ( ch, argument ); return; } } /* Default to Standard Interpreter. */ interpret ( ch, arg ); return; } /* Entry point for editing help_data. */ void do_hedit ( CHAR_DATA * ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; HELP_DATA *iHelp; if ( IS_NPC ( ch ) ) return; argument = one_argument ( argument, arg ); if ( arg[0] == '\0' ) { send_to_char ( "Syntax: edit help <keywords>\n\r", ch ); return; } else { for ( iHelp = help_first; iHelp; iHelp = iHelp->next ) { /* * This help better not exist already! */ if ( is_name ( arg, iHelp->keyword ) ) { ch->desc->pEdit = ( void * ) iHelp; ch->desc->editor = ED_HELP; break; } } if ( !iHelp ) { iHelp = new_help ( ); iHelp->keyword = str_dup ( arg ); if ( !help_first ) help_first = iHelp; if ( help_last ) help_last->next = iHelp; help_last = iHelp; iHelp->next = NULL; ch->desc->pEdit = ( void * ) iHelp; ch->desc->editor = ED_HELP; } } return; } HEDIT ( hedit_save ) { char filename[MSL]; FILE *fp = NULL; HELP_DATA *pHelp; SNP ( filename, "%s%s", DATA_DIR, HELP_FILE ); log_string ( "Saving helps to %s", filename ); if ( !( fp = fopen ( filename, "w" ) ) ) { bugf ( "hedit_save: Failed to open %s", filename ); perror ( filename ); return FALSE; } for ( pHelp = help_first; pHelp; pHelp = pHelp->next ) { fprintf ( fp, "%d %s~\n%s~\n", pHelp->level, pHelp->keyword, fix_string ( pHelp->text ) ); } fprintf ( fp, "0 $~\n\n\n#$\n" ); fclose ( fp ); send_to_char ( "Saved.\n", ch ); return TRUE; } HEDIT ( hedit_show ) { HELP_DATA *pHelp; if ( !EDIT_HELP ( ch, pHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } form_to_char ( ch, "Seen at level: [%d]\n\r" "Keywords: [%s]\n\r" "Text:\n\r%s\n\r", pHelp->level, pHelp->keyword, pHelp->text ); return FALSE; } HEDIT ( hedit_create ) { HELP_DATA *iHelp; HELP_DATA *NewHelp; if ( !EDIT_HELP ( ch, iHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } if ( argument[0] == '\0' ) { send_to_char ( "Syntax: create <keywords>\n\r", ch ); return FALSE; } /* * This help better not exist already! */ for ( iHelp = help_first; iHelp; iHelp = iHelp->next ) { if ( is_name ( argument, iHelp->keyword ) ) { send_to_char ( "That help file already exists.\n\r", ch ); return FALSE; } } NewHelp = new_help ( ); NewHelp->keyword = str_dup ( argument ); if ( !help_first ) /* If it is we have a leak */ help_first = NewHelp; if ( help_last ) help_last->next = NewHelp; help_last = NewHelp; NewHelp->next = NULL; ch->desc->pEdit = ( void * ) NewHelp; ch->desc->editor = ED_HELP; form_to_char ( ch, "Created help with the keyword(s): %s\n\r", NewHelp->keyword ); return TRUE; } HEDIT ( hedit_delete ) { HELP_DATA *pHelp; HELP_DATA *PrevHelp = NULL; if ( !EDIT_HELP ( ch, pHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } if ( argument[0] == '\0' ) { send_to_char ( "Syntax: delete <keyword>\n\r", ch ); return FALSE; } /* * This help better exist */ for ( pHelp = help_first; pHelp; PrevHelp = pHelp, pHelp = pHelp->next ) { if ( is_name ( argument, pHelp->keyword ) ) break; } if ( !pHelp ) { send_to_char ( "That help file does not exist.\n\r", ch ); return FALSE; } if ( pHelp == ( HELP_DATA * ) ch->desc->pEdit ) { edit_done ( ch ); } if ( !PrevHelp ) /* At first help file */ { help_first = pHelp->next; free_help ( pHelp ); } else if ( !pHelp->next ) /* At the last help file */ { help_last = PrevHelp; PrevHelp->next = NULL; free_help ( pHelp ); } else /* Somewhere else... */ { PrevHelp->next = pHelp->next; free_help ( pHelp ); } send_to_char ( "Help file deleted.\n\r", ch ); return TRUE; } HEDIT ( hedit_desc ) { HELP_DATA *pHelp; if ( !EDIT_HELP ( ch, pHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } if ( argument[0] != '\0' ) { send_to_char ( "Syntax: desc\n\r", ch ); return FALSE; } string_append ( ch, &pHelp->text ); return TRUE; } HEDIT ( hedit_level ) { HELP_DATA *pHelp; int value; if ( !EDIT_HELP ( ch, pHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } value = atoi ( argument ); if ( argument[0] == '\0' || value < -1 ) { send_to_char ( "Syntax: level [level >= -1]\n\r", ch ); return FALSE; } pHelp->level = value; send_to_char ( "Help level set.\n\r", ch ); return TRUE; } HEDIT ( hedit_keywords ) { HELP_DATA *pHelp; int i; int length; if ( !EDIT_HELP ( ch, pHelp ) ) { send_to_char ( "Null help file.\n\r", ch ); return FALSE; } if ( argument[0] == '\0' ) { send_to_char ( "Syntax: keywords <keywords>\n\r", ch ); return FALSE; } length = strlen ( argument ); for ( i = 0; i < length; i++ ) argument[i] = toupper ( argument[i] ); pHelp->keyword = str_dup ( argument ); send_to_char ( "Help keywords set.\n\r", ch ); return TRUE; } void do_hlist ( CHAR_DATA * ch, char *argument ) { int max, cnt; char arg[MAX_INPUT_LENGTH]; BUFFER *buffer; bool indx; bool srch; HELP_DATA *help; srch = FALSE; indx = FALSE; buffer = buffer_new ( 4096 ); max = get_trust ( ch ); argument = one_argument ( argument, arg ); if ( !strcmp ( arg, "index" ) ) { indx = TRUE; bprintf ( buffer, "{WHelp Topics with {G%s{W in the keyword:{w\n\r\n\r", argument ); } else if ( !strcmp ( arg, "search" ) ) { srch = TRUE; bprintf ( buffer, "{WHelp Topics matching your search for: {G%s{W:\n\r\n\r", argument ); } for ( cnt = 0, help = help_first; help; help = help->next ) if ( help->level <= max ) { if ( ( indx == FALSE && srch == FALSE ) || ( ( indx == TRUE || srch == TRUE ) && !str_infix ( argument, help->keyword ) ) || ( srch == TRUE && !str_infix ( argument, help->text ) ) ) { bprintf ( buffer, " {W%s{x\n\r", help->keyword ); ++cnt; } } if ( cnt ) { bprintf ( buffer, "\n\r%d pages found.\n\r", cnt ); } else bprintf ( buffer, "None found.\n\r" ); page_to_char ( buffer->data, ch ); buffer_free ( buffer ); return; }