ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/room_gen_spiral.C
Revision: 1.1
Committed: Sun Aug 13 17:16:03 2006 UTC (17 years, 10 months ago) by elmex
Content type: text/plain
Branch: MAIN
Log Message:
Made server compile with C++.
Removed cfanim plugin and crossedit.
C++ here we come.

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 1994 Mark Wedel
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21     The author can be reached via e-mail to mark@pyramid.com
22     */
23    
24    
25     /* The onion room generator:
26     Onion rooms are like this:
27    
28     char **map_gen_spiral(int xsize, int ysize, int option);
29    
30    
31     */
32     #include <global.h>
33     #include <random_map.h>
34    
35     #define RANDOM_OPTIONS 0 /* Pick random options below */
36     #define REGULAR_SPIRAL 1 /* Regular spiral--distance increases constantly*/
37     #define FINE_SPIRAL 2 /* uses the min. separation: most coiling */
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 */
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    
49     #define MINDIST 3
50    
51     #define MAX_FINE .454545
52    
53     extern int surround_check(char **maze,int i, int j, int xsize, int ysize);
54    
55     char **map_gen_spiral(int xsize, int ysize, int option) {
56     int i,j;
57     float parm=0;
58     float x=0,y=0;
59     int ic,jc;
60     float SizeX,SizeY;
61     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    
69     /* slightly easier to fill and then cut */
70     for(i=0;i<xsize;i++) for(j=0;j<ysize;j++) maze[i][j] = '#';
71    
72     ic = xsize/2;
73     jc = ysize/2;
74     SizeX = xsize/2 - 2;
75     SizeY = ysize/2 -2;
76    
77     /* select random options if necessary */
78     if(option==0) {
79     option=RANDOM()%MAX_SPIRAL_OPT;
80     }
81    
82     /* the order in which these are evaluated matters*/
83    
84     /* the following two are mutually exclusive.
85     pick one if they're both set. */
86     if((option & REGULAR_SPIRAL) && (option & FIT_SPIRAL))
87     {
88     /* unset REGULAR_SPIRAL half the time */
89     if(RANDOM()%2 && (option & REGULAR_SPIRAL))
90     option -= REGULAR_SPIRAL;
91     else
92     option -= FIT_SPIRAL;
93     }
94    
95     xscale=yscale=MAX_FINE; /* fine spiral */
96    
97     /* choose the spiral pitch */
98     if(! (option & FINE_SPIRAL) ) {
99     float pitch = (RANDOM() %5)/10. + 10./22.;
100     xscale=yscale=pitch;
101     }
102    
103     if((option & FIT_SPIRAL) && (xsize!=ysize) ) {
104     if(xsize > ysize) xscale *= (float)xsize/(float)ysize;
105     else yscale *= (float)ysize/(float)xsize;
106     }
107    
108     if(option & REGULAR_SPIRAL) {
109     float scale = MIN(xscale,yscale);
110     xscale=yscale=scale;
111     }
112    
113     /* cut out the spiral */
114     while( (fabs(x) < SizeX) && (fabs(y) < SizeY) )
115     {
116     x = parm * cos(parm)*xscale;
117     y = parm * sin(parm)*yscale;
118     maze[(int)(ic + x )][(int)(jc + y )]='\0';
119     parm+=0.01;
120     };
121    
122     maze[(int)(ic + x+0.5)][(int)(jc + y+0.5)]='<';
123    
124    
125     /* cut out the center in a 2x2 and place the center and downexit */
126     maze[ic][jc+1]='>';
127     maze[ic][jc]='C';
128    
129    
130     return maze;
131     }
132    
133     /* the following function connects disjoint spirals which may
134     result from the symmetrization process. */
135     void 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