Ejemplo n.º 1
0
        private async Task CompleteSale(Equipment item, int offer)
        {
            await BuybackFormatter.CompleteSale(item, offer);

            Player.Gold += offer;
            Player.RemoveEquipment(item);

            await GameControl.PlaySoundWait(LotaSound.Sale);
        }
Ejemplo n.º 2
0
        public async Task NegotiatePrice(Equipment item)
        {
            int charm = Player.Attribute[Attributes.charm];

            charm = Math.Min(charm, 80);

            int maxAccept = (int)(item.Price(Data) * Math.Pow(charm, .7) / 11);
            int offer     = (int)((6 + Random.NextDouble()) * maxAccept / 14.0);

            int choice = await MakeOffer(item, offer, false);

            if (choice == 0)
            {
                await CompleteSale(item, offer);

                return;
            }
            int ask = 0;

            OfferWindow.SetOffer(offer, ask);

            ask = await GetAskingPrice();

            if (ask == 0)
            {
                await BuybackFormatter.SeeYouLater();

                return;
            }
            if (ask < 1.5 * offer)
            {
                await CompleteSale(item, ask);

                return;
            }

            int spread = maxAccept - offer;

            if (ask > spread + maxAccept)
            {
                await ComeBackWhenSerious();

                return;
            }

            spread = ask - offer;
            double scale = maxAccept / (double)spread;

            offer     = (int)(offer + (1 + Random.NextDouble() * 5) * scale);
            maxAccept = spread;

            if (offer >= ask)
            {
                offer = ask - 1;
            }

            int lastAsk = ask;

            do
            {
                bool finalOffer = false;

                OfferWindow.RejectAskingPrice(ask, IsAskWayTooHigh(ask, offer, maxAccept));
                choice = await MakeOffer(item, offer, finalOffer);

                if (choice == 0)
                {
                    await CompleteSale(item, offer);

                    return;
                }
                else if (finalOffer)
                {
                    await MaybeDealLater();

                    return;
                }

                OfferWindow.SetOffer(offer, lastAsk);
                ask = await GetAskingPrice();

                if (ask == 0)
                {
                    await MaybeDealLater();

                    return;
                }

                if (ask == lastAsk ||
                    (ask > lastAsk && Random.NextDouble() < 0.5))
                {
                    await ComeBackWhenSerious();

                    return;
                }

                double diff = lastAsk - ask;
                if (diff == 0)
                {
                    diff = Random.NextDouble() * 3;
                }

                if (diff / maxAccept < 0.03)
                {
                    diff /= 1.3;
                }

                lastAsk = ask;
                spread  = (int)(offer + diff / 1.2 + Random.NextDouble() * diff / 1.6);

                if (spread > ask - 2 && Random.NextDouble() < .5)
                {
                    await CompleteSale(item, ask);

                    return;
                }
                if (spread >= ask)
                {
                    finalOffer = true;
                }
                else
                {
                    offer = spread;

                    if (ask - offer < 3)
                    {
                        finalOffer = true;
                    }

                    if (offer <= 0)
                    {
                        await ComeBackWhenSerious();

                        return;
                    }
                }
            } while (true);
        }
Ejemplo n.º 3
0
        private async Task MaybeDealLater()
        {
            await BuybackFormatter.MaybeDealLater();

            await Wait(1500);
        }
Ejemplo n.º 4
0
        private async Task ComeBackWhenSerious()
        {
            await BuybackFormatter.ComeBackWhenSerious();

            await Wait(1500);
        }
Ejemplo n.º 5
0
        private Task <int> MakeOffer(Equipment item, int offer, bool finalOffer)
        {
            BuybackFormatter.Offer(item, offer, finalOffer);

            return(QuickMenu.QuickMenuYesNo(true));
        }
Ejemplo n.º 6
0
        private Task <int> GetAskingPrice()
        {
            BuybackFormatter.ClearTextArea();

            return(NumberPicker.ChooseNumber(32767));
        }
Ejemplo n.º 7
0
        private async Task RunStore()
        {
            robbing = false;

            Screen.ClearWindows();
            Title = TheEvent.ShopName;

            var wind = new TextWindow();

            wind.Location = new Point(9, 4);

            wind.WriteLine("I will happily purchase");
            wind.WriteLine("your used arms and armor");

            var prompt = new TextWindow();

            prompt.Location = new Point(9, 9);
            prompt.WriteLine("Choose items to sell:");
            prompt.WriteLine();
            prompt.WriteLine(" 1.  Weapons");
            prompt.WriteLine(" 2.  Armor");

            Screen.AddWindow(wind);
            Screen.AddWindow(prompt);

            wind.SetColor(XleColor.Red);
            prompt.SetColor(XleColor.Red);

            await BuybackFormatter.InitialMenuPrompt();

            MenuItemList theList = new MenuItemList("0", "1", "2");
            int          choice  = await QuickMenu(theList, 2, 0);

            if (choice == 0)
            {
                return;
            }

            Screen.RemoveWindow(prompt);
            wind.Visible = false;

            ColorScheme.FrameColor             = XleColor.Gray;
            ColorScheme.HorizontalLinePosition = 11;
            Title        = "";
            ShowGoldText = false;

            Equipment item = null;

            TextArea.Clear();

            TextWindow questionWindow = new TextWindow {
                Location = new Point(5, 16)
            };

            Screen.AddWindow(questionWindow);

            switch (choice)
            {
            case 1:
                questionWindow.WriteLine("What weapon will you sell me?");
                item = await EquipmentPicker.PickWeapon(GameState, null, ColorScheme.BackColor);

                break;

            case 2:
                questionWindow.WriteLine("What armor will you sell me?");
                item = await EquipmentPicker.PickArmor(GameState, null, ColorScheme.BackColor);

                break;
            }

            if (item == null)
            {
                return;
            }

            Screen.RemoveWindow(questionWindow);

            wind.Visible = true;
            wind.SetColor(XleColor.White);
            wind.Location = new Point(9, 8);

            ColorScheme.HorizontalLinePosition = 14;
            ColorScheme.TextAreaBackColor      = XleColor.Black;

            Title = "Buy-back shop";

            InitializeOfferWindow();

            await Negotiator.NegotiatePrice(item);
        }