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.46 by root, Sat Jul 3 01:12:44 2010 UTC vs.
Revision 1.48 by root, Sun Jul 4 22:12:26 2010 UTC

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. */
32static void 32static void
33find_in_layout (int mode, char target, int *fx, int *fy, char **maze, random_map_params *RP) 33find_in_layout (int mode, char target, int &fx, int &fy, layout &maze)
34{ 34{
35 int M; 35 int M;
36 int i, j; 36 int i, j;
37 37
38 *fx = -1; 38 fx = -1;
39 *fy = -1; 39 fy = -1;
40 40
41 /* if a starting point isn't given, pick one */ 41 /* if a starting point isn't given, pick one */
42 if (mode < 1 || mode > 4) 42 if (mode < 1 || mode > 4)
43 M = rmg_rndm (4) + 1; 43 M = rmg_rndm (4) + 1;
44 else 44 else
49 the same damned thing every time. */ 49 the same damned thing every time. */
50 switch (M) 50 switch (M)
51 { 51 {
52 case 1: 52 case 1:
53 /* search from top left down/right */ 53 /* search from top left down/right */
54 for (i = 1; i < RP->Xsize; i++) 54 for (i = 1; i < maze.w; i++)
55 for (j = 1; j < RP->Ysize; j++) 55 for (j = 1; j < maze.h; j++)
56 { 56 {
57 if (maze[i][j] == target) 57 if (maze[i][j] == target)
58 { 58 {
59 *fx = i; 59 fx = i;
60 *fy = j; 60 fy = j;
61 return; 61 return;
62 } 62 }
63 } 63 }
64 break; 64 break;
65 65
66 case 2: 66 case 2:
67 /* Search from top right down/left */ 67 /* Search from top right down/left */
68 for (i = RP->Xsize - 2; i > 0; i--) 68 for (i = maze.w - 2; i > 0; i--)
69 for (j = 1; j < RP->Ysize - 1; j++) 69 for (j = 1; j < maze.h - 1; j++)
70 { 70 {
71 if (maze[i][j] == target) 71 if (maze[i][j] == target)
72 { 72 {
73 *fx = i; 73 fx = i;
74 *fy = j; 74 fy = j;
75 return; 75 return;
76 } 76 }
77 } 77 }
78 break; 78 break;
79 79
80 case 3: 80 case 3:
81 /* search from bottom-left up-right */ 81 /* search from bottom-left up-right */
82 for (i = 1; i < RP->Xsize - 1; i++) 82 for (i = 1; i < maze.w - 1; i++)
83 for (j = RP->Ysize - 2; j > 0; j--) 83 for (j = maze.h - 2; j > 0; j--)
84 { 84 {
85 if (maze[i][j] == target) 85 if (maze[i][j] == target)
86 { 86 {
87 *fx = i; 87 fx = i;
88 *fy = j; 88 fy = j;
89 return; 89 return;
90 } 90 }
91 } 91 }
92 break; 92 break;
93 93
94 case 4: 94 case 4:
95 /* search from bottom-right up-left */ 95 /* search from bottom-right up-left */
96 for (i = RP->Xsize - 2; i > 0; i--) 96 for (i = maze.w - 2; i > 0; i--)
97 for (j = RP->Ysize - 2; j > 0; j--) 97 for (j = maze.h - 2; j > 0; j--)
98 { 98 {
99 if (maze[i][j] == target) 99 if (maze[i][j] == target)
100 { 100 {
101 *fx = i; 101 fx = i;
102 *fy = j; 102 fy = j;
103 return; 103 return;
104 } 104 }
105 } 105 }
106 break; 106 break;
107
108 } 107 }
109} 108}
110 109
111/* orientation: 0 means random, 110/* orientation: 0 means random,
112 1 means descending dungeon 111 1 means descending dungeon
115 4 means leftward 114 4 means leftward
116 5 means northward 115 5 means northward
117 6 means southward 116 6 means southward
118*/ 117*/
119void 118void
120place_exits (maptile *map, char **maze, const char *exitstyle, int orientation, random_map_params *RP) 119place_exits (maptile *map, layout &maze, const char *exitstyle, int orientation, random_map_params *RP)
121{ 120{
122 maptile *style_map_down = 0; /* harder maze */ 121 maptile *style_map_down = 0; /* harder maze */
123 maptile *style_map_up = 0; /* easier maze */ 122 maptile *style_map_up = 0; /* easier maze */
124 object *the_exit_down; /* harder maze */ 123 object *the_exit_down; /* harder maze */
125 object *the_exit_up; /* easier maze */ 124 object *the_exit_up; /* easier maze */
180 179
181 /* figure out where to put the entrance */ 180 /* figure out where to put the entrance */
182 /* begin a logical block */ 181 /* begin a logical block */
183 { 182 {
184 /* First, look for a '<' char */ 183 /* First, look for a '<' char */
185 find_in_layout (0, '<', &upx, &upy, maze, RP); 184 find_in_layout (0, '<', upx, upy, maze);
186 185
187 /* next, look for a C, the map center. */ 186 /* next, look for a C, the map center. */
188 find_in_layout (0, 'C', &cx, &cy, maze, RP); 187 find_in_layout (0, 'C', cx, cy, maze);
189 188
190 /* if we didn't find an up, find an empty place far from the center */ 189 /* if we didn't find an up, find an empty place far from the center */
191 if (upx == -1 && cx != -1) 190 if (upx == -1 && cx != -1)
192 { 191 {
193 if (cx > RP->Xsize / 2) 192 if (cx > RP->Xsize / 2)
200 else 199 else
201 upy = RP->Ysize - 2; 200 upy = RP->Ysize - 2;
202 201
203 /* find an empty place far from the center */ 202 /* find an empty place far from the center */
204 if (upx == 1 && upy == 1) 203 if (upx == 1 && upy == 1)
205 find_in_layout (1, 0, &upx, &upy, maze, RP); 204 find_in_layout (1, 0, upx, upy, maze);
206 else if (upx == 1 && upy > 1) 205 else if (upx == 1 && upy > 1)
207 find_in_layout (3, 0, &upx, &upy, maze, RP); 206 find_in_layout (3, 0, upx, upy, maze);
208 else if (upx > 1 && upy == 1) 207 else if (upx > 1 && upy == 1)
209 find_in_layout (2, 0, &upx, &upy, maze, RP); 208 find_in_layout (2, 0, upx, upy, maze);
210 else if (upx > 1 && upy > 1) 209 else if (upx > 1 && upy > 1)
211 find_in_layout (4, 0, &upx, &upy, maze, RP); 210 find_in_layout (4, 0, upx, upy, maze);
212 } 211 }
213 212
214 /* no indication of where to place the exit, so just place it. */ 213 /* no indication of where to place the exit, so just place it. */
215 if (upx == -1) 214 if (upx == -1)
216 find_in_layout (0, 0, &upx, &upy, maze, RP); 215 find_in_layout (0, 0, upx, upy, maze);
217 216
218 the_exit_up->x = upx; 217 the_exit_up->x = upx;
219 the_exit_up->y = upy; 218 the_exit_up->y = upy;
220 219
221 /* surround the exits with notices that this is a random map. */ 220 /* surround the exits with notices that this is a random map. */
222 for (int j = 1; j < 9; j++) 221 for (int j = 1; j < 9; j++)
223 {
224 if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j])) 222 if (!wall_blocked (map, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j]))
225 { 223 {
226 object *random_sign = archetype::get (shstr_sign); 224 object *random_sign = archetype::get (shstr_sign);
227 random_sign->msg = format ("This is a random map.\nLevel: %d\n", RP->dungeon_level - 1); 225 random_sign->msg = format ("This is a random map.\nLevel: %d of %d.\n", RP->dungeon_level - 1, RP->dungeon_depth);
228 map->insert (random_sign, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j], 0, 0); 226 map->insert (random_sign, the_exit_up->x + freearr_x[j], the_exit_up->y + freearr_y[j], 0, 0);
229 } 227 }
230 }
231 228
232 /* Block the exit so things don't get dumped on top of it. */ 229 /* Block the exit so things don't get dumped on top of it. */
233 the_exit_up->move_block = MOVE_ALL; 230 the_exit_up->move_block = MOVE_ALL;
234 231
235 insert_ob_in_map (the_exit_up, map, NULL, 0); 232 insert_ob_in_map (the_exit_up, map, NULL, 0);
238 /* set the starting x,y for this map */ 235 /* set the starting x,y for this map */
239 map->enter_x = the_exit_up->x; 236 map->enter_x = the_exit_up->x;
240 map->enter_y = the_exit_up->y; 237 map->enter_y = the_exit_up->y;
241 238
242 /* first, look for a '>' character */ 239 /* first, look for a '>' character */
243 find_in_layout (0, '>', &downx, &downy, maze, RP); 240 find_in_layout (0, '>', downx, downy, maze);
244 241
245 /* if no > is found use C */ 242 /* if no > is found use C */
246 if (downx == -1) 243 if (downx == -1)
247 { 244 {
248 downx = cx; 245 downx = cx;
263 else 260 else
264 downy = RP->Ysize - 2; 261 downy = RP->Ysize - 2;
265 262
266 /* find an empty place far from the entrance */ 263 /* find an empty place far from the entrance */
267 if (downx == 1 && downy == 1) 264 if (downx == 1 && downy == 1)
268 find_in_layout (1, 0, &downx, &downy, maze, RP); 265 find_in_layout (1, 0, downx, downy, maze);
269 else if (downx == 1 && downy > 1) 266 else if (downx == 1 && downy > 1)
270 find_in_layout (3, 0, &downx, &downy, maze, RP); 267 find_in_layout (3, 0, downx, downy, maze);
271 else if (downx > 1 && downy == 1) 268 else if (downx > 1 && downy == 1)
272 find_in_layout (2, 0, &downx, &downy, maze, RP); 269 find_in_layout (2, 0, downx, downy, maze);
273 else if (downx > 1 && downy > 1) 270 else if (downx > 1 && downy > 1)
274 find_in_layout (4, 0, &downx, &downy, maze, RP); 271 find_in_layout (4, 0, downx, downy, maze);
275 } 272 }
276 273
277 /* no indication of where to place the down exit, so just place it */ 274 /* no indication of where to place the down exit, so just place it */
278 if (downx == -1) 275 if (downx == -1)
279 find_in_layout (0, 0, &downx, &downy, maze, RP); 276 find_in_layout (0, 0, downx, downy, maze);
280 277
281 if (the_exit_down) 278 if (the_exit_down)
282 { 279 {
283 int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1); 280 int i = rmg_find_free_spot (the_exit_down, map, downx, downy, 1, SIZEOFFREE1 + 1);
284 the_exit_down->x = downx + freearr_x[i]; 281 the_exit_down->x = downx + freearr_x[i];
339 336
340/* this function unblocks the exits. We blocked them to 337/* this function unblocks the exits. We blocked them to
341 keep things from being dumped on them during the other 338 keep things from being dumped on them during the other
342 phases of random map generation. */ 339 phases of random map generation. */
343void 340void
344unblock_exits (maptile *map, char **maze, random_map_params *RP) 341unblock_exits (maptile *map, layout &maze)
345{ 342{
346 int i = 0, j = 0; 343 int i = 0, j = 0;
347 object *walk; 344 object *walk;
348 345
349 for (i = 0; i < RP->Xsize; i++) 346 for (i = 0; i < maze.w; i++)
350 for (j = 0; j < RP->Ysize; j++) 347 for (j = 0; j < maze.h; j++)
351 if (maze[i][j] == '>' || maze[i][j] == '<') 348 if (maze[i][j] == '>' || maze[i][j] == '<')
352 { 349 {
353 for (walk = GET_MAP_OB (map, i, j); walk != NULL; walk = walk->above) 350 for (walk = GET_MAP_OB (map, i, j); walk != NULL; walk = walk->above)
354 { 351 {
355 if (walk->move_block == MOVE_ALL && walk->type != LOCKED_DOOR) 352 if (walk->move_block == MOVE_ALL && walk->type != LOCKED_DOOR)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines