/*
* The unique portions of SunderMud code as well as the integration efforts
* for code from other sources is based on the efforts of:
*
* Lotherius (elfren@aros.net)
*
* This code can only be used under the terms of the DikuMud, Merc,
* and ROM licenses. The same requirements apply to the changes that
* have been made.
*
* All other copyrights remain in place and in force.
*/
/***************************************************************************
* 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. *
* *
***************************************************************************/
#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;
smash_tilde( argument );
strcpy( 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 )
{
FILE *fp=NULL;
HELP_DATA *pHelp;
log_string( "Saving help.are..." );
fp = fopen ( "help.are", "w");
if (!fp)
{
bug ("Could not open help.are for writing.",0);
return FALSE;
}
fprintf( fp, "#HELPS\n\n" );
for( pHelp = help_first; pHelp; pHelp = pHelp->next )
{
fprintf( fp, "%d %s~\n%s~\n",
pHelp->level,
pHelp->keyword,
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;
char buf[MAX_STRING_LENGTH];
if ( !EDIT_HELP( ch, pHelp ) )
{
send_to_char( "Null help file.\n\r", ch );
return FALSE;
}
sprintf( buf,
"Seen at level: [%d]\n\r"
"Keywords: [%s]\n\r"
"Text:\n\r%s\n\r",
pHelp->level, pHelp->keyword, pHelp->text );
send_to_char( buf, ch );
return FALSE;
}
HEDIT( hedit_create )
{
HELP_DATA *iHelp;
HELP_DATA *NewHelp;
char buf[MAX_STRING_LENGTH];
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;
sprintf( buf, "Created help with the keyword(s): %s\n\r",
NewHelp->keyword );
send_to_char( buf, ch );
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 min, max, cnt;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char buf2[8*MAX_STRING_LENGTH];
HELP_DATA *help;
buf2[0] = '\0';
buf[0]='\0';
min = -1;
max = get_trust(ch);
argument = one_argument( argument, arg );
if ( arg[0] != '\0' )
min = atoi(arg);
if ( argument[0] != '\0' )
max = atoi(argument);
if (max > get_trust(ch))
{
max = get_trust(ch);
}
if (min < -1 )
{
min = -1;
}
sprintf( buf, "{WHelp Topics in level range %d to %d:{x\n\r\n\r", min, max );
strcat( buf2,buf);
for ( cnt = 0, help = help_first; help; help = help->next )
if ( help->level >= min && help->level <= max )
{
sprintf( buf, " {G%3d {Y%s{x\n\r", help->level, help->keyword );
strcat(buf2,buf);
++cnt;
}
if ( cnt )
{
sprintf( buf, "\n\r%d pages found.\n\r", cnt );
strcat(buf2,buf);
page_to_char (buf2, ch);
}
else
send_to_char( "None found.\n\r", ch );
}