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.48 by root, Sun Jul 4 22:12:26 2010 UTC vs.
Revision 1.57 by root, Sat Nov 17 23:40:02 2018 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2017,2018 Marc Alexander Lehmann / the Deliantra team
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 5 * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2001 Mark Wedel & Crossfire Development Team 6 * Copyright (©) 2001 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen 7 * Copyright (©) 1992 Frank Tore Johansen
7 * 8 *
8 * Deliantra is free software: you can redistribute it and/or modify it under 9 * 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 * 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 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version. 12 * option) any later version.
12 * 13 *
13 * This program is distributed in the hope that it will be useful, 14 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details. 17 * GNU General Public License for more details.
17 * 18 *
18 * You should have received a copy of the Affero GNU General Public License 19 * 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 * and the GNU General Public License along with this program. If not, see
20 * <http://www.gnu.org/licenses/>. 21 * <http://www.gnu.org/licenses/>.
21 * 22 *
22 * The authors can be reached via e-mail to <support@deliantra.net> 23 * The authors can be reached via e-mail to <support@deliantra.net>
23 */ 24 */
24 25
25#include <global.h> 26#include <global.h>
26#include <random_map.h> 27#include <rmg.h>
27#include <sproto.h> 28#include <sproto.h>
28#include <rproto.h> 29#include <rproto.h>
29 30
30/* find a character in the maze. fx and fy are pointers to 31/* find a character in the maze. fx and fy are pointers to
31 where to find the char. fx,fy = -1 if not found. */ 32 where to find the char. fx,fy = -1 if not found. */
76 } 77 }
77 } 78 }
78 break; 79 break;
79 80
80 case 3: 81 case 3:
82 /* search from bottom-right up-left */
83 for (i = maze.w - 2; i > 0; i--)
84 for (j = maze.h - 2; j > 0; j--)
85 {
86 if (maze[i][j] == target)
87 {
88 fx = i;
89 fy = j;
90 return;
91 }
92 }
93 break;
94
95 case 4:
81 /* search from bottom-left up-right */ 96 /* search from bottom-left up-right */
82 for (i = 1; i < maze.w - 1; i++) 97 for (i = 1; i < maze.w - 1; i++)
83 for (j = maze.h - 2; j > 0; j--) 98 for (j = maze.h - 2; j > 0; j--)
84 { 99 {
85 if (maze[i][j] == target) 100 if (maze[i][j] == target)
88 fy = j; 103 fy = j;
89 return; 104 return;
90 } 105 }
91 } 106 }
92 break; 107 break;
93
94 case 4:
95 /* search from bottom-right up-left */
96 for (i = maze.w - 2; i > 0; i--)
97 for (j = maze.h - 2; j > 0; j--)
98 {
99 if (maze[i][j] == target)
100 {
101 fx = i;
102 fy = j;
103 return;
104 }
105 }
106 break;
107 } 108 }
109}
110
111point
112layout::find (char target, int mode)
113{
114 int x, y;
115
116 find_in_layout (mode, target, x, y, *this);
117
118 return point (x, y);
108} 119}
109 120
110/* orientation: 0 means random, 121/* orientation: 0 means random,
111 1 means descending dungeon 122 1 means descending dungeon
112 2 means ascending dungeon 123 2 means ascending dungeon
198 upy = 1; 209 upy = 1;
199 else 210 else
200 upy = RP->Ysize - 2; 211 upy = RP->Ysize - 2;
201 212
202 /* find an empty place far from the center */ 213 /* find an empty place far from the center */
203 if (upx == 1 && upy == 1)
204 find_in_layout (1, 0, upx, upy, maze); 214 if (upx == 1 && upy == 1) find_in_layout (1, 0, upx, upy, maze);
205 else if (upx == 1 && upy > 1)
206 find_in_layout (3, 0, upx, upy, maze);
207 else if (upx > 1 && upy == 1)
208 find_in_layout (2, 0, upx, upy, maze); 215 else if (upx > 1 && upy == 1) find_in_layout (2, 0, upx, upy, maze);
209 else if (upx > 1 && upy > 1) 216 else if (upx > 1 && upy > 1) find_in_layout (3, 0, upx, upy, maze);
210 find_in_layout (4, 0, upx, upy, maze); 217 else if (upx == 1 && upy > 1) find_in_layout (4, 0, upx, upy, maze);
211 } 218 }
212 219
213 /* no indication of where to place the exit, so just place it. */ 220 /* no indication of where to place the exit, so just place it. */
214 if (upx == -1) 221 if (upx == -1)
215 find_in_layout (0, 0, upx, upy, maze); 222 find_in_layout (0, 0, upx, upy, maze);
217 the_exit_up->x = upx; 224 the_exit_up->x = upx;
218 the_exit_up->y = upy; 225 the_exit_up->y = upy;
219 226
220 /* surround the exits with notices that this is a random map. */ 227 /* surround the exits with notices that this is a random map. */
221 for (int j = 1; j < 9; j++) 228 for (int j = 1; j < 9; j++)
222 if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j])) 229 if (!wall_blocked (map, the_exit_up->x + DIRX (j), the_exit_up->y + DIRY (j)))
223 { 230 {
224 object *random_sign = archetype::get (shstr_sign); 231 object *random_sign = archetype::get (shstr_sign);
225 random_sign->msg = format ("This is a random map.\nLevel: %d of %d.\n", RP->dungeon_level - 1, RP->dungeon_depth); 232 random_sign->msg = format ("This is a random map.\nLevel: %d of %d.\n", RP->dungeon_level - 1, RP->dungeon_depth);
226 map->insert (random_sign, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j], 0, 0); 233 map->insert (random_sign, the_exit_up->x + DIRX (j), the_exit_up->y + DIRY (j), 0, 0);
227 } 234 }
228 235
229 /* Block the exit so things don't get dumped on top of it. */ 236 /* Block the exit so things don't get dumped on top of it. */
230 the_exit_up->move_block = MOVE_ALL; 237 the_exit_up->move_block = MOVE_ALL;
231 238
259 downy = 1; 266 downy = 1;
260 else 267 else
261 downy = RP->Ysize - 2; 268 downy = RP->Ysize - 2;
262 269
263 /* find an empty place far from the entrance */ 270 /* find an empty place far from the entrance */
264 if (downx == 1 && downy == 1) 271 if (downx == 1 && downy == 1) find_in_layout (1, 0, downx, downy, maze);
265 find_in_layout (1, 0, downx, downy, maze); 272 else if (downx > 1 && downy == 1) find_in_layout (2, 0, downx, downy, maze);
266 else if (downx == 1 && downy > 1) 273 else if (downx > 1 && downy > 1) find_in_layout (3, 0, downx, downy, maze);
267 find_in_layout (3, 0, downx, downy, maze); 274 else if (downx == 1 && downy > 1) find_in_layout (4, 0, downx, downy, maze);
268 else if (downx > 1 && downy == 1)
269 find_in_layout (2, 0, downx, downy, maze);
270 else if (downx > 1 && downy > 1)
271 find_in_layout (4, 0, downx, downy, maze);
272 } 275 }
273 276
274 /* no indication of where to place the down exit, so just place it */ 277 /* no indication of where to place the down exit, so just place it */
275 if (downx == -1) 278 if (downx == -1)
276 find_in_layout (0, 0, downx, downy, maze); 279 find_in_layout (0, 0, downx, downy, maze);
277 280
278 if (the_exit_down) 281 if (the_exit_down)
279 { 282 {
280 int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1); 283 int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1);
284
281 the_exit_down->x = downx + freearr_x[i]; 285 the_exit_down->x = downx + DIRX (i);
282 the_exit_down->y = downy + freearr_y[i]; 286 the_exit_down->y = downy + DIRY (i);
287
283 RP->set ("origin_x", (IV)the_exit_down->x); 288 RP->set ("origin_x", (IV)the_exit_down->x);
284 RP->set ("origin_y", (IV)the_exit_down->y); 289 RP->set ("origin_y", (IV)the_exit_down->y);
285 290
286 the_exit_down->msg = RP->as_shstr (); 291 the_exit_down->msg = RP->as_shstr ();
292 the_exit_down->slaying = shstr_random_map_exit;
287 293
288 /* the identifier for making a random map. */ 294 /* the identifier for making a random map. */
289 if (RP->dungeon_level >= RP->dungeon_depth && final_map) 295 if (RP->dungeon_level >= RP->dungeon_depth && final_map)
290 { 296 {
291 maptile *new_map; 297 the_exit_down->msg = 0;
292 object *the_exit_back = the_exit_up->arch->instance ();
293
294 /* load it */
295 if (!(new_map = maptile::find_sync (final_map)))
296 return;
297
298 new_map->load_sync ();
299
300 the_exit_down->slaying = final_map; 298 the_exit_down->slaying = final_map;
301 299
302 for (object *tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above)
303 /* Remove exit back to previous random map. There should only be one
304 * which is why we break out. To try to process more than one
305 * would require keeping a 'next' pointer, ad free_object kills tmp, which
306 * breaks the for loop.
307 */
308 if (tmp->type == EXIT && EXIT_PATH (tmp).starts_with ("?random/"))
309 {
310 tmp->destroy ();
311 break;
312 }
313
314 if (final_map_exit) 300 if (final_map_exit)
301 if (maptile *new_map = maptile::find_sync (final_map))
315 { 302 {
303 object *the_exit_back = the_exit_up->arch->instance ();
304
305 new_map->load_sync ();
306
307 for (object *tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above)
308 /* Remove exit back to previous random map. There should only be one
309 * which is why we break out. To try to process more than one
310 * would require keeping a 'next' pointer, ad free_object kills tmp, which
311 * breaks the for loop.
312 */
313 if (tmp->type == EXIT && EXIT_PATH (tmp).starts_with ("?random/"))
314 {
315 tmp->destroy ();
316 break;
317 }
318
316 /* setup the exit back */ 319 /* setup the exit back */
317 the_exit_back->slaying = map->path; 320 the_exit_back->slaying = map->path;
318 the_exit_back->stats.hp = the_exit_down->x; 321 the_exit_back->stats.hp = the_exit_down->x;
319 the_exit_back->stats.sp = the_exit_down->y; 322 the_exit_back->stats.sp = the_exit_down->y;
320 the_exit_back->x = new_map->enter_x; 323 the_exit_back->x = new_map->enter_x;
321 the_exit_back->y = new_map->enter_y; 324 the_exit_back->y = new_map->enter_y;
322 325
323 insert_ob_in_map (the_exit_back, new_map, NULL, 0); 326 insert_ob_in_map (the_exit_back, new_map, NULL, 0);
324 } 327 }
325 } 328 }
326 else
327 the_exit_down->slaying = shstr_random_map_exit;
328 329
329 /* Block the exit so things don't get dumped on top of it. */ 330 /* Block the exit so things don't get dumped on top of it. */
330 the_exit_down->move_block = MOVE_ALL; 331 the_exit_down->move_block = MOVE_ALL;
331 insert_ob_in_map (the_exit_down, map, NULL, 0); 332 insert_ob_in_map (the_exit_down, map, NULL, 0);
332 maze[the_exit_down->x][the_exit_down->y] = '>'; 333 maze[the_exit_down->x][the_exit_down->y] = '>';

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines