bool CheckShips(const std::map<CString, CShipMap>& ships) const { const int scan_power = m_pSystem->GetScanPower(m_pSystem->OwnerID(), true); for(std::map<CString, CShipMap>::const_iterator race = ships.begin(); race != ships.end(); ++race) for(CShipMap::const_iterator ship = race->second.begin(); ship != race->second.end(); ++ship) { if(ship->second->GetTorpedoWeapons()->IsEmpty()) { const boost::shared_ptr<CMajor> owner = boost::dynamic_pointer_cast<CMajor>(ship->second->Owner()); if(owner && !owner->IsHumanPlayer()) continue; } if(!ship->second->GetCloak() && m_pSystem->GetNeededScanPower(ship->second->OwnerID()) <= scan_power) return true; } return false; }
bool CSystemManager::CheckEnergyConsumers(CSystem& system) { if(!m_bOnOffline) return false; CEnergyConsumersChecker checker(system); CArray<CBuilding>* buildings = system.GetAllBuildings(); bool bomb_warning = false; bool defense_checked = false; const CSystemProd& prod = *system.GetProduction(); int additional_available_energy = prod.GetAvailableEnergy(); for(int i = 0; i < buildings->GetSize(); ++i) { CBuilding& building = buildings->GetAt(i); const CBuildingInfo& info = resources::BuildingInfo->GetAt(building.GetRunningNumber() - 1); const int needed = info.GetNeededEnergy(); if(needed == 0) continue; if(m_IgnoredBuildings.find(info.GetRunningNumber()) != m_IgnoredBuildings.end()) continue; bool should_be_online = building.GetIsBuildingOnline(); if(info.GetShipYard() || info.GetShipBuildSpeed() > 0) { AssertBotE(!info.IsDefenseBuilding()); should_be_online = checker.ShouldTakeShipyardOnline(); } if(info.IsDefenseBuilding()) { AssertBotE(!info.GetShipYard()); if(bomb_warning) should_be_online = true; else if(!defense_checked) { bomb_warning = checker.BomberInSector(); should_be_online = bomb_warning; defense_checked = true; } else should_be_online = false; } if(info.IsDeritiumRefinery()) should_be_online = checker.CheckStoreFull(RESOURCES::DERITIUM, info, building); if(info.GetResistance() > 0) should_be_online = !system.Taken(); if(info.GetShipTraining() > 0) should_be_online = system.GetOwnerOfShip(system.OwnerID(), true); if(info.GetTroopTraining() > 0) should_be_online = !system.GetTroops()->IsEmpty(); bool minus_moral = false; if(info.GetMoralProd() < 0) minus_moral = should_be_online = checker.CheckMoral(info, building, m_iMinMoral, m_iMinMoralProd); const WORKER::Typ type = info.ProducesWorkerfull(); if(type != WORKER::NONE) { should_be_online = system.HasStore(type) ? checker.CheckStoreFull(WorkerToResource(type), info, building) : true; } should_be_online = should_be_online || info.IsUsefulForProduction(); should_be_online = should_be_online && (info.OnlyImprovesProduction(minus_moral) || (info.GetShipBuildSpeed() > 0 && checker.ShouldTakeShipyardOnline())); should_be_online = should_be_online || info.IsUsefulMoral(); const bool is_online = building.GetIsBuildingOnline(); if(should_be_online && !is_online) { if(additional_available_energy >= needed) { building.SetIsBuildingOnline(true); additional_available_energy -= needed; system.CalculateVariables(); } } else if (!should_be_online && is_online) { const int needed = info.GetNeededEnergy(); building.SetIsBuildingOnline(false); additional_available_energy += needed; system.CalculateVariables(); } } AssertBotE(additional_available_energy >= 0); return m_bBombWarning && bomb_warning; }