[Freeciv-Dev] Updated patch which checks # of islands with 'gen 1' and '
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
My last patch which allows people to use 'gen 1' and 'gen 5' maps and
have each player have their own island had a nasty memory leak. I have
plugged the memory leak (and had this patch generate nearly 1.000.000
maps to make sure the memory leak was plugged), and here is the revised
patch.
- Sam
diff -ur freeciv-1.14.0/server/mapgen.c
freeciv-1.14.0-checkisles/server/mapgen.c
--- freeciv-1.14.0/server/mapgen.c Fri Oct 11 16:35:50 2002
+++ freeciv-1.14.0-checkisles/server/mapgen.c Tue Mar 11 11:36:12 2003
@@ -941,8 +941,9 @@
Allocate islands array and fill in values.
Note this is only use for map.generator<=1, since others
setups islands and starters explicitly.
+ Output: The number of good islands that this map has
**************************************************************************/
-static void setup_isledata(void)
+int setup_isledata(void)
{
int x;
int good, mingood, maxgood;
@@ -1104,6 +1105,7 @@
}
freelog(LOG_DEBUG, "The map has %i starting positions on %i isles.",
starters, goodisles);
+ return goodisles;
}
/**************************************************************************
@@ -1113,17 +1115,47 @@
FIXME: MAXTRIES used to be 1.000.000, but has been raised to 10.000.000
because a set of values hit the limit. At some point we want to
make a better solution.
+ Output: Whether this is a good map; 1 if yes, 0 if no
**************************************************************************/
#define MAXTRIES 10000000
-void create_start_positions(void)
+int create_start_positions(void)
{
int nr=0;
int dist=40;
int x, y, j=0, k, sum;
int counter = 0;
+ int isles;
+
+ isles = 10000; /* Big number so this passes the "own island" test */
if (!islands) /* already setup for generators 2,3, and 4 */
- setup_isledata();
+ isles = setup_isledata();
+
+ if(isles < game.nplayers) { /* Each player gets their own island */
+ printf("Seed %d does not create enough islands for %d players.\n",
+ map.seed,game.nplayers);
+ map.seed++;
+ free(islands);
+ free(height_map);
+ free(river_map);
+ islands = NULL;
+ height_map = NULL;
+ river_map = NULL;
+ maxval = 0;
+ forests = 0;
+ free(map.tiles);
+ map.tiles = NULL;
+ map.num_continents = 0;
+ map.num_start_positions = 0;
+ map.have_specials = FALSE;
+ map.have_huts = FALSE;
+ /* Initializing the next two may not be necessary */
+ map.fixed_start_positions = FALSE;
+ map.have_rivers_overlay = FALSE;
+ return 0;
+ }
+
+ printf("Using seed %d\n",map.seed);
if(dist>= map.xsize/2)
dist= map.xsize/2;
@@ -1169,6 +1201,7 @@
free(islands);
islands = NULL;
+ return 1; /* Good map */
}
/**************************************************************************
diff -ur freeciv-1.14.0/server/mapgen.h
freeciv-1.14.0-checkisles/server/mapgen.h
--- freeciv-1.14.0/server/mapgen.h Tue Feb 5 11:05:51 2002
+++ freeciv-1.14.0-checkisles/server/mapgen.h Tue Mar 11 11:36:12 2003
@@ -15,7 +15,7 @@
void assign_continent_numbers(void);
void map_fractal_generate(void);
-void create_start_positions(void);
+int create_start_positions(void);
void adjust_terrain_param(void);
#endif /* FC__MAPGEN_H */
diff -ur freeciv-1.14.0/server/srv_main.c
freeciv-1.14.0-checkisles/server/srv_main.c
--- freeciv-1.14.0/server/srv_main.c Fri Oct 11 16:35:50 2002
+++ freeciv-1.14.0-checkisles/server/srv_main.c Tue Mar 11 11:45:05 2003
@@ -1798,6 +1798,7 @@
void srv_main(void)
{
int i;
+ int is_good_map;
/* make sure it's initialized */
if (!has_been_srv_init) {
@@ -1943,7 +1944,11 @@
if(game.is_new_game)
generate_ai_players();
-
+
+ /* This is a loop which will recreate the map in case the map
+ generator decides the generated map is not good enough */
+ do {
+
/* if we have a tile map, and map.generator==0, call map_fractal_generate
anyway, to make the specials and huts */
if(map_is_empty() || (map.generator == 0 && game.is_new_game))
@@ -1972,13 +1977,23 @@
} players_iterate_end;
game.max_players=game.nplayers;
+ is_good_map = 1;
/* we don't want random start positions in a scenario which already
provides them. -- Gudy */
if(map.num_start_positions==0) {
- create_start_positions();
+ is_good_map = create_start_positions();
}
}
+ /* Save the whales, free the mallocs */
+ if(is_good_map == 0) {
+ players_iterate(pplayer) {
+ free(pplayer->private_map);
+ } players_iterate_end;
+ }
+
+ } while(is_good_map == 0);
+
initialize_move_costs(); /* this may be the wrong place to do this */
generate_minimap(); /* for city_desire; saves a lot of calculations */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Freeciv-Dev] Updated patch which checks # of islands with 'gen 1' and 'gen 5' maps,
sam+civ <=
|
|