From 2eb42668c838fd9922bb8e2ff5a148b7fd56f32a Mon Sep 17 00:00:00 2001 From: eichhornchen Date: Fri, 8 Jan 2021 23:32:47 +0100 Subject: [PATCH] Linting and tests for chests --- squirrelbattle/display/menudisplay.py | 3 +- squirrelbattle/entities/friendly.py | 8 ++-- squirrelbattle/entities/items.py | 2 +- squirrelbattle/game.py | 4 +- squirrelbattle/tests/game_test.py | 58 ++++++++++++++++++++++++++- 5 files changed, 67 insertions(+), 8 deletions(-) diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index 2e870e2..b3001ab 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -6,7 +6,7 @@ from random import randint from typing import List from squirrelbattle.menus import Menu, MainMenu, SettingsMenu, StoreMenu,\ - ChestMenu + ChestMenu from .display import Box, Display from ..entities.player import Player from ..enums import KeyValues, GameMode @@ -244,6 +244,7 @@ class StoreInventoryDisplay(MenuDisplay): game.is_in_store_menu = True game.handle_key_pressed(KeyValues.ENTER) + class ChestInventoryDisplay(MenuDisplay): """ A class to handle the display of a merchant's inventory. diff --git a/squirrelbattle/entities/friendly.py b/squirrelbattle/entities/friendly.py index 5ce9de9..91515d2 100644 --- a/squirrelbattle/entities/friendly.py +++ b/squirrelbattle/entities/friendly.py @@ -1,4 +1,5 @@ -from ..interfaces import FriendlyEntity, InventoryHolder, Map, FightingEntity +from ..interfaces import Entity, FriendlyEntity, InventoryHolder, \ + Map, FightingEntity from ..translations import gettext as _ from .player import Player from .monsters import Monster @@ -17,7 +18,7 @@ class Merchant(InventoryHolder, FriendlyEntity): return super().keys() + ["inventory", "hazel"] def __init__(self, name: str = "merchant", inventory: list = None, - hazel: int = 75, maxhealth = 8, *args, **kwargs): + hazel: int = 75, maxhealth: int = 8, *args, **kwargs): super().__init__(name=name, maxhealth=maxhealth, *args, **kwargs) self.inventory = self.translate_inventory(inventory or []) self.hazel = hazel @@ -38,6 +39,7 @@ class Merchant(InventoryHolder, FriendlyEntity): """ self.hazel += hz + class Chest(InventoryHolder, FriendlyEntity): """ A class of chest inanimate entities which contain objects. @@ -58,7 +60,7 @@ class Chest(InventoryHolder, FriendlyEntity): """ return _("You have opened the chest") - def take_damage(self, attacker: "Entity", amount: int) -> str: + def take_damage(self, attacker: Entity, amount: int) -> str: """ A chest is not living, it can not take damage """ diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index f1c8002..c4594df 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -88,7 +88,7 @@ class Item(Entity): Chestplate, Helmet, RingCritical, RingXP, ScrollofDamage, ScrollofWeakening, Ruler, Bow, FireBallStaff] - def be_sold(self, buyer: InventoryHolder, seller: InventoryHolder,\ + def be_sold(self, buyer: InventoryHolder, seller: InventoryHolder, for_free: bool = False) -> bool: """ Does all necessary actions when an object is to be sold. diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index 65c18c1..b576c68 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -341,7 +341,7 @@ class Game: self.display_actions(DisplayActions.UPDATE) # Ensure that the cursor has a good position menu.position = min(menu.position, len(menu.values) - 1) - + def handle_key_pressed_chest(self, key: KeyValues) -> None: """ In a chest menu, we can take or put items or close the menu. @@ -367,7 +367,7 @@ class Game: else self.player buyer = self.player if self.is_in_chest_menu \ else self.chest_menu.chest - flag = item.be_sold(buyer, owner, for_free = True) + item.be_sold(buyer, owner, for_free=True) self.display_actions(DisplayActions.UPDATE) # Ensure that the cursor has a good position menu.position = min(menu.position, len(menu.values) - 1) diff --git a/squirrelbattle/tests/game_test.py b/squirrelbattle/tests/game_test.py index 6fe4203..a8e9c59 100644 --- a/squirrelbattle/tests/game_test.py +++ b/squirrelbattle/tests/game_test.py @@ -8,7 +8,7 @@ import unittest from ..bootstrap import Bootstrap from ..display.display import Display from ..display.display_manager import DisplayManager -from ..entities.friendly import Merchant, Sunflower +from ..entities.friendly import Merchant, Sunflower, Chest from ..entities.items import Bomb, Heart, Sword, Explosion, Shield, Helmet, \ Chestplate, RingCritical, Bow, FireBallStaff, ScrollofDamage,\ ScrollofWeakening @@ -854,3 +854,59 @@ class TestGame(unittest.TestCase): self.game.map.tick(self.game.player) self.assertEqual(entity2.effects, []) + + def test_chests(self) -> None: + """ + Interacts with chests. + """ + self.game.state = GameMode.PLAY + + chest = Chest() + chest.move(2, 6) + self.game.map.add_entity(chest) + chest.inventory.append(FireBallStaff()) + + # 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.CHEST) + 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.LEFT) + self.assertFalse(self.game.is_in_chest_menu) + self.game.handle_key_pressed(KeyValues.RIGHT) + self.assertTrue(self.game.is_in_chest_menu) + self.game.handle_key_pressed(KeyValues.UP) + self.assertEqual(self.game.chest_menu.position, 1) + + # The second item is not a heart + chest.inventory[1] = sword = Sword() + # Take the second item by clicking on it + item = self.game.chest_menu.validate() + self.assertIn(item, chest.inventory) + self.game.display_actions(DisplayActions.MOUSE, 7, 25) + self.assertIn(item, self.game.player.inventory) + self.assertNotIn(item, chest.inventory) + + # Give an item back + self.game.inventory_menu.position = len(self.game.player.inventory) - 1 + self.game.handle_key_pressed(KeyValues.LEFT) + self.assertFalse(self.game.is_in_chest_menu) + self.assertIn(sword, self.game.player.inventory) + self.assertEqual(self.game.inventory_menu.validate(), sword) + self.game.handle_key_pressed(KeyValues.ENTER) + self.assertNotIn(sword, self.game.player.inventory) + self.assertIn(sword, chest.inventory) + + # Test immortality + self.game.player.hit(chest) + self.assertTrue(not chest.dead) + + # Exit the menu + self.game.handle_key_pressed(KeyValues.SPACE) + self.assertEqual(self.game.state, GameMode.PLAY)