ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/decor.C
Revision: 1.26
Committed: Tue Apr 13 02:39:53 2010 UTC (14 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-3_0
Changes since 1.25: +9 -15 lines
Log Message:
*** empty log message ***

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.24 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 root 1.23 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992 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    
38 root 1.26 for (object *tmp = map->at (x, y).bot; tmp; tmp = tmp->above)
39 root 1.21 ++count;
40 root 1.19
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.8 put_decor (maptile *map, char **maze, char *decorstyle, int decor_option, random_map_params *RP)
48 root 1.2 {
49 root 1.26 maptile *decor_map = find_style ("/styles/decorstyles", decorstyle, RP->difficulty);
50 root 1.12 if (!decor_map)
51 root 1.2 return;
52 root 1.12
53 elmex 1.1 /* pick a random option, only 1 option right now. */
54 root 1.2 if (decor_option == 0)
55 root 1.21 decor_option = rmg_rndm (NR_DECOR_OPTIONS) + 1;
56 root 1.12
57 root 1.2 switch (decor_option)
58     {
59 root 1.8 case 0:
60     break;
61 root 1.20
62 root 1.8 case 1:
63     { /* random placement of decor objects. */
64 root 1.21 int number_to_place = rmg_rndm (RP->Xsize * RP->Ysize / 5);
65 root 1.8 int failures = 0;
66    
67     while (failures < 100 && number_to_place > 0)
68     {
69 root 1.26 //coroapi::cede_to_tick ();
70 root 1.21
71     int x = rmg_rndm (RP->Xsize - 2) + 1;
72     int y = rmg_rndm (RP->Ysize - 2) + 1;
73 root 1.8
74     if (maze[x][y] == 0 && obj_count_in_map (map, x, y) < 2)
75 root 1.20 {
76 root 1.21 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
77 root 1.8 /* it screws things up if decor can stop people */
78 elmex 1.15 this_object->move_block = 0;
79 root 1.21 map->insert (this_object, x, y, 0, 0);
80 root 1.20
81 root 1.8 number_to_place--;
82     }
83     else
84     failures++;
85     }
86 root 1.2 break;
87 root 1.8 }
88 root 1.20
89 root 1.8 default:
90 root 1.26 {
91     /* place decor objects everywhere: tile the map. */
92     for (int i = 1; i < RP->Xsize - 1; i++)
93     for (int j = 1; j < RP->Ysize - 1; j++)
94 root 1.2 {
95 root 1.8 if (maze[i][j] == 0)
96     {
97 root 1.21 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
98 root 1.2
99 root 1.8 this_object->x = i;
100     this_object->y = j;
101 root 1.2 /* it screws things up if decor can stop people */
102 elmex 1.15 this_object->move_block = 0;
103 root 1.20
104 root 1.26 insert_ob_in_map (this_object, map, 0, 0);
105 root 1.2 }
106     }
107 root 1.26
108 root 1.8 break;
109     }
110 elmex 1.1 }
111     }
112 root 1.20