void SectorHelper::RefillFleets(UFlareSimulatedSector* Sector, UFlareCompany* Company) { SCOPE_CYCLE_COUNTER(STAT_FlareSectorHelper_RefillFleets); int32 CurrentNeededFleetSupply; int32 TotalNeededFleetSupply; int32 OwnedFS; int32 AvailableFS; int32 AffordableFS; int64 MaxDuration; GetRefillFleetSupplyNeeds(Sector, Company, CurrentNeededFleetSupply, TotalNeededFleetSupply, MaxDuration, true); GetAvailableFleetSupplyCount(Sector, Company, OwnedFS, AvailableFS, AffordableFS); // Note not available fleet supply as consumed Sector->OnFleetSupplyConsumed(FMath::Max(0, TotalNeededFleetSupply - AvailableFS)); if(Sector->IsInDangerousBattle(Company) || AffordableFS == 0 || TotalNeededFleetSupply == 0) { // No refill possible return; } float MaxRefillRatio = FMath::Min(1.f,(float) AffordableFS / (float) TotalNeededFleetSupply); float RemainingFS = (float) AffordableFS; UFlareSpacecraftComponentsCatalog* Catalog = Company->GetGame()->GetShipPartsCatalog(); for (int32 SpacecraftIndex = 0; SpacecraftIndex < Sector->GetSectorSpacecrafts().Num(); SpacecraftIndex++) { UFlareSimulatedSpacecraft* Spacecraft = Sector->GetSectorSpacecrafts()[SpacecraftIndex]; if (Company != Spacecraft->GetCompany() || !Spacecraft->GetDamageSystem()->IsAlive()) { continue; } float SpacecraftPreciseTotalNeededFleetSupply = 0; // List components for (int32 ComponentIndex = 0; ComponentIndex < Spacecraft->GetData().Components.Num(); ComponentIndex++) { FFlareSpacecraftComponentSave* ComponentData = &Spacecraft->GetData().Components[ComponentIndex]; FFlareSpacecraftComponentDescription* ComponentDescription = Catalog->Get(ComponentData->ComponentIdentifier); if(ComponentDescription->Type == EFlarePartType::Weapon) { int32 MaxAmmo = ComponentDescription->WeaponCharacteristics.AmmoCapacity; int32 CurrentAmmo = MaxAmmo - ComponentData->Weapon.FiredAmmo; float FillRatio = (float) CurrentAmmo / (float) MaxAmmo; float TotalRefillRatio = 1.f - FillRatio; SpacecraftPreciseTotalNeededFleetSupply += TotalRefillRatio * UFlareSimulatedSpacecraftDamageSystem::GetRefillCost(ComponentDescription); } } float SpacecraftNeededWithoutStock = SpacecraftPreciseTotalNeededFleetSupply - Spacecraft->GetRefillStock(); float SpacecraftNeededWithoutStockScaled = FMath::Max(0.f, SpacecraftNeededWithoutStock * MaxRefillRatio); float ConsumedFS = FMath::Min(RemainingFS, SpacecraftNeededWithoutStockScaled); Spacecraft->OrderRefillStock(ConsumedFS); RemainingFS -= ConsumedFS; if(RemainingFS <= 0) { break; } } int32 ConsumedFS = FMath::CeilToInt((float) AffordableFS - RemainingFS); ConsumeFleetSupply(Sector, Company, ConsumedFS, false); if(ConsumedFS > 0 && Company == Sector->GetGame()->GetPC()->GetCompany()) { Sector->GetGame()->GetQuestManager()->OnEvent(FFlareBundle().PutTag("refill-start")); } }
void SectorHelper::RepairFleets(UFlareSimulatedSector* Sector, UFlareCompany* Company) { SCOPE_CYCLE_COUNTER(STAT_FlareSectorHelper_RepairFleets); int32 CurrentNeededFleetSupply; int32 TotalNeededFleetSupply; int32 OwnedFS; int32 AvailableFS; int32 AffordableFS; int64 MaxDuration; GetRepairFleetSupplyNeeds(Sector, Company, CurrentNeededFleetSupply, TotalNeededFleetSupply, MaxDuration, true); GetAvailableFleetSupplyCount(Sector, Company, OwnedFS, AvailableFS, AffordableFS); // Note not available fleet supply as consumed Sector->OnFleetSupplyConsumed(FMath::Max(0, TotalNeededFleetSupply - AvailableFS)); if(Sector->IsInDangerousBattle(Company) || AffordableFS == 0 || TotalNeededFleetSupply == 0) { // No repair possible //FLOGV("No repair possible for %s in %s", *Company->GetCompanyName().ToString(), *Sector->GetSectorName().ToString()) return; } float RepairRatio = FMath::Min(1.f,(float) AffordableFS / (float) TotalNeededFleetSupply); float RemainingFS = (float) AffordableFS; UFlareSpacecraftComponentsCatalog* Catalog = Company->GetGame()->GetShipPartsCatalog(); for (int32 SpacecraftIndex = 0; SpacecraftIndex < Sector->GetSectorSpacecrafts().Num(); SpacecraftIndex++) { UFlareSimulatedSpacecraft* Spacecraft = Sector->GetSectorSpacecrafts()[SpacecraftIndex]; if (Company != Spacecraft->GetCompany() || !Spacecraft->GetDamageSystem()->IsAlive()) { continue; } float SpacecraftPreciseTotalNeededFleetSupply = 0; // List components for (int32 ComponentIndex = 0; ComponentIndex < Spacecraft->GetData().Components.Num(); ComponentIndex++) { FFlareSpacecraftComponentSave* ComponentData = &Spacecraft->GetData().Components[ComponentIndex]; FFlareSpacecraftComponentDescription* ComponentDescription = Catalog->Get(ComponentData->ComponentIdentifier); float DamageRatio = Spacecraft->GetDamageSystem()->GetDamageRatio(ComponentDescription, ComponentData); float TotalRepairRatio = 1.f - DamageRatio; SpacecraftPreciseTotalNeededFleetSupply += TotalRepairRatio * UFlareSimulatedSpacecraftDamageSystem::GetRepairCost(ComponentDescription); } float SpacecraftNeededWithoutStock = SpacecraftPreciseTotalNeededFleetSupply - Spacecraft->GetRepairStock(); float SpacecraftNeededWithoutStockScaled = FMath::Max(0.f, SpacecraftNeededWithoutStock * RepairRatio); float ConsumedFS = FMath::Min(RemainingFS, SpacecraftNeededWithoutStockScaled); Spacecraft->OrderRepairStock(ConsumedFS); RemainingFS -= ConsumedFS; if(RemainingFS <= 0) { break; } } int32 ConsumedFS = FMath::CeilToInt((float) AffordableFS - RemainingFS); ConsumeFleetSupply(Sector, Company, ConsumedFS, true); if(ConsumedFS > 0 && Company == Sector->GetGame()->GetPC()->GetCompany()) { Sector->GetGame()->GetQuestManager()->OnEvent(FFlareBundle().PutTag("repair-start")); } }