Пример #1
0
//----------------------------------------------------------------------------------------------
void StarCraftTechTree::GetRequirements(int p_typeOrResearchId, vector<ResearchType>& p_researches, map<EntityClassType, unsigned>& p_buildings)
{
    TName ident;
    TID id;
    UpgradeType bwapiUpgrade;
    TechType bwapiTech;
    BWAPI::UnitType bwapiUnitType;
    BWAPI::UnitType bwapiSourceType;
    BWAPI::UnitType bwapiRequiredType;
    BWAPI::UnitType bwapiRequiredUnit;
    TechType bwapiRequiredTech;
    EntityClassType requiredEntity;
    ResearchType requiredResearch;
    
    if (BELONG(ResearchType, p_typeOrResearchId))
    {
        // Is Tech
        if ((int)p_typeOrResearchId >= ((int)(RESEARCH_START +  TechIdOffset)))
        {
            /*id = g_Database.TechMapping.GetBySecond((ResearchType)p_typeOrResearchId);
            ident = g_Database.TechIdentMapping.GetByFirst(id);
            bwapiTech = TechType::getType(ident);

            bwapiSourceType = bwapiTech.whatResearches();
            requiredEntity = g_Database.EntityMapping.GetByFirst(bwapiSourceType.getID());
            p_buildings.push_back(requiredEntity);*/
        }
        // Is Upgrade
        else
        {
            id = g_Database.UpgradeMapping.GetBySecond((ResearchType)p_typeOrResearchId);
            ident = g_Database.UpgradeIdentMapping.GetByFirst(id);
            bwapiUpgrade = UpgradeType::getType(ident);

            /*bwapiSourceType = bwapiUpgrade.whatUpgrades();
            requiredEntity = g_Database.EntityMapping.GetByFirst(bwapiSourceType.getID());
            p_buildings.push_back(requiredEntity);*/

            bwapiRequiredType = bwapiUpgrade.whatsRequired();

            if (bwapiRequiredType.getID() != UnitTypes::None.getID())
            {
                requiredEntity = g_Database.EntityMapping.GetByFirst(bwapiRequiredType.getID());
                p_buildings[requiredEntity] = 1;
            }
        }
    }
    else if(BELONG(EntityClassType, p_typeOrResearchId))
    {
        id = g_Database.EntityMapping.GetBySecond((EntityClassType)p_typeOrResearchId);
        ident = g_Database.EntityIdentMapping.GetByFirst(id);
        bwapiUnitType = UnitType::getType(ident);

        /*bwapiSourceType = bwapiUnitType.whatBuilds().first;
        requiredEntity = g_Database.EntityMapping.GetByFirst(bwapiSourceType.getID());
        p_buildings.push_back(requiredEntity);*/

        bwapiRequiredTech = bwapiUnitType.requiredTech();

        if (bwapiRequiredTech.getID() != TechTypes::None.getID())
        {
            requiredResearch = g_Database.TechMapping.GetByFirst(bwapiRequiredTech.getID());
            p_researches.push_back(requiredResearch);
        }

        const map<BWAPI::UnitType, int> &bwapiUnits = bwapiUnitType.requiredUnits();

        for (map<BWAPI::UnitType, int>::const_iterator itr =  bwapiUnits.begin();
            itr != bwapiUnits.end(); ++itr)
        {
            bwapiRequiredUnit = itr->first;
            requiredEntity = g_Database.EntityMapping.GetByFirst(bwapiRequiredUnit.getID());
            p_buildings[requiredEntity] = itr->second;;
        }
    }
}
Пример #2
0
bool MorphManager::canMake(BWAPI::Unit* builder, BWAPI::UnitType type)
{
  if (builder != NULL)
  {
    /* Check if the owner of the unit is you */
    if (builder->getPlayer() != BWAPI::Broodwar->self())
      return false;

    /* Check if this unit can actually build the unit type */
    if (builder->getType() != (type.whatBuilds().first))
      return false;

    /* Carrier space */
    if (builder->getType() == BWAPI::UnitTypes::Protoss_Carrier)
    {
      int max_amt = 4;
      if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Carrier_Capacity)>0)
        max_amt += 4;
      if (builder->getInterceptorCount() + (int)builder->getTrainingQueue().size() >= max_amt)
        return false;
    }
    /* Reaver Space */
    if (builder->getType() == BWAPI::UnitTypes::Protoss_Reaver)
    {
      int max_amt = 5;
      if (BWAPI::Broodwar->self()->getUpgradeLevel(BWAPI::UpgradeTypes::Reaver_Capacity) > 0)
        max_amt += 5;
      if (builder->getScarabCount() + (int)builder->getTrainingQueue().size() >= max_amt)
        return false;
    }
  }

  BWAPI::UnitType addon = BWAPI::UnitTypes::None;
  for(std::map<BWAPI::UnitType, int>::const_iterator i = type.requiredUnits().begin(); i != type.requiredUnits().end(); i++)
    if (i->first.isAddon())
      addon=i->first;

  for(std::map<BWAPI::UnitType, int>::const_iterator i = type.requiredUnits().begin(); i != type.requiredUnits().end(); i++)
  {
    bool pass = false;
    if (BWAPI::Broodwar->self()->completedUnitCount(i->first) >= i->second)
      pass = true;
    if (i->first == BWAPI::UnitTypes::Zerg_Hatchery)
    {
      if (BWAPI::Broodwar->self()->completedUnitCount(BWAPI::UnitTypes::Zerg_Lair) >= i->second)
        pass = true;
      if (BWAPI::Broodwar->self()->completedUnitCount(BWAPI::UnitTypes::Zerg_Hive) >= i->second)
        pass = true;
    }
    if (i->first == BWAPI::UnitTypes::Zerg_Lair)
      if (BWAPI::Broodwar->self()->completedUnitCount(BWAPI::UnitTypes::Zerg_Hive) >= i->second)
        pass = true;
    if (pass == false)
      return false;
  }

  if (type.requiredTech() != BWAPI::TechTypes::None)
    if (!BWAPI::Broodwar->self()->hasResearched((type.requiredTech())))
      return false;

  if (builder != NULL)
    if (addon != BWAPI::UnitTypes::None && addon.whatBuilds().first==type.whatBuilds().first)
      if (builder->getAddon() == NULL || builder->getAddon()->getType() != addon)
        return false;
  return true;
}