--- common/unit.c.orig Thu Jan 28 12:50:28 1999 +++ common/unit.c Thu Jan 28 12:53:28 1999 @@ -669,24 +669,20 @@ switch(activity) { case ACTIVITY_POLLUTION: return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && - (ptile->special&S_POLLUTION) && - !is_unit_activity_on_tile(ACTIVITY_POLLUTION, punit->x, punit->y); + (ptile->special&S_POLLUTION); case ACTIVITY_ROAD: return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && !(ptile->special&S_ROAD) && ptile->terrain!=T_OCEAN && (ptile->terrain!=T_RIVER || - get_invention(pplayer, A_BRIDGE)==TECH_KNOWN) && - !is_unit_activity_on_tile(ACTIVITY_ROAD, punit->x, punit->y); + get_invention(pplayer, A_BRIDGE)==TECH_KNOWN); case ACTIVITY_MINE: return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && - type->mining_result!=T_LAST && !(ptile->special&S_MINE) && - !is_unit_activity_on_tile(ACTIVITY_MINE, punit->x, punit->y); + type->mining_result!=T_LAST && !(ptile->special&S_MINE); case ACTIVITY_IRRIGATE: return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && - !is_unit_activity_on_tile(ACTIVITY_IRRIGATE, punit->x, punit->y) && !(ptile->special&S_IRRIGATION) && ( (ptile->terrain==type->irrigation_result && is_water_adjacent_to_tile(punit->x, punit->y)) || @@ -700,8 +696,7 @@ case ACTIVITY_FORTRESS: return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && get_invention(pplayer, A_CONSTRUCTION) == TECH_KNOWN && - !(ptile->special&S_FORTRESS) && ptile->terrain!=T_OCEAN && - !is_unit_activity_on_tile(ACTIVITY_FORTRESS, punit->x, punit->y); + !(ptile->special&S_FORTRESS) && ptile->terrain!=T_OCEAN; case ACTIVITY_SENTRY: return 1; @@ -710,8 +705,7 @@ /* if the tile has road, the terrain must be ok.. */ return unit_flag(punit->type, F_SETTLERS) && punit->moves_left && (ptile->special&S_ROAD) && !(ptile->special&S_RAILROAD) && - get_invention(&game.players[punit->owner], A_RAILROAD)==TECH_KNOWN && - !is_unit_activity_on_tile(ACTIVITY_RAILROAD, punit->x, punit->y); + get_invention(&game.players[punit->owner], A_RAILROAD)==TECH_KNOWN; case ACTIVITY_PILLAGE: return is_ground_unit(punit) && punit->moves_left && --- server/unitfunc.c.orig Thu Jan 28 06:33:06 1999 +++ server/unitfunc.c Thu Jan 28 11:39:46 1999 @@ -1128,6 +1128,23 @@ } /************************************************************************** + Calculate the total amount of activity performed by all units on a tile + for a given task. +**************************************************************************/ +int total_activity (int x, int y, enum unit_activity act) +{ + struct tile *ptile; + int total = 0; + + ptile = map_get_tile (x, y); + unit_list_iterate (ptile->units, punit) + if (punit->activity == act) + total += punit->activity_count; + unit_list_iterate_end; + return total; +} + +/************************************************************************** progress settlers in their current tasks, and units that is pillaging. also move units that is on a goto. @@ -1157,47 +1174,73 @@ set_unit_activity(punit, ACTIVITY_IDLE); } - if(punit->activity==ACTIVITY_POLLUTION && punit->activity_count>=3) { - map_clear_special(punit->x, punit->y, S_POLLUTION); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_POLLUTION) { + if (total_activity (punit->x, punit->y, ACTIVITY_POLLUTION) >= 3) { + map_clear_special(punit->x, punit->y, S_POLLUTION); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_POLLUTION) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } - if(punit->activity==ACTIVITY_FORTRESS && punit->activity_count>=3) { - map_set_special(punit->x, punit->y, S_FORTRESS); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_FORTRESS) { + if (total_activity (punit->x, punit->y, ACTIVITY_FORTRESS) >= 3) { + map_set_special(punit->x, punit->y, S_FORTRESS); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_FORTRESS) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } - if(punit->activity==ACTIVITY_IRRIGATE && - punit->activity_count>=map_build_irrigation_time(punit->x, punit->y)) { - map_irrigate_tile(punit->x, punit->y); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - punit->activity=ACTIVITY_IDLE; - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_IRRIGATE) { + if (total_activity (punit->x, punit->y, ACTIVITY_IRRIGATE) >= + map_build_irrigation_time(punit->x, punit->y)) { + map_irrigate_tile(punit->x, punit->y); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_IRRIGATE) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } - if(punit->activity==ACTIVITY_ROAD && - punit->activity_count>map_build_road_time(punit->x, punit->y)) { - map_set_special(punit->x, punit->y, S_ROAD); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - punit->activity=ACTIVITY_IDLE; - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_ROAD) { + if (total_activity (punit->x, punit->y, ACTIVITY_ROAD) > /* not >= ? */ + map_build_road_time(punit->x, punit->y)) { + map_set_special(punit->x, punit->y, S_ROAD); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_ROAD) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } - if(punit->activity==ACTIVITY_RAILROAD && punit->activity_count>=3) { - map_set_special(punit->x, punit->y, S_RAILROAD); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - punit->activity=ACTIVITY_IDLE; - handle_unit_activity_request(pplayer, punit, ACTIVITY_IDLE); - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_RAILROAD) { + if (total_activity (punit->x, punit->x, ACTIVITY_RAILROAD) >= 3) { + map_set_special(punit->x, punit->y, S_RAILROAD); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_RAILROAD) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } - if(punit->activity==ACTIVITY_MINE && - punit->activity_count>=map_build_mine_time(punit->x, punit->y)) { - map_mine_tile(punit->x, punit->y); - send_tile_info(0, punit->x, punit->y, TILE_KNOWN); - set_unit_activity(punit, ACTIVITY_IDLE); + if(punit->activity==ACTIVITY_MINE) { + if (total_activity (punit->x, punit->y, ACTIVITY_MINE) >= + map_build_mine_time(punit->x, punit->y)) { + map_mine_tile(punit->x, punit->y); + send_tile_info(0, punit->x, punit->y, TILE_KNOWN); + unit_list_iterate (map_get_tile (punit->x, punit->y)->units, punit2) + if (punit2->activity == ACTIVITY_MINE) + set_unit_activity(punit2, ACTIVITY_IDLE); + unit_list_iterate_end; + } } if(punit->activity==ACTIVITY_GOTO) {