/*
* RAM $Id: olc_hedit.c 67 2009-01-05 00:39:32Z quixadhal $
*/
#include <sys/types.h>
#include <sys/time.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "tables.h"
#include "olc.h"
#include "db.h"
#include "strings.h"
#define HEDIT( fun ) bool fun(CHAR_DATA *ch, char*argument)
#define EDIT_HELP(ch, help) ( help = (HELP_DATA *) ch->desc->pEdit )
const struct olc_cmd_type hedit_table[] = {
/* {"command",function}, */
{"keyword", hedit_keyword},
{"text", hedit_text},
{"new", hedit_new},
{"level", hedit_level},
{"commands", show_commands},
{"delete", hedit_delete},
{"list", hedit_list},
{"show", hedit_show},
{"?", show_help},
{NULL, 0}
};
HELP_AREA *get_help_area( HELP_DATA *help )
{
HELP_AREA *temp = NULL;
HELP_DATA *thelp = NULL;
for ( temp = had_list; temp; temp = temp->next )
for ( thelp = temp->first; thelp; thelp = thelp->next_area )
if ( thelp == help )
return temp;
return NULL;
}
bool hedit_show( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *help = NULL;
EDIT_HELP( ch, help );
ch_printf( ch, "Keyword : [%s]\r\n"
"Level : [%d]\r\n"
"Text :\r\n" "%s-END-\r\n", help->keyword, help->level, help->text );
return false;
}
bool hedit_level( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *help = NULL;
int lev = 0;
EDIT_HELP( ch, help );
if ( IS_NULLSTR( argument ) || !is_number( argument ) )
{
ch_printf( ch, "Syntax : level [-1..MAX_LEVEL]\r\n" );
return false;
}
lev = atoi( argument );
if ( lev < -1 || lev > MAX_LEVEL )
{
ch_printf( ch, "HEdit : levels between -1 and %d only.\r\n", MAX_LEVEL );
return false;
}
help->level = lev;
ch_printf( ch, "Ok.\r\n" );
return true;
}
bool hedit_keyword( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *help = NULL;
EDIT_HELP( ch, help );
if ( IS_NULLSTR( argument ) )
{
ch_printf( ch, "Syntax : keyword [keywords]\r\n" );
return false;
}
free_string( help->keyword );
help->keyword = str_dup( argument );
ch_printf( ch, "Ok.\r\n" );
return true;
}
bool hedit_new( CHAR_DATA *ch, const char *argument )
{
char arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char fullarg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
HELP_AREA *had = NULL;
HELP_DATA *help = NULL;
if ( IS_NULLSTR( argument ) )
{
ch_printf( ch, "Syntax : new [number]\r\n" );
ch_printf( ch, " new [area] [number]\r\n" );
return false;
}
strcpy( fullarg, argument );
argument = one_argument( argument, arg );
if ( !( had = had_lookup( arg ) ) )
{
had = ch->in_room->area->helps;
argument = fullarg;
}
if ( help_lookup( argument ) )
{
ch_printf( ch, "HEdit : Help exists.\r\n" );
return false;
}
if ( !had ) /* The area has no helps */
{
had = new_had( );
had->filename = str_dup( ch->in_room->area->file_name );
had->area = ch->in_room->area;
had->first = NULL;
had->last = NULL;
had->changed = true;
had->next = had_list;
had_list = had;
ch->in_room->area->helps = had;
SET_BIT( ch->in_room->area->area_flags, AREA_CHANGED );
}
help = new_help( );
help->level = 0;
help->keyword = str_dup( argument );
help->text = str_dup( "" );
if ( help_last )
help_last->next = help;
if ( help_first == NULL )
help_first = help;
help_last = help;
help->next = NULL;
if ( !had->first )
had->first = help;
if ( !had->last )
had->last = help;
had->last->next_area = help;
had->last = help;
help->next_area = NULL;
ch->desc->pEdit = ( HELP_DATA * ) help;
ch->desc->editor = ED_HELP;
ch_printf( ch, "Ok.\r\n" );
return true;
}
bool hedit_text( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *help = NULL;
EDIT_HELP( ch, help );
if ( !IS_NULLSTR( argument ) )
{
ch_printf( ch, "Syntax : text\r\n" );
return false;
}
string_append( ch, &help->text );
return false;
}
void hedit( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *pHelp = NULL;
HELP_AREA *had = NULL;
char arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
char command[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int cmd = 0;
char local_argument[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
const char *lap = local_argument;
strcpy( local_argument, argument );
smash_tilde( local_argument );
strcpy( arg, lap );
lap = one_argument( lap, command );
EDIT_HELP( ch, pHelp );
had = get_help_area( pHelp );
if ( had == NULL )
{
log_error( "HEdit: Help area for help '%s' NULL", pHelp->keyword );
edit_done( ch );
return;
}
if ( ch->pcdata->security < 9 )
{
ch_printf( ch, "HEdit: Insufficient security for editing help.\r\n" );
edit_done( ch );
return;
}
if ( command[0] == '\0' )
{
hedit_show( ch, lap );
return;
}
if ( !str_cmp( command, "done" ) )
{
edit_done( ch );
return;
}
for ( cmd = 0; hedit_table[cmd].name != NULL; cmd++ )
{
if ( !str_prefix( command, hedit_table[cmd].name ) )
{
if ( ( *hedit_table[cmd].olc_fun ) ( ch, lap ) )
had->changed = true;
return;
}
}
interpret( ch, arg );
return;
}
void do_hedit( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *pHelp = NULL;
if ( IS_NPC( ch ) )
return;
if ( ( pHelp = help_lookup( argument ) ) == NULL )
{
ch_printf( ch, "HEdit: Help does not exist.\r\n" );
return;
}
ch->desc->pEdit = ( void * ) pHelp;
ch->desc->editor = ED_HELP;
return;
}
bool hedit_delete( CHAR_DATA *ch, const char *argument )
{
HELP_DATA *pHelp = NULL;
HELP_DATA *temp = NULL;
HELP_AREA *had = NULL;
DESCRIPTOR_DATA *d = NULL;
bool found = false;
EDIT_HELP( ch, pHelp );
for ( d = descriptor_list; d; d = d->next )
if ( d->editor == ED_HELP && pHelp == ( HELP_DATA * ) d->pEdit )
edit_done( d->character );
if ( help_first == pHelp )
help_first = help_first->next;
else
{
for ( temp = help_first; temp; temp = temp->next )
if ( temp->next == pHelp )
break;
if ( !temp )
{
log_error( "hedit_delete : help %s not found in help_first", pHelp->keyword );
return false;
}
temp->next = pHelp->next;
}
for ( had = had_list; had; had = had->next )
if ( pHelp == had->first )
{
found = true;
had->first = had->first->next_area;
}
else
{
for ( temp = had->first; temp; temp = temp->next_area )
if ( temp->next_area == pHelp )
break;
if ( temp )
{
temp->next_area = pHelp->next_area;
found = true;
break;
}
}
if ( !found )
{
log_error( "hedit_delete : help %s not found in had_list", pHelp->keyword );
return FALSE;
}
free_help( pHelp );
ch_printf( ch, "Ok.\r\n" );
return true;
}
bool hedit_list( CHAR_DATA *ch, const char *argument )
{
char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0";
int cnt = 0;
HELP_DATA *pHelp = NULL;
BUFFER *buffer = NULL;
EDIT_HELP( ch, pHelp );
if ( !str_cmp( argument, "all" ) )
{
buffer = new_buf( );
for ( pHelp = help_first; pHelp; pHelp = pHelp->next )
{
sprintf( buf, "%3d. %-14.14s%s", cnt, pHelp->keyword,
cnt % 4 == 3 ? "\r\n" : " " );
add_buf( buffer, buf );
cnt++;
}
if ( cnt % 4 )
add_buf( buffer, "\r\n" );
page_to_char( buf_string( buffer ), ch );
return false;
}
if ( !str_cmp( argument, "area" ) )
{
if ( ch->in_room->area->helps == NULL )
{
ch_printf( ch, "There are no helps in this area.\r\n" );
return false;
}
buffer = new_buf( );
for ( pHelp = ch->in_room->area->helps->first; pHelp; pHelp = pHelp->next_area )
{
sprintf( buf, "%3d. %-14.14s%s", cnt, pHelp->keyword,
cnt % 4 == 3 ? "\r\n" : " " );
add_buf( buffer, buf );
cnt++;
}
if ( cnt % 4 )
add_buf( buffer, "\r\n" );
page_to_char( buf_string( buffer ), ch );
return false;
}
if ( IS_NULLSTR( argument ) )
{
ch_printf( ch, "Syntax : list all\r\n" );
ch_printf( ch, " list area\r\n" );
return false;
}
return false;
}