From ea672272f57cbd29b516ef41a6d7084bc888ccec Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sat, 5 Dec 2020 14:20:58 +0100 Subject: [PATCH] Add body snatch potion --- squirrelbattle/display/menudisplay.py | 2 +- squirrelbattle/display/texturepack.py | 2 ++ squirrelbattle/entities/items.py | 28 ++++++++++++++++++- squirrelbattle/game.py | 2 +- squirrelbattle/interfaces.py | 10 ++++--- .../locale/de/LC_MESSAGES/squirrelbattle.po | 18 +++++++----- .../locale/fr/LC_MESSAGES/squirrelbattle.po | 18 +++++++----- squirrelbattle/tests/translations_test.py | 1 + 8 files changed, 60 insertions(+), 21 deletions(-) diff --git a/squirrelbattle/display/menudisplay.py b/squirrelbattle/display/menudisplay.py index 285b6db..d040d81 100644 --- a/squirrelbattle/display/menudisplay.py +++ b/squirrelbattle/display/menudisplay.py @@ -109,7 +109,7 @@ class InventoryDisplay(MenuDisplay): 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()) + + " " + item.translated_name.capitalize()) @property def truewidth(self) -> int: diff --git a/squirrelbattle/display/texturepack.py b/squirrelbattle/display/texturepack.py index dfee866..7fc4a9a 100644 --- a/squirrelbattle/display/texturepack.py +++ b/squirrelbattle/display/texturepack.py @@ -56,6 +56,7 @@ TexturePack.ASCII_PACK = TexturePack( RABBIT='Y', TIGER='n', TEDDY_BEAR='8', + BODY_SNATCH_POTION='S', ) TexturePack.SQUIRREL_PACK = TexturePack( @@ -75,4 +76,5 @@ TexturePack.SQUIRREL_PACK = TexturePack( RABBIT='🐇', TIGER='🐅', TEDDY_BEAR='🧸', + BODY_SNATCH_POTION='🔀', ) diff --git a/squirrelbattle/entities/items.py b/squirrelbattle/entities/items.py index 4800a58..8953b39 100644 --- a/squirrelbattle/entities/items.py +++ b/squirrelbattle/entities/items.py @@ -1,7 +1,7 @@ # Copyright (C) 2020 by ÿnérant, eichhornchen, nicomarg, charlse # SPDX-License-Identifier: GPL-3.0-or-later -from random import randint +from random import choice, randint from typing import Optional from .player import Player @@ -143,3 +143,29 @@ class Bomb(Item): d["exploding"] = self.exploding d["damage"] = self.damage return d + + +class BodySnatchPotion(Item): + """ + The body-snatch potion allows to exchange all characteristics with a random + other entity. + """ + + def __init__(self, *args, **kwargs): + super().__init__(name="body_snatch_potion", *args, **kwargs) + + def use(self) -> None: + """ + Find a valid random entity, then exchange characteristics. + """ + valid_entities = self.held_by.map.find_entities(FightingEntity) + valid_entities.remove(self.held_by) + entity = choice(valid_entities) + entity_state = entity.save_state() + player_state = self.held_by.save_state() + self.held_by.__dict__.update(entity_state) + entity.__dict__.update(player_state) + self.held_by.map.currenty, self.held_by.map.currentx = self.held_by.y,\ + self.held_by.x + + self.held_by.inventory.remove(self) diff --git a/squirrelbattle/game.py b/squirrelbattle/game.py index b9439b5..6d9e9e7 100644 --- a/squirrelbattle/game.py +++ b/squirrelbattle/game.py @@ -48,7 +48,7 @@ class Game: Create a new game on the screen. """ # TODO generate a new map procedurally - self.map = Map.load(ResourceManager.get_asset_path("example_map_2.txt")) + self.map = Map.load(ResourceManager.get_asset_path("example_map.txt")) self.map.logs = self.logs self.logs.clear() self.player = Player() diff --git a/squirrelbattle/interfaces.py b/squirrelbattle/interfaces.py index 90e5d69..3567ea0 100644 --- a/squirrelbattle/interfaces.py +++ b/squirrelbattle/interfaces.py @@ -324,10 +324,11 @@ class Entity: """ Returns all entities subclasses """ - from squirrelbattle.entities.items import Heart, Bomb + from squirrelbattle.entities.items import BodySnatchPotion, Bomb, Heart from squirrelbattle.entities.monsters import Tiger, Hedgehog, \ Rabbit, TeddyBear - return [Tiger, Bomb, Heart, Hedgehog, Rabbit, TeddyBear] + return [BodySnatchPotion, Bomb, Heart, Hedgehog, + Rabbit, TeddyBear, Tiger] @staticmethod def get_all_entity_classes_in_a_dict() -> dict: @@ -337,11 +338,12 @@ class Entity: from squirrelbattle.entities.player import Player from squirrelbattle.entities.monsters import Tiger, Hedgehog, Rabbit, \ TeddyBear - from squirrelbattle.entities.items import Bomb, Heart + from squirrelbattle.entities.items import BodySnatchPotion, Bomb, Heart return { "Tiger": Tiger, "Bomb": Bomb, "Heart": Heart, + "BodySnatchPotion": BodySnatchPotion, "Hedgehog": Hedgehog, "Rabbit": Rabbit, "TeddyBear": TeddyBear, @@ -423,7 +425,7 @@ class FightingEntity(Entity): """ Returns a fighting entities specific attributes """ - return ["maxhealth", "health", "level", "strength", + return ["name", "maxhealth", "health", "level", "strength", "intelligence", "charisma", "dexterity", "constitution"] def save_state(self) -> dict: diff --git a/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/de/LC_MESSAGES/squirrelbattle.po index 0d20e90..505d2d8 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-05 13:11+0100\n" +"POT-Creation-Date: 2020-12-05 14:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,14 +25,14 @@ msgstr "== BESTAND ==" msgid "Inventory:" msgstr "Bestand:" -#: squirrelbattle/display/statsdisplay.py:39 +#: squirrelbattle/display/statsdisplay.py:50 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 +#: squirrelbattle/entities/items.py:128 msgid "Bomb is exploding." msgstr "" @@ -60,17 +60,17 @@ msgstr "" "Die JSON-Datei ist nicht korrekt.\n" "Ihre Speicherung scheint korrumpiert. Sie wurde gelöscht." -#: squirrelbattle/interfaces.py:398 +#: squirrelbattle/interfaces.py:400 #, python-brace-format msgid "{name} hits {opponent}." msgstr "{name} schlägt {opponent}." -#: squirrelbattle/interfaces.py:410 +#: squirrelbattle/interfaces.py:412 #, python-brace-format msgid "{name} takes {amount} damage." msgstr "{name} nimmt {amount} Schadenspunkte." -#: squirrelbattle/interfaces.py:412 +#: squirrelbattle/interfaces.py:414 #, python-brace-format msgid "{name} dies." msgstr "{name} stirbt." @@ -186,9 +186,13 @@ msgid "teddy bear" msgstr "Teddybär" #: squirrelbattle/tests/translations_test.py:64 +msgid "body snatch potion" +msgstr "Leichenfleddererzaubertrank" + +#: squirrelbattle/tests/translations_test.py:65 msgid "bomb" msgstr "Bombe" -#: squirrelbattle/tests/translations_test.py:65 +#: squirrelbattle/tests/translations_test.py:66 msgid "heart" msgstr "Herz" diff --git a/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po b/squirrelbattle/locale/fr/LC_MESSAGES/squirrelbattle.po index 33ab440..1c17ccf 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-05 13:11+0100\n" +"POT-Creation-Date: 2020-12-05 14:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -25,14 +25,14 @@ msgstr "== INVENTAIRE ==" msgid "Inventory:" msgstr "Inventaire :" -#: squirrelbattle/display/statsdisplay.py:39 +#: squirrelbattle/display/statsdisplay.py:50 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 +#: squirrelbattle/entities/items.py:128 msgid "Bomb is exploding." msgstr "La bombe explose." @@ -60,17 +60,17 @@ msgstr "" "Le fichier JSON de sauvegarde est incorrect.\n" "Votre sauvegarde semble corrompue. Elle a été supprimée." -#: squirrelbattle/interfaces.py:398 +#: squirrelbattle/interfaces.py:400 #, python-brace-format msgid "{name} hits {opponent}." msgstr "{name} frappe {opponent}." -#: squirrelbattle/interfaces.py:410 +#: squirrelbattle/interfaces.py:412 #, python-brace-format msgid "{name} takes {amount} damage." msgstr "{name} prend {amount} points de dégât." -#: squirrelbattle/interfaces.py:412 +#: squirrelbattle/interfaces.py:414 #, python-brace-format msgid "{name} dies." msgstr "{name} meurt." @@ -186,9 +186,13 @@ msgid "teddy bear" msgstr "nounours" #: squirrelbattle/tests/translations_test.py:64 +msgid "body snatch potion" +msgstr "potion d'arrachage de corps" + +#: squirrelbattle/tests/translations_test.py:65 msgid "bomb" msgstr "bombe" -#: squirrelbattle/tests/translations_test.py:65 +#: squirrelbattle/tests/translations_test.py:66 msgid "heart" msgstr "cœur" diff --git a/squirrelbattle/tests/translations_test.py b/squirrelbattle/tests/translations_test.py index ef7369f..0cb39c5 100644 --- a/squirrelbattle/tests/translations_test.py +++ b/squirrelbattle/tests/translations_test.py @@ -61,5 +61,6 @@ class TestTranslations(unittest.TestCase): self.assertEqual(_("rabbit"), "lapin") self.assertEqual(_("teddy bear"), "nounours") + self.assertEqual(_("body snatch potion"), "potion d'arrachage de corps") self.assertEqual(_("bomb"), "bombe") self.assertEqual(_("heart"), "cœur")