ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/square_spiral.C
(Generate patch)

Comparing deliantra/server/random_maps/square_spiral.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:03 2006 UTC vs.
Revision 1.3 by root, Thu Sep 14 22:34:02 2006 UTC

1/*
2 * static char *rcsid_map_c =
3 * "$Id: square_spiral.C,v 1.1 2006/08/13 17:16:03 elmex Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2001 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2001 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 22*/
28 23
29 24
30/* peterm@langmuir.eecs.berkeley.edu: this function generates a random 25/* peterm@langmuir.eecs.berkeley.edu: this function generates a random
31snake-type layout. 26snake-type layout.
48#include <random_map.h> 43#include <random_map.h>
49#include <sproto.h> 44#include <sproto.h>
50#include <rproto.h> 45#include <rproto.h>
51 46
52 47
53char **map_gen_onion(int xsize, int ysize, int option, int layers); 48char **map_gen_onion (int xsize, int ysize, int option, int layers);
54 49
55 50
56/* These are some helper functions which help with 51/* These are some helper functions which help with
57 manipulating a centered onion and turning it into 52 manipulating a centered onion and turning it into
58 a square spiral */ 53 a square spiral */
60/* this starts from within a centered onion layer (or between two layers), 55/* this starts from within a centered onion layer (or between two layers),
61 and looks up until it finds a wall, and then looks right until it 56 and looks up until it finds a wall, and then looks right until it
62 finds a vertical wall, i.e., the corner. It sets cx and cy to that. 57 finds a vertical wall, i.e., the corner. It sets cx and cy to that.
63 it also starts from cx and cy. */ 58 it also starts from cx and cy. */
64 59
60void
65void find_top_left_corner(char **maze,int *cx, int *cy) { 61find_top_left_corner (char **maze, int *cx, int *cy)
62{
66 63
67 (*cy)--; 64 (*cy)--;
68 /* find the top wall. */ 65 /* find the top wall. */
69 while(maze[*cx][*cy]==0) (*cy)--; 66 while (maze[*cx][*cy] == 0)
67 (*cy)--;
70 /* proceed right until a corner is detected */ 68 /* proceed right until a corner is detected */
71 while(maze[*cx][*cy+1]==0) (*cx)++; 69 while (maze[*cx][*cy + 1] == 0)
72 70 (*cx)++;
71
73 /* cx and cy should now be the top-right corner of the onion layer */ 72 /* cx and cy should now be the top-right corner of the onion layer */
74} 73}
75 74
76 75
76char **
77char **make_square_spiral_layout(int xsize, int ysize,int options) { 77make_square_spiral_layout (int xsize, int ysize, int options)
78{
78 int i,j; 79 int i, j;
79 int cx,cy; 80 int cx, cy;
80 int tx,ty; 81 int tx, ty;
81 82
82 /* generate and allocate a doorless, centered onion */ 83 /* generate and allocate a doorless, centered onion */
83 char **maze = map_gen_onion(xsize,ysize,OPT_CENTERED | OPT_NO_DOORS,0); 84 char **maze = map_gen_onion (xsize, ysize, OPT_CENTERED | OPT_NO_DOORS, 0);
84 85
85 /* find the layout center. */ 86 /* find the layout center. */
86 cx = 0; cy = 0; 87 cx = 0;
88 cy = 0;
87 for(i=0;i<xsize;i++) 89 for (i = 0; i < xsize; i++)
88 for(j=0;j<ysize;j++) { 90 for (j = 0; j < ysize; j++)
91 {
89 if(maze[i][j]=='C' ) { 92 if (maze[i][j] == 'C')
93 {
90 cx = i; cy=j; 94 cx = i;
95 cy = j;
96 }
91 } 97 }
98 tx = cx;
99 ty = cy;
100 while (1)
101 {
102 find_top_left_corner (maze, &tx, &ty);
103
104 if (ty < 2 || tx < 2 || tx > xsize - 2 || ty > ysize - 2)
105 break;
106 make_wall (maze, tx, ty - 1, 1); /* make a vertical wall with a door */
107
108 maze[tx][ty - 1] = '#'; /* convert the door that make_wall puts here to a wall */
109 maze[tx - 1][ty] = 'D'; /* make a doorway out of this layer */
110
111 /* walk left until we find the top-left corner */
112 while ((tx > 2) && maze[tx - 1][ty])
113 tx--;
114
115 make_wall (maze, tx - 1, ty, 0); /* make a horizontal wall with a door */
116
117 /* walk down until we find the bottom-left corner */
118 while (((ty + 1) < ysize) && maze[tx][ty + 1])
119 ty++;
120
121 make_wall (maze, tx, ty + 1, 1); /* make a vertical wall with a door */
122
123 /* walk rightuntil we find the bottom-right corner */
124 while (((tx + 1) < xsize) && maze[tx + 1][ty])
125 tx++;
126
127 make_wall (maze, tx + 1, ty, 0); /* make a horizontal wall with a door */
128 tx++; /* set up for next layer. */
92 } 129 }
93 tx = cx; ty = cy;
94 while(1) {
95 find_top_left_corner(maze,&tx,&ty);
96 130
97 if(ty < 2 || tx < 2 || tx > xsize -2 || ty > ysize-2 ) break;
98 make_wall(maze,tx,ty-1,1); /* make a vertical wall with a door */
99
100 maze[tx][ty-1]='#'; /* convert the door that make_wall puts here to a wall */
101 maze[tx-1][ty]='D';/* make a doorway out of this layer */
102
103 /* walk left until we find the top-left corner */
104 while((tx>2) && maze[tx-1][ty]) tx--;
105
106 make_wall(maze,tx-1,ty,0); /* make a horizontal wall with a door */
107
108 /* walk down until we find the bottom-left corner */
109 while(((ty+1) < ysize) && maze[tx][ty+1] ) ty++;
110
111 make_wall(maze,tx,ty+1,1); /* make a vertical wall with a door */
112
113 /* walk rightuntil we find the bottom-right corner */
114 while(((tx + 1) < xsize) && maze[tx+1][ty]) tx++;
115
116 make_wall(maze,tx+1,ty,0); /* make a horizontal wall with a door */
117 tx++; /* set up for next layer. */
118 }
119
120 /* place the exits. */ 131 /* place the exits. */
121 132
122 if(RANDOM() %2) { 133 if (RANDOM () % 2)
134 {
123 maze[cx][cy]='>'; 135 maze[cx][cy] = '>';
124 maze[xsize-2][1]='<'; 136 maze[xsize - 2][1] = '<';
125 } 137 }
126 else { 138 else
139 {
127 maze[cx][cy]='<'; 140 maze[cx][cy] = '<';
128 maze[xsize-2][1]='>'; 141 maze[xsize - 2][1] = '>';
129 }
130 142 }
143
131 return maze; 144 return maze;
132} 145}
133
134
135

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines