//--------- Begin of function Nation::think_capture_independent --------// // // Think about capturing independent towns. // int Nation::think_capture_independent() { //------- Capture target choices -------// std::priority_queue<CaptureTown> captureTownQueue; //--- find the town that makes most sense to capture ---// int townRecno; Town* townPtr; for(townRecno=town_array.size(); townRecno>0; townRecno--) { if(town_array.is_deleted(townRecno)) continue; townPtr = town_array[townRecno]; if( townPtr->nation_recno ) // only capture independent towns continue; if( townPtr->no_neighbor_space ) // if there is no space in the neighbor area for building a new firm. continue; if( townPtr->rebel_recno ) // towns controlled by rebels will not drop in resistance even if a command base is present continue; //------ only if we have a presence/a base town in this region -----// if( !has_base_town_in_region(townPtr->region_id) ) continue; //---- check if there are already camps linked to this town ----// int i; for( i=townPtr->linked_firm_count-1 ; i>=0 ; i-- ) { Firm* firmPtr = firm_array[ townPtr->linked_firm_array[i] ]; if( firmPtr->firm_id != FIRM_CAMP ) continue; //------ if we already have a camp linked to this town -----// if( firmPtr->nation_recno == nation_recno ) break; //--- if there is an overseer with high leadership and right race in the opponent's camp, don't bother to compete with him ---// if( firmPtr->overseer_recno ) { Unit* unitPtr = unit_array[firmPtr->overseer_recno]; if( unitPtr->skill.skill_level >= 70 && unitPtr->race_id == townPtr->majority_race() ) { break; } } } if( i>=0 ) // there is already a camp linked to this town and we don't want to get involved with its capturing plan continue; //------ no linked camps interfering with potential capture ------// int captureUnitRecno; int targetResistance = capture_expected_resistance(townRecno, &captureUnitRecno); int averageResistance = townPtr->average_resistance(nation_recno); int minResistance = MIN( averageResistance, targetResistance ); if( minResistance < 50 - pref_peacefulness/5 ) // 30 to 50 depending on { captureTownQueue.push({townRecno, minResistance, captureUnitRecno}); } } //------- try to capture the town in their resistance order ----// const bool needToCheckDistance = !config.explore_whole_map && info.game_date-info.game_start_date > MAX(MAX_WORLD_X_LOC, MAX_WORLD_Y_LOC) * (5-config.ai_aggressiveness) / 5; // 3 to 5 / 5 while( captureTownQueue.size() > 0 ) { int captureRecno = captureTownQueue.top().town_recno; int captureUnitRecno = captureTownQueue.top().capture_unit_recno; captureTownQueue.pop(); err_when( town_array.is_deleted(captureRecno) ); //-------------------------------------------// // If the map is set to unexplored, wait for a // reasonable amount of time before moving out // to build the camp. //-------------------------------------------// if( needToCheckDistance ) { Town* targetTown = town_array[ captureRecno ]; int j; for( j=0 ; j<ai_town_count ; j++ ) { Town* ownTown = town_array[ ai_town_array[j] ]; int townDistance = misc.points_distance(targetTown->center_x, targetTown->center_y, ownTown->center_x, ownTown->center_y); if( info.game_date-info.game_start_date > townDistance * (5-config.ai_aggressiveness) / 5 ) // 3 to 5 / 5 { break; } } if( j==ai_town_count ) continue; } if( start_capture( captureRecno, captureUnitRecno ) ) return 1; } return 0; }
//--------- Begin of function Nation::think_capture_independent --------// // // Think about capturing independent towns. // int Nation::think_capture_independent() { //------- Capture target choices -------// #define MAX_CAPTURE_TOWN 30 CaptureTown capture_town_array[MAX_CAPTURE_TOWN]; short capture_town_count=0; //--- find the town that makes most sense to capture ---// int townRecno; Town* townPtr; for(townRecno=town_array.size(); townRecno>0; townRecno--) { if(town_array.is_deleted(townRecno)) continue; townPtr = town_array[townRecno]; if( townPtr->nation_recno ) // only capture independent towns continue; if( townPtr->no_neighbor_space ) // if there is no space in the neighbor area for building a new firm. continue; if( townPtr->rebel_recno ) // towns controlled by rebels will not drop in resistance even if a command base is present continue; //------ only if we have a presence/a base town in this region -----// if( !has_base_town_in_region(townPtr->region_id) ) continue; //---- check if there are already camps linked to this town ----// int i; for( i=townPtr->linked_firm_count-1 ; i>=0 ; i-- ) { Firm* firmPtr = firm_array[ townPtr->linked_firm_array[i] ]; if( firmPtr->firm_id != FIRM_CAMP ) continue; //------ if we already have a camp linked to this town -----// if( firmPtr->nation_recno == nation_recno ) break; //--- if there is an overseer with high leadership and right race in the opponent's camp, do bother to compete with him ---// if( firmPtr->overseer_recno ) { Unit* unitPtr = unit_array[firmPtr->overseer_recno]; if( unitPtr->skill.skill_level >= 70 && unitPtr->race_id == townPtr->majority_race() ) { break; } } } if( i>=0 ) // there is already a camp linked to this town and we don't want to get involved with its capturing plan continue; //-- if the town has linked military camps of the same nation --// int targetResistance = capture_expected_resistance(townRecno); int averageResistance = townPtr->average_resistance(nation_recno); int minResistance = MIN( averageResistance, targetResistance ); if( minResistance < 50 - pref_peacefulness/5 ) // 30 to 50 depending on { capture_town_array[capture_town_count].town_recno = townRecno; capture_town_array[capture_town_count].min_resistance = minResistance; capture_town_count++; } } //------ sort the capture target choices by min_resistance ----// qsort( &capture_town_array, capture_town_count, sizeof(capture_town_array[0]), sort_capture_town_function ); //------- try to capture the town in their resistance order ----// for( int i=0 ; i<capture_town_count ; i++ ) { err_when( town_array.is_deleted(capture_town_array[i].town_recno) ); //-------------------------------------------// // If the map is set to unexplored, wait for a // reasonable amount of time before moving out // to build the mine. //-------------------------------------------// if( !config.explore_whole_map ) { Town* targetTown = town_array[ capture_town_array[i].town_recno ]; int j; for( j=0 ; j<ai_town_count ; j++ ) { Town* ownTown = town_array[ ai_town_array[j] ]; int townDistance = m.points_distance(targetTown->center_x, targetTown->center_y, ownTown->center_x, ownTown->center_y); if( info.game_date-info.game_start_date > townDistance * (5-config.ai_aggressiveness) / 5 ) // 3 to 5 / 5 { break; } } if( j==ai_town_count ) continue; } if( start_capture( capture_town_array[i].town_recno ) ) return 1; } return 0; }