bool CUnitHandler::FactoryBuilderAdd(BuilderTracker* builderTracker) { assert(builderTracker->buildTaskId == 0); assert(builderTracker->taskPlanId == 0); assert(builderTracker->factoryId == 0); for (std::list<Factory>::iterator i = Factories.begin(); i != Factories.end(); i++) { CUNIT* u = ai->GetUnit(i->id); // don't assist hubs (or factories that cannot be assisted) if ((u->def())->canBeAssisted && !u->isHub()) { float totalBuilderCost = 0.0f; // HACK: get the sum of the heuristic costs of every // builder that is already assisting this factory for (std::list<int>::iterator j = i->supportbuilders.begin(); j != i->supportbuilders.end(); j++) { if ((ai->GetUnit(*j)->def())->isCommander) { continue; } totalBuilderCost += ai->math->GetUnitCost(*j); } // if this sum is less than the heuristic cost of the // factory itself, add the builder to this factory // // this is based purely on the metal and energy costs // of all involved parties, and silently expects that // building _another_ factory would always be better // than assisting it further if (totalBuilderCost < (ai->math->GetUnitCost(i->id) * BUILDERFACTORYCOSTRATIO * 2.5f)) { builderTracker->factoryId = i->id; i->supportbuilders.push_back(builderTracker->builderID); i->supportBuilderTrackers.push_back(builderTracker); ai->GetUnit(builderTracker->builderID)->Guard(i->id); return true; } } } return false; }