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.13 by root, Sun Dec 31 10:28:36 2006 UTC vs.
Revision 1.20 by pippijn, Sat Jan 6 14:42:30 2007 UTC

1
1/* 2/*
2 CrossFire, A Multiplayer game for X-windows 3 CrossFire, A Multiplayer game for X-windows
3 4
5 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 6 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 7 Copyright (C) 1992 Frank Tore Johansen
6 8
7 This program is free software; you can redistribute it and/or modify 9 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 10 it under the terms of the GNU General Public License as published by
18 along with this program; if not, write to the Free Software 20 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 22
21 The authors can be reached via e-mail at <crossfire@schmorp.de> 23 The authors can be reached via e-mail at <crossfire@schmorp.de>
22*/ 24*/
23
24 25
25#include <global.h> 26#include <global.h>
26#include <random_map.h> 27#include <random_map.h>
27#include <dirent.h> 28#include <dirent.h>
28#include <sys/stat.h> 29#include <sys/stat.h>
29#include <unistd.h> 30#include <unistd.h>
30#include "../include/autoconf.h" 31#include "../include/autoconf.h"
31
32 32
33static int 33static int
34pointer_strcmp (const void *p1, const void *p2) 34pointer_strcmp (const void *p1, const void *p2)
35{ 35{
36 const char *s1 = *(const char **) p1; 36 const char *s1 = *(const char **) p1;
96} 96}
97 97
98maptile * 98maptile *
99find_style (const char *dirname, const char *stylename, int difficulty) 99find_style (const char *dirname, const char *stylename, int difficulty)
100{ 100{
101 char style_file_path[256]; 101 char style_file_path[1024];
102 char style_file_full_path[256]; 102 char style_file_full_path[1024];
103 maptile *style_map = NULL; 103 maptile *style_map = NULL;
104 struct stat file_stat; 104 struct stat file_stat;
105 int i, only_subdirs = 0; 105 int i, only_subdirs = 0;
106 106
107 /* if stylename exists, set style_file_path to that file. */ 107 /* if stylename exists, set style_file_path to that file. */
110 else /* otherwise, just use the dirname. We'll pick a random stylefile. */ 110 else /* otherwise, just use the dirname. We'll pick a random stylefile. */
111 sprintf (style_file_path, "%s", dirname); 111 sprintf (style_file_path, "%s", dirname);
112 112
113 /* is what we were given a directory, or a file? */ 113 /* is what we were given a directory, or a file? */
114 sprintf (style_file_full_path, "%s/maps%s", settings.datadir, style_file_path); 114 sprintf (style_file_full_path, "%s/maps%s", settings.datadir, style_file_path);
115
115 if (stat (style_file_full_path, &file_stat) == 0 && !S_ISDIR (file_stat.st_mode)) 116 if (stat (style_file_full_path, &file_stat) == 0 && !S_ISDIR (file_stat.st_mode))
116 style_map = maptile::load_map_sync (style_file_path); 117 style_map = maptile::find_sync (style_file_path);
117 118
118 if (!style_map) /* maybe we were given a directory! */ 119 if (!style_map) /* maybe we were given a directory! */
119 { 120 {
120 char **namelist; 121 char **namelist;
121 int n; 122 int n;
122 char style_dir_full_path[256]; 123 char style_dir_full_path[256];
123 124
149 style_map = 0; 150 style_map = 0;
150 else 151 else
151 { 152 {
152 strcat (style_file_path, "/"); 153 strcat (style_file_path, "/");
153 strcat (style_file_path, namelist[RANDOM () % n]); 154 strcat (style_file_path, namelist[RANDOM () % n]);
154 style_map = maptile::load_map_sync (style_file_path); 155 style_map = maptile::find_sync (style_file_path);
155 } 156 }
156 } 157 }
157 else 158 else
158 { /* find the map closest in difficulty */ 159 { /* find the map closest in difficulty */
159 int min_dist = 32000, min_index = -1; 160 int min_dist = 32000, min_index = -1;
182 min_dist = dist; 183 min_dist = dist;
183 min_index = i; 184 min_index = i;
184 } 185 }
185 } 186 }
186 } 187 }
188
187 /* presumably now we've found the "best" match for the 189 /* presumably now we've found the "best" match for the
188 difficulty. */ 190 difficulty. */
189 strcat (style_file_path, "/"); 191 strcat (style_file_path, "/");
190 strcat (style_file_path, namelist[min_index]); 192 strcat (style_file_path, namelist[min_index]);
191 style_map = maptile::load_map_sync (style_file_path); 193 style_map = maptile::find_sync (style_file_path);
192 } 194 }
193 195
194 for (i = 0; i < n; i++) 196 for (i = 0; i < n; i++)
195 free (namelist[i]); 197 free (namelist[i]);
196 198
197 free (namelist); 199 free (namelist);
200 }
201
202 if (style_map)
203 {
204 style_map->load_sync ();
205 style_map->deactivate ();
198 } 206 }
199 207
200 return style_map; 208 return style_map;
201 209
202} 210}
206 * variables to generate tables. 214 * variables to generate tables.
207 */ 215 */
208object * 216object *
209pick_random_object (maptile *style) 217pick_random_object (maptile *style)
210{ 218{
211 int x, y, limit = 0;
212 object *new_obj;
213
214 /* while returning a null object will result in a crash, that 219 /* while returning a null object will result in a crash, that
215 * is actually preferable to an infinite loop. That is because 220 * is actually preferable to an infinite loop. That is because
216 * most servers will automatically restart in case of crash. 221 * most servers will automatically restart in case of crash.
217 * Change the logic on getting the random space - shouldn't make 222 * Change the logic on getting the random space - shouldn't make
218 * any difference, but this seems clearer to me. 223 * any difference, but this seems clearer to me.
219 */ 224 */
220 do 225 for (int i = 1000; --i;)
221 {
222 limit++;
223 x = RANDOM () % style->width;
224 y = RANDOM () % style->height;
225 new_obj = GET_MAP_OB (style, x, y);
226 } 226 {
227 while (new_obj == NULL && limit < 1000); 227 object *new_obj = style->at (RANDOM () % style->width, RANDOM () % style->height).bot;
228 228
229 if (new_obj->head) 229 if (new_obj)
230 return new_obj->head; 230 return new_obj->head_ ();
231 else 231 }
232 return new_obj;
233}
234 232
233 // instead of crashing in the unlikely case, try to return *something*
234 return get_archetype ("blocked");
235}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines