Beispiel #1
0
        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);
            }
        }