//puts an additional worker into industry, to prevent not finishing the project because //industry prod decreased due to loss of moral void SafeMoral() { const CAssemblyList& assembly_list = *m_pSystem->GetAssemblyList(); AssertBotE(m_WorkersLeftToSet >= 0); if(assembly_list.IsEmpty() || m_WorkersLeftToSet == 0) return; const int max_buildings = m_pSystem->GetNumberOfWorkbuildings(WORKER::INDUSTRY_WORKER, 0); if(m_pSystem->GetWorker(WORKER::INDUSTRY_WORKER) < max_buildings) SetWorker(WORKER::INDUSTRY_WORKER, CSystem::SET_WORKER_MODE_INCREMENT); }
//fills all remaining empty buildings of the given cathegory, only considering available workers and buildings bool FillRemainingSlots(WORKER::Typ type) { AssertBotE(m_WorkersLeftToSet >= 0); if(m_WorkersLeftToSet == 0) return false; m_WorkersLeftToSet += m_pSystem->GetWorker(type); m_pSystem->SetWorker(type, CSystem::SET_WORKER_MODE_SET, 0); const int buildings = m_pSystem->GetNumberOfWorkbuildings(type, 0); const int to_set = min(buildings, m_WorkersLeftToSet); SetWorker(type, CSystem::SET_WORKER_MODE_SET,to_set); return true; }
//Indreases workers in cathegories energy and food until we produce enough to suffice for the consumption we have bool IncreaseWorkersUntilSufficient(WORKER::Typ type, bool allow_insufficient) { AssertBotE(type == WORKER::ENERGY_WORKER || type == WORKER::FOOD_WORKER); if(m_pSystem->GetDisabledProductions()[type]) return true; while(true) { const int value = (type == WORKER::ENERGY_WORKER) ? m_pProd->GetEnergyProd() : m_pProd->GetFoodProd(); if(value >= 0) return true; if(m_WorkersLeftToSet <= 0) return allow_insufficient; const int number_of_buildings = m_pSystem->GetNumberOfWorkbuildings(type, 0); const int workers_set = m_pSystem->GetWorker(type); AssertBotE(workers_set <= number_of_buildings); if(workers_set == number_of_buildings) return allow_insufficient; SetWorker(type, CSystem::SET_WORKER_MODE_INCREMENT); m_pSystem->CalculateVariables(); } }
//distributes workers onto priorities remaining after max priorities have been processed //workers that cannot be set because of number of buildings are tried to be set into //the cathegory with next less workers void DoPriorities(const std::map<WORKER::Typ, int>& priorities, bool max_industry, bool safe_moral) { SafeMoralWorkerReserve reserve(*this, safe_moral); std::map<WORKER::Typ, int> prios(priorities); DoMaxPriorities(prios, max_industry); DefaultDistributionCalculator decalc(m_WorkersLeftToSet, prios); const std::vector<DistributionElem>& result = decalc.Calc(); int failed_to_set = 0; for(std::vector<DistributionElem>::const_iterator it = result.begin(); it != result.end(); ++it) { const int buildings = m_pSystem->GetNumberOfWorkbuildings(it->m_Type, 0); if(buildings >= it->m_iCount) { int try_set = it->m_iCount; if(it->m_Type != WORKER::INDUSTRY_WORKER) try_set += failed_to_set; if(buildings >= try_set) { if(it->m_Type != WORKER::INDUSTRY_WORKER) failed_to_set = 0; SetWorker(it->m_Type, CSystem::SET_WORKER_MODE_SET, try_set); } else { if(it->m_Type != WORKER::INDUSTRY_WORKER) failed_to_set -= buildings -it->m_iCount; SetWorker(it->m_Type, CSystem::SET_WORKER_MODE_SET, buildings); } } else { failed_to_set += it->m_iCount - buildings; SetWorker(it->m_Type, CSystem::SET_WORKER_MODE_SET, buildings); } AssertBotE(m_WorkersLeftToSet >= 0 && failed_to_set >= 0); failed_to_set += DecrementDueToFullStore(it->m_Type); if(it->m_Type == WORKER::INDUSTRY_WORKER) { failed_to_set += DecrementDueToWastedIndustry(max_industry); } } }