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

Comparing deliantra/server/random_maps/room_gen_spiral.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:03 2006 UTC vs.
Revision 1.30 by root, Sun Jan 29 02:47:05 2017 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
4 Copyright (C) 1994 Mark Wedel 5 * Copyright (©) 1994 Mark Wedel
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify it under
8 it under the terms of the GNU General Public License as published by 9 * the terms of the Affero GNU General Public License as published by the
9 the Free Software Foundation; either version 2 of the License, or 10 * Free Software Foundation, either version 3 of the License, or (at your
10 (at your option) any later version. 11 * option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 You should have received a copy of the GNU General Public License 18 * You should have received a copy of the Affero GNU General Public License
18 along with this program; if not, write to the Free Software 19 * and the GNU General Public License along with this program. If not, see
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * <http://www.gnu.org/licenses/>.
20 21 *
21 The author can be reached via e-mail to mark@pyramid.com 22 * The authors can be reached via e-mail to <support@deliantra.net>
22*/ 23 */
23
24 24
25/* The onion room generator: 25/* The onion room generator:
26Onion rooms are like this: 26Onion rooms are like this:
27 27
28char **map_gen_spiral(int xsize, int ysize, int option); 28char **map_gen_spiral(int xsize, int ysize, int option);
29*/
29 30
31#include <global.h>
32#include <rmg.h>
33#include <rproto.h>
30 34
31*/
32#include <global.h>
33#include <random_map.h>
34
35#define RANDOM_OPTIONS 0 /* Pick random options below */ 35#define RANDOM_OPTIONS 0 /* Pick random options below */
36#define REGULAR_SPIRAL 1 /* Regular spiral--distance increases constantly*/ 36#define REGULAR_SPIRAL 1 /* Regular spiral--distance increases constantly */
37#define FINE_SPIRAL 2 /* uses the min. separation: most coiling */ 37#define FINE_SPIRAL 2 /* uses the min. separation: most coiling */
38#define FIT_SPIRAL 4 /* scale to a rectangular region, not square */ 38#define FIT_SPIRAL 4 /* scale to a rectangular region, not square */
39#define MAX_SPIRAL_OPT 8 /* this should be 2x the last real option */ 39#define MAX_SPIRAL_OPT 8 /* this should be 2x the last real option */
40#include <math.h>
41
42#ifndef MIN
43#define MIN(x,y) (((x)<(y))? (x):(y))
44#endif
45#ifndef MAX
46#define MAX(x,y) (((x)<(y))? (y):(x))
47#endif
48 40
49#define MINDIST 3 41#define MINDIST 3
50 42
51#define MAX_FINE .454545 43#define MAX_FINE .454545
52 44
53extern int surround_check(char **maze,int i, int j, int xsize, int ysize); 45void
54 46map_gen_spiral (layout &maze, int option)
55char **map_gen_spiral(int xsize, int ysize, int option) { 47{
56 int i,j;
57 float parm=0; 48 float parm = 0;
58 float x=0,y=0; 49 float x = 0, y = 0;
59 int ic,jc; 50 int ic, jc;
60 float SizeX,SizeY; 51 float SizeX, SizeY;
61 float xscale,yscale; 52 float xscale, yscale;
62
63 /* allocate that array, set it up */
64 char **maze = (char **)calloc(sizeof(char*),xsize);
65 for(i=0;i<xsize;i++) {
66 maze[i] = (char *) calloc(sizeof(char),ysize);
67 }
68 53
69 /* slightly easier to fill and then cut */ 54 /* slightly easier to fill and then cut */
70 for(i=0;i<xsize;i++) for(j=0;j<ysize;j++) maze[i][j] = '#'; 55 maze.fill ('#');
71 56
57 int xsize = maze.w;
58 int ysize = maze.h;
59
72 ic = xsize/2; 60 ic = xsize / 2;
73 jc = ysize/2; 61 jc = ysize / 2;
74 SizeX = xsize/2 - 2; 62 SizeX = xsize / 2 - 2;
75 SizeY = ysize/2 -2; 63 SizeY = ysize / 2 - 2;
76 64
77 /* select random options if necessary */ 65 /* select random options if necessary */
78 if(option==0) { 66 if (option == 0)
79 option=RANDOM()%MAX_SPIRAL_OPT; 67 option = rmg_rndm (MAX_SPIRAL_OPT);
80 }
81 68
82 /* the order in which these are evaluated matters*/ 69 /* the order in which these are evaluated matters */
83 70
84 /* the following two are mutually exclusive. 71 /* the following two are mutually exclusive.
85 pick one if they're both set. */ 72 pick one if they're both set. */
86 if((option & REGULAR_SPIRAL) && (option & FIT_SPIRAL)) 73 if ((option & REGULAR_SPIRAL) && (option & FIT_SPIRAL))
87 { 74 {
88 /* unset REGULAR_SPIRAL half the time */ 75 /* unset REGULAR_SPIRAL half the time */
89 if(RANDOM()%2 && (option & REGULAR_SPIRAL)) 76 if (rmg_rndm (2) && (option & REGULAR_SPIRAL))
90 option -= REGULAR_SPIRAL; 77 option -= REGULAR_SPIRAL;
91 else 78 else
92 option -= FIT_SPIRAL; 79 option -= FIT_SPIRAL;
93 } 80 }
94 81
95 xscale=yscale=MAX_FINE; /* fine spiral */ 82 xscale = yscale = MAX_FINE; /* fine spiral */
96 83
97 /* choose the spiral pitch */ 84 /* choose the spiral pitch */
98 if(! (option & FINE_SPIRAL) ) { 85 if (!(option & FINE_SPIRAL))
99 float pitch = (RANDOM() %5)/10. + 10./22.; 86 {
100 xscale=yscale=pitch; 87 float pitch = (rmg_rndm (5)) / 10. + 10. / 22.;
101 }
102 88
103 if((option & FIT_SPIRAL) && (xsize!=ysize) ) { 89 xscale = yscale = pitch;
104 if(xsize > ysize) xscale *= (float)xsize/(float)ysize;
105 else yscale *= (float)ysize/(float)xsize;
106 } 90 }
107 91
92 if ((option & FIT_SPIRAL) && (xsize != ysize))
93 {
94 if (xsize > ysize)
95 xscale *= (float) xsize / (float) ysize;
96 else
97 yscale *= (float) ysize / (float) xsize;
98 }
99
108 if(option & REGULAR_SPIRAL) { 100 if (option & REGULAR_SPIRAL)
101 {
109 float scale = MIN(xscale,yscale); 102 float scale = min (xscale, yscale);
103
110 xscale=yscale=scale; 104 xscale = yscale = scale;
111 } 105 }
112 106
113 /* cut out the spiral */ 107 /* cut out the spiral */
114 while( (fabs(x) < SizeX) && (fabs(y) < SizeY) ) 108 while ((fabs (x) < SizeX) && (fabs (y) < SizeY))
115 { 109 {
116 x = parm * cos(parm)*xscale; 110 x = parm * cos (parm) * xscale;
117 y = parm * sin(parm)*yscale; 111 y = parm * sin (parm) * yscale;
118 maze[(int)(ic + x )][(int)(jc + y )]='\0'; 112 maze[int (ic + x)][int (jc + y)] = '\0';
119 parm+=0.01; 113 parm += 0.01;
120 }; 114 }
121
122maze[(int)(ic + x+0.5)][(int)(jc + y+0.5)]='<';
123 115
116 maze[int (ic + x + 0.5)][int (jc + y + 0.5)] = '<';
124 117
125 /* cut out the center in a 2x2 and place the center and downexit */ 118 /* cut out the center in a 2x2 and place the center and downexit */
126 maze[ic][jc+1]='>'; 119 maze[ic][jc + 1] = '>';
127 maze[ic][jc]='C'; 120 maze[ic][jc] = 'C';
128
129
130 return maze;
131} 121}
132 122
133/* the following function connects disjoint spirals which may
134 result from the symmetrization process. */
135void connect_spirals(int xsize,int ysize,int sym, char **layout) {
136
137 int i,j,ic=xsize/2,jc=ysize/2;
138
139 if(sym==X_SYM) {
140 layout[ic][jc] = 0;
141 /* go left from map center */
142 for(i=ic-1,j=jc; i>0 && layout[i][j]=='#' ;i--)
143 layout[i][j]=0;
144 /* go right */
145 for(i=ic+1,j=jc; i<xsize-1 && layout[i][j]=='#' ;i++)
146 layout[i][j]=0;
147 }
148
149 if(sym==Y_SYM) {
150
151 layout[ic][jc] = 0;
152 /* go up */
153 for(i=ic,j=jc-1; j>0 && layout[i][j]=='#' ;j--)
154 layout[i][j]=0;
155 /* go down */
156 for(i=ic,j=jc+1; j<ysize-1 && layout[i][j]=='#' ;j++)
157 layout[i][j]=0;
158 }
159
160 if(sym==XY_SYM) {
161 /* go left from map center */
162 layout[ic][jc/2]=0;
163 layout[ic/2][jc]=0;
164 layout[ic][jc/2+jc]=0;
165 layout[ic/2+ic][jc]=0;
166 for(i=ic-1,j=jc/2; i>0 && layout[i][j]=='#' ;i--) {
167 layout[i][j + jc]=0;
168 layout[i][j]=0;
169 }
170 /* go right */
171 for(i=ic+1,j=jc/2; i<xsize-1 && layout[i][j]=='#' ;i++) {
172 layout[i][j+jc]=0;
173 layout[i][j]=0;
174 }
175 /* go up */
176 for(i=ic/2,j=jc-1; j>0 && layout[i][j]=='#' ;j--) {
177 layout[i][j]=0;
178 layout[i+ic][j]=0;
179 }
180 /* go down */
181 for(i=ic/2,j=jc+1; j<ysize-1 && layout[i][j]=='#' ;j++) {
182 layout[i][j]=0;
183 layout[i+ic][j]=0;
184 }
185
186 }
187
188 /* get rid of bad doors. */
189 for(i=0;i<xsize;i++)
190 for(j=0;j<ysize;j++) {
191 if(layout[i][j]=='D') { /* remove bad door. */
192 int si = surround_check(layout,i,j,xsize,ysize);
193 if(si!=3 && si!=12) {
194 layout[i][j]=0;
195 /* back up and recheck any nearby doors */
196 i=0;j=0;
197 }
198 }
199 }
200
201
202
203}
204

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines