ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/special.C
(Generate patch)

Comparing deliantra/server/random_maps/special.C (file contents):
Revision 1.2 by root, Tue Aug 29 08:01:36 2006 UTC vs.
Revision 1.9 by root, Wed Dec 20 09:14:22 2006 UTC

1/*
2 * static char *rcsid_special_c =
3 * "$Id: special.C,v 1.2 2006/08/29 08:01:36 root Exp $";
4 */
5
6/* 1/*
7 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
8 3
9 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
21 16
22 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 20
26 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
27*/ 22*/
28 23
29/* Specials in this file: 24/* Specials in this file:
30 included maps */ 25 included maps */
31 26
45#define NR_OF_HOLE_TYPES 3 40#define NR_OF_HOLE_TYPES 3
46 41
47/* clear map completely of all objects: a rectangular area of xsize, ysize 42/* clear map completely of all objects: a rectangular area of xsize, ysize
48is cleared with the top left corner at xstart, ystart */ 43is cleared with the top left corner at xstart, ystart */
49 44
45void
50void nuke_map_region(mapstruct *map,int xstart,int ystart, int xsize, int ysize) { 46nuke_map_region (maptile *map, int xstart, int ystart, int xsize, int ysize)
47{
51 int i,j; 48 int i, j;
52 object *tmp; 49 object *tmp;
50
53 for(i=xstart;i<xstart + xsize;i++) 51 for (i = xstart; i < xstart + xsize; i++)
54 for(j=ystart;j<ystart +ysize;j++) { 52 for (j = ystart; j < ystart + ysize; j++)
53 {
55 for(tmp=get_map_ob(map,i,j);tmp!=NULL;tmp=tmp->above) { 54 for (tmp = GET_MAP_OB (map, i, j); tmp != NULL; tmp = tmp->above)
55 {
56 if(!QUERY_FLAG(tmp,FLAG_IS_FLOOR)) { 56 if (!QUERY_FLAG (tmp, FLAG_IS_FLOOR))
57 if(tmp->head) tmp=tmp->head; 57 {
58 remove_ob(tmp); 58 if (tmp->head)
59 free_object(tmp); 59 tmp = tmp->head;
60 tmp=get_map_ob(map,i,j); 60 tmp->remove ();
61 tmp->destroy ();
62 tmp = GET_MAP_OB (map, i, j);
63 }
64 if (tmp == NULL)
65 break;
61 } 66 }
62 if(tmp==NULL) break;
63 } 67 }
64 }
65} 68}
66 69
67 70
68 71
69/* copy in_map into dest_map at point x,y */ 72/* copy in_map into dest_map at point x,y */
70 73
71 74
75void
72void include_map_in_map(mapstruct *dest_map, mapstruct *in_map,int x, int y) { 76include_map_in_map (maptile *dest_map, maptile *in_map, int x, int y)
77{
73 int i,j; 78 int i, j;
74 object *tmp; 79 object *tmp;
75 object *new_ob; 80 object *new_ob;
76 81
77 /* First, splatter everything in the dest map at the location */ 82 /* First, splatter everything in the dest map at the location */
78 nuke_map_region(dest_map,x,y,MAP_WIDTH(in_map),MAP_HEIGHT(in_map)); 83 nuke_map_region (dest_map, x, y, MAP_WIDTH (in_map), MAP_HEIGHT (in_map));
79 84
80 for(i=0;i<MAP_WIDTH(in_map);i++) 85 for (i = 0; i < MAP_WIDTH (in_map); i++)
81 for(j=0;j<MAP_HEIGHT(in_map);j++) { 86 for (j = 0; j < MAP_HEIGHT (in_map); j++)
87 {
82 for(tmp=get_map_ob(in_map,i,j);tmp!=NULL;tmp=tmp->above) { 88 for (tmp = GET_MAP_OB (in_map, i, j); tmp != NULL; tmp = tmp->above)
89 {
83 /* don't copy things with multiple squares: must be dealt with 90 /* don't copy things with multiple squares: must be dealt with
84 specially. */ 91 specially. */
85 if(tmp->head!=NULL) continue; 92 if (tmp->head != NULL)
93 continue;
86 new_ob = arch_to_object(tmp->arch); 94 new_ob = arch_to_object (tmp->arch);
87 copy_object_with_inv(tmp,new_ob); 95 copy_object_with_inv (tmp, new_ob);
88 if(QUERY_FLAG(tmp,FLAG_IS_LINKED)) 96 if (QUERY_FLAG (tmp, FLAG_IS_LINKED))
89 add_button_link(new_ob,dest_map,tmp->path_attuned); 97 add_button_link (new_ob, dest_map, tmp->path_attuned);
90 new_ob->x = i + x; 98 new_ob->x = i + x;
91 new_ob->y = j + y; 99 new_ob->y = j + y;
92 insert_multisquare_ob_in_map(new_ob,dest_map); 100 insert_multisquare_ob_in_map (new_ob, dest_map);
101 }
93 } 102 }
94 }
95} 103}
96 104
105int
97int find_spot_for_submap(mapstruct *map,char **layout,int *ix, int *iy,int xsize, int ysize) { 106find_spot_for_submap (maptile *map, char **layout, int *ix, int *iy, int xsize, int ysize)
107{
98 int tries; 108 int tries;
99 int i=0,j=0; /* initialization may not be needed but prevents compiler warnings */ 109 int i = 0, j = 0; /* initialization may not be needed but prevents compiler warnings */
100 int is_occupied=0; 110 int is_occupied = 0;
101 int l,m; 111 int l, m;
112
102 /* don't even try to place a submap into a map if the big map isn't 113 /* don't even try to place a submap into a map if the big map isn't
103 sufficiently large. */ 114 sufficiently large. */
104 if(2*xsize > MAP_WIDTH(map) || 2*ysize > MAP_HEIGHT(map)) return 0; 115 if (2 * xsize > MAP_WIDTH (map) || 2 * ysize > MAP_HEIGHT (map))
105 116 return 0;
117
106 /* search a bit for a completely free spot. */ 118 /* search a bit for a completely free spot. */
107 for(tries=0;tries<20;tries++) { 119 for (tries = 0; tries < 20; tries++)
120 {
108 /* pick a random location in the layout */ 121 /* pick a random location in the layout */
109 i = RANDOM() % (MAP_WIDTH(map) - xsize-2)+1; 122 i = RANDOM () % (MAP_WIDTH (map) - xsize - 2) + 1;
110 j = RANDOM() % (MAP_HEIGHT(map) - ysize-2)+1; 123 j = RANDOM () % (MAP_HEIGHT (map) - ysize - 2) + 1;
111 is_occupied=0; 124 is_occupied = 0;
112 for(l=i;l<i + xsize;l++) 125 for (l = i; l < i + xsize; l++)
113 for(m=j;m<j + ysize;m++) 126 for (m = j; m < j + ysize; m++)
114 is_occupied|=layout[l][m]; 127 is_occupied |= layout[l][m];
115 if(!is_occupied) break; 128 if (!is_occupied)
129 break;
116 } 130 }
117 131
118 132
119 /* if we failed, relax the restrictions */ 133 /* if we failed, relax the restrictions */
120 134
121 if(is_occupied) { /* failure, try a relaxed placer. */ 135 if (is_occupied)
136 { /* failure, try a relaxed placer. */
122 /* pick a random location in the layout */ 137 /* pick a random location in the layout */
123 for(tries=0;tries<10;tries++) { 138 for (tries = 0; tries < 10; tries++)
139 {
124 i = RANDOM() % (MAP_WIDTH(map) - xsize-2)+1; 140 i = RANDOM () % (MAP_WIDTH (map) - xsize - 2) + 1;
125 j = RANDOM() % (MAP_HEIGHT(map) - ysize-2)+1; 141 j = RANDOM () % (MAP_HEIGHT (map) - ysize - 2) + 1;
126 is_occupied=0; 142 is_occupied = 0;
127 for(l=i;l<i + xsize;l++) 143 for (l = i; l < i + xsize; l++)
128 for(m=j;m<j + ysize;m++) 144 for (m = j; m < j + ysize; m++)
129 if(layout[l][m]=='C' || layout[l][m]=='>' || layout[l][m]=='<') 145 if (layout[l][m] == 'C' || layout[l][m] == '>' || layout[l][m] == '<')
130 is_occupied|=1; 146 is_occupied |= 1;
131 } 147 }
132 } 148 }
133 if(is_occupied) return 0; 149 if (is_occupied)
150 return 0;
134 *ix=i; 151 *ix = i;
135 *iy=j; 152 *iy = j;
136 return 1; 153 return 1;
137} 154}
138 155
139 156
157void
140void place_fountain_with_specials(mapstruct *map) { 158place_fountain_with_specials (maptile *map)
159{
141 int ix,iy,i=-1,tries=0; 160 int ix, iy, i = -1, tries = 0;
142 mapstruct *fountain_style=find_style("/styles/misc","fountains",-1); 161 maptile *fountain_style = find_style ("/styles/misc", "fountains", -1);
143 object *fountain=get_archetype("fountain"); 162 object *fountain = get_archetype ("fountain");
144 object *potion=get_object(); 163 object *potion = object::create ();
164
145 copy_object(pick_random_object(fountain_style),potion); 165 pick_random_object (fountain_style)->copy_to (potion);
166
146 while(i<0 && tries<10) { 167 while (i < 0 && tries < 10)
168 {
147 ix = RANDOM() % (MAP_WIDTH(map) -2) +1; 169 ix = RANDOM () % (MAP_WIDTH (map) - 2) + 1;
148 iy = RANDOM() % (MAP_HEIGHT(map) -2) +1; 170 iy = RANDOM () % (MAP_HEIGHT (map) - 2) + 1;
149 i = find_first_free_spot(fountain,map,ix,iy); 171 i = find_first_free_spot (fountain, map, ix, iy);
150 tries++; 172 tries++;
151 }; 173 }
152 if(i==-1) { /* can't place fountain */ 174
153 free_object(fountain); 175 if (i == -1)
154 free_object(potion); 176 { /* can't place fountain */
177 fountain->destroy ();
178 potion->destroy ();
155 return; 179 return;
156 } 180 }
181
157 ix += freearr_x[i]; 182 ix += freearr_x[i];
158 iy += freearr_y[i]; 183 iy += freearr_y[i];
159 potion->face=fountain->face; 184 potion->face = fountain->face;
160 SET_FLAG(potion,FLAG_NO_PICK); 185 SET_FLAG (potion, FLAG_NO_PICK);
161 SET_FLAG(potion,FLAG_IDENTIFIED); 186 SET_FLAG (potion, FLAG_IDENTIFIED);
162 potion->name=add_string("fountain"); 187 potion->name = potion->name_pl = "fountain";
163 potion->name_pl=add_string("fountain");
164 potion->x = ix; 188 potion->x = ix;
165 potion->y = iy; 189 potion->y = iy;
166 potion->material=M_ADAMANT; 190 potion->material = M_ADAMANT;
167 fountain->x = ix; 191 fountain->x = ix;
168 fountain->y = iy; 192 fountain->y = iy;
169 insert_ob_in_map(fountain,map,NULL,0); 193 insert_ob_in_map (fountain, map, NULL, 0);
170 insert_ob_in_map(potion,map,NULL,0); 194 insert_ob_in_map (potion, map, NULL, 0);
171 195
172} 196}
173 197
198void
174void place_special_exit(mapstruct * map, int hole_type,RMParms *RP) { 199place_special_exit (maptile *map, int hole_type, RMParms * RP)
200{
175 int ix,iy,i=-1; 201 int ix, iy, i = -1;
176 char buf[HUGE_BUF], *style, *decor, *mon; 202 char buf[HUGE_BUF], *style, *decor, *mon;
177 mapstruct *exit_style=find_style("/styles/misc","obscure_exits",-1); 203 maptile *exit_style = find_style ("/styles/misc", "obscure_exits", -1);
178 int g_xsize,g_ysize; 204 int g_xsize, g_ysize;
179 205
180 object *the_exit=get_object(); 206 object *the_exit = object::create ();
207
181 if(!exit_style) return; 208 if (!exit_style)
182 209 return;
210
183 copy_object(pick_random_object(exit_style),the_exit); 211 pick_random_object (exit_style)->copy_to (the_exit);
184 212
185 while(i<0) { 213 while (i < 0)
214 {
186 ix = RANDOM() % (MAP_WIDTH(map) -2) +1; 215 ix = RANDOM () % (MAP_WIDTH (map) - 2) + 1;
187 iy = RANDOM() % (MAP_HEIGHT(map) -2) +1; 216 iy = RANDOM () % (MAP_HEIGHT (map) - 2) + 1;
188 i = find_first_free_spot(the_exit,map,ix,iy); 217 i = find_first_free_spot (the_exit, map, ix, iy);
189 } 218 }
190 219
191 ix += freearr_x[i]; 220 ix += freearr_x[i];
192 iy += freearr_y[i]; 221 iy += freearr_y[i];
193 the_exit->x = ix; 222 the_exit->x = ix;
194 the_exit->y = iy; 223 the_exit->y = iy;
195 224
225 if (!hole_type)
196 if(!hole_type) hole_type = RANDOM() % NR_OF_HOLE_TYPES + 1 ; 226 hole_type = RANDOM () % NR_OF_HOLE_TYPES + 1;
197 227
198 switch(hole_type) { 228 switch (hole_type)
229 {
199 case GLORY_HOLE: /* treasures */ 230 case GLORY_HOLE: /* treasures */
200 { 231 {
201 g_xsize = RANDOM() %3 + 4 + RP->difficulty/4; 232 g_xsize = RANDOM () % 3 + 4 + RP->difficulty / 4;
202 g_ysize = RANDOM() %3 + 4 + RP->difficulty/4; 233 g_ysize = RANDOM () % 3 + 4 + RP->difficulty / 4;
203 style = "onion"; 234 style = "onion";
204 decor = "wealth2"; 235 decor = "wealth2";
205 mon = "none"; 236 mon = "none";
206 break; 237 break;
207 } 238 }
208 239
209 case ORC_ZONE: /* hole with orcs in it. */ 240 case ORC_ZONE: /* hole with orcs in it. */
210 { 241 {
211 g_xsize = RANDOM() %3 + 4 + RP->difficulty/4; 242 g_xsize = RANDOM () % 3 + 4 + RP->difficulty / 4;
212 g_ysize = RANDOM() %3 + 4 + RP->difficulty/4; 243 g_ysize = RANDOM () % 3 + 4 + RP->difficulty / 4;
213 style = "onion"; 244 style = "onion";
214 decor = "wealth2"; 245 decor = "wealth2";
215 mon = "orc"; 246 mon = "orc";
216 break; 247 break;
217 } 248 }
218 249
219 case MINING_ZONE: /* hole with orcs in it. */ 250 case MINING_ZONE: /* hole with orcs in it. */
220 { 251 {
221 g_xsize = RANDOM() %9 + 4 + RP->difficulty/4; 252 g_xsize = RANDOM () % 9 + 4 + RP->difficulty / 4;
222 g_ysize = RANDOM() %9 + 4 + RP->difficulty/4; 253 g_ysize = RANDOM () % 9 + 4 + RP->difficulty / 4;
223 style = "maze"; 254 style = "maze";
224 decor = "minerals2"; 255 decor = "minerals2";
225 mon = "none"; 256 mon = "none";
226 break; 257 break;
227 } 258 }
228 259
229 default: /* undefined */ 260 default: /* undefined */
230 LOG(llevError, "place_special_exit: undefined hole type %d\n", hole_type); 261 LOG (llevError, "place_special_exit: undefined hole type %d\n", hole_type);
231 return; 262 return;
232 break; 263 break;
233 } 264 }
234 265
235 /* Need to be at least this size, otherwise the load 266 /* Need to be at least this size, otherwise the load
236 * code will generate new size values which are too large. 267 * code will generate new size values which are too large.
237 */ 268 */
238 if (g_xsize < MIN_RANDOM_MAP_SIZE) g_xsize = MIN_RANDOM_MAP_SIZE; 269 if (g_xsize < MIN_RANDOM_MAP_SIZE)
239 if (g_ysize < MIN_RANDOM_MAP_SIZE) g_ysize = MIN_RANDOM_MAP_SIZE; 270 g_xsize = MIN_RANDOM_MAP_SIZE;
271 if (g_ysize < MIN_RANDOM_MAP_SIZE)
272 g_ysize = MIN_RANDOM_MAP_SIZE;
240 273
241 write_parameters_to_string(buf, g_xsize, g_ysize,RP->wallstyle,RP->floorstyle,mon, 274 write_parameters_to_string (buf, g_xsize, g_ysize, RP->wallstyle, RP->floorstyle, mon,
242 "none",style,decor,"none",RP->exitstyle,0,0,0, 275 "none", style, decor, "none", RP->exitstyle, 0, 0, 0,
243 OPT_WALLS_ONLY,0,0,1,RP->dungeon_level,RP->dungeon_level, 276 OPT_WALLS_ONLY, 0, 0, 1, RP->dungeon_level, RP->dungeon_level,
244 RP->difficulty,RP->difficulty,-1,1,0,0,0,0, RP->difficulty_increase); 277 RP->difficulty, RP->difficulty, -1, 1, 0, 0, 0, 0, RP->difficulty_increase);
245 the_exit->slaying = add_string("/!"); 278 the_exit->slaying = "/!";
246 the_exit->msg = add_string(buf); 279 the_exit->msg = buf;
247 280
248 insert_ob_in_map(the_exit,map,NULL,0); 281 insert_ob_in_map (the_exit, map, NULL, 0);
249} 282}
250 283
251 284
285void
252void place_specials_in_map(mapstruct *map, char **layout,RMParms *RP) { 286place_specials_in_map (maptile *map, char **layout, RMParms * RP)
287{
253 mapstruct *special_map; 288 maptile *special_map;
254 int ix,iy; /* map insertion locatons */ 289 int ix, iy; /* map insertion locatons */
255 int special_type; /* type of special to make */ 290 int special_type; /* type of special to make */
256 291
257 292
258 special_type = RANDOM() % NUM_OF_SPECIAL_TYPES; 293 special_type = RANDOM () % NUM_OF_SPECIAL_TYPES;
259 switch(special_type) { 294 switch (special_type)
295 {
260 296
261 /* includes a special map into the random map being made. */ 297 /* includes a special map into the random map being made. */
262 case SPECIAL_SUBMAP: { 298 case SPECIAL_SUBMAP:
299 {
263 special_map = find_style("/styles/specialmaps",0,RP->difficulty); 300 special_map = find_style ("/styles/specialmaps", 0, RP->difficulty);
264 if(special_map==NULL) return; 301 if (special_map == NULL)
265 302 return;
303
266 if(find_spot_for_submap(map,layout,&ix,&iy,MAP_WIDTH(special_map),MAP_HEIGHT(special_map))) 304 if (find_spot_for_submap (map, layout, &ix, &iy, MAP_WIDTH (special_map), MAP_HEIGHT (special_map)))
267 include_map_in_map(map,special_map,ix,iy); 305 include_map_in_map (map, special_map, ix, iy);
268 break; 306 break;
269 } 307 }
270 308
271 /* Make a special fountain: an unpickable potion disguised as 309 /* Make a special fountain: an unpickable potion disguised as
272 a fountain, or rather, colocated with a fountain. */ 310 a fountain, or rather, colocated with a fountain. */
273 case SPECIAL_FOUNTAIN: { 311 case SPECIAL_FOUNTAIN:
312 {
274 place_fountain_with_specials(map); 313 place_fountain_with_specials (map);
275 break; 314 break;
276 } 315 }
277 316
278 /* Make an exit to another random map, e.g. a gloryhole. */ 317 /* Make an exit to another random map, e.g. a gloryhole. */
279 case SPECIAL_EXIT: { 318 case SPECIAL_EXIT:
319 {
280 place_special_exit(map,0,RP); 320 place_special_exit (map, 0, RP);
281 break; 321 break;
322 }
282 } 323 }
283 } 324
284
285} 325}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines