cdirt/ascii/
cdirt/data/BULL/
cdirt/data/ZONES/PENDING/
cdirt/pending/
cdirt/src/utils/
cdirt/utils/
#include <stdio.h>
#include "kernel.h"
#include "commands.h"
#include "wizard.h"
#include "mud.h"
#include "uaf.h"
#include "writer.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_NOGOSSIP,
  SFL_NOANON,
  SFL_COLOR,
  SFL_NOPUFF
};


int wizsfltable[] = {
  SFL_NOWISH,
  SFL_SEEEXT,
  SFL_NOSHOUT,
  SFL_ALOOF,
  SFL_NOWIZ,
  SFL_NOSLAIN,
  SFL_INTERVIS,
  SFL_NO_IGOSSIP
};

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 () {
  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;
  }
}