/************************************************************************
* hedit.c Hedit version 2.0 for Oasis OLC *
* by Steve Wolfe - siv@cyberenet.net *
************************************************************************/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "comm.h"
#include "utils.h"
#include "db.h"
#include "boards.h"
#include "olc.h"
/* List each help entry saved, was used for debugging. */
#if 0
#define HEDIT_LIST 1
#endif
/*------------------------------------------------------------------------*/
/*
* External data structures.
*/
extern struct help_index_element *help_table;
extern int top_of_helpt;
extern struct descriptor_data *descriptor_list;
/*------------------------------------------------------------------------*/
/*
* Function Prototypes
*/
void hedit_disp_extradesc_menu(struct descriptor_data *d);
void hedit_disp_exit_menu(struct descriptor_data *d);
void hedit_disp_exit_flag_menu(struct descriptor_data *d);
void hedit_disp_flag_menu(struct descriptor_data *d);
void hedit_disp_sector_menu(struct descriptor_data *d);
void hedit_disp_menu(struct descriptor_data *d);
void hedit_parse(struct descriptor_data *d, char *arg);
void hedit_setup_new(struct descriptor_data *d, char *new_key);
void hedit_setup_existing(struct descriptor_data *d, int rnum);
void hedit_save_to_disk(void);
void hedit_save_internally(struct descriptor_data *d);
void free_help(struct help_index_element *help);
int isname(char *str, char *namelist);
/*------------------------------------------------------------------------*/
/*------------------------------------------------------------------------*\
Utils and exported functions.
\*------------------------------------------------------------------------*/
void hedit_setup_new(struct descriptor_data *d, char *new_key)
{
CREATE(OLC_HELP(d), struct help_index_element, 1);
OLC_HELP(d)->keywords = str_dup(new_key);
OLC_HELP(d)->entry = str_dup("This is an unfinished help entry.\r\n");
hedit_disp_menu(d);
OLC_VAL(d) = 0;
}
/*------------------------------------------------------------------------*/
void hedit_setup_existing(struct descriptor_data *d, int rnum)
{
struct help_index_element *help;
/*
* Build a copy of the help entry for editing.
*/
CREATE(help, struct help_index_element, 1);
*help = help_table[rnum];
/*
* Allocate space for all strings.
*/
help->keywords = str_dup(help_table[rnum].keywords ?
help_table[rnum].keywords : "UNDEFINED");
help->entry = str_dup(help_table[rnum].entry ?
help_table[rnum].entry : "undefined\r\n");
/*
* Attach copy of help entry to player's descriptor.
*/
OLC_HELP(d) = help;
OLC_VAL(d) = 0;
hedit_disp_menu(d);
}
/*------------------------------------------------------------------------*/
void hedit_save_internally(struct descriptor_data *d)
{
int i, rnum;
struct help_index_element *new_help_table;
rnum = OLC_ZNUM(d);
/*
* Help entry exists exists: free and replace it.
*/
if (rnum > 0) {
free_help(help_table + rnum);
help_table[rnum] = *OLC_HELP(d);
} else { /* Entry doesn't exist, hafta add it. */
CREATE(new_help_table, struct help_index_element, top_of_helpt + 2);
/*
* Insert new entry at the top - why not?
*/
new_help_table[0] = *(OLC_HELP(d));
/*
* Count through help table.
*/
for (i = 0; i <= top_of_helpt; i++)
new_help_table[i + 1] = help_table[i];
/*
* Copy help table over to new one.
*/
free(help_table);
help_table = new_help_table;
top_of_helpt++;
}
olc_add_to_save_list(HEDIT_PERMISSION, OLC_SAVE_HELP);
}
/*------------------------------------------------------------------------*/
void hedit_save_to_disk(void)
{
int i;
FILE *fp;
struct help_index_element *help;
sprintf(buf, "%s/%s.new", HLP_PREFIX, HELP_FILE);
if (!(fp = fopen(buf, "w+"))) {
mudlog("SYSERR: OLC: Cannot open help file!", BRF, LVL_BUILDER, TRUE);
return;
}
for (i = 0; i <= top_of_helpt; i++) {
help = (help_table + i);
#if defined(HEDIT_LIST)
sprintf(buf1, "OLC: Saving help entry %d.", i);
log(buf1);
#endif
/*
* Remove the '\r\n' sequences from description.
*/
strcpy(buf1, help->entry ? help->entry : "Empty\r\n");
strip_string(buf1);
/*
* Forget making a buffer, lets just write the thing now.
*/
fprintf(fp, "%s\n%s#%d\n",
help->keywords ? help->keywords : "UNDEFINED", buf1,
help->min_level);
}
/*
* Write final line and close.
*/
fprintf(fp, "$~\n");
fclose(fp);
sprintf(buf2, "%s/%s", HLP_PREFIX, HELP_FILE);
/*
* We're fubar'd if we crash between the two lines below.
*/
remove(buf2);
rename(buf, buf2);
olc_remove_from_save_list(HEDIT_PERMISSION, OLC_SAVE_HELP);
}
/*------------------------------------------------------------------------*/
void free_help(struct help_index_element *help)
{
if (help->keywords)
free(help->keywords);
if (help->entry)
free(help->entry);
memset(help, 0, (sizeof(struct help_index_element)));
}
/**************************************************************************
Menu functions
**************************************************************************/
/*
* The main menu.
*/
void hedit_disp_menu(struct descriptor_data *d)
{
struct help_index_element *help;
get_char_cols(d->character);
help = OLC_HELP(d);
sprintf(buf,
#if defined(CLEAR_SCREEN)
"[H[J"
#endif
"%s1%s) Keywords : %s%s\r\n"
"%s2%s) Entry :\r\n%s%s"
"%s3%s) Min Level : %s%d\r\n"
"%sQ%s) Quit\r\n"
"Enter choice : ",
grn, nrm, yel, help->keywords,
grn, nrm, yel, help->entry,
grn, nrm, cyn, help->min_level,
grn, nrm
);
send_to_char(buf, d->character);
OLC_MODE(d) = HEDIT_MAIN_MENU;
}
/**************************************************************************
The main loop
**************************************************************************/
void hedit_parse(struct descriptor_data *d, char *arg)
{
int number;
switch (OLC_MODE(d)) {
case HEDIT_CONFIRM_SAVESTRING:
switch (*arg) {
case 'y':
case 'Y':
hedit_save_internally(d);
sprintf(buf, "OLC: %s edits help for %s.", GET_NAME(d->character), OLC_HELP(d)->keywords);
mudlog(buf, CMP, MAX(LVL_BUILDER, GET_INVIS_LEV(d->character)), TRUE);
/*
* Do NOT free strings! Just the help structure.
*/
cleanup_olc(d, CLEANUP_STRUCTS);
send_to_char("Help entry saved to memory.\r\n", d->character);
break;
case 'n':
case 'N':
/*
* Free everything up, including strings, etc.
*/
cleanup_olc(d, CLEANUP_ALL);
break;
default:
send_to_char("Invalid choice!\r\nDo you wish to save this help entry internally? : ", d->character);
break;
}
return;
case HEDIT_MAIN_MENU:
switch (*arg) {
case 'q':
case 'Q':
if (OLC_VAL(d)) { /* Something has been modified. */
send_to_char("Do you wish to save this help entry internally? : ", d->character);
OLC_MODE(d) = HEDIT_CONFIRM_SAVESTRING;
} else
cleanup_olc(d, CLEANUP_ALL);
send_to_char("\r\n", d->character);
return;
case '1':
send_to_char("Enter keywords:-\r\n] ", d->character);
OLC_MODE(d) = HEDIT_KEYWORDS;
break;
case '2':
OLC_MODE(d) = HEDIT_ENTRY;
#if defined(CLEAR_SCREEN)
SEND_TO_Q("\x1B[H\x1B[J", d);
#endif
SEND_TO_Q("Enter help entry: (/s saves /h for help)\r\n\r\n", d);
d->backstr = NULL;
if (OLC_HELP(d)->entry) {
SEND_TO_Q(OLC_HELP(d)->entry, d);
d->backstr = str_dup(OLC_HELP(d)->entry);
}
d->str = &OLC_HELP(d)->entry;
d->max_str = MAX_HELP_ENTRY;
d->mail_to = 0;
OLC_VAL(d) = 1;
break;
case '3':
send_to_char("Enter min level:-\r\n] ", d->character);
OLC_MODE(d) = HEDIT_MIN_LEVEL;
break;
default:
send_to_char("Invalid choice!\r\n", d->character);
hedit_disp_menu(d);
break;
}
return;
case HEDIT_KEYWORDS:
if (OLC_HELP(d)->keywords)
free(OLC_HELP(d)->keywords);
if (strlen(arg) > MAX_HELP_KEYWORDS)
arg[MAX_HELP_KEYWORDS - 1] = '\0';
OLC_HELP(d)->keywords = str_dup((arg && *arg) ? arg : "UNDEFINED");
break;
case HEDIT_ENTRY:
/*
* We will NEVER get here, we hope.
*/
mudlog("SYSERR: Reached HEDIT_ENTRY case in parse_hedit", BRF, LVL_BUILDER, TRUE);
break;
case HEDIT_MIN_LEVEL:
number = atoi(arg);
if ((number < 0) || (number > LVL_IMPL))
send_to_char("That is not a valid choice!\r\nEnter min level:-\r\n] ", d->character);
else {
OLC_HELP(d)->min_level = number;
break;
}
return;
default:
/*
* We should never get here.
*/
mudlog("SYSERR: Reached default case in parse_hedit", BRF, LVL_BUILDER, TRUE);
break;
}
/*
* If we get this far, something has been changed.
*/
OLC_VAL(d) = 1;
hedit_disp_menu(d);
}
int find_help_rnum(char *keyword)
{
extern int top_of_helpt;
int i;
for (i = 0; i < top_of_helpt; i++)
if (isname(keyword, help_table[i].keywords))
return i;
return -1;
}