Exemple #1
0
    public void Main()
    {
        var ta = new TradeAdvisor();
        var at = new AccountingTracker();

        var factors = ta.GetCurrentMarketChangeFactors();

        foreach (var factor in factors)
        {
            ta.ExecuteTrade(factor);
            at.LogTrade(factor);
        }
    }
        public static bool BuyResource(TradeAdvisor trader, PlayerMobile seller, CraftResource r, int amount)
        {
            if (!CanDoBusiness(trader.Government, seller))
            {
                trader.Say("I cannot do business with you.");
                return false;
            }

            int itemCount = 0;
            foreach (Item i in seller.Backpack.Items)
            {
                if (i.GetType() == GetResourceObject(r))
                    itemCount += i.Amount;
            }

            if (itemCount <= 0)
            {
                trader.Say("You do not have any " + GetString(r));
                return false;
            }
            else if (itemCount < amount)
                amount = itemCount;

            if (amount < GetDivisor(r))
            {
                trader.Say("You must have " + GetDivisor(r).ToString() + " " + GetString(r) + " to make a sale; you only have " + amount.ToString() + " " + GetString(r) + ".");
                return false;
            }
            else if (amount / GetDivisor(r) < 1)
            {
                trader.Say(amount.ToString() + " " + GetString(r) + " is not enough to make a sale.");
                return false;
            }
            else if (r != CraftResource.Gold && amount % GetDivisor(r) > 0)
            {
                trader.Say(GetString(r) + " is handled in units of " + GetDivisor(r).ToString() + ".");
                return false;
            }
            else if ((trader.Government.GetTreasuryBalance() - ((amount / GetDivisor(r)) * GetBuyPrice(r, trader.Government))) < trader.Government.TradeInformation.BudgetMinimum)
            {
                trader.Say("I've been ordered to buy for no more than " + trader.Government.TradeInformation.BudgetMinimum.ToString() + " copper.");
                return false;
            }
            else if ((amount / GetDivisor(r)) * GetBuyPrice(r, trader.Government) > trader.Government.GetTreasuryBalance())
            {
                trader.Say("We've not enough in our treasury to make that purchase.");
                return false;
            }

            switch (Utility.Random(3))
            {
                case 0: seller.PlaySound(0x2E4); break;
                case 1: seller.PlaySound(0x2E5); break;
                case 2: seller.PlaySound(0x2E6); break;
            }

            seller.Backpack.ConsumeTotal(GetResourceObject(r), amount);
            trader.Government.Resources[GetType(r)] += (int)(amount / GetDivisor(r));

            int giveCopper = (int)((amount / GetDivisor(r)) * GetBuyPrice(r, trader.Government));
            if (giveCopper > 60000)
            {
                while (giveCopper > 60000)
                {
                    seller.Backpack.AddItem(new Copper(trader.Government.WithdrawFromTreasury(giveCopper / 2)));
                    giveCopper -= (giveCopper / 2);
                }

                if (giveCopper > 0)
                    seller.Backpack.AddItem(new Copper(trader.Government.WithdrawFromTreasury(giveCopper)));
            }
            else
                seller.Backpack.AddItem(new Copper(trader.Government.WithdrawFromTreasury(giveCopper)));

            return true;
        }
        public static bool SellResource(TradeAdvisor trader, PlayerMobile buyer, CraftResource r, int amount)
        {
            if(trader.Government == null || trader.Government.Deleted)
                return false;

            if (trader.Government.TradeInformation == null)
                return false;

            if (!CanDoBusiness(trader.Government, buyer))
            {
                trader.Say("I cannot do business with you.");
                return false;
            }

            #region Amount Checking
            if (trader.Government.Resources[GetType(r)] < 1)
            {
                trader.Say("I have no " + GetType(r).ToString() + " in stock.");
                return false;
            }
            else if (amount / GetDivisor(r) > trader.Government.Resources[GetType(r)])
            {
                trader.Say("I only have " + trader.Government.Resources[GetType(r)] + " units of " + GetType(r).ToString() + " in stock.");
                return false;
            }
            else if (amount < GetDivisor(r))
            {
                trader.Say("You must purchase at least " + GetDivisor(r).ToString() + " " + GetString(r) + ".");
                return false;
            }
            else if (r != CraftResource.Gold && amount % GetDivisor(r) > 0)
            {
                trader.Say(r.ToString() + " is handled in units of " + GetDivisor(r).ToString() + ".");
                return false;
            }
            #endregion

            if (CustomGuildStone.IsGuildEconomic(buyer, trader.Government))
            {
                Item res = (Item)Activator.CreateInstance(GetResourceObject(r), amount);
                buyer.AddToBackpack(res);
                trader.Say("Of course you may freely access " + trader.Government.Name + "'s resources.");
                trader.Government.Resources[GetType(r)] -= (int)(amount / GetDivisor(r));
                return true;
            }
            else
            {
                if (trader.Government.Resources[GetType(r)] - (amount / GetDivisor(r)) < GetMinimum(r, trader.Government))
                {
                    trader.Say("I have been ordered not to go below " + GetMinimum(r, trader.Government).ToString() + " units of " + GetType(r).ToString() + " in my stock.");
                    return false;

                }
                else if (buyer.Backpack.GetAmount(typeof(Copper)) < ((amount / GetDivisor(r)) * GetSellPrice(r, trader.Government)))
                {
                    trader.Say("You don't have enough coin to buy " + (amount / GetDivisor(r)) + " units of " + GetType(r).ToString() + ".");
                    return false;
                }
                else if (buyer.Backpack.ConsumeTotal(typeof(Copper), ((int)(amount / GetDivisor(r)) * GetSellPrice(r, trader.Government))))
                {
                    #region Successful Sale of Resources to a Player
                    switch (Utility.Random(3))
                    {
                        case 0: buyer.PlaySound(0x2E5); break;
                        case 1: buyer.PlaySound(0x2E6); break;
                        case 2: buyer.PlaySound(0x2E7); break;
                    }

                    Item res = (Item)Activator.CreateInstance(GetResourceObject(r), amount);
                    buyer.AddToBackpack(res);
                    trader.Government.Resources[GetType(r)] -= (int)(amount / GetDivisor(r));
                    return true;
                    #endregion
                }
                else
                {
                    trader.Say("You do not have enough copper coins.");
                    return false;
                }
            }
        }
        public static bool DonateResource(TradeAdvisor trader, PlayerMobile giver, CraftResource r, int amount)
        {
            if (!CanDoBusiness(trader.Government, giver))
            {
                trader.Say("I cannot do business with you.");
                return false;
            }

            int itemCount = 0;
            foreach (Item i in giver.Backpack.Items)
            {
                if (i.GetType() == GetResourceObject(r))
                    itemCount += i.Amount;
            }

            if (itemCount < amount)
            {
                amount = itemCount;
            }

            if (amount / GetDivisor(r) < 1)
            {
                trader.Say("You don't have enough " + GetString(r) + " to make a donation.");
                return false;
            }
            else if (amount < GetDivisor(r))
            {
                trader.Say("You must have " + GetDivisor(r).ToString() + " to make a donation.");
                return false;
            }
            else if (r != CraftResource.Gold && (amount % GetDivisor(r)) > 0)
            {
                trader.Say(GetString(r).ToUpper() + " is handled in units of " + GetDivisor(r).ToString() + ".");
                return false;
            }

            giver.Backpack.ConsumeTotal(GetResourceObject(r), amount);
            trader.Government.Resources[GetType(r)] += (int)(amount / GetDivisor(r));
            trader.Say(trader.Government.Name + " thanks you for your generosity.");
            return true;
        }