⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaibuildtable.cpp

📁 这是整套横扫千军3D版游戏的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						/(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 + -