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.17 by root, Sun Dec 31 20:46:17 2006 UTC vs.
Revision 1.29 by root, Fri Apr 11 21:09:53 2008 UTC

1
2/* 1/*
3 CrossFire, A Multiplayer game for X-windows 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
4 3 *
4 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 Copyright (C) 2001 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2001,2007 Mark Wedel & Crossfire Development Team
6 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 7 *
8 This program is free software; you can redistribute it and/or modify 8 * Deliantra is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version. 11 * (at your 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 GNU General Public License 18 * You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 *
21 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 The authors can be reached via e-mail at <crossfire@schmorp.de>
23*/ 22 */
24 23
25#include <global.h> 24#include <global.h>
26#include <random_map.h> 25#include <random_map.h>
27#include <sproto.h> 26#include <sproto.h>
28#include <rproto.h> 27#include <rproto.h>
38 *fx = -1; 37 *fx = -1;
39 *fy = -1; 38 *fy = -1;
40 39
41 /* if a starting point isn't given, pick one */ 40 /* if a starting point isn't given, pick one */
42 if (mode < 1 || mode > 4) 41 if (mode < 1 || mode > 4)
43 M = RANDOM () % 4 + 1; 42 M = rndm (4) + 1;
44 else 43 else
45 M = mode; 44 M = mode;
46 45
47 /* four different search starting points and methods so that 46 /* four different search starting points and methods so that
48 we can do something different for symmetrical maps instead of 47 we can do something different for symmetrical maps instead of
117 6 means southward 116 6 means southward
118*/ 117*/
119void 118void
120place_exits (maptile *map, char **maze, char *exitstyle, int orientation, random_map_params *RP) 119place_exits (maptile *map, char **maze, char *exitstyle, int orientation, random_map_params *RP)
121{ 120{
122 char styledirname[256]; 121 char styledirname[1024];
123 maptile *style_map_down = 0; /* harder maze */ 122 maptile *style_map_down = 0; /* harder maze */
124 maptile *style_map_up = 0; /* easier maze */ 123 maptile *style_map_up = 0; /* easier maze */
125 object *the_exit_down; /* harder maze */ 124 object *the_exit_down; /* harder maze */
126 object *the_exit_up; /* easier maze */ 125 object *the_exit_up; /* easier maze */
127 object *random_sign; /* magic mouth saying this is a random map. */ 126 object *random_sign; /* magic mouth saying this is a random map. */
133 if (RP->exit_on_final_map) 132 if (RP->exit_on_final_map)
134 if (strstr (RP->exit_on_final_map, "no")) 133 if (strstr (RP->exit_on_final_map, "no"))
135 final_map_exit = 0; 134 final_map_exit = 0;
136 135
137 if (!orientation) 136 if (!orientation)
138 orientation = RANDOM () % 6 + 1; 137 orientation = rndm (6) + 1;
139 138
140 switch (orientation) 139 switch (orientation)
141 { 140 {
142 case 1: 141 case 1:
143 { 142 {
171 170
172 else 171 else
173 { 172 {
174 object *tmp; 173 object *tmp;
175 174
176 tmp = pick_random_object (style_map_up); 175 tmp = style_map_up->pick_random_object ();
177 the_exit_up = arch_to_object (tmp->arch); 176 the_exit_up = arch_to_object (tmp->arch);
178 } 177 }
179 178
180 /* we need a down exit only if we're recursing. */ 179 /* we need a down exit only if we're recursing. */
181 if (RP->dungeon_level < RP->dungeon_depth || RP->final_map[0] != 0) 180 if (RP->dungeon_level < RP->dungeon_depth || RP->final_map[0] != 0)
184 183
185 else 184 else
186 { 185 {
187 object *tmp; 186 object *tmp;
188 187
189 tmp = pick_random_object (style_map_down); 188 tmp = style_map_down->pick_random_object ();
190 the_exit_down = arch_to_object (tmp->arch); 189 the_exit_down = arch_to_object (tmp->arch);
191 } 190 }
192 else 191 else
193 the_exit_down = 0; 192 the_exit_down = 0;
194 193
302 if (downx == -1) 301 if (downx == -1)
303 find_in_layout (0, 0, &downx, &downy, maze, RP); 302 find_in_layout (0, 0, &downx, &downy, maze, RP);
304 303
305 if (the_exit_down) 304 if (the_exit_down)
306 { 305 {
307 char buf[8192]; 306 char buf[16384];
308 307
309 int i = find_first_free_spot (the_exit_down, map, downx, downy); 308 int i = find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1);
310 the_exit_down->x = downx + freearr_x[i]; 309 the_exit_down->x = downx + freearr_x[i];
311 the_exit_down->y = downy + freearr_y[i]; 310 the_exit_down->y = downy + freearr_y[i];
312 RP->origin_x = the_exit_down->x; 311 RP->origin_x = the_exit_down->x;
313 RP->origin_y = the_exit_down->y; 312 RP->origin_y = the_exit_down->y;
314 write_map_parameters_to_string (buf, RP); 313 write_map_parameters_to_string (buf, RP);
319 { 318 {
320 maptile *new_map; 319 maptile *new_map;
321 object *the_exit_back = arch_to_object (the_exit_up->arch); 320 object *the_exit_back = arch_to_object (the_exit_up->arch);
322 321
323 /* load it */ 322 /* load it */
324 if (!(new_map = maptile::load_map_sync (RP->final_map))) 323 if (!(new_map = maptile::find_sync (RP->final_map)))
325 return; 324 return;
325
326 new_map->load_sync ();
326 327
327 the_exit_down->slaying = RP->final_map; 328 the_exit_down->slaying = RP->final_map;
328 329
329 for (object *tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above) 330 for (object *tmp = new_map->at (new_map->enter_x, new_map->enter_y).bot; tmp; tmp = tmp->above)
330 /* Remove exit back to previous random map. There should only be one 331 /* Remove exit back to previous random map. There should only be one
376 { 377 {
377 for (walk = GET_MAP_OB (map, i, j); walk != NULL; walk = walk->above) 378 for (walk = GET_MAP_OB (map, i, j); walk != NULL; walk = walk->above)
378 { 379 {
379 if (walk->move_block == MOVE_ALL && walk->type != LOCKED_DOOR) 380 if (walk->move_block == MOVE_ALL && walk->type != LOCKED_DOOR)
380 { 381 {
381 walk->move_block = MOVE_BLOCK_DEFAULT; 382 walk->move_block = 0;
382 update_object (walk, UP_OBJ_CHANGE); 383 update_object (walk, UP_OBJ_CHANGE);
383 } 384 }
384 } 385 }
385 } 386 }
386} 387}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines