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

Comparing deliantra/server/random_maps/special.C (file contents):
Revision 1.3 by root, Sun Sep 3 00:18:41 2006 UTC vs.
Revision 1.7 by root, Tue Dec 12 20:53:03 2006 UTC

1/*
2 * static char *rcsid_special_c =
3 * "$Id: special.C,v 1.3 2006/09/03 00:18:41 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 22*/
28 23
29/* Specials in this file: 24/* Specials in this file:
30 included maps */ 25 included maps */
31 26
45#define NR_OF_HOLE_TYPES 3 40#define NR_OF_HOLE_TYPES 3
46 41
47/* clear map completely of all objects: a rectangular area of xsize, ysize 42/* clear map completely of all objects: a rectangular area of xsize, ysize
48is cleared with the top left corner at xstart, ystart */ 43is cleared with the top left corner at xstart, ystart */
49 44
45void
50void nuke_map_region(mapstruct *map,int xstart,int ystart, int xsize, int ysize) { 46nuke_map_region (maptile *map, int xstart, int ystart, int xsize, int ysize)
47{
51 int i,j; 48 int i, j;
52 object *tmp; 49 object *tmp;
50
53 for(i=xstart;i<xstart + xsize;i++) 51 for (i = xstart; i < xstart + xsize; i++)
54 for(j=ystart;j<ystart +ysize;j++) { 52 for (j = ystart; j < ystart + ysize; j++)
53 {
55 for(tmp=get_map_ob(map,i,j);tmp!=NULL;tmp=tmp->above) { 54 for (tmp = get_map_ob (map, i, j); tmp != NULL; tmp = tmp->above)
55 {
56 if(!QUERY_FLAG(tmp,FLAG_IS_FLOOR)) { 56 if (!QUERY_FLAG (tmp, FLAG_IS_FLOOR))
57 if(tmp->head) tmp=tmp->head; 57 {
58 remove_ob(tmp); 58 if (tmp->head)
59 free_object(tmp); 59 tmp = tmp->head;
60 tmp->remove ();
61 tmp->destroy (0);
60 tmp=get_map_ob(map,i,j); 62 tmp = get_map_ob (map, i, j);
63 }
64 if (tmp == NULL)
65 break;
61 } 66 }
62 if(tmp==NULL) break;
63 } 67 }
64 }
65} 68}
66 69
67 70
68 71
69/* copy in_map into dest_map at point x,y */ 72/* copy in_map into dest_map at point x,y */
70 73
71 74
75void
72void include_map_in_map(mapstruct *dest_map, mapstruct *in_map,int x, int y) { 76include_map_in_map (maptile *dest_map, maptile *in_map, int x, int y)
77{
73 int i,j; 78 int i, j;
74 object *tmp; 79 object *tmp;
75 object *new_ob; 80 object *new_ob;
76 81
77 /* First, splatter everything in the dest map at the location */ 82 /* First, splatter everything in the dest map at the location */
78 nuke_map_region(dest_map,x,y,MAP_WIDTH(in_map),MAP_HEIGHT(in_map)); 83 nuke_map_region (dest_map, x, y, MAP_WIDTH (in_map), MAP_HEIGHT (in_map));
79 84
80 for(i=0;i<MAP_WIDTH(in_map);i++) 85 for (i = 0; i < MAP_WIDTH (in_map); i++)
81 for(j=0;j<MAP_HEIGHT(in_map);j++) { 86 for (j = 0; j < MAP_HEIGHT (in_map); j++)
87 {
82 for(tmp=get_map_ob(in_map,i,j);tmp!=NULL;tmp=tmp->above) { 88 for (tmp = get_map_ob (in_map, i, j); tmp != NULL; tmp = tmp->above)
89 {
83 /* don't copy things with multiple squares: must be dealt with 90 /* don't copy things with multiple squares: must be dealt with
84 specially. */ 91 specially. */
85 if(tmp->head!=NULL) continue; 92 if (tmp->head != NULL)
93 continue;
86 new_ob = arch_to_object(tmp->arch); 94 new_ob = arch_to_object (tmp->arch);
87 copy_object_with_inv(tmp,new_ob); 95 copy_object_with_inv (tmp, new_ob);
88 if(QUERY_FLAG(tmp,FLAG_IS_LINKED)) 96 if (QUERY_FLAG (tmp, FLAG_IS_LINKED))
89 add_button_link(new_ob,dest_map,tmp->path_attuned); 97 add_button_link (new_ob, dest_map, tmp->path_attuned);
90 new_ob->x = i + x; 98 new_ob->x = i + x;
91 new_ob->y = j + y; 99 new_ob->y = j + y;
92 insert_multisquare_ob_in_map(new_ob,dest_map); 100 insert_multisquare_ob_in_map (new_ob, dest_map);
101 }
93 } 102 }
94 }
95} 103}
96 104
105int
97int find_spot_for_submap(mapstruct *map,char **layout,int *ix, int *iy,int xsize, int ysize) { 106find_spot_for_submap (maptile *map, char **layout, int *ix, int *iy, int xsize, int ysize)
107{
98 int tries; 108 int tries;
99 int i=0,j=0; /* initialization may not be needed but prevents compiler warnings */ 109 int i = 0, j = 0; /* initialization may not be needed but prevents compiler warnings */
100 int is_occupied=0; 110 int is_occupied = 0;
101 int l,m; 111 int l, m;
112
102 /* don't even try to place a submap into a map if the big map isn't 113 /* don't even try to place a submap into a map if the big map isn't
103 sufficiently large. */ 114 sufficiently large. */
104 if(2*xsize > MAP_WIDTH(map) || 2*ysize > MAP_HEIGHT(map)) return 0; 115 if (2 * xsize > MAP_WIDTH (map) || 2 * ysize > MAP_HEIGHT (map))
105 116 return 0;
117
106 /* search a bit for a completely free spot. */ 118 /* search a bit for a completely free spot. */
107 for(tries=0;tries<20;tries++) { 119 for (tries = 0; tries < 20; tries++)
120 {
108 /* pick a random location in the layout */ 121 /* pick a random location in the layout */
109 i = RANDOM() % (MAP_WIDTH(map) - xsize-2)+1; 122 i = RANDOM () % (MAP_WIDTH (map) - xsize - 2) + 1;
110 j = RANDOM() % (MAP_HEIGHT(map) - ysize-2)+1; 123 j = RANDOM () % (MAP_HEIGHT (map) - ysize - 2) + 1;
111 is_occupied=0; 124 is_occupied = 0;
112 for(l=i;l<i + xsize;l++) 125 for (l = i; l < i + xsize; l++)
113 for(m=j;m<j + ysize;m++) 126 for (m = j; m < j + ysize; m++)
114 is_occupied|=layout[l][m]; 127 is_occupied |= layout[l][m];
115 if(!is_occupied) break; 128 if (!is_occupied)
129 break;
116 } 130 }
117 131
118 132
119 /* if we failed, relax the restrictions */ 133 /* if we failed, relax the restrictions */
120 134
121 if(is_occupied) { /* failure, try a relaxed placer. */ 135 if (is_occupied)
136 { /* failure, try a relaxed placer. */
122 /* pick a random location in the layout */ 137 /* pick a random location in the layout */
123 for(tries=0;tries<10;tries++) { 138 for (tries = 0; tries < 10; tries++)
139 {
124 i = RANDOM() % (MAP_WIDTH(map) - xsize-2)+1; 140 i = RANDOM () % (MAP_WIDTH (map) - xsize - 2) + 1;
125 j = RANDOM() % (MAP_HEIGHT(map) - ysize-2)+1; 141 j = RANDOM () % (MAP_HEIGHT (map) - ysize - 2) + 1;
126 is_occupied=0; 142 is_occupied = 0;
127 for(l=i;l<i + xsize;l++) 143 for (l = i; l < i + xsize; l++)
128 for(m=j;m<j + ysize;m++) 144 for (m = j; m < j + ysize; m++)
129 if(layout[l][m]=='C' || layout[l][m]=='>' || layout[l][m]=='<') 145 if (layout[l][m] == 'C' || layout[l][m] == '>' || layout[l][m] == '<')
130 is_occupied|=1; 146 is_occupied |= 1;
131 } 147 }
132 } 148 }
133 if(is_occupied) return 0; 149 if (is_occupied)
150 return 0;
134 *ix=i; 151 *ix = i;
135 *iy=j; 152 *iy = j;
136 return 1; 153 return 1;
137} 154}
138 155
139 156
157void
140void place_fountain_with_specials(mapstruct *map) { 158place_fountain_with_specials (maptile *map)
159{
141 int ix,iy,i=-1,tries=0; 160 int ix, iy, i = -1, tries = 0;
142 mapstruct *fountain_style=find_style("/styles/misc","fountains",-1); 161 maptile *fountain_style = find_style ("/styles/misc", "fountains", -1);
143 object *fountain=get_archetype("fountain"); 162 object *fountain = get_archetype ("fountain");
144 object *potion=get_object(); 163 object *potion = get_object ();
164
145 copy_object(pick_random_object(fountain_style),potion); 165 copy_object (pick_random_object (fountain_style), potion);
146 while(i<0 && tries<10) { 166 while (i < 0 && tries < 10)
167 {
147 ix = RANDOM() % (MAP_WIDTH(map) -2) +1; 168 ix = RANDOM () % (MAP_WIDTH (map) - 2) + 1;
148 iy = RANDOM() % (MAP_HEIGHT(map) -2) +1; 169 iy = RANDOM () % (MAP_HEIGHT (map) - 2) + 1;
149 i = find_first_free_spot(fountain,map,ix,iy); 170 i = find_first_free_spot (fountain, map, ix, iy);
150 tries++; 171 tries++;
151 }; 172 };
152 if(i==-1) { /* can't place fountain */ 173 if (i == -1)
153 free_object(fountain); 174 { /* can't place fountain */
154 free_object(potion); 175 fountain->destroy (0);
176 potion->destroy (0);
155 return; 177 return;
156 } 178 }
157 ix += freearr_x[i]; 179 ix += freearr_x[i];
158 iy += freearr_y[i]; 180 iy += freearr_y[i];
159 potion->face=fountain->face; 181 potion->face = fountain->face;
160 SET_FLAG(potion,FLAG_NO_PICK); 182 SET_FLAG (potion, FLAG_NO_PICK);
161 SET_FLAG(potion,FLAG_IDENTIFIED); 183 SET_FLAG (potion, FLAG_IDENTIFIED);
162 potion->name = potion->name_pl = "fountain"; 184 potion->name = potion->name_pl = "fountain";
163 potion->x = ix; 185 potion->x = ix;
164 potion->y = iy; 186 potion->y = iy;
165 potion->material=M_ADAMANT; 187 potion->material = M_ADAMANT;
166 fountain->x = ix; 188 fountain->x = ix;
167 fountain->y = iy; 189 fountain->y = iy;
168 insert_ob_in_map(fountain,map,NULL,0); 190 insert_ob_in_map (fountain, map, NULL, 0);
169 insert_ob_in_map(potion,map,NULL,0); 191 insert_ob_in_map (potion, map, NULL, 0);
170 192
171} 193}
172 194
195void
173void place_special_exit(mapstruct * map, int hole_type,RMParms *RP) { 196place_special_exit (maptile *map, int hole_type, RMParms * RP)
197{
174 int ix,iy,i=-1; 198 int ix, iy, i = -1;
175 char buf[HUGE_BUF], *style, *decor, *mon; 199 char buf[HUGE_BUF], *style, *decor, *mon;
176 mapstruct *exit_style=find_style("/styles/misc","obscure_exits",-1); 200 maptile *exit_style = find_style ("/styles/misc", "obscure_exits", -1);
177 int g_xsize,g_ysize; 201 int g_xsize, g_ysize;
178 202
179 object *the_exit=get_object(); 203 object *the_exit = get_object ();
204
180 if(!exit_style) return; 205 if (!exit_style)
181 206 return;
207
182 copy_object(pick_random_object(exit_style),the_exit); 208 copy_object (pick_random_object (exit_style), the_exit);
183 209
184 while(i<0) { 210 while (i < 0)
211 {
185 ix = RANDOM() % (MAP_WIDTH(map) -2) +1; 212 ix = RANDOM () % (MAP_WIDTH (map) - 2) + 1;
186 iy = RANDOM() % (MAP_HEIGHT(map) -2) +1; 213 iy = RANDOM () % (MAP_HEIGHT (map) - 2) + 1;
187 i = find_first_free_spot(the_exit,map,ix,iy); 214 i = find_first_free_spot (the_exit, map, ix, iy);
188 } 215 }
189 216
190 ix += freearr_x[i]; 217 ix += freearr_x[i];
191 iy += freearr_y[i]; 218 iy += freearr_y[i];
192 the_exit->x = ix; 219 the_exit->x = ix;
193 the_exit->y = iy; 220 the_exit->y = iy;
194 221
222 if (!hole_type)
195 if(!hole_type) hole_type = RANDOM() % NR_OF_HOLE_TYPES + 1 ; 223 hole_type = RANDOM () % NR_OF_HOLE_TYPES + 1;
196 224
197 switch(hole_type) { 225 switch (hole_type)
226 {
198 case GLORY_HOLE: /* treasures */ 227 case GLORY_HOLE: /* treasures */
199 { 228 {
200 g_xsize = RANDOM() %3 + 4 + RP->difficulty/4; 229 g_xsize = RANDOM () % 3 + 4 + RP->difficulty / 4;
201 g_ysize = RANDOM() %3 + 4 + RP->difficulty/4; 230 g_ysize = RANDOM () % 3 + 4 + RP->difficulty / 4;
202 style = "onion"; 231 style = "onion";
203 decor = "wealth2"; 232 decor = "wealth2";
204 mon = "none"; 233 mon = "none";
205 break; 234 break;
206 } 235 }
207 236
208 case ORC_ZONE: /* hole with orcs in it. */ 237 case ORC_ZONE: /* hole with orcs in it. */
209 { 238 {
210 g_xsize = RANDOM() %3 + 4 + RP->difficulty/4; 239 g_xsize = RANDOM () % 3 + 4 + RP->difficulty / 4;
211 g_ysize = RANDOM() %3 + 4 + RP->difficulty/4; 240 g_ysize = RANDOM () % 3 + 4 + RP->difficulty / 4;
212 style = "onion"; 241 style = "onion";
213 decor = "wealth2"; 242 decor = "wealth2";
214 mon = "orc"; 243 mon = "orc";
215 break; 244 break;
216 } 245 }
217 246
218 case MINING_ZONE: /* hole with orcs in it. */ 247 case MINING_ZONE: /* hole with orcs in it. */
219 { 248 {
220 g_xsize = RANDOM() %9 + 4 + RP->difficulty/4; 249 g_xsize = RANDOM () % 9 + 4 + RP->difficulty / 4;
221 g_ysize = RANDOM() %9 + 4 + RP->difficulty/4; 250 g_ysize = RANDOM () % 9 + 4 + RP->difficulty / 4;
222 style = "maze"; 251 style = "maze";
223 decor = "minerals2"; 252 decor = "minerals2";
224 mon = "none"; 253 mon = "none";
225 break; 254 break;
226 } 255 }
227 256
228 default: /* undefined */ 257 default: /* undefined */
229 LOG(llevError, "place_special_exit: undefined hole type %d\n", hole_type); 258 LOG (llevError, "place_special_exit: undefined hole type %d\n", hole_type);
230 return; 259 return;
231 break; 260 break;
232 } 261 }
233 262
234 /* Need to be at least this size, otherwise the load 263 /* Need to be at least this size, otherwise the load
235 * code will generate new size values which are too large. 264 * code will generate new size values which are too large.
236 */ 265 */
237 if (g_xsize < MIN_RANDOM_MAP_SIZE) g_xsize = MIN_RANDOM_MAP_SIZE; 266 if (g_xsize < MIN_RANDOM_MAP_SIZE)
238 if (g_ysize < MIN_RANDOM_MAP_SIZE) g_ysize = MIN_RANDOM_MAP_SIZE; 267 g_xsize = MIN_RANDOM_MAP_SIZE;
268 if (g_ysize < MIN_RANDOM_MAP_SIZE)
269 g_ysize = MIN_RANDOM_MAP_SIZE;
239 270
240 write_parameters_to_string(buf, g_xsize, g_ysize,RP->wallstyle,RP->floorstyle,mon, 271 write_parameters_to_string (buf, g_xsize, g_ysize, RP->wallstyle, RP->floorstyle, mon,
241 "none",style,decor,"none",RP->exitstyle,0,0,0, 272 "none", style, decor, "none", RP->exitstyle, 0, 0, 0,
242 OPT_WALLS_ONLY,0,0,1,RP->dungeon_level,RP->dungeon_level, 273 OPT_WALLS_ONLY, 0, 0, 1, RP->dungeon_level, RP->dungeon_level,
243 RP->difficulty,RP->difficulty,-1,1,0,0,0,0, RP->difficulty_increase); 274 RP->difficulty, RP->difficulty, -1, 1, 0, 0, 0, 0, RP->difficulty_increase);
244 the_exit->slaying = "/!"; 275 the_exit->slaying = "/!";
245 the_exit->msg = buf; 276 the_exit->msg = buf;
246 277
247 insert_ob_in_map(the_exit,map,NULL,0); 278 insert_ob_in_map (the_exit, map, NULL, 0);
248} 279}
249 280
250 281
282void
251void place_specials_in_map(mapstruct *map, char **layout,RMParms *RP) { 283place_specials_in_map (maptile *map, char **layout, RMParms * RP)
284{
252 mapstruct *special_map; 285 maptile *special_map;
253 int ix,iy; /* map insertion locatons */ 286 int ix, iy; /* map insertion locatons */
254 int special_type; /* type of special to make */ 287 int special_type; /* type of special to make */
255 288
256 289
257 special_type = RANDOM() % NUM_OF_SPECIAL_TYPES; 290 special_type = RANDOM () % NUM_OF_SPECIAL_TYPES;
258 switch(special_type) { 291 switch (special_type)
292 {
259 293
260 /* includes a special map into the random map being made. */ 294 /* includes a special map into the random map being made. */
261 case SPECIAL_SUBMAP: { 295 case SPECIAL_SUBMAP:
296 {
262 special_map = find_style("/styles/specialmaps",0,RP->difficulty); 297 special_map = find_style ("/styles/specialmaps", 0, RP->difficulty);
263 if(special_map==NULL) return; 298 if (special_map == NULL)
264 299 return;
300
265 if(find_spot_for_submap(map,layout,&ix,&iy,MAP_WIDTH(special_map),MAP_HEIGHT(special_map))) 301 if (find_spot_for_submap (map, layout, &ix, &iy, MAP_WIDTH (special_map), MAP_HEIGHT (special_map)))
266 include_map_in_map(map,special_map,ix,iy); 302 include_map_in_map (map, special_map, ix, iy);
267 break; 303 break;
268 } 304 }
269 305
270 /* Make a special fountain: an unpickable potion disguised as 306 /* Make a special fountain: an unpickable potion disguised as
271 a fountain, or rather, colocated with a fountain. */ 307 a fountain, or rather, colocated with a fountain. */
272 case SPECIAL_FOUNTAIN: { 308 case SPECIAL_FOUNTAIN:
309 {
273 place_fountain_with_specials(map); 310 place_fountain_with_specials (map);
274 break; 311 break;
275 } 312 }
276 313
277 /* Make an exit to another random map, e.g. a gloryhole. */ 314 /* Make an exit to another random map, e.g. a gloryhole. */
278 case SPECIAL_EXIT: { 315 case SPECIAL_EXIT:
316 {
279 place_special_exit(map,0,RP); 317 place_special_exit (map, 0, RP);
280 break; 318 break;
319 }
281 } 320 }
282 } 321
283
284} 322}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines