Re: Want this to stop? [long] [code attached]

From: Desmond Daignault (tekdd@dtol.datatimes.com)
Date: 02/06/97


On Thu, 6 Feb 1997, Alex wrote:

:by this individual who sent over 2000 messages last night attempting to
:put them all on the CircleMUD mailing list to bomb all of your mailboxes.
:
:I'm forwarding this as a warning for you, so that you can be prepared for
:whatever happens.
:

*stupid message snipped*

It was my belief that this was a mailing list for
informational/educational purposes only. It is messages like this (and the
other meaningless flames) that degrade the list from it's initial purpose.
My only suggestion is that if you feel that you _must_ flame a person for
asking what you consider a stupid question, (although the only stupid
question is the _UNASKED_ question), then when you do a reply cut out the
line that cc's the mail to the list. I don't need to see yer wimpering and
whining.

Now, so that this isn't a completely waisted post.

Here is some code to implement random mazes.

mods needed for db.c
---> in the function declaration section add
     int boot_mazes(void);
---> after the index_boot(DB_BOOT_WLD); add
     log("Generating random mazes.");
     boot_mazes();
---> in db.h add
     #define MAZE_PREFIX "world/maz"  /* maze definitions */
---> add to Makefile maze.o to the OBJFILES section.
---> add to Makefile
     for act.wizard.o add maze.h to the dependancy list
     also add
     maze.o: maze.c structs.h db.h utils.h maze.h
     	$(CC) -c $(CFLAGS) maze.c
---> in act.wizard.c add
     void reboot_maze (maze *m, int zone);
     void print_maze (maze *m, int zone);

ACMD(do_bootmaze) {
  char log_file[80];
  char index_file[80];
  maze m;
  FILE* f;
  FILE* index;
  int found=0;
  int zone_num=0;

  one_argument(argument, arg);

  if (!*arg) {
    send_to_char ("You must specify a zone number!\r\n", ch);
    return;
  }

  zone_num = atoi(arg);

  sprintf (log_file, "%s/%s.maz", MAZE_PREFIX, arg);
  sprintf (index_file, "%s/%s", MAZE_PREFIX, INDEX_FILE);
  index=fopen(index_file, "r");
  if (index == NULL) {
    sprintf (buf, "Could not open %s.\r\n", index_file);
    send_to_char(buf, ch);
    return;
  }

  fgets(buf, 80, index);
  while (!feof(index)) {
    buf[strlen(buf)-1] = '\0';
    if (strcmp (buf, log_file + strlen(MAZE_PREFIX) +1) == 0)
      found = 1;
    fgets(buf, 80, index);
  }

  fclose(index);
  if (!found) {
    sprintf (buf, "Sorry, but zone %s is not a maze.\r\n", arg);
    send_to_char(buf, ch);
    return;
  }

  f=fopen(log_file, "w");
  if (f == NULL) {
    sprintf (buf, "Could not open %s.\r\n", log_file);
    send_to_char(buf, ch);
    return;
  }

  sprintf (buf, "%s has rebuilt maze #%s.", GET_NAME(ch), arg);
  mudlog(buf, 'G', COM_QUEST, TRUE);

  create_maze(&m);
  print_maze(&m, f);
  reboot_maze(&m, zone_num);
  send_to_char ("Done!\r\n", ch);
  fclose(f);
}

--> here is maze.c
/*
 *
 * Modified for CircleMud: Desmond Daignault
 * Algorithm taken from: xlockmore maze.c
 * Original author: David Bagley - bagleyd@megahertz.njit.edu
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include "structs.h"
#include "db.h"
#include "utils.h"
#include "maze.h"


void create_rooms (maze* m, char log_filename[80]);
void create_maze (maze* m);
void print_maze (maze* m, FILE* f);
int choose_exit (maze* m);
int place_wall (maze* m);
int backup (maze* m);
int boot_mazes ();
void reboot_maze (maze* m, int zone_num);


void reboot_maze (maze* m, int zone_num) {
  int room_nr=0;
  int zone_number=0;
  int i=0;
  int x=0;
  int y=0;
  extern struct room_data* world;
  extern int top_of_world;
  extern struct zone_data* zone_table;
  extern int top_of_zone_table;
  int start_room = 0;

  for (i=0;i<=top_of_zone_table;i++)
    if (zone_table[i].number == zone_num)
      zone_number = i;

  for (room_nr=0;room_nr<=top_of_world;room_nr++)
    if (world[room_nr].zone == zone_number)
      break;

  start_room = room_nr;

  for (i=0;i<=top_of_world;i++)
    if (world[i].zone == zone_number) {
      /* top wall of maze */
      if ((world[i].number % 100) == 0) {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
       /* bottom wall of maze */
      } else if ((world[i].number % 100) == 90) {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
      /* all others */
      } else {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
      }
    }

  room_nr = start_room;

  for (y=0;y<10;y++)
    for (x=0;x<10;x++) {
      if (m->path[x][y] & DONORTH) {
        if (!world[room_nr].dir_option[0])
          CREATE(world[room_nr].dir_option[0], struct room_direction_data, 1);
        world[room_nr].dir_option[0]->to_room = real_room(world[room_nr].number - 10);
        world[room_nr].dir_option[0]->to_room_vnum = world[room_nr].number - 10;
        world[room_nr].dir_option[0]->key = -1;
        world[room_nr].dir_option[0]->exit_info = 0;
      }
      if (m->path[x][y] & DOEAST) {
        if (!world[room_nr].dir_option[1])
          CREATE(world[room_nr].dir_option[1], struct room_direction_data, 1);
        world[room_nr].dir_option[1]->to_room = real_room(world[room_nr].number + 1);
        world[room_nr].dir_option[1]->to_room_vnum = world[room_nr].number + 1;
        world[room_nr].dir_option[1]->key = -1;
        world[room_nr].dir_option[1]->exit_info = 0;
      }
      if (m->path[x][y] & DOSOUTH) {
        if (!world[room_nr].dir_option[2])
          CREATE(world[room_nr].dir_option[2], struct room_direction_data, 1);
        world[room_nr].dir_option[2]->to_room = real_room(world[room_nr].number + 10);
        world[room_nr].dir_option[2]->to_room_vnum = world[room_nr].number + 10;
        world[room_nr].dir_option[2]->key = -1;
        world[room_nr].dir_option[2]->exit_info = 0;
      }
      if (m->path[x][y] & DOWEST) {
        if (!world[room_nr].dir_option[3])
          CREATE(world[room_nr].dir_option[3], struct room_direction_data, 1);
        world[room_nr].dir_option[3]->to_room = real_room(world[room_nr].number - 1);
        world[room_nr].dir_option[3]->to_room_vnum = world[room_nr].number - 1;
        world[room_nr].dir_option[3]->key = -1;
        world[room_nr].dir_option[3]->exit_info = 0;
      }
      room_nr++;
    }
}

void create_rooms (maze* m, char log_filename[80]) {
  int room_nr=0;
  int zone_nr=0;
  int zone_number=0;
  int i=0;
  int x=0;
  int y=0;
  struct room_data* new_world;
  extern struct room_data* world;
  extern int top_of_world;
  extern struct zone_data* zone_table;
  extern int top_of_zone_table;
  char buf[80];
  int room_count=0;
  int found = 0;
  int start_room = 0;



  zone_number = atoi(log_filename);

  sprintf (buf, "   Building maze #%d", zone_number);
  log(buf);

  for (i=0;i<=top_of_zone_table;i++) {
    if (((zone_table[i].top - (zone_table[i].top % 100))/100) == zone_number) {
      zone_number = i;
      found = 1;
    }
  }

  if (!found) {
    sprintf (buf, "SYSERR: Could not find zone #%d", zone_number);
    log(buf);
    exit (1);
  }

  for (i=0;i<=top_of_world;i++)
    if (world[i].zone == zone_number)
      room_count++;

  if (room_count < 3) {
    sprintf (buf, "SYSERR: Maze %s only has %d rooms.", log_filename, room_count);
    log(buf);
    exit(1);
  }

  if (room_count < 100) {
    CREATE(new_world, struct room_data, ((100-room_count) + top_of_world) + 2);
    /* insert rooms */
    for (room_nr=0;room_nr<=top_of_world;room_nr++)
      if (world[room_nr].zone > zone_number)
        break;

    start_room = world[room_nr-room_count].number;

    room_nr--;

    /* copy all rooms before last room */
    for (i=0;i<room_nr;i++)
      new_world[i] = world[i];

    zone_nr = atoi(log_filename);

    /* these are the new rooms */
    for (i=0;i<(100-room_count);i++) {
      new_world[i+room_nr].zone = new_world[i+room_nr-1].zone;
      new_world[i+room_nr].number = start_room+room_count+i-1;
      new_world[i+room_nr].name = strdup(new_world[i+room_nr-1].name);
      new_world[i+room_nr].description = strdup(new_world[i+room_nr-1].description);
      new_world[i+room_nr].room_flags = new_world[i+room_nr-1].room_flags;
      new_world[i+room_nr].sector_type = new_world[i+room_nr-1].sector_type;
      new_world[i+room_nr].func = NULL;
      new_world[i+room_nr].contents = NULL;
      new_world[i+room_nr].people = NULL;
      new_world[i+room_nr].light = 0;
      new_world[i+room_nr].ex_description = NULL;

      for (x=0;x<NUM_OF_DIRS;x++)
        new_world[i+room_nr].dir_option[x] = NULL;
    }

    /* copy the rest of the rooms */
    for (i=room_nr;i<=top_of_world;i++)
      new_world[i+(100-room_count)] = world[i];

    top_of_world += (100-room_count);
    free(world);
    world=new_world;
  }

  for (room_nr=0;room_nr<=top_of_world;room_nr++)
    if (world[room_nr].zone == zone_number)
      break;

  for (i=0;i<=top_of_world;i++)
    if (world[i].zone == zone_number) {
      /* top wall of maze */
      if ((world[i].number % 100) == 0) {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
       /* bottom wall of maze */
      } else if ((world[i].number % 100) == 90) {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
      /* all others */
      } else {
        for (x=0;x<9;x++) {
          if (x==0) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
          } else if (x==9) {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          } else {
            if (world[i].dir_option[0]) {
              if (world[i].dir_option[0]->general_description)
                free (world[i].dir_option[0]->general_description);
              if (world[i].dir_option[0]->keyword)
                free (world[i].dir_option[0]->keyword);
              free (world[i].dir_option[0]);
              world[i].dir_option[0] = NULL;
            }
            if (world[i].dir_option[1]) {
              if (world[i].dir_option[1]->general_description)
                free (world[i].dir_option[1]->general_description);
              if (world[i].dir_option[1]->keyword)
                free (world[i].dir_option[1]->keyword);
              free (world[i].dir_option[1]);
              world[i].dir_option[1] = NULL;
            }
            if (world[i].dir_option[2]) {
              if (world[i].dir_option[2]->general_description)
                free (world[i].dir_option[2]->general_description);
              if (world[i].dir_option[2]->keyword)
                free (world[i].dir_option[2]->keyword);
              free (world[i].dir_option[2]);
              world[i].dir_option[2] = NULL;
            }
            if (world[i].dir_option[3]) {
              if (world[i].dir_option[3]->general_description)
                free (world[i].dir_option[3]->general_description);
              if (world[i].dir_option[3]->keyword)
                free (world[i].dir_option[3]->keyword);
              free (world[i].dir_option[3]);
              world[i].dir_option[3] = NULL;
            }
          }
        }
      }
    }

  for (i=0;i<100;i++)
    world[room_nr+i].number=start_room+i;

  for (y=0;y<10;y++)
    for (x=0;x<10;x++) {
      if (m->path[x][y] & DONORTH) {
        if (!world[room_nr].dir_option[0])
          CREATE(world[room_nr].dir_option[0], struct room_direction_data, 1);
        world[room_nr].dir_option[0]->to_room = world[room_nr].number - 10;
        world[room_nr].dir_option[0]->key = -1;
        world[room_nr].dir_option[0]->exit_info = 0;
      }
      if (m->path[x][y] & DOEAST) {
        if (!world[room_nr].dir_option[1])
          CREATE(world[room_nr].dir_option[1], struct room_direction_data, 1);
        world[room_nr].dir_option[1]->to_room = world[room_nr].number + 1;
        world[room_nr].dir_option[1]->key = -1;
        world[room_nr].dir_option[1]->exit_info = 0;
      }
      if (m->path[x][y] & DOSOUTH) {
        if (!world[room_nr].dir_option[2])
          CREATE(world[room_nr].dir_option[2], struct room_direction_data, 1);
        world[room_nr].dir_option[2]->to_room = world[room_nr].number + 10;
        world[room_nr].dir_option[2]->key = -1;
        world[room_nr].dir_option[2]->exit_info = 0;
      }
      if (m->path[x][y] & DOWEST) {
        if (!world[room_nr].dir_option[3])
          CREATE(world[room_nr].dir_option[3], struct room_direction_data, 1);
        world[room_nr].dir_option[3]->to_room = world[room_nr].number - 1;
        world[room_nr].dir_option[3]->key = -1;
        world[room_nr].dir_option[3]->exit_info = 0;
      }
      room_nr++;
    }
}

void create_maze (maze* m) {
int i;
int j;
struct timeval t;
int c_time;

m->x=0;
m->y=0;
m->lastdir = 0;
m->step=0;

gettimeofday(&t,0);
c_time = t.tv_sec;
srand (c_time);
for (i=0;i<1000;i++) {
  rand();
}

for (i=0;i<10;i++)
  for (j=0;j<10;j++)
    m->path[i][j]=0;

for (i=0;i<100;i++) {
  m->saved_path[i].x = 0;
  m->saved_path[i].y = 0;
  m->solve_path[i].x = 0;
  m->solve_path[i].y = 0;
}

/* top wall */
for (j=0;j<10;j++)
  m->path[j][0] |= WNORTH;

/* bottom wall */
for (j=0;j<10;j++)
  m->path[j][9] |= WSOUTH;

/* left wall */
for (i=0;i<10;i++)
  m->path[0][i] |= WWEST;

/* right wall */
for (i=0;i<10;i++)
  m->path[9][i] |= WEAST;

for (;;) {
  m->saved_path[m->step].x=m->x;
  m->saved_path[m->step].y=m->y;

  while ((m->lastdir = choose_exit(m)) == -1)
    if (backup(m) == -1) return;

  switch (m->lastdir) {
    case 0:
      m->path[m->x][m->y] |= DONORTH;
      m->y--;
      m->path[m->x][m->y] |= DOSOUTH;
    break;
    case 1:
      m->path[m->x][m->y] |= DOEAST;
      m->x++;
      m->path[m->x][m->y] |= DOWEST;
    break;
    case 2:
      m->path[m->x][m->y] |= DOSOUTH;
      m->y++;
      m->path[m->x][m->y] |= DONORTH;
    break;
    case 3:
      m->path[m->x][m->y] |= DOWEST;
      m->x--;
      m->path[m->x][m->y] |= DOEAST;
    break;
  }
m->step++;
if (m->x == 9 && m->y == 9) {
  int z;
  for (z=0;z<m->step;z++) {
    m->solve_path[z].x=m->saved_path[z].x;
    m->solve_path[z].y=m->saved_path[z].y;
  }
m->solve_path[m->step].x = 9;
m->solve_path[m->step].y = 9;
}
}
}

int backup(maze* m) {
m->step--;
if (m->step >= 0) {
  m->x=m->saved_path[m->step].x;
  m->y=m->saved_path[m->step].y;
}
return (m->step);
}

int choose_exit(maze* m) {
int choice[3];
int num_choice=0;

if (!(m->path[m->x][m->y] & WNORTH) &&
    !(m->path[m->x][m->y] & DONORTH))
  if (m->path[m->x][m->y-1] & DOANY) {
    m->path[m->x][m->y] |= WNORTH;
    m->path[m->x][m->y-1] |= WSOUTH;
  } else
    choice[num_choice++] = 0;

if (!(m->path[m->x][m->y] & WEAST) &&
    !(m->path[m->x][m->y] & DOEAST))
  if (m->path[m->x+1][m->y] & DOANY) {
    m->path[m->x][m->y] |= WEAST;
    m->path[m->x+1][m->y] |= WWEST;
  } else
    choice[num_choice++] = 1;
if (!(m->path[m->x][m->y] & WSOUTH) &&
    !(m->path[m->x][m->y] & DOSOUTH))
  if (m->path[m->x][m->y+1] & DOANY) {
    m->path[m->x][m->y] |= WSOUTH;
    m->path[m->x][m->y+1] |= WNORTH;
  } else
    choice[num_choice++] = 2;
if (!(m->path[m->x][m->y] & WWEST) &&
    !(m->path[m->x][m->y] & DOWEST))
  if (m->path[m->x-1][m->y] & DOANY) {
    m->path[m->x][m->y] |= WWEST;
    m->path[m->x-1][m->y] |= WEAST;
  } else
    choice[num_choice++] = 3;

if (num_choice == 0)
  return -1;
else if (num_choice == 1)
  return choice[0];

return (choice[rand()%num_choice]);
}

void print_maze(maze* m, FILE* f) {
int x;
int y;
int i;

for (y=0;y<10;y++) {
  for (x=0;x<10;x++) {
    if (m->path[x][y] & WNORTH)
      m->path[x][y] ^= WNORTH;
    if (m->path[x][y] & WEAST)
      m->path[x][y] ^= WEAST;
    if (m->path[x][y] & WSOUTH)
      m->path[x][y] ^= WSOUTH;
    if (m->path[x][y] & WWEST)
      m->path[x][y] ^= WWEST;
    fprintf (f, "%d\t", m->path[x][y]);
  }
  fprintf (f, "\n");
}

fprintf (f, "\nDOW = %d\n", (DOWEST));
fprintf (f, "DOS = %d\n", (DOSOUTH));
fprintf (f, "DOSW = %d\n", (DOSOUTH | DOWEST));
fprintf (f, "DOE = %d\n", (DOEAST));
fprintf (f, "DOEW = %d\n", (DOWEST | DOEAST));
fprintf (f, "DOES = %d\n", (DOSOUTH | DOEAST));
fprintf (f, "DOESW = %d\n", (DOEAST | DOWEST | DOSOUTH));
fprintf (f, "DON = %d\n", (DONORTH));
fprintf (f, "DONW = %d\n", (DONORTH | DOWEST));
fprintf (f, "DONS = %d\n", (DONORTH | DOSOUTH));
fprintf (f, "DONSW = %d\n", (DONORTH | DOWEST | DOSOUTH));
fprintf (f, "DONE = %d\n", (DONORTH | DOEAST));
fprintf (f, "DONEW = %d\n", (DONORTH | DOEAST | DOWEST));
fprintf (f, "DONES = %d\n", (DONORTH | DOEAST | DOSOUTH));
fprintf (f, "DONESW = %d\n\n", (DOANY));

for (i=0;i<100;i++)
  if (m->solve_path[i].x != 9 || m->solve_path[i].y != 9) {
    if (i == 0)
      fprintf (f, "%d) Start\n", i);
    if ((m->solve_path[i].x == m->solve_path[i-1].x) &&
        (m->solve_path[i].y < m->solve_path[i-1].y))
      fprintf (f, "%d) North\n", i);
    if ((m->solve_path[i].x > m->solve_path[i-1].x) &&
        (m->solve_path[i].y == m->solve_path[i-1].y))
      fprintf (f, "%d) East\n", i);
    if ((m->solve_path[i].x == m->solve_path[i-1].x) &&
        (m->solve_path[i].y > m->solve_path[i-1].y))
      fprintf (f, "%d) South\n", i);
    if ((m->solve_path[i].x < m->solve_path[i-1].x) &&
        (m->solve_path[i].y == m->solve_path[i-1].y))
      fprintf (f, "%d) West\n", i);
  }
  else
    break;

if ((m->solve_path[i].x == m->solve_path[i-1].x) &&
    (m->solve_path[i].y < m->solve_path[i-1].y))
  fprintf (f, "%d) North\n", i);
if ((m->solve_path[i].x > m->solve_path[i-1].x) &&
    (m->solve_path[i].y == m->solve_path[i-1].y))
  fprintf (f, "%d) East\n", i);
if ((m->solve_path[i].x == m->solve_path[i-1].x) &&
    (m->solve_path[i].y > m->solve_path[i-1].y))
  fprintf (f, "%d) South\n", i);
if ((m->solve_path[i].x < m->solve_path[i-1].x) &&
    (m->solve_path[i].y == m->solve_path[i-1].y))
  fprintf (f, "%d) West\n", i);
}

int boot_mazes (void) {
FILE* index=NULL;
FILE* f=NULL;
char index_filename[80];
char log_filename[80];
char temp[80];
maze m;

sprintf (index_filename, "%s/%s", MAZE_PREFIX, INDEX_FILE);

index = fopen(index_filename, "r");
if (index == NULL) {
  log ("SYSERR: unable to read maze index.");
  exit (1);
}

fgets(temp, 80, index);
while (!feof(index)) {

if (temp[0] == '$') {
  fclose(index);
  if (f)
    fclose(f);
  return 0;
}

temp[strlen(temp)-1]= '\0';
sprintf (log_filename, "%s/%s", MAZE_PREFIX, temp);

f=fopen(log_filename, "w");
if (f == NULL) {
  sprintf (temp, "SYSERR: unable to create maze log %s.", log_filename);
  log(temp);
  exit (1);
}

create_maze (&m);
print_maze (&m, f);
create_rooms(&m, temp);
fclose (f);
fgets(temp, 80, index);
sleep(1);
}

fclose (index);
return 0;
}

---> and maze.h
#define WNORTH 0x80
#define WEAST 0x40
#define WSOUTH 0x20
#define WWEST 0x10
#define DONORTH 0x8
#define DOEAST 0x4
#define DOSOUTH 0x2
#define DOWEST 0x1
#define DOANY 0xF

typedef struct {
  int x;
  int y;
} path;

typedef struct {
  int path[10][10];
  path saved_path[100];
  path solve_path[100];
  int x;
  int y;
  int lastdir;
  int step;
} maze;

--> prerequisites.

The code requires that at least 3 rooms exist in the .wld file room 0,
room 1, and room 99. (I did this cuz me was lazy). If you want to go ahead
and build more than those 3 feel free... You don't need to specify any
exits except the entrance and exit to the maze. (if i remember correctly
you can put them in room 0 and room 99.) It will copy room number 1 to
fill in any room slots until the zone has 100 rooms. You will also need to
make a new directory under the lib/world directory (named whatever you set
MAZE_PREFIX to in db.h). And the only file that needs to be in the
directory is an index file that contains the zone numbers to be
randomized. The code will generate a flat file that is representative of
the maze at the moment of creation called <zonenumber>.maz in the maze
directory.

This code is offered as is... so use it at your own risk. If you make any
enhancements (like allowing a range of rooms to be randomized), I would
appreciate being sent a copy of the changes.

also... alex, please snip out the gripe at the top and add this to the
snippets page... Thanks.


--

Dez.
_____________________________
Datatimes Text DBA Contractor
      749-2784 751-6400
_____________________________

+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   http://cspo.queensu.ca/~fletcher/Circle/list_faq.html   |
+-----------------------------------------------------------+



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