public async Task <PurchaseResult> TrySellToPort(IShip sellingShip, Port purchasingPort, Dictionary <PortWareIdentifier, float> typesAndQuantities, HashSet <int> statefulCargoIDs) { if (purchasingPort.ShipIDs.Contains(sellingShip.Id))//Make sure the IShip is actually docked { return(PurchaseResult.WrongArea); } if (typesAndQuantities == null && statefulCargoIDs == null) { return(PurchaseResult.NoItemsSpecified); } float totalPrice = 0; List <CargoTransaction> allTransactions = new List <CargoTransaction>(); PurchaseResult result; if (statefulCargoIDs != null) { result = GenerateSaleTransactionSequence(sellingShip, purchasingPort, statefulCargoIDs, ref allTransactions, ref totalPrice); if (result != PurchaseResult.Success) { return(result); } } if (typesAndQuantities != null) { StatelessCargoTypes statelessType; var statelessCargoToPurchase = typesAndQuantities.Where(c => { return(PortHelper.GetCargoType(c.Key, out statelessType)); }) .ToDictionary( c => { PortHelper.GetCargoType(c.Key, out statelessType); return(statelessType); }, c => c.Value);//Map typesAndQuantities to Dictionary<StatelssCargoTypes, float> if (statelessCargoToPurchase.Count > 0) { result = GenerateSaleTransactionSequence(sellingShip, purchasingPort, statelessCargoToPurchase, ref allTransactions, ref totalPrice); if (result != PurchaseResult.Success) { return(result); } } StatefulCargoTypes statefulType; var statefulCargoToPurchase = typesAndQuantities.Where(c => { return(PortHelper.GetCargoType(c.Key, out statefulType)); }) .ToDictionary( c => { PortHelper.GetCargoType(c.Key, out statefulType); return(statefulType); }, c => (int)c.Value);//Map typesAndQuantities to Dictionary<StatefulCargoTypes, float> if (statefulCargoToPurchase.Count > 0) { result = GenerateSaleTransactionSequence(sellingShip, purchasingPort, statefulCargoToPurchase, ref allTransactions, ref totalPrice); if (result != PurchaseResult.Success) { return(result); } } } var sequence = new CargoTransactionSequence(); allTransactions.ForEach(ct => { sequence.Add(ct); }); sequence.Add(new TransactionAddStatelessCargo(sellingShip, StatelessCargoTypes.Cash, totalPrice, true)); _cargoSynchronizer.RequestAtomicTransactionSequence(sequence); await sequence.ResultTask; if (sequence.ResultTask.Result == CargoResult.Success) { var record = new PortShipTradeRecordModel(DateTime.Now, (int)_slaveIDProvider.SlaveID) { Id = _tradeIDManager.PopFreeID(), Port = purchasingPort, Ship = sellingShip, AllCargoTransactions = sequence.Transactions.Select(tr => (object)tr).ToList(), CashPaid = totalPrice, TransactionDirection = PortTradeDirection.ShipSaleToPort, }; _databaseManager.SaveAsync(record); _databaseManager.SaveAsync(sellingShip); _databaseManager.SaveAsync(purchasingPort); return(PurchaseResult.Success); } else { return(PurchaseResult.FailureReasonUnknown); } }