#include <stdio.h>
#include "kernel.h"
#include "commands.h"
#include "wizard.h"
#include "mud.h"
#include "uaf.h"
#include "mail.h"
#include "change.h"
#include "frob.h"
#include "bprintf.h"
#include "timing.h"
#include "pflags.h"
#include "sflags.h"
#include "verbs.h"
extern char *opts[];
extern char *toggles[];
extern char *wizopts[];
extern char *wiztoggles[];
#define NUMTOGGLE 15
#define NUMOPTS 5
#define NUMWIZTOGGLE 6
#define NUMWIZOPTS 14
#define STATUS players[mynum].work
void configure (char *);
void get_setins (char *);
void show_lists (void);
int ttable[] = {
VERB_NOORACLE,
VERB_NOBEEP,
VERB_NOWET,
VERB_NOBLINK,
VERB_NEWSTYLE,
VERB_AUTOEXIT,
VERB_HEARBACK,
VERB_NOINV,
VERB_NOFIGHT,
VERB_AWAY,
VERB_BUSY,
VERB_BRIEF,
VERB_NOGOSSIP,
VERB_NOANON,
VERB_COLOR,
VERB_NOPUFF
};
int wizttable[] = {
VERB_NOWISH,
VERB_SEEEXT,
VERB_NOSHOUT,
VERB_ALOOF,
VERB_NOWIZ,
VERB_NOSLAIN,
VERB_IMINVIS,
};
char *wizoptwords[] = {
"prompt",
"setin",
"setout",
"setmin",
"setmout",
"setvin",
"setvout",
"setqin",
"setqout",
"setsit",
"setstnd",
"setsum",
"setsin"
};
int sfltable[] = {
SFL_NOORACLE,
SFL_NOBEEP,
SFL_NOWET,
SFL_NOBLINK,
SFL_NEWSTYLE,
SFL_AUTOEXIT,
SFL_HEARBACK,
SFL_NOINV,
SFL_NOFIGHT,
SFL_AWAY,
SFL_BUSY,
SFL_BRIEF,
SFL_NOCHAT,
SFL_NOANON,
SFL_COLOR,
SFL_NOPUFF
};
int wizsfltable[] = {
SFL_NOWISH,
SFL_SEEEXT,
SFL_NOSHOUT,
SFL_ALOOF,
SFL_NOWIZ,
SFL_NOSLAIN,
};
void show_menu (char *msg, char *type[], int max, int mode) {
int i;
char buff[80];
bprintf("&+M%s\n\n", msg);
for (i = 0 ; i < max ; i++) {
strcpy(buff, type[i]);
if (mode) {
if ((mode == 1 && ststflg(mynum, sfltable[i])) ||
(mode == 2 && ststflg(mynum, wizsfltable[i])))
strcat(buff, " &+W[&+Gon&+W]");
else
strcat(buff, " &+W[&+Roff&+W]");
}
if (i % 2)
bprintf("&+R%c&+W) &+Y%-36s\n", 'a' + i, buff);
else
bprintf("&+R%c&+W) &+Y%-37s", 'a' + i, buff);
}
bprintf("\n");
}
void configurecom () {
if (cur_player->writer) {
bprintf("Finish whatever you're writing first.\n");
return;
}
bprintf("Welcome to the CDirt Configuration Editor!\n[return] ");
cur_player->old_inp_handler = phandler(mynum);
STATUS = 0;
push_input_handler(configure);
STATUS = 0;
}
void exit_config() {
replace_input_handler ((void *)cur_player->old_inp_handler);
pop_input_handler();
strcpy( cur_player->cprompt, (char *) build_prompt(mynum) );
return;
}
void configure (char *input) {
/* handle possible inputs, player typed return */
if (*input == '\0') {
if ((STATUS > 1 && plev(mynum) < LVL_WIZARD) ||
(STATUS > 4)) {
exit_config();
return;
}
else {
STATUS++;
replace_input_handler(configure);
}
}
else {
if (!isalpha(*input)) {
bprintf("Please type a letter.\n");
replace_input_handler(configure);
}
else if (*input == 'q') {
replace_input_handler ((void *)cur_player->old_inp_handler);
pop_input_handler();
strcpy( cur_player->cprompt, (char *) build_prompt(mynum) );
return;
}
else if ((STATUS == 1 && ((*input - 'a') >= NUMTOGGLE)) ||
(STATUS == 2 && ((*input - 'a') >= NUMOPTS)) ||
(STATUS == 3 && ((*input - 'a') >= NUMWIZTOGGLE)) ||
(STATUS == 4 && ((*input - 'a') >= NUMWIZOPTS))) {
bprintf("Invalid letter.\n");
replace_input_handler(configure);
}
else {
switch (players[mynum].work) {
case 1:
doverb(ttable[*input - 'a']);
break;
case 2:
switch(*input) {
case 'a':
reviewcom();
break;
case 'b':
/* change_desc(); */
break;
case 'c':
/* change_sex(); */
break;
case 'd':
/* change_title(); */
break;
case 'e':
/* change_passwd(); */
break;
}
break;
case 3:
doverb(wizttable[*input - 'a']);
break;
case 4:
cur_player->work2[0] = *input - 'a';
get_setins(NULL);
return;
}
}
}
show_lists();
}
void show_lists(void) {
switch (STATUS) {
case 1:
show_menu("Mortal toggle commands:", toggles, NUMTOGGLE, 1);
bprintf("Enter a letter or [return] for more options: ");
strcpy(cur_player->cprompt,
"Enter a letter or [return] for more options: ");
break;
case 2:
show_menu("Mortal options:", opts, NUMOPTS, 0);
if (plev(mynum) > LVL_WIZARD) {
bprintf("Enter a letter or [return] for wizard toggles: ");
strcpy(cur_player->cprompt,
"Enter a letter or [return] for wizard toggles: ");
}
else {
bprintf("Enter a letter or [return] to exit: ");
strcpy(cur_player->cprompt,
"Enter a letter or [return] to exit: ");
}
break;
case 3:
show_menu("Wizard-only toggles:", wiztoggles, NUMWIZTOGGLE, 2);
bprintf("Enter a letter or [return] for wizard options: ");
strcpy(cur_player->cprompt,
"Enter a letter or [return] for wizard options: ");
break;
case 4:
show_menu("Wizard-only options:", wizopts, NUMWIZOPTS, 0);
bprintf("Enter a letter or [return] to exit: ");
strcpy(cur_player->cprompt,
"Enter a letter or [return] to exit: ");
break;
default:
exit_config();
return;
}
replace_input_handler(configure);
}
void get_setins (char *input) {
char buff[MAX_COM_LEN + 10];
int num;
if (input == NULL) {
strcpy( cur_player->cprompt, "New message: " );
replace_input_handler(get_setins);
}
else {
num = cur_player->work2[0];
sprintf(buff, "%s %s", wizoptwords[num], input);
gamecom(buff, True);
replace_input_handler(configure);
return;
}
}