int TechnoClass::SelectWeapon(TechnoClass *target) {
  if ( this->GetType()->HasTurretCount() && !this->GetType()->IsGattling ) {
    if( this->CurrentTurretNumber == -1 )
      return 0;
    return this->CurrentTurretNumber;
  }

  weap1 = this->GetWeapon(WEAPON_PRIMARY);
  weap2 = this->GetWeapon(WEAPON_SECONDARY);
  if ( !target
    || !weap2 // is secondary a broken weapon?
    || !weap1 // is primary a broken weapon?
    || weap2->NeverUse )
    return USE_PRIMARY; //yes, you read that right, if primary is broken, let's use primary anyway

  if ( this->OpenTopped && this->GetType()->OpenTransportWeapon != -1 )
    return this->GetType()->OpenTransportWeapon;

  if ( !this->GetType()->IsGattling ) {
    if ( weap2->Warhead->Airstrike ) {
      if ( target->What_Am_I() == IS_BUILDING && target->BuildingType->CanC4 ) {
        if ( target->GetType()->ResourceDestination ) {
          if ( !target->GetType()->ResourceGatherer )
            return USE_SECONDARY;
          return USE_PRIMARY;
        }
        return USE_SECONDARY;
      }
    }
    else
    {
      if ( weap1->Warhead->IsLocomotor
           && target
           && target->What_Am_I() == IS_BUILDING )
        return USE_SECONDARY;

      if ( weap2->DrainWeapon && target && target->GetType()->Drainable && !this->IsDrainedFrom
        && !this->OwningHouse->IsAlliedToObject(target) )
        return USE_SECONDARY;

      if ( weap2->AreaFire && this->GetCurrentMission() == DEPLOY )
        return USE_SECONDARY;

      if ( this->What_Am_I() == IS_BUILDING && this->IsOverpowered )
        return USE_SECONDARY;

      if ( target->What_Am_I() == IS_BUILDING
        && this->OwningHousethis->OwningHouse->CanOverpowerTechno(target)
        && weap2->Warhead->ElectricAssault
        && target->Overpowerable )
        return USE_SECONDARY;

      if ( this->What_Am_I() == IS_AIRCRAFT && this->BeingProduced )
        return USE_SECONDARY;

      if ( target->What_Am_I() == IS_CELL ) {
        if ( target->LandType != WATER && target->OnFloor(target)
          || target->cellFlags & Is_Land && this->GetType()->Naval) )
        {
          if ( !target->InAir() && this->GetType()->LandTargeting == LAND_SECONDARY ) // see ModEnc: LandTargeting
            return USE_SECONDARY;
        }
      }

      if ( target ) {
        if(weap2->Warhead->Verses[target->GetType()->Armor] != 0.0) {
          if(weap1->Warhead->Verses[target->GetType()->Armor] == 0.0)
            return USE_SECONDARY;

          IsWater = target->GetCell()->LandType == WATER || target->GetCell()->LandType == BEACH;
          if ( target->InAir() )
            IsWater = 0;
          if ( !target->someFlag && IsWater ) {
            result = this->SelectNavalTargeting(target);
            if ( result != -1 )
              return result;
            return USE_PRIMARY;
          }

          if ( !target->InAir() && this->GetType()->LandTargeting == LAND_SECONDARY )
            return USE_SECONDARY;

          if ( weap2->Projectile->AA && target->InAir() )
            return USE_SECONDARY;
        }
      }
    }
    return USE_PRIMARY;
  }

  Stage = this->CurrentWeaponStage;
  if ( weap2->Projectile->AA && target && target->InAir() )
    return 2 * Stage + 1;
  else 
    return 2 * Stage;
}