bool Enter_Transport::execute(aithread &thread) const { if ( this->getOpcode() == AISCRIPT::Enum::ENTER_BUNKER || this->getOpcode() == AISCRIPT::Enum::ENTER_TRANSPORT ) { Unitset unitsForTrans( Broodwar->getUnitsInRectangle(thread.getLocation().topLeft, thread.getLocation().bottomRight, this->getOpcode() == AISCRIPT::Enum::ENTER_BUNKER ? bunkerProc : transProc) ); // Iterate the units that are to enter the bunkers for ( auto u : unitsForTrans ) { // Find a bunker closest to the current unit that has space available Unit pClosest = u->getClosestUnit( (this->getOpcode() == AISCRIPT::Enum::ENTER_BUNKER ? GetType == UnitTypes::Terran_Bunker : GetType != UnitTypes::Terran_Bunker) && IsTransport && GetPlayer == Broodwar->self() && SpaceRemaining >= u->getType().spaceRequired() ); if ( pClosest ) // If a bunker was found u->rightClick(pClosest); } } else if ( this->getOpcode() == AISCRIPT::Enum::EXIT_TRANSPORT ) { // Normally we are supposed to check the type here, but we don't need to save processing time and can let BWAPI sort it out Broodwar->getUnitsInRectangle(thread.getLocation().topLeft, thread.getLocation().bottomRight).unloadAll(); } // Debug and return thread.saveDebug(Text::Green, this->getOpcode()); return true; }
bool Player_Ally::execute(aithread &thread) const { // @TODO: BWAPI: Unitset::getPlayers for retrieving set of players owning the units, not important /* can become unitsInRect( bw->getUnitsInRectangle(location.topLeft, location.bottomRight, GetPlayer != self) ).getPlayers().setAlliance(bOpcode == AISCRIPT::Enum::PLAYER_ALLY); */ // Set the alliance of all players who own units inside the thread's execution location Unitset units( Broodwar->getUnitsInRectangle(thread.getLocation().topLeft, thread.getLocation().bottomRight, GetPlayer != Broodwar->self()) ); for ( auto u = units.begin(); u != units.end(); ++u ) Broodwar->setAlliance(u->getPlayer(), this->getOpcode() == AISCRIPT::Enum::PLAYER_ALLY); // Debug and return thread.saveDebug(Text::Green, this->getOpcode()); return true; }
bool Move_DT::execute(aithread &thread) const { // Execute Unitset myUnits( Broodwar->self()->getUnits() ); // NOTE: Not actual behaviour. Needs special AI Control & Captain assignment. // However this command is not important and serves little purpose. myUnits.erase_if(!((GetType == UnitTypes::Protoss_Dark_Templar || GetType == UnitTypes::Hero_Dark_Templar) && Exists && IsCompleted)); myUnits.move( thread.getLocation().center() ); // Debug and return thread.saveDebug(Text::Yellow, this->getOpcode()); return true; }