[Freeciv-Dev] Re: (PR#9918) create a pleced map and rename map_temperatu
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: |
undisclosed-recipients: ; |
Subject: |
[Freeciv-Dev] Re: (PR#9918) create a pleced map and rename map_temperature has map_lattitude |
From: |
"Marcelo Burda" <mburda@xxxxxxxxx> |
Date: |
Sat, 4 Sep 2004 03:22:19 -0700 |
Reply-to: |
rt@xxxxxxxxxxx |
<URL: http://rt.freeciv.org/Ticket/Display.html?id=9918 >
Le sam 04/09/2004 à 10:06, Mateusz Stefek a écrit :
> <URL: http://rt.freeciv.org/Ticket/Display.html?id=9918 >
>
> > [mburda - Fri Sep 03 21:12:37 2004]:
> > there is the spilted one
> >
> > Marcelo
> >
> You also introduce huts code in it.
this chage is needed has
if (rand_map_pos_temperature(&x, &y,
> - 2 * ICE_BASE_LEVEL, MAX_TEMP, T_ANY)
+ 2 * ICE_BASE_LEVEL, MAX_TEMP)) {
then, placed has to be seted as not placed to allow find its!
> I added some comments and fixed style in few places.
> --
> mateusz
>
>
> ______________________________________________________________________
> ? civgame-1550.sav.gz
> ? civgame-2000.sav.gz
> ? civgame-2500.sav.gz
> ? civgame-3000.sav.gz
> ? civgame-3350.sav.gz
> ? civgame-3500.sav.gz
> ? civgame-3700.sav.gz
> ? civgame-3800.sav.gz
> ? civgame-3850.sav.gz
> ? civgame-3900.sav.gz
> ? civgame-3950.sav.gz
> Index: mapgen.c
> ===================================================================
> RCS file: /home/freeciv/CVS/freeciv/server/mapgen.c,v
> retrieving revision 1.154
> diff -u -r1.154 mapgen.c
> --- mapgen.c 3 Sep 2004 15:12:26 -0000 1.154
> +++ mapgen.c 4 Sep 2004 08:05:55 -0000
> @@ -54,6 +54,7 @@
> #define hmap(x, y) (height_map[map_pos_to_index(x, y)])
> #define hnat(x, y) (height_map[native_pos_to_index((x), (y))])
> #define rmap(x, y) (river_map[map_pos_to_index(x, y)])
> +#define pmap(x, y) (placed_map[map_pos_to_index(x, y)])
>
> static void make_huts(int number);
> static void add_specials(int prob);
> @@ -98,14 +99,7 @@
> };
> static struct isledata *islands;
>
> -#define T_NOT_PLACED T_UNKNOWN
> -
> -/**************************************************************************
> - Checks if land has not yet been placed on tile at (x, y)
> - **************************************************************************/
> -#define not_placed(x, y) (map_get_terrain(x, y) == T_NOT_PLACED)
> -
> -/* this is the maximal temperature at equators returned by map_temperature */
> +/* this is the maximal temperature at equators returned by map_latitude */
> #define MAX_TEMP 1000
>
> /* An estimate of the linear (1-dimensional) size of the map. */
> @@ -133,6 +127,36 @@
> }
>
> /****************************************************************************
> + It can be used to many things, placed terrains on lands, placed huts, etc
> +****************************************************************************/
> +static bool *placed_map;
> +
> +/****************************************************************************
> + Create a clean pmap
> +****************************************************************************/
> +static void create_placed_map(void)
> +{
> + placed_map = fc_malloc (sizeof(bool) * MAX_MAP_INDEX);
> + INITIALIZE_ARRAY(placed_map, MAX_MAP_INDEX, FALSE );
> +}
> +
> +/****************************************************************************
>
> + Free the pmap
> +****************************************************************************/
> +static void remove_placed_map(void)
> +{
> + free(placed_map);
> + placed_map = NULL;
> +}
> +
> +/* Checks if land has not yet been placed on pmap at (x, y) */
> +#define not_placed(x, y) (!pmap((x), (y)))
> +
> +/* set has placed or not placed position in the pmap */
> +#define map_set_placed(x, y) (pmap((x), (y)) = TRUE)
> +#define map_unset_placed(x, y) (pmap((x), (y)) = FALSE)
> +
> +/****************************************************************************
> Returns the temperature of this map position. This is a value in the
> range of 0 to MAX_TEMP (inclusive).
> ****************************************************************************/
> @@ -265,7 +289,6 @@
>
> struct DataFilter {
> int T_min, T_max;
> - Terrain_type_id terrain;
> };
>
> /****************************************************************************
> @@ -277,19 +300,17 @@
> struct DataFilter *filter = data;
> const int T = map_temperature(map_x, map_y);
>
> - return (T >= filter->T_min && T <= filter->T_max
> - && (T_ANY == filter->terrain
> - || map_get_terrain(map_x, map_y) == filter->terrain));
> + return (T >= filter->T_min) && (T <= filter->T_max)
> + && not_placed(map_x, map_y) ;
> }
>
> /****************************************************************************
> Return random map coordinates which have temperature within the selected
> - range and which match the terrain choice (which may be T_ANY). Returns
> - FALSE if there is no such position.
> + range and which are not yet placed on pmap. Returns FALSE if there is no
> + such position.
> ****************************************************************************/
> static bool rand_map_pos_temperature(int *map_x, int *map_y,
> - int T_min, int T_max,
> - Terrain_type_id terrain)
> + int T_min, int T_max)
> {
> struct DataFilter filter;
>
> @@ -300,7 +321,6 @@
>
> filter.T_min = T_min;
> filter.T_max = T_max;
> - filter.terrain = terrain;
> return rand_map_pos_filtered(map_x, map_y, &filter, temperature_filter);
> }
>
> @@ -334,8 +354,10 @@
> if (myrand(100) > 75
> || map_temperature(x, y) <= MAX_TEMP / 10) {
> map_set_terrain(x, y, T_MOUNTAINS);
> + map_set_placed(x, y);
> } else if (myrand(100) > 25) {
> map_set_terrain(x, y, T_HILLS);
> + map_set_placed(x, y);
> }
> }
> } whole_map_iterate_end;
> @@ -357,19 +379,24 @@
> if (T < ICE_BASE_LEVEL) { /* get the coldest part of the map */
> if (ptile->terrain != T_MOUNTAINS) {
> ptile->terrain = T_ARCTIC;
> + map_set_placed(map_x, map_y);
> }
> } else if ((T <= 1.5 * ICE_BASE_LEVEL)
> && (ptile->terrain == T_OCEAN) ) {
> ptile->terrain = T_ARCTIC;
> + map_set_placed(map_x, map_y);
> } else if (T <= 2 * ICE_BASE_LEVEL) {
> if (ptile->terrain == T_OCEAN) {
> if (myrand(10) > 5) {
> ptile->terrain = T_ARCTIC;
> + map_set_placed(map_x, map_y);
> } else if (myrand(10) > 6) {
> ptile->terrain = T_TUNDRA;
> + map_set_placed(map_x, map_y);
> }
> } else if (myrand(10) > 0 && ptile->terrain != T_MOUNTAINS) {
> ptile->terrain = T_TUNDRA;
> + map_set_placed(map_x, map_y);
> }
> }
> } whole_map_iterate_end;
> @@ -388,9 +415,11 @@
> T = map_temperature(map_x, map_y); /* temperature parameter */
> ptile = map_get_tile(map_x, map_y);
> if (T < 1.5 * ICE_BASE_LEVEL) {
> - ptile->terrain = T_NOT_PLACED;
> + ptile->terrain = T_UNKNOWN;
> + map_unset_placed(map_x, map_y);
> } else if ((T <= 2 * ICE_BASE_LEVEL) && myrand(10) > 4 ) {
> - ptile->terrain = T_NOT_PLACED;
> + ptile->terrain = T_UNKNOWN;
> + map_unset_placed(map_x, map_y);
> }
> } whole_map_iterate_end;
> }
> @@ -408,6 +437,7 @@
> if (not_placed(x,y)
> && (2 * ICE_BASE_LEVEL > T || myrand(MAX_TEMP/5) > T)) {
> map_set_terrain(x, y, T_TUNDRA);
> + map_set_placed(x, y);
> }
> } whole_map_iterate_end;
> }
> @@ -424,6 +454,7 @@
> && myrand(15 * MAX_TEMP / 100) > T - ICE_BASE_LEVEL
> && T <= 3 * ICE_BASE_LEVEL) {
> map_set_terrain(x, y, T_ARCTIC);
> + map_set_placed(x, y);
> }
> } whole_map_iterate_end;
> }
> @@ -445,6 +476,7 @@
> if (abs(hmap(x, y) - height) < diff
> && not_placed(x,y)) {
> map_set_terrain(x, y, T_DESERT);
> + map_set_placed(x, y);
> cardinal_adjc_iterate(x, y, x1, y1) {
> make_desert(x1, y1, height,
> diff - 1 - abs(map_temperature(x1, y1) - base_T) / DeltaT,
> @@ -462,10 +494,7 @@
> **************************************************************************/
> static void make_forest(int map_x, int map_y, int height, int diff)
> {
> - int nat_x, nat_y, T;
> -
> - MAP_TO_NATIVE_POS(&nat_x, &nat_y, map_x, map_y);
> - T = map_temperature(map_x, map_y);
> + int T = map_temperature(map_x, map_y);
> if (not_placed(map_x, map_y)) {
> if (T > 8 * MAX_TEMP / 10
> && myrand(1000) > 500 - 300 * (T * 1000 / MAX_TEMP - 800)) {
> @@ -473,6 +502,7 @@
> } else {
> map_set_terrain(map_x, map_y, T_FOREST);
> }
> + map_set_placed(map_x, map_y);
> if (abs(hmap(map_x, map_y) - height) < diff) {
> cardinal_adjc_iterate(map_x, map_y, x1, y1) {
> if (myrand(10) > 5) {
> @@ -498,8 +528,7 @@
> do {
> /* Place one forest clump anywhere. */
> if (rand_map_pos_temperature(&x, &y,
> - MAX_TEMP / 10, MAX_TEMP,
> - T_NOT_PLACED)) {
> + MAX_TEMP / 10, MAX_TEMP)) {
> make_forest(x, y, hmap(x, y), 25);
> } else {
> /* If rand_map_pos_temperature returns FALSE we may as well stop
> @@ -509,15 +538,13 @@
>
> /* Now add another tropical forest clump (70-100% temperature). */
> if (rand_map_pos_temperature(&x, &y,
> - 7 *MAX_TEMP / 10, MAX_TEMP,
> - T_NOT_PLACED)) {
> + 7 *MAX_TEMP / 10, MAX_TEMP)) {
> make_forest(x, y, hmap(x, y), 25);
> }
>
> /* And add a cold forest clump (10%-30% temperature). */
> if (rand_map_pos_temperature(&x, &y,
> - 1 * MAX_TEMP / 10, 3 * MAX_TEMP / 10,
> - T_NOT_PLACED)) {
> + 1 * MAX_TEMP / 10, 3 * MAX_TEMP / 10)) {
> make_forest(x, y, hmap(x, y), 25);
> }
> } while (forests < forestsize);
> @@ -547,10 +574,11 @@
> if (not_placed(x, y)
> && hmap(x, y) < hmap_swamp_level) {
> map_set_terrain(x, y, T_SWAMP);
> + map_set_placed(x, y);
> cardinal_adjc_iterate(x, y, x1, y1) {
> - if (myrand(10) > 5 && !is_ocean(map_get_terrain(x1, y1))
> - && map_get_terrain(x1, y1) != T_SWAMP ) {
> + if (myrand(10) > 5 && not_placed(x1, y1)) {
> map_set_terrain(x1, y1, T_SWAMP);
> + map_set_placed(x1, y1);
> swamps++;
> }
> } cardinal_adjc_iterate_end;
> @@ -576,8 +604,7 @@
> * (deserts tend to be between 15 and 35; make_desert will expand
> * them). */
> if (rand_map_pos_temperature(&x, &y,
> - 65 * MAX_TEMP / 100, 80 * MAX_TEMP / 100,
> - T_NOT_PLACED)){
> + 65 * MAX_TEMP / 100, 80 * MAX_TEMP / 100)){
> make_desert(x, y, hmap(x, y), 50, map_temperature(x, y));
> i--;
> } else {
> @@ -1051,6 +1078,7 @@
> } else {
> map_set_terrain(x, y, T_PLAINS);
> }
> + map_set_placed(x, y);
> }
> } whole_map_iterate_end;
> }
> @@ -1141,19 +1169,20 @@
> **************************************************************************/
> static void make_land(void)
> {
> + create_placed_map(); /* here it means land terrains to be placed */
> adjust_hmap();
> normalize_hmap_poles();
> hmap_shore_level = (hmap_max_level * (100 - map.landpercent)) / 100;
> whole_map_iterate(x, y) {
> + map_set_terrain(x, y, T_UNKNOWN); /* set as oceans count is used */
> if (hmap(x, y) < hmap_shore_level) {
> map_set_terrain(x, y, T_OCEAN);
> - } else {
> - map_set_terrain(x, y, T_NOT_PLACED);
> + map_set_placed(x, y); /* placed, not a land target */
> }
> } whole_map_iterate_end;
>
> renormalize_hmap_poles();
> - make_polar_land(); /* make extra land at poles*/
> + make_polar_land(); /* make extra land at poles */
> make_mountains();
> make_arctic();
> make_tundra();
> @@ -1163,7 +1192,7 @@
> make_plains();
> make_fair();
> make_rivers();
> -
> + remove_placed_map();
> assign_continent_numbers();
> }
>
> @@ -1752,18 +1781,14 @@
> }
>
> /****************************************************************************
> - Return TRUE iff there's already a hut within 3 tiles of the given map
> - position.
> + Set all nearby tiles as placed on pmap. This helps avoiding huts being
> + too close
> ****************************************************************************/
> -static bool is_hut_close(int map_x, int map_y)
> +static void set_placed_close_hut(int map_x, int map_y)
> {
> square_iterate(map_x, map_y, 3, x1, y1) {
> - if (map_has_special(x1, y1, S_HUT)) {
> - return TRUE;
> - }
> + map_set_placed(x1, y1);
> } square_iterate_end;
> -
> - return FALSE;
> }
>
> /****************************************************************************
> @@ -1789,21 +1814,27 @@
> {
> int x, y, count = 0;
>
> + create_placed_map(); /* here it means placed huts */
> +
> while (number * map_num_tiles() >= 2000 && count++ < map_num_tiles() * 2) {
>
> /* Add a hut. But not on a polar area, on an ocean, or too close to
> * another hut. */
> if (rand_map_pos_temperature(&x, &y,
> - 2 * ICE_BASE_LEVEL, MAX_TEMP, T_ANY)
> - && !is_ocean(map_get_terrain(x, y))
> - && !is_hut_close(x, y)) {
> - number--;
> - map_set_special(x, y, S_HUT);
> - /* Don't add to islands[].goodies because islands[] not
> - setup at this point, except for generator>1, but they
> - have pre-set starters anyway. */
> + 2 * ICE_BASE_LEVEL, MAX_TEMP)) {
> + if (is_ocean(map_get_terrain(x, y))) {
> + map_set_placed(x, y); /* not good for a hut */
> + } else {
> + number--;
> + map_set_special(x, y, S_HUT);
> + set_placed_close_hut(x, y);
> + /* Don't add to islands[].goodies because islands[] not
> + setup at this point, except for generator>1, but they
> + have pre-set starters anyway. */
> + }
> }
> }
> + remove_placed_map();
> }
>
> /****************************************************************************
> @@ -1940,10 +1971,12 @@
> map_set_terrain(x, y, (myrand(cold0_weight
> + cold1_weight) < cold0_weight)
> ? cold0 : cold1);
> + map_set_placed(x, y);
> } else {
> map_set_terrain(x, y, (myrand(warm0_weight
> + warm1_weight) < warm0_weight)
> ? warm0 : warm1);
> + map_set_placed(x, y);
> }
> }
> if (!not_placed(x,y)) i--;
> @@ -2079,7 +2112,9 @@
> return i != 0;
> }
>
> - map_set_terrain(map_x, map_y, T_NOT_PLACED);
> + map_set_terrain(map_x, map_y, T_UNKNOWN);
> + map_unset_placed(map_x, map_y);
> +
> map_set_continent(map_x, map_y, pstate->isleindex);
> i++;
> }
> @@ -2303,10 +2338,11 @@
> int i;
> height_map = fc_malloc(sizeof(int) * map.ysize * map.xsize);
> islands = fc_malloc((MAP_NCONT+1)*sizeof(struct isledata));
> -
> + create_placed_map(); /* land tiles which aren't placed yet */
> whole_map_iterate(x, y) {
> map_set_terrain(x, y, T_OCEAN);
> map_set_continent(x, y, 0);
> + map_set_placed(x, y); /* not a land tile */
> map_clear_all_specials(x, y);
> map_set_owner(x, y, NULL);
> } whole_map_iterate_end;
> @@ -2400,6 +2436,7 @@
> }
>
> make_plains();
> + remove_placed_map();
> free(height_map);
> height_map = NULL;
>
> @@ -2487,6 +2524,7 @@
> }
>
> make_plains();
> + remove_placed_map();
> free(height_map);
> height_map = NULL;
>
> @@ -2554,6 +2592,7 @@
> make_island(10 * pstate->totalmass / totalweight, 0, pstate, DMSIS);
> }
> make_plains();
> + remove_placed_map();
> free(height_map);
> height_map = NULL;
>
|
|