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.15 by root, Sun Dec 31 17:17:23 2006 UTC vs.
Revision 1.16 by root, Sun Dec 31 19:02:24 2006 UTC

1
1/* 2/*
2 CrossFire, A Multiplayer game for X-windows 3 CrossFire, A Multiplayer game for X-windows
3 4
4 Copyright (C) 2001 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2001 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
27#include <rproto.h> 28#include <rproto.h>
28 29
29/* find a character in the layout. fx and fy are pointers to 30/* find a character in the layout. fx and fy are pointers to
30 where to find the char. fx,fy = -1 if not found. */ 31 where to find the char. fx,fy = -1 if not found. */
31void 32void
32find_in_layout (int mode, char target, int *fx, int *fy, char **layout, random_map_params * RP) 33find_in_layout (int mode, char target, int *fx, int *fy, char **layout, random_map_params *RP)
33{ 34{
34 int M; 35 int M;
35 int i, j; 36 int i, j;
36 37
37 *fx = -1; 38 *fx = -1;
46 /* four different search starting points and methods so that 47 /* four different search starting points and methods so that
47 we can do something different for symmetrical maps instead of 48 we can do something different for symmetrical maps instead of
48 the same damned thing every time. */ 49 the same damned thing every time. */
49 switch (M) 50 switch (M)
50 { 51 {
51 case 1: 52 case 1:
52 { /* search from top left down/right */ 53 { /* search from top left down/right */
53 for (i = 1; i < RP->Xsize; i++) 54 for (i = 1; i < RP->Xsize; i++)
54 for (j = 1; j < RP->Ysize; j++) 55 for (j = 1; j < RP->Ysize; j++)
55 { 56 {
56 if (layout[i][j] == target) 57 if (layout[i][j] == target)
57 { 58 {
58 *fx = i; 59 *fx = i;
59 *fy = j; 60 *fy = j;
60 return; 61 return;
61 } 62 }
62 } 63 }
63 break; 64 break;
64 } 65 }
65 case 2: 66 case 2:
66 { /* Search from top right down/left */ 67 { /* Search from top right down/left */
67 for (i = RP->Xsize - 2; i > 0; i--) 68 for (i = RP->Xsize - 2; i > 0; i--)
68 for (j = 1; j < RP->Ysize - 1; j++) 69 for (j = 1; j < RP->Ysize - 1; j++)
69 { 70 {
70 if (layout[i][j] == target) 71 if (layout[i][j] == target)
71 { 72 {
72 *fx = i; 73 *fx = i;
73 *fy = j; 74 *fy = j;
74 return; 75 return;
75 } 76 }
76 } 77 }
77 break; 78 break;
78 } 79 }
79 case 3: 80 case 3:
80 { /* search from bottom-left up-right */ 81 { /* search from bottom-left up-right */
81 for (i = 1; i < RP->Xsize - 1; i++) 82 for (i = 1; i < RP->Xsize - 1; i++)
82 for (j = RP->Ysize - 2; j > 0; j--) 83 for (j = RP->Ysize - 2; j > 0; j--)
83 { 84 {
84 if (layout[i][j] == target) 85 if (layout[i][j] == target)
85 { 86 {
86 *fx = i; 87 *fx = i;
87 *fy = j; 88 *fy = j;
88 return; 89 return;
89 } 90 }
90 } 91 }
91 break; 92 break;
92 } 93 }
93 case 4: 94 case 4:
94 { /* search from bottom-right up-left */ 95 { /* search from bottom-right up-left */
95 for (i = RP->Xsize - 2; i > 0; i--) 96 for (i = RP->Xsize - 2; i > 0; i--)
96 for (j = RP->Ysize - 2; j > 0; j--) 97 for (j = RP->Ysize - 2; j > 0; j--)
97 { 98 {
98 if (layout[i][j] == target) 99 if (layout[i][j] == target)
99 { 100 {
100 *fx = i; 101 *fx = i;
101 *fy = j; 102 *fy = j;
102 return; 103 return;
103 } 104 }
104 } 105 }
105 break; 106 break;
106 } 107 }
107 } 108 }
108} 109}
109 110
110/* orientation: 0 means random, 111/* orientation: 0 means random,
111 1 means descending dungeon 112 1 means descending dungeon
117*/ 118*/
118void 119void
119place_exits (maptile *map, char **maze, char *exitstyle, int orientation, random_map_params *RP) 120place_exits (maptile *map, char **maze, char *exitstyle, int orientation, random_map_params *RP)
120{ 121{
121 char styledirname[256]; 122 char styledirname[256];
122 maptile *style_map_down = 0; /* harder maze */ 123 maptile *style_map_down = 0; /* harder maze */
123 maptile *style_map_up = 0; /* easier maze */ 124 maptile *style_map_up = 0; /* easier maze */
124 object *the_exit_down; /* harder maze */ 125 object *the_exit_down; /* harder maze */
125 object *the_exit_up; /* easier maze */ 126 object *the_exit_up; /* easier maze */
126 object *random_sign; /* magic mouth saying this is a random map. */ 127 object *random_sign; /* magic mouth saying this is a random map. */
127 char buf[512]; 128 char buf[512];
128 int cx = -1, cy = -1; /* location of a map center */ 129 int cx = -1, cy = -1; /* location of a map center */
129 int upx = -1, upy = -1; /* location of up exit */ 130 int upx = -1, upy = -1; /* location of up exit */
130 int downx = -1, downy = -1; 131 int downx = -1, downy = -1;
131 int final_map_exit = 1; 132 int final_map_exit = 1;
132 133
133 if (RP->exit_on_final_map) 134 if (RP->exit_on_final_map)
134 {
135 if (strstr (RP->exit_on_final_map, "no")) 135 if (strstr (RP->exit_on_final_map, "no"))
136 final_map_exit = 0; 136 final_map_exit = 0;
137 }
138 137
139 if (orientation == 0) 138 if (!orientation)
140 orientation = RANDOM () % 6 + 1; 139 orientation = RANDOM () % 6 + 1;
141 140
142 switch (orientation) 141 switch (orientation)
143 { 142 {
144 case 1: 143 case 1:
168 } 167 }
169 } 168 }
170 169
171 if (style_map_up == 0) 170 if (style_map_up == 0)
172 the_exit_up = arch_to_object (archetype::find ("exit")); 171 the_exit_up = arch_to_object (archetype::find ("exit"));
172
173 else 173 else
174 { 174 {
175 object *tmp; 175 object *tmp;
176 176
177 tmp = pick_random_object (style_map_up); 177 tmp = pick_random_object (style_map_up);
180 180
181 /* we need a down exit only if we're recursing. */ 181 /* we need a down exit only if we're recursing. */
182 if (RP->dungeon_level < RP->dungeon_depth || RP->final_map[0] != 0) 182 if (RP->dungeon_level < RP->dungeon_depth || RP->final_map[0] != 0)
183 if (style_map_down == 0) 183 if (style_map_down == 0)
184 the_exit_down = arch_to_object (archetype::find ("exit")); 184 the_exit_down = arch_to_object (archetype::find ("exit"));
185
185 else 186 else
186 { 187 {
187 object *tmp; 188 object *tmp;
188 189
189 tmp = pick_random_object (style_map_down); 190 tmp = pick_random_object (style_map_down);
193 the_exit_down = 0; 194 the_exit_down = 0;
194 195
195 /* set up the up exit */ 196 /* set up the up exit */
196 the_exit_up->stats.hp = RP->origin_x; 197 the_exit_up->stats.hp = RP->origin_x;
197 the_exit_up->stats.sp = RP->origin_y; 198 the_exit_up->stats.sp = RP->origin_y;
198 the_exit_up->slaying = RP->origin_map; 199 the_exit_up->slaying = RP->origin_map;
199 200
200 /* figure out where to put the entrance */ 201 /* figure out where to put the entrance */
201 /* begin a logical block */ 202 /* begin a logical block */
202 { 203 {
203 int i, j; 204 int i, j;
296 297
297 } 298 }
298 /* no indication of where to place the down exit, so just place it */ 299 /* no indication of where to place the down exit, so just place it */
299 if (downx == -1) 300 if (downx == -1)
300 find_in_layout (0, 0, &downx, &downy, maze, RP); 301 find_in_layout (0, 0, &downx, &downy, maze, RP);
302
301 if (the_exit_down) 303 if (the_exit_down)
302 { 304 {
303 char buf[2048]; 305 char buf[2048];
304 306
305 i = find_first_free_spot (the_exit_down, map, downx, downy); 307 i = find_first_free_spot (the_exit_down, map, downx, downy);
307 the_exit_down->y = downy + freearr_y[i]; 309 the_exit_down->y = downy + freearr_y[i];
308 RP->origin_x = the_exit_down->x; 310 RP->origin_x = the_exit_down->x;
309 RP->origin_y = the_exit_down->y; 311 RP->origin_y = the_exit_down->y;
310 write_map_parameters_to_string (buf, RP); 312 write_map_parameters_to_string (buf, RP);
311 the_exit_down->msg = buf; 313 the_exit_down->msg = buf;
314
312 /* the identifier for making a random map. */ 315 /* the identifier for making a random map. */
313 if (RP->dungeon_level >= RP->dungeon_depth && RP->final_map[0] != 0) 316 if (RP->dungeon_level >= RP->dungeon_depth && *RP->final_map)
314 { 317 {
315 maptile *new_map; 318 maptile *new_map;
316 object *the_exit_back = arch_to_object (the_exit_up->arch), *tmp; 319 object *the_exit_back = arch_to_object (the_exit_up->arch), *tmp;
317 320
318#if 0
319 /* I'm not sure if there was any reason to change the path to the
320 * map other than to maybe make it more descriptive in the 'maps'
321 * command. But changing the map name makes life more complicated,
322 * (has_been_loaded needs to use the new name)
323 */
324
325 char new_map_name[MAX_BUF];
326
327 /* give the final map a name */
328 sprintf (new_map_name, "%sfinal_map", RP->final_map);
329 /* set the exit down. */
330#endif
331 /* load it */ 321 /* load it */
332 if (!(new_map = maptile::load_map_sync (RP->final_map))) 322 if (!(new_map = maptile::load_map_sync (RP->final_map)))
333 return; 323 return;
334 324
335 the_exit_down->slaying = RP->final_map; 325 the_exit_down->slaying = RP->final_map;
372 362
373/* this function unblocks the exits. We blocked them to 363/* this function unblocks the exits. We blocked them to
374 keep things from being dumped on them during the other 364 keep things from being dumped on them during the other
375 phases of random map generation. */ 365 phases of random map generation. */
376void 366void
377unblock_exits (maptile *map, char **maze, random_map_params * RP) 367unblock_exits (maptile *map, char **maze, random_map_params *RP)
378{ 368{
379 int i = 0, j = 0; 369 int i = 0, j = 0;
380 object *walk; 370 object *walk;
381 371
382 for (i = 0; i < RP->Xsize; i++) 372 for (i = 0; i < RP->Xsize; i++)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines