📄 aaibuildtable.cpp
字号:
{
my_ranking = effiency * (unitList[*i-1]->extractsMetal - avg_value[EXTRACTOR][side]) / max_value[EXTRACTOR][side]
- cost * (units_static[*i].cost - avg_cost[EXTRACTOR][side]) / max_cost[EXTRACTOR][side];
if(armed && !unitList[*i-1]->weapons.empty())
my_ranking += 1;
}
else
my_ranking = -10000;
if(my_ranking > best_ranking)
{
best_ranking = my_ranking;
best_unit = *i;
}
}
// 0 if no unit found (list was probably empty)
return best_unit;
}
int AAIBuildTable::GetBiggestMex()
{
int biggest_mex = 0, biggest_yard_map = 0;
for(int s = 0; s < cfg->SIDES; ++s)
{
for(list<int>::iterator mex = units_of_category[EXTRACTOR][s].begin(); mex != units_of_category[EXTRACTOR][s].end(); ++mex)
{
if(unitList[*mex-1]->xsize * unitList[*mex-1]->ysize > biggest_yard_map)
{
biggest_yard_map = unitList[*mex-1]->xsize * unitList[*mex-1]->ysize;
biggest_mex = *mex;
}
}
}
return biggest_mex;
}
int AAIBuildTable::GetStorage(int side, float cost, float metal, float energy, float urgency, bool water, bool canBuild)
{
int best_storage = 0;
float best_rating = 0, my_rating;
for(list<int>::iterator storage = units_of_category[STORAGE][side-1].begin(); storage != units_of_category[STORAGE][side-1].end(); storage++)
{
if(canBuild && units_dynamic[*storage].buildersAvailable <= 0)
my_rating = 0;
else if(!water && unitList[*storage-1]->minWaterDepth <= 0)
{
my_rating = (metal * unitList[*storage-1]->metalStorage + energy * unitList[*storage-1]->energyStorage)
/(cost * units_static[*storage].cost + urgency * unitList[*storage-1]->buildTime);
}
else if(water && unitList[*storage-1]->minWaterDepth > 0)
{
my_rating = (metal * unitList[*storage-1]->metalStorage + energy * unitList[*storage-1]->energyStorage)
/(cost * units_static[*storage].cost + urgency * unitList[*storage-1]->buildTime);
}
else
my_rating = 0;
if(my_rating > best_rating)
{
best_rating = my_rating;
best_storage = *storage;
}
}
return best_storage;
}
int AAIBuildTable::GetMetalMaker(int side, float cost, float efficiency, float metal, float urgency, bool water, bool canBuild)
{
int best_maker = 0;
float best_rating = 0, my_rating;
for(list<int>::iterator maker = units_of_category[METAL_MAKER][side-1].begin(); maker != units_of_category[METAL_MAKER][side-1].end(); maker++)
{
if(canBuild && units_dynamic[*maker].buildersAvailable <= 0)
my_rating = 0;
else if(!water && unitList[*maker-1]->minWaterDepth <= 0)
{
my_rating = (pow((long double) efficiency * units_static[*maker].efficiency[0], (long double) 1.4) + pow((long double) metal * unitList[*maker-1]->makesMetal, (long double) 1.6))
/(pow((long double) cost * units_static[*maker].cost,(long double) 1.4) + pow((long double) urgency * unitList[*maker-1]->buildTime,(long double) 1.4));
}
else if(water && unitList[*maker-1]->minWaterDepth > 0)
{
my_rating = (pow((long double) efficiency * units_static[*maker].efficiency[0], (long double) 1.4) + pow((long double) metal * unitList[*maker-1]->makesMetal, (long double) 1.6))
/(pow((long double) cost * units_static[*maker].cost,(long double) 1.4) + pow((long double) urgency * unitList[*maker-1]->buildTime,(long double) 1.4));
}
else
my_rating = 0;
if(my_rating > best_rating)
{
best_rating = my_rating;
best_maker = *maker;
}
}
return best_maker;
}
int AAIBuildTable::GetDefenceBuilding(int side, double efficiency, double combat_power, double cost, double ground_eff, double air_eff, double hover_eff, double sea_eff, double submarine_eff, double urgency, double range, int randomness, bool water, bool canBuild)
{
--side;
double best_ranking = -100000, my_ranking;
int best_defence = 0;
UnitTypeStatic *unit;
double max_buildtime = this->max_buildtime[STATIONARY_DEF][side]*256.0;
double max_range = max_value[STATIONARY_DEF][side];
double my_power;
double total_power = ground_eff + air_eff + hover_eff + sea_eff + submarine_eff;
// determine max_eff
double max_powercost = 0;
int k = 0;
// use my_power as temp var
for(list<int>::iterator defence = units_of_category[STATIONARY_DEF][side].begin(); defence != units_of_category[STATIONARY_DEF][side].end(); ++defence)
{
unit = &units_static[*defence];
// calculate eff.
my_power = ground_eff * unit->efficiency[0] / max_eff[side][5][0] + air_eff * unit->efficiency[1] / max_eff[side][5][1]
+ hover_eff * unit->efficiency[2] / max_eff[side][5][2] + sea_eff * unit->efficiency[3] / max_eff[side][5][3]
+ submarine_eff * unit->efficiency[4] / max_eff[side][5][4];
my_power /= total_power;
// store result
def_power[side][k] = my_power;
// calculate eff
my_power *= (max_cost[STATIONARY_DEF][side] / unit->cost);
if(my_power > max_powercost)
max_powercost = my_power;
++k;
}
// something went wrong
if(max_powercost <= 0)
return 0;
//fprintf(ai->file, "\nSelecting defence: eff %f power %f urgency %f range %f\n", efficiency, combat_power, urgency, range);
// reset counter
k = 0;
// calculate rating
for(list<int>::iterator defence = units_of_category[STATIONARY_DEF][side].begin(); defence != units_of_category[STATIONARY_DEF][side].end(); ++defence)
{
if(canBuild && units_dynamic[*defence].buildersAvailable <= 0)
my_ranking = -100000;
else if( (!water && unitList[*defence-1]->minWaterDepth <= 0) || (water && unitList[*defence-1]->minWaterDepth > 0) )
{
unit = &units_static[*defence];
my_ranking = efficiency * (def_power[side][k] / max_powercost) * (max_cost[STATIONARY_DEF][side] / unit->cost)
+ combat_power * def_power[side][k] / total_power
+ range * unit->range / max_range
- cost * unit->cost / max_cost[STATIONARY_DEF][side]
- urgency * unitList[*defence-1]->buildTime / max_buildtime;
my_ranking += (0.1 * ((double)(rand()%randomness)));
//fprintf(ai->file, "%-20s: %f %f %f %f %f\n", unitList[unit->id-1]->humanName.c_str(), t1, t2, t3, t4, my_ranking);
}
else
my_ranking = -100000;
if(my_ranking > best_ranking)
{
best_ranking = my_ranking;
best_defence = *defence;
}
++k;
}
// debug
/*if(best_defence)
fprintf(ai->file, "Selected: %s \n", unitList[best_defence-1]->humanName.c_str());
else
fprintf(ai->file, "Selected: none\n");*/
return best_defence;
}
int AAIBuildTable::GetRandomDefence(int side, UnitCategory category)
{
float best_rating = 0, my_rating;
int best_defence = 0;
for(list<int>::iterator i = units_of_category[STATIONARY_DEF][side-1].begin(); i != units_of_category[STATIONARY_DEF][side-1].end(); i++)
{
my_rating = rand()%512;
if(my_rating >best_rating)
{
if(unitList[*i-1]->metalCost < cfg->MAX_METAL_COST)
{
best_defence = *i;
best_rating = my_rating;
}
}
}
return best_defence;
}
int AAIBuildTable::GetAirBase(int side, float cost, bool water, bool canBuild)
{
float best_ranking = 0, my_ranking;
int best_airbase = 0;
for(list<int>::iterator airbase = units_of_category[AIR_BASE][side-1].begin(); airbase != units_of_category[AIR_BASE][side-1].end(); ++airbase)
{
// check if water
if(canBuild && units_dynamic[*airbase].buildersAvailable <= 0)
my_ranking = 0;
else if(!water && unitList[*airbase-1]->minWaterDepth <= 0)
{
my_ranking = 100.f / (units_dynamic[*airbase].active + 1);
}
else if(water && unitList[*airbase-1]->minWaterDepth > 0)
{
//my_ranking = 100 / (cost * units_static[*airbase].cost);
my_ranking = 100.f / (units_dynamic[*airbase].active + 1);
}
else
my_ranking = 0;
if(my_ranking > best_ranking)
{
best_ranking = my_ranking;
best_airbase = *airbase;
}
}
return best_airbase;
}
int AAIBuildTable::GetStationaryArty(int side, float cost, float range, float efficiency, bool water, bool canBuild)
{
float best_ranking = 0, my_ranking;
int best_arty = 0;
for(list<int>::iterator arty = units_of_category[STATIONARY_ARTY][side-1].begin(); arty != units_of_category[STATIONARY_ARTY][side-1].end(); ++arty)
{
// check if water
if(canBuild && units_dynamic[*arty].buildersAvailable <= 0)
my_ranking = 0;
else if(!water && unitList[*arty-1]->minWaterDepth <= 0)
{
my_ranking = (range * units_static[*arty].efficiency[1] + efficiency * units_static[*arty].efficiency[0]) / (cost * units_static[*arty].cost);
}
else if(water && unitList[*arty-1]->minWaterDepth > 0)
{
my_ranking = (range * units_static[*arty].efficiency[1] + efficiency * units_static[*arty].efficiency[0]) / (cost * units_static[*arty].cost);
}
else
my_ranking = 0;
if(my_ranking > best_ranking)
{
best_ranking = my_ranking;
best_arty = *arty;
}
}
return best_arty;
}
int AAIBuildTable::GetRadar(int side, float cost, float range, bool water, bool canBuild)
{
int best_radar = 0;
float my_rating, best_rating = -10000;
side -= 1;
for(list<int>::iterator i = units_of_category[STATIONARY_RECON][side].begin(); i != units_of_category[STATIONARY_RECON][side].end(); i++)
{
if(unitList[*i-1]->radarRadius > 0)
{
if(canBuild && units_dynamic[*i].buildersAvailable <= 0)
my_rating = -10000;
else if(water && unitList[*i-1]->minWaterDepth > 0)
my_rating = cost * (avg_cost[STATIONARY_RECON][side] - units_static[*i].cost)/max_cost[STATIONARY_RECON][side]
+ range * (unitList[*i-1]->radarRadius - avg_value[STATIONARY_RECON][side])/max_value[STATIONARY_RECON][side];
else if (!water && unitList[*i-1]->minWaterDepth <= 0)
my_rating = cost * (avg_cost[STATIONARY_RECON][side] - units_static[*i].cost)/max_cost[STATIONARY_RECON][side]
+ range * (unitList[*i-1]->radarRadius - avg_value[STATIONARY_RECON][side])/max_value[STATIONARY_RECON][side];
else
my_rating = -10000;
}
else
my_rating = 0;
if(my_rating > best_rating)
{
if(unitList[*i-1]->metalCost < cfg->MAX_METAL_COST)
{
best_radar = *i;
best_rating = my_rating;
}
}
}
return best_radar;
}
int AAIBuildTable::GetJammer(int side, float cost, float range, bool water, bool canBuild)
{
int best_jammer = 0;
float my_rating, best_rating = -10000;
side -= 1;
for(list<int>::iterator i = units_of_category[STATIONARY_JAMMER][side].begin(); i != units_of_category[STATIONARY_JAMMER][side].end(); i++)
{
if(canBuild && units_dynamic[*i].buildersAvailable <= 0)
my_rating = -10000;
else if(water && unitList[*i-1]->minWaterDepth > 0)
my_rating = cost * (avg_cost[STATIONARY_JAMMER][side] - units_static[*i].cost)/max_cost[STATIONARY_JAMMER][side]
+ range * (unitList[*i-1]->jammerRadius - avg_value[STATIONARY_JAMMER][side])/max_value[STATIONARY_JAMMER][side];
else if (!water && unitList[*i-1]->minWaterDepth <= 0)
my_rating = cost * (avg_cost[STATIONARY_JAMMER][side] - units_static[*i].cost)/max_cost[STATIONARY_JAMMER][side]
+ range * (unitList[*i-1]->jammerRadius - avg_value[STATIONARY_JAMMER][side])/max_value[STATIONARY_JAMMER][side];
else
my_rating = -10000;
if(my_rating > best_rating)
{
if(unitList[*i-1]->metalCost < cfg->MAX_METAL_COST)
{
best_jammer = *i;
best_rating = my_rating;
}
}
}
return best_jammer;
}
int AAIBuildTable::GetScout(int side, float los, float cost, unsigned int allowed_movement_types, int randomness, bool cloakable, bool canBuild)
{
side -= 1;
float best_ranking = -10000, my_ranking;
int best_scout = 0;
for(list<int>::iterator i = units_of_category[SCOUT][side].begin(); i != units_of_category[SCOUT][side].end(); ++i)
{
if(units_static[*i].movement_type & allowed_movement_types)
{
if(!canBuild || (canBuild && units_dynamic[*i].buildersAvailable > 0))
{
my_ranking = los * ( unitList[*i-1]->losRadius - avg_value[SCOUT][side]) / max_value[SCOUT][side];
my_ranking += cost * (avg_cost[SCOUT][side] - units_static[*i].cost) / max_cost[SCOUT][side];
if(cloakable && unitList[*i-1]->canCloak)
my_ranking += 8.0f;
my_ranking *= (1 + 0.05 * ((float)(rand()%randomness)));
if(my_ranking > best_ranking)
{
best_ranking = my_ranking;
best_scout = *i;
}
}
}
}
return best_scout;
}
int AAIBuildTable::GetBuilder(int unit_id)
{
return *(units_static[unit_id].builtByList.begin());
}
int AAIBuildTable::GetBuilder(int unit_id, UnitMoveType moveType)
{
if(moveType == GROUND)
{
for(list<int>::iterator builder = units_static[unit_id].builtByList.begin(); builder != units_static[unit_id].builtByList.end(); builder++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -