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.47 by root, Sat Jul 3 13:14:35 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. */
236 /* set the starting x,y for this map */ 235 /* set the starting x,y for this map */
237 map->enter_x = the_exit_up->x; 236 map->enter_x = the_exit_up->x;
238 map->enter_y = the_exit_up->y; 237 map->enter_y = the_exit_up->y;
239 238
240 /* first, look for a '>' character */ 239 /* first, look for a '>' character */
241 find_in_layout (0, '>', &downx, &downy, maze, RP); 240 find_in_layout (0, '>', downx, downy, maze);
242 241
243 /* if no > is found use C */ 242 /* if no > is found use C */
244 if (downx == -1) 243 if (downx == -1)
245 { 244 {
246 downx = cx; 245 downx = cx;
261 else 260 else
262 downy = RP->Ysize - 2; 261 downy = RP->Ysize - 2;
263 262
264 /* find an empty place far from the entrance */ 263 /* find an empty place far from the entrance */
265 if (downx == 1 && downy == 1) 264 if (downx == 1 && downy == 1)
266 find_in_layout (1, 0, &downx, &downy, maze, RP); 265 find_in_layout (1, 0, downx, downy, maze);
267 else if (downx == 1 && downy > 1) 266 else if (downx == 1 && downy > 1)
268 find_in_layout (3, 0, &downx, &downy, maze, RP); 267 find_in_layout (3, 0, downx, downy, maze);
269 else if (downx > 1 && downy == 1) 268 else if (downx > 1 && downy == 1)
270 find_in_layout (2, 0, &downx, &downy, maze, RP); 269 find_in_layout (2, 0, downx, downy, maze);
271 else if (downx > 1 && downy > 1) 270 else if (downx > 1 && downy > 1)
272 find_in_layout (4, 0, &downx, &downy, maze, RP); 271 find_in_layout (4, 0, downx, downy, maze);
273 } 272 }
274 273
275 /* 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 */
276 if (downx == -1) 275 if (downx == -1)
277 find_in_layout (0, 0, &downx, &downy, maze, RP); 276 find_in_layout (0, 0, downx, downy, maze);
278 277
279 if (the_exit_down) 278 if (the_exit_down)
280 { 279 {
281 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);
282 the_exit_down->x = downx + freearr_x[i]; 281 the_exit_down->x = downx + freearr_x[i];
337 336
338/* this function unblocks the exits. We blocked them to 337/* this function unblocks the exits. We blocked them to
339 keep things from being dumped on them during the other 338 keep things from being dumped on them during the other
340 phases of random map generation. */ 339 phases of random map generation. */
341void 340void
342unblock_exits (maptile *map, char **maze, random_map_params *RP) 341unblock_exits (maptile *map, layout &maze)
343{ 342{
344 int i = 0, j = 0; 343 int i = 0, j = 0;
345 object *walk; 344 object *walk;
346 345
347 for (i = 0; i < RP->Xsize; i++) 346 for (i = 0; i < maze.w; i++)
348 for (j = 0; j < RP->Ysize; j++) 347 for (j = 0; j < maze.h; j++)
349 if (maze[i][j] == '>' || maze[i][j] == '<') 348 if (maze[i][j] == '>' || maze[i][j] == '<')
350 { 349 {
351 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)
352 { 351 {
353 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