diff --git a/squirrelbattle/entities/friendly.py b/squirrelbattle/entities/friendly.py index 52d2cd2..205e92b 100644 --- a/squirrelbattle/entities/friendly.py +++ b/squirrelbattle/entities/friendly.py @@ -16,7 +16,7 @@ class Merchant(FriendlyEntity): """ Returns a friendly entitie's specific attributes """ - return ["maxhealth", "health", "inventory", "hazel"] + return super().keys() + ["inventory", "hazel"] def __init__(self, name: str = "merchant", inventory: list = None, hazel: int = 75, *args, **kwargs): diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index 1c41cf1..123362f 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -50,7 +50,7 @@ class Item(Entity): self.held = True self.held_by = player self.map.remove_entity(self) - player.inventory.append(self) + player.add_to_inventory(self) def save_state(self) -> dict: """ diff --git a/squirrelbattle/enums.py b/squirrelbattle/enums.py index c62d199..7c0798d 100644 --- a/squirrelbattle/enums.py +++ b/squirrelbattle/enums.py @@ -43,7 +43,7 @@ class KeyValues(Enum): EQUIP = auto() DROP = auto() SPACE = auto() - T = auto() + CHAT = auto() @staticmethod def translate_key(key: str, settings: Settings) -> Optional["KeyValues"]: @@ -74,6 +74,6 @@ class KeyValues(Enum): return KeyValues.DROP elif key == ' ': return KeyValues.SPACE - elif key == 't': - return KeyValues.T + elif key == settings.KEY_CHAT: + return KeyValues.CHAT return None diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index a7ea5de..2aa21f5 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -66,7 +66,6 @@ class Game: We wait for the player's action, then we do what that should be done when the given key gets pressed. """ - self.screen = screen while True: # pragma no cover screen.erase() screen.refresh() @@ -122,7 +121,7 @@ class Game: self.state = GameMode.INVENTORY elif key == KeyValues.SPACE: self.state = GameMode.MAINMENU - elif key == KeyValues.T: + elif key == KeyValues.CHAT: # Wait for the direction of the friendly entity self.waiting_for_friendly_key = True diff --git a/squirrelbattle/interfaces.py b/squirrelbattle/interfaces.py index 15f6852..5efdf7f 100644 --- a/squirrelbattle/interfaces.py +++ b/squirrelbattle/interfaces.py @@ -481,4 +481,4 @@ class FriendlyEntity(FightingEntity): """ Returns a friendly entity's specific attributes """ - return ["maxhealth", "health", "dialogue_option"] + return ["maxhealth", "health"] diff --git a/squirrelbattle/settings.py b/squirrelbattle/settings.py index 4004645..4e6040c 100644 --- a/squirrelbattle/settings.py +++ b/squirrelbattle/settings.py @@ -31,6 +31,7 @@ class Settings: self.KEY_USE = ['u', 'Key used to use an item in the inventory'] self.KEY_EQUIP = ['e', 'Key used to equip an item in the inventory'] self.KEY_DROP = ['r', 'Key used to drop an item in the inventory'] + self.KEY_CHAT = ['t', 'Key used to talk to a friendly entity'] self.TEXTURE_PACK = ['ascii', 'Texture pack'] self.LOCALE = [locale.getlocale()[0][:2], 'Language'] diff --git a/squirrelbattle/tests/game_test.py b/squirrelbattle/tests/game_test.py index 4a57ba0..e510012 100644 --- a/squirrelbattle/tests/game_test.py +++ b/squirrelbattle/tests/game_test.py @@ -7,8 +7,8 @@ import unittest from ..bootstrap import Bootstrap from ..display.display import Display from ..display.display_manager import DisplayManager -from ..entities.friendly import Sunflower, Merchant -from ..entities.items import Bomb +from ..entities.friendly import Merchant, Sunflower +from ..entities.items import Bomb, Sword from ..entities.player import Player from ..enums import DisplayActions from ..game import Game, KeyValues, GameMode @@ -35,8 +35,11 @@ class TestGame(unittest.TestCase): """ bomb = Bomb() self.game.map.add_entity(bomb) - # Add an item in the inventory to check that it is well loaded + sword = Sword() + self.game.map.add_entity(sword) + # Add items in the inventory to check that it is well loaded bomb.hold(self.game.player) + sword.hold(self.game.player) # Ensure that merchants can be saved merchant = Merchant() @@ -125,6 +128,9 @@ class TestGame(unittest.TestCase): self.assertEqual(KeyValues.translate_key( self.game.settings.KEY_INVENTORY, self.game.settings), KeyValues.INVENTORY) + self.assertEqual(KeyValues.translate_key( + self.game.settings.KEY_CHAT, self.game.settings), + KeyValues.CHAT) self.assertEqual(KeyValues.translate_key( self.game.settings.KEY_USE, self.game.settings), KeyValues.USE) @@ -288,7 +294,7 @@ class TestGame(unittest.TestCase): self.assertEqual(self.game.settings.KEY_LEFT_PRIMARY, 'a') # Navigate to "texture pack" - for ignored in range(9): + for ignored in range(10): self.game.handle_key_pressed(KeyValues.DOWN) # Change texture pack @@ -433,8 +439,16 @@ class TestGame(unittest.TestCase): sunflower.move(2, 6) self.game.map.add_entity(sunflower) + # Does nothing + self.assertIsNone(self.game.handle_friendly_entity_chat(KeyValues.UP)) + # Talk to sunflower... or not - self.game.handle_key_pressed(KeyValues.T) + self.game.handle_key_pressed(KeyValues.CHAT) + self.assertTrue(self.game.waiting_for_friendly_key) + # Wrong key + self.game.handle_key_pressed(KeyValues.EQUIP) + self.assertFalse(self.game.waiting_for_friendly_key) + self.game.handle_key_pressed(KeyValues.CHAT) self.assertTrue(self.game.waiting_for_friendly_key) self.game.handle_key_pressed(KeyValues.UP) self.assertFalse(self.game.waiting_for_friendly_key) @@ -442,7 +456,7 @@ class TestGame(unittest.TestCase): self.assertFalse(len(self.game.logs.messages) > 1) # Talk to sunflower - self.game.handle_key_pressed(KeyValues.T) + self.game.handle_key_pressed(KeyValues.CHAT) self.assertTrue(self.game.waiting_for_friendly_key) self.game.handle_key_pressed(KeyValues.DOWN) self.assertFalse(self.game.waiting_for_friendly_key) @@ -451,3 +465,55 @@ class TestGame(unittest.TestCase): # Ensure that the message is a good message self.assertIn(self.game.logs.messages[1][21:], Sunflower.dialogue_option) + + # Test all directions to detect the friendly entity + self.game.player.move(3, 6) + self.game.handle_key_pressed(KeyValues.CHAT) + self.game.handle_key_pressed(KeyValues.UP) + self.assertEqual(len(self.game.logs.messages), 3) + self.game.player.move(2, 7) + self.game.handle_key_pressed(KeyValues.CHAT) + self.game.handle_key_pressed(KeyValues.LEFT) + self.assertEqual(len(self.game.logs.messages), 4) + self.game.player.move(2, 5) + self.game.handle_key_pressed(KeyValues.CHAT) + self.game.handle_key_pressed(KeyValues.RIGHT) + self.assertEqual(len(self.game.logs.messages), 5) + + def test_talk_to_merchant(self) -> None: + """ + Interact with merchants + """ + self.game.state = GameMode.PLAY + + merchant = Merchant() + merchant.move(2, 6) + self.game.map.add_entity(merchant) + + # Does nothing + self.assertIsNone(self.game.handle_friendly_entity_chat(KeyValues.UP)) + + # Talk to merchant + self.game.handle_key_pressed(KeyValues.CHAT) + self.assertTrue(self.game.waiting_for_friendly_key) + self.game.handle_key_pressed(KeyValues.DOWN) + self.assertFalse(self.game.waiting_for_friendly_key) + self.assertEqual(self.game.state, GameMode.STORE) + self.assertTrue(self.game.logs.messages) + + # Navigate in the menu + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.UP) + self.assertEqual(self.game.store_menu.position, 1) + + # Buy the second item + item = self.game.store_menu.validate() + self.assertIn(item, merchant.inventory) + self.game.handle_key_pressed(KeyValues.ENTER) + self.assertIn(item, self.game.player.inventory) + self.assertNotIn(item, merchant.inventory) + + # Exit the menu + self.game.handle_key_pressed(KeyValues.SPACE) + self.assertEqual(self.game.state, GameMode.PLAY)