ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/decor.C
Revision: 1.4
Committed: Sat Sep 16 22:24:12 2006 UTC (17 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.3: +3 -3 lines
Log Message:
mapstruct => maptile
removed many ytypedefs in favor of structure tags

File Contents

# User Rev Content
1 elmex 1.1 /*
2     CrossFire, A Multiplayer game for X-windows
3    
4     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5     Copyright (C) 1992 Frank Tore Johansen
6    
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 root 1.3 The authors can be reached via e-mail at <crossfire@schmorp.de>
22 elmex 1.1 */
23    
24    
25     #include <global.h>
26     #include <random_map.h>
27     #include <rproto.h>
28    
29     #define NR_DECOR_OPTIONS 1
30    
31     /* return a simple count of objects in the map at x,y. */
32    
33 root 1.2 int
34 root 1.4 obj_count_in_map (maptile *map, int x, int y)
35 root 1.2 {
36     int count = 0;
37 elmex 1.1 object *tmp;
38 root 1.2
39     for (tmp = get_map_ob (map, x, y); tmp != NULL; tmp = tmp->above)
40     count++;
41 elmex 1.1 return count;
42     }
43 root 1.2
44 elmex 1.1 /* put the decor into the map. Right now, it's very primitive. */
45    
46 root 1.2 void
47 root 1.4 put_decor (maptile *map, char **maze, char *decorstyle, int decor_option, RMParms * RP)
48 root 1.2 {
49 root 1.4 maptile *decor_map;
50 elmex 1.1 char style_name[256];
51    
52 root 1.2 sprintf (style_name, "/styles/decorstyles");
53 elmex 1.1
54 root 1.2 decor_map = find_style (style_name, decorstyle, -1);
55     if (decor_map == NULL)
56     return;
57 elmex 1.1 /* pick a random option, only 1 option right now. */
58 root 1.2 if (decor_option == 0)
59     decor_option = RANDOM () % NR_DECOR_OPTIONS + 1;
60     switch (decor_option)
61     {
62     case 0:
63     break;
64     case 1:
65     { /* random placement of decor objects. */
66     int number_to_place = RANDOM () % ((RP->Xsize * RP->Ysize) / 5);
67     int failures = 0;
68     object *new_decor_object;
69    
70     while (failures < 100 && number_to_place > 0)
71     {
72     int x, y;
73    
74     x = RANDOM () % (RP->Xsize - 2) + 1;
75     y = RANDOM () % (RP->Ysize - 2) + 1;
76     if (maze[x][y] == 0 && obj_count_in_map (map, x, y) < 2)
77     { /* empty */
78     object *this_object;
79    
80     new_decor_object = pick_random_object (decor_map);
81     this_object = arch_to_object (new_decor_object->arch);
82     copy_object (new_decor_object, this_object);
83     this_object->x = x;
84     this_object->y = y;
85     /* it screws things up if decor can stop people */
86     this_object->move_block = MOVE_BLOCK_DEFAULT;
87     insert_ob_in_map (this_object, map, NULL, 0);
88     number_to_place--;
89     }
90     else
91     failures++;
92     }
93     break;
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     copy_object (new_decor_object, 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     }
116     break;
117     }
118 elmex 1.1 }
119     }