void BuildingClass::Infiltrated(HouseClass *SenderHouse) {
  HouseClass *OwnerHouse = this->OwningPlayer;
  if ( OwnerHouse == SenderHouse ) {
    return;
  }

  bool RadarEventRaised = 0;
  if ( OwnerHouse->IsPlayer() || SenderHouse->IsPlayer() ) {
    wXY *coords = this->GetCellCoords();
    if ( RadarEventClass::Add(9, *coords) ) {
      RadarEventRaised = 1;
    }
  }
  BuildingTypeClass *Type = this->BuildingType;
  if ( Type->Radar ) {
    this->OwningPlayer->CreateRadarOutage();
    if ( this->OwningPlayer->IsPlayer() ) {
      if ( !this->OwningPlayer->HasSpySat ) {
        if ( RadarEventRaised ) {
          VoxClass::PlayFromName("EVA_RadarSabotaged", -1, -1);
        }
      }
    }
    if ( SenderHouse->IsPlayer() && !this->OwningPlayer->HasSpySat && RadarEventRaised ) {
      VoxClass::PlayFromName("EVA_BuildingInfRadarSabotaged", -1, -1);
    }
    this->SetLayer(LAYER_GROUND);
    return;
  }

  if ( Type->GeneratesPower > 0 ) {
    this->OwningPlayer->CreatePowerOutage(Rules->SpyPowerBlackout);
    if ( OwningPlayer->IsPlayer() && RadarEventRaised ) {
      VoxClass::PlayFromName("EVA_PowerSabotaged", -1, -1);
    }
    else {
      if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
      VoxClass::PlayFromName("EVA_EnemyBasePoweredDown", -1, -1);
    }
    this->SetLayer(LAYER_GROUND);
    return;
  }

  int lenTech = Rules->BuildTech.length;
  idxTech = 0;
  bool skip = 0, done = 0;
  if ( lenTech > 0 ) {
    done = 1;
    BuildingTypeClass *TechType;
    do {
      TechType = Rules->BuildTech[idxTech];
      ++idxTech;
      if ( idxTech >= lenTech ) {
        skip = 1;
        done = 0;
      }
    } while ( ( TechType != Type ) || done );
    if( !skip ) {
      int AIBPSide = Type->AIBasePlanningSide;
      if ( !AIBPSide ) {
        SenderHouse->Tech0Infiltrated = 1;
      }
      else {
        if ( AIBPSide == 1 ) {
          SenderHouse->Tech1Infiltrated = 1;
        } else {
          SenderHouse->Tech2Infiltrated = 1;
        }
      }
      SenderHouse->RecheckTechLevels = 1;
      if ( this->OwningPlayer->IsPlayer() && RadarEventRaised ) {
        VoxClass::PlayFromName("EVA_TechnologyStolen", -1, -1);
        if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
          this->SetLayer(LAYER_GROUND);
          return;
        }
        VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
        VoxClass::PlayFromName("EVA_NewTechnologyAcquired", -1, -1);
        this->SetLayer(LAYER_GROUND);
        return;
      }
    }
  }
  if( !done ) {
    int idxSuper = Type->SuperWeapon; // this is actually an index to house's active superweapon array
    if ( idxSuper != -1 ) {
      this->OwningPlayer->SuperWeapons[idxSuper]->Reset(); // SuperWeapon2 is immune ?
      if ( !this->OwningPlayer->IsPlayer() && (!SenderHouse->IsPlayer() || !RadarEventRaised) ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
      this->SetLayer(LAYER_GROUND);
      return;
    }
    if ( Type->Storage > 0 ) {
      int gotMoney = this->OwningPlayer->GetAvailableMoney();
      float stolenMoney = gotMoney * Rules->SpyMoneyStealPercent;
      int endMoney = FloatToInt(stolenMoney);
      this->OwningPlayer->TakeMoney(endMoney);
      SenderHouse->GiveMoney(endMoney);
      if ( this->OwningPlayer->IsPlayer() ) {
        if ( RadarEventRaised ) {
          VoxClass::PlayFromName("EVA_CashStolen", -1, -1);
        }
      }
      if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      VoxClass::PlayFromName("EVA_BuildingInfCashStolen", -1, -1);
      this->SetLayer(LAYER_GROUND);
      return;
    }
    eAbstractID Fact = Type->Factory;
    if ( Fact != UnitType ) {
      if ( Fact != InfantryType ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      SenderHouse->BarracksInfiltrated = 1;
      SenderHouse->RecheckTechLevels = 1;
      if ( SenderHouse->IsPlayer() ) {
        Map.PlayerInfiltrated = 1;
      }
      if ( this->OwningPlayer->IsPlayer() ) {
        if ( RadarEventRaised ) {
          VoxClass::PlayFromName("EVA_TechnologyStolen", -1, -1);
        }
      }
      if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
      VoxClass::PlayFromName("EVA_NewTechnologyAcquired", -1, -1);
      this->SetLayer(LAYER_GROUND);
      return;
    }
    SenderHouse->WarFacInfiltrated = 1;
    SenderHouse->RecheckTechLevels = 1;
    if ( SenderHouse->IsPlayer() ) {
      Map.PlayerInfiltrated = 1;
    }
    if ( this->OwningPlayer->IsPlayer() && RadarEventRaised ) {
      VoxClass::PlayFromName("EVA_TechnologyStolen", -1, -1);
      if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
        this->SetLayer(LAYER_GROUND);
        return;
      }
      VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
      VoxClass::PlayFromName("EVA_NewTechnologyAcquired", -1, -1);
      this->SetLayer(LAYER_GROUND);
      return;
    }
  }
  if ( !SenderHouse->IsPlayer() || !RadarEventRaised ) {
    this->SetLayer(LAYER_GROUND);
    return;
  }
  VoxClass::PlayFromName("EVA_BuildingInfiltrated", -1, -1);
  VoxClass::PlayFromName("EVA_NewTechnologyAcquired", -1, -1);
  this->SetLayer(LAYER_GROUND);
  return;
}