/
Archipelago/
Archipelago/doc/
Archipelago/lib/misc/
Archipelago/lib/plrobjs/
Archipelago/lib/plrobjs/P-T/
Archipelago/lib/world/mob/
Archipelago/lib/world/obj/
Archipelago/lib/world/shp/
Archipelago/lib/world/wld/
Archipelago/lib/world/zon/
Archipelago/slave/
/* ************************************************************************
*   File: zoneedit.c                                  Part of Archipelago *
*  Usage: online object editing commands. A Neil - July 1996              *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  Copyright (C) 1994 A Neil                                              *
*  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
************************************************************************ */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "limits.h"
#include "screen.h"
#include "zoneedit.h"

extern int	top_of_zone_table;
extern struct zone_data *zone_table;

void copy_zone(struct zone_data *from, struct zone_data *to);
int save_zone(int zone);
void free_zone(struct zone_data *zone);
void print_zonedata(struct descriptor_data *d);


void zoneedit(struct descriptor_data *d, char *str)
{
  char bufme[MAX_STRING_LENGTH];
  bool ok = FALSE;
  int zn, points, num, ja_flag, max_top;
  for (zn=0;zn <= top_of_zone_table; zn++)
    if( zone_table[zn].number == d->zone_edit->number){
      ok = TRUE;
      break;
    }
  if (ok){
    if (zn == top_of_zone_table)
      max_top = (d->zone_edit->number + 10)*100 -1;
    else
      max_top = (zone_table[zn+1].number)*100 -1;      
    }
  
  switch(d->zedit_mode) {
  case MAIN_MODE:
    for (; isspace(*str); str++)
      ;
    if (!*str){
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      break;
    }
    *str = LOWER(*str);
    if (*str == 'q'){
      if (!ok){
	SEND_TO_Q("Yikes zone entry doesn't exist.\r\nReport this!\r\n",d);
	free_zone(d->zone_edit);
	d->zone_edit = 0;
	d->virtual = 0;
	d->prompt_mode = 1;
	d->iedsc = 0;
	d->ex_i_dir = 0;
	d->ia_flag = 0;
	d->r_dir = 0;
	d->to_room = 0;
	REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
	act("$n returns from creating part of the world.",TRUE, d->character,0,0,TO_ROOM);
	return;
      }
      copy_zone(d->zone_edit, zone_table + zn);
	free_zone(d->zone_edit);
	d->zone_edit = 0;
	d->virtual = 0;
	d->prompt_mode = 1;
	d->iedsc = 0;
	d->ex_i_dir = 0;
	d->ia_flag = 0;
	d->r_dir = 0;
	d->to_room = 0;
	REMOVE_BIT(PLR_FLAGS(d->character), PLR_BUILDING);
	act("$n returns from creating part of the world.",TRUE, d->character,0,0,TO_ROOM);
	return;
    }
    else
      switch (*str){
      case 't':
	d->str = &(d->zone_edit->name);
	free(*d->str);
	*d->str = 0;
	d->max_str = 50;
	SEND_TO_Q("Enter new Zone Title.  No crlf.  End with @@\r\n",d);
	return;
      case 'l':
	sprintf(buf, "Lifespan:%s%d%s.\r\nEnter new lifespan: [10,100]:\r\n",cy,d->zone_edit->lifespan,nrm);
	send_to_char(buf, d->character);
	d->zedit_mode = ZL_EDIT;
	return;
      case 'p':
	sprintf(buf, "Zone Top:%s%d%s.\r\nEnter new Zone Top: [%d,%d]:\r\n",cy,d->zone_edit->top,nrm,d->zone_edit->number*100 +1, max_top);
	send_to_char(buf, d->character);
	d->zedit_mode = ZT_EDIT;
	return;
      case 'r':
	sprintf(buf, "Reset Mode:%s%d%s.\r\nEnter new Zone Top: [0,1,2]:\r\n",cy,d->zone_edit->reset_mode,nrm);
	send_to_char(buf, d->character);
	sprintf(buf, "0 = never, 1 = only when no pcs in zone, 2 = always.\r\n");
	send_to_char(buf, d->character);
	d->zedit_mode = ZR_EDIT;
	return;
      case 'o':
	if (GET_LEVEL(d->character) < LEVEL_ASS_IMPL){
	  send_to_char("You are not holy enough to open zones.\r\n",d->character);
	  return;
	}
	sprintf(buf, "Open: %s%s%s.\r\nToggle?: [y]:\r\n",cy,
		(d->zone_edit->open ? "Yes": "No"),nrm);
	send_to_char(buf, d->character);
	d->zedit_mode = ZO_EDIT;
	return;
      default:
	break;
      }
  case ZL_EDIT:
    for ( ; isspace(*str); str++)
      ;
    if (!*str){
      SEND_TO_Q("Lifespan unchanged\r\n",d);
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
    points = atoi(str);
    if (points < 10 || points > 100) {
      sprintf(buf,"%sIllegal value%s\r\n",rd,nrm);
      SEND_TO_Q(buf,d);
      sprintf(buf,"Lifespan: %s%d%s.\r\nEnter new lifespan: [10,100]:",
	      cy,d->zone_edit->lifespan,nrm);
      send_to_char(buf,d->character);
      return;}
    else {
      d->zone_edit->lifespan = points;
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
  case ZT_EDIT:
    for ( ; isspace(*str); str++)
      ;
    if (!*str){
      SEND_TO_Q("Zone Top unchanged\r\n",d);
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
    points = atoi(str);
    if (points < (d->zone_edit->number*100 + 1) || points > max_top) {
      sprintf(buf,"%sIllegal value%s\r\n",rd,nrm);
      SEND_TO_Q(buf,d);
      sprintf(buf, "Zone Top:%s%d%s.\r\nEnter new Zone Top: [%d,%d]:\r\n",cy,d->zone_edit->top,nrm,d->zone_edit->number*100 +1, max_top);
      send_to_char(buf,d->character);
      return;}
    else {
      d->zone_edit->top = points;
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
  case ZR_EDIT:
    for ( ; isspace(*str); str++)
      ;
    if (!*str){
      SEND_TO_Q("Zone Top unchanged\r\n",d);
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
    points = atoi(str);
    if (points != 0 && points != 1 && points != 2){
      sprintf(buf,"%sIllegal value%s\r\n",rd,nrm);
      SEND_TO_Q(buf,d);
      sprintf(buf, "Reset Mode:%s%d%s.\r\nEnter new Zone Top: [0,1,2]:\r\n",cy,d->zone_edit->reset_mode,nrm);
      send_to_char(buf, d->character);
      sprintf(buf, "0 = never, 1 = only when no pcs in zone, 2 = always.\r\n");
      send_to_char(buf,d->character);
      return;
    }
    else {
      d->zone_edit->reset_mode = points;
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
  case ZO_EDIT:
    for ( ; isspace(*str); str++)
      ;
    if (!*str || *str != 'y'){
      d->zedit_mode = MAIN_MODE;
      print_zonedata(d);
      return;
    }
    if (d->zone_edit->open){
      sprintf(buf,"%sSetting Zone closed%s\r\n",rd,nrm);
      d->zone_edit->open = 0;
    }
    else{
      sprintf(buf,"%sSetting Zone open%s\r\n",rd,nrm);
      d->zone_edit->open = 1;
    }
    d->zedit_mode = MAIN_MODE;
    print_zonedata(d);
    return;
  default:
    break;
      
  } 
}

void print_zonedata(struct descriptor_data *d){
  sprintf(cy,"%s",CCBBLU(d->character,C_NRM));
  sprintf(wh,"%s",CCWHT(d->character,C_NRM));
  sprintf(ma,"%s",CCMAG(d->character,C_NRM));
  sprintf(nrm,"%s",CCNRM(d->character,C_NRM));
  sprintf(gn,"%s",CCGRN(d->character,C_NRM));
  sprintf(yl,"%s",CCYEL(d->character,C_NRM));
  sprintf(rd,"%s",CCRED(d->character,C_NRM));
  sprintf(bgn,"%s",CCBGRN(d->character,C_NRM));
  sprintf(byl,"%s",CCBYEL(d->character,C_NRM));
  sprintf(brd,"%s",CCBRED(d->character,C_NRM));
  sprintf(bwht,"%s",CCBWHT(d->character,C_NRM));  

  sprintf(buf,"%sZone Number: %d%s\r\n",bgn, d->zone_edit->number,nrm);
  send_to_char(buf, d->character);
  sprintf(buf,"%s(T)itle: %s%s%s\r\n",byl,bwht, d->zone_edit->name,nrm);
  send_to_char(buf, d->character);
  sprintf(buf,"%s(L)ifespan: %s%d%s\r\n",byl,bwht, d->zone_edit->lifespan,nrm);
  send_to_char(buf, d->character);
  sprintf(buf,"%s(R)eset: %s%d%s\r\n",byl,bwht, d->zone_edit->reset_mode,nrm);
  send_to_char(buf, d->character);
  sprintf(buf,"%sto(P): %s%d%s\r\n",byl,bwht, d->zone_edit->top,nrm);
  send_to_char(buf, d->character);  
  sprintf(buf,"%s(O)pen: %s%s%s\r\n",byl,bwht, (d->zone_edit->open ? "Yes": "No"),nrm);
  send_to_char(buf, d->character);
}