diff -Xdiff_ignore -ru freeorig/common/shared.c freeciv/common/shared.c --- freeorig/common/shared.c Fri Aug 16 09:26:04 2002 +++ freeciv/common/shared.c Fri Aug 16 13:00:18 2002 @@ -1197,3 +1197,15 @@ { return _("'Cause civilization should be free!"); } +/*************************************************************************** + Return whether two vectors: vec1 and vec2 both of size l (in bytes) have + common bits. (Don't call this function directly, use BV_CHECK_MASK instead) +***************************************************************************/ +bool _bv_check_mask(unsigned char* vec1, unsigned char* vec2, int l) +{ + do { + l--; + if (vec1[l] & vec2[l]) return TRUE; + } while(l); + return FALSE; +} diff -Xdiff_ignore -ru freeorig/common/shared.h freeciv/common/shared.h --- freeorig/common/shared.h Fri Aug 16 09:26:04 2002 +++ freeciv/common/shared.h Fri Aug 16 13:00:18 2002 @@ -86,6 +86,9 @@ do { (bv).vec[_BV_BYTE_INDEX(bit)] &= ~_BV_BITMASK(bit); } while(FALSE) #define BV_CLR_ALL(bv) \ do { memset((bv).vec, 0, sizeof((bv).vec)); } while(FALSE) +bool _bv_check_mask(unsigned char* vec1, unsigned char* vec2, int l); +#define BV_CHECK_MASK(vec1, vec2) \ + _bv_check_mask((vec1).vec, (vec2).vec, sizeof(vec1)) #define BV_DEFINE(name, bits) \ typedef struct { unsigned char vec[_BV_BYTES(bits)]; } name; diff -Xdiff_ignore -ru freeorig/server/settlers.c freeciv/server/settlers.c --- freeorig/server/settlers.c Fri Aug 16 09:26:17 2002 +++ freeciv/server/settlers.c Fri Aug 16 12:59:43 2002 @@ -38,7 +38,10 @@ /* negative: in_city_radius, 0: unassigned, positive: city_des */ signed int minimap[MAP_MAX_WIDTH][MAP_MAX_HEIGHT]; -static unsigned int territory[MAP_MAX_WIDTH][MAP_MAX_HEIGHT]; +BV_DEFINE(nearness, MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS); +nearness territory[MAP_MAX_WIDTH][MAP_MAX_HEIGHT]; +BV_DEFINE(enemy_mask, MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS); +enemy_mask enemies[MAX_NUM_PLAYERS + MAX_NUM_BARBARIANS]; static void auto_settlers_player(struct player *pplayer); static bool is_already_assigned(struct unit *myunit, struct player *pplayer, @@ -910,7 +913,7 @@ int mv_cost; if (!is_already_assigned(punit, pplayer, x, y) && map_get_terrain(x, y) != T_OCEAN - && TEST_BIT(territory[x][y], pplayer->player_no) + && !BV_CHECK_MASK(territory[x][y], enemies[pplayer->player_no]) /* pretty good, hope it's enough! -- Syela */ && (near < 8 || map_get_continent(x, y) != ucont) && city_can_be_built_here(x,y) @@ -1049,7 +1052,7 @@ in_use = (get_worker_city(pcity, i, j) == C_TILE_WORKER); if (map_get_continent(x, y) == ucont && warmap.cost[x][y] <= THRESHOLD * mv_rate - && TEST_BIT(territory[x][y], pplayer->player_no) + && !BV_CHECK_MASK(territory[x][y], enemies[pplayer->player_no]) /* pretty good, hope it's enough! -- Syela */ && !is_already_assigned(punit, pplayer, x, y)) { /* calling is_already_assigned once instead of four times @@ -1441,7 +1444,7 @@ { square_iterate(x, y, distance, x1, y1) { if (s == 0 || is_terrain_near_tile(x1, y1, T_OCEAN)) - territory[x1][y1] &= (1<player_no]); + players_iterate(player2) { + if (!pplayers_allied(player1, player2)) + BV_SET(enemies[player1->player_no], player2->player_no); + } players_iterate_end; + } players_iterate_end; +} + /************************************************************************** Do the auto_settler stuff for all the players. **************************************************************************/ @@ -1512,6 +1529,7 @@ int i; assign_settlers(); assign_territory(); + recount_enemy_masks(); for (i = 0; i < game.nplayers; i++) { auto_settlers_player(shuffled_player(i)); }