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

Comparing deliantra/server/random_maps/decor.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:03 2006 UTC vs.
Revision 1.7 by root, Sat Dec 30 18:45:28 2006 UTC

1/*
2 * static char *rcsid_decor_ =
3 * "$Id: decor.C,v 1.1 2006/08/13 17:16:03 elmex 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 24
30#include <global.h> 25#include <global.h>
31#include <random_map.h> 26#include <random_map.h>
33 28
34#define NR_DECOR_OPTIONS 1 29#define NR_DECOR_OPTIONS 1
35 30
36/* return a simple count of objects in the map at x,y. */ 31/* return a simple count of objects in the map at x,y. */
37 32
33int
38int obj_count_in_map(mapstruct *map,int x,int y) { 34obj_count_in_map (maptile *map, int x, int y)
35{
39 int count=0; 36 int count = 0;
40 object *tmp; 37 object *tmp;
38
41 for(tmp=get_map_ob(map,x,y);tmp!=NULL;tmp=tmp->above) 39 for (tmp = GET_MAP_OB (map, x, y); tmp != NULL; tmp = tmp->above)
42 count++; 40 count++;
43 return count; 41 return count;
44} 42}
43
45/* put the decor into the map. Right now, it's very primitive. */ 44/* put the decor into the map. Right now, it's very primitive. */
46 45
46void
47void put_decor(mapstruct *map,char **maze,char *decorstyle,int decor_option,RMParms *RP) { 47put_decor (maptile *map, char **maze, char *decorstyle, int decor_option, random_map_params * RP)
48{
48 mapstruct *decor_map; 49 maptile *decor_map;
49 char style_name[256]; 50 char style_name[256];
50 51
51 sprintf(style_name,"/styles/decorstyles"); 52 sprintf (style_name, "/styles/decorstyles");
52 53
53 decor_map = find_style(style_name,decorstyle,-1); 54 decor_map = find_style (style_name, decorstyle, -1);
54 if(decor_map == NULL) return; 55 if (decor_map == NULL)
56 return;
55 /* pick a random option, only 1 option right now. */ 57 /* pick a random option, only 1 option right now. */
56 if(decor_option==0) 58 if (decor_option == 0)
57 decor_option = RANDOM() % NR_DECOR_OPTIONS +1; 59 decor_option = RANDOM () % NR_DECOR_OPTIONS + 1;
58 switch(decor_option) { 60 switch (decor_option)
59 case 0: break; 61 {
60 case 1: { /* random placement of decor objects. */ 62 case 0:
63 break;
64 case 1:
65 { /* random placement of decor objects. */
61 int number_to_place = RANDOM() % ( (RP->Xsize *RP->Ysize) / 5); 66 int number_to_place = RANDOM () % ((RP->Xsize * RP->Ysize) / 5);
62 int failures=0; 67 int failures = 0;
63 object *new_decor_object; 68 object *new_decor_object;
69
64 while(failures < 100 && number_to_place > 0) { 70 while (failures < 100 && number_to_place > 0)
71 {
65 int x,y; 72 int x, y;
73
66 x = RANDOM() % (RP->Xsize-2) +1; 74 x = RANDOM () % (RP->Xsize - 2) + 1;
67 y = RANDOM() % (RP->Ysize-2) +1; 75 y = RANDOM () % (RP->Ysize - 2) + 1;
68 if(maze[x][y]==0 && obj_count_in_map(map,x,y)<2) { /* empty */ 76 if (maze[x][y] == 0 && obj_count_in_map (map, x, y) < 2)
77 { /* empty */
69 object *this_object; 78 object *this_object;
79
70 new_decor_object = pick_random_object(decor_map); 80 new_decor_object = pick_random_object (decor_map);
71 this_object = arch_to_object(new_decor_object->arch); 81 this_object = arch_to_object (new_decor_object->arch);
72 copy_object(new_decor_object,this_object); 82 new_decor_object->copy_to (this_object);
73 this_object->x = x; 83 this_object->x = x;
74 this_object->y = y; 84 this_object->y = y;
75 /* it screws things up if decor can stop people */ 85 /* it screws things up if decor can stop people */
76 this_object->move_block = MOVE_BLOCK_DEFAULT; 86 this_object->move_block = MOVE_BLOCK_DEFAULT;
77 insert_ob_in_map(this_object,map,NULL,0); 87 insert_ob_in_map (this_object, map, NULL, 0);
78 number_to_place--; 88 number_to_place--;
79 } 89 }
80 else 90 else
81 failures++; 91 failures++;
92 }
93 break;
82 } 94 }
95 default:
96 { /* place decor objects everywhere: tile the map. */
97 int i, j;
98
99 for (i = 1; i < RP->Xsize - 1; i++)
100 for (j = 1; j < RP->Ysize - 1; j++)
101 {
102 if (maze[i][j] == 0)
103 {
104 object *new_decor_object, *this_object;
105
106 new_decor_object = pick_random_object (decor_map);
107 this_object = arch_to_object (new_decor_object->arch);
108 new_decor_object->copy_to (this_object);
109 this_object->x = i;
110 this_object->y = j;
111 /* it screws things up if decor can stop people */
112 this_object->move_block = MOVE_BLOCK_DEFAULT;
113 insert_ob_in_map (this_object, map, NULL, 0);
114 }
115 }
83 break; 116 break;
117 }
84 } 118 }
85 default: { /* place decor objects everywhere: tile the map. */
86 int i,j;
87 for(i=1;i<RP->Xsize-1;i++) for(j=1;j<RP->Ysize-1;j++) {
88 if(maze[i][j]==0) {
89 object *new_decor_object, *this_object;
90
91 new_decor_object = pick_random_object(decor_map);
92 this_object = arch_to_object(new_decor_object->arch);
93 copy_object(new_decor_object,this_object);
94 this_object->x = i;
95 this_object->y = j;
96 /* it screws things up if decor can stop people */
97 this_object->move_block = MOVE_BLOCK_DEFAULT;
98 insert_ob_in_map(this_object,map,NULL,0);
99 }
100 }
101 break;
102 }
103 }
104} 119}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines