From 39af79101207c0a031f993e46310a3a7c4744296 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 14:41:59 +0100 Subject: [PATCH 01/16] We can open an empty inventory! --- squirrelbattle/display/display_manager.py | 16 ++-- squirrelbattle/display/menudisplay.py | 5 ++ squirrelbattle/enums.py | 3 + squirrelbattle/game.py | 3 + .../locale/de/LC_MESSAGES/squirrelbattle.po | 24 +++--- .../locale/en/LC_MESSAGES/squirrelbattle.po | 16 +++- .../locale/fr/LC_MESSAGES/squirrelbattle.po | 86 ++++++++----------- squirrelbattle/menus.py | 5 ++ squirrelbattle/settings.py | 1 + squirrelbattle/tests/game_test.py | 1 + squirrelbattle/tests/settings_test.py | 4 + squirrelbattle/tests/translations_test.py | 2 + 12 files changed, 99 insertions(+), 67 deletions(-) diff --git a/squirrelbattle/display/display_manager.py b/squirrelbattle/display/display_manager.py index f7a0882..20cdb3c 100644 --- a/squirrelbattle/display/display_manager.py +++ b/squirrelbattle/display/display_manager.py @@ -6,8 +6,8 @@ from squirrelbattle.display.display import VerticalSplit, HorizontalSplit from squirrelbattle.display.mapdisplay import MapDisplay from squirrelbattle.display.messagedisplay import MessageDisplay from squirrelbattle.display.statsdisplay import StatsDisplay -from squirrelbattle.display.menudisplay import SettingsMenuDisplay, \ - MainMenuDisplay +from squirrelbattle.display.menudisplay import MainMenuDisplay, \ + InventoryDisplay, SettingsMenuDisplay from squirrelbattle.display.logsdisplay import LogsDisplay from squirrelbattle.display.texturepack import TexturePack from typing import Any @@ -23,10 +23,11 @@ class DisplayManager: pack = TexturePack.get_pack(self.game.settings.TEXTURE_PACK) self.mapdisplay = MapDisplay(screen, pack) self.statsdisplay = StatsDisplay(screen, pack) + self.logsdisplay = LogsDisplay(screen, pack) + self.inventorydisplay = InventoryDisplay(screen, pack) self.mainmenudisplay = MainMenuDisplay(self.game.main_menu, screen, pack) self.settingsmenudisplay = SettingsMenuDisplay(screen, pack) - self.logsdisplay = LogsDisplay(screen, pack) self.messagedisplay = MessageDisplay(screen=screen, pack=None) self.hbar = HorizontalSplit(screen, pack) self.vbar = VerticalSplit(screen, pack) @@ -46,6 +47,7 @@ class DisplayManager: d.pack = TexturePack.get_pack(self.game.settings.TEXTURE_PACK) self.mapdisplay.update_map(self.game.map) self.statsdisplay.update_player(self.game.player) + self.inventorydisplay.update_menu(self.game.inventory_menu) self.settingsmenudisplay.update_menu(self.game.settings_menu) self.logsdisplay.update_logs(self.game.logs) self.messagedisplay.update_message(self.game.message) @@ -64,10 +66,12 @@ class DisplayManager: self.rows // 5 - 1, self.cols * 4 // 5) self.hbar.refresh(self.rows * 4 // 5, 0, 1, self.cols * 4 // 5) self.vbar.refresh(0, self.cols * 4 // 5, self.rows, 1) - if self.game.state == GameMode.MAINMENU: + elif self.game.state == GameMode.INVENTORY: + self.inventorydisplay.refresh(0, 0, self.rows, self.cols) + elif self.game.state == GameMode.MAINMENU: self.mainmenudisplay.refresh(0, 0, self.rows, self.cols) - if self.game.state == GameMode.SETTINGS: - self.settingsmenudisplay.refresh(0, 0, self.rows, self.cols - 1) + elif self.game.state == GameMode.SETTINGS: + self.settingsmenudisplay.refresh(0, 0, self.rows, self.cols) if self.game.message: height, width = 0, 0 diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index b3036a0..5720faa 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -100,3 +100,8 @@ class MainMenuDisplay(Display): self.menudisplay.refresh( menuy, menux, min(self.menudisplay.preferred_height, self.height - menuy), menuwidth) + + +class InventoryDisplay(MenuDisplay): + def update_pad(self) -> None: + pass diff --git a/squirrelbattle/enums.py b/squirrelbattle/enums.py index 024f167..cd88e66 100644 --- a/squirrelbattle/enums.py +++ b/squirrelbattle/enums.py @@ -37,6 +37,7 @@ class KeyValues(Enum): LEFT = auto() RIGHT = auto() ENTER = auto() + INVENTORY = auto() SPACE = auto() @staticmethod @@ -58,6 +59,8 @@ class KeyValues(Enum): return KeyValues.UP elif key == settings.KEY_ENTER: return KeyValues.ENTER + elif key == settings.KEY_INVENTORY: + return KeyValues.INVENTORY elif key == ' ': return KeyValues.SPACE return None diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index 44ad349..d6045ce 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -39,6 +39,7 @@ class Game: self.main_menu = menus.MainMenu() self.settings_menu = menus.SettingsMenu() self.settings_menu.update_values(self.settings) + self.inventory_menu = menus.InventoryMenu() self.logs = Logs() self.message = None @@ -104,6 +105,8 @@ class Game: elif key == KeyValues.RIGHT: if self.player.move_right(): self.map.tick() + elif key == KeyValues.INVENTORY: + self.state = GameMode.INVENTORY elif key == KeyValues.SPACE: self.state = GameMode.MAINMENU diff --git a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po index dfd3365..55e3f1f 100644 --- a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-11-28 16:03+0100\n" +"POT-Creation-Date: 2020-12-04 14:18+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,8 +17,8 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: squirrelbattle/tests/game_test.py:284 squirrelbattle/tests/game_test.py:287 #: squirrelbattle/tests/translations_test.py:16 +#: squirrelbattle/tests/game_test.py:290 msgid "New game" msgstr "Neu Spiel" @@ -79,38 +79,42 @@ msgid "Key to validate a menu" msgstr "Menütaste" #: squirrelbattle/tests/translations_test.py:45 +msgid "Key used to open the inventory" +msgstr "Bestandtaste" + +#: squirrelbattle/tests/translations_test.py:47 msgid "Texture pack" msgstr "Textur-Packung" -#: squirrelbattle/tests/translations_test.py:46 +#: squirrelbattle/tests/translations_test.py:48 msgid "Language" msgstr "Sprache" -#: squirrelbattle/tests/translations_test.py:49 +#: squirrelbattle/tests/translations_test.py:51 msgid "player" msgstr "Spieler" -#: squirrelbattle/tests/translations_test.py:51 +#: squirrelbattle/tests/translations_test.py:53 msgid "tiger" msgstr "Tiger" -#: squirrelbattle/tests/translations_test.py:52 +#: squirrelbattle/tests/translations_test.py:54 msgid "hedgehog" msgstr "Igel" -#: squirrelbattle/tests/translations_test.py:53 +#: squirrelbattle/tests/translations_test.py:55 msgid "rabbit" msgstr "Kanninchen" -#: squirrelbattle/tests/translations_test.py:54 +#: squirrelbattle/tests/translations_test.py:56 msgid "teddy bear" msgstr "Teddybär" -#: squirrelbattle/tests/translations_test.py:56 +#: squirrelbattle/tests/translations_test.py:58 msgid "bomb" msgstr "Bombe" -#: squirrelbattle/tests/translations_test.py:57 +#: squirrelbattle/tests/translations_test.py:59 msgid "heart" msgstr "Herz" diff --git a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po index 3f563fa..972d853 100644 --- a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-11-28 16:03+0100\n" +"POT-Creation-Date: 2020-12-04 14:18+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,6 +38,7 @@ msgstr "" #: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:14 #: squirrelbattle/tests/game_test.py:284 squirrelbattle/tests/game_test.py:287 #: squirrelbattle/tests/translations_test.py:16 +#: squirrelbattle/tests/game_test.py:290 msgid "New game" msgstr "" @@ -145,12 +146,14 @@ msgstr "" #: squirrelbattle/settings.py:31 squirrelbattle/tests/translations_test.py:39 #: squirrelbattle/tests/translations_test.py:43 #: squirrelbattle/tests/translations_test.py:45 +#: squirrelbattle/tests/translations_test.py:47 msgid "Texture pack" msgstr "" #: squirrelbattle/settings.py:32 squirrelbattle/tests/translations_test.py:40 #: squirrelbattle/tests/translations_test.py:44 #: squirrelbattle/tests/translations_test.py:46 +#: squirrelbattle/tests/translations_test.py:48 msgid "Language" msgstr "" @@ -161,35 +164,46 @@ msgstr "" #: squirrelbattle/tests/translations_test.py:47 #: squirrelbattle/tests/translations_test.py:49 +#: squirrelbattle/tests/translations_test.py:51 msgid "player" msgstr "" #: squirrelbattle/tests/translations_test.py:49 #: squirrelbattle/tests/translations_test.py:51 +#: squirrelbattle/tests/translations_test.py:53 msgid "tiger" msgstr "" #: squirrelbattle/tests/translations_test.py:50 #: squirrelbattle/tests/translations_test.py:52 +#: squirrelbattle/tests/translations_test.py:54 msgid "hedgehog" msgstr "" #: squirrelbattle/tests/translations_test.py:51 #: squirrelbattle/tests/translations_test.py:53 +#: squirrelbattle/tests/translations_test.py:55 msgid "rabbit" msgstr "" #: squirrelbattle/tests/translations_test.py:52 #: squirrelbattle/tests/translations_test.py:54 +#: squirrelbattle/tests/translations_test.py:56 msgid "teddy bear" msgstr "" #: squirrelbattle/tests/translations_test.py:54 #: squirrelbattle/tests/translations_test.py:56 +#: squirrelbattle/tests/translations_test.py:58 msgid "bomb" msgstr "" #: squirrelbattle/tests/translations_test.py:55 #: squirrelbattle/tests/translations_test.py:57 +#: squirrelbattle/tests/translations_test.py:59 msgid "heart" msgstr "" + +#: squirrelbattle/tests/translations_test.py:45 +msgid "Key used to open the inventory" +msgstr "" diff --git a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po index d46cee6..647ab97 100644 --- a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-11-28 16:03+0100\n" +"POT-Creation-Date: 2020-12-04 14:18+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,43 +25,43 @@ msgstr "Inventaire :" msgid "YOU ARE DEAD" msgstr "VOUS ÊTES MORT" -#: squirrelbattle/interfaces.py:394 squirrelbattle/interfaces.py:398 +#: squirrelbattle/interfaces.py:398 #, python-brace-format msgid "{name} hits {opponent}." msgstr "{name} frappe {opponent}." -#: squirrelbattle/interfaces.py:405 squirrelbattle/interfaces.py:410 +#: squirrelbattle/interfaces.py:410 #, python-brace-format msgid "{name} takes {amount} damage." msgstr "{name} prend {amount} points de dégât." -#: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:14 -#: squirrelbattle/tests/game_test.py:284 squirrelbattle/tests/game_test.py:287 +#: squirrelbattle/menus.py:45 #: squirrelbattle/tests/translations_test.py:16 +#: squirrelbattle/tests/game_test.py:290 msgid "New game" msgstr "Nouvelle partie" -#: squirrelbattle/menus.py:46 squirrelbattle/tests/translations_test.py:15 +#: squirrelbattle/menus.py:46 #: squirrelbattle/tests/translations_test.py:17 msgid "Resume" msgstr "Continuer" -#: squirrelbattle/menus.py:47 squirrelbattle/tests/translations_test.py:17 +#: squirrelbattle/menus.py:47 #: squirrelbattle/tests/translations_test.py:19 msgid "Save" msgstr "Sauvegarder" -#: squirrelbattle/menus.py:48 squirrelbattle/tests/translations_test.py:16 +#: squirrelbattle/menus.py:48 #: squirrelbattle/tests/translations_test.py:18 msgid "Load" msgstr "Charger" -#: squirrelbattle/menus.py:49 squirrelbattle/tests/translations_test.py:18 +#: squirrelbattle/menus.py:49 #: squirrelbattle/tests/translations_test.py:20 msgid "Settings" msgstr "Paramètres" -#: squirrelbattle/menus.py:50 squirrelbattle/tests/translations_test.py:19 +#: squirrelbattle/menus.py:50 #: squirrelbattle/tests/translations_test.py:21 msgid "Exit" msgstr "Quitter" @@ -78,7 +78,7 @@ msgstr "" "Certaines clés de votre ficher de sauvegarde sont manquantes.\n" "Votre sauvegarde semble corrompue. Elle a été supprimée." -#: squirrelbattle/game.py:155 squirrelbattle/game.py:156 +#: squirrelbattle/game.py:156 msgid "" "No player was found on this map!\n" "Maybe you died?" @@ -86,7 +86,7 @@ msgstr "" "Aucun joueur n'a été trouvé sur la carte !\n" "Peut-être êtes-vous mort ?" -#: squirrelbattle/game.py:175 squirrelbattle/game.py:176 +#: squirrelbattle/game.py:176 msgid "" "The JSON file is not correct.\n" "Your save seems corrupted. It got deleted." @@ -94,108 +94,94 @@ msgstr "" "Le fichier JSON de sauvegarde est incorrect.\n" "Votre sauvegarde semble corrompue. Elle a été supprimée." -#: squirrelbattle/settings.py:21 squirrelbattle/tests/translations_test.py:21 -#: squirrelbattle/tests/translations_test.py:25 +#: squirrelbattle/settings.py:21 #: squirrelbattle/tests/translations_test.py:27 msgid "Main key to move up" msgstr "Touche principale pour aller vers le haut" -#: squirrelbattle/settings.py:22 squirrelbattle/tests/translations_test.py:23 -#: squirrelbattle/tests/translations_test.py:27 +#: squirrelbattle/settings.py:22 #: squirrelbattle/tests/translations_test.py:29 msgid "Secondary key to move up" msgstr "Touche secondaire pour aller vers le haut" -#: squirrelbattle/settings.py:23 squirrelbattle/tests/translations_test.py:25 -#: squirrelbattle/tests/translations_test.py:29 +#: squirrelbattle/settings.py:23 #: squirrelbattle/tests/translations_test.py:31 msgid "Main key to move down" msgstr "Touche principale pour aller vers le bas" -#: squirrelbattle/settings.py:24 squirrelbattle/tests/translations_test.py:27 -#: squirrelbattle/tests/translations_test.py:31 +#: squirrelbattle/settings.py:24 #: squirrelbattle/tests/translations_test.py:33 msgid "Secondary key to move down" msgstr "Touche secondaire pour aller vers le bas" -#: squirrelbattle/settings.py:25 squirrelbattle/tests/translations_test.py:29 -#: squirrelbattle/tests/translations_test.py:33 +#: squirrelbattle/settings.py:25 #: squirrelbattle/tests/translations_test.py:35 msgid "Main key to move left" msgstr "Touche principale pour aller vers la gauche" -#: squirrelbattle/settings.py:26 squirrelbattle/tests/translations_test.py:31 -#: squirrelbattle/tests/translations_test.py:35 +#: squirrelbattle/settings.py:26 #: squirrelbattle/tests/translations_test.py:37 msgid "Secondary key to move left" msgstr "Touche secondaire pour aller vers la gauche" -#: squirrelbattle/settings.py:27 squirrelbattle/tests/translations_test.py:33 -#: squirrelbattle/tests/translations_test.py:37 +#: squirrelbattle/settings.py:27 #: squirrelbattle/tests/translations_test.py:39 msgid "Main key to move right" msgstr "Touche principale pour aller vers la droite" -#: squirrelbattle/settings.py:29 squirrelbattle/tests/translations_test.py:35 -#: squirrelbattle/tests/translations_test.py:39 +#: squirrelbattle/settings.py:29 #: squirrelbattle/tests/translations_test.py:41 msgid "Secondary key to move right" msgstr "Touche secondaire pour aller vers la droite" -#: squirrelbattle/settings.py:30 squirrelbattle/tests/translations_test.py:37 -#: squirrelbattle/tests/translations_test.py:41 +#: squirrelbattle/settings.py:30 #: squirrelbattle/tests/translations_test.py:43 msgid "Key to validate a menu" msgstr "Touche pour valider un menu" -#: squirrelbattle/settings.py:31 squirrelbattle/tests/translations_test.py:39 -#: squirrelbattle/tests/translations_test.py:43 #: squirrelbattle/tests/translations_test.py:45 +msgid "Key used to open the inventory" +msgstr "Touche utilisée pour ouvrir l'inventaire" + +#: squirrelbattle/settings.py:31 +#: squirrelbattle/tests/translations_test.py:47 msgid "Texture pack" msgstr "Pack de textures" -#: squirrelbattle/settings.py:32 squirrelbattle/tests/translations_test.py:40 -#: squirrelbattle/tests/translations_test.py:44 -#: squirrelbattle/tests/translations_test.py:46 +#: squirrelbattle/settings.py:32 +#: squirrelbattle/tests/translations_test.py:48 msgid "Language" msgstr "Langue" -#: squirrelbattle/interfaces.py:407 squirrelbattle/interfaces.py:412 +#: squirrelbattle/interfaces.py:412 #, python-brace-format msgid "{name} dies." msgstr "{name} meurt." -#: squirrelbattle/tests/translations_test.py:47 -#: squirrelbattle/tests/translations_test.py:49 +#: squirrelbattle/tests/translations_test.py:51 msgid "player" msgstr "joueur" -#: squirrelbattle/tests/translations_test.py:49 -#: squirrelbattle/tests/translations_test.py:51 +#: squirrelbattle/tests/translations_test.py:53 msgid "tiger" msgstr "tigre" -#: squirrelbattle/tests/translations_test.py:50 -#: squirrelbattle/tests/translations_test.py:52 +#: squirrelbattle/tests/translations_test.py:54 msgid "hedgehog" msgstr "hérisson" -#: squirrelbattle/tests/translations_test.py:51 -#: squirrelbattle/tests/translations_test.py:53 +#: squirrelbattle/tests/translations_test.py:55 msgid "rabbit" msgstr "lapin" -#: squirrelbattle/tests/translations_test.py:52 -#: squirrelbattle/tests/translations_test.py:54 +#: squirrelbattle/tests/translations_test.py:56 msgid "teddy bear" msgstr "nounours" -#: squirrelbattle/tests/translations_test.py:54 -#: squirrelbattle/tests/translations_test.py:56 +#: squirrelbattle/tests/translations_test.py:58 msgid "bomb" msgstr "bombe" -#: squirrelbattle/tests/translations_test.py:55 -#: squirrelbattle/tests/translations_test.py:57 +#: squirrelbattle/tests/translations_test.py:59 msgid "heart" msgstr "cœur" diff --git a/squirrelbattle/menus.py b/squirrelbattle/menus.py index 4fcfabe..68c8c3e 100644 --- a/squirrelbattle/menus.py +++ b/squirrelbattle/menus.py @@ -115,3 +115,8 @@ class SettingsMenu(Menu): game.settings.write_settings() self.waiting_for_key = False self.update_values(game.settings) + + +class InventoryMenu(Menu): + # FIXME Use real menu + values = ["bomb"] diff --git a/squirrelbattle/settings.py b/squirrelbattle/settings.py index 3090679..a816d67 100644 --- a/squirrelbattle/settings.py +++ b/squirrelbattle/settings.py @@ -27,6 +27,7 @@ class Settings: self.KEY_RIGHT_PRIMARY = ['d', 'Main key to move right'] self.KEY_RIGHT_SECONDARY = ['KEY_RIGHT', 'Secondary key to move right'] self.KEY_ENTER = ['\n', 'Key to validate a menu'] + self.KEY_INVENTORY = ['i', 'Key used to open the inventory'] 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 a23b6f9..42886e5 100644 --- a/squirrelbattle/tests/game_test.py +++ b/squirrelbattle/tests/game_test.py @@ -266,6 +266,7 @@ class TestGame(unittest.TestCase): self.game.handle_key_pressed(KeyValues.DOWN) self.game.handle_key_pressed(KeyValues.DOWN) self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.DOWN) # Change texture pack self.assertEqual(self.game.settings.TEXTURE_PACK, "ascii") diff --git a/squirrelbattle/tests/settings_test.py b/squirrelbattle/tests/settings_test.py index b0d9739..06225b2 100644 --- a/squirrelbattle/tests/settings_test.py +++ b/squirrelbattle/tests/settings_test.py @@ -4,9 +4,13 @@ import unittest from squirrelbattle.settings import Settings +from squirrelbattle.translations import Translator class TestSettings(unittest.TestCase): + def setUp(self) -> None: + Translator.setlocale("en") + def test_settings(self) -> None: """ Ensure that settings are well loaded. diff --git a/squirrelbattle/tests/translations_test.py b/squirrelbattle/tests/translations_test.py index 6c18840..6d3a0e4 100644 --- a/squirrelbattle/tests/translations_test.py +++ b/squirrelbattle/tests/translations_test.py @@ -42,6 +42,8 @@ class TestTranslations(unittest.TestCase): "Touche secondaire pour aller vers la droite") self.assertEqual(_("Key to validate a menu"), "Touche pour valider un menu") + self.assertEqual(_("Key used to open the inventory"), + "Touche utilisée pour ouvrir l'inventaire") self.assertEqual(_("Texture pack"), "Pack de textures") self.assertEqual(_("Language"), "Langue") From 067570fd1abaeb3bda8d36af071227a7aab1772b Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 14:51:41 +0100 Subject: [PATCH 02/16] The inventory is a popup --- squirrelbattle/display/display_manager.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/squirrelbattle/display/display_manager.py b/squirrelbattle/display/display_manager.py index 20cdb3c..0e9cf04 100644 --- a/squirrelbattle/display/display_manager.py +++ b/squirrelbattle/display/display_manager.py @@ -53,7 +53,8 @@ class DisplayManager: self.messagedisplay.update_message(self.game.message) def refresh(self) -> None: - if self.game.state == GameMode.PLAY: + if self.game.state == GameMode.PLAY \ + or self.game.state == GameMode.INVENTORY: # The map pad has already the good size self.mapdisplay.refresh(0, 0, self.rows * 4 // 5, self.mapdisplay.pack.tile_width @@ -66,8 +67,11 @@ class DisplayManager: self.rows // 5 - 1, self.cols * 4 // 5) self.hbar.refresh(self.rows * 4 // 5, 0, 1, self.cols * 4 // 5) self.vbar.refresh(0, self.cols * 4 // 5, self.rows, 1) - elif self.game.state == GameMode.INVENTORY: - self.inventorydisplay.refresh(0, 0, self.rows, self.cols) + if self.game.state == GameMode.INVENTORY: + self.inventorydisplay.refresh(self.rows // 10, + self.cols // 2, + 8 * self.rows // 10, + 2 * self.cols // 5) elif self.game.state == GameMode.MAINMENU: self.mainmenudisplay.refresh(0, 0, self.rows, self.cols) elif self.game.state == GameMode.SETTINGS: From cdd527a7fd47e6b398b69cd717410c553b61474d Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 14:57:53 +0100 Subject: [PATCH 03/16] Close the inventory using the same key --- squirrelbattle/game.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index d6045ce..b4b3147 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -83,6 +83,8 @@ class Game: if self.state == GameMode.PLAY: self.handle_key_pressed_play(key) + elif self.state == GameMode.INVENTORY: + self.handle_key_pressed_inventory(key) elif self.state == GameMode.MAINMENU: self.handle_key_pressed_main_menu(key) elif self.state == GameMode.SETTINGS: @@ -110,6 +112,13 @@ class Game: elif key == KeyValues.SPACE: self.state = GameMode.MAINMENU + def handle_key_pressed_inventory(self, key: KeyValues) -> None: + """ + In the inventory menu, we can interact with items or close the menu. + """ + if key == KeyValues.SPACE or key == KeyValues.INVENTORY: + self.state = GameMode.PLAY + def handle_key_pressed_main_menu(self, key: KeyValues) -> None: """ In the main menu, we can navigate through options. From fbfcd5dae07eb4357957242571df340cfbbdab93 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 16:02:03 +0100 Subject: [PATCH 04/16] Inventory title --- squirrelbattle/display/menudisplay.py | 6 +- .../locale/de/LC_MESSAGES/squirrelbattle.po | 15 +++-- .../locale/en/LC_MESSAGES/squirrelbattle.po | 12 +++- .../locale/fr/LC_MESSAGES/squirrelbattle.po | 65 ++++++++----------- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index 5720faa..61ac155 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -1,6 +1,6 @@ # Copyright (C) 2020 by ÿnérant, eichhornchen, nicomarg, charlse # SPDX-License-Identifier: GPL-3.0-or-later - +import curses from typing import List from squirrelbattle.menus import Menu, MainMenu @@ -104,4 +104,6 @@ class MainMenuDisplay(Display): class InventoryDisplay(MenuDisplay): def update_pad(self) -> None: - pass + message = _("== INVENTORY ==") + self.addstr(self.pad, 0, (self.width - len(message)) // 2, message, + curses.A_BOLD | curses.A_ITALIC) diff --git a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po index 55e3f1f..01cb4aa 100644 --- a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 14:18+0100\n" +"POT-Creation-Date: 2020-12-04 15:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,8 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 +#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 +#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 msgid "New game" msgstr "Neu Spiel" @@ -145,7 +146,7 @@ msgstr "{name} stirbt." msgid "Back" msgstr "Zurück" -#: squirrelbattle/game.py:148 +#: squirrelbattle/game.py:148 squirrelbattle/game.py:160 msgid "" "Some keys are missing in your save file.\n" "Your save seems to be corrupt. It got deleted." @@ -153,7 +154,7 @@ msgstr "" "In Ihrer Speicherdatei fehlen einige Schlüssel.\n" "Ihre Speicherung scheint korrupt zu sein. Es wird gelöscht." -#: squirrelbattle/game.py:156 +#: squirrelbattle/game.py:156 squirrelbattle/game.py:168 msgid "" "No player was found on this map!\n" "Maybe you died?" @@ -161,10 +162,14 @@ msgstr "" "Auf dieser Karte wurde kein Spieler gefunden!\n" "Vielleicht sind Sie gestorben?" -#: squirrelbattle/game.py:176 +#: squirrelbattle/game.py:176 squirrelbattle/game.py:188 msgid "" "The JSON file is not correct.\n" "Your save seems corrupted. It got deleted." msgstr "" "Die JSON-Datei ist nicht korrekt.\n" "Ihre Speicherung scheint korrumpiert. Sie wurde gelöscht." + +#: squirrelbattle/display/menudisplay.py:107 +msgid "== INVENTORY ==" +msgstr "== BESTAND ==" diff --git a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po index 972d853..2081f69 100644 --- a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 14:18+0100\n" +"POT-Creation-Date: 2020-12-04 15:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -38,7 +38,8 @@ msgstr "" #: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:14 #: squirrelbattle/tests/game_test.py:284 squirrelbattle/tests/game_test.py:287 #: squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 +#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 +#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 msgid "New game" msgstr "" @@ -72,18 +73,21 @@ msgid "Back" msgstr "" #: squirrelbattle/game.py:147 squirrelbattle/game.py:148 +#: squirrelbattle/game.py:160 msgid "" "Some keys are missing in your save file.\n" "Your save seems to be corrupt. It got deleted." msgstr "" #: squirrelbattle/game.py:155 squirrelbattle/game.py:156 +#: squirrelbattle/game.py:168 msgid "" "No player was found on this map!\n" "Maybe you died?" msgstr "" #: squirrelbattle/game.py:175 squirrelbattle/game.py:176 +#: squirrelbattle/game.py:188 msgid "" "The JSON file is not correct.\n" "Your save seems corrupted. It got deleted." @@ -207,3 +211,7 @@ msgstr "" #: squirrelbattle/tests/translations_test.py:45 msgid "Key used to open the inventory" msgstr "" + +#: squirrelbattle/display/menudisplay.py:107 +msgid "== INVENTORY ==" +msgstr "" diff --git a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po index 647ab97..99abe43 100644 --- a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 14:18+0100\n" +"POT-Creation-Date: 2020-12-04 15:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -35,34 +35,29 @@ msgstr "{name} frappe {opponent}." msgid "{name} takes {amount} damage." msgstr "{name} prend {amount} points de dégât." -#: squirrelbattle/menus.py:45 -#: squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 +#: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:16 +#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 +#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 msgid "New game" msgstr "Nouvelle partie" -#: squirrelbattle/menus.py:46 -#: squirrelbattle/tests/translations_test.py:17 +#: squirrelbattle/menus.py:46 squirrelbattle/tests/translations_test.py:17 msgid "Resume" msgstr "Continuer" -#: squirrelbattle/menus.py:47 -#: squirrelbattle/tests/translations_test.py:19 +#: squirrelbattle/menus.py:47 squirrelbattle/tests/translations_test.py:19 msgid "Save" msgstr "Sauvegarder" -#: squirrelbattle/menus.py:48 -#: squirrelbattle/tests/translations_test.py:18 +#: squirrelbattle/menus.py:48 squirrelbattle/tests/translations_test.py:18 msgid "Load" msgstr "Charger" -#: squirrelbattle/menus.py:49 -#: squirrelbattle/tests/translations_test.py:20 +#: squirrelbattle/menus.py:49 squirrelbattle/tests/translations_test.py:20 msgid "Settings" msgstr "Paramètres" -#: squirrelbattle/menus.py:50 -#: squirrelbattle/tests/translations_test.py:21 +#: squirrelbattle/menus.py:50 squirrelbattle/tests/translations_test.py:21 msgid "Exit" msgstr "Quitter" @@ -71,6 +66,7 @@ msgid "Back" msgstr "Retour" #: squirrelbattle/game.py:147 squirrelbattle/game.py:148 +#: squirrelbattle/game.py:160 msgid "" "Some keys are missing in your save file.\n" "Your save seems to be corrupt. It got deleted." @@ -78,7 +74,7 @@ msgstr "" "Certaines clés de votre ficher de sauvegarde sont manquantes.\n" "Votre sauvegarde semble corrompue. Elle a été supprimée." -#: squirrelbattle/game.py:156 +#: squirrelbattle/game.py:156 squirrelbattle/game.py:168 msgid "" "No player was found on this map!\n" "Maybe you died?" @@ -86,7 +82,7 @@ msgstr "" "Aucun joueur n'a été trouvé sur la carte !\n" "Peut-être êtes-vous mort ?" -#: squirrelbattle/game.py:176 +#: squirrelbattle/game.py:176 squirrelbattle/game.py:188 msgid "" "The JSON file is not correct.\n" "Your save seems corrupted. It got deleted." @@ -94,48 +90,39 @@ msgstr "" "Le fichier JSON de sauvegarde est incorrect.\n" "Votre sauvegarde semble corrompue. Elle a été supprimée." -#: squirrelbattle/settings.py:21 -#: squirrelbattle/tests/translations_test.py:27 +#: squirrelbattle/settings.py:21 squirrelbattle/tests/translations_test.py:27 msgid "Main key to move up" msgstr "Touche principale pour aller vers le haut" -#: squirrelbattle/settings.py:22 -#: squirrelbattle/tests/translations_test.py:29 +#: squirrelbattle/settings.py:22 squirrelbattle/tests/translations_test.py:29 msgid "Secondary key to move up" msgstr "Touche secondaire pour aller vers le haut" -#: squirrelbattle/settings.py:23 -#: squirrelbattle/tests/translations_test.py:31 +#: squirrelbattle/settings.py:23 squirrelbattle/tests/translations_test.py:31 msgid "Main key to move down" msgstr "Touche principale pour aller vers le bas" -#: squirrelbattle/settings.py:24 -#: squirrelbattle/tests/translations_test.py:33 +#: squirrelbattle/settings.py:24 squirrelbattle/tests/translations_test.py:33 msgid "Secondary key to move down" msgstr "Touche secondaire pour aller vers le bas" -#: squirrelbattle/settings.py:25 -#: squirrelbattle/tests/translations_test.py:35 +#: squirrelbattle/settings.py:25 squirrelbattle/tests/translations_test.py:35 msgid "Main key to move left" msgstr "Touche principale pour aller vers la gauche" -#: squirrelbattle/settings.py:26 -#: squirrelbattle/tests/translations_test.py:37 +#: squirrelbattle/settings.py:26 squirrelbattle/tests/translations_test.py:37 msgid "Secondary key to move left" msgstr "Touche secondaire pour aller vers la gauche" -#: squirrelbattle/settings.py:27 -#: squirrelbattle/tests/translations_test.py:39 +#: squirrelbattle/settings.py:27 squirrelbattle/tests/translations_test.py:39 msgid "Main key to move right" msgstr "Touche principale pour aller vers la droite" -#: squirrelbattle/settings.py:29 -#: squirrelbattle/tests/translations_test.py:41 +#: squirrelbattle/settings.py:29 squirrelbattle/tests/translations_test.py:41 msgid "Secondary key to move right" msgstr "Touche secondaire pour aller vers la droite" -#: squirrelbattle/settings.py:30 -#: squirrelbattle/tests/translations_test.py:43 +#: squirrelbattle/settings.py:30 squirrelbattle/tests/translations_test.py:43 msgid "Key to validate a menu" msgstr "Touche pour valider un menu" @@ -143,13 +130,11 @@ msgstr "Touche pour valider un menu" msgid "Key used to open the inventory" msgstr "Touche utilisée pour ouvrir l'inventaire" -#: squirrelbattle/settings.py:31 -#: squirrelbattle/tests/translations_test.py:47 +#: squirrelbattle/settings.py:31 squirrelbattle/tests/translations_test.py:47 msgid "Texture pack" msgstr "Pack de textures" -#: squirrelbattle/settings.py:32 -#: squirrelbattle/tests/translations_test.py:48 +#: squirrelbattle/settings.py:32 squirrelbattle/tests/translations_test.py:48 msgid "Language" msgstr "Langue" @@ -185,3 +170,7 @@ msgstr "bombe" #: squirrelbattle/tests/translations_test.py:59 msgid "heart" msgstr "cœur" + +#: squirrelbattle/display/menudisplay.py:107 +msgid "== INVENTORY ==" +msgstr "== INVENTAIRE ==" From a68b3a6d0899a7d3481af7369e9a6607a53f8ab0 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 16:28:37 +0100 Subject: [PATCH 05/16] Display full inventory --- squirrelbattle/display/menudisplay.py | 15 +++++++++++++-- squirrelbattle/game.py | 1 + squirrelbattle/menus.py | 11 +++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index 61ac155..285b6db 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -21,8 +21,6 @@ class MenuDisplay(Display): # Menu values are printed in pad self.pad = self.newpad(self.trueheight, self.truewidth + 2) - for i in range(self.trueheight): - self.addstr(self.pad, i, 0, " " + self.values[i]) def update_pad(self) -> None: for i in range(self.trueheight): @@ -107,3 +105,16 @@ class InventoryDisplay(MenuDisplay): message = _("== INVENTORY ==") self.addstr(self.pad, 0, (self.width - len(message)) // 2, message, curses.A_BOLD | curses.A_ITALIC) + for i, item in enumerate(self.menu.values): + rep = self.pack[item.name.upper()] + selection = f"[{rep}]" if i == self.menu.position else f" {rep} " + self.addstr(self.pad, 2 + i, 0, selection + + " " + _(item.name).capitalize()) + + @property + def truewidth(self) -> int: + return max(1, self.height if hasattr(self, "height") else 10) + + @property + def trueheight(self) -> int: + return 2 + super().trueheight diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index b4b3147..f1171fa 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -55,6 +55,7 @@ class Game: self.map.add_entity(self.player) self.player.move(self.map.start_y, self.map.start_x) self.map.spawn_random_entities(randint(3, 10)) + self.inventory_menu.update_player(self.player) def run(self, screen: Any) -> None: """ diff --git a/squirrelbattle/menus.py b/squirrelbattle/menus.py index 68c8c3e..d6946d0 100644 --- a/squirrelbattle/menus.py +++ b/squirrelbattle/menus.py @@ -5,6 +5,7 @@ from enum import Enum from typing import Any, Optional from .display.texturepack import TexturePack +from .entities.player import Player from .enums import GameMode, KeyValues, DisplayActions from .settings import Settings from .translations import gettext as _, Translator @@ -118,5 +119,11 @@ class SettingsMenu(Menu): class InventoryMenu(Menu): - # FIXME Use real menu - values = ["bomb"] + player: Player + + def update_player(self, player: Player) -> None: + self.player = player + + @property + def values(self) -> list: + return self.player.inventory From 0da74867508898638938279ce00ad4387bcbfc9f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 16:31:15 +0100 Subject: [PATCH 06/16] Navigate through inventory menu --- squirrelbattle/game.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index f1171fa..71ff9dc 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -119,6 +119,10 @@ class Game: """ if key == KeyValues.SPACE or key == KeyValues.INVENTORY: self.state = GameMode.PLAY + elif key == KeyValues.UP: + self.inventory_menu.go_up() + elif key == KeyValues.DOWN: + self.inventory_menu.go_down() def handle_key_pressed_main_menu(self, key: KeyValues) -> None: """ From c7545e53f75ca32d22b06a9840f7da670fa399d9 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 16:53:27 +0100 Subject: [PATCH 07/16] Items can be dropped/equipped/used --- squirrelbattle/entities/items.py | 40 ++++++++++++++++++++++++-------- squirrelbattle/enums.py | 9 +++++++ squirrelbattle/game.py | 6 +++++ squirrelbattle/settings.py | 3 +++ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index 147d72c..6bd1912 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -20,16 +20,26 @@ class Item(Entity): self.held = held self.held_by = held_by - def drop(self, y: int, x: int) -> None: + def drop(self) -> None: """ The item is dropped from the inventory onto the floor """ if self.held: self.held_by.inventory.remove(self) + self.map.add_entity(self) + self.move(self.held_by.y, self.held_by.x) self.held = False self.held_by = None - self.map.add_entity(self) - self.move(y, x) + + def use(self) -> None: + """ + Indicates what should be done when the item is used. + """ + + def equip(self) -> None: + """ + Indicates what should be done when the item is equipped. + """ def hold(self, player: "Player") -> None: """ @@ -80,6 +90,7 @@ class Bomb(Item): A bomb item intended to deal damage to enemies at long range """ damage: int = 5 + tick: int exploding: bool def __init__(self, damage: int = 5, exploding: bool = False, @@ -87,20 +98,29 @@ class Bomb(Item): super().__init__(name="bomb", *args, **kwargs) self.damage = damage self.exploding = exploding + self.tick = 5 - def drop(self, x: int, y: int) -> None: - super().drop(x, y) - self.exploding = True + def use(self) -> None: + """ + When the bomb is used, throw it and explodes it. + """ + if self.held: + super().drop() + self.exploding = True def act(self, m: Map) -> None: """ Special exploding action of the bomb """ if self.exploding: - for e in m.entities.copy(): - if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \ - isinstance(e, FightingEntity): - e.take_damage(self, self.damage) + if self.tick > 0: + self.tick -= 1 + else: + for e in m.entities.copy(): + if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \ + isinstance(e, FightingEntity): + e.take_damage(self, self.damage) + m.entities.remove(self) def save_state(self) -> dict: """ diff --git a/squirrelbattle/enums.py b/squirrelbattle/enums.py index cd88e66..84eb498 100644 --- a/squirrelbattle/enums.py +++ b/squirrelbattle/enums.py @@ -38,6 +38,9 @@ class KeyValues(Enum): RIGHT = auto() ENTER = auto() INVENTORY = auto() + USE = auto() + EQUIP = auto() + DROP = auto() SPACE = auto() @staticmethod @@ -61,6 +64,12 @@ class KeyValues(Enum): return KeyValues.ENTER elif key == settings.KEY_INVENTORY: return KeyValues.INVENTORY + elif key == settings.KEY_USE: + return KeyValues.USE + elif key == settings.KEY_EQUIP: + return KeyValues.EQUIP + elif key == settings.KEY_DROP: + return KeyValues.DROP elif key == ' ': return KeyValues.SPACE return None diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index 71ff9dc..f9f8881 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -123,6 +123,12 @@ class Game: self.inventory_menu.go_up() elif key == KeyValues.DOWN: self.inventory_menu.go_down() + elif key == KeyValues.USE: + self.inventory_menu.validate().use() + elif key == KeyValues.EQUIP: + self.inventory_menu.validate().equip() + elif key == KeyValues.DROP: + self.inventory_menu.validate().use() def handle_key_pressed_main_menu(self, key: KeyValues) -> None: """ diff --git a/squirrelbattle/settings.py b/squirrelbattle/settings.py index a816d67..7460b98 100644 --- a/squirrelbattle/settings.py +++ b/squirrelbattle/settings.py @@ -28,6 +28,9 @@ class Settings: self.KEY_RIGHT_SECONDARY = ['KEY_RIGHT', 'Secondary key to move right'] self.KEY_ENTER = ['\n', 'Key to validate a menu'] self.KEY_INVENTORY = ['i', 'Key used to open the inventory'] + 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 = ['d', 'Key used to drop an item in the inventory'] self.TEXTURE_PACK = ['ascii', 'Texture pack'] self.LOCALE = [locale.getlocale()[0][:2], 'Language'] From 056ca5cca8cb1ec17a9083348bd62d2d3450e35f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 17:01:00 +0100 Subject: [PATCH 08/16] Ensure that the inventory is not empty before interacting with an item --- squirrelbattle/game.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index f9f8881..ed576ed 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -123,12 +123,18 @@ class Game: self.inventory_menu.go_up() elif key == KeyValues.DOWN: self.inventory_menu.go_down() - elif key == KeyValues.USE: - self.inventory_menu.validate().use() - elif key == KeyValues.EQUIP: - self.inventory_menu.validate().equip() - elif key == KeyValues.DROP: - self.inventory_menu.validate().use() + if self.inventory_menu.values: + if key == KeyValues.USE: + self.inventory_menu.validate().use() + elif key == KeyValues.EQUIP: + self.inventory_menu.validate().equip() + elif key == KeyValues.DROP: + self.inventory_menu.validate().use() + + # Ensure that the cursor has a good position + self.inventory_menu.position = min(self.inventory_menu.position, + len(self.inventory_menu.values) + - 1) def handle_key_pressed_main_menu(self, key: KeyValues) -> None: """ From 27fd73c96ba9818cab8697d919135e6e2f4ba0bb Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 17:10:23 +0100 Subject: [PATCH 09/16] Add log messages when a bomb is exploding --- squirrelbattle/entities/items.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index 6bd1912..c95ab9d 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -1,10 +1,12 @@ # Copyright (C) 2020 by ÿnérant, eichhornchen, nicomarg, charlse # SPDX-License-Identifier: GPL-3.0-or-later +from random import randint from typing import Optional from .player import Player from ..interfaces import Entity, FightingEntity, Map +from ..translations import gettext as _ class Item(Entity): @@ -90,6 +92,7 @@ class Bomb(Item): A bomb item intended to deal damage to enemies at long range """ damage: int = 5 + owner: "Player" tick: int exploding: bool @@ -98,13 +101,14 @@ class Bomb(Item): super().__init__(name="bomb", *args, **kwargs) self.damage = damage self.exploding = exploding - self.tick = 5 + self.tick = 4 def use(self) -> None: """ When the bomb is used, throw it and explodes it. """ if self.held: + self.owner = self.held_by super().drop() self.exploding = True @@ -114,12 +118,20 @@ class Bomb(Item): """ if self.exploding: if self.tick > 0: + # The bomb will explode in moves self.tick -= 1 else: + # The bomb is exploding. + # Each entity that is close to the bomb takes damages. + # The player earn XP if the entity was killed. + log_message = _("Bomb is exploding.") for e in m.entities.copy(): - if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \ + if abs(e.x - self.x) + abs(e.y - self.y) <= 3 and \ isinstance(e, FightingEntity): - e.take_damage(self, self.damage) + log_message += " " + e.take_damage(self, self.damage) + if e.dead: + self.owner.add_xp(randint(3, 7)) + m.logs.add_message(log_message) m.entities.remove(self) def save_state(self) -> dict: From 5b4dc601bc83e44f1ea63e8ff6bd10ba94806394 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 17:15:41 +0100 Subject: [PATCH 10/16] Fix broken tests --- squirrelbattle/tests/entities_test.py | 15 ++++++++++----- squirrelbattle/tests/game_test.py | 8 ++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/squirrelbattle/tests/entities_test.py b/squirrelbattle/tests/entities_test.py index 371bfc7..efd3397 100644 --- a/squirrelbattle/tests/entities_test.py +++ b/squirrelbattle/tests/entities_test.py @@ -97,12 +97,13 @@ class TestEntities(unittest.TestCase): self.assertFalse(item.held) item.hold(self.player) self.assertTrue(item.held) - item.drop(2, 6) - self.assertEqual(item.y, 2) + item.drop() + self.assertEqual(item.y, 1) self.assertEqual(item.x, 6) # Pick up item - self.player.move_down() + self.player.move_left() + self.player.move_right() self.assertTrue(item.held) self.assertEqual(item.held_by, self.player) self.assertIn(item, self.player.inventory) @@ -125,10 +126,14 @@ class TestEntities(unittest.TestCase): item.act(self.map) self.assertFalse(hedgehog.dead) self.assertFalse(teddy_bear.dead) - item.drop(42, 42) + self.player.move(42, 42) + item.hold(self.player) + item.use() self.assertEqual(item.y, 42) self.assertEqual(item.x, 42) - item.act(self.map) + # Wait for the explosion + for ignored in range(5): + item.act(self.map) self.assertTrue(hedgehog.dead) self.assertTrue(teddy_bear.dead) bomb_state = item.save_state() diff --git a/squirrelbattle/tests/game_test.py b/squirrelbattle/tests/game_test.py index 42886e5..fd3ec3e 100644 --- a/squirrelbattle/tests/game_test.py +++ b/squirrelbattle/tests/game_test.py @@ -261,12 +261,8 @@ class TestGame(unittest.TestCase): self.assertEqual(self.game.settings.KEY_LEFT_PRIMARY, 'a') # Navigate to "texture pack" - self.game.handle_key_pressed(KeyValues.DOWN) - self.game.handle_key_pressed(KeyValues.DOWN) - self.game.handle_key_pressed(KeyValues.DOWN) - self.game.handle_key_pressed(KeyValues.DOWN) - self.game.handle_key_pressed(KeyValues.DOWN) - self.game.handle_key_pressed(KeyValues.DOWN) + for ignored in range(9): + self.game.handle_key_pressed(KeyValues.DOWN) # Change texture pack self.assertEqual(self.game.settings.TEXTURE_PACK, "ascii") From 91a4514649bbf856b8261d453616ead67085ad45 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 17:19:06 +0100 Subject: [PATCH 11/16] 'D' is not an intelligent key to drop an item --- squirrelbattle/game.py | 2 +- squirrelbattle/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index ed576ed..ff5d465 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -129,7 +129,7 @@ class Game: elif key == KeyValues.EQUIP: self.inventory_menu.validate().equip() elif key == KeyValues.DROP: - self.inventory_menu.validate().use() + self.inventory_menu.validate().drop() # Ensure that the cursor has a good position self.inventory_menu.position = min(self.inventory_menu.position, diff --git a/squirrelbattle/settings.py b/squirrelbattle/settings.py index 7460b98..4004645 100644 --- a/squirrelbattle/settings.py +++ b/squirrelbattle/settings.py @@ -30,7 +30,7 @@ class Settings: self.KEY_INVENTORY = ['i', 'Key used to open the inventory'] 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 = ['d', 'Key used to drop an item in the inventory'] + self.KEY_DROP = ['r', 'Key used to drop an item in the inventory'] self.TEXTURE_PACK = ['ascii', 'Texture pack'] self.LOCALE = [locale.getlocale()[0][:2], 'Language'] From 4b9399c687fb95ee7efacbdd9b3b47ca27552beb Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 4 Dec 2020 18:16:46 +0100 Subject: [PATCH 12/16] Test inventory --- squirrelbattle/entities/items.py | 5 ++- squirrelbattle/tests/game_test.py | 74 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index c95ab9d..4800a58 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -92,9 +92,9 @@ class Bomb(Item): A bomb item intended to deal damage to enemies at long range """ damage: int = 5 - owner: "Player" - tick: int exploding: bool + owner: Optional["Player"] + tick: int def __init__(self, damage: int = 5, exploding: bool = False, *args, **kwargs): @@ -102,6 +102,7 @@ class Bomb(Item): self.damage = damage self.exploding = exploding self.tick = 4 + self.owner = None def use(self) -> None: """ diff --git a/squirrelbattle/tests/game_test.py b/squirrelbattle/tests/game_test.py index fd3ec3e..f0120eb 100644 --- a/squirrelbattle/tests/game_test.py +++ b/squirrelbattle/tests/game_test.py @@ -7,6 +7,7 @@ import unittest from ..bootstrap import Bootstrap from ..display.display import Display from ..display.display_manager import DisplayManager +from ..entities.items import Bomb from ..entities.player import Player from ..enums import DisplayActions from ..game import Game, KeyValues, GameMode @@ -107,6 +108,18 @@ class TestGame(unittest.TestCase): self.assertEqual(KeyValues.translate_key( self.game.settings.KEY_ENTER, self.game.settings), KeyValues.ENTER) + self.assertEqual(KeyValues.translate_key( + self.game.settings.KEY_INVENTORY, self.game.settings), + KeyValues.INVENTORY) + self.assertEqual(KeyValues.translate_key( + self.game.settings.KEY_USE, self.game.settings), + KeyValues.USE) + self.assertEqual(KeyValues.translate_key( + self.game.settings.KEY_EQUIP, self.game.settings), + KeyValues.EQUIP) + self.assertEqual(KeyValues.translate_key( + self.game.settings.KEY_DROP, self.game.settings), + KeyValues.DROP) self.assertEqual(KeyValues.translate_key(' ', self.game.settings), KeyValues.SPACE) self.assertEqual(KeyValues.translate_key('plop', self.game.settings), @@ -334,3 +347,64 @@ class TestGame(unittest.TestCase): self.game.display_actions(DisplayActions.REFRESH) self.game.handle_key_pressed(None, "random key") self.assertIsNone(self.game.message) + + def test_inventory_menu(self) -> None: + """ + Open the inventory menu and interact with items. + """ + self.game.state = GameMode.PLAY + # Open and close the inventory + self.game.handle_key_pressed(KeyValues.INVENTORY) + self.assertEqual(self.game.state, GameMode.INVENTORY) + self.game.handle_key_pressed(KeyValues.SPACE) + self.assertEqual(self.game.state, GameMode.PLAY) + + # Add five bombs in the inventory + for ignored in range(5): + bomb = Bomb() + bomb.map = self.game.map + bomb.map.add_entity(bomb) + bomb.hold(self.game.player) + + self.game.handle_key_pressed(KeyValues.INVENTORY) + self.assertEqual(self.game.state, GameMode.INVENTORY) + + # Navigate in the menu + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.DOWN) + self.assertEqual(self.game.inventory_menu.position, 3) + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.DOWN) + self.game.handle_key_pressed(KeyValues.UP) + self.game.handle_key_pressed(KeyValues.DOWN) + self.assertEqual(self.game.inventory_menu.position, 4) + + # Equip key does nothing + self.game.handle_key_pressed(KeyValues.EQUIP) + + # Drop an item + bomb = self.game.player.inventory[-1] + self.assertEqual(self.game.inventory_menu.validate(), bomb) + self.assertTrue(bomb.held) + self.assertEqual(bomb.held_by, self.game.player) + self.game.handle_key_pressed(KeyValues.DROP) + self.assertFalse(bomb.held) + self.assertIsNone(bomb.held_by) + self.assertIsNone(bomb.owner) + self.assertFalse(bomb.exploding) + self.assertEqual(bomb.y, self.game.player.y) + self.assertEqual(bomb.x, self.game.player.x) + + # Use the bomb + bomb = self.game.player.inventory[-1] + self.assertEqual(self.game.inventory_menu.validate(), bomb) + self.assertTrue(bomb.held) + self.assertEqual(bomb.held_by, self.game.player) + self.game.handle_key_pressed(KeyValues.USE) + self.assertFalse(bomb.held) + self.assertIsNone(bomb.held_by) + self.assertEqual(bomb.owner, self.game.player) + self.assertTrue(bomb.exploding) + self.assertEqual(bomb.y, self.game.player.y) + self.assertEqual(bomb.x, self.game.player.x) From 25c42ea9e8be051c7f457fca2279146dd0fd3bda Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 5 Dec 2020 13:07:37 +0100 Subject: [PATCH 13/16] Don't translate in english since it is the main language --- setup.py | 2 +- .../locale/en/LC_MESSAGES/squirrelbattle.po | 217 ------------------ squirrelbattle/translations.py | 3 + 3 files changed, 4 insertions(+), 218 deletions(-) delete mode 100644 squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po diff --git a/setup.py b/setup.py index f051bbb..573eea7 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,7 @@ with open("README.md", "r") as f: long_description = f.read() # Compile messages -for language in ["de", "en", "fr"]: +for language in ["de", "fr"]: args = ["msgfmt", "--check-format", "-o", f"squirrelbattle/locale/{language}/LC_MESSAGES" "/squirrelbattle.mo", diff --git a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po deleted file mode 100644 index 2081f69..0000000 --- a/squirrelbattle/locale/en/LC_MESSAGES/squirrelbattle.po +++ /dev/null @@ -1,217 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ÿnérant, eichhornchen, nicomarg, charlse -# This file is distributed under the same license as the squirrelbattle package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: squirrelbattle 3.14.1\n" -"Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 15:59+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: squirrelbattle/display/statsdisplay.py:34 -msgid "Inventory:" -msgstr "" - -#: squirrelbattle/display/statsdisplay.py:39 -msgid "YOU ARE DEAD" -msgstr "" - -#: squirrelbattle/interfaces.py:394 squirrelbattle/interfaces.py:398 -#, python-brace-format -msgid "{name} hits {opponent}." -msgstr "" - -#: squirrelbattle/interfaces.py:405 squirrelbattle/interfaces.py:410 -#, python-brace-format -msgid "{name} takes {amount} damage." -msgstr "" - -#: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:14 -#: squirrelbattle/tests/game_test.py:284 squirrelbattle/tests/game_test.py:287 -#: squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 -#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 -msgid "New game" -msgstr "" - -#: squirrelbattle/menus.py:46 squirrelbattle/tests/translations_test.py:15 -#: squirrelbattle/tests/translations_test.py:17 -msgid "Resume" -msgstr "" - -#: squirrelbattle/menus.py:47 squirrelbattle/tests/translations_test.py:17 -#: squirrelbattle/tests/translations_test.py:19 -msgid "Save" -msgstr "" - -#: squirrelbattle/menus.py:48 squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/translations_test.py:18 -msgid "Load" -msgstr "" - -#: squirrelbattle/menus.py:49 squirrelbattle/tests/translations_test.py:18 -#: squirrelbattle/tests/translations_test.py:20 -msgid "Settings" -msgstr "" - -#: squirrelbattle/menus.py:50 squirrelbattle/tests/translations_test.py:19 -#: squirrelbattle/tests/translations_test.py:21 -msgid "Exit" -msgstr "" - -#: squirrelbattle/menus.py:71 -msgid "Back" -msgstr "" - -#: squirrelbattle/game.py:147 squirrelbattle/game.py:148 -#: squirrelbattle/game.py:160 -msgid "" -"Some keys are missing in your save file.\n" -"Your save seems to be corrupt. It got deleted." -msgstr "" - -#: squirrelbattle/game.py:155 squirrelbattle/game.py:156 -#: squirrelbattle/game.py:168 -msgid "" -"No player was found on this map!\n" -"Maybe you died?" -msgstr "" - -#: squirrelbattle/game.py:175 squirrelbattle/game.py:176 -#: squirrelbattle/game.py:188 -msgid "" -"The JSON file is not correct.\n" -"Your save seems corrupted. It got deleted." -msgstr "" - -#: squirrelbattle/settings.py:21 squirrelbattle/tests/translations_test.py:21 -#: squirrelbattle/tests/translations_test.py:25 -#: squirrelbattle/tests/translations_test.py:27 -msgid "Main key to move up" -msgstr "" - -#: squirrelbattle/settings.py:22 squirrelbattle/tests/translations_test.py:23 -#: squirrelbattle/tests/translations_test.py:27 -#: squirrelbattle/tests/translations_test.py:29 -msgid "Secondary key to move up" -msgstr "" - -#: squirrelbattle/settings.py:23 squirrelbattle/tests/translations_test.py:25 -#: squirrelbattle/tests/translations_test.py:29 -#: squirrelbattle/tests/translations_test.py:31 -msgid "Main key to move down" -msgstr "" - -#: squirrelbattle/settings.py:24 squirrelbattle/tests/translations_test.py:27 -#: squirrelbattle/tests/translations_test.py:31 -#: squirrelbattle/tests/translations_test.py:33 -msgid "Secondary key to move down" -msgstr "" - -#: squirrelbattle/settings.py:25 squirrelbattle/tests/translations_test.py:29 -#: squirrelbattle/tests/translations_test.py:33 -#: squirrelbattle/tests/translations_test.py:35 -msgid "Main key to move left" -msgstr "" - -#: squirrelbattle/settings.py:26 squirrelbattle/tests/translations_test.py:31 -#: squirrelbattle/tests/translations_test.py:35 -#: squirrelbattle/tests/translations_test.py:37 -msgid "Secondary key to move left" -msgstr "" - -#: squirrelbattle/settings.py:27 squirrelbattle/tests/translations_test.py:33 -#: squirrelbattle/tests/translations_test.py:37 -#: squirrelbattle/tests/translations_test.py:39 -msgid "Main key to move right" -msgstr "" - -#: squirrelbattle/settings.py:29 squirrelbattle/tests/translations_test.py:35 -#: squirrelbattle/tests/translations_test.py:39 -#: squirrelbattle/tests/translations_test.py:41 -msgid "Secondary key to move right" -msgstr "" - -#: squirrelbattle/settings.py:30 squirrelbattle/tests/translations_test.py:37 -#: squirrelbattle/tests/translations_test.py:41 -#: squirrelbattle/tests/translations_test.py:43 -msgid "Key to validate a menu" -msgstr "" - -#: squirrelbattle/settings.py:31 squirrelbattle/tests/translations_test.py:39 -#: squirrelbattle/tests/translations_test.py:43 -#: squirrelbattle/tests/translations_test.py:45 -#: squirrelbattle/tests/translations_test.py:47 -msgid "Texture pack" -msgstr "" - -#: squirrelbattle/settings.py:32 squirrelbattle/tests/translations_test.py:40 -#: squirrelbattle/tests/translations_test.py:44 -#: squirrelbattle/tests/translations_test.py:46 -#: squirrelbattle/tests/translations_test.py:48 -msgid "Language" -msgstr "" - -#: squirrelbattle/interfaces.py:407 squirrelbattle/interfaces.py:412 -#, python-brace-format -msgid "{name} dies." -msgstr "" - -#: squirrelbattle/tests/translations_test.py:47 -#: squirrelbattle/tests/translations_test.py:49 -#: squirrelbattle/tests/translations_test.py:51 -msgid "player" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:49 -#: squirrelbattle/tests/translations_test.py:51 -#: squirrelbattle/tests/translations_test.py:53 -msgid "tiger" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:50 -#: squirrelbattle/tests/translations_test.py:52 -#: squirrelbattle/tests/translations_test.py:54 -msgid "hedgehog" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:51 -#: squirrelbattle/tests/translations_test.py:53 -#: squirrelbattle/tests/translations_test.py:55 -msgid "rabbit" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:52 -#: squirrelbattle/tests/translations_test.py:54 -#: squirrelbattle/tests/translations_test.py:56 -msgid "teddy bear" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:54 -#: squirrelbattle/tests/translations_test.py:56 -#: squirrelbattle/tests/translations_test.py:58 -msgid "bomb" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:55 -#: squirrelbattle/tests/translations_test.py:57 -#: squirrelbattle/tests/translations_test.py:59 -msgid "heart" -msgstr "" - -#: squirrelbattle/tests/translations_test.py:45 -msgid "Key used to open the inventory" -msgstr "" - -#: squirrelbattle/display/menudisplay.py:107 -msgid "== INVENTORY ==" -msgstr "" diff --git a/squirrelbattle/translations.py b/squirrelbattle/translations.py index f532bb0..5ce8986 100644 --- a/squirrelbattle/translations.py +++ b/squirrelbattle/translations.py @@ -53,6 +53,9 @@ class Translator: Analyse all strings in the project and extract them. """ for language in cls.SUPPORTED_LOCALES: + if language == "en": + # Don't translate the main language + continue file_name = Path(__file__).parent / "locale" / language \ / "LC_MESSAGES" / "squirrelbattle.po" args = ["find", "squirrelbattle", "-iname", "*.py"] From 013e81b3c0cce15f00b9ae305641e4acbe7efcee Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 5 Dec 2020 13:13:04 +0100 Subject: [PATCH 14/16] Better sort in translation files, remove unwanted headers --- squirrelbattle/translations.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/squirrelbattle/translations.py b/squirrelbattle/translations.py index 5ce8986..d5ac3e2 100644 --- a/squirrelbattle/translations.py +++ b/squirrelbattle/translations.py @@ -3,6 +3,7 @@ import gettext as gt import os +import re import subprocess from pathlib import Path from typing import Any, List @@ -68,9 +69,14 @@ class Translator: "--copyright-holder=ÿnérant, eichhornchen, " "nicomarg, charlse", "--msgid-bugs-address=squirrel-battle@crans.org", + "--sort-by-file", "-o", file_name] if file_name.is_file(): args.append("--join-existing") + with open(file_name, "r") as f: + content = f.read() + with open(file_name, "w") as f: + f.write(re.sub("#:.*\n", "", content)) print(f"Make {language} messages...") subprocess.Popen(args, stdin=find.stdout).wait() From bc40f8d0e667a49301c80bba458bc4550d62868f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 5 Dec 2020 13:19:04 +0100 Subject: [PATCH 15/16] Some translations were missing in the settings menu --- .../locale/de/LC_MESSAGES/squirrelbattle.po | 151 +++++++++------- .../locale/fr/LC_MESSAGES/squirrelbattle.po | 170 ++++++++++-------- squirrelbattle/tests/translations_test.py | 6 + squirrelbattle/translations.py | 2 + 4 files changed, 187 insertions(+), 142 deletions(-) diff --git a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po index 01cb4aa..0d20e90 100644 --- a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 15:59+0100\n" +"POT-Creation-Date: 2020-12-05 13:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,9 +17,71 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: squirrelbattle/display/menudisplay.py:105 +msgid "== INVENTORY ==" +msgstr "== BESTAND ==" + +#: squirrelbattle/display/statsdisplay.py:34 +msgid "Inventory:" +msgstr "Bestand:" + +#: squirrelbattle/display/statsdisplay.py:39 +msgid "YOU ARE DEAD" +msgstr "SIE WURDEN GESTORBEN" + +#. The bomb is exploding. +#. Each entity that is close to the bomb takes damages. +#. The player earn XP if the entity was killed. +#: squirrelbattle/entities/items.py:129 +msgid "Bomb is exploding." +msgstr "" + +#: squirrelbattle/game.py:177 +msgid "" +"Some keys are missing in your save file.\n" +"Your save seems to be corrupt. It got deleted." +msgstr "" +"In Ihrer Speicherdatei fehlen einige Schlüssel.\n" +"Ihre Speicherung scheint korrupt zu sein. Es wird gelöscht." + +#: squirrelbattle/game.py:185 +msgid "" +"No player was found on this map!\n" +"Maybe you died?" +msgstr "" +"Auf dieser Karte wurde kein Spieler gefunden!\n" +"Vielleicht sind Sie gestorben?" + +#: squirrelbattle/game.py:205 +msgid "" +"The JSON file is not correct.\n" +"Your save seems corrupted. It got deleted." +msgstr "" +"Die JSON-Datei ist nicht korrekt.\n" +"Ihre Speicherung scheint korrumpiert. Sie wurde gelöscht." + +#: squirrelbattle/interfaces.py:398 +#, python-brace-format +msgid "{name} hits {opponent}." +msgstr "{name} schlägt {opponent}." + +#: squirrelbattle/interfaces.py:410 +#, python-brace-format +msgid "{name} takes {amount} damage." +msgstr "{name} nimmt {amount} Schadenspunkte." + +#: squirrelbattle/interfaces.py:412 +#, python-brace-format +msgid "{name} dies." +msgstr "{name} stirbt." + +#: squirrelbattle/menus.py:72 +msgid "Back" +msgstr "Zurück" + +#: squirrelbattle/tests/game_test.py:294 squirrelbattle/tests/game_test.py:297 +#: squirrelbattle/tests/game_test.py:300 #: squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 -#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 msgid "New game" msgstr "Neu Spiel" @@ -84,92 +146,49 @@ msgid "Key used to open the inventory" msgstr "Bestandtaste" #: squirrelbattle/tests/translations_test.py:47 +msgid "Key used to use an item in the inventory" +msgstr "Taste um eines Objekts im Bestand zu verwenden" + +#: squirrelbattle/tests/translations_test.py:49 +msgid "Key used to equip an item in the inventory" +msgstr "Taste um eines Objekts im Bestand auszurüsten" + +#: squirrelbattle/tests/translations_test.py:51 +msgid "Key used to drop an item in the inventory" +msgstr "Taste um eines Objekts im Bestand zu werfen" + +#: squirrelbattle/tests/translations_test.py:53 msgid "Texture pack" msgstr "Textur-Packung" -#: squirrelbattle/tests/translations_test.py:48 +#: squirrelbattle/tests/translations_test.py:54 msgid "Language" msgstr "Sprache" -#: squirrelbattle/tests/translations_test.py:51 +#: squirrelbattle/tests/translations_test.py:57 msgid "player" msgstr "Spieler" -#: squirrelbattle/tests/translations_test.py:53 +#: squirrelbattle/tests/translations_test.py:59 msgid "tiger" msgstr "Tiger" -#: squirrelbattle/tests/translations_test.py:54 +#: squirrelbattle/tests/translations_test.py:60 msgid "hedgehog" msgstr "Igel" -#: squirrelbattle/tests/translations_test.py:55 +#: squirrelbattle/tests/translations_test.py:61 msgid "rabbit" msgstr "Kanninchen" -#: squirrelbattle/tests/translations_test.py:56 +#: squirrelbattle/tests/translations_test.py:62 msgid "teddy bear" msgstr "Teddybär" -#: squirrelbattle/tests/translations_test.py:58 +#: squirrelbattle/tests/translations_test.py:64 msgid "bomb" msgstr "Bombe" -#: squirrelbattle/tests/translations_test.py:59 +#: squirrelbattle/tests/translations_test.py:65 msgid "heart" msgstr "Herz" - -#: squirrelbattle/display/statsdisplay.py:34 -msgid "Inventory:" -msgstr "Bestand:" - -#: squirrelbattle/display/statsdisplay.py:39 -msgid "YOU ARE DEAD" -msgstr "SIE WURDEN GESTORBEN" - -#: squirrelbattle/interfaces.py:398 -#, python-brace-format -msgid "{name} hits {opponent}." -msgstr "{name} schlägt {opponent}." - -#: squirrelbattle/interfaces.py:410 -#, python-brace-format -msgid "{name} takes {amount} damage." -msgstr "{name} nimmt {amount} Schadenspunkte." - -#: squirrelbattle/interfaces.py:412 -#, python-brace-format -msgid "{name} dies." -msgstr "{name} stirbt." - -#: squirrelbattle/menus.py:71 -msgid "Back" -msgstr "Zurück" - -#: squirrelbattle/game.py:148 squirrelbattle/game.py:160 -msgid "" -"Some keys are missing in your save file.\n" -"Your save seems to be corrupt. It got deleted." -msgstr "" -"In Ihrer Speicherdatei fehlen einige Schlüssel.\n" -"Ihre Speicherung scheint korrupt zu sein. Es wird gelöscht." - -#: squirrelbattle/game.py:156 squirrelbattle/game.py:168 -msgid "" -"No player was found on this map!\n" -"Maybe you died?" -msgstr "" -"Auf dieser Karte wurde kein Spieler gefunden!\n" -"Vielleicht sind Sie gestorben?" - -#: squirrelbattle/game.py:176 squirrelbattle/game.py:188 -msgid "" -"The JSON file is not correct.\n" -"Your save seems corrupted. It got deleted." -msgstr "" -"Die JSON-Datei ist nicht korrekt.\n" -"Ihre Speicherung scheint korrumpiert. Sie wurde gelöscht." - -#: squirrelbattle/display/menudisplay.py:107 -msgid "== INVENTORY ==" -msgstr "== BESTAND ==" diff --git a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po index 99abe43..33ab440 100644 --- a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po +++ b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: squirrelbattle 3.14.1\n" "Report-Msgid-Bugs-To: squirrel-battle@crans.org\n" -"POT-Creation-Date: 2020-12-04 15:59+0100\n" +"POT-Creation-Date: 2020-12-05 13:11+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,6 +17,10 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: squirrelbattle/display/menudisplay.py:105 +msgid "== INVENTORY ==" +msgstr "== INVENTAIRE ==" + #: squirrelbattle/display/statsdisplay.py:34 msgid "Inventory:" msgstr "Inventaire :" @@ -25,6 +29,37 @@ msgstr "Inventaire :" msgid "YOU ARE DEAD" msgstr "VOUS ÊTES MORT" +#. The bomb is exploding. +#. Each entity that is close to the bomb takes damages. +#. The player earn XP if the entity was killed. +#: squirrelbattle/entities/items.py:129 +msgid "Bomb is exploding." +msgstr "La bombe explose." + +#: squirrelbattle/game.py:177 +msgid "" +"Some keys are missing in your save file.\n" +"Your save seems to be corrupt. It got deleted." +msgstr "" +"Certaines clés de votre ficher de sauvegarde sont manquantes.\n" +"Votre sauvegarde semble corrompue. Elle a été supprimée." + +#: squirrelbattle/game.py:185 +msgid "" +"No player was found on this map!\n" +"Maybe you died?" +msgstr "" +"Aucun joueur n'a été trouvé sur la carte !\n" +"Peut-être êtes-vous mort ?" + +#: squirrelbattle/game.py:205 +msgid "" +"The JSON file is not correct.\n" +"Your save seems corrupted. It got deleted." +msgstr "" +"Le fichier JSON de sauvegarde est incorrect.\n" +"Votre sauvegarde semble corrompue. Elle a été supprimée." + #: squirrelbattle/interfaces.py:398 #, python-brace-format msgid "{name} hits {opponent}." @@ -35,94 +70,74 @@ msgstr "{name} frappe {opponent}." msgid "{name} takes {amount} damage." msgstr "{name} prend {amount} points de dégât." -#: squirrelbattle/menus.py:45 squirrelbattle/tests/translations_test.py:16 -#: squirrelbattle/tests/game_test.py:290 squirrelbattle/tests/game_test.py:285 -#: squirrelbattle/tests/game_test.py:288 squirrelbattle/tests/game_test.py:291 -msgid "New game" -msgstr "Nouvelle partie" +#: squirrelbattle/interfaces.py:412 +#, python-brace-format +msgid "{name} dies." +msgstr "{name} meurt." -#: squirrelbattle/menus.py:46 squirrelbattle/tests/translations_test.py:17 -msgid "Resume" -msgstr "Continuer" - -#: squirrelbattle/menus.py:47 squirrelbattle/tests/translations_test.py:19 -msgid "Save" -msgstr "Sauvegarder" - -#: squirrelbattle/menus.py:48 squirrelbattle/tests/translations_test.py:18 -msgid "Load" -msgstr "Charger" - -#: squirrelbattle/menus.py:49 squirrelbattle/tests/translations_test.py:20 -msgid "Settings" -msgstr "Paramètres" - -#: squirrelbattle/menus.py:50 squirrelbattle/tests/translations_test.py:21 -msgid "Exit" -msgstr "Quitter" - -#: squirrelbattle/menus.py:71 +#: squirrelbattle/menus.py:72 msgid "Back" msgstr "Retour" -#: squirrelbattle/game.py:147 squirrelbattle/game.py:148 -#: squirrelbattle/game.py:160 -msgid "" -"Some keys are missing in your save file.\n" -"Your save seems to be corrupt. It got deleted." -msgstr "" -"Certaines clés de votre ficher de sauvegarde sont manquantes.\n" -"Votre sauvegarde semble corrompue. Elle a été supprimée." +#: squirrelbattle/tests/game_test.py:294 squirrelbattle/tests/game_test.py:297 +#: squirrelbattle/tests/game_test.py:300 +#: squirrelbattle/tests/translations_test.py:16 +msgid "New game" +msgstr "Nouvelle partie" -#: squirrelbattle/game.py:156 squirrelbattle/game.py:168 -msgid "" -"No player was found on this map!\n" -"Maybe you died?" -msgstr "" -"Aucun joueur n'a été trouvé sur la carte !\n" -"Peut-être êtes-vous mort ?" +#: squirrelbattle/tests/translations_test.py:17 +msgid "Resume" +msgstr "Continuer" -#: squirrelbattle/game.py:176 squirrelbattle/game.py:188 -msgid "" -"The JSON file is not correct.\n" -"Your save seems corrupted. It got deleted." -msgstr "" -"Le fichier JSON de sauvegarde est incorrect.\n" -"Votre sauvegarde semble corrompue. Elle a été supprimée." +#: squirrelbattle/tests/translations_test.py:18 +msgid "Load" +msgstr "Charger" -#: squirrelbattle/settings.py:21 squirrelbattle/tests/translations_test.py:27 +#: squirrelbattle/tests/translations_test.py:19 +msgid "Save" +msgstr "Sauvegarder" + +#: squirrelbattle/tests/translations_test.py:20 +msgid "Settings" +msgstr "Paramètres" + +#: squirrelbattle/tests/translations_test.py:21 +msgid "Exit" +msgstr "Quitter" + +#: squirrelbattle/tests/translations_test.py:27 msgid "Main key to move up" msgstr "Touche principale pour aller vers le haut" -#: squirrelbattle/settings.py:22 squirrelbattle/tests/translations_test.py:29 +#: squirrelbattle/tests/translations_test.py:29 msgid "Secondary key to move up" msgstr "Touche secondaire pour aller vers le haut" -#: squirrelbattle/settings.py:23 squirrelbattle/tests/translations_test.py:31 +#: squirrelbattle/tests/translations_test.py:31 msgid "Main key to move down" msgstr "Touche principale pour aller vers le bas" -#: squirrelbattle/settings.py:24 squirrelbattle/tests/translations_test.py:33 +#: squirrelbattle/tests/translations_test.py:33 msgid "Secondary key to move down" msgstr "Touche secondaire pour aller vers le bas" -#: squirrelbattle/settings.py:25 squirrelbattle/tests/translations_test.py:35 +#: squirrelbattle/tests/translations_test.py:35 msgid "Main key to move left" msgstr "Touche principale pour aller vers la gauche" -#: squirrelbattle/settings.py:26 squirrelbattle/tests/translations_test.py:37 +#: squirrelbattle/tests/translations_test.py:37 msgid "Secondary key to move left" msgstr "Touche secondaire pour aller vers la gauche" -#: squirrelbattle/settings.py:27 squirrelbattle/tests/translations_test.py:39 +#: squirrelbattle/tests/translations_test.py:39 msgid "Main key to move right" msgstr "Touche principale pour aller vers la droite" -#: squirrelbattle/settings.py:29 squirrelbattle/tests/translations_test.py:41 +#: squirrelbattle/tests/translations_test.py:41 msgid "Secondary key to move right" msgstr "Touche secondaire pour aller vers la droite" -#: squirrelbattle/settings.py:30 squirrelbattle/tests/translations_test.py:43 +#: squirrelbattle/tests/translations_test.py:43 msgid "Key to validate a menu" msgstr "Touche pour valider un menu" @@ -130,47 +145,50 @@ msgstr "Touche pour valider un menu" msgid "Key used to open the inventory" msgstr "Touche utilisée pour ouvrir l'inventaire" -#: squirrelbattle/settings.py:31 squirrelbattle/tests/translations_test.py:47 +#: squirrelbattle/tests/translations_test.py:47 +msgid "Key used to use an item in the inventory" +msgstr "Touche pour utiliser un objet de l'inventaire" + +#: squirrelbattle/tests/translations_test.py:49 +msgid "Key used to equip an item in the inventory" +msgstr "Touche pour équiper un objet de l'inventaire" + +#: squirrelbattle/tests/translations_test.py:51 +msgid "Key used to drop an item in the inventory" +msgstr "Touche pour jeter un objet de l'inventaire" + +#: squirrelbattle/tests/translations_test.py:53 msgid "Texture pack" msgstr "Pack de textures" -#: squirrelbattle/settings.py:32 squirrelbattle/tests/translations_test.py:48 +#: squirrelbattle/tests/translations_test.py:54 msgid "Language" msgstr "Langue" -#: squirrelbattle/interfaces.py:412 -#, python-brace-format -msgid "{name} dies." -msgstr "{name} meurt." - -#: squirrelbattle/tests/translations_test.py:51 +#: squirrelbattle/tests/translations_test.py:57 msgid "player" msgstr "joueur" -#: squirrelbattle/tests/translations_test.py:53 +#: squirrelbattle/tests/translations_test.py:59 msgid "tiger" msgstr "tigre" -#: squirrelbattle/tests/translations_test.py:54 +#: squirrelbattle/tests/translations_test.py:60 msgid "hedgehog" msgstr "hérisson" -#: squirrelbattle/tests/translations_test.py:55 +#: squirrelbattle/tests/translations_test.py:61 msgid "rabbit" msgstr "lapin" -#: squirrelbattle/tests/translations_test.py:56 +#: squirrelbattle/tests/translations_test.py:62 msgid "teddy bear" msgstr "nounours" -#: squirrelbattle/tests/translations_test.py:58 +#: squirrelbattle/tests/translations_test.py:64 msgid "bomb" msgstr "bombe" -#: squirrelbattle/tests/translations_test.py:59 +#: squirrelbattle/tests/translations_test.py:65 msgid "heart" msgstr "cœur" - -#: squirrelbattle/display/menudisplay.py:107 -msgid "== INVENTORY ==" -msgstr "== INVENTAIRE ==" diff --git a/squirrelbattle/tests/translations_test.py b/squirrelbattle/tests/translations_test.py index 6d3a0e4..ef7369f 100644 --- a/squirrelbattle/tests/translations_test.py +++ b/squirrelbattle/tests/translations_test.py @@ -44,6 +44,12 @@ class TestTranslations(unittest.TestCase): "Touche pour valider un menu") self.assertEqual(_("Key used to open the inventory"), "Touche utilisée pour ouvrir l'inventaire") + self.assertEqual(_("Key used to use an item in the inventory"), + "Touche pour utiliser un objet de l'inventaire") + self.assertEqual(_("Key used to equip an item in the inventory"), + "Touche pour équiper un objet de l'inventaire") + self.assertEqual(_("Key used to drop an item in the inventory"), + "Touche pour jeter un objet de l'inventaire") self.assertEqual(_("Texture pack"), "Pack de textures") self.assertEqual(_("Language"), "Langue") diff --git a/squirrelbattle/translations.py b/squirrelbattle/translations.py index d5ac3e2..1e97df6 100644 --- a/squirrelbattle/translations.py +++ b/squirrelbattle/translations.py @@ -86,6 +86,8 @@ class Translator: Compile translation messages from source files. """ for language in cls.SUPPORTED_LOCALES: + if language == "en": + continue args = ["msgfmt", "--check-format", "-o", Path(__file__).parent / "locale" / language / "LC_MESSAGES" / "squirrelbattle.mo", From fb8b2aff0142298fd9476a7aef3999ccc60d041f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 5 Dec 2020 13:20:52 +0100 Subject: [PATCH 16/16] The player must be alive to interact with the inventory --- squirrelbattle/game.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index ff5d465..b9439b5 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -123,7 +123,7 @@ class Game: self.inventory_menu.go_up() elif key == KeyValues.DOWN: self.inventory_menu.go_down() - if self.inventory_menu.values: + if self.inventory_menu.values and not self.player.dead: if key == KeyValues.USE: self.inventory_menu.validate().use() elif key == KeyValues.EQUIP: