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

Comparing deliantra/server/random_maps/exit.C (file contents):
Revision 1.16 by root, Sun Dec 31 19:02:24 2006 UTC vs.
Revision 1.17 by root, Sun Dec 31 20:46:17 2006 UTC

123 maptile *style_map_down = 0; /* harder maze */ 123 maptile *style_map_down = 0; /* harder maze */
124 maptile *style_map_up = 0; /* easier maze */ 124 maptile *style_map_up = 0; /* easier maze */
125 object *the_exit_down; /* harder maze */ 125 object *the_exit_down; /* harder maze */
126 object *the_exit_up; /* easier maze */ 126 object *the_exit_up; /* easier maze */
127 object *random_sign; /* magic mouth saying this is a random map. */ 127 object *random_sign; /* magic mouth saying this is a random map. */
128 char buf[512];
129 int cx = -1, cy = -1; /* location of a map center */ 128 int cx = -1, cy = -1; /* location of a map center */
130 int upx = -1, upy = -1; /* location of up exit */ 129 int upx = -1, upy = -1; /* location of up exit */
131 int downx = -1, downy = -1; 130 int downx = -1, downy = -1;
132 int final_map_exit = 1; 131 int final_map_exit = 1;
133 132
194 the_exit_down = 0; 193 the_exit_down = 0;
195 194
196 /* set up the up exit */ 195 /* set up the up exit */
197 the_exit_up->stats.hp = RP->origin_x; 196 the_exit_up->stats.hp = RP->origin_x;
198 the_exit_up->stats.sp = RP->origin_y; 197 the_exit_up->stats.sp = RP->origin_y;
199 the_exit_up->slaying = RP->origin_map; 198 the_exit_up->slaying = RP->origin_map;
200 199
201 /* figure out where to put the entrance */ 200 /* figure out where to put the entrance */
202 /* begin a logical block */ 201 /* begin a logical block */
203 { 202 {
204 int i, j;
205
206 /* First, look for a '<' char */ 203 /* First, look for a '<' char */
207 find_in_layout (0, '<', &upx, &upy, maze, RP); 204 find_in_layout (0, '<', &upx, &upy, maze, RP);
208 205
209 /* next, look for a C, the map center. */ 206 /* next, look for a C, the map center. */
210 find_in_layout (0, 'C', &cx, &cy, maze, RP); 207 find_in_layout (0, 'C', &cx, &cy, maze, RP);
211 208
212
213 /* if we didn't find an up, find an empty place far from the center */ 209 /* if we didn't find an up, find an empty place far from the center */
214 if (upx == -1 && cx != -1) 210 if (upx == -1 && cx != -1)
215 { 211 {
216 if (cx > RP->Xsize / 2) 212 if (cx > RP->Xsize / 2)
217 upx = 1; 213 upx = 1;
218 else 214 else
219 upx = RP->Xsize - 2; 215 upx = RP->Xsize - 2;
216
220 if (cy > RP->Ysize / 2) 217 if (cy > RP->Ysize / 2)
221 upy = 1; 218 upy = 1;
222 else 219 else
223 upy = RP->Ysize - 2; 220 upy = RP->Ysize - 2;
221
224 /* find an empty place far from the center */ 222 /* find an empty place far from the center */
225 if (upx == 1 && upy == 1) 223 if (upx == 1 && upy == 1)
226 find_in_layout (1, 0, &upx, &upy, maze, RP); 224 find_in_layout (1, 0, &upx, &upy, maze, RP);
227 else if (upx == 1 && upy > 1) 225 else if (upx == 1 && upy > 1)
228 find_in_layout (3, 0, &upx, &upy, maze, RP); 226 find_in_layout (3, 0, &upx, &upy, maze, RP);
238 236
239 the_exit_up->x = upx; 237 the_exit_up->x = upx;
240 the_exit_up->y = upy; 238 the_exit_up->y = upy;
241 239
242 /* surround the exits with notices that this is a random map. */ 240 /* surround the exits with notices that this is a random map. */
243 for (j = 1; j < 9; j++) 241 for (int j = 1; j < 9; j++)
244 { 242 {
245 if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j])) 243 if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j]))
246 { 244 {
247 random_sign = get_archetype ("sign"); 245 random_sign = get_archetype ("sign");
248 random_sign->x = the_exit_up->x + freearr_x[j]; 246 random_sign->x = the_exit_up->x + freearr_x[j];
249 random_sign->y = the_exit_up->y + freearr_y[j]; 247 random_sign->y = the_exit_up->y + freearr_y[j];
250 248
249 char buf[8192];
251 sprintf (buf, "This is a random map.\nLevel: %d\n", (RP->dungeon_level) - 1); 250 sprintf (buf, "This is a random map.\nLevel: %d\n", (RP->dungeon_level) - 1);
252 251
253 random_sign->msg = buf; 252 random_sign->msg = buf;
254 insert_ob_in_map (random_sign, map, NULL, 0); 253 insert_ob_in_map (random_sign, map, NULL, 0);
255 } 254 }
256 } 255 }
256
257 /* Block the exit so things don't get dumped on top of it. */ 257 /* Block the exit so things don't get dumped on top of it. */
258 the_exit_up->move_block = MOVE_ALL; 258 the_exit_up->move_block = MOVE_ALL;
259 259
260 insert_ob_in_map (the_exit_up, map, NULL, 0); 260 insert_ob_in_map (the_exit_up, map, NULL, 0);
261 maze[the_exit_up->x][the_exit_up->y] = '<'; 261 maze[the_exit_up->x][the_exit_up->y] = '<';
279 { 279 {
280 if (upx > RP->Xsize / 2) 280 if (upx > RP->Xsize / 2)
281 downx = 1; 281 downx = 1;
282 else 282 else
283 downx = RP->Xsize - 2; 283 downx = RP->Xsize - 2;
284
284 if (upy > RP->Ysize / 2) 285 if (upy > RP->Ysize / 2)
285 downy = 1; 286 downy = 1;
286 else 287 else
287 downy = RP->Ysize - 2; 288 downy = RP->Ysize - 2;
289
288 /* find an empty place far from the entrance */ 290 /* find an empty place far from the entrance */
289 if (downx == 1 && downy == 1) 291 if (downx == 1 && downy == 1)
290 find_in_layout (1, 0, &downx, &downy, maze, RP); 292 find_in_layout (1, 0, &downx, &downy, maze, RP);
291 else if (downx == 1 && downy > 1) 293 else if (downx == 1 && downy > 1)
292 find_in_layout (3, 0, &downx, &downy, maze, RP); 294 find_in_layout (3, 0, &downx, &downy, maze, RP);
293 else if (downx > 1 && downy == 1) 295 else if (downx > 1 && downy == 1)
294 find_in_layout (2, 0, &downx, &downy, maze, RP); 296 find_in_layout (2, 0, &downx, &downy, maze, RP);
295 else if (downx > 1 && downy > 1) 297 else if (downx > 1 && downy > 1)
296 find_in_layout (4, 0, &downx, &downy, maze, RP); 298 find_in_layout (4, 0, &downx, &downy, maze, RP);
297
298 } 299 }
300
299 /* no indication of where to place the down exit, so just place it */ 301 /* no indication of where to place the down exit, so just place it */
300 if (downx == -1) 302 if (downx == -1)
301 find_in_layout (0, 0, &downx, &downy, maze, RP); 303 find_in_layout (0, 0, &downx, &downy, maze, RP);
302 304
303 if (the_exit_down) 305 if (the_exit_down)
304 { 306 {
305 char buf[2048]; 307 char buf[8192];
306 308
307 i = find_first_free_spot (the_exit_down, map, downx, downy); 309 int i = find_first_free_spot (the_exit_down, map, downx, downy);
308 the_exit_down->x = downx + freearr_x[i]; 310 the_exit_down->x = downx + freearr_x[i];
309 the_exit_down->y = downy + freearr_y[i]; 311 the_exit_down->y = downy + freearr_y[i];
310 RP->origin_x = the_exit_down->x; 312 RP->origin_x = the_exit_down->x;
311 RP->origin_y = the_exit_down->y; 313 RP->origin_y = the_exit_down->y;
312 write_map_parameters_to_string (buf, RP); 314 write_map_parameters_to_string (buf, RP);
314 316
315 /* the identifier for making a random map. */ 317 /* the identifier for making a random map. */
316 if (RP->dungeon_level >= RP->dungeon_depth && *RP->final_map) 318 if (RP->dungeon_level >= RP->dungeon_depth && *RP->final_map)
317 { 319 {
318 maptile *new_map; 320 maptile *new_map;
319 object *the_exit_back = arch_to_object (the_exit_up->arch), *tmp; 321 object *the_exit_back = arch_to_object (the_exit_up->arch);
320 322
321 /* load it */ 323 /* load it */
322 if (!(new_map = maptile::load_map_sync (RP->final_map))) 324 if (!(new_map = maptile::load_map_sync (RP->final_map)))
323 return; 325 return;
324 326
325 the_exit_down->slaying = RP->final_map; 327 the_exit_down->slaying = RP->final_map;
326 328
327 for (tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above) 329 for (object *tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above)
328 /* Remove exit back to previous random map. There should only be one 330 /* Remove exit back to previous random map. There should only be one
329 * which is why we break out. To try to process more than one 331 * which is why we break out. To try to process more than one
330 * would require keeping a 'next' pointer, ad free_object kills tmp, which 332 * would require keeping a 'next' pointer, ad free_object kills tmp, which
331 * breaks the for loop. 333 * breaks the for loop.
332 */ 334 */
333 if (tmp->type == EXIT && EXIT_PATH (tmp) && !strncmp (EXIT_PATH (tmp), "/random/", 8)) 335 if (tmp->type == EXIT && EXIT_PATH (tmp) && !strncmp (EXIT_PATH (tmp), "?random/", 8))
334 { 336 {
335 tmp->destroy (); 337 tmp->destroy ();
336 break; 338 break;
337 } 339 }
338 340
355 the_exit_down->move_block = MOVE_ALL; 357 the_exit_down->move_block = MOVE_ALL;
356 insert_ob_in_map (the_exit_down, map, NULL, 0); 358 insert_ob_in_map (the_exit_down, map, NULL, 0);
357 maze[the_exit_down->x][the_exit_down->y] = '>'; 359 maze[the_exit_down->x][the_exit_down->y] = '>';
358 } 360 }
359 } 361 }
360
361} 362}
362 363
363/* this function unblocks the exits. We blocked them to 364/* this function unblocks the exits. We blocked them to
364 keep things from being dumped on them during the other 365 keep things from being dumped on them during the other
365 phases of random map generation. */ 366 phases of random map generation. */
381 update_object (walk, UP_OBJ_CHANGE); 382 update_object (walk, UP_OBJ_CHANGE);
382 } 383 }
383 } 384 }
384 } 385 }
385} 386}
387

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines