cm3/
cm3/clans/
cm3/mudprogs/
cm3/player/a/
/* Map generator designed by Dex for the Metaverse Project.
*
* This program builds a 10 by 10 zone depending on the letters
* put in the static map. It assigns sector types, exits to all
* adject rooms in the same zone and gives a brief room name.
* The room description is left empty.
* 
* No credits, trademarks or contacting required, but do you
* suggestions, bugs or need help with this program, contact
* dex@meta.mudservices.com
*
* The origin of this code is meta.mudservices.com
*
* Modified to work as a command on Rogue Winds by Scion 8/19/1999
*/

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <time.h>
#include "mud.h"

int makezone(CHAR_DATA *ch, char note[MAX_STRING_LENGTH])
{
    FILE *fp;
    char buf[100];
    char buf2[100];
    OBJ_DATA *obj;

    static int pos;
    char *main_design;
        int range, min_range, max_range, count;

        /* The map, Each letter sets the room type in the sections
        below */
    char design01[11] = "FFFFFffrff";
    char design02[11] = "FFFFfffrff";
    char design03[11] = "FFFffffrff";
    char design04[11] = "FFFffffrwf";
    char design05[11] = "Ffffffffrf";
    char design06[11] = "fffiifffrr";
    char design07[11] = "fffiiifffr";
    char design08[11] = "fffffffffr";
    char design09[11] = "ffffmmfffr";
    char design10[11] = "fffmmmmffr";

    EXTRA_DESCR_DATA *ed;
    char *map;

    int i=0;
    int a=0;

    bool rooms=FALSE;

    if (IS_NPC(ch)) {
	send_to_char("Hell no, mobs are NOT allowed to build zones!\r\n", ch);
	return FALSE;
    }

    if ((obj=ch->main_hand)!=NULL) {
      for (ed=obj->first_extradesc ; ed; ed=ed->next) {
        if (is_name("_text_", ed->keyword)) {
          rooms=TRUE;          
          map=str_dup(strip_crn(ed->description));
          if (strlen(map) < 100) {
            send_to_char("Your map has less than 100 rooms on it.\r\n", ch);
            return FALSE;
          }
          i=0;
          while (i<10) {
            design01[i]=map[a];
            design01[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design02[i]=map[a];
            design02[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design03[i]=map[a];
            design03[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design04[i]=map[a];
            design04[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design05[i]=map[a];
            design05[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design06[i]=map[a];
            design06[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design07[i]=map[a];
            design07[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design08[i]=map[a];
            design08[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design09[i]=map[a];
            design09[i+1]='\0';
            i++;
            a++;
          }
          i=0;
          while (i<10) {
            design10[i]=map[a];
            design10[i+1]='\0';
            i++;
            a++;
          }
        }
      }
    } else {
      send_to_char("You are not holding a note.\r\n", ch);
      return FALSE;
    }

    if (rooms==FALSE) {
      send_to_char("Could not read the rooms to build.\r\n", ch);
      return FALSE;
    }

    send_to_char("Generating map...\r\n", ch);
    sprintf(buf, "%s\r\n", design01);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design02);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design03);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design04);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design05);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design06);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design07);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design08);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design09);
    send_to_char(buf, ch);
    sprintf(buf, "%s\r\n", design10);
    send_to_char(buf, ch);

    sprintf (buf, "%s's Wilderness", ch->name); /* zone name */
    sprintf (buf2, "../building/%s.are", ch->name); /* file name */
        max_range = ch->pcdata->r_range_lo+100; /* ending vnum +1 (always ends up as one less);*/
        min_range = ch->pcdata->r_range_lo; /* starting vnum */
        pos = 0;

    if ( ( fp = fopen( buf2, "w" ) ) == NULL )
    {
        pos = 0;

        send_to_char("Unable to generate new zone.\r\n",ch);
    }
    else
    {
        fprintf( fp, "#AREA   %s~\n", buf);
	fprintf( fp, "#VERSION 1\n");
	fprintf( fp, "#AUTHOR %s~\n", ch->name);
        fprintf( fp, "#RANGES\n0 116 0 116\n$\n");
	fprintf( fp, "\n#RESETMSG	Void~\n");
	fprintf( fp, "#FLAGS\n0\n\n");
	fprintf( fp, "#ECONOMY 1 1\n\n");
	fprintf( fp, "#CLIMATE 1 2 3 4\n\n");
	fprintf( fp, "#MOBILES\n#0\n\n");
	fprintf( fp, "#OBJECTS\n#0\n\n");
        fprintf( fp, "\n");

        main_design = design01;
        count = 0;
        fprintf( fp, "#ROOMS\n"   );

        for(range = min_range ; range < max_range ; range ++)
        {
          /* counts through all of the static data above, switching
                to a new line at every 10 counts.*/
          switch (count)
          {
          case 10:       main_design = design10; pos = 0; break;
          case 20:       main_design = design09; pos = 0; break;
          case 30:       main_design = design08; pos = 0; break;
          case 40:       main_design = design07; pos = 0; break;
          case 50:       main_design = design06; pos = 0; break;
          case 60:       main_design = design05; pos = 0; break;
          case 70:       main_design = design04; pos = 0; break;
          case 80:       main_design = design03; pos = 0; break;
          case 90:       main_design = design02; pos = 0; break;
          }       

        /* Generates the room data, leaving description blank.
        it assigns sector type, room name and a few related
        flags */
          switch ( main_design[pos] )    
          {

    case 'i':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "a room~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 0\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'c':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "a street~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 1\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'f':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "a field~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 2\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'F':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "the forest~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 3\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'h':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "the hills~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 4\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'm':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "the mountains~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 5\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'r':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "a stream~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 6\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'w':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "deep water~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 7\n");
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'U':
		fprintf( fp, "#%d\n", range);
		fprintf( fp, "underwater~\n");
		fprintf( fp, "~\n");
		fprintf( fp, "0 0 8\n");
		fprintf( fp, "0 0 0 0 0 0\n");
		break;

    case 'a':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "the air~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 9\n"); 
		fprintf( fp, "0 0 0 0 0 0\n");
        break;

    case 'd':
        fprintf( fp, "#%d\n", range);
        fprintf( fp, "the desert~\n");
        fprintf( fp, "~\n");
        fprintf( fp, "0 0 10\n"); 
        fprintf( fp, "0 0 0 0 0 0\n");
		break;

    case 'V':
		fprintf( fp, "#%d\n", range);
		fprintf( fp, "a void~\n");
		fprintf( fp, "~\n");
		fprintf( fp, "0 0 11\n");
		fprintf( fp, "0 0 0 0 0 0\n");
		break;

    case 'o':
		fprintf( fp, "#%d\n", range);
		fprintf( fp, "the ocean floor~\n");
		fprintf( fp, "~\n");
		fprintf( fp, "0 0 12\n");
		fprintf( fp, "0 0 0 0 0 0\n");
		break;

    case 'u':
		fprintf( fp, "#%d\n", range);
		fprintf( fp, "a cave~\n");
		fprintf( fp, "~\n");
		fprintf( fp, "0 0 13\n");
		fprintf( fp, "0 0 0 0 0 0\n");
		break;

    default:
		fprintf( fp, "#%d\n", range);
		fprintf( fp, "Nowhere~\n");
		fprintf( fp, "An incorrect sector type was defined for this room.~\n");
		fprintf( fp, "0 0 1\n");
		fprintf( fp, "0 0 0 0 0 0\n");
		break;
    }

    /* Exit generation.*/
    if (range < max_range - 10) {
		fprintf (fp, "D0\n");
        fprintf (fp, "~\n");
        fprintf (fp, "~\n");
        fprintf (fp, "0 -1 %d\n", range + 10); 
    }

  	  if (pos < 9)
          {
                fprintf (fp, "D1\n");
                fprintf (fp, "~\n");
                fprintf (fp, "~\n");
                fprintf (fp, "0 -1 %d\n", range + 1);
          }

          if (range > min_range + 9)
          {
                fprintf (fp, "D2\n");
                fprintf (fp, "~\n");
                fprintf (fp, "~\n");
                fprintf (fp, "0 -1 %d\n", range - 10); 
          }

          if (pos > 0 )
          {
                fprintf (fp, "D3\n");
                fprintf (fp, "~\n");
                fprintf (fp, "~\n");
                fprintf (fp, "0 -1 %d\n", range - 1); 
          }

          fprintf( fp, "S\n");

          pos ++;
	  count ++;
        }
        fprintf( fp, "#0\n"   );
        fprintf( fp, "#$\n"   );
        fclose( fp );
    }
    return TRUE;
}