📄 aaibuildtable.cpp
字号:
else
units_static[i].movement_type |= MOVE_TYPE_UNDERWATER;
}
}
}
//
// put units into the different categories
//
for(int i = 1; i <= numOfUnits; i++)
{
if(!units_static[i].side || !AllowedToBuild(i))
{
}
// get scouts
else if(IsScout(i))
{
units_of_category[SCOUT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = SCOUT;
}
// get mobile transport
else if(IsTransporter(i))
{
units_of_category[MOBILE_TRANSPORT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_TRANSPORT;
}
// check if builder or factory
else if(unitList[i-1]->buildOptions.size() > 0 && !IsAttacker(i))
{
// stationary constructors
if(units_static[i].movement_type & MOVE_TYPE_STATIC)
{
// ground factory or sea factory
units_of_category[STATIONARY_CONSTRUCTOR][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_CONSTRUCTOR;
}
// mobile constructors
else
{
units_of_category[MOBILE_CONSTRUCTOR][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_CONSTRUCTOR;
}
}
// no builder or factory
// check if other building
else if(units_static[i].movement_type & MOVE_TYPE_STATIC)
{
// check if extractor
if(unitList[i-1]->extractsMetal)
{
units_of_category[EXTRACTOR][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = EXTRACTOR;
}
// check if powerplant
else if(unitList[i-1]->energyMake > cfg->MIN_ENERGY || unitList[i-1]->tidalGenerator || unitList[i-1]->energyUpkeep < -cfg->MIN_ENERGY)
{
if(!unitList[i-1]->isAirBase && unitList[i-1]->radarRadius == 0 && unitList[i-1]->sonarRadius == 0)
{
units_of_category[POWER_PLANT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = POWER_PLANT;
}
}
// check if defence building
else if(!unitList[i-1]->weapons.empty() && GetMaxDamage(i) > 1)
{
// filter out nuke silos, antinukes and stuff like that
if(IsMissileLauncher(i))
{
units_of_category[STATIONARY_LAUNCHER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_LAUNCHER;
}
else if(IsDeflectionShieldEmitter(i))
{
units_of_category[DEFLECTION_SHIELD][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = DEFLECTION_SHIELD;
}
else
{
if(GetMaxRange(unitList[i-1]->id) < cfg->STATIONARY_ARTY_RANGE)
{
units_of_category[STATIONARY_DEF][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_DEF;
}
else
{
units_of_category[STATIONARY_ARTY][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_ARTY;
}
}
}
// check if repair pad
else if(unitList[i-1]->isAirBase)
{
units_of_category[AIR_BASE][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = AIR_BASE;
}
// check if radar or sonar
else if(unitList[i-1]->radarRadius > 0 || unitList[i-1]->sonarRadius > 0)
{
units_of_category[STATIONARY_RECON][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_RECON;
}
// check if jammer
else if(unitList[i-1]->jammerRadius > 0 || unitList[i-1]->sonarJamRadius > 0)
{
units_of_category[STATIONARY_JAMMER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STATIONARY_JAMMER;
}
// check storage or converter
else if( unitList[i-1]->energyStorage > cfg->MIN_ENERGY_STORAGE && !unitList[i-1]->energyMake)
{
units_of_category[STORAGE][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STORAGE;
}
else if(unitList[i-1]->metalStorage > cfg->MIN_METAL_STORAGE && !unitList[i-1]->extractsMetal)
{
units_of_category[STORAGE][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = STORAGE;
}
else if(unitList[i-1]->makesMetal > 0)
{
units_of_category[METAL_MAKER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = METAL_MAKER;
}
}
// units that are not builders
else if(unitList[i-1]->movedata)
{
// ground units
if(unitList[i-1]->movedata->moveType == MoveData::Ground_Move || unitList[i-1]->movedata->moveType == MoveData::Hover_Move)
{
// units with weapons
if(!unitList[i-1]->weapons.empty() && GetMaxDamage(i) > 1 || IsAttacker(i))
{
if(IsMissileLauncher(i))
{
units_of_category[MOBILE_LAUNCHER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_LAUNCHER;
}
else if(GetMaxDamage(unitList[i-1]->id) > 1)
{
// switch between arty and assault
if(IsArty(i))
{
if(unitList[i-1]->movedata->moveType == MoveData::Ground_Move)
{
units_of_category[GROUND_ARTY][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = GROUND_ARTY;
}
else
{
units_of_category[HOVER_ARTY][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = HOVER_ARTY;
}
}
else if(unitList[i-1]->speed > 0)
{
if(unitList[i-1]->movedata->moveType == MoveData::Ground_Move)
{
units_of_category[GROUND_ASSAULT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = GROUND_ASSAULT;
}
else
{
units_of_category[HOVER_ASSAULT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = HOVER_ASSAULT;
}
}
}
else if(unitList[i-1]->sonarJamRadius > 0 || unitList[i-1]->jammerRadius > 0)
{
units_of_category[MOBILE_JAMMER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_JAMMER;
}
}
// units without weapons
else
{
if(unitList[i-1]->sonarJamRadius > 0 || unitList[i-1]->jammerRadius > 0)
{
units_of_category[MOBILE_JAMMER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_JAMMER;
}
}
}
else if(unitList[i-1]->movedata->moveType == MoveData::Ship_Move)
{
// ship
if(!unitList[i-1]->weapons.empty())
{
if(IsMissileLauncher(i))
{
units_of_category[MOBILE_LAUNCHER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_LAUNCHER;
}
else if(GetMaxDamage(unitList[i-1]->id) > 1 || IsAttacker(i))
{
if(unitList[i-1]->categoryString.find("UNDERWATER") != string::npos)
{
units_of_category[SUBMARINE_ASSAULT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = SUBMARINE_ASSAULT;
}
else
{
// switch between arty and assault
if(IsArty(i))
{ units_of_category[SEA_ARTY][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = SEA_ARTY;
}
else
{
units_of_category[SEA_ASSAULT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = SEA_ASSAULT;
}
}
}
else if(unitList[i-1]->sonarJamRadius > 0 || unitList[i-1]->jammerRadius > 0)
{
units_of_category[MOBILE_JAMMER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_JAMMER;
}
}
else
{
if(unitList[i-1]->sonarJamRadius > 0 || unitList[i-1]->jammerRadius > 0)
{
units_of_category[MOBILE_JAMMER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_JAMMER;
}
}
}
}
// aircraft
else if(unitList[i-1]->canfly)
{
if(!unitList[i-1]->weapons.empty() && GetMaxDamage(unitList[i-1]->id) > 1 || IsAttacker(i))
{
if(unitList[i-1]->weapons.begin()->def->stockpile)
{
units_of_category[MOBILE_LAUNCHER][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = MOBILE_LAUNCHER;
}
else
{
// to apply different sorting rules later
if(cfg->AIR_ONLY_MOD)
temp_list[units_static[i].side-1].push_back(unitList[i-1]->id);
units_of_category[AIR_ASSAULT][units_static[i].side-1].push_back(unitList[i-1]->id);
units_static[i].category = AIR_ASSAULT;
}
}
}
// get commander
if(IsStartingUnit(unitList[i-1]->id))
{
units_static[i].category = COMMANDER;
units_of_category[COMMANDER][units_static[i].side-1].push_back(unitList[i-1]->id);
}
}
//
// determine unit type
//
for(int i = 1; i <= numOfUnits; i++)
{
// check for factories and builders
if(units_static[i].canBuildList.size() > 0)
{
for(list<int>::iterator unit = units_static[i].canBuildList.begin(); unit != units_static[i].canBuildList.end(); ++unit)
{
// filter out neutral and unknown units
if(units_static[*unit].side > 0 && units_static[*unit].category != UNKNOWN)
{
if(units_static[*unit].movement_type & MOVE_TYPE_STATIC)
units_static[i].unit_type |= UNIT_TYPE_BUILDER;
else
units_static[i].unit_type |= UNIT_TYPE_FACTORY;
}
}
if(!(units_static[i].movement_type & MOVE_TYPE_STATIC) && unitList[i-1]->canAssist)
units_static[i].unit_type |= UNIT_TYPE_ASSISTER;
}
if(unitList[i-1]->canResurrect)
units_static[i].unit_type |= UNIT_TYPE_RESURRECTOR;
if(IsStartingUnit(unitList[i-1]->id))
units_static[i].unit_type |= UNIT_TYPE_COMMANDER;
}
if(!cfg->AIR_ONLY_MOD)
{
UnitCategory cat;
float eff;
for(int i = 0; i <= numOfUnits; ++i)
{
cat = units_static[i].category;
eff = 1.5 + 7 * (units_static[i].cost - min_cost)/(max_cost - min_cost);
if(cat == AIR_ASSAULT)
{
for(int k = 0; k < combat_categories; ++k)
units_static[i].efficiency[k] = eff;
}
else if(cat == GROUND_ASSAULT || cat == HOVER_ASSAULT || cat == SEA_ASSAULT || cat == SUBMARINE_ASSAULT || cat == GROUND_ARTY || cat == SEA_ARTY || cat == HOVER_ARTY || cat == STATIONARY_DEF)
{
units_static[i].efficiency[1] = eff;
}
}
}
// precache stats
PrecacheStats();
// apply specific sort rules
if(cfg->AIR_ONLY_MOD)
{
float total_cost, my_cost;
for(int s = 0; s < numOfSides; ++s)
{
total_cost = this->max_cost[AIR_ASSAULT][s] - this->min_cost[AIR_ASSAULT][s];
if(total_cost <= 0)
break;
// clear list
units_of_category[AIR_ASSAULT][s].clear();
for(list<int>::iterator unit = temp_list[s].begin(); unit != temp_list[s].end(); ++unit)
{
my_cost = (units_static[*unit].cost - this->min_cost[AIR_ASSAULT][s]) / total_cost;
if(my_cost < cfg->MAX_COST_LIGHT_ASSAULT)
{
units_of_category[GROUND_ASSAULT][s].push_back(*unit);
units_static[*unit].category = GROUND_ASSAULT;
}
else if(my_cost < cfg->MAX_COST_MEDIUM_ASSAULT)
{
units_of_category[AIR_ASSAULT][s].push_back(*unit);
units_static[*unit].category = AIR_ASSAULT;
}
else if(my_cost < cfg->MAX_COST_HEAVY_ASSAULT)
{
units_of_category[HOVER_ASSAULT][s].push_back(*unit);
units_static[*unit].category = HOVER_ASSAULT;
}
else
{
units_of_category[SEA_ASSAULT][s].push_back(*unit);
units_static[*unit].category = SEA_ASSAULT;
}
}
}
// recalculate stats
PrecacheStats();
}
// set default mod_usefulness of units
for(int i = 0; i < cfg->SIDES; ++i)
{
if(cfg->AIR_ONLY_MOD)
{
if(units_of_category[GROUND_ASSAULT][i].size() > 0)
{
mod_usefulness[0][i][0] = units_of_category[GROUND_ASSAULT][i].size() * 100.0
/(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[0][i][0] = 0;
if(units_of_category[AIR_ASSAULT][i].size() > 0)
{
mod_usefulness[1][i][0] = units_of_category[HOVER_ASSAULT][i].size() * 100.0
/(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[1][i][0] = 0;
if(units_of_category[HOVER_ASSAULT][i].size() > 0)
{
mod_usefulness[2][i][0] = units_of_category[HOVER_ASSAULT][i].size() * 100.0
/(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[2][i][0] = 0;
if(units_of_category[SEA_ASSAULT][i].size() > 0)
{
mod_usefulness[3][i][0] = units_of_category[SEA_ASSAULT][i].size() * 100.0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -