ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/decor.C
Revision: 1.22
Committed: Mon Oct 12 14:00:58 2009 UTC (14 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_82, rel-2_81, rel-2_90, rel-2_92, rel-2_93
Changes since 1.21: +7 -6 lines
Log Message:
clarify license

File Contents

# User Rev Content
1 elmex 1.1 /*
2 root 1.17 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 pippijn 1.11 *
4 root 1.18 * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.16 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7 pippijn 1.11 *
8 root 1.22 * Deliantra is free software: you can redistribute it and/or modify it under
9     * the terms of the Affero GNU General Public License as published by the
10     * Free Software Foundation, either version 3 of the License, or (at your
11     * option) any later version.
12 pippijn 1.11 *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 root 1.16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 pippijn 1.11 * GNU General Public License for more details.
17     *
18 root 1.22 * You should have received a copy of the Affero GNU General Public License
19     * and the GNU General Public License along with this program. If not, see
20     * <http://www.gnu.org/licenses/>.
21 root 1.16 *
22 root 1.17 * The authors can be reached via e-mail to <support@deliantra.net>
23 pippijn 1.11 */
24 elmex 1.1
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.21 static 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 root 1.21 for (tmp = map->at (x, y).bot; tmp; tmp = tmp->above)
40     ++count;
41 root 1.19
42 elmex 1.1 return count;
43     }
44 root 1.2
45 elmex 1.1 /* put the decor into the map. Right now, it's very primitive. */
46    
47 root 1.2 void
48 root 1.8 put_decor (maptile *map, char **maze, char *decorstyle, int decor_option, random_map_params *RP)
49 root 1.2 {
50 root 1.4 maptile *decor_map;
51 root 1.9 char style_name[1024];
52 elmex 1.1
53 root 1.2 sprintf (style_name, "/styles/decorstyles");
54 elmex 1.1
55 root 1.2 decor_map = find_style (style_name, decorstyle, -1);
56 root 1.12 if (!decor_map)
57 root 1.2 return;
58 root 1.12
59 elmex 1.1 /* pick a random option, only 1 option right now. */
60 root 1.2 if (decor_option == 0)
61 root 1.21 decor_option = rmg_rndm (NR_DECOR_OPTIONS) + 1;
62 root 1.12
63 root 1.2 switch (decor_option)
64     {
65 root 1.8 case 0:
66     break;
67 root 1.20
68 root 1.8 case 1:
69     { /* random placement of decor objects. */
70 root 1.21 int number_to_place = rmg_rndm (RP->Xsize * RP->Ysize / 5);
71 root 1.8 int failures = 0;
72    
73     while (failures < 100 && number_to_place > 0)
74     {
75 root 1.21 coroapi::cede_to_tick ();
76    
77     int x = rmg_rndm (RP->Xsize - 2) + 1;
78     int y = rmg_rndm (RP->Ysize - 2) + 1;
79 root 1.8
80     if (maze[x][y] == 0 && obj_count_in_map (map, x, y) < 2)
81 root 1.20 {
82 root 1.21 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
83 root 1.8 /* it screws things up if decor can stop people */
84 elmex 1.15 this_object->move_block = 0;
85 root 1.21 map->insert (this_object, x, y, 0, 0);
86 root 1.20
87 root 1.8 number_to_place--;
88     }
89     else
90     failures++;
91     }
92 root 1.2 break;
93 root 1.8 }
94 root 1.20
95 root 1.8 default:
96     { /* place decor objects everywhere: tile the map. */
97     int i, j;
98 root 1.2
99 root 1.8 for (i = 1; i < RP->Xsize - 1; i++)
100     for (j = 1; j < RP->Ysize - 1; j++)
101 root 1.2 {
102 root 1.8 if (maze[i][j] == 0)
103     {
104 root 1.21 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
105 root 1.2
106 root 1.8 this_object->x = i;
107     this_object->y = j;
108 root 1.2 /* it screws things up if decor can stop people */
109 elmex 1.15 this_object->move_block = 0;
110 root 1.20
111 root 1.2 insert_ob_in_map (this_object, map, NULL, 0);
112     }
113     }
114 root 1.8 break;
115     }
116 elmex 1.1 }
117     }
118 root 1.20