📄 aaibuildtable.cpp
字号:
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[AIR_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size());
}
else
mod_usefulness[3][i][0] = 0;
mod_usefulness[4][i][0] = 0;
if(mod_usefulness[0][i][0] > 90)
mod_usefulness[0][i][0] = 90;
else if(mod_usefulness[0][i][0] < 10 && mod_usefulness[0][i][0] > 0)
mod_usefulness[0][i][0] = 10;
if(mod_usefulness[1][i][0] > 90)
mod_usefulness[1][i][0] = 90;
else if(mod_usefulness[1][i][0] < 10 && mod_usefulness[1][i][0] > 0)
mod_usefulness[1][i][0] = 10;
if(mod_usefulness[2][i][0] > 90)
mod_usefulness[2][i][0] = 90;
else if(mod_usefulness[2][i][0] < 10 && mod_usefulness[2][i][0] > 0)
mod_usefulness[2][i][0] = 10;
if(mod_usefulness[3][i][0] > 90)
mod_usefulness[3][i][0] = 90;
else if(mod_usefulness[3][i][0] < 10 && mod_usefulness[3][i][0] > 0)
mod_usefulness[3][i][0] = 10;
for(int map = 1; map <= WATER_MAP; ++map)
{
mod_usefulness[0][i][map] = mod_usefulness[0][i][0];
mod_usefulness[1][i][map] = mod_usefulness[1][i][0];
mod_usefulness[2][i][map] = mod_usefulness[2][i][0];
mod_usefulness[3][i][map] = mod_usefulness[3][i][0];
mod_usefulness[4][i][map] = mod_usefulness[4][i][0];
}
}
else
{
for(int map = 0; map < WATER_MAP +1; ++map)
{
// ground units
if(units_of_category[GROUND_ASSAULT][i].size() > 0)
{
if(map == LAND_MAP)
mod_usefulness[0][i][map] = units_of_category[GROUND_ASSAULT][i].size() * 100.0
/ ( units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size());
else if(map == LAND_WATER_MAP)
mod_usefulness[0][i][map] = units_of_category[GROUND_ASSAULT][i].size() * 100.0
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else if(map == WATER_MAP)
mod_usefulness[0][i][map] = 0;
else
mod_usefulness[0][i][map] = 0;
}
else
mod_usefulness[0][i][map] = 0;
// air units
mod_usefulness[1][i][map] = 100.0 / (float)cfg->AIRCRAFT_RATE; // not used yet
// hover
if(units_of_category[HOVER_ASSAULT][i].size() > 0)
{
if(map == LAND_MAP)
mod_usefulness[2][i][map] = units_of_category[HOVER_ASSAULT][i].size() * 100.0
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size());
else if(map == LAND_WATER_MAP)
mod_usefulness[2][i][map] = units_of_category[HOVER_ASSAULT][i].size() * 100.0
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else if(map == WATER_MAP)
mod_usefulness[2][i][map] = units_of_category[HOVER_ASSAULT][i].size() * 100.0
/(units_of_category[SEA_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else
mod_usefulness[2][i][map] = 0;
}
else
mod_usefulness[2][i][map] = 0;
// sea
if(units_of_category[SEA_ASSAULT][i].size() > 0)
{
if(map == LAND_WATER_MAP)
mod_usefulness[3][i][map] = units_of_category[SEA_ASSAULT][i].size() * 100.0
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else if(map == WATER_MAP)
mod_usefulness[3][i][map] = units_of_category[SEA_ASSAULT][i].size() * 100.0
/(units_of_category[SEA_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else
mod_usefulness[3][i][map] = 0;
}
else
mod_usefulness[3][i][map] = 0;
// these categories are not used, only to avoid crashes when units killed buildings etc.
if(units_of_category[SUBMARINE_ASSAULT][i].size() > 0)
{
if(map == LAND_WATER_MAP)
mod_usefulness[4][i][map] = units_of_category[SUBMARINE_ASSAULT][i].size() * 100.0
/(units_of_category[GROUND_ASSAULT][i].size() + units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else if(map == WATER_MAP)
mod_usefulness[4][i][map] = units_of_category[SUBMARINE_ASSAULT][i].size() * 100.0
/( units_of_category[HOVER_ASSAULT][i].size() + units_of_category[SEA_ASSAULT][i].size() + units_of_category[SUBMARINE_ASSAULT][i].size());
else
mod_usefulness[4][i][map] = 0;
}
else
mod_usefulness[4][i][map] = 0;
// check for too high/low values
if(map == LAND_MAP)
{
if(mod_usefulness[0][i][map] > 90)
mod_usefulness[0][i][map] = 90;
else if(mod_usefulness[0][i][map] < 10)
mod_usefulness[0][i][map] = 10;
if(mod_usefulness[2][i][map] > 90)
mod_usefulness[2][i][map] = 90;
else if(mod_usefulness[2][i][map] < 10)
mod_usefulness[2][i][map] = 10;
}
else if(map == LAND_WATER_MAP)
{
if(mod_usefulness[0][i][map] > 90)
mod_usefulness[0][i][map] = 90;
else if(mod_usefulness[0][i][map] < 10)
mod_usefulness[0][i][map] = 10;
if(mod_usefulness[2][i][map] > 90)
mod_usefulness[2][i][map] = 90;
else if(mod_usefulness[2][i][map] < 10)
mod_usefulness[2][i][map] = 10;
if(mod_usefulness[3][i][map] > 90)
mod_usefulness[3][i][map] = 90;
else if(mod_usefulness[3][i][map] < 10)
mod_usefulness[3][i][map] = 10;
if(mod_usefulness[4][i][map] > 90)
mod_usefulness[4][i][map] = 90;
else if(mod_usefulness[4][i][map] < 10)
mod_usefulness[4][i][map] = 10;
}
else if(map == WATER_MAP)
{
if(mod_usefulness[2][i][map] > 90)
mod_usefulness[2][i][map] = 90;
else if(mod_usefulness[2][i][map] < 10)
mod_usefulness[2][i][map] = 10;
if(mod_usefulness[3][i][map] > 90)
mod_usefulness[3][i][map] = 90;
else if(mod_usefulness[3][i][map] < 10)
mod_usefulness[3][i][map] = 10;
if(mod_usefulness[4][i][map] > 90)
mod_usefulness[4][i][map] = 90;
else if(mod_usefulness[4][i][map] < 10)
mod_usefulness[4][i][map] = 10;
}
}
}
}
// set up attacked_by table
for(int cat = 0; cat < combat_categories; ++cat)
{
for(int t = 0; t < 4; ++t)
{
attacked_by_category[0][cat][t] = 0;
attacked_by_category[1][cat][t] = 0;
}
}
// save to cache file
SaveBuildTable();
cb->SendTextMsg("New BuildTable has been created",0);
}
// only once
if(aai_instances == 1)
{
UpdateMinMaxAvgEfficiency();
float temp;
def_power.resize(numOfSides);
max_pplant_eff.resize(numOfSides);
for(int s = 0; s < numOfSides; ++s)
{
def_power[s].resize(units_of_category[STATIONARY_DEF][s].size());
// power plant max eff
max_pplant_eff[s] = 0;
for(list<int>::iterator pplant = units_of_category[POWER_PLANT][s].begin(); pplant != units_of_category[POWER_PLANT][s].end(); ++pplant)
{
temp = units_static[*pplant].efficiency[1];
// eff. of tidal generators have not been calculated yet (depend on map)
if(temp <= 0)
{
temp = cb->GetTidalStrength() / units_static[*pplant].cost;
units_static[*pplant].efficiency[0] = cb->GetTidalStrength();
units_static[*pplant].efficiency[1] = temp;
}
if(temp > max_pplant_eff[s])
max_pplant_eff[s] = temp;
}
}
DebugPrint();
}
// buildtable is initialized
initialized = true;
}
void AAIBuildTable::InitCombatEffCache(int side)
{
side--;
int max_size = 0;
UnitCategory category;
for(int cat = 0; cat < combat_categories; ++cat)
{
category = GetAssaultCategoryOfID(cat);
if(units_of_category[(int)category][side].size() > max_size)
max_size = units_of_category[(int)category][side].size();
}
combat_eff.resize(max_size, 0);
}
void AAIBuildTable::PrecacheStats()
{
for(int s = 0; s < numOfSides; s++)
{
// precache efficiency of power plants
for(list<int>::iterator i = units_of_category[POWER_PLANT][s].begin(); i != units_of_category[POWER_PLANT][s].end(); i++)
{
if(unitList[*i-1]->tidalGenerator)
units_static[*i].efficiency[0] = 0;
else if(unitList[*i-1]->energyMake >= cfg->MIN_ENERGY)
units_static[*i].efficiency[0] = unitList[*i-1]->energyMake;
else if(unitList[*i-1]->energyUpkeep <= -cfg->MIN_ENERGY)
units_static[*i].efficiency[0] = - unitList[*i-1]->energyUpkeep;
units_static[*i].efficiency[1] = units_static[*i].efficiency[0] / units_static[*i].cost;
}
// precache efficiency of extractors
for(list<int>::iterator i = units_of_category[EXTRACTOR][s].begin(); i != units_of_category[EXTRACTOR][s].end(); i++)
units_static[*i].efficiency[0] = unitList[*i-1]->extractsMetal;
// precache efficiency of metalmakers
for(list<int>::iterator i = units_of_category[METAL_MAKER][s].begin(); i != units_of_category[METAL_MAKER][s].end(); ++i)
units_static[*i].efficiency[0] = unitList[*i-1]->makesMetal/(unitList[*i-1]->energyUpkeep+1);
// precache average metal and energy consumption of factories
float average_metal, average_energy;
for(list<int>::iterator i = units_of_category[STATIONARY_CONSTRUCTOR][s].begin(); i != units_of_category[STATIONARY_CONSTRUCTOR][s].end(); ++i)
{
average_metal = average_energy = 0;
for(list<int>::iterator unit = units_static[*i].canBuildList.begin(); unit != units_static[*i].canBuildList.end(); unit++)
{
average_metal += ( unitList[*unit-1]->metalCost * unitList[*i-1]->buildSpeed ) / unitList[*unit-1]->buildTime;
average_energy += ( unitList[*unit-1]->energyCost * unitList[*i-1]->buildSpeed ) / unitList[*unit-1]->buildTime;
}
units_static[*i].efficiency[0] = average_metal / units_static[*i].canBuildList.size();
units_static[*i].efficiency[1] = average_energy / units_static[*i].canBuildList.size();
}
// precache range of arty
for(list<int>::iterator i = units_of_category[STATIONARY_ARTY][s].begin(); i != units_of_category[STATIONARY_ARTY][s].end(); ++i)
{
units_static[*i].efficiency[1] = GetMaxRange(*i);
units_static[*i].efficiency[0] = 1 + units_static[*i].cost/100.0;
}
// precache costs and buildtime
float buildtime;
for(int i = 1; i <= MOBILE_CONSTRUCTOR; ++i)
{
// precache costs
avg_cost[i][s] = 0;
this->min_cost[i][s] = 10000;
this->max_cost[i][s] = 0;
for(list<int>::iterator unit = units_of_category[i][s].begin(); unit != units_of_category[i][s].end(); ++unit)
{
avg_cost[i][s] += units_static[*unit].cost;
if(units_static[*unit].cost > this->max_cost[i][s])
this->max_cost[i][s] = units_static[*unit].cost;
if(units_static[*unit].cost < this->min_cost[i][s] )
this->min_cost[i][s] = units_static[*unit].cost;
}
if(units_of_category[i][s].size() > 0)
avg_cost[i][s] /= units_of_category[i][s].size();
else
{
avg_cost[i][s] = -1;
this->min_cost[i][s] = -1;
this->max_cost[i][s] = -1;
}
// precache buildtime
min_buildtime[i][s] = 10000;
avg_buildtime[i][s] = 0;
max_buildtime[i][s] = 0;
for(list<int>::iterator unit = units_of_category[i][s].begin(); unit != units_of_category[i][s].end(); ++unit)
{
buildtime = unitList[*unit-1]->buildTime/256.0;
avg_buildtime[i][s] += buildtime;
if(buildtime > max_buildtime[i][s])
max_buildtime[i][s] = buildtime;
if(buildtime < min_buildtime[i][s])
min_buildtime[i][s] = buildtime;
}
if(units_of_category[i][s].size() > 0)
avg_buildtime[i][s] /= units_of_category[i][s].size();
else
{
avg_buildtime[i][s] = -1;
min_buildtime[i][s] = -1;
max_buildtime[i][s] = -1;
}
}
// precache radar ranges
min_value[STATIONARY_RECON][s] = 10000;
avg_value[STATIONARY_RECON][s] = 0;
max_value[STATIONARY_RECON][s] = 0;
for(list<int>::iterator unit = units_of_category[STATIONARY_RECON][s].begin(); unit != units_of_category[STATIONARY_RECON][s].end(); ++unit)
{
avg_value[STATIONARY_RECON][s] += unitList[*unit-1]->radarRadius;
if(unitList[*unit-1]->radarRadius > max_value[STATIONARY_RECON][s])
max_value[STATIONARY_RECON][s] = unitList[*unit-1]->radarRadius;
if(unitList[*unit-1]->radarRadius < min_value[STATIONARY_RECON][s])
min_value[STATIONARY_RECON][s] = unitList[*unit-1]->radarRadius;
}
if(units_of_category[STATIONARY_RECON][s].size() > 0)
avg_value[STATIONARY_RECON][s] /= units_of_category[STATIONARY_RECON][s].size();
else
{
min_value[STATIONARY_RECON][s] = -1;
avg_value[STATIONARY_RECON][s] = -1;
max_value[STATIONARY_RECON][s] = -1;
}
// precache jammer ranges
min_value[STATIONARY_JAMMER][s] = 10000;
avg_value[STATIONARY_JAMMER][s] = 0;
max_value[STATIONARY_JAMMER][s] = 0;
for(list<int>::iterator unit = units_of_category[STATIONARY_JAMMER][s].begin(); unit != units_of_category[STATIONARY_JAMMER][s].end(); ++unit)
{
avg_value[STATIONARY_JAMMER][s] += unitList[*unit-1]->jammerRadius;
if(unitList[*unit-1]->jammerRadius > max_value[STATIONARY_JAMMER][s])
max_value[STATIONARY_JAMMER][s] = unitList[*unit-1]->jammerRadius;
if(unitList[*unit-1]->jammerRadius < min_value[STATIONARY_JAMMER][s])
min_value[STATIONARY_JAMMER][s] = unitList[*unit-1]->jammerRadius;
}
if(units_of_category[STATIONARY_JAMMER][s].size() > 0)
avg_value[STATIONARY_JAMMER][s] /= units_of_category[STATIONARY_JAMMER][s].size();
else
{
min_value[STATIONARY_JAMMER][s] = -1;
avg_value[STATIONARY_JAMMER][s] = -1;
max_value[STATIONARY_JAMMER][s] = -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -