public void RemoveItemFromInventory_GivenCarried() { // Arrange var inventory = new Inventory(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeFood = A.Fake <IAdventureItem>(); A.CallTo(() => fakeFood.ItemId).Returns(Item.FoodRation); A.CallTo(() => fakeFood.Nouns).Returns(new List <string> { "food" }); A.CallTo(() => fakeFood.IsPortable).Returns(true); A.CallTo(() => fakeFood.IsMatch("food")).Returns(true); inventory.AddItem(fakeFood); var args = new ChatCommandEventArgs("!adv", new List <string> { "drop", "food" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Drop(fakeGame, "drop"); cmd.Invoke(fakePlayer, args); // Assert Assert.IsFalse(inventory.Has(Item.FoodRation)); }
public void HandleCommand(IChatClient chatClient, ChatCommandEventArgs e) { if (IsNewPlayer(e)) { JoinGame(chatClient, e); } else { var player = GetPlayer(e.UserId); if (e.ArgsAsList.Count > 0) { var checkForEvents = _commandHandler.ExecutePlayerCommand(player, e); if (checkForEvents) { EventManager.CheckForEvents(player); } } else { player.ChatClient.PostDirectMessage((chatClient.UseUsernameForIM) ? player.UserName : player.Id, "What would you like me to do?"); } } }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var args = e.ArgsAsList; if (args.Count == 1) { player.ChatClient.PostDirectMessage(player, "What would you like to attack?"); return; } else { var victim = args[1].ToLower(); if (player.Here(victim)) { var target = player.CurrentLocation.Items.FirstOrDefault(i => i.IsMatch(victim)); if (target == null) { var contents = player.CurrentLocation.Items.SelectMany(i => i.Contents); target = contents.FirstOrDefault(i => i.IsMatch(victim)); } if (target != null) { target.Attack(player, target); } } } }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var canMove = false; if (player.CurrentLocation.LocationId.Equals(Location.Building)) { var moveTo = Location.Debris; canMove = _game.Dungeon.TryGetLocation(moveTo, out var place); player.CurrentLocation = place; } else if (player.CurrentLocation.LocationId.Equals(Location.Debris)) { var moveTo = Location.Building; canMove = _game.Dungeon.TryGetLocation(moveTo, out var place); player.CurrentLocation = place; } if (canMove) { player.ChatClient.PostDirectMessage(player, "You suddenly feel dizzy and space seems to warp around you!"); return; } player.ChatClient.PostDirectMessage(player, "Nothing happens..."); }
private bool CanExecuteNow(IChatClient chatClient, ChatCommandEventArgs e, ICommand cmd) { if (cmd.Cooldown > TimeSpan.FromMinutes(0)) { if (e.Role != UserRole.Streamer && e.Role != UserRole.Moderator) { if (_bot.CommandInvocations.ContainsKey(e.Command)) { var timeInvoked = _bot.CommandInvocations[e.Command]; var elapsedTime = DateTimeOffset.Now - timeInvoked; if (elapsedTime >= cmd.Cooldown) { _bot.CommandInvocations.Remove(e.Command); } else { var remaining = (cmd.Cooldown - elapsedTime).Seconds; chatClient.PostMessage(e.Channel, $"The command \"{e.Command}\" is on cooldown, {remaining} seconds remaining."); return(false); } } else { _bot.CommandInvocations.Add(e.Command, DateTimeOffset.Now); } } } return(true); }
public Task Execute(IChatClient chatClient, ChatCommandEventArgs e) { if (Status == ItemStatus.Active) { var text = string.Empty; var webClient = new WebClient(); var cricXML = webClient.DownloadString("http://static.cricinfo.com/rss/livescores.xml"); System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); xmlDoc.LoadXml(cricXML); var itemsRemaining = 10; foreach (System.Xml.XmlNode xmlNode in xmlDoc.SelectNodes("rss/channel/item")) { itemsRemaining--; if (itemsRemaining == 0) { break; } text += xmlNode.SelectSingleNode("title").InnerText + "\r\n\t" + xmlNode.SelectSingleNode("link").InnerText + "\r\n"; } chatClient.PostMessage(e.Channel, text); } return(null); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var moveTo = Location.SecretEastWestCanyon; _ = _game.Dungeon.TryGetLocation(moveTo, out var place); if (!player.EventRecord.ContainsKey(EventIds.CaveOpen)) { player.EventRecord.Add(EventIds.CaveOpen, 1); player.Score += 25; } if (!player.EventRecord.ContainsKey(EventIds.Dwarves)) { player.EventRecord.Add(EventIds.Dwarves, 1); var addItem = new AddToInventory(); addItem.Do(player, ItemFactory.GetInstance(_game, Item.LittleAxe)); // Treasures addItem.Do(player, ItemFactory.GetInstance(_game, Item.Coins)); addItem.Do(player, ItemFactory.GetInstance(_game, Item.Diamond)); } player.CurrentLocation = place; player.ChatClient.PostDirectMessage(player, "Teleported to *" + player.CurrentLocation.Name + "*"); }
public bool ExecutePlayerCommand(AdventurePlayer player, ChatCommandEventArgs e) { var advCommands = e.ArgsAsList; var cmd = advCommands[0].ToLower(); var command = _commandRegistry.RegisteredCommands.FirstOrDefault(c => c.IsMatch(cmd)) ?? _commandRegistry.RegisteredCommands.FirstOrDefault(c => c.IsMatch("use")); if (!command.IsVerbatim) { var nullWords = new List <string> { "a", "an", "the", "this", "that", "to" }; var argsSent = advCommands.ToArray(); foreach (var word in argsSent.Where(word => nullWords.Contains(word)).Select(word => word)) { advCommands.Remove(word); } } command?.Invoke(player, e); return(command.CheckEvents); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var canMove = false; if (player.CurrentLocation.LocationId.Equals(Location.Building)) { var moveTo = Location.Y2; canMove = _game.Dungeon.TryGetLocation(moveTo, out var place); player.CurrentLocation = place; } else if (player.CurrentLocation.LocationId.Equals(Location.Y2)) { var moveTo = Location.Building; canMove = _game.Dungeon.TryGetLocation(moveTo, out var place); player.CurrentLocation = place; } if (canMove) { player.ChatClient.PostDirectMessage(player, "From out of thin air, a hollow booming voice says 'Plugh!'"); return; } player.ChatClient.PostDirectMessage(player, "Nothing happens..."); }
public void NotChangePlayerLocation_GivenInvalidMove() { // Arrange var fakeRoad = A.Fake <IAdventureLocation>(); A.CallTo(() => fakeRoad.ValidMoves).Returns(new List <IPlayerMove> { new PlayerMove("You enter the building.", Location.Building, "east", "e", "enter", "in", "inside", "building"), }); var fakeBuilding = A.Fake <IAdventureLocation>(); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var player = new AdventurePlayer("Player1", "PlayerOne", A.Fake <IChatClient>()); player.CurrentLocation = fakeRoad; var args = new ChatCommandEventArgs("!adv", new List <string> { "go", "north" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Move(fakeGame, "move", "go"); cmd.Invoke(player, args); // Assert Assert.AreSame(fakeRoad, player.CurrentLocation); }
public void IncrementPlayerMoveCount() { // Arrange var fakeRoad = A.Fake <IAdventureLocation>(); A.CallTo(() => fakeRoad.ValidMoves).Returns(new List <IPlayerMove> { new PlayerMove("You enter the building.", Location.Building, "east", "e", "enter", "in", "inside", "building"), }); var fakeBuilding = A.Fake <IAdventureLocation>(); var fakeGame = A.Fake <IReadonlyAdventureGame>(); A.CallTo(() => fakeGame.Dungeon.TryGetLocation(A <Location> .Ignored, out fakeBuilding)).Returns(true) .AssignsOutAndRefParameters(fakeBuilding); var player = new AdventurePlayer("Player1", "PlayerOne", A.Fake <IChatClient>()); player.CurrentLocation = fakeRoad; var args = new ChatCommandEventArgs("!adv", new List <string> { "go", "east" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Move(fakeGame, "move", "go"); cmd.Invoke(player, args); // Assert Assert.AreEqual(1, player.Moves); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var canMove = false; if (e.ArgsAsList.Count == 2) { var direction = e.ArgsAsList[1].ToLower(); if (player.CurrentLocation.IsDark) { if (!player.Statuses.Contains(PlayerStatus.HasLight)) { player.ChatClient.PostDirectMessage(player, "It is pitch black! If you move around, you'll probably fall into a chasm or something..."); } } if (player.CurrentLocation.ValidMoves.Any(d => d.IsMatch(direction))) { var move = player.CurrentLocation.ValidMoves.First(d => d.IsMatch(direction)); var moveTo = move.Destination; var moveText = move.MoveText; canMove = _game.Dungeon.TryGetLocation(moveTo, out var place); if (canMove) { if (MoveAffectedByEncumberedStatus(player, move)) { return; } player.PriorLocation = player.CurrentLocation; player.CurrentLocation = place; player.Moves++; if (player.Clocks != null && player.Clocks.Count > 0) { foreach (var key in player.Clocks.Keys) { player.Clocks[key]++; } } if (!string.IsNullOrWhiteSpace(moveText)) { player.ChatClient.PostDirectMessage(player, moveText); } player.ChatClient.PostDirectMessage(player, "*" + player.CurrentLocation.Name + "*"); return; } } } player.ChatClient.PostDirectMessage(player, "You cannot go in that direction! Try *look* so see where you might go."); player.ChatClient.PostDirectMessage(player, "*" + player.CurrentLocation.Name + "*"); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var canSee = true; var description = new StringBuilder("*" + player.CurrentLocation.Name + "*"); if (player.CurrentLocation.IsDark) { if (!player.Statuses.Contains(PlayerStatus.HasLight)) { canSee = false; } } if (canSee) { description.AppendLine(); description.AppendLine($"You are {player.CurrentLocation.LongDescription}"); var otherPlayersHere = _game.Players.Where(p => p.CurrentLocation.Name == player.CurrentLocation.Name && p.Id != player.Id).ToList(); if (otherPlayersHere.Any()) { description.AppendLine(); foreach (var otherPlayer in otherPlayersHere) { description.AppendLine($"\t{otherPlayer.UserName} is also here."); } } description.AppendLine(); foreach (var item in player.CurrentLocation.Items) { description.AppendLine(item.IsEndlessSupply ? $"There are several {item.PluralName} here." : $"There is a {item.Name} here."); if (item.Contents.Any() && (item.IsOpen || item.IsTransparent)) { description.AppendLine($"The {item.Name} contains:"); foreach (var content in item.Contents) { description.AppendLine($"\tA {content.Name}"); } } } } else { description.AppendLine(); description.AppendLine("It is pitch black, you cannot see a thing!"); } player.ChatClient.PostDirectMessage(player, description.ToString()); }
public Task Execute(IChatClient chatClient, ChatCommandEventArgs e) { if (Status == ItemStatus.Active && _quotes != null) { chatClient.PostMessage(e.Channel, _quotes[_random.Next(_quotes.Count)]); } return(null); }
public void ExecutePlayerCommand(AdventurePlayer player, ChatCommandEventArgs e) { var advCommands = e.ArgsAsList; var cmd = advCommands[0].ToLower(); var command = _commandRegistry.RegisteredCommands.FirstOrDefault(c => c.IsMatch(cmd)) ?? _commandRegistry.RegisteredCommands.FirstOrDefault(c => c.IsMatch("use")); command?.Invoke(player, e); }
public void AddItemToInventory_GivenItRequiresContainerThatIsCarried() { // Arrange var inventory = new Inventory(); var fakeLocation = A.Fake <IAdventureLocation>(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); A.CallTo(() => fakePlayer.CurrentLocation).Returns(fakeLocation); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeCage = A.Fake <IAdventureItem>(); A.CallTo(() => fakeCage.ItemId).Returns(Item.Cage); A.CallTo(() => fakeCage.Nouns).Returns(new List <string> { "cage" }); A.CallTo(() => fakeCage.IsPortable).Returns(true); A.CallTo(() => fakeCage.IsMatch("cage")).Returns(true); A.CallTo(() => fakeCage.IsContainer).Returns(true); A.CallTo(() => fakeCage.Contents).Returns(new List <IAdventureItem>()); var fakeBird = A.Fake <IAdventureItem>(); A.CallTo(() => fakeBird.ItemId).Returns(Item.Bird); A.CallTo(() => fakeBird.Nouns).Returns(new List <string> { "bird" }); A.CallTo(() => fakeBird.IsPortable).Returns(true); A.CallTo(() => fakeBird.IsMatch("bird")).Returns(true); A.CallTo(() => fakeBird.ContainerRequired()).Returns(true); A.CallTo(() => fakeBird.MustBeContainedIn).Returns(Item.Cage); A.CallTo(() => fakeLocation.Items).Returns(new List <IAdventureItem> { fakeBird }); inventory.AddItem(fakeCage); var args = new ChatCommandEventArgs("!adv", new List <string> { "take", "bird" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Take(fakeGame, "take", "get"); cmd.Invoke(fakePlayer, args); // Assert Assert.IsTrue(inventory.HasRequiredContainer(fakeBird)); Assert.IsTrue(inventory.Has(Item.Cage)); Assert.IsTrue(inventory.Has(Item.Bird)); Assert.IsTrue(inventory.GetItems().Single(i => i.IsMatch("cage")).Contents.Contains(fakeBird)); }
private async void OnChatCommandReceived(object sender, ChatCommandEventArgs args) { if (string.Compare(args.CommandName, "pinghost", StringComparison.OrdinalIgnoreCase) == 0) { await HandlePingHost(args).ConfigureAwait(false); } else if (string.Compare(args.CommandName, "minecraft", StringComparison.OrdinalIgnoreCase) == 0) { await HandleMinecraft(args).ConfigureAwait(false); } }
public void DoSomething_GivenItemAtLocation() { // Arrange var inventory = new Inventory(); var fakeLocation = A.Fake <IAdventureLocation>(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); A.CallTo(() => fakePlayer.CurrentLocation).Returns(fakeLocation); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeLamp = A.Fake <IAdventureItem>(); A.CallTo(() => fakeLamp.ItemId).Returns(Item.Lamp); A.CallTo(() => fakeLamp.Nouns).Returns(new List <string> { "lamp" }); A.CallTo(() => fakeLamp.IsEndlessSupply).Returns(false); A.CallTo(() => fakeLamp.IsPortable).Returns(true); A.CallTo(() => fakeLamp.IsMatch("lamp")).Returns(true); var interactions = new List <IInteraction>(); var actions = new List <IAction>(); var fakeInteraction = A.Fake <IInteraction>(); var fakeAction = A.Fake <IAction>(); A.CallTo(() => fakeAction.Do(A <IAdventurePlayer> .Ignored, fakeLamp)).Returns(true); actions.Add(fakeAction); interactions.Add(fakeInteraction); A.CallTo(() => fakeLamp.Interactions).Returns(interactions); A.CallTo(() => fakeInteraction.ShouldExecute()).Returns(true); A.CallTo(() => fakeInteraction.RegisteredInteractions).Returns(actions); A.CallTo(() => fakeLamp.Interact("light", fakePlayer)).Returns(true); A.CallTo(() => fakeLocation.Items).Returns(new List <IAdventureItem> { fakeLamp }); var args = new ChatCommandEventArgs("!adv", new List <string> { "light", "lamp" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Interact(fakeGame, "light"); cmd.Invoke(fakePlayer, args); // Assert A.CallTo(() => fakeLamp.Interact("light", fakePlayer)).MustHaveHappenedOnceExactly(); }
public void NotTakeItem_GivenItIsPreventedByItemCarried() { // Example: Cannot take the bord if player is carrying the rod ... // Arrange var inventory = new Inventory(); var fakeLocation = A.Fake <IAdventureLocation>(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); A.CallTo(() => fakePlayer.CurrentLocation).Returns(fakeLocation); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeBird = A.Fake <IAdventureItem>(); A.CallTo(() => fakeBird.ItemId).Returns(Item.Bird); A.CallTo(() => fakeBird.Nouns).Returns(new List <string> { "bird" }); A.CallTo(() => fakeBird.IsPortable).Returns(true); A.CallTo(() => fakeBird.IsMatch("bird")).Returns(true); A.CallTo(() => fakeBird.ContainerRequired()).Returns(true); A.CallTo(() => fakeBird.MustBeContainedIn).Returns(Item.Cage); A.CallTo(() => fakeLocation.Items).Returns(new List <IAdventureItem> { fakeBird }); var fakeRod = A.Fake <IAdventureItem>(); A.CallTo(() => fakeRod.ItemId).Returns(Item.Rod); A.CallTo(() => fakeRod.Nouns).Returns(new List <string> { "rod" }); A.CallTo(() => fakeRod.IsPortable).Returns(true); A.CallTo(() => fakeRod.IsMatch("rod")).Returns(true); inventory.AddItem(fakeRod); var args = new ChatCommandEventArgs("!adv", new List <string> { "take", "bird" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Take(fakeGame, "take", "get"); cmd.Invoke(fakePlayer, args); // Assert Assert.IsFalse(inventory.Has(Item.Bird)); }
public Task Execute(IChatClient chatClient, ChatCommandEventArgs e) { if (Status == ItemStatus.Active) { if (e.ClientType.ToLower().Contains(RestrictToClientType)) { Sfx.PlaySound(Sfx.HeyEssenbee); } chatClient.PostMessage(e.Channel, "**Hey, Essenbee!**"); } return(null); }
public void RemoveItemFromInventory_GivenContainedItem() { // Arrange var inventory = new Inventory(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeCage = A.Fake <IAdventureItem>(); A.CallTo(() => fakeCage.ItemId).Returns(Item.Cage); A.CallTo(() => fakeCage.Nouns).Returns(new List <string> { "cage" }); A.CallTo(() => fakeCage.IsPortable).Returns(true); A.CallTo(() => fakeCage.IsMatch("cage")).Returns(true); A.CallTo(() => fakeCage.IsContainer).Returns(true); A.CallTo(() => fakeCage.Contents).Returns(new List <IAdventureItem>()); var fakeBird = A.Fake <IAdventureItem>(); A.CallTo(() => fakeBird.ItemId).Returns(Item.Bird); A.CallTo(() => fakeBird.Nouns).Returns(new List <string> { "bird" }); A.CallTo(() => fakeBird.IsPortable).Returns(true); A.CallTo(() => fakeBird.IsMatch("bird")).Returns(true); A.CallTo(() => fakeBird.ContainerRequired()).Returns(true); A.CallTo(() => fakeBird.MustBeContainedIn).Returns(Item.Cage); inventory.AddItem(fakeCage); fakeCage.Contents.Add(fakeBird); inventory.AddItem(fakeCage); var args = new ChatCommandEventArgs("!adv", new List <string> { "drop", "bird" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Drop(fakeGame, "drop"); cmd.Invoke(fakePlayer, args); // Assert Assert.IsFalse(inventory.Has(Item.Bird)); Assert.IsTrue(inventory.Has(Item.Cage)); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var helpText = new StringBuilder("I know several commands to aid you in your exploration, including:"); helpText.AppendLine(); helpText.AppendLine("\t`!adv look`"); helpText.AppendLine("\t`!adv go`"); helpText.AppendLine("\t`!adv take`"); helpText.AppendLine("\t`!adv use`"); helpText.AppendLine("\t`!adv inventory`"); helpText.AppendLine(); helpText.AppendLine("Some of the places you will visit have items lying around. If such an item is shown in *bold* text, you can take it and carry it with you; it may or may not be of any use."); helpText.AppendLine("Note that, if you find several of the same item, you can only carry one of them at a time!"); player.ChatClient.PostDirectMessage(player, helpText.ToString()); }
public async Task Execute(IChatClient chatClient, ChatCommandEventArgs e) { var projectTextModel = await _bot.BotDataClient.GetProjectText(); var projectText = projectTextModel.Text; if (!string.IsNullOrWhiteSpace(projectText)) { chatClient.PostMessage(e.Channel, projectText); } else { chatClient.PostMessage(e.Channel, "Whoops! Looks like essenbee forgot to set the Project text!"); } }
public void ExecuteCommand(IChatClient chatClient, ChatCommandEventArgs e) { if (Bot.IsRunning) { // Check command name against available commands ... if (CommandRegistry.TryGetValue(e.Command, out ICommand cmd)) { if (!CanExecuteNow(chatClient, e, cmd)) { return; } cmd.Execute(chatClient, e); } } }
public Task Execute(IChatClient chatClient, ChatCommandEventArgs e) { lock (_mutex) { if (chatClient.GetType().ToString() == e.ClientType) { if (_adventureGame is null) { _adventureGame = new AdventureGame(); } _adventureGame.HandleCommand(chatClient, e); } } return(null); }
public void AddPlayer_GivenNotAlredayPlayer() { // Arrange var fakeRoad = A.Fake <IAdventureLocation>(); var fakeDungeon = A.Fake <IDungeon>(); A.CallTo(() => fakeDungeon.GetStartingLocation()).Returns(fakeRoad); var fakeChatClient = A.Fake <IChatClient>(); var eventArgs = new ChatCommandEventArgs("!adv", new List <string>(), string.Empty, "PlayerOne", "Player1", string.Empty); var sut = new AdventureGame(fakeDungeon); // Act sut.HandleCommand(fakeChatClient, eventArgs); // Assert Assert.AreEqual(1, sut.Players.Count); }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var args = e.ArgsAsList; if (args.Count == 1) { player.ChatClient.PostDirectMessage(player, "What would you like to drop? Try using: !adv drop _item_"); return; } var itemToDrop = args[1]; if (!player.Inventory.Has(itemToDrop)) { player.ChatClient.PostDirectMessage(player, $"You don't have a {itemToDrop} to drop!"); } else { var itemInInventory = player.Inventory.GetItems().FirstOrDefault(i => i.IsMatch(itemToDrop)); if (itemInInventory != null) { player.Inventory.RemoveItem(itemInInventory); player.CurrentLocation.Items.Add(itemInInventory); player.ChatClient.PostDirectMessage(player, $"You dropped a {itemToDrop}"); itemInInventory.RemovePlayerStatusCondition(player, itemInInventory.GivesPlayerStatus); return; } itemInInventory = player.Inventory.GetContainedItem(itemToDrop); if (itemInInventory != null) { player.Inventory.RemoveItemContainer(itemInInventory); player.CurrentLocation.Items.Add(itemInInventory); player.ChatClient.PostDirectMessage(player, $"You dropped a {itemToDrop}"); itemInInventory.RemovePlayerStatusCondition(player, itemInInventory.GivesPlayerStatus); return; } // Just in case ... player.ChatClient.PostDirectMessage(player, $"You don't have a {itemToDrop} to drop!"); } }
public override void Invoke(IAdventurePlayer player, ChatCommandEventArgs e) { var args = e.ArgsAsList; if (args.Count == 1) { player.ChatClient.PostDirectMessage(player, Verbs.Contains(args[0]) ? $"I don't know how to just `{args[0]}`. Can you be a little more explicit?" : $"Sorry, I don't understand the verb `{args[0]}`."); return; } var itemToInteractWith = args[1]; var itemInInventory = player.Inventory.GetItems().FirstOrDefault(i => i.IsMatch(itemToInteractWith)); if (itemInInventory is null) { var containedItems = player.Inventory.GetContainedItems(); itemInInventory = containedItems.FirstOrDefault(i => i.IsMatch(itemToInteractWith)); } var itemAtLocation = player.CurrentLocation.Items.FirstOrDefault(i => i.IsMatch(itemToInteractWith)); if (itemInInventory is null && itemAtLocation is null) { player.ChatClient.PostDirectMessage(player, $"Which `{itemToInteractWith}` are you referring to?"); player.ChatClient.PostDirectMessage(player, "Tip: Don't use words like 'the' or 'at', try just <verb> <noun> instead."); return; } bool actionWasMatched; // Interact with inventory items as a preference ... actionWasMatched = itemInInventory?.Interact(args[0], player) ?? itemAtLocation.Interact(args[0], player); if (!actionWasMatched) { player.ChatClient.PostDirectMessage(player, $"I don't know how to `{args[0]}` a `{itemToInteractWith}`. " + "Can you be clearer?"); } }
private void JoinGame(IChatClient chatClient, ChatCommandEventArgs e) { var player = new AdventurePlayer(e.UserId, e.UserName, chatClient) { CurrentLocation = Dungeon.GetStartingLocation() }; _players.Add(player); chatClient.PostMessage(e.Channel, $"{e.UserName} has joined the Adventure!"); var welcome = new StringBuilder("Welcome to Adventure!"); welcome.AppendLine("Use `!adv help` to get some help."); player.ChatClient.PostDirectMessage(player.Id, welcome.ToString()); var look = _commandHandler.GetCommand("look"); look?.Invoke(player, e); }
public void DoesNotDuplicateItem_GivenAlreadyCarried() { // Arrange var inventory = new Inventory(); var fakeLocation = A.Fake <IAdventureLocation>(); var fakePlayer = A.Fake <IAdventurePlayer>(); A.CallTo(() => fakePlayer.Inventory).Returns(inventory); A.CallTo(() => fakePlayer.CurrentLocation).Returns(fakeLocation); var fakeGame = A.Fake <IReadonlyAdventureGame>(); var fakeFood = A.Fake <IAdventureItem>(); A.CallTo(() => fakeFood.ItemId).Returns(Item.FoodRation); A.CallTo(() => fakeFood.Nouns).Returns(new List <string> { "food" }); A.CallTo(() => fakeFood.IsPortable).Returns(true); A.CallTo(() => fakeFood.IsMatch("food")).Returns(true); inventory.AddItem(fakeFood); A.CallTo(() => fakeLocation.Items).Returns(new List <IAdventureItem> { fakeFood }); var args = new ChatCommandEventArgs("!adv", new List <string> { "take", "food" }, string.Empty, "Bill", "Player1", string.Empty); // Act var cmd = new Take(fakeGame, "take", "get"); cmd.Invoke(fakePlayer, args); // Assert Assert.IsTrue(inventory.Has(Item.FoodRation)); Assert.AreEqual(1, inventory.GetItems().Count(i => i.ItemId == Item.FoodRation)); }