sources » BuildingClass » Infiltrated
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;
}