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 (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team |
4 | * 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 |
5 | * Copyright (©) 2001 Mark Wedel & Crossfire Development Team |
6 | * Copyright (©) 1992 Frank Tore Johansen |
6 | * Copyright (©) 1992 Frank Tore Johansen |
7 | * |
7 | * |
8 | * Deliantra is free software: you can redistribute it and/or modify it under |
8 | * 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 |
9 | * 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 |
10 | * Free Software Foundation, either version 3 of the License, or (at your |
11 | * option) any later version. |
11 | * option) any later version. |
12 | * |
12 | * |
13 | * 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, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. |
16 | * GNU General Public License for more details. |
17 | * |
17 | * |
18 | * You should have received a copy of the Affero GNU General Public License |
18 | * 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 |
19 | * and the GNU General Public License along with this program. If not, see |
20 | * <http://www.gnu.org/licenses/>. |
20 | * <http://www.gnu.org/licenses/>. |
21 | * |
21 | * |
22 | * The authors can be reached via e-mail to <support@deliantra.net> |
22 | * The authors can be reached via e-mail to <support@deliantra.net> |
23 | */ |
23 | */ |
24 | |
24 | |
25 | #include <global.h> |
25 | #include <global.h> |
26 | #include <random_map.h> |
26 | #include <rmg.h> |
27 | #include <sproto.h> |
27 | #include <sproto.h> |
28 | #include <rproto.h> |
28 | #include <rproto.h> |
29 | |
29 | |
30 | /* find a character in the maze. fx and fy are pointers to |
30 | /* find a character in the maze. fx and fy are pointers to |
31 | where to find the char. fx,fy = -1 if not found. */ |
31 | where to find the char. fx,fy = -1 if not found. */ |
… | |
… | |
209 | else |
209 | else |
210 | upy = RP->Ysize - 2; |
210 | upy = RP->Ysize - 2; |
211 | |
211 | |
212 | /* find an empty place far from the center */ |
212 | /* find an empty place far from the center */ |
213 | if (upx == 1 && upy == 1) find_in_layout (1, 0, upx, upy, maze); |
213 | if (upx == 1 && upy == 1) find_in_layout (1, 0, upx, upy, maze); |
214 | else if (upx == 1 && upy > 1) find_in_layout (4, 0, upx, upy, maze); |
|
|
215 | else if (upx > 1 && upy == 1) find_in_layout (2, 0, upx, upy, maze); |
214 | else if (upx > 1 && upy == 1) find_in_layout (2, 0, upx, upy, maze); |
216 | else if (upx > 1 && upy > 1) find_in_layout (3, 0, upx, upy, maze); |
215 | else if (upx > 1 && upy > 1) find_in_layout (3, 0, upx, upy, maze); |
|
|
216 | else if (upx == 1 && upy > 1) find_in_layout (4, 0, upx, upy, maze); |
217 | } |
217 | } |
218 | |
218 | |
219 | /* no indication of where to place the exit, so just place it. */ |
219 | /* no indication of where to place the exit, so just place it. */ |
220 | if (upx == -1) |
220 | if (upx == -1) |
221 | find_in_layout (0, 0, upx, upy, maze); |
221 | find_in_layout (0, 0, upx, upy, maze); |
… | |
… | |
223 | the_exit_up->x = upx; |
223 | the_exit_up->x = upx; |
224 | the_exit_up->y = upy; |
224 | the_exit_up->y = upy; |
225 | |
225 | |
226 | /* surround the exits with notices that this is a random map. */ |
226 | /* surround the exits with notices that this is a random map. */ |
227 | for (int j = 1; j < 9; j++) |
227 | for (int j = 1; j < 9; j++) |
228 | if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j])) |
228 | if (!wall_blocked (map, the_exit_up->x + DIRX (j), the_exit_up->y + DIRY (j))) |
229 | { |
229 | { |
230 | object *random_sign = archetype::get (shstr_sign); |
230 | object *random_sign = archetype::get (shstr_sign); |
231 | random_sign->msg = format ("This is a random map.\nLevel: %d of %d.\n", RP->dungeon_level - 1, RP->dungeon_depth); |
231 | random_sign->msg = format ("This is a random map.\nLevel: %d of %d.\n", RP->dungeon_level - 1, RP->dungeon_depth); |
232 | map->insert (random_sign, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j], 0, 0); |
232 | map->insert (random_sign, the_exit_up->x + DIRX (j), the_exit_up->y + DIRY (j), 0, 0); |
233 | } |
233 | } |
234 | |
234 | |
235 | /* Block the exit so things don't get dumped on top of it. */ |
235 | /* Block the exit so things don't get dumped on top of it. */ |
236 | the_exit_up->move_block = MOVE_ALL; |
236 | the_exit_up->move_block = MOVE_ALL; |
237 | |
237 | |
… | |
… | |
266 | else |
266 | else |
267 | downy = RP->Ysize - 2; |
267 | downy = RP->Ysize - 2; |
268 | |
268 | |
269 | /* find an empty place far from the entrance */ |
269 | /* find an empty place far from the entrance */ |
270 | if (downx == 1 && downy == 1) find_in_layout (1, 0, downx, downy, maze); |
270 | if (downx == 1 && downy == 1) find_in_layout (1, 0, downx, downy, maze); |
271 | else if (downx == 1 && downy > 1) find_in_layout (4, 0, downx, downy, maze); |
|
|
272 | else if (downx > 1 && downy == 1) find_in_layout (2, 0, downx, downy, maze); |
271 | else if (downx > 1 && downy == 1) find_in_layout (2, 0, downx, downy, maze); |
273 | else if (downx > 1 && downy > 1) find_in_layout (3, 0, downx, downy, maze); |
272 | else if (downx > 1 && downy > 1) find_in_layout (3, 0, downx, downy, maze); |
|
|
273 | else if (downx == 1 && downy > 1) find_in_layout (4, 0, downx, downy, maze); |
274 | } |
274 | } |
275 | |
275 | |
276 | /* no indication of where to place the down exit, so just place it */ |
276 | /* no indication of where to place the down exit, so just place it */ |
277 | if (downx == -1) |
277 | if (downx == -1) |
278 | find_in_layout (0, 0, downx, downy, maze); |
278 | find_in_layout (0, 0, downx, downy, maze); |
279 | |
279 | |
280 | if (the_exit_down) |
280 | if (the_exit_down) |
281 | { |
281 | { |
282 | int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1); |
282 | int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1); |
283 | |
283 | |
284 | the_exit_down->x = downx + freearr_x[i]; |
284 | the_exit_down->x = downx + DIRX (i); |
285 | the_exit_down->y = downy + freearr_y[i]; |
285 | the_exit_down->y = downy + DIRY (i); |
286 | |
286 | |
287 | RP->set ("origin_x", (IV)the_exit_down->x); |
287 | RP->set ("origin_x", (IV)the_exit_down->x); |
288 | RP->set ("origin_y", (IV)the_exit_down->y); |
288 | RP->set ("origin_y", (IV)the_exit_down->y); |
289 | |
289 | |
290 | the_exit_down->msg = RP->as_shstr (); |
290 | the_exit_down->msg = RP->as_shstr (); |