void CFactoryCAI::SlowUpdate() { // Commands issued may invoke SlowUpdate when paused if (gs->paused) return; if (commandQue.empty() || owner->beingBuilt) return; CFactory* fac = static_cast<CFactory*>(owner); while (!commandQue.empty()) { Command& c = commandQue.front(); const size_t oldQueueSize = commandQue.size(); const std::map<int, BuildOption>::iterator buildOptIt = buildOptions.find(c.GetID()); if (buildOptIt != buildOptions.end()) { // build-order switch (fac->QueueBuild(unitDefHandler->GetUnitDefByID(-c.GetID()), c, &FactoryFinishBuildCallBack)) { case CFactory::FACTORY_SKIP_BUILD_ORDER: { // order rejected and we want to skip it permanently DecreaseQueueCount(c, buildOptions[c.GetID()], false); } break; } } else { // regular order (move/wait/etc) switch (c.GetID()) { case CMD_STOP: { ExecuteStop(c); } break; default: { CCommandAI::SlowUpdate(); break; } } } // exit if no command was consumed if (oldQueueSize == commandQue.size()) break; } }
// NOTE: // only called if Factory::QueueBuild returned FACTORY_NEXT_BUILD_ORDER // (meaning the order was not rejected and the callback was installed) void CFactoryCAI::FactoryFinishBuild(const Command& command) { DecreaseQueueCount(command, buildOptions[command.GetID()]); }