void CEconomy::addUnitOnFinished(CUnit &unit) { LOG_II("CEconomy::addUnitOnFinished " << unit) unitCategory c = unit.type->cats; if ((c&BUILDER).any() || ((c&ASSISTER).any() && (c&MOBILE).any())) { CGroup *group = requestGroup(); group->addUnit(unit); } }
void CEconomy::addUnitOnCreated(CUnit& unit) { unitCategory c = unit.type->cats; if ((c&MEXTRACTOR).any()) { CGroup *group = requestGroup(); group->addUnit(unit); takenMexes[group->key] = group->pos(); CUnit *builder = ai->unittable->getUnit(group->firstUnit()->builtBy); if (builder) { assert(group->key != builder->group->key); takenMexes.erase(builder->group->key); } } else if(unit.type->def->needGeo) { CGroup *group = requestGroup(); group->addUnit(unit); takenGeo[group->key] = group->pos(); CUnit *builder = ai->unittable->getUnit(group->firstUnit()->builtBy); if (builder) { assert(group->key != builder->group->key); takenGeo.erase(builder->group->key); } } }
bool CMilitary::addUnit(CUnit& unit) { LOG_II("CMilitary::addUnit " << unit) assert(unit.group == NULL); unitCategory c = unit.type->cats; if ((c&ATTACKER).any() && (c&MOBILE).any() && (c&DEFENSE).none()) { unitCategory wishedCats = ai->unittable->unitsUnderConstruction[unit.key]; CGroup* group; if ((c&SCOUTER).any() && wishedCats.any() && (wishedCats&SCOUTER).none()) c &= ~SCOUTER; // scout was not requested if ((c&SCOUTER).any()) { group = requestGroup(SCOUT); } else if((c&AIR).any() && (c&ARTILLERY).any()) { group = requestGroup(BOMBER); } else if((c&AIR).any() && (c&ASSAULT).none()) { group = requestGroup(AIRFIGHTER); } else { /* If there is a new factory, or the current group is busy, request a new group */ std::map<int,CGroup*>::iterator i = assemblingGroups.find(unit.builtBy); if (i == assemblingGroups.end() || i->second->busy || !i->second->canAdd(&unit)) { group = requestGroup(ENGAGE); assemblingGroups[unit.builtBy] = group; } else { group = i->second; } } group->addUnit(unit); return true; } return false; }