/* ************************************************************************
* 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);
}