/
doc/
lib/world/mob/
lib/world/obj/
lib/world/wld/
lib/world/zon/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "structs.h"
#include "class.h"
#include "interpreter.h"
#include "comm.h"
#include "spells.h"
#include "utils.h"
#include "db.h"
#include "screen.h"
#include "zedit.h"

extern int    top_of_zone_table;
extern struct room_data *world;
extern struct index_data *obj_index;
extern struct obj_data *obj_proto;
extern struct index_data *mob_index;
extern struct char_data *mob_proto;
extern struct zone_data *zone_table;
extern const char *rmode[];
extern const char *equipment_types[];
extern const char *dirs[];

/* external function prototypes */
void log_zone_error(int zone, int cmd_no, char *message);
int remove (char *filename);
int rename (char *filename, char *filename2);

/* local function prototypes */
int zedit_save_zone_file(int zone, struct zone_data *zone_table);
int zedit_parse_zone_table(int zone, struct zone_data *zone_table);
int zedit_initialize(int rznum, struct zone_data *zone_table, struct zedit_struct *zedit_zone);
int zedit_update_zone(int rznum, struct zone_data *zone_table, struct zedit_struct *zedit_zone);
void zedit_parse(struct descriptor_data * d, char *arg);

void zedit_disp_menu(struct descriptor_data *d);
int zedit_disp_mob_menu(struct descriptor_data *d);
int zedit_disp_obj_menu(struct descriptor_data *d);
int zedit_disp_room_menu(struct descriptor_data *d);

int zedit_disp_mob_edit_menu(struct descriptor_data *d);
void zedit_disp_inventory_edit_menu(struct descriptor_data *d);
void zedit_disp_equipment_edit_menu(struct descriptor_data *d);
void zedit_disp_object_edit_menu(struct descriptor_data *d);
void zedit_disp_room_edit_menu(struct descriptor_data *d);

int zedit_update_objs(struct zone_data *resets, struct zedit_obj_list *objs, int cmd_count, char command);
int zedit_update_mobs(struct zone_data *resets, struct zedit_mob_list *mobs, int cmd_count);
int zedit_update_rooms(struct zone_data *resets, struct zedit_room_list *rooms, int cmd_count);
int zedit_update_removes(struct zone_data *resets, struct zedit_remove_list *removes, int cmd_count);

void free_zedit_struct (struct zedit_struct *zone);
int free_zedit_rooms (struct zedit_room_list *rooms, int retval);
int free_zedit_removes (struct zedit_remove_list *removes, int retval);
int free_zedit_objs (struct zedit_obj_list *objs, int retval);
int free_zedit_mobs (struct zedit_mob_list *mobs, int retval);

#define ZCMD zone_table[rzone].cmd[cmd_no]

const char *door_states[] = 
{
	"Open",
	"Closed",
	"Closed and Locked",
	"\n"
};


int zedit_initialize(int rzone, struct zone_data *zone_table, struct zedit_struct * zedit_zone)
{
	int cmd_no;
	struct zedit_mob_list *temp_mob;
	struct zedit_obj_list *temp_obj;
	struct zedit_room_list *temp_room;
	struct zedit_remove_list *temp_remove;

	zedit_zone->cmds = 0;
	zedit_zone->vnum = zone_table[rzone].number;
	zedit_zone->name = strdup(zone_table[rzone].name);
	zedit_zone->top = zone_table[rzone].top;
	zedit_zone->lifespan = zone_table[rzone].lifespan;
	zedit_zone->reset_mode = zone_table[rzone].reset_mode;
	zedit_zone->creator = strdup(zone_table[rzone].creator);
	zedit_zone->lvl_low = zone_table[rzone].lvl_low;
	zedit_zone->lvl_high = zone_table[rzone].lvl_high;

	zedit_zone->rooms = zedit_zone->current_room = NULL;
	zedit_zone->mobs = zedit_zone->current_mob = NULL;
	zedit_zone->objs = zedit_zone->current_obj = NULL;

	for (cmd_no = 0; ZCMD.command != 'S'; cmd_no++) {
		switch (ZCMD.command) {
		case 'M':
			/* This is a mob */
			CREATE(temp_mob, struct zedit_mob_list, 1);
			temp_mob->if_flag = ZCMD.if_flag;
			temp_mob->mob_vnum = mob_index[ZCMD.arg1].virtual;
			temp_mob->max_exist = ZCMD.arg2;
			temp_mob->room_vnum = world[ZCMD.arg3].number;
			temp_mob->inventory = NULL;
			/* Add to list */
			if (zedit_zone->mobs) {
				temp_mob->next = zedit_zone->mobs;
				temp_mob->next->previous = temp_mob;
			} else {
				temp_mob->next = NULL;
			}
			temp_mob->previous = temp_mob;
			zedit_zone->mobs = temp_mob;
			zedit_zone->current_mob = temp_mob;
			temp_mob = NULL;
			break;
		case 'O':
			/* This is an object */
			CREATE(temp_obj, struct zedit_obj_list, 1);
			temp_obj->if_flag = ZCMD.if_flag;
			temp_obj->obj_vnum = obj_index[ZCMD.arg1].virtual;
			temp_obj->max_exist = ZCMD.arg2;
			temp_obj->room_vnum = world[ZCMD.arg3].number;
			/* Add to list */
			if (zedit_zone->objs) {
				temp_obj->next = zedit_zone->objs;
				temp_obj->next->previous = temp_obj;
			} else {
				temp_obj->next = NULL;
			}
			temp_obj->previous = temp_obj;	/* head of list previous's itself */
			zedit_zone->objs = temp_obj;
			temp_obj = NULL;
			break;			
		case 'G':
			CREATE(temp_obj, struct zedit_obj_list, 1);
			temp_obj->if_flag = ZCMD.if_flag;
			temp_obj->obj_vnum = obj_index[ZCMD.arg1].virtual;
			temp_obj->max_exist = ZCMD.arg2;
			temp_obj->room_vnum = NULL;
			/* Add to list */
			if (!zedit_zone->current_mob) {
				/* ERROR */
				log("Error in zedit.c: zedit_initialize got 'G' without a current_mob");
			} else if (zedit_zone->current_mob->inventory) {
				temp_obj->next = zedit_zone->current_mob->inventory;
				temp_obj->next->previous = temp_obj;
			} else {
				temp_obj->next = NULL;
			}
			temp_obj->previous = temp_obj;	/* head of list previous's itself */
			zedit_zone->current_mob->inventory = temp_obj;
			temp_obj = NULL;
			break;
		case 'E':
			CREATE(temp_obj, struct zedit_obj_list, 1);
			temp_obj->if_flag = ZCMD.if_flag;
			temp_obj->obj_vnum = obj_index[ZCMD.arg1].virtual;
			temp_obj->max_exist = ZCMD.arg2;
			temp_obj->room_vnum = ZCMD.arg3;	/* position */
			/* Add to list */
			if (!zedit_zone->current_mob) {
				/* ERROR */
				log("Error in zedit.c: zedit_initialize got 'E' without a current_mob");
			} else if (zedit_zone->current_mob->equipment) {
				temp_obj->next = zedit_zone->current_mob->equipment;
				temp_obj->next->previous = temp_obj;
			} else {
				temp_obj->next = NULL;
			}
			temp_obj->previous = temp_obj;	/* head of list previous's itself */
			zedit_zone->current_mob->equipment = temp_obj;
			temp_obj = NULL;
			break;
		case 'P':
			/* This is an contains */
			CREATE(temp_obj, struct zedit_obj_list, 1);
			temp_obj->if_flag = ZCMD.if_flag;
			temp_obj->obj_vnum = obj_index[ZCMD.arg1].virtual;
			temp_obj->max_exist = ZCMD.arg2;
			temp_obj->room_vnum = world[ZCMD.arg3].number;
			/* Add to list */
			if (zedit_zone->contains) {
				temp_obj->next = zedit_zone->contains;
				temp_obj->next->previous = temp_obj;
			} else {
				temp_obj->next = NULL;
			}
			temp_obj->previous = temp_obj;	/* head of list previous's itself */
			zedit_zone->contains = temp_obj;
			temp_obj = NULL;
			break;
		case 'D':
			/* This is a door */
			CREATE(temp_room, struct zedit_room_list, 1);
			temp_room->if_flag = ZCMD.if_flag;
			temp_room->room_vnum = world[ZCMD.arg1].number;
			temp_room->door_direction = ZCMD.arg2;
			temp_room->door_state = ZCMD.arg3;
			/* Add to list */
			if (zedit_zone->rooms) {
				temp_room->next = zedit_zone->rooms;
				temp_room->next->previous = temp_room;
			} else {
				temp_room->next = NULL;
			}
			temp_room->previous = temp_room;
			zedit_zone->rooms = temp_room;
			temp_room = NULL;			
			break;
		case 'R':
			/* This is a remove */
			CREATE(temp_remove, struct zedit_remove_list, 1);
			temp_remove->if_flag = ZCMD.if_flag;
			temp_remove->room_vnum = world[ZCMD.arg1].number;
			temp_remove->obj_vnum = obj_index[ZCMD.arg2].virtual;
			if (zedit_zone->removes) {
				temp_remove->next = zedit_zone->removes;
				temp_remove->next->previous = temp_remove;
			} else {
				temp_remove->next = NULL;
			}
			temp_remove->previous = temp_remove;
			zedit_zone->removes = temp_remove;
			temp_remove = NULL;
			break;
		default:
			log("zedit.c, in initialize: got to default case");
			break;
		}
	}
	zedit_zone->cmds = cmd_no;
	return 1;
}

void free_zedit_struct (struct zedit_struct *zone)
{
     int temp = zone->cmds;

     if (zone->name)
	free(zone->name);
     if (zone->rooms)
	temp = free_zedit_rooms(zone->rooms, temp);
     if (zone->mobs)
        temp = free_zedit_mobs(zone->mobs, temp);
     if (zone->objs)
        temp = free_zedit_objs(zone->objs, temp);
     if (zone->contains)
        temp = free_zedit_objs(zone->contains, temp);
     if (zone->removes)
	temp = free_zedit_removes(zone->removes, temp);
     if (temp < 0)
	log("zedit.c, in free_zedit_struct: got a temp that's less than 0?!?");
     if (temp > 1)
	log("zedit.c, in free_zedit_struct: got a temp that's more than 1?!?");
     free(zone);
}

int free_zedit_rooms (struct zedit_room_list *rooms, int retval)
{
     if (rooms->next)
	retval = free_zedit_rooms(rooms->next, retval);
     free(rooms);
     return (retval - 1);
}

int free_zedit_removes (struct zedit_remove_list *removes, int retval)
{
     if (removes->next)
	retval = free_zedit_removes(removes->next, retval);
     free(removes);
     return (retval - 1);
}

int free_zedit_objs (struct zedit_obj_list *objs, int retval)
{
     if (objs->next)
	retval = free_zedit_objs(objs->next, retval);
     free(objs);     
     return (retval - 1);
}

int free_zedit_mobs (struct zedit_mob_list *mobs, int retval)
{
     if (mobs->inventory)
	retval = free_zedit_objs(mobs->inventory, retval);
     if (mobs->equipment)
	retval = free_zedit_objs(mobs->equipment, retval);
     if (mobs->next)
        retval = free_zedit_mobs(mobs->next, retval);
     free(mobs);
     return (retval - 1);
}

void free_zone_table(int rznum, struct zone_data *zone_table)
{
	int i;

	free(zone_table[rznum].name);
	for (i = 0; zone_table[rznum].cmd[i].command != 'S'; i++) {
		free(&(zone_table[rznum].cmd[i]));
	}
	free(&(zone_table[rznum].cmd[i]));
	return;
}

void zedit_disp_menu(struct descriptor_data *d)
{
	char outbuf[256];
	struct char_data *ch = d->character;
	
	send_to_char("ZEDIT Main menu          ZEDIT v1.00\r\n", ch);
	sprintf(outbuf, "You are editing zone %d\r\n\r\n", d->edit_number);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    a) Desc.   : %s\r\n", d->zedit_zone->name);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    b) Top     : %d\r\n", d->zedit_zone->top);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    c) Lifespan: %d\r\n", d->zedit_zone->lifespan);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    d) reset   : %s\r\n", rmode[d->zedit_zone->reset_mode]);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    e) Creator : %s\r\n", d->zedit_zone->creator);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    f) MinLevel: %d\r\n", d->zedit_zone->lvl_low);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    g) MaxLevel: %d\r\n\r\n", d->zedit_zone->lvl_high);
	send_to_char(outbuf, ch);
	send_to_char("    1) Edit Mobs to be loaded or their inventory\r\n", ch);
	send_to_char("    2) Edit Objs to be loaded\r\n", ch);
	send_to_char("    3) Edit rooms and their doors\r\n", ch);
	send_to_char("    4) Edit containers\r\n", ch);
	send_to_char("    5) Edit things to be removed\r\n",ch);
	send_to_char("    q) Quit\r\n", ch);
	send_to_char("\r\nPlease Enter your choice:  ", ch);
}

int zedit_disp_mob_menu(struct descriptor_data *d)
{
	char outbuf[256];
	int counter = 0;
	int retval;
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct char_data *mob = NULL;
	struct char_data *ch = d->character;
	struct zedit_mob_list *current_mob;

	send_to_char("Choose from the following commands:\r\n", ch);
	send_to_char("    a) add a mob\r\n", ch);
	send_to_char("    #) edit a mob\r\n", ch);
	send_to_char("    n) goto next mob\r\n", ch);
	send_to_char("    p) goto previous mob\r\n", ch);
        send_to_char("    y) pop to the top of the list\r\n", ch);
	send_to_char("    q) go back to main menu\r\n\r\n", ch);

	if (!(zedit_zone->current_mob))
		current_mob = zedit_zone->mobs;
	else
		current_mob = zedit_zone->current_mob;

	counter = 0;
	while (current_mob && counter < 9) {
		counter++;
		mob = &(mob_proto[real_mobile(current_mob->mob_vnum)]);
		sprintf(outbuf, "%5d) %.20s in %.20s\r\n", counter, 
			GET_NAME(mob), world[real_room(current_mob->room_vnum)].name);
		send_to_char(outbuf, ch);
		current_mob = current_mob->next;
	}
	retval = counter;
	while (counter < 9) {
		send_to_char("\r\n", ch);
		counter++;		
	}
	send_to_char("\r\n", ch);
	send_to_char("What do you wish to do? ", ch);
	return retval; 	/* return biggest number possible */
}

int zedit_disp_mob_edit_menu(struct descriptor_data *d)
{
	char outbuf[256];
	int counter = 0;
	int retval;
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct obj_data *obj = NULL;
	struct char_data *ch = d->character;
	struct zedit_mob_list *current_mob = zedit_zone->current_mob;
	struct zedit_obj_list *current_obj = zedit_zone->current_obj;
	struct char_data *mob = NULL;

	if (!zedit_zone->current_mob) {
		log("zedit.c, disp_mob_edit_menu: no current_mob?!?");
		return 0;
	} else {
		mob = &mob_proto[real_mobile(current_mob->mob_vnum)];
	}
	sprintf(outbuf, "%20.20s in %-20.20s     Strom's ZEDIT", GET_NAME(mob),
		world[real_room(current_mob->room_vnum)].name);
	send_to_char("Choose from the following commands:\r\n", ch);
	send_to_char("    a) add item\r\n", ch);
	send_to_char("    #) edit an item\r\n", ch);
	sprintf(outbuf, "    c) change mob       : %-20s\r\n",
		GET_NAME(mob));
	send_to_char(outbuf, ch);
	send_to_char(   "    d) delete this mob\r\n", ch);
	sprintf(outbuf, "    r) change location  : %-30s\r\n",
		world[real_room(current_mob->room_vnum)].name);
	send_to_char(outbuf, ch);
	sprintf(outbuf, "    m) change maximum   : %d\r\n",
		current_mob->max_exist);
	send_to_char(outbuf, ch);
	send_to_char("    n) goto next object\r\n", ch);
	send_to_char("    p) goto previous object\r\n", ch);
	if (zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT)
		send_to_char("    t) toggle to equipment display\r\n",ch);
	else
		send_to_char("    t) toggle to inventory display\r\n",ch);
        send_to_char("    y) pop to the top of the list\r\n", ch);
	send_to_char("    q) goto back to mob menu\r\n\r\n", ch);
	
	if (zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT)
		send_to_char("Inventory:\r\n",ch);
	else
		send_to_char("Equipment:\r\n",ch);
	counter = 0;
	while (current_obj && counter < 9) {
		counter++;
		obj = &(obj_proto[real_object(current_obj->obj_vnum)]);
		sprintf(outbuf, "%5d) %.20s\r\n", counter, 
			obj->short_description);
		send_to_char(outbuf, ch);
		current_obj = current_obj->next;
	}
	retval = counter;
	while (counter < 9) {
		send_to_char("\r\n", ch);
		counter++;		
	}
	send_to_char("\r\n", ch);
	send_to_char("What do you wish to do? ", ch);
	return retval; 	/* return biggest number possible */
}

void zedit_disp_inventory_edit_menu(struct descriptor_data *d) {
	char outbuf[256];
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct obj_data *obj = NULL;
	struct char_data *ch = d->character;
	struct zedit_obj_list *current_obj = zedit_zone->current_obj;

	if (!current_obj) {
		log("zedit.c, disp_inventory_edit_menu: no current_obj?!?");
	} else {
		obj = &obj_proto[real_object(current_obj->obj_vnum)];
		send_to_char("Choose from the following commands:\r\n", ch);
		sprintf(outbuf, "    c) change object    : %-20s\r\n",
			obj->short_description);
		send_to_char(outbuf, ch);
		send_to_char(   "    d) delete object    :\r\n", ch);
		sprintf(outbuf, "    m) change maximum   : %d\r\n",
			current_obj->max_exist);
		send_to_char(outbuf, ch);
	}
	send_to_char(   "    q) return to mob edit\r\n", ch);
	send_to_char("\r\nWhat do you wish to do? ", ch);
	return;
}

void zedit_disp_equipment_edit_menu(struct descriptor_data *d) {
	char outbuf[256];
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct obj_data *obj = NULL;
	struct char_data *ch = d->character;
	struct zedit_obj_list *current_obj = zedit_zone->current_obj;

	if (!current_obj) {
		log("zedit.c, disp_inventory_edit_menu: no current_obj?!?");
	} else {
		obj = &obj_proto[real_object(current_obj->obj_vnum)];
		send_to_char("Choose from the following commands:\r\n", ch);
		sprintf(outbuf, "    c) change obj       : %-20s\r\n",
			obj->short_description);
		send_to_char(outbuf, ch);
		send_to_char(   "    d) delete object    :\r\n", ch);
		sprintf(outbuf, "    m) change maximum   : %d\r\n",
			current_obj->max_exist);
		send_to_char(outbuf, ch);
		sprintf(outbuf, "    l) change location  : %s\r\n",
			equipment_types[current_obj->room_vnum]);
		send_to_char(outbuf, ch);
	}
	send_to_char("    q) return to mob edit\r\n", ch);
	send_to_char("\r\nWhat do you wish to do? ", ch);
	return;
}

void zedit_disp_object_edit_menu(struct descriptor_data *d) {
	char outbuf[256];
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct obj_data *obj = NULL;
	struct char_data *ch = d->character;
	struct zedit_obj_list *current_obj = zedit_zone->current_obj;

	if (!current_obj) {
		log("zedit.c, disp_object_edit_menu: no current_obj?!?");
	} else {
		obj = &obj_proto[real_object(current_obj->obj_vnum)];
		send_to_char("Choose from the following commands:\r\n", ch);
		sprintf(outbuf, "    c) change obj       : %-20s\r\n",
			obj->short_description);
		send_to_char(outbuf, ch);
		send_to_char(   "    d) delete object    :\r\n", ch);
		sprintf(outbuf, "    m) change maximum   : %d\r\n",
			current_obj->max_exist);
		send_to_char(outbuf, ch);
		sprintf(outbuf, "    l) change location  : %s\r\n",
			world[real_room(current_obj->room_vnum)].name);
		send_to_char(outbuf, ch);
	}
	send_to_char("    q) return to object menu\r\n", ch);
	send_to_char("\r\nWhat do you wish to do? ", ch);
	return;
}

int zedit_disp_obj_menu(struct descriptor_data *d) {
	char outbuf[256];
	int counter = 0;
	int retval;
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct obj_data *obj = NULL;
	struct char_data *ch = d->character;
	struct zedit_obj_list *current_obj = zedit_zone->current_obj;

	send_to_char("Choose from the following commands:\r\n", ch);
	send_to_char("    a) add item\r\n", ch);
	send_to_char("    #) edit an item\r\n", ch);
	send_to_char("    n) goto next object\r\n", ch);
	send_to_char("    p) goto previous object\r\n", ch);
        send_to_char("    y) pop to the top of the list\r\n", ch);
	send_to_char("    q) goto back to main menu\r\n\r\n", ch);
	send_to_char("\r\nObjects to be loaded:\r\n", ch);
	counter = 0;
	while (current_obj && counter < 9) {
		counter++;
		obj = &(obj_proto[real_object(current_obj->obj_vnum)]);
		sprintf(outbuf, "%5d) %.20s to %.20s\r\n", counter, 
			obj->short_description, 
			world[real_room(current_obj->room_vnum)].name);
		send_to_char(outbuf, ch);
		current_obj = current_obj->next;
	}
	retval = counter;
	while (counter < 9) {
		send_to_char("\r\n", ch);
		counter++;		
	}
	send_to_char("\r\n", ch);
	send_to_char("What do you wish to do? ", ch);
	return retval; 	/* return biggest number possible */
}

int zedit_disp_room_menu(struct descriptor_data *d) {
	char outbuf[256];
	int counter = 0;
	int retval;
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct char_data *ch = d->character;
	struct zedit_room_list *current_room;

	send_to_char("Choose from the following commands:\r\n", ch);
	send_to_char("    a) add a door\r\n", ch);
	send_to_char("    #) edit a door\r\n", ch);
        send_to_char("    n) goto next door\r\n", ch);
	send_to_char("    p) goto previous door\r\n", ch);
        send_to_char("    y) pop to the top of the list\r\n", ch);
	send_to_char("    q) go back to main menu\r\n\r\n", ch);

	if (!(zedit_zone->current_room))
		current_room = zedit_zone->rooms;
	else
		current_room = zedit_zone->current_room;

	counter = 0;
	while (current_room && counter < 9) {
		counter++;
		sprintf(outbuf,"%5d) %s door to the %s in %.20s (%d)\r\n", counter,
			door_states[current_room->door_state],
			dirs[current_room->door_direction],
			world[real_room(current_room->room_vnum)].name,
			current_room->room_vnum);
		current_room = current_room->next;
		send_to_char(outbuf, ch);
	}
	retval = counter;
	while (counter < 9) {
		send_to_char("\r\n", ch);
		counter++;
	}
	send_to_char("\r\n", ch);
	send_to_char("What do you wish to do? ", ch);
	return retval;
}

void zedit_disp_room_edit_menu(struct descriptor_data *d) {
	char outbuf[256];
	struct zedit_struct *zedit_zone = d->zedit_zone;
	struct char_data *ch = d->character;
	struct zedit_room_list *current_room = zedit_zone->current_room;

	if (!current_room) {
		log("zedit.c, disp_room_edit_menu: no current_room?!?");
        } else {
		send_to_char("Choose from the following commands:\r\n", ch);
		sprintf(outbuf, "    r) change room      : %-25s\r\n",
			world[real_room(current_room->room_vnum)].name);
		send_to_char(outbuf, ch);
		sprintf(outbuf, "    c) change direction : %-10s\r\n",
			dirs[current_room->door_direction]);
		send_to_char(outbuf, ch);
		sprintf(outbuf, "    s) change state     : %-25s\r\n",
			door_states[current_room->door_state]);
		send_to_char(outbuf, ch);
		send_to_char(   "    d) delete door\r\n", ch);
	}
        send_to_char(   "    q) return to door menu\r\n", ch);
	send_to_char("\r\nWhat do you wish to do? ", ch);
	return;
}

int zedit_save_zone_file(int rzone, struct zone_data *zone_table)
{

	char buf[256], zcom, commentbuf[256];
	char ofname[256], nfname[256];
	int cmd_no, a, b, c;
	FILE	*fp, *old;
	struct char_data *mob = NULL;
	
	sprintf(nfname, "%s/%d.zon.temp", ZON_PREFIX, zone_table[rzone].number);
	fp = fopen(nfname, "w");
	sprintf(ofname, "%s/%d.zon", ZON_PREFIX, zone_table[rzone].number);
	old = fopen(ofname, "r");

	/* the preamble */
	fprintf(fp, "#%d %s %d %d\n", zone_table[rzone].number, 
		zone_table[rzone].creator, zone_table[rzone].lvl_low,
		zone_table[rzone].lvl_high);
	fprintf(fp, "%s~\n", zone_table[rzone].name);
	fprintf(fp, "%d %d %d\n", zone_table[rzone].top,
			zone_table[rzone].lifespan,
			zone_table[rzone].reset_mode);
	fprintf(fp, "*** Zone %d was created using Strom's zedit ***\n",
			zone_table[rzone].number);

	/* get builder info */

	do {
	   get_line2(old, buf);	
	   if (*buf == '*') {
		if (strstr(buf, "Builder")) {
			fprintf(fp, "%s\n", buf);
		}
           }
        } while (*buf != 'S');

	/* the resets */
	for (cmd_no = 0; (zcom = ZCMD.command) != 'S'; cmd_no++) {
		a = ZCMD.arg1;
		b = ZCMD.arg2;
		c = ZCMD.arg3;
		switch (zcom) {
		case 'M':
			mob = &(mob_proto[a]);
			sprintf(commentbuf, "Load %.20s to %.20s (R %d)",
				GET_NAME(mob), world[c].name,
	 			c = world[c].number);
			a = mob_index[a].virtual;
			break;
		case 'O':
			sprintf(commentbuf, "Load %.20s to %.20s (R %d)",
				obj_proto[a].short_description, world[c].name, 
				c = world[c].number);
			a = obj_index[a].virtual;
			break;
		case 'G':
			sprintf(commentbuf, "Give %.20s to %.20s",
				obj_proto[a].short_description, GET_NAME(mob));
			a = obj_index[a].virtual;
			break;
		case 'E':
			sprintf(commentbuf, "Equip %.20s with %.20s",
				GET_NAME(mob), obj_proto[a].short_description);
			a = obj_index[a].virtual;
			break;
		case 'P':
			sprintf(commentbuf, "Put %.20s in %.20s",
				obj_proto[a].name, obj_proto[c].short_description);
			a = obj_index[a].virtual;
			c = obj_index[c].virtual;
			break;
		case 'D':
			sprintf(commentbuf, "Door in %.20s (R %d)", 
				world[a].name, a = world[a].number);
			break;
		case 'R':
			sprintf(commentbuf, "Remove %.20s from %.20s (Room %d)",
				obj_proto[c].name, world[a].name,
				a = world[a].number);
			c = obj_index[c].virtual;
			break;
		default:
			break;
		}

		/* fprint the line of reset into the file */

		if (a < 0 || b < 0 || c < 0) {
			log_zone_error(rzone, cmd_no, "Invalid command generated in zedit");
			return 0;
		} else if (zcom == 0) {
			log_zone_error(rzone, cmd_no, "Invalid command generated in zedit... zcom of 0");
		} else if (strchr("MOEPD", ZCMD.command) == NULL) { /* 3-arg command */
			sprintf(buf, "%c %d %d %d", zcom, ZCMD.if_flag, a, b);
			fprintf(fp, "%-18s %s\n", buf, commentbuf);
		} else { /* 4-arg command */
			sprintf(buf, "%c %d %d %d %d", zcom, ZCMD.if_flag, a, b, c);
			fprintf(fp, "%-18s %s\n", buf, commentbuf);
		}
	}
	/* fprint the 'S' and close up shop*/
	fprintf(fp, "S   *Zone %d has been completed*\n$~", zone_table[rzone].number);
        fclose(old);
	fclose(fp);
        remove(ofname);
        rename(nfname, ofname);
	return TRUE;
}

int zedit_update_mobs(struct zone_data *resets, struct zedit_mob_list *mobs, int cmd_count)
{
	int temp_count = cmd_count;

	resets->cmd[temp_count].command = 'M';
	resets->cmd[temp_count].if_flag = mobs->if_flag;
	resets->cmd[temp_count].arg1 = real_mobile(mobs->mob_vnum);
	resets->cmd[temp_count].arg2= mobs->max_exist;
	resets->cmd[temp_count].arg3 = real_room(mobs->room_vnum);
	resets->cmd[temp_count].line = temp_count;

	temp_count++;
	if (mobs->inventory)
		temp_count = zedit_update_objs(resets, mobs->inventory, temp_count, 'G');
	if (mobs->equipment)
		temp_count = zedit_update_objs(resets, mobs->equipment, temp_count, 'E');
	if (mobs->next)
		temp_count = zedit_update_mobs(resets, mobs->next, temp_count);
	return temp_count;
}

int zedit_update_objs(struct zone_data *resets, struct zedit_obj_list *objs, int cmd_count, char command)
{
	int temp_count = cmd_count;

	resets->cmd[cmd_count].command = command;
	resets->cmd[cmd_count].if_flag = objs->if_flag;
	resets->cmd[cmd_count].arg1 = real_object(objs->obj_vnum);
	resets->cmd[cmd_count].arg2 = objs->max_exist;
	switch (command) {
		case 'O':
			resets->cmd[cmd_count].arg3 = real_room(objs->room_vnum);
			break;
		case 'P':
			resets->cmd[cmd_count].arg3 = real_object(objs->room_vnum);
			break;
		case 'E':
			resets->cmd[cmd_count].arg3 = objs->room_vnum;
			break;
		case 'G':
		default:
			resets->cmd[cmd_count].arg3 = 0;
			break;
	}
	resets->cmd[cmd_count].line = 0;

	temp_count++;
	if (objs->next)
		temp_count = zedit_update_objs(resets, objs->next, temp_count, command);
	return temp_count;
}

int zedit_update_rooms(struct zone_data *resets, struct zedit_room_list *rooms, int cmd_count)
{
	int temp_count = cmd_count;

	resets->cmd[cmd_count].command = 'D';
	resets->cmd[cmd_count].if_flag = rooms->if_flag;
	resets->cmd[cmd_count].arg1 = real_room(rooms->room_vnum);
	resets->cmd[cmd_count].arg2 = rooms->door_direction;
	resets->cmd[cmd_count].arg3 = rooms->door_state;
	resets->cmd[cmd_count].line = 0;

	temp_count++;
	if (rooms->next)
		temp_count = zedit_update_rooms(resets, rooms->next, temp_count);
	return temp_count;
}

int zedit_update_removes(struct zone_data *resets, struct zedit_remove_list *removes, int cmd_count) 
{
	int temp_count = cmd_count;

	resets->cmd[cmd_count].command = 'R';
	resets->cmd[cmd_count].if_flag = removes->if_flag;
	resets->cmd[cmd_count].arg1 = real_room(removes->room_vnum);
	resets->cmd[cmd_count].arg2 = real_object(removes->obj_vnum);
	resets->cmd[cmd_count].arg3 = 0;
	resets->cmd[cmd_count].line = 0;

	temp_count++;
	if (removes->next)
		temp_count = zedit_update_removes(resets, removes->next, temp_count);
	return temp_count;
}

#define Z  zone_table[rznum]
int zedit_update_zone(int rznum, struct zone_data *zone_table, struct zedit_struct *zedit_zone)
{
	/* dummy stub function */
	/* doesn't update zone_tables yet */
	int cmd_count = 0;
	struct reset_com *temp_com;
	free_zone_table(rznum, zone_table);

	Z.name = strdup(zedit_zone->name);
	Z.creator = strdup(zedit_zone->creator);
	Z.lvl_low = zedit_zone->lvl_low;
	Z.lvl_high = zedit_zone->lvl_high;
	Z.lifespan = zedit_zone->lifespan;
	Z.top	= zedit_zone->top;
	Z.number = zedit_zone->vnum;
	Z.reset_mode = zedit_zone->reset_mode;
	CREATE(temp_com, struct reset_com, zedit_zone->cmds);
	
	Z.cmd = temp_com;
	if (zedit_zone->mobs)
		cmd_count = zedit_update_mobs(&Z, zedit_zone->mobs, cmd_count);
	if (zedit_zone->objs)
		cmd_count = zedit_update_objs(&Z, zedit_zone->objs, cmd_count, 'O');
	if (zedit_zone->contains)
		cmd_count = zedit_update_objs(&Z, zedit_zone->contains, cmd_count, 'P');
	if (zedit_zone->rooms)
		cmd_count = zedit_update_rooms(&Z, zedit_zone->rooms, cmd_count);
	if (zedit_zone->removes)
		cmd_count = zedit_update_removes(&Z, zedit_zone->removes, cmd_count);

	Z.cmd[cmd_count].command = 'S';
	if (cmd_count != zedit_zone->cmds)
		log("zedit.c, zedit_update_zone: something bad has happened... cmd_count != zedit_zone->cmds");
	return TRUE;
}
#undef Z

