private static void OnSellItems(int num)
        {
            var selected = ShopHelper.selectedController;

            Control.LogDebug(DInfo.ShopActions, $"-- OnSellItems {num}x{selected.GetName()}");
            var shop_def = selected.shopDefItem;

            if (selected.quantity < num)
            {
                num = selected.quantity;
            }
            if (num <= 0)
            {
                Control.LogDebug(DInfo.ShopActions, $"--- num<=0 return");
                return;
            }
            int sold = SellItem(shop_def, num);

            if (sold > 0)
            {
                Control.LogDebug(DInfo.ShopActions, $"--- sold, process messages");
                SimGamePurchaseMessage message = new SimGamePurchaseMessage(shop_def, shop_def.SellCost, SimGamePurchaseMessage.TransactionType.Sell);
                Control.State.Sim.MessageCenter.PublishMessage(message);
                selected.ModifyQuantity(-num);
                if (selected.quantity <= 0)
                {
                    ShopHelper.inventoryWidget.RemoveDataItem(selected);
                    selected.Pool();
                    ShopHelper.selectedController = null;
                }
                ShopHelper.inventoryWidget.RefreshInventoryList();
                ShopScreen.UpdateMoneySpot();
                ShopHelper.triggerIronManAutoSave = true;

                foreach (var s in Control.SaleShops)
                {
                    if (s is IShopDescriptor sd && sd.CanUse)
                    {
                        if (s.OnSellItem(shop_def, sold))
                        {
                            break;
                        }
                    }
                }
            }
            else
            {
                Control.LogDebug(DInfo.ShopActions, $"--- not sold");
            }
        }
Exemple #2
0
        // Clone of SoldMultipleItems
        public void BuyMultipleItems(int quantityBought)
        {
            Mod.Log.Debug("BH:BMI entered.");

            //bool isNotStoreOrSalvage = shopIDO.GetItemType() != MechLabDraggableItemType.StorePart &&
            //    shopIDO.GetItemType() != MechLabDraggableItemType.SalvagePart;
            //if (simGameState.InMechLabStore() || !isNotStoreOrSalvage) {
            //    Mod.Logger.Info($"BH:BMI - in the mech lab store, or the part isn't a store part or salvage (is {shopIDO.GetItemType()}). Aborting!");
            //    return;
            //}

            ShopDefItem toBuySDI = shopIDO.shopDefItem;

            // Look for the item in the store inventory
            Shop itemShop = shopIDO.GetShop();
            List <ShopDefItem> activeInventory = itemShop.ActiveInventory;

            Shop.PurchaseType storePT  = toBuySDI.IsInfinite ? Shop.PurchaseType.Normal : Shop.PurchaseType.Special;
            ShopDefItem       storeSDI = activeInventory.Find((ShopDefItem cachedItem) => cachedItem.ID == toBuySDI.ID && cachedItem.Type == shopIDO.shopDefItem.Type);

            if (storeSDI == null)
            {
                Mod.Log.Info("BH:BMI - item not found in store inventory. Aborting!");
                return;
            }

            // Check the price
            int itemPrice = itemShop.GetPrice(storeSDI, storePT, itemShop.ThisShopType);

            Mod.Log.Info($"BH:BMI - itemPrice:{itemPrice} for purchaseType:{storePT}");
            int purchasePrice = itemPrice * quantityBought;

            if (purchasePrice > simGameState.Funds)
            {
                Mod.Log.Info($"BH:BMI - purchasePrice:{purchasePrice} (itemPrice:{itemPrice} x quantity:{quantityBought}) > funds: {simGameState.Funds}. Aborting!");
                return;
            }

            // Check the quantity available
            if (storePT != Shop.PurchaseType.Normal)
            {
                if (storeSDI.Count < quantityBought)
                {
                    Mod.Log.Info($"BH:BMI - store has quantity {storeSDI.Count} in inventory, but {quantityBought} was requested. Aborting!");
                    return;
                }

                storeSDI.Count -= quantityBought;
                if (storeSDI.Count < 1)
                {
                    Mod.Log.Debug($"BH:BMI - Store count below 1, removing!");
                    activeInventory.Remove(storeSDI);
                }
                Mod.Log.Debug($"BH:BMI - Reduced store count by {quantityBought} to {storeSDI.Count}!");
            }

            for (int i = 0; i < quantityBought; i++)
            {
                // Decrement the price
                simGameState.AddFunds(-itemPrice, null, true, true);
                simGameState.AddFromShopDefItem(storeSDI, false, itemPrice, SimGamePurchaseMessage.TransactionType.Purchase);
                Mod.Log.Debug($"BH:BMI - Reducing funds by -{itemPrice} and adding 1 of {storeSDI.ID}");

                if (!toBuySDI.IsInfinite)
                {
                    if (shopIDO.quantity > 1)
                    {
                        shopIDO.ModifyQuantity(-1);
                        Mod.Log.Debug($"BH:BMI - reducing shop inventory by 1 to {shopIDO.quantity}");
                    }
                    else
                    {
                        Mod.Log.Debug($"BH:BMI - shop inventory below 1, removing!");
                        inventoryWidget.RemoveDataItem(shopIDO);
                        if (shopIDO != null)
                        {
                            shopIDO.Pool();
                        }
                        shopIDO = null;
                    }
                }
            }

            inventoryWidget.RefreshInventoryList();

            Mod.Log.Debug("BH:BMI - Updating all money spots");
            shopScreen.UpdateMoneySpot();
            shopScreen.RefreshAllMoneyListings();

            if (toBuySDI.Type == ShopItemType.MechPart)
            {
                shopScreen.OnItemSelected(inventoryWidget.GetSelectedViewItem());
            }

            Mod.Log.Debug("BH:BMI - triggering iron man save");
            Traverse ironManT = Traverse.Create(shopScreen).Field("triggerIronManAutoSave");

            ironManT.SetValue(true);
        }