ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/square_spiral.C
Revision: 1.17
Committed: Mon Oct 12 14:00:58 2009 UTC (14 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_82, rel-2_81, rel-2_90, rel-2_92, rel-2_93
Changes since 1.16: +7 -6 lines
Log Message:
clarify license

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.11 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 pippijn 1.7 *
4 root 1.12 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.10 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.7 *
8 root 1.17 * 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 pippijn 1.7 *
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 root 1.10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 pippijn 1.7 * GNU General Public License for more details.
17     *
18 root 1.17 * 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 root 1.10 *
22 root 1.11 * The authors can be reached via e-mail to <support@deliantra.net>
23 pippijn 1.7 */
24 elmex 1.1
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 root 1.12 #include "random_map.h"
39     #include "rproto.h"
40 elmex 1.1
41     /* These are some helper functions which help with
42     manipulating a centered onion and turning it into
43     a square spiral */
44 root 1.13 void
45 root 1.14 make_square_spiral_layout (Layout maze, int options)
46 root 1.2 {
47 elmex 1.1 /* generate and allocate a doorless, centered onion */
48 root 1.13 map_gen_onion (maze, RMOPT_CENTERED | RMOPT_NO_DOORS, 0);
49    
50     int xsize = maze->w;
51     int ysize = maze->h;
52 elmex 1.1
53     /* find the layout center. */
54 root 1.15 int cx = 0;
55     int cy = 0;
56     for (int i = 0; i < xsize; i++)
57     for (int j = 0; j < ysize; j++)
58 root 1.9 if (maze[i][j] == 'C')
59     {
60     cx = i;
61     cy = j;
62 root 1.15 break;
63 root 1.9 }
64    
65 root 1.15 int tx = cx;
66     int ty = cy;
67 root 1.9 for (;;)
68 root 1.2 {
69 root 1.15 /* 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 root 1.2
83 root 1.15 /* tx and ty should now be the top-right corner of the onion layer */
84 root 1.2 if (ty < 2 || tx < 2 || tx > xsize - 2 || ty > ysize - 2)
85     break;
86 root 1.9
87 root 1.2 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 elmex 1.1
92 root 1.2 /* walk left until we find the top-left corner */
93 root 1.15 while (tx > 2 && maze[tx - 1][ty])
94     --tx;
95 elmex 1.1
96 root 1.2 make_wall (maze, tx - 1, ty, 0); /* make a horizontal wall with a door */
97 elmex 1.1
98 root 1.2 /* walk down until we find the bottom-left corner */
99 root 1.15 while (ty + 1 < ysize && maze[tx][ty + 1])
100     ++ty;
101 elmex 1.1
102 root 1.2 make_wall (maze, tx, ty + 1, 1); /* make a vertical wall with a door */
103 elmex 1.1
104 root 1.2 /* walk rightuntil we find the bottom-right corner */
105 root 1.15 while (tx + 1 < xsize && maze[tx + 1][ty])
106     ++tx;
107 elmex 1.1
108 root 1.2 make_wall (maze, tx + 1, ty, 0); /* make a horizontal wall with a door */
109 root 1.15 ++tx; /* set up for next layer. */
110 root 1.2 }
111 elmex 1.1
112     /* place the exits. */
113    
114 root 1.16 if (rmg_rndm (2))
115 root 1.2 {
116     maze[cx][cy] = '>';
117     maze[xsize - 2][1] = '<';
118     }
119     else
120     {
121     maze[cx][cy] = '<';
122     maze[xsize - 2][1] = '>';
123     }
124 elmex 1.1 }
125 root 1.9