ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/random_maps/decor.C
Revision: 1.29
Committed: Sun Aug 22 20:23:06 2010 UTC (13 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.28: +1 -1 lines
Log Message:
rproto.h => include and random_map.h => include/rmg.h

File Contents

# Content
1 /*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2002 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992 Frank Tore Johansen
7 *
8 * 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 *
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 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * 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 *
22 * The authors can be reached via e-mail to <support@deliantra.net>
23 */
24
25 #include <global.h>
26 #include <rmg.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 static int
34 obj_count_in_map (maptile *map, int x, int y)
35 {
36 int count = 0;
37
38 for (object *tmp = map->at (x, y).bot; tmp; tmp = tmp->above)
39 ++count;
40
41 return count;
42 }
43
44 /* put the decor into the map. Right now, it's very primitive. */
45
46 void
47 put_decor (maptile *map, layout &maze, const char *decorstyle, int decor_option, random_map_params *RP)
48 {
49 maptile *decor_map = find_style ("/styles/decorstyles", decorstyle, RP->difficulty);
50 if (!decor_map)
51 return;
52
53 /* pick a random option, only 1 option right now. */
54 if (decor_option == 0)
55 decor_option = rmg_rndm (NR_DECOR_OPTIONS) + 1;
56
57 switch (decor_option)
58 {
59 case 0:
60 break;
61
62 case 1:
63 { /* random placement of decor objects. */
64 int number_to_place = rmg_rndm (RP->Xsize * RP->Ysize / 5);
65 int failures = 0;
66
67 while (failures < 100 && number_to_place > 0)
68 {
69 //coroapi::cede_to_tick ();
70
71 int x = rmg_rndm (RP->Xsize - 2) + 1;
72 int y = rmg_rndm (RP->Ysize - 2) + 1;
73
74 if (maze[x][y] == 0 && obj_count_in_map (map, x, y) < 2)
75 {
76 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
77 /* it screws things up if decor can stop people */
78 this_object->move_block = 0;
79 map->insert (this_object, x, y, 0, 0);
80
81 number_to_place--;
82 }
83 else
84 failures++;
85 }
86 break;
87 }
88
89 default:
90 {
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 {
95 if (maze[i][j] == 0)
96 {
97 object *this_object = decor_map->pick_random_object (rmg_rndm)->clone ();
98
99 this_object->x = i;
100 this_object->y = j;
101 /* it screws things up if decor can stop people */
102 this_object->move_block = 0;
103
104 insert_ob_in_map (this_object, map, 0, 0);
105 }
106 }
107
108 break;
109 }
110 }
111 }
112