Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
bool Killable::execute(aithread &thread) const
{
  thread.setFlags(AI_THREAD_KILLABLE);

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 3
0
bool Wait_FinishAttack::execute(aithread &thread) const
{
  // Debug
  thread.saveDebug(Text::Red, this->getOpcode());

  // Check if AI is attacking
  // if ( AIIsAttacking )
  {
    return thread.noretry();
  }
  return thread.retry();
}
Ejemplo n.º 4
0
bool Wait_Upgrades::execute(aithread &thread) const
{
  // Debug
  thread.saveDebug(Text::Green, this->getOpcode());

  // If upgrades are finished, then move on to next opcode
  if ( MainController.getFlags() & CONTROLLER_UPGRADES_FINISHED )
    return thread.noretry();
  
  // Otherwise retry this opcode
  return thread.retry();
}
Ejemplo n.º 5
0
bool Harass_Factor::execute(aithread &thread) const
{
  // Parameters
  WORD wUnknown;
  thread.readTuple( std::tie( wUnknown ) );

  // HarassFactor(wUnk);

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%u", wUnknown);
  return true;
}
Ejemplo n.º 6
0
bool Allies_Watch::execute(aithread &thread) const
{
  // Params
  BYTE bExpansionId;
  WORD wBlock;
  thread.readTuple( std::tie(bExpansionId, wBlock) );
  
  // @TODO

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%u %04X", bExpansionId, wBlock);
  return true;
}
Ejemplo n.º 7
0
bool DefenseUse::execute(aithread &thread) const
{
  // Parameters
  BYTE bCount;
  WORD wUnitType;
  thread.readTuple( std::tie(bCount, wUnitType) );

  MainController.DefenseUse(this->getOpcode() - AISCRIPT::Enum::DEFENSEUSE_GG, bCount, wUnitType);

  // Debug and return
  thread.saveDebug(Text::Green, this->getOpcode(), "%u %s", bCount, AISCRIPT::getUnitName(wUnitType) );
  return true;
}
Ejemplo n.º 8
0
bool Nuke_Rate::execute(aithread &thread) const
{
  // Parameters
  BYTE bNukeRate;
  thread.readTuple( std::tie( bNukeRate ) );

  // Assign to controller
  MainController.bNukeRate = bNukeRate;

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 9
0
bool Default_Min::execute(aithread &thread) const
{
  // Parameters
  BYTE bDefaultMin;
  thread.readTuple( std::tie( bDefaultMin ) );

  // Assign to controller
  MainController.bDefaultMin = bDefaultMin;

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 10
0
bool Guard_Resources::execute(aithread &thread) const
{
  // Retrieve parameters
  WORD wUnitType;
  thread.readTuple( std::tie(wUnitType) );

  // Execution
  // GuardResources(wType);

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%s", AISCRIPT::getUnitName(wUnitType));
  return true;
}
Ejemplo n.º 11
0
bool Panic::execute(aithread &thread) const
{
  // Retrieve parameters
  WORD wOffset;
  thread.readTuple( std::tie(wOffset) );

  // Set panic block
  MainController.wPanicBlock = wOffset;

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode(), "p_%04X", wOffset);
  return true;
}
Ejemplo n.º 12
0
bool Place_Guard::execute(aithread &thread) const
{
  // Retrieve parameters
  WORD wUnitType;
  BYTE bGuardType;
  thread.readTuple( std::tie(wUnitType, bGuardType) );

  // Execution
  // this->pTown->PlaceGuard(bGuardType, wUnitType);

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%s %u", AISCRIPT::getUnitName(wUnitType), bGuardType);
  return true;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
bool Build::execute(aithread &thread) const
{
  // Retrieve parameters
  BYTE bBuildCount, bPriority;
  WORD wUnitType;
  thread.readTuple( std::tie(bBuildCount, wUnitType, bPriority) );

  //if ( bBuildCount <= 30 && wBuildType < UnitTypes::None )
  //  this->pTown->MacroManagerSet(MACRO_BUILD, bBuildCount, wBuildType, bPriority, false);

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%u %s %u", bBuildCount, AISCRIPT::getUnitName(wUnitType), bPriority);
  return true;
}
Ejemplo n.º 15
0
bool Define_Max::execute(aithread &thread) const
{
  // Retrieve parameters
  BYTE bCount;
  WORD wType;
  thread.readTuple( std::tie(bCount, wType) );

  if ( wType < UnitTypes::None )
    MainController.bDefineMax[wType] = bCount;

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode(), "%u %s", bCount, AISCRIPT::getUnitName(wType) );
  return true;
}
Ejemplo n.º 16
0
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;
}
Ejemplo n.º 17
0
bool Random_Jump::execute(aithread &thread) const
{
  // Retrieve parameters
  BYTE bChance;
  WORD wOffset;
  thread.readTuple( std::tie(bChance, wOffset) );

  /// Set the new script offset
  if ( (BYTE)rand() <= bChance )
    thread.setScriptOffset( wOffset );

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode(), "%u p_%04X", bChance, wOffset);
  return true;
}
Ejemplo n.º 18
0
bool Wait_Train::execute(aithread &thread) const
{
  // Parameters
  BYTE bCount;
  WORD wUnitType;
  thread.readTuple( std::tie(bCount, wUnitType) );

  // Debug
  thread.saveDebug(Text::Green, this->getOpcode(), "%u %s", bCount, AISCRIPT::getUnitName(wUnitType) );

  // Perform actions
  if ( GetStandardUnitCount(wUnitType) < bCount )
    return thread.retry();
  return thread.noretry();
}
Ejemplo n.º 19
0
bool If_Dif::execute(aithread &thread) const
{
    // Parameters
    BYTE bModifier, bValue;
    WORD wBlock;
    thread.readTuple( std::tie( bModifier, bValue, wBlock ) );

    // Compare diff value
    BYTE bDiff = MainController.bIfDif;
    if ( bModifier ? (bDiff > bValue) : (bDiff < bValue) )
        thread.setScriptOffset( wBlock );

    // Save debug info and return
    thread.saveDebug(Text::Green, this->getOpcode(), "%u %u %04X", bModifier, bValue, wBlock);
    return true;
}
Ejemplo n.º 20
0
bool Capt_Expand::execute(aithread &thread) const
{

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode());
  return true;
}
Ejemplo n.º 21
0
bool Return::execute(aithread &thread) const
{
  thread.saveDebug(Text::Green, this->getOpcode());
  bool result = thread.ret();
  
  // Error handling, kill the script if the callstack is empty
  if ( !result )
  {
    thread.killThread();
    thread.noretry();
    return false;
  }

  // Success
  return true;
}
Ejemplo n.º 22
0
bool Debug::execute(aithread &thread) const
{
  // Perform independant behaviours
  if ( this->getOpcode() == AISCRIPT::Enum::FATAL_ERROR )
  {
    // Message
    Broodwar->sendText("Illegal AI script executed.");

    // Debug
    thread.saveDebug(Text::Green, this->getOpcode());
    
    // Kill the script
    thread.killThread();
    thread.noretry();
    return false;
  }
  else if ( this->getOpcode() == AISCRIPT::Enum::DEBUG )
  {
    // Read parameters
    WORD wJump;
    thread.readTuple( std::tie( wJump) );

    // Send the message
    Broodwar->sendText("%s", &pbAIScriptBinary[thread.getScriptOffset()] );

    // Jump to offset
    thread.setScriptOffset(wJump);
    thread.saveDebug(Text::Green, this->getOpcode(), "p_%X %s", wJump, &pbAIScriptBinary[thread.getScriptOffset()]);
  }
  return true;
}
Ejemplo n.º 23
0
bool Target_Expansion::execute(aithread &thread) const
{
  // Set campaign flag
  MainController.setFlags(CONTROLLER_TARGET_EXPANSION);

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 24
0
bool Start_Campaign::execute(aithread &thread) const
{
  // Set campaign flag
  MainController.setFlags(CONTROLLER_IS_CAMPAIGN);

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 25
0
bool Prep_Down::execute(aithread &thread) const
{
  // Retrieve parameters
  BYTE bSaveCount, bMinCount;
  WORD wUnitType;
  thread.readTuple( std::tie(bSaveCount, bMinCount, wUnitType) );

  // Get count
  int count = GetStandardUnitCount(wUnitType, false) - bSaveCount;
  if ( count < bMinCount )
    count = bMinCount;
  
  // Add to attack group
  // AI_AttackAdd(count, wUnitType);

  // Save debug info and return
  thread.saveDebug(Text::Red, this->getOpcode(), "%u %u %s", bSaveCount, bMinCount, AISCRIPT::getUnitName(wUnitType));
  return true;
}
Ejemplo n.º 26
0
bool Train::execute(aithread &thread) const
{
  // Parameters
  BYTE bCount;
  WORD wUnitType;
  thread.readTuple( std::tie(bCount, wUnitType) );

  // Debug
  thread.saveDebug(Text::Green, this->getOpcode(), "%u %s", bCount, AISCRIPT::getUnitName(wUnitType) );

  // Perform actions
  if ( GetStandardUnitCount(wUnitType, this->getOpcode() != AISCRIPT::Enum::TRAIN) < bCount )
  {
    MainController.wWaitForType = (int)wUnitType + 1;
    if ( this->getOpcode() != AISCRIPT::Enum::DO_MORPH )
      return thread.retry();
  }
  return thread.noretry();
}
Ejemplo n.º 27
0
bool Farms_Timing::execute(aithread &thread) const
{
  if ( this->getOpcode() == AISCRIPT::Enum::FARMS_NOTIMING )  // off
    MainController.setFlags(CONTROLLER_FARMS_TIMING_OFF);
  else                                                          // on
    MainController.clearFlags(CONTROLLER_FARMS_TIMING_OFF);
  
  // Debug and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 28
0
bool Default_Build::execute(aithread &thread) const
{
  if ( this->getOpcode() == AISCRIPT::Enum::DEFAULTBUILD_OFF )  // off
    MainController.setFlags(CONTROLLER_DEFAULT_BUILD_OFF);
  else                                                          // on
    MainController.clearFlags(CONTROLLER_DEFAULT_BUILD_OFF);
  
  // Debug and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 29
0
bool Check_Transports::execute(aithread &thread) const
{
  if ( this->getOpcode() == AISCRIPT::Enum::TRANSPORTS_OFF )  // off
    MainController.setFlags(CONTROLLER_TRANSPORTS_OFF);
  else                                                          // on
    MainController.clearFlags(CONTROLLER_TRANSPORTS_OFF);
  
  // Debug and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}
Ejemplo n.º 30
0
bool Kill_Thread::execute(aithread &thread) const
{
  for ( auto i = aiThreadList.begin(); i != aiThreadList.end(); ++i )
  {
    if ( i->getFlags() & AI_THREAD_KILLABLE )
      i->killThread();
  }

  // Save debug info and return
  thread.saveDebug(Text::Green, this->getOpcode());
  return true;
}