void SectorHelper::GetAvailableFleetSupplyCount(UFlareSimulatedSector* Sector, UFlareCompany* Company, int32& OwnedFS, int32& AvailableFS, int32& AffordableFS) { OwnedFS = 0; int32 NotOwnedFS = 0; FFlareResourceDescription* FleetSupply = Sector->GetGame()->GetScenarioTools()->FleetSupply; for (int32 SpacecraftIndex = 0; SpacecraftIndex < Sector->GetSectorSpacecrafts().Num(); SpacecraftIndex++) { UFlareSimulatedSpacecraft* Spacecraft = Sector->GetSectorSpacecrafts()[SpacecraftIndex]; if (Spacecraft->IsHostile(Company)) { // At war, no trade possible continue; } int32 AvailableQuantity = Spacecraft->GetActiveCargoBay()->GetResourceQuantity(FleetSupply, Company); if (Company == Spacecraft->GetCompany()) { OwnedFS += AvailableQuantity; } else { NotOwnedFS += AvailableQuantity; } } AvailableFS = OwnedFS + NotOwnedFS; int32 ResourcePrice = Sector->GetResourcePrice(FleetSupply, EFlareResourcePriceContext::MaintenanceConsumption); int32 MaxAffordableQuantity = FMath::Max(0, int32(Company->GetMoney() / ResourcePrice)); AffordableFS = OwnedFS + FMath::Min(MaxAffordableQuantity, NotOwnedFS); }
void SectorHelper::ConsumeFleetSupply(UFlareSimulatedSector* Sector, UFlareCompany* Company, int32 ConsumedFS, bool ForRepair) { // First check for owned FS Sector->OnFleetSupplyConsumed(ConsumedFS); FFlareResourceDescription* FleetSupply = Sector->GetGame()->GetScenarioTools()->FleetSupply; for (int32 SpacecraftIndex = 0; SpacecraftIndex < Sector->GetSectorSpacecrafts().Num(); SpacecraftIndex++) { UFlareSimulatedSpacecraft* Spacecraft = Sector->GetSectorSpacecrafts()[SpacecraftIndex]; if (Company != Spacecraft->GetCompany()) { continue; } int TakenQuantity = Spacecraft->GetActiveCargoBay()->TakeResources(FleetSupply, ConsumedFS, Company); ConsumedFS -= TakenQuantity; if(ConsumedFS == 0) { return; } } for (int32 SpacecraftIndex = 0; SpacecraftIndex < Sector->GetSectorSpacecrafts().Num(); SpacecraftIndex++) { UFlareSimulatedSpacecraft* Spacecraft = Sector->GetSectorSpacecrafts()[SpacecraftIndex]; if (Company == Spacecraft->GetCompany()) { continue; } if (Spacecraft->IsHostile(Company)) { // At war, no trade possible continue; } int TakenQuantity = Spacecraft->GetActiveCargoBay()->TakeResources(FleetSupply, ConsumedFS, Company); if(TakenQuantity > 0) { int32 ResourcePrice = Sector->GetResourcePrice(FleetSupply, EFlareResourcePriceContext::MaintenanceConsumption); int64 Cost = TakenQuantity * ResourcePrice; Company->TakeMoney(Cost, true, FFlareTransactionLogEntry::LogPayMaintenance(Spacecraft, TakenQuantity, ForRepair)); Spacecraft->GetCompany()->GiveMoney(Cost, FFlareTransactionLogEntry::LogPaidForMaintenance(Spacecraft, Company, TakenQuantity, ForRepair)); if(Spacecraft->GetCurrentFleet() && Spacecraft->GetCurrentFleet()->IsAutoTrading()) { Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsUnloadResources += TakenQuantity; Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsMoneySell += Cost; #if DEBUG_AI_TRADING_STATS FLOGV("Auto trading %s sell %d %s to %s for %lld", *Spacecraft->GetImmatriculation().ToString(), TakenQuantity, *FleetSupply->Name.ToString(), *Company->GetCompanyName().ToString(), Cost); FLOGV("AutoTradeStatsDays=%d LoadResources=%d UnloadResources=%d MoneyBuy=%lld MoneySell=%lld", Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsDays, Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsLoadResources, Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsUnloadResources, Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsMoneyBuy, Spacecraft->GetCurrentFleet()->GetData()->AutoTradeStatsMoneySell); #endif } ConsumedFS -= TakenQuantity; if(ConsumedFS == 0) { return; } } } }