/*
* The functions below this point is handling the context sensitive help system
* If you add more olc options, be sure to add a case for it here. - Welcor
*/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "db.h"
#include "interpreter.h"
#include "oasis.h"
#include "dg_olc.h"
/* Extern functions */
ACMD(do_help);
/* local global */
char *context_help_list[NUM_CONTEXTS];
int find_context(struct descriptor_data *d)
{
switch STATE(d) {
case CON_TRIGEDIT: return find_context_trigedit(d);
case CON_REDIT: return find_context_redit(d);
case CON_MEDIT: return find_context_medit(d);
case CON_OEDIT: return find_context_oedit(d);
case CON_ZEDIT: return find_context_zedit(d);
case CON_SEDIT: return find_context_sedit(d);
case CON_GEDIT: return find_context_gedit(d);
default: return NOTHING;
}
}
int find_context_oedit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case OEDIT_MAIN_MENU: return CONTEXT_OEDIT_MAIN_MENU;
case OEDIT_EDIT_NAMELIST: return CONTEXT_OEDIT_EDIT_NAMELIST;
case OEDIT_SHORTDESC: return CONTEXT_OEDIT_SHORTDESC;
case OEDIT_LONGDESC: return CONTEXT_OEDIT_LONGDESC;
case OEDIT_ACTDESC: return CONTEXT_OEDIT_ACTDESC;
case OEDIT_TYPE: return CONTEXT_OEDIT_TYPE;
case OEDIT_EXTRAS: return CONTEXT_OEDIT_EXTRAS;
case OEDIT_WEAR: return CONTEXT_OEDIT_WEAR;
case OEDIT_WEIGHT: return CONTEXT_OEDIT_WEIGHT;
case OEDIT_COST: return CONTEXT_OEDIT_COST;
case OEDIT_COSTPERDAY: return CONTEXT_OEDIT_COSTPERDAY;
case OEDIT_TIMER: return CONTEXT_OEDIT_TIMER;
case OEDIT_VALUE_1: return CONTEXT_OEDIT_VALUE_1;
case OEDIT_VALUE_2: return CONTEXT_OEDIT_VALUE_2;
case OEDIT_VALUE_3: return CONTEXT_OEDIT_VALUE_3;
case OEDIT_VALUE_4: return CONTEXT_OEDIT_VALUE_4;
case OEDIT_APPLY: return CONTEXT_OEDIT_APPLY;
case OEDIT_APPLYMOD: return CONTEXT_OEDIT_APPLYMOD;
case OEDIT_EXTRADESC_KEY: return CONTEXT_OEDIT_EXTRADESC_KEY;
case OEDIT_CONFIRM_SAVEDB: return CONTEXT_OEDIT_CONFIRM_SAVEDB;
case OEDIT_CONFIRM_SAVESTRING: return CONTEXT_OEDIT_CONFIRM_SAVESTRING;
case OEDIT_PROMPT_APPLY: return CONTEXT_OEDIT_PROMPT_APPLY;
case OEDIT_EXTRADESC_DESCRIPTION: return CONTEXT_OEDIT_EXTRADESC_DESCRIPTION;
case OEDIT_EXTRADESC_MENU: return CONTEXT_OEDIT_EXTRADESC_MENU;
case OEDIT_LEVEL: return CONTEXT_OEDIT_LEVEL;
case OEDIT_PERM: return CONTEXT_OEDIT_PERM;
case OLC_SCRIPT_EDIT: return find_context_script_edit(d);
default: return NOTHING;
}
}
int find_context_redit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case REDIT_MAIN_MENU: return CONTEXT_REDIT_MAIN_MENU;
case REDIT_NAME: return CONTEXT_REDIT_NAME;
case REDIT_DESC: return CONTEXT_REDIT_DESC;
case REDIT_FLAGS: return CONTEXT_REDIT_FLAGS;
case REDIT_SECTOR: return CONTEXT_REDIT_SECTOR;
case REDIT_EXIT_MENU: return CONTEXT_REDIT_EXIT_MENU;
case REDIT_CONFIRM_SAVEDB: return CONTEXT_REDIT_CONFIRM_SAVEDB;
case REDIT_CONFIRM_SAVESTRING: return CONTEXT_REDIT_CONFIRM_SAVESTRING;
case REDIT_EXIT_NUMBER: return CONTEXT_REDIT_EXIT_NUMBER;
case REDIT_EXIT_DESCRIPTION: return CONTEXT_REDIT_EXIT_DESCRIPTION;
case REDIT_EXIT_KEYWORD: return CONTEXT_REDIT_EXIT_KEYWORD;
case REDIT_EXIT_KEY: return CONTEXT_REDIT_EXIT_KEY;
case REDIT_EXIT_DOORFLAGS: return CONTEXT_REDIT_EXIT_DOORFLAGS;
case REDIT_EXTRADESC_MENU: return CONTEXT_REDIT_EXTRADESC_MENU;
case REDIT_EXTRADESC_KEY: return CONTEXT_REDIT_EXTRADESC_KEY;
case REDIT_EXTRADESC_DESCRIPTION:return CONTEXT_REDIT_EXTRADESC_DESCRIPTION;
case OLC_SCRIPT_EDIT: return find_context_script_edit(d);
default: return NOTHING;
}
}
int find_context_zedit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case ZEDIT_MAIN_MENU: return CONTEXT_ZEDIT_MAIN_MENU;
case ZEDIT_DELETE_ENTRY: return CONTEXT_ZEDIT_DELETE_ENTRY;
case ZEDIT_NEW_ENTRY: return CONTEXT_ZEDIT_NEW_ENTRY;
case ZEDIT_CHANGE_ENTRY: return CONTEXT_ZEDIT_CHANGE_ENTRY;
case ZEDIT_COMMAND_TYPE: return CONTEXT_ZEDIT_COMMAND_TYPE;
case ZEDIT_IF_FLAG: return CONTEXT_ZEDIT_IF_FLAG;
case ZEDIT_ARG1: return CONTEXT_ZEDIT_ARG1;
case ZEDIT_ARG2: return CONTEXT_ZEDIT_ARG2;
case ZEDIT_ARG3: return CONTEXT_ZEDIT_ARG3;
case ZEDIT_ZONE_NAME: return CONTEXT_ZEDIT_ZONE_NAME;
case ZEDIT_ZONE_LIFE: return CONTEXT_ZEDIT_ZONE_LIFE;
case ZEDIT_ZONE_BOT: return CONTEXT_ZEDIT_ZONE_BOT;
case ZEDIT_ZONE_TOP: return CONTEXT_ZEDIT_ZONE_TOP;
case ZEDIT_ZONE_RESET: return CONTEXT_ZEDIT_ZONE_RESET;
case ZEDIT_CONFIRM_SAVESTRING:return CONTEXT_ZEDIT_CONFIRM_SAVESTRING;
case ZEDIT_SARG1: return CONTEXT_ZEDIT_SARG1;
case ZEDIT_SARG2: return CONTEXT_ZEDIT_SARG2;
default: return NOTHING;
}
}
int find_context_medit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case MEDIT_MAIN_MENU: return CONTEXT_MEDIT_MAIN_MENU;
case MEDIT_ALIAS: return CONTEXT_MEDIT_ALIAS;
case MEDIT_S_DESC: return CONTEXT_MEDIT_S_DESC;
case MEDIT_L_DESC: return CONTEXT_MEDIT_L_DESC;
case MEDIT_D_DESC: return CONTEXT_MEDIT_D_DESC;
case MEDIT_NPC_FLAGS: return CONTEXT_MEDIT_NPC_FLAGS;
case MEDIT_AFF_FLAGS: return CONTEXT_MEDIT_AFF_FLAGS;
case MEDIT_CONFIRM_SAVESTRING:return CONTEXT_MEDIT_CONFIRM_SAVESTRING;
case MEDIT_SEX: return CONTEXT_MEDIT_SEX;
case MEDIT_HITROLL: return CONTEXT_MEDIT_HITROLL;
case MEDIT_DAMROLL: return CONTEXT_MEDIT_DAMROLL;
case MEDIT_NDD: return CONTEXT_MEDIT_NDD;
case MEDIT_SDD: return CONTEXT_MEDIT_SDD;
case MEDIT_NUM_HP_DICE: return CONTEXT_MEDIT_NUM_HP_DICE;
case MEDIT_SIZE_HP_DICE: return CONTEXT_MEDIT_SIZE_HP_DICE;
case MEDIT_ADD_HP: return CONTEXT_MEDIT_ADD_HP;
case MEDIT_AC: return CONTEXT_MEDIT_AC;
case MEDIT_EXP: return CONTEXT_MEDIT_EXP;
case MEDIT_GOLD: return CONTEXT_MEDIT_GOLD;
case MEDIT_POS: return CONTEXT_MEDIT_POS;
case MEDIT_DEFAULT_POS: return CONTEXT_MEDIT_DEFAULT_POS;
case MEDIT_ATTACK: return CONTEXT_MEDIT_ATTACK;
case MEDIT_LEVEL: return CONTEXT_MEDIT_LEVEL;
case MEDIT_ALIGNMENT: return CONTEXT_MEDIT_ALIGNMENT;
case OLC_SCRIPT_EDIT: return find_context_script_edit(d);
default: return NOTHING;
}
}
int find_context_sedit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case SEDIT_MAIN_MENU: return CONTEXT_SEDIT_MAIN_MENU;
case SEDIT_CONFIRM_SAVESTRING:return CONTEXT_SEDIT_CONFIRM_SAVESTRING;
case SEDIT_NOITEM1: return CONTEXT_SEDIT_NOITEM1;
case SEDIT_NOITEM2: return CONTEXT_SEDIT_NOITEM2;
case SEDIT_NOCASH1: return CONTEXT_SEDIT_NOCASH1;
case SEDIT_NOCASH2: return CONTEXT_SEDIT_NOCASH2;
case SEDIT_NOBUY: return CONTEXT_SEDIT_NOBUY;
case SEDIT_BUY: return CONTEXT_SEDIT_BUY;
case SEDIT_SELL: return CONTEXT_SEDIT_SELL;
case SEDIT_PRODUCTS_MENU: return CONTEXT_SEDIT_PRODUCTS_MENU;
case SEDIT_ROOMS_MENU: return CONTEXT_SEDIT_ROOMS_MENU;
case SEDIT_NAMELIST_MENU: return CONTEXT_SEDIT_NAMELIST_MENU;
case SEDIT_NAMELIST: return CONTEXT_SEDIT_NAMELIST;
case SEDIT_OPEN1: return CONTEXT_SEDIT_OPEN1;
case SEDIT_OPEN2: return CONTEXT_SEDIT_OPEN2;
case SEDIT_CLOSE1: return CONTEXT_SEDIT_CLOSE1;
case SEDIT_CLOSE2: return CONTEXT_SEDIT_CLOSE2;
case SEDIT_KEEPER: return CONTEXT_SEDIT_KEEPER;
case SEDIT_BUY_PROFIT: return CONTEXT_SEDIT_BUY_PROFIT;
case SEDIT_SELL_PROFIT: return CONTEXT_SEDIT_SELL_PROFIT;
case SEDIT_TYPE_MENU: return CONTEXT_SEDIT_TYPE_MENU;
case SEDIT_DELETE_TYPE: return CONTEXT_SEDIT_DELETE_TYPE;
case SEDIT_DELETE_PRODUCT: return CONTEXT_SEDIT_DELETE_PRODUCT;
case SEDIT_NEW_PRODUCT: return CONTEXT_SEDIT_NEW_PRODUCT;
case SEDIT_DELETE_ROOM: return CONTEXT_SEDIT_DELETE_ROOM;
case SEDIT_NEW_ROOM: return CONTEXT_SEDIT_NEW_ROOM;
case SEDIT_SHOP_FLAGS: return CONTEXT_SEDIT_SHOP_FLAGS;
case SEDIT_NOTRADE: return CONTEXT_SEDIT_NOTRADE;
default: return NOTHING;
}
}
int find_context_trigedit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case TRIGEDIT_MAIN_MENU: return CONTEXT_TRIGEDIT_MAIN_MENU;
case TRIGEDIT_TRIGTYPE: return CONTEXT_TRIGEDIT_TRIGTYPE;
case TRIGEDIT_CONFIRM_SAVESTRING:return CONTEXT_TRIGEDIT_CONFIRM_SAVESTRING;
case TRIGEDIT_NAME: return CONTEXT_TRIGEDIT_NAME;
case TRIGEDIT_INTENDED: return CONTEXT_TRIGEDIT_INTENDED;
case TRIGEDIT_TYPES: return CONTEXT_TRIGEDIT_TYPES;
case TRIGEDIT_COMMANDS: return CONTEXT_TRIGEDIT_COMMANDS;
case TRIGEDIT_NARG: return CONTEXT_TRIGEDIT_NARG;
case TRIGEDIT_ARGUMENT: return CONTEXT_TRIGEDIT_ARGUMENT;
default: return NOTHING;
}
}
int find_context_script_edit(struct descriptor_data *d)
{
switch (OLC_SCRIPT_EDIT_MODE(d)) {
case SCRIPT_MAIN_MENU: return CONTEXT_SCRIPT_MAIN_MENU;
case SCRIPT_NEW_TRIGGER:return CONTEXT_SCRIPT_NEW_TRIGGER;
case SCRIPT_DEL_TRIGGER:return CONTEXT_SCRIPT_DEL_TRIGGER;
default: return NOTHING;
}
}
int find_context_gedit(struct descriptor_data *d)
{
switch (OLC_MODE(d)) {
case GEDIT_MAIN_MENU: return CONTEXT_GEDIT_MAIN_MENU;
case GEDIT_CONFIRM_SAVESTRING:return CONTEXT_GEDIT_CONFIRM_SAVESTRING;
case GEDIT_NO_CASH: return CONTEXT_GEDIT_NO_CASH;
case GEDIT_NO_SKILL: return CONTEXT_GEDIT_NO_SKILL;
case GEDIT_NUMERICAL_RESPONSE:return CONTEXT_GEDIT_NUMERICAL_RESPONSE;
case GEDIT_CHARGE: return CONTEXT_GEDIT_CHARGE;
case GEDIT_OPEN: return CONTEXT_GEDIT_OPEN;
case GEDIT_CLOSE: return CONTEXT_GEDIT_CLOSE;
case GEDIT_TRAINER: return CONTEXT_GEDIT_TRAINER;
case GEDIT_NO_TRAIN: return CONTEXT_GEDIT_NO_TRAIN;
case GEDIT_MINLVL: return CONTEXT_GEDIT_MINLVL;
case GEDIT_SELECT_SPELLS: return CONTEXT_GEDIT_SELECT_SPELLS;
case GEDIT_SELECT_SKILLS: return CONTEXT_GEDIT_SELECT_SKILLS;
case GEDIT_SELECT_WPS: return CONTEXT_GEDIT_SELECT_WPS;
case GEDIT_SELECT_LANGS: return CONTEXT_GEDIT_SELECT_LANGS;
default: return NOTHING;
}
}
char *NO_HELP = "No help available (yet)!\r\n";
#define FIND_HELP_CHAR '*'
int context_help(struct descriptor_data *d, char *arg)
{
int context = NOTHING;
char actbuf[MAX_INPUT_LENGTH], *tmp;
/* skip if context help isn't wanted */
if (strncmp(arg, CONTEXT_HELP_STRING, strlen(CONTEXT_HELP_STRING)))
return FALSE;
tmp = one_argument(arg, actbuf); /* the totally useless 'help' string.. */
skip_spaces(&tmp);
if (!*tmp)
context = find_context(d);
if (context != NOTHING && context < NUM_CONTEXTS && *context_help_list[context]) {
if (*context_help_list[context] == FIND_HELP_CHAR) {
strncpy(actbuf, context_help_list[context]+1, sizeof(actbuf)-1);
do_help(d->character, actbuf, 0, 0);
} else {
write_to_output(d, "\r\n%s\r\n> ", context_help_list[context]);
}
return TRUE;
}
strncpy(actbuf, tmp, sizeof(actbuf)-1);
do_help(d->character, actbuf, 0, 0);
return TRUE;
}
void boot_context_help(void) {
int i, num;
FILE *fl;
char line[READ_SIZE];
fl = fopen(CONTEXT_HELP_FILE, "r");
/* init to 'no help' string */
for (i=0;i < NUM_CONTEXTS;i++)
context_help_list[i] = NO_HELP;
if (!fl) {
log("No context help found : %s", strerror(errno));
return;
}
while (get_line(fl, line)) {
if (sscanf(line, "#%d *", &num) == 1 && num >= 0 && num < NUM_CONTEXTS) /* got a number, now get the text */
context_help_list[num] = fread_string(fl, "Context sensitive help");
}
fclose(fl);
}
void free_context_help(void) {
int i;
for (i = 0; i < NUM_CONTEXTS; i++)
if (context_help_list[i] && context_help_list[i] != NO_HELP)
free(context_help_list[i]);
}