コード例 #1
0
ファイル: BaseDialog.cs プロジェクト: davidlfox/DrugBot
        protected void SetupLoan(IDialogContext context, int amount, double rate)
        {
            var db     = new DrugBotDataContext();
            var userId = context.UserData.Get <int>(StateKeys.UserId);
            var user   = db.Users.FirstOrDefault(x => x.UserId == userId);

            user.LoanDebt = amount;
            user.LoanRate = rate;
            user.Wallet   = user.Wallet + amount;

            db.Commit();
        }
コード例 #2
0
        private static string DoMugging(int userId, DrugBotDataContext db)
        {
            var user = db.Users.Single(x => x.UserId == userId);

            // get current wallet
            var wallet = user.Wallet;

            // todo: put bounds somewhere static or configurable
            var lossRate    = GetRandomDoubleBetween(0.05, 0.10);
            var moneyLost   = (int)(wallet * lossRate);
            var muggingText = RandomMuggingText();

            user.Wallet = user.Wallet - moneyLost;
            db.Commit();

            return($"{muggingText} You lost {moneyLost:C0}!");
        }
コード例 #3
0
ファイル: SetupNameDialog.cs プロジェクト: davidlfox/DrugBot
        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            var message      = await result;
            var proposedName = message.Text;

            var db = new DrugBotDataContext();

            this.BotUserId = message.Conversation.Id;

            var validationError = db.ValidateUser(this.BotUserId, proposedName);

            // hack: check specifically for a unique name
            if (db.Users.Any(x => x.Name == proposedName))
            {
                validationError = "Your name must be unique...try again.";
            }

            // validate username, etc
            if (string.IsNullOrWhiteSpace(validationError))
            {
                var user    = db.AddUser(this.BotUserId, proposedName);
                var records = db.Commit();

                this.Name = proposedName;

                context.UserData.SetValue <int>(StateKeys.UserId, user.UserId);

                await context.PostAsync($"Thanks {this.Name}...let's make some money!");

                // start in washington, dc
                context.UserData.SetValue <int>(StateKeys.LocationId, 1);

                // go back
                this.Done(context, new GameState {
                    IsNameReady = true
                });
            }
            else
            {
                await context.PostAsync(validationError);

                // loop
                context.Wait(MessageReceivedAsync);
            }
        }
コード例 #4
0
ファイル: CombatDialog.cs プロジェクト: davidlfox/DrugBot
        private async Task PlayerDead(IDialogContext context)
        {
            context.UserData.RemoveValue(StateKeys.CombatContext);

            var           lostInventory  = string.Empty;
            var           lostWallet     = 0;
            InventoryItem stolenDrug     = null;
            var           stolenQuantity = 0;

            var db     = new DrugBotDataContext();
            var userId = context.UserData.Get <int>(StateKeys.UserId);
            var user   = db.Users.Single(x => x.UserId == userId);

            // randomize some losses
            if (user.Wallet > 0)
            {
                var lossRate = RandomEvent.GetRandomDoubleBetween(0.05, 0.10);
                lostWallet  = (int)(user.Wallet * lossRate);
                user.Wallet = user.Wallet - lostWallet;
            }

            if (user.Inventory.Any(x => x.Quantity > 0))
            {
                var availableInventory = db.InventoryItems
                                         .Where(x => x.UserId == userId && x.Quantity > 0);
                var count     = availableInventory.Count();
                var drugIndex = RandomEvent.GetRandomNumberBetween(0, count);

                stolenDrug = availableInventory.ToList().ElementAt(drugIndex);
                var stealRate = RandomEvent.GetRandomDoubleBetween(0.05, 0.10);
                stolenQuantity      = (int)(stolenDrug.Quantity * stealRate);
                stolenDrug.Quantity = stolenDrug.Quantity - stolenQuantity;
            }

            db.Commit();

            lostInventory = $"{(lostWallet > 0 ? $"{lostWallet:C0} from your wallet" : string.Empty)}" +
                            $"{(lostWallet > 0 && stolenQuantity > 0 ? " and " : string.Empty)}" +
                            $"{(stolenQuantity > 0 ? $"{stolenQuantity} {stolenDrug.Drug.Name} from you" : string.Empty)}";

            await context.PostAsync($"They beat you unconscious and took {lostInventory}.");

            this.Done(context);
        }
コード例 #5
0
ファイル: GameDialog.cs プロジェクト: davidlfox/DrugBot
        public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable <IMessageActivity> result)
        {
            var message = await result;

            this.BotUserId = message.Conversation.Id;

            if (message.Text.ToLower() == "play")
            {
                var db   = new DrugBotDataContext();
                var user = db.FindUser(this.BotUserId);

                // start in washington, dc
                context.UserData.SetValue <int>(StateKeys.LocationId, 1);
                db.Commit();

                if (user == null)
                {
                    // first time playing, create user, prompt for name...
                    context.Call(new SetupNameDialog(), BackToSetupNameAsync);
                }
                else
                {
                    // todo: greet user
                    await context.PostAsync("I know you...");

                    context.UserData.SetValue <int>(StateKeys.UserId, user.UserId);
                    context.Call(new MainMenuDialog(), BackToSetupNameAsync);
                }
            }
            else if (message.Text.ToLower() == "leaderboard")
            {
                await this.ShowLeaderboard(context);

                context.Wait(MessageReceivedAsync);
            }
            else
            {
                // tell them to trigger the game start
                await context.PostAsync("You should probably type PLAY to start the game...");

                context.Wait(MessageReceivedAsync);
            }
        }
コード例 #6
0
        private static string DoTrenchcoat(int userId, DrugBotDataContext db)
        {
            var user = db.Users.Single(x => x.UserId == userId);

            // get storage
            var currentSpace = user.InventorySize;

            // get increase rate
            // todo: make static/configurable
            var newSpaceRate = GetRandomDoubleBetween(0.30, 0.50);
            var newSpace     = (int)(currentSpace * newSpaceRate);

            // commit to user
            user.InventorySize = user.InventorySize + newSpace;
            db.Commit();

            var trenchcoatText = RandomTrenchcoatText();

            return($"{trenchcoatText} You can hold {newSpace} more drugs!");
        }
コード例 #7
0
ファイル: BaseDialog.cs プロジェクト: davidlfox/DrugBot
        protected bool PayLoan(IDialogContext context)
        {
            var db     = new DrugBotDataContext();
            var userId = context.UserData.Get <int>(StateKeys.UserId);
            var user   = db.Users.FirstOrDefault(x => x.UserId == userId);

            if (user.Wallet >= user.LoanDebt)
            {
                user.Wallet   = user.Wallet - user.LoanDebt;
                user.LoanDebt = 0;
                user.LoanRate = 0.0;
                db.Commit();

                context.UserData.SetValue <double>(StateKeys.LoanRate, 0.0);

                return(true);
            }

            return(false);
        }
コード例 #8
0
ファイル: BaseDialog.cs プロジェクト: davidlfox/DrugBot
        protected int TravelUser(int userId, int locationId)
        {
            var db   = new DrugBotDataContext();
            var user = db.Users.FirstOrDefault(x => x.UserId == userId);

            if (user != null)
            {
                user.LocationId = locationId;
                user.DayOfGame  = user.DayOfGame + 1;
                if (user.LoanDebt > 0)
                {
                    user.LoanDebt = user.LoanDebt + (int)(user.LoanDebt * user.LoanRate);
                }

                db.Commit();

                return(user.DayOfGame);
            }

            return(0);
        }
コード例 #9
0
ファイル: BaseDialog.cs プロジェクト: davidlfox/DrugBot
        protected BuyGunInfo BuyGun(IDialogContext context)
        {
            var db     = new DrugBotDataContext();
            var gun    = context.UserData.Get <Gun>(StateKeys.GunToBuy);
            var userId = context.UserData.Get <int>(StateKeys.UserId);
            var user   = db.Users.FirstOrDefault(x => x.UserId == userId);

            if (user.Wallet >= gun.Cost)
            {
                user.Wallet = user.Wallet - gun.Cost;
                user.GunId  = gun.GunId;
                db.Commit();

                return(new BuyGunInfo {
                    IsSuccessful = true
                });
            }

            return(new BuyGunInfo {
                IsSuccessful = false, ReasonText = "You ain't got the cash for this piece."
            });
        }
コード例 #10
0
ファイル: BaseDialog.cs プロジェクト: davidlfox/DrugBot
        protected void ResetUser(IDialogContext context)
        {
            var db     = new DrugBotDataContext();
            var userId = context.UserData.Get <int>(StateKeys.UserId);
            var user   = db.Users.FirstOrDefault(x => x.UserId == userId);

            var money = user.Wallet;

            user.Wallet        = Defaults.StartingMoney;
            user.DayOfGame     = Defaults.GameStartDay;
            user.LocationId    = Defaults.LocationId;
            user.LoanDebt      = 0;
            user.LoanRate      = 0.0;
            user.GunId         = null;
            user.InventorySize = Defaults.InventorySize;

            // clear out inventory
            db.InventoryItems.RemoveRange(user.Inventory);

            // regenerate drug prices for this user
            this.GetDrugPrices(context, true);

            db.Commit();
        }
コード例 #11
0
ファイル: SellDialog.cs プロジェクト: davidlfox/DrugBot
        private async Task SellQuantityAsync(IDialogContext context, IAwaitable <long> result)
        {
            var qty = await result;

            if (qty < 1)
            {
                await context.PostAsync("Looks like you don't want to sell any--thanks for wasting my time");

                this.Done(context);
            }
            else
            {
                // yeah, i know this could truncate
                var quantity = Convert.ToInt32(qty);
                var db       = new DrugBotDataContext();

                var userId = context.UserData.Get <int>(StateKeys.UserId);
                var user   = db.Users.Single(x => x.UserId == userId);

                var drugs = db.GetDrugs().ToList()
                            .Select(x => new
                {
                    Name      = x.Name,
                    NameLower = x.Name.ToLower(),
                    DrugId    = x.DrugId,
                });

                // determine drug price
                var drugPrices = this.GetDrugPrices(context);
                var drugToSell = context.UserData.Get <string>(StateKeys.DrugToSell);
                var drug       = drugs.Single(x => x.NameLower == drugToSell);

                if (user.Inventory.Any(x => x.DrugId == drug.DrugId && x.Quantity >= quantity))
                {
                    var price = drugPrices[drug.DrugId];

                    var total = price * quantity;
                    user.Wallet += total;
                    var item = user.Inventory.Single(x => x.DrugId == drug.DrugId);
                    item.Quantity -= quantity;

                    try
                    {
                        db.Commit();
                    }
                    catch
                    {
                        await context.PostAsync("Something happened when saving your sell inventory. Yeah, I'm still an alpha bot...");
                    }

                    await context.PostAsync($"You sold {qty} for {total:C0}.");

                    await context.PostAsync($"You have {user.Wallet:C0} in your wallet.");

                    this.Done(context);
                }
                else
                {
                    await context.PostAsync("You don't have that much to sell...");

                    this.Done(context);
                }
            }
        }
コード例 #12
0
ファイル: MainMenuDialog.cs プロジェクト: davidlfox/DrugBot
        private async Task ResumeMainMenu(IDialogContext context, IAwaitable <GameState> result)
        {
            var state = await result;

            if (state.IsGameOver)
            {
                var user = this.GetUser(context);

                var score = user.Wallet;

                if (user.LoanDebt > 0)
                {
                    await context.PostAsync($"Ya' punk #$%! kid--I'm gonna break both your legs and take back my {user.LoanDebt:C0}!");

                    await context.PostAsync("The loan shark proceeds to break your legs and take his money.");

                    score = user.Wallet - user.LoanDebt;
                }

                // record log of game before resetting
                var db = new DrugBotDataContext();

                var game = new Game {
                    UserId = user.UserId, Score = score
                };
                db.Games.Add(game);
                db.Commit();

                // get their rank
                var orderedGame = db.Games
                                  .OrderByDescending(x => x.Score)
                                  .AsEnumerable()
                                  .Select((x, i) => new { Game = x, Rank = i + 1 })
                                  .Single(x => x.Game.GameId == game.GameId);

                await context.PostAsync("Game Over.");

                await context.PostAsync($"You finished with {score:C0} " +
                                        $"({StringHelper.AddOrdinal(orderedGame.Rank)} overall)");

                await this.ShowLeaderboard(context);

                await context.PostAsync("Type PLAY to start another game!");

                // reset user (this commits db changes)
                this.ResetUser(context);

                this.Done(context);
            }
            else if (state.IsTraveling)
            {
                var user = this.GetUser(context);

                // todo: random events for the day
                if (RandomEvent.IsGoingToHappen)
                {
                    // pass context and user to do db things, receive event info
                    var randomEvent = RandomEvent.Get(context, user.UserId);
                    context.UserData.SetValue(StateKeys.RandomEvent, randomEvent);
                }

                // get day and location
                var location = this.GetLocations().Single(x => x.LocationId == user.LocationId);
                await context.PostAsync($"It's day {user.DayOfGame}. You're in {location.Name}.");
                await StartAsync(context);
            }
            else
            {
                // print menu and start again--hopefully
                await StartAsync(context);
            }
        }