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

Comparing deliantra/server/random_maps/style.C (file contents):
Revision 1.5 by root, Sat Sep 16 22:24:13 2006 UTC vs.
Revision 1.15 by root, Sun Dec 31 18:10:41 2006 UTC

19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 20
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 22*/
23 23
24
25#include <global.h> 24#include <global.h>
26#include <random_map.h> 25#include <random_map.h>
27#ifndef WIN32 /* ---win32 exclude headers */
28# include <dirent.h> 26#include <dirent.h>
29# include <sys/stat.h> 27#include <sys/stat.h>
30# include <unistd.h> 28#include <unistd.h>
31# include "../include/autoconf.h" 29#include "../include/autoconf.h"
32#endif /* win32 */
33
34 30
35static int 31static int
36pointer_strcmp (const void *p1, const void *p2) 32pointer_strcmp (const void *p1, const void *p2)
37{ 33{
38 const char *s1 = *(const char **) p1; 34 const char *s1 = *(const char **) p1;
83 if (entries == entry_size) 79 if (entries == entry_size)
84 { 80 {
85 entry_size += 10; 81 entry_size += 10;
86 rn = (char **) realloc (rn, sizeof (char *) * entry_size); 82 rn = (char **) realloc (rn, sizeof (char *) * entry_size);
87 } 83 }
88 rn[entries] = strdup_local (d->d_name); 84 rn[entries] = strdup (d->d_name);
89 entries++; 85 entries++;
90 86
91 } 87 }
92 (void) closedir (dp); 88 (void) closedir (dp);
93 89
94 qsort (rn, entries, sizeof (char *), pointer_strcmp); 90 qsort (rn, entries, sizeof (char *), pointer_strcmp);
95 91
96 *namelist = rn; 92 *namelist = rn;
97 return entries; 93 return entries;
98}
99
100
101
102
103
104/* this function loads and returns the map requested.
105 * dirname, for example, is "/styles/wallstyles", stylename, is,
106 * for example, "castle", difficulty is -1 when difficulty is
107 * irrelevant to the style. If dirname is given, but stylename
108 * isn't, and difficult is -1, it returns a random style map.
109 * Otherwise, it tries to match the difficulty given with a style
110 * file, named style_name_# where # is an integer
111 */
112
113/* remove extern, so visible to command_style_map_info function */
114maptile *styles = NULL;
115
116
117maptile *
118load_style_map (char *style_name)
119{
120 maptile *style_map;
121
122 /* Given a file. See if its in memory */
123 for (style_map = styles; style_map != NULL; style_map = style_map->next)
124 {
125 if (!strcmp (style_name, style_map->path))
126 return style_map;
127 }
128 style_map = load_original_map (style_name, MAP_STYLE);
129 /* Remove it from global list, put it on our local list */
130 if (style_map)
131 {
132 maptile *tmp;
133
134 if (style_map == first_map)
135 first_map = style_map->next;
136 else
137 {
138 for (tmp = first_map; tmp && tmp->next != style_map; tmp = tmp->next);
139 if (tmp)
140 tmp->next = style_map->next;
141 }
142 style_map->next = styles;
143 styles = style_map;
144 }
145 return style_map;
146} 94}
147 95
148maptile * 96maptile *
149find_style (const char *dirname, const char *stylename, int difficulty) 97find_style (const char *dirname, const char *stylename, int difficulty)
150{ 98{
160 else /* otherwise, just use the dirname. We'll pick a random stylefile. */ 108 else /* otherwise, just use the dirname. We'll pick a random stylefile. */
161 sprintf (style_file_path, "%s", dirname); 109 sprintf (style_file_path, "%s", dirname);
162 110
163 /* is what we were given a directory, or a file? */ 111 /* is what we were given a directory, or a file? */
164 sprintf (style_file_full_path, "%s/maps%s", settings.datadir, style_file_path); 112 sprintf (style_file_full_path, "%s/maps%s", settings.datadir, style_file_path);
113
165 if (stat (style_file_full_path, &file_stat) == 0 && !S_ISDIR (file_stat.st_mode)) 114 if (stat (style_file_full_path, &file_stat) == 0 && !S_ISDIR (file_stat.st_mode))
166 {
167 style_map = load_style_map (style_file_path); 115 style_map = maptile::load_map_sync (style_file_path);
168 } 116
169 if (style_map == NULL) /* maybe we were given a directory! */ 117 if (!style_map) /* maybe we were given a directory! */
170 { 118 {
171 char **namelist; 119 char **namelist;
172 int n; 120 int n;
173 char style_dir_full_path[256]; 121 char style_dir_full_path[256];
174 122
195 * it properly. 143 * it properly.
196 */ 144 */
197 if (difficulty == -1) 145 if (difficulty == -1)
198 { /* pick a random style from this dir. */ 146 { /* pick a random style from this dir. */
199 if (only_subdirs) 147 if (only_subdirs)
200 style_map = NULL; 148 style_map = 0;
201 else 149 else
202 { 150 {
203 strcat (style_file_path, "/"); 151 strcat (style_file_path, "/");
204 strcat (style_file_path, namelist[RANDOM () % n]); 152 strcat (style_file_path, namelist[RANDOM () % n]);
205 style_map = load_style_map (style_file_path); 153 style_map = maptile::load_map_sync (style_file_path);
206 } 154 }
207 } 155 }
208 else 156 else
209 { /* find the map closest in difficulty */ 157 { /* find the map closest in difficulty */
210 int min_dist = 32000, min_index = -1; 158 int min_dist = 32000, min_index = -1;
233 min_dist = dist; 181 min_dist = dist;
234 min_index = i; 182 min_index = i;
235 } 183 }
236 } 184 }
237 } 185 }
186
238 /* presumably now we've found the "best" match for the 187 /* presumably now we've found the "best" match for the
239 difficulty. */ 188 difficulty. */
240 strcat (style_file_path, "/"); 189 strcat (style_file_path, "/");
241 strcat (style_file_path, namelist[min_index]); 190 strcat (style_file_path, namelist[min_index]);
242 style_map = load_style_map (style_file_path); 191 style_map = maptile::load_map_sync (style_file_path);
243 } 192 }
193
244 for (i = 0; i < n; i++) 194 for (i = 0; i < n; i++)
245 free (namelist[i]); 195 free (namelist[i]);
196
246 free (namelist); 197 free (namelist);
247 } 198 }
199
200 if (style_map)
201 style_map->deactivate ();
202
248 return style_map; 203 return style_map;
249 204
250} 205}
251
252 206
253/* picks a random object from a style map. 207/* picks a random object from a style map.
254 * Redone by MSW so it should be faster and not use static 208 * Redone by MSW so it should be faster and not use static
255 * variables to generate tables. 209 * variables to generate tables.
256 */ 210 */
257object * 211object *
258pick_random_object (maptile *style) 212pick_random_object (maptile *style)
259{ 213{
260 int x, y, limit = 0;
261 object *new_obj;
262
263 /* while returning a null object will result in a crash, that 214 /* while returning a null object will result in a crash, that
264 * is actually preferable to an infinite loop. That is because 215 * is actually preferable to an infinite loop. That is because
265 * most servers will automatically restart in case of crash. 216 * most servers will automatically restart in case of crash.
266 * Change the logic on getting the random space - shouldn't make 217 * Change the logic on getting the random space - shouldn't make
267 * any difference, but this seems clearer to me. 218 * any difference, but this seems clearer to me.
268 */ 219 */
269 do 220 for (int i = 1000; --i; )
270 { 221 {
271 limit++; 222 object *new_obj = style->at (RANDOM () % style->width, RANDOM () % style->height).bot;
272 x = RANDOM () % MAP_WIDTH (style); 223
273 y = RANDOM () % MAP_HEIGHT (style); 224 if (new_obj)
274 new_obj = get_map_ob (style, x, y); 225 return new_obj->head_ ();
275 } 226 }
276 while (new_obj == NULL && limit < 1000);
277 if (new_obj->head)
278 return new_obj->head;
279 else
280 return new_obj;
281}
282 227
283 228 return 0;
284void
285free_style_maps (void)
286{
287 maptile *next;
288 int style_maps = 0;
289
290 /* delete_map will try to free it from the linked list,
291 * but won't find it, so we need to do it ourselves
292 */
293 while (styles)
294 {
295 next = styles->next;
296 delete_map (styles);
297 styles = next;
298 style_maps++;
299 }
300 LOG (llevDebug, "free_style_maps: Freed %d maps\n", style_maps);
301} 229}
230

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines