Re: [Circle] Compiling Error In Zedit

From: Alex (fletcher@cspo.queensu.ca)
Date: 08/01/96


From: Demetrius Harris <ldh1@Archive.MsState.Edu>
Subject: Re: [Circle] Compiling Error In Zedit

This is ridiculus there should not be an error, but there is.  If someone 
can help please do.  I have attached my zedit.c file

Once again the errors was 
	zedit.c:706: unterminated character constant

Thanks In Advance

:(
==============================================================================
Content-ID: <Pine.SOL.3.95.960801145309.14862H@cspo.queensu.ca>
Content-Description: 

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*  _TwyliteMud_ by Rv.                          Based on CircleMud3.0bpl9 *
*    				                                          *
*  OasisOLC - zedit.c 		                                          *
*    				                                          *
*  Copyright 1996 Harvey Gilpin.                                          *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "comm.h"
#include "utils.h"
#include "db.h"
#include "olc.h"

/*-------------------------------------------------------------------*/
/*. external data areas .*/
extern struct zone_data *zone_table;	/*. db.c	.*/
extern struct room_data *world;		/*. db.c	.*/
extern int top_of_zone_table;		/*. db.c	.*/
extern struct char_data *mob_proto;	/*. db.c	.*/
extern struct index_data *mob_index;	/*. db.c	.*/
extern struct obj_data *obj_proto;	/*. db.c	.*/
extern struct index_data *obj_index;	/*. db.c	.*/
extern char *equipment_types[];		/*. constants.c	.*/
extern char *dirs[];			/*. constants.c .*/

/*-------------------------------------------------------------------*/
/* function protos */
void zedit_disp_menu(struct descriptor_data * d);
void zedit_setup(struct descriptor_data *d, int room_num);
void add_cmd_to_list(struct reset_com **list,struct reset_com *newcmd,int pos);
void remove_cmd_from_list(struct reset_com **list, int pos);
void delete_command(struct descriptor_data *d, int pos);
int new_command(struct descriptor_data *d, int pos);
int start_change_command(struct descriptor_data *d, int pos);
void zedit_disp_comtype(struct descriptor_data *d);
void zedit_disp_arg1(struct descriptor_data *d);
void zedit_disp_arg2(struct descriptor_data *d);
void zedit_disp_arg3(struct descriptor_data *d);
void zedit_disp_arg4(struct descriptor_data *d);
void zedit_save_internally(struct descriptor_data *d);
void zedit_save_to_disk(struct descriptor_data *d);
void zedit_create_index(int znum, char *type);
void zedit_new_zone(struct char_data *ch, int vzone_num);

/*-------------------------------------------------------------------*/
/*. Nasty internal macros to clean up the code .*/

#define ZCMD zone_table[OLC_ZNUM(d)].cmd[subcmd]
#define MYCMD OLC_ZONE(d)->cmd[subcmd]
#define OLC_CMD(d)   (OLC_ZONE(d)->cmd[OLC_VAL(d)])

/*-------------------------------------------------------------------*\
  utility functions 
\*-------------------------------------------------------------------*/

void zedit_setup(struct  descriptor_data *d, int room_num)
{ struct zone_data *zone;
  int subcmd = 0, count = 0, cmd_room = -1;

  /*. Alloc some zone shaped space .*/
  CREATE(zone, struct zone_data, 1);

  /*. Copy in zone header info .*/
  zone->name = str_dup(zone_table[OLC_ZNUM(d)].name);
  zone->lifespan = zone_table[OLC_ZNUM(d)].lifespan;
  zone->top = zone_table[OLC_ZNUM(d)].top;
  zone->reset_mode = zone_table[OLC_ZNUM(d)].reset_mode;
  /*. The remaining fields are used as a 'has been modified' flag .*/
  zone->number = 0;   	/*. Header info has changed .*/
  zone->age = 0;	/*. Commands have changed   .*/
  
  /*. Start the reset command list with a terminator .*/
  CREATE(zone->cmd, struct reset_com, 1);
  zone->cmd[0].command = 'S';

  /*. Add all entried in zone_table that relate to this room .*/
  while(ZCMD.command != 'S')
  { switch(ZCMD.command)
    { case 'M':
      case 'O':
        cmd_room = ZCMD.arg3;
        break;
      case 'D':
      case 'R':
        cmd_room = ZCMD.arg1;
        break;
      default:
        break;
    }
    if(cmd_room == room_num)
    { add_cmd_to_list(&(zone->cmd), &ZCMD, count);
      count++;
    }
    subcmd++;
  }

  OLC_ZONE(d) = zone;
  /*. Display main menu .*/
  zedit_disp_menu(d);
}


/*-------------------------------------------------------------------*/
/*. Create a new zone .*/

void zedit_new_zone(struct char_data *ch, int vzone_num)
{ FILE *fp;
  struct zone_data *new_table;
  int i, room, found = 0;

  if(vzone_num > 326)
  { send_to_char("326 is the highest zone allowed.\r\n", ch);
    return;
  }
  sprintf(buf, "%s/%i.zon", ZON_PREFIX, vzone_num);

  /*. Check zone does not exist .*/
  room = vzone_num * 100;
  for (i = 0; i <= top_of_zone_table; i++)
    if ((zone_table[i].number * 100 <= room) &&
        (zone_table[i].top >= room))
    { send_to_char("A zone already covers that area.\r\n", ch);
      return;
    }

  /*. Create Zone file .*/
  if(!(fp = fopen(buf, "w"))) {
    mudlog("SYSERR: OLC: Can't write new zone file", BRF, LVL_IMPL, TRUE);
    return;
  }
  fprintf(fp, 
	"#%d\n"
	"New Zone~\n"
	"%d 30 2\n"
	"S\n"
	"$\n", 
	vzone_num,
	(vzone_num * 100) + 999
  );
  fclose(fp);

  /*. Create Rooms file .*/
  sprintf(buf, "%s/%d.wld", WLD_PREFIX, vzone_num);
  if(!(fp = fopen(buf, "w"))) 
  { mudlog("SYSERR: OLC: Can't write new world file", BRF, LVL_IMPL, TRUE);
    return;
  }
  fprintf(fp, 
	"#%d\n"
    	"The Begining~\n"
	"Not much here.\n"
	"~\n"
	"%d 0 0\n"
	"S\n"
	"$\n",
	vzone_num * 100,
 	vzone_num
  );
  fclose(fp);

  /*. Create Mobiles file .*/
  sprintf(buf, "%s/%i.mob", MOB_PREFIX, vzone_num);
  if(!(fp = fopen(buf, "w")))
  { mudlog("SYSERR: OLC: Can't write new mob file", BRF, LVL_IMPL, TRUE);
    return;
  }
  fprintf(fp, "$\n");
  fclose(fp);

  /*. Create Objects file .*/
  sprintf(buf, "%s/%i.obj", OBJ_PREFIX, vzone_num);
  if(!(fp = fopen(buf, "w"))) 
  { mudlog("SYSERR: OLC: Can't write new obj file", BRF, LVL_IMPL, TRUE);
    return;
  }
  fprintf(fp, "$\n");
  fclose(fp);

  /*. Create Shops file .*/
  sprintf(buf, "%s/%i.shp", SHP_PREFIX, vzone_num);
  if(!(fp = fopen(buf, "w")))
  { mudlog("SYSERR: OLC: Can't write new shop file", BRF, LVL_IMPL, TRUE);
    return;
  }
  fprintf(fp, "$~\n");
  fclose(fp);

  /*. Update index files .*/
  zedit_create_index(vzone_num, "zon");
  zedit_create_index(vzone_num, "wld");
  zedit_create_index(vzone_num, "mob");
  zedit_create_index(vzone_num, "obj");
  zedit_create_index(vzone_num, "shp");

  /*. Make a new zone in memory.*/
  CREATE(new_table, struct zone_data, top_of_zone_table);
  new_table[top_of_zone_table + 1].number = 32000;
  for(i = 0; i <= top_of_zone_table + 1; i++)  
    if(!found)
      if (i > top_of_zone_table || zone_table[i].number > vzone_num)
      { found = 1;
        new_table[i].name = str_dup("New Zone");
        new_table[i].number = vzone_num;
        new_table[i].top = (vzone_num * 100) + 999;
        new_table[i].lifespan = 30;
        new_table[i].age = 0;
        new_table[i].reset_mode = 2;
        CREATE(new_table[i].cmd, struct reset_com, 1);
        new_table[i].cmd[0].command = 'S';
        if (i <= top_of_zone_table)
          new_table[i+1] = zone_table[i];
      } else 
        new_table[i] = zone_table[i];
    else
      new_table[i+1] = zone_table[i];
  free(zone_table);
  zone_table = new_table;
  top_of_zone_table++;

  sprintf(buf, "OLC: %s creates new zone #%d", GET_NAME(ch), vzone_num);
  mudlog(buf, BRF, LVL_BUILDER, TRUE);
  send_to_char("Zone created.\r\n", ch);
  return;
}

/*-------------------------------------------------------------------*/

void zedit_create_index(int znum, char *type)
{ FILE *newfile, *oldfile;
  char new_name[32], old_name[32], *prefix;
  int num, found = FALSE;

  switch(*type)
  { case 'z':
      prefix = ZON_PREFIX;
      break;
    case 'w':
      prefix = WLD_PREFIX;
      break;
    case 'o':
      prefix = OBJ_PREFIX;
      break;
    case 'm':
      prefix = MOB_PREFIX;
      break;
    case 's':
      prefix = SHP_PREFIX;
      break;
    default:
      /*. Caller messed up .*/
      return;
  }

  sprintf(old_name, "%s/index", prefix);
  sprintf(new_name, "%s/newindex", prefix);

  if(!(oldfile = fopen(old_name, "r")))
  { sprintf(buf, "SYSERR: OLC: Failed to open %s", buf);
    mudlog(buf, BRF, LVL_IMPL, TRUE);
    return;
  }
  if(!(newfile = fopen(new_name, "w")))
  { sprintf(buf, "SYSERR: OLC: Failed to open %s", buf);
    mudlog(buf, BRF, LVL_IMPL, TRUE);
    return;
  }

  /*. Index contents must be in order: search through the old file for
      the right place, insert the new file, then copy the rest over.
      .*/

  sprintf(buf1, "%d.%s", znum, type);
  while(get_line(oldfile, buf))
  { if (*buf == '$')
    { if (!found)
        fprintf(newfile, "%s\n", buf1);
      fprintf(newfile, "$\n");
      break;
    }
    if (!found)
    { sscanf(buf, "%d", &num);
      if (num > znum)
      { found = TRUE;
        fprintf(newfile, "%s\n", buf1);
      }
    }
    fprintf(newfile, "%s\n", buf);
  }
    
  fclose(newfile);
  fclose(oldfile);
  /*. Out with the old, in with the new .*/
  remove(old_name);
  rename(new_name, old_name);
}

/*-------------------------------------------------------------------*/
/*. Save all the information on the players descriptor back into
    the zone table .*/

void zedit_save_internally(struct descriptor_data *d)
{ int subcmd = 0, cmd_room = -2, room_num;

  room_num = real_room(OLC_NUM(d));

  /*. Zap all entried in zone_table that relate to this room .*/
  while(ZCMD.command != 'S')
  { switch(ZCMD.command)
    { case 'M':
      case 'O':
        cmd_room = ZCMD.arg3;
        break;
      case 'D':
      case 'R':
        cmd_room = ZCMD.arg1;
        break;
      default:
        break;
    }
    if(cmd_room == room_num)
      remove_cmd_from_list(&(zone_table[OLC_ZNUM(d)].cmd), subcmd);
    else
      subcmd++;
  }

  /*. Now add all the entries in the players descriptor list .*/
  subcmd = 0;
  while(MYCMD.command != 'S')
  { add_cmd_to_list(&(zone_table[OLC_ZNUM(d)].cmd), &MYCMD, subcmd);
    subcmd++;
  }

  /*. Finally, if zone headers have been changed, copy over .*/
  if (OLC_ZONE(d)->number)
  { free(zone_table[OLC_ZNUM(d)].name);
    zone_table[OLC_ZNUM(d)].name 	= str_dup(OLC_ZONE(d)->name);
    zone_table[OLC_ZNUM(d)].top 	= OLC_ZONE(d)->top;
    zone_table[OLC_ZNUM(d)].reset_mode 	= OLC_ZONE(d)->reset_mode;
    zone_table[OLC_ZNUM(d)].lifespan 	= OLC_ZONE(d)->lifespan;
  }
  olc_add_to_save_list(zone_table[OLC_ZNUM(d)].number, OLC_SAVE_ZONE);
}


/*-------------------------------------------------------------------*/
/*. Save all the zone_table for this zone to disk.  Yes, this could
    automatically comment what it saves out, but why bother when you
    have an OLC as cool as this ? :> .*/

void zedit_save_to_disk(struct descriptor_data *d)
{ int subcmd, arg1 = -1, arg2 = -1, arg3 = -1, arg4 = -1;
  char fname[64];
  FILE *zfile;

  sprintf(fname, "%s/%i.zon", ZON_PREFIX, 
           zone_table[OLC_ZNUM(d)].number);

  if(!(zfile = fopen(fname, "w"))) {
    sprintf(buf, "SYSERR: OLC: zedit_save_to_disk:  Can't write zone %d.", 
            zone_table[OLC_ZNUM(d)].number);
    mudlog(buf, BRF, LVL_BUILDER, TRUE);
    return;
  }

  /*. Print zone header to file .*/
  sprintf(buf, 
	"#%d\n"
  	"%s~\n"
  	"%d %d %d\n",
	zone_table[OLC_ZNUM(d)].number,
	zone_table[OLC_ZNUM(d)].name ? zone_table[OLC_ZNUM(d)].name : "undefined",
 	zone_table[OLC_ZNUM(d)].top,
    	zone_table[OLC_ZNUM(d)].lifespan, 
        zone_table[OLC_ZNUM(d)].reset_mode
  );
  fprintf(zfile, buf);

  for(subcmd = 0; ZCMD.command != 'S'; subcmd++) {
    switch (ZCMD.command) {
      case 'M':
	arg1 = mob_index[ZCMD.arg1].virtual;
	arg2 = ZCMD.arg2;
	arg3 = world[ZCMD.arg3].number;
        arg4 = ZCMD.arg4;
	break;
      case 'O':
	arg1 = obj_index[ZCMD.arg1].virtual;
	arg2 = ZCMD.arg2;
	arg3 = world[ZCMD.arg3].number;
        arg4 = ZCMD.arg4;
	break;
      case 'G':
 	arg1 = obj_index[ZCMD.arg1].virtual;
	arg2 = ZCMD.arg2;
	arg3 = -1;
	break;
      case 'E':
	arg1 = obj_index[ZCMD.arg1].virtual;
	arg2 = ZCMD.arg2;
	arg3 = ZCMD.arg3;
        arg4 = ZCMD.arg4;
	break;
      case 'P':
	arg1 = obj_index[ZCMD.arg1].virtual;
	arg2 = ZCMD.arg2;
	arg3 = obj_index[ZCMD.arg3].virtual;
        arg4 = ZCMD.arg4;
	break;
      case 'D':
	arg1 = world[ZCMD.arg1].number;
	arg2 = ZCMD.arg2;
	arg3 = ZCMD.arg3;
	break;
      case 'R':
	arg1 = world[ZCMD.arg1].number;
	arg2 = obj_index[ZCMD.arg2].virtual;
	arg3 = -1;
	break;
      case '*':
        /*. Invalid commands are replaced with '*' - Ignore them .*/
        continue;
      default:
        sprintf(buf, "SYSERR: OLC: z_save_to_disk(): Unknown cmd '%c' - NOT saving", ZCMD.command);
        mudlog(buf, BRF, LVL_BUILDER, TRUE);
        continue;
    }
    fprintf(zfile, "%c %d %d %d %d %d\n",
	ZCMD.command, ZCMD.if_flag, arg1, arg2, arg3, arg4);
  }
  fprintf(zfile, "S\n$\n");
  fclose(zfile);
  olc_remove_from_save_list(zone_table[OLC_ZNUM(d)].number, OLC_SAVE_ZONE);
}

/*-------------------------------------------------------------------*/
/*. Adds a new reset command into a list.  Takes a pointer to the list
    so that it may play with the memory locations.*/

void add_cmd_to_list(struct reset_com **list, struct reset_com *newcmd, int pos)
{  int count = 0, i, l;
   struct reset_com *newlist;

   /*. Count number of commands (not including terminator) .*/
   while((*list)[count].command != 'S')
     count++;
   
   CREATE(newlist, struct reset_com, count + 2);

   /*. Tight loop to copy old list and insert new command .*/
   l = 0;
   for(i=0;i<=count;i++)
     if(i==pos)
       newlist[i] = *newcmd; 
     else
       newlist[i] = (*list)[l++];
   
   /*. Add terminator then insert new list .*/
   newlist[count+1].command = 'S';
   free(*list);
   *list = newlist;
}

/*-------------------------------------------------------------------*/
/*. Remove a reset command from a list.  Takes a pointer to the list
    so that it may play with the memory locations.*/

void remove_cmd_from_list(struct reset_com **list, int pos)
{  int count = 0, i, l;
   struct reset_com *newlist;

   /*. Count number of commands (not including terminator) .*/
   while((*list)[count].command != 'S')
     count++;
    
   CREATE(newlist, struct reset_com, count);

   /*. Tight loop to copy old list and skip unwanted command .*/
   l = 0;
   for(i=0;i<count;i++)
     if(i==pos)
       continue;
     else
       newlist[l++] = (*list)[i];
   
   /*. Add terminator then insert new list .*/
   newlist[count-1].command = 'S';
   free(*list);
   *list = newlist;
}

/*-------------------------------------------------------------------*/
/*. Error check user input and then add new (blank) command .*/

int new_command(struct descriptor_data *d, int pos)
{  int subcmd = 0;
   struct reset_com *new_com;

   /*. Error check to ensure users hasn't given too large an index .*/
   while(MYCMD.command != 'S')
     subcmd++;
  
   if ((pos > subcmd) || (pos < 0))
     return 0;
    
   /*. Ok, let's add a new (blank) command.*/
   CREATE(new_com, struct reset_com, 1);
   new_com->command = 'N'; 
   add_cmd_to_list(&OLC_ZONE(d)->cmd, new_com, pos);
   return 1;
}


/*-------------------------------------------------------------------*/
/*. Error check user input and then remove command .*/

void delete_command(struct descriptor_data *d, int pos)
{  int subcmd = 0;

   /*. Error check to ensure users hasn't given too large an index .*/
   while(MYCMD.command != 'S')
     subcmd++;
  
   if ((pos >= subcmd) || (pos < 0))
     return;
    
   /*. Ok, let's zap it .*/
   remove_cmd_from_list(&OLC_ZONE(d)->cmd, pos);
}

/*-------------------------------------------------------------------*/
/*. Error check user input and then setup change .*/

int start_change_command(struct descriptor_data *d, int pos)
{  int subcmd = 0;

   /*. Error check to ensure users hasn't given too large an index .*/
   while(MYCMD.command != 'S')
     subcmd++;
  
   if ((pos >= subcmd) || (pos < 0))
     return 0;
    
   /*. Ok, let's get editing .*/
   OLC_VAL(d) = pos;
   return 1;
}

/**************************************************************************
 Menu functions 
 **************************************************************************/

/* the main menu */
void zedit_disp_menu(struct descriptor_data * d)
{ int subcmd = 0, room, counter = 0;

  get_char_cols(d->character);
  room = real_room(OLC_NUM(d));

  /*. Menu header .*/
  sprintf(buf,
  	""
	"Room number: %s%d%s		Room zone: %s%d\r\n"
        "%sZ%s) Zone name   : %s%s\r\n"
        "%sL%s) Lifespan    : %s%d minutes\r\n"
        "%sT%s) Top of zone : %s%d\r\n"
        "%sR%s) Reset Mode  : %s%s%s\r\n"
        "%sP
        "[Command list]\r\n",

	cyn, OLC_NUM(d), nrm,
	cyn, zone_table[OLC_ZNUM(d)].number,
        grn, nrm, yel, OLC_ZONE(d)->name ? OLC_ZONE(d)->name : "<NONE!>",
        grn, nrm, yel, OLC_ZONE(d)->lifespan,
        grn, nrm, yel, OLC_ZONE(d)->top,
        grn, nrm, yel, OLC_ZONE(d)->reset_mode ? 
          ((OLC_ZONE(d)->reset_mode == 1) ?
          "Reset when no players are in zone." : 
          "Normal reset.") :
          "Never reset", nrm
  );

  /*. Print the commands for this room into display buffer .*/
  while(MYCMD.command != 'S')
  { /*. Translate what the command means .*/
    switch(MYCMD.command)
    { case'M':
        sprintf(buf2, "%sLoad %s [%s%d%s], Max : %d, PopRate : %d",
                MYCMD.if_flag ? " then " : "",
		mob_proto[MYCMD.arg1].player.short_descr,
                cyn, mob_index[MYCMD.arg1].virtual, yel,
		MYCMD.arg2, MYCMD.arg4
        );
        break;
      case'G':
        sprintf(buf2, "%sGive it %s [%s%d%s], Max : %d",
		MYCMD.if_flag ? " then " : "",
		obj_proto[MYCMD.arg1].short_description,
                cyn, obj_index[MYCMD.arg1].virtual, yel,
		MYCMD.arg2
        );
        break;
      case'O':
        sprintf(buf2, "%sLoad %s [%s%d%s], Max : %d, PopRate : %d",
		MYCMD.if_flag ? " then " : "",
		obj_proto[MYCMD.arg1].short_description,
                cyn, obj_index[MYCMD.arg1].virtual, yel,
		MYCMD.arg2, MYCMD.arg4
        );
        break;
      case'E':
        sprintf(buf2, "%sEquip with %s [%s%d%s], %s, Max : %d, PopRate : %d",
		MYCMD.if_flag ? " then " : "",
		obj_proto[MYCMD.arg1].short_description,
                cyn, obj_index[MYCMD.arg1].virtual, yel,
		equipment_types[MYCMD.arg3],
		MYCMD.arg2, MYCMD.arg4
        );
        break;
      case'P':
        sprintf(buf2,"%sPut %s [%s%d%s] in %s [%s%d%s], Max : %d, PopRate :
%d",
		MYCMD.if_flag ? " then " : "",
		obj_proto[MYCMD.arg1].short_description,
                cyn, obj_index[MYCMD.arg1].virtual, yel,
		obj_proto[MYCMD.arg3].short_description,
                cyn, obj_index[MYCMD.arg3].virtual, yel,
		MYCMD.arg2, MYCMD.arg4
        );
        break;
      case'R':
        sprintf(buf2, "%sRemove %s [%s%d%s] from room.",
		MYCMD.if_flag ? " then " : "",
		obj_proto[MYCMD.arg2].short_description,
                cyn, obj_index[MYCMD.arg2].virtual, yel
        );
        break;
      case'D':
        sprintf(buf2, "%sSet door %s as %s.",
		MYCMD.if_flag ? " then " : "",
		dirs[MYCMD.arg2],
		MYCMD.arg3 ? ((MYCMD.arg3 == 1) ? 
                  "closed" : "locked") : "open"
        );
        break;
      default:
        strcpy(buf2, "<Unknown Command>");
        break;
    }
    /*. Build the display buffer for this command .*/
    sprintf(buf1, "%s%d - %s%s\r\n",
        nrm, counter++, yel,
        buf2
    );
    strcat(buf, buf1);
    subcmd++;
  }
  /*. Finish off menu .*/
  sprintf(buf1, 
		"%s%d - <END OF LIST>\r\n"
		"%sN%s) New command.\r\n"
		"%sE%s) Edit a command.\r\n"
		"%sD%s) Delete a command.\r\n"
		"%sQ%s) Quit\r\nEnter your choice : ",
		nrm, counter,
                grn, nrm, grn, nrm, grn, nrm, grn, nrm
  );

  strcat(buf, buf1);
  send_to_char(buf, d->character);

  OLC_MODE(d) = ZEDIT_MAIN_MENU;
}


/*-------------------------------------------------------------------*/
/*. Print the command type menu and setup response catch. */

void zedit_disp_comtype(struct descriptor_data *d)
{ get_char_cols(d->character);
  sprintf(buf, ""
    "%sM%s) Load Mobile to room             %sO%s) Load Object to room\r\n"
    "%sE%s) Equip mobile with object        %sG%s) Give an object to a mobile\r\n"
    "%sP%s) Put object in another object    %sD%s) Open/Close/Lock a Door\r\n"
    "%sR%s) Remove an object from the room\r\n"
    "What sort of command will this be? : ",
    grn, nrm, grn, nrm, grn, nrm, grn, nrm, grn, nrm,
    grn, nrm, grn, nrm 
  );
  send_to_char(buf, d->character);
  OLC_MODE(d)=ZEDIT_COMMAND_TYPE;
}


/*-------------------------------------------------------------------*/
/*. Print the appropriate message for the command type for arg1 and set
    up the input catch clause .*/


void zedit_disp_arg1(struct descriptor_data *d)
{
  switch(OLC_CMD(d).command)
  { case 'M':
      send_to_char("Input mob\'s vnum : ", d->character); 
      OLC_MODE(d) = ZEDIT_ARG1;
      break; 
    case 'O':
    case 'E':
    case 'P':
    case 'G':
      send_to_char("Input object vnum : ", d->character);
      OLC_MODE(d) = ZEDIT_ARG1;
      break;
    case 'D':
    case 'R':
      /*. Arg1 for these is the room number, skip to arg2 .*/
      OLC_CMD(d).arg1 = real_room(OLC_NUM(d));
      zedit_disp_arg2(d);
      break;
    default:
      /*. We should never get here .*/
      cleanup_olc(d, CLEANUP_ALL);
      mudlog("SYSERR: OLC: zedit_disp_arg1(): Help!", BRF, LVL_BUILDER, TRUE);
      return;
  }
}


/*-------------------------------------------------------------------*/
/*. Print the appropriate message for the command type for arg2 and set
    up the input catch clause .*/

void zedit_disp_arg2(struct descriptor_data *d)
{ int i = 0;
  switch(OLC_CMD(d).command)
  { case 'M':
    case 'O':
    case 'E':
    case 'P':
    case 'G':
      send_to_char("Input the maximum number that can exist on the mud : ", d->character);
      break;
    case 'D':
      while(*dirs[i] != '\n')
      { sprintf(buf, "%d) Exit %s.\r\n", i, dirs[i]);
        send_to_char(buf, d->character);
        i++;
      }
      send_to_char("Enter exit number for door : ", d->character);
      break;
    case 'R':
      send_to_char("Input object\'s vnum : ", d->character);
      break;
    default:
      /*. We should never get here .*/
      cleanup_olc(d, CLEANUP_ALL);
      mudlog("SYSERR: OLC: zedit_disp_arg2(): Help!", BRF, LVL_BUILDER, TRUE);
      return;
  }
  OLC_MODE(d) = ZEDIT_ARG2;
}


/*-------------------------------------------------------------------*/
/*. Print the appropriate message for the command type for arg3 and set
    up the input catch clause .*/

void zedit_disp_arg3(struct descriptor_data *d)
{ int i = 0;
  switch(OLC_CMD(d).command)
  { 
    case 'E':
      while(*equipment_types[i] !=  '\n')
      { sprintf(buf, "%2d) %26.26s %2d) %26.26s\r\n", i, 
         equipment_types[i], i+1, (*equipment_types[i+1] != '\n') ?
         equipment_types[i+1] : "");
        send_to_char(buf, d->character);
        if(*equipment_types[i+1] != '\n')
          i+=2;
        else
          break;
      }
      send_to_char("Input location to equip : ", d->character);
      break;
    case 'P':
      send_to_char("Input the vnum of the container : ", d->character);
      break;
    case 'D':
      send_to_char("0)  Door open\r\n"
                   "1)  Door closed\r\n"
                   "2)  Door locked\r\n" 
                   "Enter state of the door : ", d->character);
      break;
    case 'M':
    case 'O':
    case 'R':
    case 'G':
    default:
      /*. We should never get here .*/
      cleanup_olc(d, CLEANUP_ALL);
      mudlog("SYSERR: OLC: zedit_disp_arg3(): Help!", BRF, LVL_BUILDER, TRUE);
      return;
  }
  OLC_MODE(d) = ZEDIT_ARG3;
}

    
/*-------------------------------------------------------------------*/
/*. Print the appropriate message for the command type for arg4 and set
    up the input catch clause .*/

void zedit_disp_arg4(struct descriptor_data *d)
{ int i = 0;
  switch(OLC_CMD(d).command)
  { case 'M':
    case 'O':
    case 'E':
    case 'P':
      send_to_char("Input the item\'s repoping rate : ", d->character);
      break;
    case 'D':
    case 'G':
    case 'R':
    default:
      /*. We should never get here .*/
      cleanup_olc(d, CLEANUP_ALL);
      mudlog("SYSERR: OLC: zedit_disp_arg4(): Help!", BRF, LVL_BUILDER, TRUE);
      return;
  }
  OLC_MODE(d) = ZEDIT_ARG4;
}


    
/**************************************************************************
  The GARGANTAUN event handler
 **************************************************************************/

void zedit_parse(struct descriptor_data * d, char *arg)
{ int pos, i = 0;

  switch (OLC_MODE(d)) 
  {
/*-------------------------------------------------------------------*/
  case ZEDIT_CONFIRM_SAVESTRING:
    switch (*arg) {
    case 'y':
    case 'Y':
      /*. Save the zone in memory .*/
      send_to_char("Saving zone info in memory.\r\n", d->character);
      zedit_save_internally(d);
      sprintf(buf, "OLC: %s edits zone info for room %d", GET_NAME(d->character),
              OLC_NUM(d));	      
      mudlog(buf, CMP, LVL_BUILDER, TRUE);
      cleanup_olc(d, CLEANUP_ALL);
      break;
    case 'n':
    case 'N':
      cleanup_olc(d, CLEANUP_ALL);
      break;
    default:
      send_to_char("Invalid choice!\r\n", d->character);
      send_to_char("Do you wish to save the zone info? : ", d->character);
      break;
    }
    break; /* end of ZEDIT_CONFIRM_SAVESTRING */

/*-------------------------------------------------------------------*/
  case ZEDIT_MAIN_MENU:
    switch (*arg) 
    { case 'q':
      case 'Q':
        if(OLC_ZONE(d)->age || OLC_ZONE(d)->number)
        { send_to_char("Do you wish to save the changes to the zone info? (y/n) : ", d->character);
          OLC_MODE(d) = ZEDIT_CONFIRM_SAVESTRING;
        } else
        { send_to_char("No changes made.\r\n", d->character);
          cleanup_olc(d, CLEANUP_ALL);
        }
        break;
      case 'n':
      case 'N':
        /*. New entry .*/
        send_to_char("What number in the list should the new command be? : ", d->character);
        OLC_MODE(d) = ZEDIT_NEW_ENTRY;
        break;
      case 'e':
      case 'E':
        /*. Change an entry .*/
        send_to_char("Which command do you wish to change? : ", d->character);
        OLC_MODE(d) = ZEDIT_CHANGE_ENTRY;
        break;
      case 'd':
      case 'D':
        /*. Delete an entry .*/
        send_to_char("Which command do you wish to delete? : ", d->character);
        OLC_MODE(d) = ZEDIT_DELETE_ENTRY;
        break;
      case 'z':
      case 'Z':
        /*. Edit zone name .*/
        send_to_char("Enter new zone name : ", d->character);
        OLC_MODE(d) = ZEDIT_ZONE_NAME;
        break;
      case 't':
      case 'T':
        /*. Edit zone top .*/
        if(GET_LEVEL(d->character) < LVL_IMPL)
          zedit_disp_menu(d);
        else
        { send_to_char("Enter new top of zone : ", d->character);
          OLC_MODE(d) = ZEDIT_ZONE_TOP;
        }
        break;
      case 'l':
      case 'L':
        /*. Edit zone lifespan .*/
        send_to_char("Enter new zone lifespan : ", d->character);
        OLC_MODE(d) = ZEDIT_ZONE_LIFE;
        break;
      case 'r':
      case 'R':
        /*. Edit zone reset mode .*/
        send_to_char("\r\n"
                     "0) Never reset\r\n"
                     "1) Reset only when no players in zone\r\n"
                     "2) Normal reset\r\n"
                     "Enter new zone reset type : ", d->character);
        OLC_MODE(d) = ZEDIT_ZONE_RESET;
        break;
      default:
        zedit_disp_menu(d);
        break;
    }
    break; /*. End ZEDIT_MAIN_MENU .*/

/*-------------------------------------------------------------------*/
  case ZEDIT_NEW_ENTRY:
    /*. Get the line number and insert the new line .*/
    pos = atoi(arg);
    if (isdigit(*arg) && new_command(d, pos))
    {  if (start_change_command(d, pos))
       { zedit_disp_comtype(d);
         OLC_ZONE(d)->age = 1;
       }
    } else
      zedit_disp_menu(d);
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_DELETE_ENTRY:
    /*. Get the line number and delete the line .*/
    pos = atoi(arg);
    if(isdigit(*arg))
    { delete_command(d, pos);
      OLC_ZONE(d)->age = 1;
    }
    zedit_disp_menu(d);
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_CHANGE_ENTRY:
    /*. Parse the input for which line to edit, and goto next quiz .*/
    pos = atoi(arg);
    if(isdigit(*arg) && start_change_command(d, pos))
    { zedit_disp_comtype(d);
      OLC_ZONE(d)->age = 1;
    } else
      zedit_disp_menu(d);
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_COMMAND_TYPE:
    /*. Parse the input for which type of command this is, 
        and goto next quiz .*/
    OLC_CMD(d).command = toupper(*arg);
    if (!OLC_CMD(d).command || (strchr("MOPEDGR", OLC_CMD(d).command) == NULL))
    { send_to_char("Invalid choice, try again : ", d->character);
    } else
    { if (OLC_VAL(d))
      { /*. If there was a previous command .*/
        send_to_char("Is this command dependent on the success of the previous one? (y/n)\r\n", d->character);
        OLC_MODE(d) = ZEDIT_IF_FLAG;
      } else
      { /*. 'if-flag' not appropriate .*/
        OLC_CMD(d).if_flag = 0;
        zedit_disp_arg1(d);
      }
    }
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_IF_FLAG:
    /*. Parse the input for the if flag, and goto next quiz .*/
    switch(*arg)
    { case 'y':
      case 'Y':
        OLC_CMD(d).if_flag = 1;
        break;
      case 'n':
      case 'N':
        OLC_CMD(d).if_flag = 0;
        break;
      default:
        send_to_char("Try again : ", d->character);
        return;
    }
    zedit_disp_arg1(d);
    break;


/*-------------------------------------------------------------------*/
  case ZEDIT_ARG1:
    /*. Parse the input for arg1, and goto next quiz .*/
    if  (!isdigit(*arg))
    { send_to_char("Must be a numeric value, try again : ", d->character);
      return;
    }
    switch(OLC_CMD(d).command)
    { case 'M':
        pos = real_mobile(atoi(arg));
        if (pos >= 0)
        { OLC_CMD(d).arg1 = pos;
          zedit_disp_arg2(d);
        } else
          send_to_char("That mobile does not exist, try again : ", d->character);
        break;
      case 'O':
      case 'P':
      case 'E':
      case 'G':
        pos = real_object(atoi(arg));
        if (pos >= 0)
        { OLC_CMD(d).arg1 = pos;
          zedit_disp_arg2(d);
        } else
          send_to_char("That object does not exist, try again : ", d->character);
        break;
      case 'D':
      case 'R':
      default:
        /*. We should never get here .*/
        cleanup_olc(d, CLEANUP_ALL);
        mudlog("SYSERR: OLC: zedit_parse(): case ARG1: Ack!", BRF, LVL_BUILDER, TRUE);
        break;
    }
    break;


/*-------------------------------------------------------------------*/
  case ZEDIT_ARG2:
    /*. Parse the input for arg2, and goto next quiz .*/
    if  (!isdigit(*arg))
    { send_to_char("Must be a numeric value, try again : ", d->character);
      return;
    }
    switch(OLC_CMD(d).command)
    { case 'M':
      case 'O':
        OLC_CMD(d).arg2 = atoi(arg);
        OLC_CMD(d).arg3 = real_room(OLC_NUM(d));
        zedit_disp_arg4(d);
        break;
      case 'G':
        OLC_CMD(d).arg2 = atoi(arg);
        zedit_disp_menu(d);
        break; 
      case 'P':
      case 'E':
        OLC_CMD(d).arg2 = atoi(arg);
        zedit_disp_arg3(d);
        break;
      case 'D':
        pos = atoi(arg);
        /*. Count dirs .*/
        while(*dirs[i] != '\n')
          i++;
        if ((pos < 0) || (pos > i))
          send_to_char("Try again : ", d->character);
        else
        { OLC_CMD(d).arg2 = pos;
          zedit_disp_arg3(d);
        }
        break;
      case 'R':
        pos = real_object(atoi(arg));
        if (pos >= 0)
        { OLC_CMD(d).arg2 = pos;
          zedit_disp_menu(d);
        } else
          send_to_char("That object does not exist, try again : ", d->character);
        break;
      default:
        /*. We should never get here .*/
        cleanup_olc(d, CLEANUP_ALL);
        mudlog("SYSERR: OLC: zedit_parse(): case ARG2: Ack!", BRF, LVL_BUILDER, TRUE);
        break;
    }
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_ARG3:
    /*. Parse the input for arg3, and go back to main menu.*/
    if  (!isdigit(*arg))
    { send_to_char("Must be a numeric value, try again : ", d->character);
      return;
    }
    switch(OLC_CMD(d).command)
    { case 'E':
        pos = atoi(arg);
        /*. Count number of wear positions (could use NUM_WEARS,
            this is more reliable) .*/
        while(*equipment_types[i] != '\n')
          i++;
        if ((pos < 0) || (pos > i))
          send_to_char("Try again : ", d->character);
        else
        { OLC_CMD(d).arg3 = pos;
          zedit_disp_arg4(d);
        }
        break;
      case 'P':
        pos = real_object(atoi(arg));
        if (pos >= 0)
        { OLC_CMD(d).arg3 = pos;
          zedit_disp_arg4(d);
        } else
          send_to_char("That object does not exist, try again : ", d->character);
        break;
      case 'D':
        pos = atoi(arg);
        if ((pos < 0) || (pos > 2))
          send_to_char("Try again : ", d->character);
        else
        { OLC_CMD(d).arg3 = pos;
          zedit_disp_menu(d);
        }
        break;
      case 'M':
      case 'O':
      case 'G':
      case 'R':
      default:
        /*. We should never get here .*/
        cleanup_olc(d, CLEANUP_ALL);
        mudlog("SYSERR: OLC: zedit_parse(): case ARG3: Ack!", BRF, LVL_BUILDER, TRUE);
        break;
    }
    break;
  

/*-------------------------------------------------------------------*/
  case ZEDIT_ARG4:
    /*. Parse the input for arg4, and goto next quiz .*/
    if  (!isdigit(*arg))
    { send_to_char("Must be a numeric value, try again : ", d->character);
      return;
    }
    switch(OLC_CMD(d).command)
    { case 'M':
      case 'O':
      case 'P':
      case 'E':
        pos = atoi(arg);
        if ((pos < 0) || (pos > 100))
          send_to_char("Try again (0 To 100) : ", d->character);
        else
        { OLC_CMD(d).arg4 = pos;
          zedit_disp_menu(d);
        }
        break;
      case 'D':
      case 'G':
      case 'R':
      default:
        /*. We should never get here .*/
        cleanup_olc(d, CLEANUP_ALL);
        mudlog("SYSERR: OLC: zedit_parse(): case ARG4: Ack!", BRF, LVL_BUILDER, TRUE);
        break;
    }
    break;


/*-------------------------------------------------------------------*/
  case ZEDIT_ZONE_NAME:
    /*. Add new name and return to main menu .*/
    free(OLC_ZONE(d)->name);
    OLC_ZONE(d)->name = str_dup(arg);
    OLC_ZONE(d)->number = 1;
    zedit_disp_menu(d);
    break;

/*-------------------------------------------------------------------*/
  case ZEDIT_ZONE_RESET:
    /*. Parse and add new reset_mode and return to main menu .*/
    pos = atoi(arg);
    if (!isdigit(*arg) || (pos <  0) || (pos > 2))
      send_to_char("Try again (0-2) : ", d->character);
    else
    { OLC_ZONE(d)->reset_mode = pos;
      OLC_ZONE(d)->number = 1;
      zedit_disp_menu(d);
    }
    break; 

/*-------------------------------------------------------------------*/
  case ZEDIT_ZONE_LIFE:
    /*. Parse and add new lifespan and return to main menu .*/
    pos = atoi(arg);
    if (!isdigit(*arg) || (pos <  0) || (pos > 240))
      send_to_char("Try again (0-240) : ", d->character);
    else
    { OLC_ZONE(d)->lifespan = pos;
      OLC_ZONE(d)->number = 1;
      zedit_disp_menu(d);
    }
    break; 

/*-------------------------------------------------------------------*/
  case ZEDIT_ZONE_TOP:
    /*. Parse and add new top room in zone and return to main menu .*/
    if (OLC_ZNUM(d) == top_of_zone_table)
      OLC_ZONE(d)->top = MAX(OLC_ZNUM(d) * 100, MIN(32000, atoi(arg)));
    else
      OLC_ZONE(d)->top = MAX(OLC_ZNUM(d) * 100, MIN(zone_table[OLC_ZNUM(d) +1].number * 100, atoi(arg)));
    zedit_disp_menu(d);
    break; 

/*-------------------------------------------------------------------*/
  default:
    /*. We should never get here .*/
    cleanup_olc(d, CLEANUP_ALL);
    mudlog("SYSERR: OLC: zedit_parse(): Reached default case!",BRF,LVL_BUILDER,TRUE);
    break;
  }
}
/*. End of parse_zedit() .*/



This archive was generated by hypermail 2b30 : 12/07/00 PST