ActionID ActionTypeData::GetActionID(const BWAPI::UnitType & type) { const RaceID raceID = GetRaceID(type.getRace()); BOSS_ASSERT(raceID < Races::NUM_RACES, "Race ID invalid: %d %s", (int)raceID, type.getName().c_str()); for (ActionID a(0); a < ActionTypeData::GetNumActionTypes(raceID); ++a) { const ActionTypeData & data = GetActionTypeData(raceID, a); if (data.isUnit() && data.getUnitType() == type) { return data.getActionID(); } } BOSS_ASSERT(false, "Could not find UnitType: %d %s", type.getID(), type.getName().c_str()); return 0; }
// UnitType constructor ActionTypeData::ActionTypeData(BWAPI::UnitType t, const ActionID id) : type (UnitType) , unit (t) , raceID (GetRaceID(t.getRace())) , actionID (id) , mineralPriceVal (t.mineralPrice() * Constants::RESOURCE_SCALE) , gasPriceVal (t.gasPrice() * Constants::RESOURCE_SCALE) , supplyRequiredVal (t.supplyRequired()) , supplyProvidedVal (t.supplyProvided()) , buildTimeVal (t.buildTime()) , numberProduced (1) , name (t.getName()) , metaName (t.getName()) , building (t.isBuilding()) , worker (t.isWorker()) , refinery (t.isRefinery()) , resourceDepot (t.isResourceDepot()) , supplyProvider (t.supplyProvided() > 0 && !t.isResourceDepot()) , canProduceBool (t.isBuilding() && t.canProduce()) , canAttackBool (t.canAttack()) , whatBuildsUnitType (t.whatBuilds().first) , addon (t.isAddon()) , morphed (false) , reqAddon (false) , reqAddonID (0) { if (t == BWAPI::UnitTypes::Zerg_Zergling || t == BWAPI::UnitTypes::Zerg_Scourge) { numberProduced = 2; } if (t == BWAPI::UnitTypes::Zerg_Lair || t == BWAPI::UnitTypes::Zerg_Hive || t == BWAPI::UnitTypes::Zerg_Greater_Spire || t == BWAPI::UnitTypes::Zerg_Lurker || t == BWAPI::UnitTypes::Zerg_Guardian || t == BWAPI::UnitTypes::Zerg_Sunken_Colony || t == BWAPI::UnitTypes::Zerg_Spore_Colony) { morphed = true; } setShortName(); }
MetaType::MetaType (BWAPI::UnitType t) : _unitType(t) , _type(MetaTypes::Unit) , _race(t.getRace()) { }
// returns an ActionSet of prerequisites for a given action ActionSet calculatePrerequisites(StarcraftAction & action) { ActionSet pre; if (DEBUG_StarcraftData) { printf("DEBUG: Hello\n"); printf("DEBUG: %d \t%s \t%s\n", getAction(action), action.getName().c_str(), actions[getAction(action)].getName().c_str()); } // if it's a UnitType if (action.getType() == StarcraftAction::UnitType) { std::map<BWAPI::UnitType, int> requiredUnits = action.getUnitType().requiredUnits(); BWAPI::UnitType actionType = action.getUnitType(); // if it's a protoss building that isn't a Nexus or Assimilator, we need a pylon (indirectly) if (actionType.getRace() == BWAPI::Races::Protoss && actionType.isBuilding() && !actionType.isResourceDepot() && !(actionType == BWAPI::UnitTypes::Protoss_Pylon) && !(actionType == BWAPI::UnitTypes::Protoss_Assimilator)) { pre.add(getAction(BWAPI::UnitTypes::Protoss_Pylon)); } // for each of the required UnitTypes for (std::map<BWAPI::UnitType, int>::iterator unitIt = requiredUnits.begin(); unitIt != requiredUnits.end(); unitIt++) { if (DEBUG_StarcraftData) printf("\tPRE: %s\n", unitIt->first.getName().c_str()); BWAPI::UnitType type = unitIt->first; // add the action to the ActionSet if it is not a larva if (type != BWAPI::UnitTypes::Zerg_Larva) { //printf("\t\tAdding %s\n", type.getName().c_str()); pre.add(getAction(type)); } } // if there is a TechType required if (action.getUnitType().requiredTech() != BWAPI::TechTypes::None) { if (DEBUG_StarcraftData) printf("\tPRE: %s\n", action.getUnitType().requiredTech().getName().c_str()); // add it to the ActionSet pre.add(getAction(action.getUnitType().requiredTech())); } } // if it's a TechType if (action.getType() == StarcraftAction::TechType) { if (action.getTechType().whatResearches() != BWAPI::UnitTypes::None) { if (DEBUG_StarcraftData) printf("\tPRE: %s\n", action.getTechType().whatResearches().getName().c_str()); // add what researches it pre.add(getAction(action.getTechType().whatResearches())); } } // if it's an UpgradeType if (action.getType() == StarcraftAction::UpgradeType) { if (action.getUpgradeType().whatUpgrades() != BWAPI::UnitTypes::None) { if (DEBUG_StarcraftData) printf("\tPRE: %s\n", action.getUpgradeType().whatUpgrades().getName().c_str()); // add what upgrades it pre.add(getAction(action.getUpgradeType().whatUpgrades())); } } //printf("Finish Prerequisites\n"); return pre; }
ActionTypeData ActionTypeData::GetActionTypeData(const BWAPI::UnitType & a) { return GetActionTypeData(GetRaceID(a.getRace()), GetActionID(a)); }