/*  MAIN LOOP */

void zedit_parse(struct descriptor_data * d, char *arg)
{
  extern struct room_data *world;
  extern struct zone_data *zone_table;

  struct char_data *ch = d->character;
  struct zedit_struct *tempzone;
  char outbuf[256];
  int rznum = d->edit_zone;
  int vznum = d->edit_number;
  int tempi = 0;
  struct zedit_mob_list *tempmob = NULL;
  struct zedit_obj_list *tempobj = NULL;
  struct zedit_room_list *temproom = NULL;
  struct zedit_remove_list *tempremove = NULL;

  switch (d->edit_mode) {
  case ZEDIT_CONFIRM_EDIT:
	switch (*arg) {
	case 'y':
	case 'Y':
		CREATE(tempzone, struct zedit_struct, 1);
		d->zedit_zone = tempzone;
		zedit_initialize(rznum, zone_table, d->zedit_zone);
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
   		d->edit_mode = ZEDIT_MAIN_MENU;
		break;
	case 'n':
	case 'N':
		STATE(d) = CON_PLAYING;
		REMOVE_BIT(PLR_FLAGS(ch), PLR_EDITING);
		break;
	default:
		sprintf(outbuf, "%s is not a valid choice!\r\nDo you wish to edit zone %d?  ", arg, vznum);
		send_to_char(outbuf, ch);
		break;
	}
	break;   /* end of ZEDIT_CONFIRM_EDIT */
  case ZEDIT_CONFIRM_SAVEDB:
	switch (*arg) {
	case 'y':
	case 'Y':
		sprintf(outbuf, "Writing zone %d to disk\r\n", vznum);
		if (zedit_save_zone_file(rznum, zone_table))
			send_to_char("Zone has been saved.\r\n", ch);
		else
			send_to_char("Something bad happened.  Your zone was not saved.\r\n", ch);
		/* fall through into 'N' */
	case 'n':
	case 'N':
		send_to_char("Leaving ZEDIT...\r\n", ch);
		REMOVE_BIT(PLR_FLAGS(ch), PLR_EDITING);
		STATE(d) = CON_PLAYING;
		if (d->zedit_zone)
			free_zedit_struct(d->zedit_zone);
		d->zedit_zone = NULL;
		send_to_char("Done.\r\n", ch);
		break;
	default:
		sprintf(outbuf, "%s is not a valid choice!\r\n
			Do you wish to save zone %d to file?  ", arg, vznum);
		send_to_char(outbuf, ch);
		break;
	}
	break; /* end of ZEDIT_CONFIRM_SAVEDB */
  case ZEDIT_CONFIRM_SAVE:
	switch (*arg) {
	case 'y':
	case 'Y':
		sprintf(outbuf, "Updating zone %d\r\n", vznum);
		if (zedit_update_zone(rznum, zone_table, d->zedit_zone))
			send_to_char("Zone has been updated.\r\n", ch);
		else
			send_to_char("Something bad happened.  Your zone was not updated correctly.\r\n", ch);
		/* fall through into 'N' */
		d->edit_mode = ZEDIT_CONFIRM_SAVEDB;
		sprintf(outbuf, "Do you wish to save zone %d to file?  ", vznum);
		send_to_char(outbuf, ch);
		break;		
	case 'n':
	case 'N':
		send_to_char("Leaving ZEDIT...\r\n", ch);
		REMOVE_BIT(PLR_FLAGS(ch), PLR_EDITING);
		STATE(d) = CON_PLAYING;
		if (d->zedit_zone)
			free_zedit_struct(d->zedit_zone);
		d->zedit_zone = NULL;
		send_to_char("Done.\r\n", ch);
		break;
	default:
		sprintf(outbuf, "%s is not a valid choice!\r\n
			Do you wish to update zone %d internally?  ", arg, vznum);
		send_to_char(outbuf, ch);
		break;
	}
	break; /* end of ZEDIT_CONFIRM_SAVE */
  case ZEDIT_CONFIRM_EXIT:
	switch (*arg) {
	case 'y':
	case 'Y':
		d->edit_mode = ZEDIT_CONFIRM_SAVE;
		sprintf(outbuf, "Do you wish to update zone %d internally?  ", vznum);
		send_to_char(outbuf, ch);
		break;		
	case 'n':
	case 'N':
		d->edit_mode = ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
		break;
	default:
		sprintf(outbuf, "%s is not a valid choice!\r\nDo you wish to stop editing zone %d?  ",
			 arg, vznum);
		send_to_char(outbuf, ch);
		break;
	}
	break; /* end of ZEDIT_CONFIRM_STOP */
     case ZEDIT_MAIN_DESC:
	if (d->zedit_zone->name)
		free(d->zedit_zone->name);
	d->zedit_zone->name = str_dup(arg);
	d->edit_mode= ZEDIT_MAIN_MENU;
	send_to_char(KCLS, ch);
	zedit_disp_menu(d);
	break;
     case ZEDIT_MAIN_TOP:
	tempi = atoi(arg);
	if (tempi < d->zedit_zone->vnum * 100) {
		sprintf(outbuf, "%d is not a valid number! Please enter the top room vnum: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->top = tempi;
		d->edit_mode= ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
	}
	break;
     case ZEDIT_MAIN_LIFESPAN:
	tempi = atoi(arg);
	if (tempi <= 0 || tempi >= 100) {
		sprintf(outbuf, "%d is not a valid number!  Choose a number from 1 to 100: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->lifespan = tempi;
		d->edit_mode= ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
	}
	break;
     case ZEDIT_MAIN_RESET:
	tempi = atoi(arg);
	if (tempi < 0 || tempi > 2) {
		sprintf(outbuf, "%d is not a valid number!  Choose a number from 0 to 2: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->reset_mode = tempi;
		d->edit_mode= ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
	}
	break;
     case ZEDIT_MAIN_CREATOR:
	if (d->zedit_zone->creator)
		free(d->zedit_zone->creator);
	d->zedit_zone->creator = str_dup(arg);
	d->edit_mode= ZEDIT_MAIN_MENU;
	send_to_char(KCLS, ch);
	zedit_disp_menu(d);
	break;
     case ZEDIT_MAIN_MINLEV:
	tempi = atoi(arg);
	if (tempi <= 0 || tempi >= d->zedit_zone->lvl_high) {
		sprintf(outbuf, "%d is not a valid number!  Choose a number from 1 to %d: ", tempi, d->zedit_zone->lvl_high);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->lvl_low = tempi;
		d->edit_mode= ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
	}
	break;
     case ZEDIT_MAIN_MAXLEV:
	tempi = atoi(arg);
	if (tempi <= d->zedit_zone->lvl_low || tempi > LVL_IMMORT) {
		sprintf(outbuf, "%d is not a valid number!  Choose a number from %d to %d: ", tempi,
			d->zedit_zone->lvl_low, LVL_IMMORT);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->lvl_high = tempi;
		d->edit_mode= ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
	}
	break;
     case ZEDIT_MAIN_MENU:
	switch (*arg) {
	case 'a':
	case 'A':
		send_to_char("Please enter new description: ", ch);
		d->edit_mode= ZEDIT_MAIN_DESC;
		break;
	case 'b':
	case 'B':
		send_to_char("Please enter new top room's vnum: ", ch);
		d->edit_mode= ZEDIT_MAIN_TOP;
		break;
	case 'c':
	case 'C':
		send_to_char("Please enter new lifespan: ", ch);
		d->edit_mode= ZEDIT_MAIN_LIFESPAN;
		break;
	case 'd':
	case 'D':
		send_to_char("Please enter new reset mode: ", ch);
		d->edit_mode= ZEDIT_MAIN_RESET;
		break;
	case 'e':
	case 'E':
		send_to_char("Please enter creator's name: ", ch);
		d->edit_mode= ZEDIT_MAIN_CREATOR;
		break;
	case 'f':
	case 'F':
		send_to_char("Please enter new minimum level: ", ch);
		d->edit_mode= ZEDIT_MAIN_MINLEV;
		break;
	case 'g':
	case 'G':
		send_to_char("Please enter new maximum level: ", ch);
		d->edit_mode= ZEDIT_MAIN_MAXLEV;
		break;
	case 'q':
	case 'Q':
		sprintf(outbuf, "Do you wish to stop editing zone %d?  ", vznum);
	  	send_to_char(outbuf, ch);
	  	d->edit_mode= ZEDIT_CONFIRM_EXIT;
	  	break;
	case '1':
		send_to_char(KCLS, ch);
		d->zedit_zone->current_mob = d->zedit_zone->mobs;
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		d->edit_mode = ZEDIT_MOB_MENU;
		break;
	case '2':
		send_to_char(KCLS, ch);
		d->zedit_zone->current_obj = d->zedit_zone->objs;
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		d->edit_mode = ZEDIT_OBJ_MENU;
		break;
	case '3':
		send_to_char(KCLS, ch);
		d->zedit_zone->current_room = d->zedit_zone->rooms;
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		d->edit_mode = ZEDIT_ROOM_MENU;
		break;
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			 KCLS, arg);
		send_to_char(outbuf, ch);
		zedit_disp_menu(d);
		break;
	}
	break; /* end of ZEDIT_MAIN_MENU */
     case ZEDIT_MOB_MENU:
	if (isdigit(*arg) && (tempi = atoi(arg)) 
	    && (tempi > 0 && tempi <= d->zedit_zone->reg1)) {
		while (tempi-- > 1) {
			if (d->zedit_zone->current_mob && d->zedit_zone->current_mob->next)
				d->zedit_zone->current_mob = d->zedit_zone->current_mob->next;
			else
				log("zedit.c in mob_menu: Counting error while incrementing pointer");
		}
		d->zedit_zone->current_obj = d->zedit_zone->current_mob->inventory;
		d->zedit_zone->reg2 = ZEDIT_INVENTORY_EDIT;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		d->edit_mode = ZEDIT_MOB_EDIT;
	} else switch(*arg) {
	case 'a':
	case 'A':
		d->zedit_zone->cmds += 1;
		CREATE(tempmob, struct zedit_mob_list, 1);
		tempmob->if_flag = 0;
		tempmob->mob_vnum = 1;
		tempmob->max_exist = 1;
		tempmob->room_vnum = 0;
		tempmob->inventory = NULL;
		if (d->zedit_zone->mobs) {
			tempmob->next = d->zedit_zone->mobs;
			tempmob->next->previous = tempmob;
		} else {
			tempmob->next = NULL;
		}
		tempmob->previous = tempmob;
		d->zedit_zone->mobs = tempmob;
		d->zedit_zone->current_mob = tempmob;
		d->zedit_zone->current_obj = NULL;
		tempmob = NULL;
		d->edit_mode = ZEDIT_MOB_EDIT;		
		d->zedit_zone->reg2 = ZEDIT_INVENTORY_EDIT;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'q':
	case 'Q':
		d->zedit_zone->current_mob = d->zedit_zone->mobs;
		d->zedit_zone->current_obj = d->zedit_zone->objs;
		d->edit_mode = ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
		break;
	case 'n':
	case 'N':
		if (d->zedit_zone->reg1 >= 9 && d->zedit_zone->current_mob && d->zedit_zone->current_mob->next)
			d->zedit_zone->current_mob = d->zedit_zone->current_mob->next;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		break;
	case 'p':
	case 'P':
		if (d->zedit_zone->current_mob)
			d->zedit_zone->current_mob = d->zedit_zone->current_mob->previous;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		break;
	case 'y':
	case 'Y':
		if (d->zedit_zone->mobs)
			d->zedit_zone->current_mob = d->zedit_zone->mobs;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		break;
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		break;		
	}
	break; /* end of ZEDIT_MOB_MENU */
     case ZEDIT_MOB_NAME:
	tempi = atoi(arg);
	if (real_mobile(tempi) == -1) {
		sprintf(outbuf, "%d is not a valid number! Please enter the mob's vnum: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->current_mob->mob_vnum = tempi;
		d->edit_mode= ZEDIT_MOB_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_mob_edit_menu(d);
	}
	break;
     case ZEDIT_MOB_ROOM:
	tempi = atoi(arg);
	if (real_room(tempi) == -1) {
		sprintf(outbuf, "%d is not a valid number! Please enter the room's vnum: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->current_mob->room_vnum = tempi;
		d->edit_mode= ZEDIT_MOB_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_mob_edit_menu(d);
	}
	break;
     case ZEDIT_MOB_MAXNUM:
	tempi = atoi(arg);
	if (tempi <= 0 || tempi > 1000) {
		sprintf(outbuf, "%d is not a valid number! Please enter a number from 1 to 1000: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->current_mob->max_exist = tempi;
		d->edit_mode= ZEDIT_MOB_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_mob_edit_menu(d);
	}
	break;
     case ZEDIT_MOB_VNUM:
	d->edit_mode=ZEDIT_MOB_EDIT;
	send_to_char(KCLS, ch);
	zedit_disp_mob_edit_menu(d);
	break;
     case ZEDIT_MOB_EDIT:
	if (isdigit(*arg) && (tempi = atoi(arg)) 
	    && (tempi > 0 && tempi <= d->zedit_zone->reg1)) {
		while (tempi-- > 1) {
			if (d->zedit_zone->current_obj && d->zedit_zone->current_obj->next)
				d->zedit_zone->current_obj = d->zedit_zone->current_obj->next;
			else
				log("zedit.c in mob_edit: Counting error while incrementing pointer");
		}
		send_to_char(KCLS, ch);
		if (d->zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT) {
			zedit_disp_inventory_edit_menu(d);
			d->edit_mode = ZEDIT_INVENTORY_EDIT;
		} else {
			zedit_disp_equipment_edit_menu(d);
			d->edit_mode = ZEDIT_EQUIPMENT_EDIT;
		}
	} else switch(*arg) {
	case 'a':
	case 'A':
		d->zedit_zone->cmds += 1;
		CREATE(tempobj, struct zedit_obj_list, 1);
		d->zedit_zone->current_obj = tempobj;
		tempobj->if_flag = 1;
		tempobj->obj_vnum = 1;
		tempobj->max_exist = 1;
		tempobj->room_vnum = 0;
		send_to_char(KCLS, ch);
		if (d->zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT) {
			if (d->zedit_zone->current_mob->inventory) {
				tempobj->next = d->zedit_zone->current_mob->inventory;
				tempobj->next->previous = tempobj;
			} else {
				tempobj->next = NULL;
			}
			d->zedit_zone->current_mob->inventory = tempobj;
			d->edit_mode = ZEDIT_INVENTORY_EDIT;		
			zedit_disp_inventory_edit_menu(d);
		} else {
			if (d->zedit_zone->current_mob->equipment) {
				tempobj->next = d->zedit_zone->current_mob->equipment;
				tempobj->next->previous = tempobj;
			} else {
				tempobj->next = NULL;
			}
			d->zedit_zone->current_mob->equipment = tempobj;
			d->edit_mode = ZEDIT_EQUIPMENT_EDIT;		
			zedit_disp_equipment_edit_menu(d);
		}
		tempobj->previous = tempobj;
		d->zedit_zone->current_obj = tempobj;
		tempobj = NULL;
		break;
	case 'c':
	case 'C':
		send_to_char("Please enter new mob's vnum: ", ch);
		d->edit_mode= ZEDIT_MOB_NAME;
		break;
	case 'd':
	case 'D':
		tempmob = d->zedit_zone->current_mob;
		if (tempmob->previous != tempmob) { /* not head of list */
			tempmob->previous->next = tempmob->next;
			if (tempmob->next)
				tempmob->next->previous = tempmob->previous;
		} else {
			d->zedit_zone->mobs = tempmob->next;
			if (tempmob->next)
				tempmob->next->previous = tempmob->next;
		}
		d->zedit_zone->current_mob = d->zedit_zone->mobs;
		tempmob->next = NULL;
		free_zedit_mobs(tempmob, 1);
		tempmob = NULL;
		d->zedit_zone->cmds -= 1;
		/* FALLS INTO 'Q'... I'm Lazy */
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_MOB_MENU;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_menu(d);
		break;
	case 'm':
	case 'M':
		send_to_char("Please enter new maximum: ", ch);
		d->edit_mode= ZEDIT_MOB_MAXNUM;
		break;
	case 'n':
	case 'N':
		if (d->zedit_zone->reg1 >= 9 && d->zedit_zone->current_obj && d->zedit_zone->current_obj->next)
			d->zedit_zone->current_obj = d->zedit_zone->current_obj->next;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'p':
	case 'P':
		if (d->zedit_zone->current_obj)
			d->zedit_zone->current_obj = d->zedit_zone->current_obj->previous;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'y':
	case 'Y':
		if (d->zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT) {
			d->zedit_zone->current_obj = d->zedit_zone->current_mob->inventory;
		} else {
			d->zedit_zone->current_obj = d->zedit_zone->current_mob->equipment;	
		}
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break; 
	case 'r':
	case 'R':
		send_to_char("Please enter new room's vnum: ", ch);
		d->edit_mode= ZEDIT_MOB_ROOM;
		break;
	case 't':
	case 'T':
		if (d->zedit_zone->reg2 == ZEDIT_INVENTORY_EDIT) {
			d->zedit_zone->reg2 = ZEDIT_EQUIPMENT_EDIT;
			d->zedit_zone->current_obj = d->zedit_zone->current_mob->equipment;
		} else {
			d->zedit_zone->reg2 = ZEDIT_INVENTORY_EDIT;
			d->zedit_zone->current_obj = d->zedit_zone->current_mob->inventory;	
		}
		send_to_char(KCLS, ch);		
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'v':
	case 'V':
		send_to_char("Please enter new mob's name: ", ch);
		d->edit_mode= ZEDIT_MOB_VNUM;
		break;
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;		
	}
        break; /* MOB_EDIT */
     case ZEDIT_OBJ_MENU:
	if (isdigit(*arg) && (tempi = atoi(arg)) 
	    && (tempi > 0 && tempi <= d->zedit_zone->reg1)) {
		while (tempi-- > 1) {
			if (d->zedit_zone->current_obj && d->zedit_zone->current_obj->next)
				d->zedit_zone->current_obj = d->zedit_zone->current_obj->next;
			else
				log("zedit.c in obj_edit: Counting error while incrementing pointer");
		}
		send_to_char(KCLS, ch);
		zedit_disp_object_edit_menu(d);
		d->edit_mode = ZEDIT_OBJECT_EDIT;
	} else switch(*arg) {
	case 'a':
	case 'A':
		d->zedit_zone->cmds += 1;
		CREATE(tempobj, struct zedit_obj_list, 1);
		d->zedit_zone->current_obj = tempobj;
		tempobj->if_flag = 0;
		tempobj->obj_vnum = 1;
		tempobj->max_exist = 1;
		tempobj->room_vnum = 0;
		send_to_char(KCLS, ch);
		if (d->zedit_zone->objs) {
			tempobj->next = d->zedit_zone->objs;
			tempobj->next->previous = tempobj;
		} else {
			tempobj->next = NULL;
		}
		d->zedit_zone->objs = tempobj;
		d->edit_mode = ZEDIT_OBJECT_EDIT;		
		zedit_disp_object_edit_menu(d);
		tempobj->previous = tempobj;
		tempobj = NULL;
		break;
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
		break;
	case 'n':
	case 'N':
		if (d->zedit_zone->reg1 >= 9 && d->zedit_zone->current_obj && d->zedit_zone->current_obj->next)
			d->zedit_zone->current_obj = d->zedit_zone->current_obj->next;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		break;
	case 'p':
	case 'P':
		if (d->zedit_zone->current_obj)
			d->zedit_zone->current_obj = d->zedit_zone->current_obj->previous;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		break;
	case 'y':
	case 'Y':
		if (d->zedit_zone->objs)
			d->zedit_zone->current_obj = d->zedit_zone->objs;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		break;
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		break;		
	}
        break; /* OBJECT_MENU */
     case ZEDIT_INVENTORY_NAME:
     case ZEDIT_EQUIPMENT_NAME:
     case ZEDIT_OBJECT_NAME:
	tempi = atoi(arg);	
	if (real_object(tempi) == -1) {
		sprintf(outbuf, "%d is not a valid number! Please enter the object's vnum: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->current_obj->obj_vnum = tempi;
		send_to_char(KCLS, ch);
		switch (d->edit_mode) {
		case ZEDIT_INVENTORY_NAME:
			d->edit_mode= ZEDIT_INVENTORY_EDIT;
			zedit_disp_inventory_edit_menu(d);
			break;
		case ZEDIT_EQUIPMENT_NAME:
			d->edit_mode= ZEDIT_EQUIPMENT_EDIT;
			zedit_disp_equipment_edit_menu(d);
			break;
		case ZEDIT_OBJECT_NAME:
			d->edit_mode= ZEDIT_OBJECT_EDIT;
			zedit_disp_object_edit_menu(d);
			break;
		default:
			log("zedit.c, OBJECT_NAME: got here somehow... bad");
			d->edit_mode= ZEDIT_MAIN_MENU;
			zedit_disp_menu(d);
			break;
		}	
	}
	break;
     case ZEDIT_INVENTORY_MAXNUM:
     case ZEDIT_EQUIPMENT_MAXNUM:
     case ZEDIT_OBJECT_MAXNUM:
	tempi = atoi(arg);
	d->zedit_zone->current_obj->max_exist= tempi;
	send_to_char(KCLS, ch);
	switch (d->edit_mode) {
	case ZEDIT_INVENTORY_MAXNUM:
		d->edit_mode= ZEDIT_INVENTORY_EDIT;
		zedit_disp_inventory_edit_menu(d);
		break;
	case ZEDIT_EQUIPMENT_MAXNUM:
		d->edit_mode= ZEDIT_EQUIPMENT_EDIT;
		zedit_disp_equipment_edit_menu(d);
		break;
	case ZEDIT_OBJECT_MAXNUM:
		d->edit_mode= ZEDIT_OBJECT_EDIT;
		zedit_disp_object_edit_menu(d);
		break;
	default:
		log("zedit.c, OBJECT_MAXNUM: got here somehow... bad");
		d->edit_mode= ZEDIT_MAIN_MENU;
		zedit_disp_menu(d);
		break;
	}			
	break;
     case ZEDIT_EQUIPMENT_LOC:
	tempi = atoi(arg);
	if (tempi >= NUM_WEARS || tempi < 0) {
	        sprintf(outbuf, "%d is not a valid number! Please enter the wear location between 0 and %d: ", tempi, NUM_WEARS - 1);
                send_to_char(outbuf, ch);
  	} else {	
		d->zedit_zone->current_obj->room_vnum= tempi;
		send_to_char(KCLS, ch);
		d->edit_mode= ZEDIT_EQUIPMENT_EDIT;
		zedit_disp_equipment_edit_menu(d);
	}
	break;
     case ZEDIT_OBJECT_LOC:
	tempi = atoi(arg);
	if (real_room(tempi) == -1) {
	        sprintf(outbuf, "%d is not a valid number! Please enter a valid room vnum: ", tempi);
                send_to_char(outbuf, ch);
  	} else {	
		d->zedit_zone->current_obj->room_vnum= tempi;
		send_to_char(KCLS, ch);
		d->edit_mode= ZEDIT_OBJECT_EDIT;
		zedit_disp_object_edit_menu(d);
	}
	break;
     case ZEDIT_INVENTORY_EDIT:
	switch(*arg) {
	case 'c':
	case 'C':
		send_to_char("Please enter new object's vnum: ", ch);
		d->edit_mode= ZEDIT_INVENTORY_NAME;
		break;
	case 'd':
	case 'D':
		tempobj = d->zedit_zone->current_obj;
		if (tempobj->previous != tempobj) { /* not head of list */
			tempobj->previous->next = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->previous;
		} else {
			d->zedit_zone->current_mob->inventory = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->next;
		}
		d->zedit_zone->current_obj = d->zedit_zone->current_mob->inventory;
		tempobj->next = NULL;
		free_zedit_objs(tempobj, 1);
		tempobj = NULL;
		d->zedit_zone->cmds -= 1;
		/* FALLS INTO 'Q'... I'm Lazy */
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_MOB_EDIT;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'm':
	case 'M':
		send_to_char("Please enter new maximum: ", ch);
		d->edit_mode= ZEDIT_INVENTORY_MAXNUM;
		break;
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		zedit_disp_inventory_edit_menu(d);
		break;		
	}
        break; /* INVENTORY_EDIT */
     case ZEDIT_EQUIPMENT_EDIT:
	switch(*arg) {
	case 'c':
	case 'C':
		send_to_char("Please enter new object's vnum: ", ch);
		d->edit_mode= ZEDIT_EQUIPMENT_NAME;
		break;
	case 'd':
	case 'D':
		tempobj = d->zedit_zone->current_obj;
		if (tempobj->previous != tempobj) { /* not head of list */
			tempobj->previous->next = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->previous;
		} else {
			d->zedit_zone->current_mob->equipment = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->next;
		}
		d->zedit_zone->current_obj = d->zedit_zone->current_mob->equipment;
		tempobj->next = NULL;
		free_zedit_objs(tempobj, 1);
		tempobj = NULL;
		d->zedit_zone->cmds -= 1;
		/* FALLS INTO 'Q'... I'm Lazy */
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_MOB_EDIT;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_mob_edit_menu(d);
		break;
	case 'm':
	case 'M':
		send_to_char("Please enter new maximum: ", ch);
		d->edit_mode= ZEDIT_EQUIPMENT_MAXNUM;
		break;
	case 'l':
	case 'L':
		send_to_char("Please enter new location: ", ch);
		d->edit_mode = ZEDIT_EQUIPMENT_LOC;
		break;		
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		zedit_disp_equipment_edit_menu(d);
		break;		
	}
        break; /* EQUIPMENT_EDIT */
     case ZEDIT_OBJECT_EDIT:
	switch(*arg) {
	case 'c':
	case 'C':
		send_to_char("Please enter new object's vnum: ", ch);
		d->edit_mode= ZEDIT_OBJECT_NAME;
		break;
	case 'd':
	case 'D':
		tempobj = d->zedit_zone->current_obj;
		if (tempobj->previous != tempobj) { /* not head of list */
			tempobj->previous->next = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->previous;
		} else {
			d->zedit_zone->objs = tempobj->next;
			if (tempobj->next)
				tempobj->next->previous = tempobj->next;
		}
		d->zedit_zone->current_obj = d->zedit_zone->objs;
		tempobj->next = NULL;
		free_zedit_objs(tempobj, 1);
		tempobj = NULL;
		d->zedit_zone->cmds -= 1;
		/* FALLS INTO 'Q'... I'm Lazy */
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_OBJ_MENU;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_obj_menu(d);
		break;
	case 'm':
	case 'M':
		send_to_char("Please enter new maximum: ", ch);
		d->edit_mode= ZEDIT_OBJECT_MAXNUM;
		break;
	case 'l':
	case 'L':
		send_to_char("Please enter new location: ", ch);
		d->edit_mode = ZEDIT_OBJECT_LOC;
		break;		
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		zedit_disp_object_edit_menu(d);
		break;		
	}
        break; /* OBJECT_EDIT */
     case ZEDIT_ROOM_MENU:
	if (isdigit(*arg) && (tempi = atoi(arg)) 
	    && (tempi > 0 && tempi <= d->zedit_zone->reg1)) {
		while (tempi-- > 1) {
			if (d->zedit_zone->current_room && d->zedit_zone->current_room->next)
				d->zedit_zone->current_room = d->zedit_zone->current_room->next;
			else
				log("zedit.c in room_menu: Counting error while incrementing pointer");
		}
		send_to_char(KCLS, ch);
		zedit_disp_room_edit_menu(d);
		d->edit_mode = ZEDIT_ROOM_EDIT;
	} else switch(*arg) {
	case 'a':
	case 'A':
		d->zedit_zone->cmds += 1;
		CREATE(temproom, struct zedit_room_list, 1);
		temproom->if_flag = 0;
		temproom->room_vnum = 0;
		temproom->previous = temproom;
		if (d->zedit_zone->rooms) {
			temproom->next = d->zedit_zone->rooms;
			temproom->next->previous = temproom;
		} else {
			temproom->next = NULL;
		}
		d->zedit_zone->rooms = temproom;
		d->zedit_zone->current_room = temproom;
		temproom = NULL;
		d->edit_mode = ZEDIT_ROOM_EDIT;		
		send_to_char(KCLS, ch);
		zedit_disp_room_edit_menu(d);
		break;
	case 'q':
	case 'Q':
		d->zedit_zone->current_mob = d->zedit_zone->mobs;
		d->zedit_zone->current_obj = d->zedit_zone->objs;
		d->zedit_zone->current_room = d->zedit_zone->rooms;
		d->edit_mode = ZEDIT_MAIN_MENU;
		send_to_char(KCLS, ch);
		zedit_disp_menu(d);
		break;
	case 'n':
	case 'N':
		if (d->zedit_zone->reg1 >= 9 && d->zedit_zone->current_room && d->zedit_zone->current_room->next)
			d->zedit_zone->current_room = d->zedit_zone->current_room->next;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		break;
	case 'p':
	case 'P':
		if (d->zedit_zone->current_room)
			d->zedit_zone->current_room = d->zedit_zone->current_room->previous;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		break;
	case 'y':
	case 'Y':
		if (d->zedit_zone->rooms)
			d->zedit_zone->current_room = d->zedit_zone->rooms;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		break;
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		break;		
	}
	break; /* end of ZEDIT_ROOM_MENU */
     case ZEDIT_ROOM_NAME:
	tempi = atoi(arg);
	if (real_room(tempi) == -1) {
		sprintf(outbuf, "%d is not a valid number! Please enter the room's vnum: ", tempi);
		send_to_char(outbuf, ch);
	} else {
		d->zedit_zone->current_room->room_vnum = tempi;
		d->edit_mode= ZEDIT_ROOM_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_room_edit_menu(d);
	}
	break;
     case ZEDIT_ROOM_DIR:
	tempi = atoi(arg);
	if (tempi < 0 || tempi > 5) {
		sprintf(outbuf, "%d is not a valid number! Please enter the door's direction number:\r\n", tempi);
		send_to_char(outbuf, ch);
		send_to_char(" 0) North  1) East  2) South  3) West  4) Up  5) Down  Your choice[0-5]: ", ch);
	} else {
		d->zedit_zone->current_room->door_direction = tempi;
		d->edit_mode= ZEDIT_ROOM_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_room_edit_menu(d);
	}
	break;
     case ZEDIT_ROOM_STATE:
	tempi = atoi(arg);
	if (tempi < 0 || tempi > 2) {
		sprintf(outbuf, "%d is not a valid number! Please enter the door's state:\r\n ", tempi);
		send_to_char(outbuf, ch);
		send_to_char(" 0) Open   1) Closed   2) Closed and Locked   Your choice[0-2]: ", ch);
	} else {
		d->zedit_zone->current_room->door_state = tempi;
		d->edit_mode= ZEDIT_ROOM_EDIT;
		send_to_char(KCLS, ch);
		zedit_disp_room_edit_menu(d);
	}
	break;
     case ZEDIT_ROOM_EDIT:
	switch(*arg) {
	case 'r':
	case 'R':
		send_to_char("Please enter new room's vnum: ", ch);
		d->edit_mode= ZEDIT_ROOM_NAME;
		break;
	case 'd':
	case 'D':
		temproom = d->zedit_zone->current_room;
		if (temproom->previous != temproom) { /* not head of list */
			temproom->previous->next = temproom->next;
			if (temproom->next)
				temproom->next->previous = temproom->previous;
		} else {
			d->zedit_zone->rooms = temproom->next;
			if (temproom->next)
				temproom->next->previous = temproom->next;
		}
		d->zedit_zone->current_room = d->zedit_zone->rooms;
		temproom->next = NULL;
		free_zedit_rooms(temproom, 1);
		temproom = NULL;
		d->zedit_zone->cmds -= 1;
		/* FALLS INTO 'Q'... I'm Lazy */
	case 'q':
	case 'Q':
		d->edit_mode = ZEDIT_ROOM_MENU;
		send_to_char(KCLS, ch);
		d->zedit_zone->reg1 = zedit_disp_room_menu(d);
		break;
	case 's':
	case 'S':
		send_to_char("Please enter new state:\r\n ", ch);
		send_to_char(" 0) Open   1) Closed   2) Closed and Locked   Your choice[0-2]: ", ch);
		d->edit_mode= ZEDIT_ROOM_STATE;
		break;
	case 'c':
	case 'C':
		send_to_char("Please enter new direction: \r\n", ch);
		send_to_char(" 0) North  1) East  2) South  3) West  4) Up  5) Down  Your choice[0-5]: ", ch);
		d->edit_mode = ZEDIT_ROOM_DIR;
		break;		
	case 'z':	/* out of bounds */
	case 'Z':
	default:
		sprintf(outbuf, "%s%s is not a valid choice!\r\nPlease try again.\r\n",
			KCLS, arg);
		send_to_char(outbuf, ch);
		zedit_disp_room_edit_menu(d);
		break;		
	}
        break; /* ROOM_EDIT */
     default:
	d->edit_mode = ZEDIT_MAIN_MENU;	
	zedit_disp_menu(d);
	break;	
     }
}