#include <sys/types.h> #if !defined(WIN32) #include <sys/time.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "tables.h" #include "olc.h" #include "lookup.h" #include "recycle.h" #include "interp.h" #define HEDIT( fun ) bool fun(CHAR_DATA *ch, char*argument) #define EDIT_HELP(ch, help) ( help = (HELP_DATA *) ch->desc->pEdit ) extern HELP_AREA *had_list; const struct olc_cmd_type hedit_table[] = { /* { command function }, */ {"keyword", hedit_keyword}, {"texto", hedit_text}, {"new", hedit_new}, {"nivel", 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; HELP_DATA *thelp; for ( temp = had_list; temp; temp = temp->next ) for ( thelp = temp->first; thelp; thelp = thelp->next_area ) if ( thelp == help ) return temp; return NULL; } HEDIT ( hedit_show ) { HELP_DATA *help; char buf[MSL * 2]; EDIT_HELP ( ch, help ); sprintf ( buf, "Keyword : [%s]\n\r" "Nivel : [%d]\n\r" "Texto :\n\r" "%s-FIN-\n\r", help->keyword, help->level, help->text ); chsend ( buf, ch ); return FALSE; } HEDIT ( hedit_level ) { HELP_DATA *help; int lev; EDIT_HELP ( ch, help ); if ( IS_NULLSTR ( argument ) || !is_number ( argument ) ) { chsend ( "Sintaxis : nivel [-1..MAX_LEVEL]\n\r", ch ); return FALSE; } lev = atoi ( argument ); if ( lev < -1 || lev > MAX_LEVEL ) { chprintf ( ch, "HEdit : niveles entre -1 y %d solamente.\n\r", MAX_LEVEL ); return FALSE; } help->level = lev; chsend ( "Ok.\n\r", ch ); return TRUE; } HEDIT ( hedit_keyword ) { HELP_DATA *help; EDIT_HELP ( ch, help ); if ( IS_NULLSTR ( argument ) ) { chsend ( "Sintaxis : keyword [keywords]\n\r", ch ); return FALSE; } free_string ( help->keyword ); help->keyword = str_dup ( argument ); chsend ( "Ok.\n\r", ch ); return TRUE; } HEDIT ( hedit_new ) { char arg[MIL], fullarg[MIL]; HELP_AREA *had; HELP_DATA *help; extern HELP_DATA *help_last; if ( IS_NULLSTR ( argument ) ) { chsend ( "Sintaxis : new [nombre]\n\r", ch ); chsend ( " new [area] [nombre]\n\r", ch ); 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 ) ) { chsend ( "HEdit : help ya existe.\n\r", ch ); return FALSE; } if ( !had ) /* el area no tiene 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; chsend ( "Ok.\n\r", ch ); return FALSE; } HEDIT ( hedit_text ) { HELP_DATA *help; EDIT_HELP ( ch, help ); if ( !IS_NULLSTR ( argument ) ) { chsend ( "Sintaxis : texto\n\r", ch ); return FALSE; } string_append ( ch, &help->text ); return TRUE; } void hedit ( CHAR_DATA * ch, char *argument ) { HELP_DATA *pHelp; HELP_AREA *had; char arg[MAX_INPUT_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; smash_tilde ( argument ); strcpy ( arg, argument ); argument = one_argument ( argument, command ); EDIT_HELP ( ch, pHelp ); had = get_help_area ( pHelp ); if ( had == NULL ) { bugf ( "hedit : had para help %s NULL", pHelp->keyword ); edit_done ( ch ); return; } if ( ch->pcdata->security < 9 ) { chsend ( "HEdit: Insuficiente seguridad para editar help.\n\r", ch ); edit_done ( ch ); return; } if ( command[0] == '\0' ) { hedit_show ( ch, argument ); 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, argument ) ) had->changed = TRUE; return; } } interpret ( ch, arg ); return; } CH_CMD ( do_hedit ) { HELP_DATA *pHelp; if ( IS_NPC ( ch ) ) return; if ( ( pHelp = help_lookup ( argument ) ) == NULL ) { chsend ( "HEdit : Help inexistente.\n\r", ch ); return; } ch->desc->pEdit = ( void * ) pHelp; ch->desc->editor = ED_HELP; return; } HEDIT ( hedit_delete ) { HELP_DATA *pHelp, *temp; HELP_AREA *had; DESCRIPTOR_DATA *d; 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 ) { bugf ( "hedit_delete : help %s no encontrado en 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 ) { bugf ( "hedit_delete : help %s no encontrado en had_list", pHelp->keyword ); return FALSE; } free_help ( pHelp ); chsend ( "Ok.\n\r", ch ); return TRUE; } HEDIT ( hedit_list ) { char buf[MIL]; int cnt = 0; HELP_DATA *pHelp; BUFFER *buffer; 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 ? "\n\r" : " " ); add_buf ( buffer, buf ); cnt++; } if ( cnt % 4 ) add_buf ( buffer, "\n\r" ); page_to_char ( buf_string ( buffer ), ch ); return FALSE; } if ( !str_cmp ( argument, "area" ) ) { if ( ch->in_room->area->helps == NULL ) { chsend ( "No hay helps en esta area.\n\r", ch ); 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 ? "\n\r" : " " ); add_buf ( buffer, buf ); cnt++; } if ( cnt % 4 ) add_buf ( buffer, "\n\r" ); page_to_char ( buf_string ( buffer ), ch ); return FALSE; } if ( IS_NULLSTR ( argument ) ) { chsend ( "Sintaxis : list all\n\r", ch ); chsend ( " list area\n\r", ch ); return FALSE; } return FALSE; }