ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/square_spiral.C
Revision: 1.18
Committed: Fri Mar 26 00:59:21 2010 UTC (14 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.17: +2 -2 lines
Log Message:
remove bogus 2007 copyright that was added wrongly by the script, update to affero license

File Contents

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen
7 *
8 * Deliantra is free software: you can redistribute it and/or modify it under
9 * the terms of the Affero GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the Affero GNU General Public License
19 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>.
21 *
22 * The authors can be reached via e-mail to <support@deliantra.net>
23 */
24
25 /* peterm@langmuir.eecs.berkeley.edu: this function generates a random
26 snake-type layout.
27
28 input: xsize, ysize;
29 output: a char** array with # and . for closed and open respectively.
30
31 a char value of 0 represents a blank space: a '#' is
32 a wall.
33
34 */
35
36 #include <global.h>
37
38 #include "random_map.h"
39 #include "rproto.h"
40
41 /* These are some helper functions which help with
42 manipulating a centered onion and turning it into
43 a square spiral */
44 void
45 make_square_spiral_layout (Layout maze, int options)
46 {
47 /* generate and allocate a doorless, centered onion */
48 map_gen_onion (maze, RMOPT_CENTERED | RMOPT_NO_DOORS, 0);
49
50 int xsize = maze->w;
51 int ysize = maze->h;
52
53 /* find the layout center. */
54 int cx = 0;
55 int cy = 0;
56 for (int i = 0; i < xsize; i++)
57 for (int j = 0; j < ysize; j++)
58 if (maze[i][j] == 'C')
59 {
60 cx = i;
61 cy = j;
62 break;
63 }
64
65 int tx = cx;
66 int ty = cy;
67 for (;;)
68 {
69 /* this starts from within a centered onion layer (or between two layers),
70 and looks up until it finds a wall, and then looks right until it
71 finds a vertical wall, i.e., the corner. It sets tx and ty to that.
72 it also starts from tx and ty. */
73 --ty;
74
75 /* find the top wall. */
76 while (maze[tx][ty] != '#')
77 --ty;
78
79 /* proceed right until a corner is detected */
80 while (maze[tx][ty + 1] != '#')
81 ++tx;
82
83 /* tx and ty should now be the top-right corner of the onion layer */
84 if (ty < 2 || tx < 2 || tx > xsize - 2 || ty > ysize - 2)
85 break;
86
87 make_wall (maze, tx, ty - 1, 1); /* make a vertical wall with a door */
88
89 maze[tx][ty - 1] = '#'; /* convert the door that make_wall puts here to a wall */
90 maze[tx - 1][ty] = 'D'; /* make a doorway out of this layer */
91
92 /* walk left until we find the top-left corner */
93 while (tx > 2 && maze[tx - 1][ty])
94 --tx;
95
96 make_wall (maze, tx - 1, ty, 0); /* make a horizontal wall with a door */
97
98 /* walk down until we find the bottom-left corner */
99 while (ty + 1 < ysize && maze[tx][ty + 1])
100 ++ty;
101
102 make_wall (maze, tx, ty + 1, 1); /* make a vertical wall with a door */
103
104 /* walk rightuntil we find the bottom-right corner */
105 while (tx + 1 < xsize && maze[tx + 1][ty])
106 ++tx;
107
108 make_wall (maze, tx + 1, ty, 0); /* make a horizontal wall with a door */
109 ++tx; /* set up for next layer. */
110 }
111
112 /* place the exits. */
113
114 if (rmg_rndm (2))
115 {
116 maze[cx][cy] = '>';
117 maze[xsize - 2][1] = '<';
118 }
119 else
120 {
121 maze[cx][cy] = '<';
122 maze[xsize - 2][1] = '>';
123 }
124 }
125