Crossfire Server, Branches 1.12  R18729
square_spiral.c
Go to the documentation of this file.
1 /*
2  * static char *rcsid_map_c =
3  * "$Id: square_spiral.c 11578 2009-02-23 22:02:27Z lalo $";
4  */
5 
6 /*
7  CrossFire, A Multiplayer game for X-windows
8 
9  Copyright (C) 2001 Mark Wedel & Crossfire Development Team
10  Copyright (C) 1992 Frank Tore Johansen
11 
12  This program is free software; you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation; either version 2 of the License, or
15  (at your option) any later version.
16 
17  This program is distributed in the hope that it will be useful,
18  but WITHOUT ANY WARRANTY; without even the implied warranty of
19  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20  GNU General Public License for more details.
21 
22  You should have received a copy of the GNU General Public License
23  along with this program; if not, write to the Free Software
24  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 
26  The authors can be reached via e-mail at crossfire-devel@real-time.com
27 */
28 
36 /* peterm@langmuir.eecs.berkeley.edu: this function generates a random
37 snake-type layout.
38 */
39 
40 #include <stdlib.h>
41 #include <stdio.h>
42 #include <global.h>
43 #include <time.h>
44 
45 #include <maze_gen.h>
46 #include <room_gen.h>
47 #include <random_map.h>
48 #include <sproto.h>
49 #include <rproto.h>
50 
51 char **map_gen_onion(int xsize, int ysize, int option, int layers);
52 
53 /* These are some helper functions which help with
54  manipulating a centered onion and turning it into
55  a square spiral */
56 
68 void find_top_left_corner(char **maze, int *cx, int *cy) {
69  (*cy)--;
70  /* find the top wall. */
71  while (maze[*cx][*cy] == 0)
72  (*cy)--;
73  /* proceed right until a corner is detected */
74  while (maze[*cx][*cy+1] == 0)
75  (*cx)++;
76 
77  /* cx and cy should now be the top-right corner of the onion layer */
78 }
79 
90 char **make_square_spiral_layout(int xsize, int ysize) {
91  int i, j;
92  int cx, cy;
93  int tx, ty;
94 
95  /* generate and allocate a doorless, centered onion */
96  char **maze = map_gen_onion(xsize, ysize, OPT_CENTERED|OPT_NO_DOORS, 0);
97 
98  /* find the layout center. */
99  cx = 0;
100  cy = 0;
101  for (i = 0; i < xsize; i++)
102  for (j = 0; j < ysize; j++) {
103  if (maze[i][j] == 'C') {
104  cx = i;
105  cy = j;
106  }
107  }
108  tx = cx;
109  ty = cy;
110  while (1) {
111  find_top_left_corner(maze, &tx, &ty);
112 
113  if (ty < 2 || tx < 2 || tx > xsize-2 || ty > ysize-2)
114  break;
115  make_wall(maze, tx, ty-1, 1); /* make a vertical wall with a door */
116 
117  maze[tx][ty-1] = '#'; /* convert the door that make_wall puts here to a wall */
118  maze[tx-1][ty] = 'D';/* make a doorway out of this layer */
119 
120  /* walk left until we find the top-left corner */
121  while ((tx > 2) && maze[tx-1][ty])
122  tx--;
123 
124  make_wall(maze, tx-1, ty, 0); /* make a horizontal wall with a door */
125 
126  /* walk down until we find the bottom-left corner */
127  while (((ty+1) < ysize) && maze[tx][ty+1])
128  ty++;
129 
130  make_wall(maze, tx, ty+1, 1); /* make a vertical wall with a door */
131 
132  /* walk rightuntil we find the bottom-right corner */
133  while (((tx+1) < xsize) && maze[tx+1][ty])
134  tx++;
135 
136  make_wall(maze, tx+1, ty, 0); /* make a horizontal wall with a door */
137  tx++; /* set up for next layer. */
138  }
139 
140  /* place the exits. */
141  if (RANDOM()%2) {
142  maze[cx][cy] = '>';
143  maze[xsize-2][1] = '<';
144  } else {
145  maze[cx][cy] = '<';
146  maze[xsize-2][1] = '>';
147  }
148 
149  return maze;
150 }
void find_top_left_corner(char **maze, int *cx, int *cy)
Definition: square_spiral.c:68
int make_wall(char **maze, int x, int y, int dir)
Definition: random_map.c:602
#define OPT_CENTERED
Definition: random_map.h:107
char ** map_gen_onion(int xsize, int ysize, int option, int layers)
char ** make_square_spiral_layout(int xsize, int ysize)
Definition: square_spiral.c:90
#define OPT_NO_DOORS
Definition: random_map.h:114