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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines