sources » TechnoClass » SelectWeapon
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;
}