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

Comparing deliantra/server/random_maps/treasure.C (file contents):
Revision 1.11 by root, Sat Dec 30 18:45:28 2006 UTC vs.
Revision 1.12 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
67treasure style (may be empty or NULL, or "none" to cause no treasure.) 68treasure style (may be empty or NULL, or "none" to cause no treasure.)
68treasureoptions (may be 0 for random choices or positive) 69treasureoptions (may be 0 for random choices or positive)
69*/ 70*/
70 71
71void 72void
72place_treasure (maptile *map, char **layout, char *treasure_style, int treasureoptions, random_map_params * RP) 73place_treasure (maptile *map, char **layout, char *treasure_style, int treasureoptions, random_map_params *RP)
73{ 74{
74 char styledirname[256]; 75 char styledirname[256];
75 char stylefilepath[256]; 76 char stylefilepath[256];
76 maptile *style_map = 0; 77 maptile *style_map = 0;
77 int num_treasures; 78 int num_treasures;
113 { 114 {
114 115
115 /* map_layout_style global, and is previously set */ 116 /* map_layout_style global, and is previously set */
116 switch (RP->map_layout_style) 117 switch (RP->map_layout_style)
117 { 118 {
118 case LAYOUT_ONION: 119 case LAYOUT_ONION:
119 case LAYOUT_SPIRAL: 120 case LAYOUT_SPIRAL:
120 case LAYOUT_SQUARE_SPIRAL: 121 case LAYOUT_SQUARE_SPIRAL:
121 { 122 {
122 int i, j; 123 int i, j;
123 124
124 /* search the onion for C's or '>', and put treasure there. */ 125 /* search the onion for C's or '>', and put treasure there. */
125 for (i = 0; i < RP->Xsize; i++) 126 for (i = 0; i < RP->Xsize; i++)
126 { 127 {
127 for (j = 0; j < RP->Ysize; j++) 128 for (j = 0; j < RP->Ysize; j++)
128 { 129 {
129 if (layout[i][j] == 'C' || layout[i][j] == '>') 130 if (layout[i][j] == 'C' || layout[i][j] == '>')
130 { 131 {
131 int tdiv = RP->symmetry_used; 132 int tdiv = RP->symmetry_used;
132 object **doorlist; 133 object **doorlist;
133 object *chest; 134 object *chest;
134 135
135 if (tdiv == 3) 136 if (tdiv == 3)
136 tdiv = 2; /* this symmetry uses a divisor of 2 */ 137 tdiv = 2; /* this symmetry uses a divisor of 2 */
137 /* don't put a chest on an exit. */ 138 /* don't put a chest on an exit. */
138 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP); 139 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures / tdiv, RP);
139 if (!chest) 140 if (!chest)
140 continue; /* if no chest was placed NEXT */ 141 continue; /* if no chest was placed NEXT */
141 if (treasureoptions & (DOORED | HIDDEN)) 142 if (treasureoptions & (DOORED | HIDDEN))
142 { 143 {
143 doorlist = find_doors_in_room (map, i, j, RP); 144 doorlist = find_doors_in_room (map, i, j, RP);
144 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 145 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
145 free (doorlist); 146 free (doorlist);
146 } 147 }
147 } 148 }
148 } 149 }
149 } 150 }
150 break; 151 break;
151 } 152 }
152 default: 153 default:
153 { 154 {
154 int i, j, tries; 155 int i, j, tries;
155 object *chest; 156 object *chest;
156 object **doorlist; 157 object **doorlist;
157 158
158 i = j = -1; 159 i = j = -1;
159 tries = 0; 160 tries = 0;
160 while (i == -1 && tries < 100) 161 while (i == -1 && tries < 100)
161 { 162 {
162 i = RANDOM () % (RP->Xsize - 2) + 1; 163 i = RANDOM () % (RP->Xsize - 2) + 1;
163 j = RANDOM () % (RP->Ysize - 2) + 1; 164 j = RANDOM () % (RP->Ysize - 2) + 1;
164 find_enclosed_spot (map, &i, &j, RP); 165 find_enclosed_spot (map, &i, &j, RP);
165 if (wall_blocked (map, i, j)) 166 if (wall_blocked (map, i, j))
166 i = -1; 167 i = -1;
167 tries++; 168 tries++;
168 } 169 }
169 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP); 170 chest = place_chest (treasureoptions, i, j, map, style_map, num_treasures, RP);
170 if (!chest) 171 if (!chest)
171 return; 172 return;
172 i = chest->x; 173 i = chest->x;
173 j = chest->y; 174 j = chest->y;
174 if (treasureoptions & (DOORED | HIDDEN)) 175 if (treasureoptions & (DOORED | HIDDEN))
175 { 176 {
176 doorlist = surround_by_doors (map, layout, i, j, treasureoptions); 177 doorlist = surround_by_doors (map, layout, i, j, treasureoptions);
177 lock_and_hide_doors (doorlist, map, treasureoptions, RP); 178 lock_and_hide_doors (doorlist, map, treasureoptions, RP);
178 free (doorlist); 179 free (doorlist);
179 } 180 }
180 } 181 }
181 } 182 }
182 } 183 }
183 else 184 else
184 { /* DIFFUSE treasure layout */ 185 { /* DIFFUSE treasure layout */
185 int ti, i, j; 186 int ti, i, j;
191 place_chest (treasureoptions, i, j, map, style_map, 1, RP); 192 place_chest (treasureoptions, i, j, map, style_map, 1, RP);
192 } 193 }
193 } 194 }
194} 195}
195 196
196
197
198/* put a chest into the map, near x and y, with the treasure style 197/* put a chest into the map, near x and y, with the treasure style
199 determined (may be null, or may be a treasure list from lib/treasures, 198 determined (may be null, or may be a treasure list from lib/treasures,
200 if the global variable "treasurestyle" is set to that treasure list's name */ 199 if the global variable "treasurestyle" is set to that treasure list's name */
201 200
202object * 201object *
203place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, random_map_params * RP) 202place_chest (int treasureoptions, int x, int y, maptile *map, maptile *style_map, int n_treasures, random_map_params *RP)
204{ 203{
205 object *the_chest; 204 object *the_chest;
206 int i, xl, yl; 205 int i, xl, yl;
207 206
208 the_chest = get_archetype ("chest"); /* was "chest_2" */ 207 the_chest = get_archetype ("chest"); /* was "chest_2" */
218 yl = y + freearr_y[i]; 217 yl = y + freearr_y[i];
219 218
220 /* if the placement is blocked, return a fail. */ 219 /* if the placement is blocked, return a fail. */
221 if (wall_blocked (map, xl, yl)) 220 if (wall_blocked (map, xl, yl))
222 return 0; 221 return 0;
223
224 222
225 /* put the treasures in the chest. */ 223 /* put the treasures in the chest. */
226 /* if(style_map) { */ 224 /* if(style_map) { */
227#if 0 /* don't use treasure style maps for now! */ 225#if 0 /* don't use treasure style maps for now! */
228 int ti; 226 int ti;
241 { /* use the style map */ 239 { /* use the style map */
242 the_chest->randomitems = tlist; 240 the_chest->randomitems = tlist;
243 the_chest->stats.hp = n_treasures; 241 the_chest->stats.hp = n_treasures;
244 } 242 }
245#endif 243#endif
246 else
247 { /* neither style_map no treasure list given */ 244 { /* neither style_map no treasure list given */
248 treasurelist *tlist = find_treasurelist ("chest"); 245 treasurelist *tlist = find_treasurelist ("chest");
249 246
250 the_chest->randomitems = tlist; 247 the_chest->randomitems = tlist;
251 the_chest->stats.hp = n_treasures; 248 the_chest->stats.hp = n_treasures;
297 294
298 295
299/* finds the closest monster and returns him, regardless of doors 296/* finds the closest monster and returns him, regardless of doors
300 or walls */ 297 or walls */
301object * 298object *
302find_closest_monster (maptile *map, int x, int y, random_map_params * RP) 299find_closest_monster (maptile *map, int x, int y, random_map_params *RP)
303{ 300{
304 int i; 301 int i;
305 302
306 for (i = 0; i < SIZEOFFREE; i++) 303 for (i = 0; i < SIZEOFFREE; i++)
307 { 304 {
336 The idea is that you call keyplace on x,y where a door is, and it'll make 333 The idea is that you call keyplace on x,y where a door is, and it'll make
337 sure a key is placed on both sides of the door. 334 sure a key is placed on both sides of the door.
338*/ 335*/
339 336
340int 337int
341keyplace (maptile *map, int x, int y, char *keycode, int door_flag, int n_keys, random_map_params * RP) 338keyplace (maptile *map, int x, int y, char *keycode, int door_flag, int n_keys, random_map_params *RP)
342{ 339{
343 int i, j; 340 int i, j;
344 int kx, ky; 341 int kx, ky;
345 object *the_keymaster; /* the monster that gets the key. */ 342 object *the_keymaster; /* the monster that gets the key. */
346 object *the_key; 343 object *the_key;
432 429
433/* a recursive routine which will return a monster, eventually,if there is one. 430/* a recursive routine which will return a monster, eventually,if there is one.
434 it does a check-off on the layout, converting 0's to 1's */ 431 it does a check-off on the layout, converting 0's to 1's */
435 432
436object * 433object *
437find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, random_map_params * RP) 434find_monster_in_room_recursive (char **layout, maptile *map, int x, int y, random_map_params *RP)
438{ 435{
439 int i, j; 436 int i, j;
440 437
441 /* if we've found a monster already, leave */ 438 /* if we've found a monster already, leave */
442 if (theMonsterToFind != NULL) 439 if (theMonsterToFind != NULL)
479 476
480/* sets up some data structures: the _recursive form does the 477/* sets up some data structures: the _recursive form does the
481 real work. */ 478 real work. */
482 479
483object * 480object *
484find_monster_in_room (maptile *map, int x, int y, random_map_params * RP) 481find_monster_in_room (maptile *map, int x, int y, random_map_params *RP)
485{ 482{
486 char **layout2; 483 char **layout2;
487 int i, j; 484 int i, j;
488 485
489 theMonsterToFind = 0; 486 theMonsterToFind = 0;
521/* the workhorse routine, which finds the free spots in a room: 518/* the workhorse routine, which finds the free spots in a room:
522a datastructure of free points is set up, and a position chosen from 519a datastructure of free points is set up, and a position chosen from
523that datastructure. */ 520that datastructure. */
524 521
525void 522void
526find_spot_in_room_recursive (char **layout, int x, int y, random_map_params * RP) 523find_spot_in_room_recursive (char **layout, int x, int y, random_map_params *RP)
527{ 524{
528 int i, j; 525 int i, j;
529 526
530 /* bounds check x and y */ 527 /* bounds check x and y */
531 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize)) 528 if (!(x >= 0 && y >= 0 && x < RP->Xsize && y < RP->Ysize))
550 547
551} 548}
552 549
553/* find a random non-blocked spot in this room to drop a key. */ 550/* find a random non-blocked spot in this room to drop a key. */
554void 551void
555find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, random_map_params * RP) 552find_spot_in_room (maptile *map, int x, int y, int *kx, int *ky, random_map_params *RP)
556{ 553{
557 char **layout2; 554 char **layout2;
558 int i, j; 555 int i, j;
559 556
560 number_of_free_spots_in_room = 0; 557 number_of_free_spots_in_room = 0;
597/* searches the map for a spot with walls around it. The more 594/* searches the map for a spot with walls around it. The more
598 walls the better, but it'll settle for 1 wall, or even 0, but 595 walls the better, but it'll settle for 1 wall, or even 0, but
599 it'll return 0 if no FREE spots are found.*/ 596 it'll return 0 if no FREE spots are found.*/
600 597
601void 598void
602find_enclosed_spot (maptile *map, int *cx, int *cy, random_map_params * RP) 599find_enclosed_spot (maptile *map, int *cx, int *cy, random_map_params *RP)
603{ 600{
604 int x, y; 601 int x, y;
605 int i; 602 int i;
606 603
607 x = *cx; 604 x = *cx;
748} 745}
749 746
750 747
751/* the workhorse routine, which finds the doors in a room */ 748/* the workhorse routine, which finds the doors in a room */
752void 749void
753find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params * RP) 750find_doors_in_room_recursive (char **layout, maptile *map, int x, int y, object **doorlist, int *ndoors, random_map_params *RP)
754{ 751{
755 int i, j; 752 int i, j;
756 object *door; 753 object *door;
757 754
758 /* bounds check x and y */ 755 /* bounds check x and y */
790 } 787 }
791} 788}
792 789
793/* find a random non-blocked spot in this room to drop a key. */ 790/* find a random non-blocked spot in this room to drop a key. */
794object ** 791object **
795find_doors_in_room (maptile *map, int x, int y, random_map_params * RP) 792find_doors_in_room (maptile *map, int x, int y, random_map_params *RP)
796{ 793{
797 char **layout2; 794 char **layout2;
798 object **doorlist; 795 object **doorlist;
799 int i, j; 796 int i, j;
800 int ndoors = 0; 797 int ndoors = 0;
830 827
831/* locks and/or hides all the doors in doorlist, or does nothing if 828/* locks and/or hides all the doors in doorlist, or does nothing if
832 opts doesn't say to lock/hide doors. */ 829 opts doesn't say to lock/hide doors. */
833 830
834void 831void
835lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params * RP) 832lock_and_hide_doors (object **doorlist, maptile *map, int opts, random_map_params *RP)
836{ 833{
837 object *door; 834 object *door;
838 int i; 835 int i;
839 836
840 /* lock the doors and hide the keys. */ 837 /* lock the doors and hide the keys. */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines