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(); }
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}!"); }
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); } }
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); }
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); } }
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!"); }
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); }
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); }
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." }); }
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(); }
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); } } }
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); } }