/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OAI_TOWN.CPP
//Description: AI - processing town
#include
#include
#include
#include
#include
#include
//--------- Begin of function Nation::think_town --------//
//
void Nation::think_town()
{
optimize_town_race();
}
//---------- End of function Nation::think_town --------//
//--------- Begin of function Nation::optimize_town_race --------//
//
// Optimize the distribution of different races in different towns.
//
void Nation::optimize_town_race()
{
RegionStat* regionStat = region_array.region_stat_array;
for( int i=0 ; itown_nation_count_array[nation_recno-1] > 0 )
optimize_town_race_region( regionStat->region_id );
}
}
//---------- End of function Nation::optimize_town_race --------//
//--------- Begin of function Nation::optimize_town_race_region --------//
//
// Optimize the distribution of different races in different towns in
// a single region.
//
void Nation::optimize_town_race_region(int regionId)
{
//---- reckon the minority jobless pop of each race ----//
int racePopArray[MAX_RACE];
memset( racePopArray, 0, sizeof(racePopArray) );
int i, j, majorityRace;
Town* townPtr;
for( i=0 ; iregion_id != regionId )
continue;
majorityRace = townPtr->majority_race();
for( j=0 ; jjobless_race_pop_array[j];
}
}
//--- locate for towns with minority being majority and those minority race can move to ---//
Town* destTown;
for( int raceId=0 ; raceIdregion_id != regionId )
continue;
if( !townPtr->is_base_town )
continue;
if( townPtr->majority_race() == raceId &&
townPtr->population < MAX_TOWN_POPULATION )
{
destTown = townPtr;
break;
}
}
if( !destTown )
continue;
//---- if there is a suitable town for minority to move to ---//
for( i=0 ; iregion_id != regionId )
continue;
//---- move minority units from towns -----//
int joblessCount = townPtr->jobless_race_pop_array[raceId-1];
if( joblessCount > 0 &&
townPtr->majority_race() != raceId )
{
int migrateCount = min(8, joblessCount); // migrate a maximum of 8 units at a time
add_action( destTown->loc_x1, destTown->loc_y1,
townPtr->loc_x1, townPtr->loc_y1, ACTION_AI_SETTLE_TO_OTHER_TOWN, 0, migrateCount);
}
}
}
}
//---------- End of function Nation::optimize_town_race_region --------//