void AFlareGame::Scrap(FName ShipImmatriculation, FName TargetStationImmatriculation) { DeactivateSector(); UFlareSimulatedSpacecraft* ShipToScrap = World->FindSpacecraft(ShipImmatriculation); UFlareSimulatedSpacecraft* ScrapingStation = World->FindSpacecraft(TargetStationImmatriculation); if(!ShipToScrap || !ScrapingStation) { FLOG("Scrap failed: ship to scrap or station not found"); return; } if(ShipToScrap->GetCurrentSector() != ScrapingStation->GetCurrentSector()) { FLOG("Scrap failed: ship and station not in the same sector"); return; } UFlareSimulatedSector* CurrentSector = ShipToScrap->GetCurrentSector(); int64 ScrapRevenue = 0; for (int ResourceIndex = 0; ResourceIndex < ShipToScrap->GetDescription()->CycleCost.InputResources.Num() ; ResourceIndex++) { FFlareFactoryResource* Resource = &ShipToScrap->GetDescription()->CycleCost.InputResources[ResourceIndex]; ScrapRevenue += Resource->Quantity * CurrentSector->GetResourcePrice(&Resource->Resource->Data, EFlareResourcePriceContext::Default); int ResourceToGive = Resource->Quantity; ResourceToGive -= ScrapingStation->GetCargoBay()->GiveResources(&Resource->Resource->Data, Resource->Quantity); CurrentSector->GiveResources(ScrapingStation->GetCompany(), &Resource->Resource->Data, ResourceToGive, true); } ScrapRevenue = FMath::Min(ScrapRevenue, ScrapingStation->GetCompany()->GetMoney()); FLOGV("Scrap success for %d", ScrapRevenue); if (ScrapingStation->GetCompany() != ShipToScrap->GetCompany()) { ScrapingStation->GetCompany()->TakeMoney(ScrapRevenue); ShipToScrap->GetCompany()->GiveMoney(ScrapRevenue); GetPC()->Notify(LOCTEXT("ShipSellScrap", "Ship scrap complete"), FText::Format(LOCTEXT("ShipSellScrapFormat", "Your ship {0} has been scrapped for {1} credits!"), FText::FromString(ShipToScrap->GetImmatriculation().ToString()), FText::AsNumber(UFlareGameTools::DisplayMoney(ScrapRevenue))), FName("ship-own-scraped"), EFlareNotification::NT_Economy); } else { GetPC()->Notify(LOCTEXT("ShipOwnScrap", "Ship scrap complete"), FText::Format(LOCTEXT("ShipOwnScrapFormat", "Your ship {0} has been scrapped !"), FText::FromString(ShipToScrap->GetImmatriculation().ToString())), FName("ship-own-scraped"), EFlareNotification::NT_Economy); } ShipToScrap->GetCompany()->DestroySpacecraft(ShipToScrap); }
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; } } } }
void AFlareGame::ActivateSector(UFlareSimulatedSector* Sector) { if (!Sector) { // No sector to activate return; } // Load the sector level - Will call OnLevelLoaded() LoadStreamingLevel(Sector->GetDescription()->LevelName); // Check if we should really activate FLOGV("AFlareGame::ActivateSector : %s", *Sector->GetSectorName().ToString()); if (ActiveSector) { FLOG("AFlareGame::ActivateSector : There is already an active sector"); if (ActiveSector->GetSimulatedSector()->GetIdentifier() == Sector->GetIdentifier()) { // Sector to activate is already active return; } // Deactivate the sector DeactivateSector(); } // Ships FLOGV("AFlareGame::ActivateSector : Ship count = %d", Sector->GetSectorShips().Num()); bool PlayerHasShip = false; for (int ShipIndex = 0; ShipIndex < Sector->GetSectorShips().Num(); ShipIndex++) { UFlareSimulatedSpacecraft* Ship = Sector->GetSectorShips()[ShipIndex]; FLOGV("AFlareGame::ActivateSector : Found ship %s", *Ship->GetImmatriculation().ToString()); if (Ship->GetCompany()->GetPlayerHostility() == EFlareHostility::Owned) { PlayerHasShip = true; break; } } // Planetarium & sector setup FLOGV("AFlareGame::ActivateSector : PlayerHasShip = %d", PlayerHasShip); if (PlayerHasShip) { // Create the new sector ActiveSector = NewObject<UFlareSector>(this, UFlareSector::StaticClass()); FFlareSectorSave* SectorData = Sector->Save(); if ((SectorData->LocalTime / UFlareGameTools::SECONDS_IN_DAY) < GetGameWorld()->GetDate()) { // TODO Find time with light SectorData->LocalTime = GetGameWorld()->GetDate() * UFlareGameTools::SECONDS_IN_DAY; } // Load and setup the sector Planetarium->ResetTime(); Planetarium->SkipNight(UFlareGameTools::SECONDS_IN_DAY); ActiveSector->Load(Sector); DebrisFieldSystem->Setup(this, Sector); GetPC()->OnSectorActivated(ActiveSector); } GetQuestManager()->OnSectorActivation(Sector); }