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.3 by root, Sun Sep 10 16:06:37 2006 UTC vs.
Revision 1.10 by root, Wed Dec 27 09:28:02 2006 UTC

1
2/*
3 * static char *rcsid_style_c =
4 * "$Id: style.C,v 1.3 2006/09/10 16:06:37 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 5 Copyright (C) 1992 Frank Tore Johansen
22 16
23 You should have received a copy of the GNU General Public License 17 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 18 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 20
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 21 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 22*/
29 23
30 24
31#include <global.h> 25#include <global.h>
32#include <random_map.h> 26#include <random_map.h>
33#ifndef WIN32 /* ---win32 exclude headers */
34# include <dirent.h> 27#include <dirent.h>
35# include <sys/stat.h> 28#include <sys/stat.h>
36# include <unistd.h> 29#include <unistd.h>
37# include "../include/autoconf.h" 30#include "../include/autoconf.h"
38#endif /* win32 */
39 31
40 32
41static int 33static int
42pointer_strcmp (const void *p1, const void *p2) 34pointer_strcmp (const void *p1, const void *p2)
43{ 35{
89 if (entries == entry_size) 81 if (entries == entry_size)
90 { 82 {
91 entry_size += 10; 83 entry_size += 10;
92 rn = (char **) realloc (rn, sizeof (char *) * entry_size); 84 rn = (char **) realloc (rn, sizeof (char *) * entry_size);
93 } 85 }
94 rn[entries] = strdup_local (d->d_name); 86 rn[entries] = strdup (d->d_name);
95 entries++; 87 entries++;
96 88
97 } 89 }
98 (void) closedir (dp); 90 (void) closedir (dp);
99 91
115 * Otherwise, it tries to match the difficulty given with a style 107 * Otherwise, it tries to match the difficulty given with a style
116 * file, named style_name_# where # is an integer 108 * file, named style_name_# where # is an integer
117 */ 109 */
118 110
119/* remove extern, so visible to command_style_map_info function */ 111/* remove extern, so visible to command_style_map_info function */
120mapstruct *styles = NULL; 112maptile *styles = NULL;
121 113
122 114
123mapstruct * 115maptile *
124load_style_map (char *style_name) 116load_style_map (char *style_name)
125{ 117{
126 mapstruct *style_map; 118 maptile *style_map;
127 119
128 /* Given a file. See if its in memory */ 120 /* Given a file. See if its in memory */
129 for (style_map = styles; style_map != NULL; style_map = style_map->next) 121 for (style_map = styles; style_map != NULL; style_map = style_map->next)
130 {
131 if (!strcmp (style_name, style_map->path)) 122 if (!strcmp (style_name, style_map->path))
132 return style_map; 123 return style_map;
133 } 124
134 style_map = load_original_map (style_name, MAP_STYLE); 125 style_map = load_original_map (style_name, MAP_STYLE);
126
135 /* Remove it from global list, put it on our local list */ 127 /* Remove it from global list, put it on our local list */
136 if (style_map) 128 if (style_map)
137 { 129 {
138 mapstruct *tmp; 130 maptile *tmp;
139 131
140 if (style_map == first_map) 132 if (style_map == first_map)
141 first_map = style_map->next; 133 first_map = style_map->next;
142 else 134 else
143 { 135 {
144 for (tmp = first_map; tmp && tmp->next != style_map; tmp = tmp->next); 136 for (tmp = first_map; tmp && tmp->next != style_map; tmp = tmp->next);
145 if (tmp) 137 if (tmp)
146 tmp->next = style_map->next; 138 tmp->next = style_map->next;
147 } 139 }
140
148 style_map->next = styles; 141 style_map->next = styles;
149 styles = style_map; 142 styles = style_map;
150 } 143 }
144
151 return style_map; 145 return style_map;
152} 146}
153 147
154mapstruct * 148maptile *
155find_style (const char *dirname, const char *stylename, int difficulty) 149find_style (const char *dirname, const char *stylename, int difficulty)
156{ 150{
157 char style_file_path[256]; 151 char style_file_path[256];
158 char style_file_full_path[256]; 152 char style_file_full_path[256];
159 mapstruct *style_map = NULL; 153 maptile *style_map = NULL;
160 struct stat file_stat; 154 struct stat file_stat;
161 int i, only_subdirs = 0; 155 int i, only_subdirs = 0;
162 156
163 /* if stylename exists, set style_file_path to that file. */ 157 /* if stylename exists, set style_file_path to that file. */
164 if (stylename && strlen (stylename) > 0) 158 if (stylename && strlen (stylename) > 0)
259/* picks a random object from a style map. 253/* picks a random object from a style map.
260 * Redone by MSW so it should be faster and not use static 254 * Redone by MSW so it should be faster and not use static
261 * variables to generate tables. 255 * variables to generate tables.
262 */ 256 */
263object * 257object *
264pick_random_object (mapstruct *style) 258pick_random_object (maptile *style)
265{ 259{
266 int x, y, limit = 0; 260 int x, y, limit = 0;
267 object *new_obj; 261 object *new_obj;
268 262
269 /* while returning a null object will result in a crash, that 263 /* while returning a null object will result in a crash, that
273 * any difference, but this seems clearer to me. 267 * any difference, but this seems clearer to me.
274 */ 268 */
275 do 269 do
276 { 270 {
277 limit++; 271 limit++;
278 x = RANDOM () % MAP_WIDTH (style); 272 x = RANDOM () % style->width;
279 y = RANDOM () % MAP_HEIGHT (style); 273 y = RANDOM () % style->height;
280 new_obj = get_map_ob (style, x, y); 274 new_obj = GET_MAP_OB (style, x, y);
281 } 275 }
282 while (new_obj == NULL && limit < 1000); 276 while (new_obj == NULL && limit < 1000);
283 if (new_obj->head) 277 if (new_obj->head)
284 return new_obj->head; 278 return new_obj->head;
285 else 279 else
288 282
289 283
290void 284void
291free_style_maps (void) 285free_style_maps (void)
292{ 286{
293 mapstruct *next; 287 maptile *next;
294 int style_maps = 0; 288 int style_maps = 0;
295 289
296 /* delete_map will try to free it from the linked list, 290 /* delete_map will try to free it from the linked list,
297 * but won't find it, so we need to do it ourselves 291 * but won't find it, so we need to do it ourselves
298 */ 292 */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines