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

📄 aaibuildtable.cpp

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