From b8caa00737e1b974d5c8b679b4db50d8734c9267 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Wed, 15 Jul 2026 21:44:53 +0200 Subject: [PATCH 01/29] =?UTF-8?q?=F0=9F=92=84=20fix=20indentation=20of=20a?= =?UTF-8?q?ction=20menu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 3cc0d3c..851c840 100644 --- a/app.py +++ b/app.py @@ -6,7 +6,7 @@ import os def action_menu(): """ Menu Action du niveau """ print("\n------ Menu Action ------\n") - print("Pièce Suivante :\t 1") + print("Pièce Suivante :\t\t 1") print("Combat : \t\t\t 2") print("Fuir : \t\t\t\t 3") print("Quitter :\t\t\t 4") -- 2.52.0 From 10fc929417dee11cd08e1893a3b0582f045532eb Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 19:38:51 +0200 Subject: [PATCH 02/29] =?UTF-8?q?=F0=9F=8E=A8=20parameterized=20action=20m?= =?UTF-8?q?enu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 61 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/app.py b/app.py index 851c840..f44471c 100644 --- a/app.py +++ b/app.py @@ -1,16 +1,45 @@ +import os +from enum import Enum + from character_builder import CharacterBuilder from level_one import Level -import os -def action_menu(): - """ Menu Action du niveau """ - print("\n------ Menu Action ------\n") - print("Pièce Suivante :\t\t 1") - print("Combat : \t\t\t 2") - print("Fuir : \t\t\t\t 3") - print("Quitter :\t\t\t 4") - return int(input("\nChoix : ")) +class Action(Enum): + PIECE_SUIVANTE = (1, "Pièce suivante") + COMBAT = (2, "Combat") + FUIR = (3, "Fuir") + QUITTER = (4, "Quitter") + + @property + def code(self): + return self.value[0] + + @property + def libelle(self): + return self.value[1] + + +def action_menu(actions_autorisees: list[Action] = None) -> Action: + """Affiche le menu et retourne une action valide.""" + + actions_autorisees = list(Action) if actions_autorisees is None else actions_autorisees + + while True: + print("\n------ Menu Action ------\n") + + for action in actions_autorisees: + print(f"{action.libelle:<20} : {action.code}") + + try: + choix = int(input("\nChoix : ")) + for action in actions_autorisees: + if action.code == choix: + return action + + print("Mauvais choix") + except ValueError: + print("Veuillez saisir un nombre.") # Exemple d'utilisation @@ -27,8 +56,8 @@ if __name__ == "__main__": while level.exit_level: os.system('cls' if os.name == 'nt' else 'clear') - match action_menu(): - case 1: + match action_menu([Action.PIECE_SUIVANTE, Action.QUITTER]): + case Action.PIECE_SUIVANTE: if level.current_room_index >= number_room: print("fin du donjon !") break @@ -37,22 +66,20 @@ if __name__ == "__main__": if room is not None: for mob in room: print(f"Un {mob.name} est devant toi !") - match action_menu(): - case 2: + match action_menu([Action.COMBAT, Action.FUIR]): + case Action.COMBAT: level.combat(mob, player) if player.current_pv <= 0: print("!!!!!!!!! Joueur mort !!!!!!!!!!") break if mob.current_pv == 0: print(f"Le {mob.name} est mort !!") - case 3: + case Action.FUIR: print("Tu fuis la pièce") else: print("\n ------ Pièce vide ------ \n") player.current_pv = player.max_pv level.current_room_index += 1 - case 4: + case Action.QUITTER: level.exit_level = False print(f"Au revoir {player.name} !") - case _: - print("Mauvais choix") -- 2.52.0 From bc78bc04d63e27c8d5d7a44156a7fa605543f125 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 19:45:40 +0200 Subject: [PATCH 03/29] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20character=20loading?= =?UTF-8?q?=20once?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index f44471c..6f98e4f 100644 --- a/app.py +++ b/app.py @@ -1,4 +1,5 @@ import os +import sys from enum import Enum from character_builder import CharacterBuilder @@ -45,10 +46,12 @@ def action_menu(actions_autorisees: list[Action] = None) -> Action: # Exemple d'utilisation if __name__ == "__main__": loaded_character = CharacterBuilder.load_character("Jamin") - if loaded_character: - print(loaded_character) + if not loaded_character: + sys.exit(-1) - level = Level(2, CharacterBuilder.load_character("Jamin")) + print(loaded_character) + + level = Level(2, loaded_character) player = level.player rooms = level.rooms number_room = len(rooms) -- 2.52.0 From f745bd1f3d9bbcc80a2654baea5f640b1ec071b8 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:17:33 +0200 Subject: [PATCH 04/29] =?UTF-8?q?=F0=9F=9A=A7=20wip=20code=20split?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 86 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/app.py b/app.py index 6f98e4f..d3ac727 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,7 @@ import os import sys from enum import Enum +from base_mob import BaseMob from character_builder import CharacterBuilder from level_one import Level @@ -21,6 +22,10 @@ class Action(Enum): return self.value[1] +def clear_console() -> None: + os.system('cls' if os.name == 'nt' else 'clear') + + def action_menu(actions_autorisees: list[Action] = None) -> Action: """Affiche le menu et retourne une action valide.""" @@ -34,55 +39,64 @@ def action_menu(actions_autorisees: list[Action] = None) -> Action: try: choix = int(input("\nChoix : ")) + clear_console() for action in actions_autorisees: if action.code == choix: return action print("Mauvais choix") except ValueError: + clear_console() print("Veuillez saisir un nombre.") -# Exemple d'utilisation -if __name__ == "__main__": - loaded_character = CharacterBuilder.load_character("Jamin") +def play_room(room: list[BaseMob], level: Level) -> None: + print(f"Pièce actuelle : {level.current_room_index}") + if room is not None: + for mob in room: + print(f"Un {mob.name} est devant toi !") + match action_menu([Action.COMBAT, Action.FUIR]): + case Action.COMBAT: + level.combat(mob, level.player) + if level.player.current_pv <= 0: + print("!!!!!!!!! Joueur mort !!!!!!!!!!") + break + if mob.current_pv == 0: + print(f"Le {mob.name} est mort !!") + case Action.FUIR: + print("Tu fuis la pièce") + else: + print("\n ------ Pièce vide ------ \n") + + +def play_donjon(level: Level) -> None: + while level.exit_level: + match action_menu([Action.PIECE_SUIVANTE, Action.QUITTER]): + case Action.PIECE_SUIVANTE: + if level.current_room_index >= len(level.rooms): + print("fin du donjon !") + break + play_room(level.rooms[level.current_room_index], level) + level.player.current_pv = level.player.max_pv + level.current_room_index += 1 + case Action.QUITTER: + level.exit_level = False + print(f"Au revoir {level.player.name} !") + + +def app(character_name: str) -> None: + loaded_character = CharacterBuilder.load_character(character_name) if not loaded_character: sys.exit(-1) print(loaded_character) level = Level(2, loaded_character) - player = level.player - rooms = level.rooms - number_room = len(rooms) - print(f"Nombre de pièce dans le donjon : {number_room}") + print(f"Nombre de pièce dans le donjon : {len(level.rooms)}") - while level.exit_level: - os.system('cls' if os.name == 'nt' else 'clear') - match action_menu([Action.PIECE_SUIVANTE, Action.QUITTER]): - case Action.PIECE_SUIVANTE: - if level.current_room_index >= number_room: - print("fin du donjon !") - break - room = rooms[level.current_room_index] - print(f"Pièce actuelle : {level.current_room_index}") - if room is not None: - for mob in room: - print(f"Un {mob.name} est devant toi !") - match action_menu([Action.COMBAT, Action.FUIR]): - case Action.COMBAT: - level.combat(mob, player) - if player.current_pv <= 0: - print("!!!!!!!!! Joueur mort !!!!!!!!!!") - break - if mob.current_pv == 0: - print(f"Le {mob.name} est mort !!") - case Action.FUIR: - print("Tu fuis la pièce") - else: - print("\n ------ Pièce vide ------ \n") - player.current_pv = player.max_pv - level.current_room_index += 1 - case Action.QUITTER: - level.exit_level = False - print(f"Au revoir {player.name} !") + play_donjon(level) + + +# Exemple d'utilisation +if __name__ == "__main__": + app("Jamin") -- 2.52.0 From a1162127de0111e4b19f14094ba01956a336ca02 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:20:38 +0200 Subject: [PATCH 05/29] =?UTF-8?q?=F0=9F=94=A5=20rm=20sample=20of=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level_one.py | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/level_one.py b/level_one.py index d3d12ab..3db5967 100644 --- a/level_one.py +++ b/level_one.py @@ -1,7 +1,6 @@ """ Class Level """ import random import mobs_utils -from character_builder import CharacterBuilder class Level(): @@ -30,42 +29,3 @@ class Level(): mob.perform_attack(player) print(f"{player.name} - {player.current_pv} PV") print(f"{mob.name} - {mob.current_pv} PV") - - -def action_menu(): - """ Menu Action du niveau """ - print("Pièce Suivante :\t1") - print("Quitter :\t\t4") - return int(input("Choix : ")) - -# Exemple d'utilisation -if __name__ == "__main__": - level = Level(2, CharacterBuilder.load_character("Jamin")) - player = level.player - rooms = level.rooms - number_room = len(rooms) - print(f"Nombre de pièce dans le donjon : {number_room}") - - while level.exit_level: - match action_menu(): - case 1: - if level.current_room_index >= number_room: - print("fin du donjon !") - break - room = rooms[level.current_room_index] - print(f"Pièce actuelle : {level.current_room_index}") - if room: - for mob in room: - level.combat(mob, player) - if player.current_pv <= 0: - print("!!!!!!!!! Joueur mort !!!!!!!!!!") - break - else: - print("Pièce vide") - player.current_pv = player.max_pv - level.current_room_index += 1 - case 4: - level.exit_level = False - print(f"Au revoir {player.name} !") - case _: - print("Mauvais choix") -- 2.52.0 From bf13556eb652c97a733e978bcf27447752ef157e Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:22:26 +0200 Subject: [PATCH 06/29] =?UTF-8?q?=F0=9F=8E=A8=20rm=20parenthesis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level_one.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/level_one.py b/level_one.py index 3db5967..ec57aed 100644 --- a/level_one.py +++ b/level_one.py @@ -3,7 +3,7 @@ import random import mobs_utils -class Level(): +class Level: """ Class Level """ def __init__(self, difficulty, player): @@ -20,7 +20,7 @@ class Level(): print("Level Loaded") def combat(self, mob, player): - while (mob.current_pv > 0 and player.current_pv > 0): + while mob.current_pv > 0 and player.current_pv > 0: if mob.speed > player.speed: mob.perform_attack(player) player.perform_attack(mob) -- 2.52.0 From 2d4099e4945942f599331d9fc4af6391017668dd Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:23:33 +0200 Subject: [PATCH 07/29] =?UTF-8?q?=F0=9F=9A=9A=20rename=20level=5Fone=20->?= =?UTF-8?q?=20level?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 2 +- level_one.py => level.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename level_one.py => level.py (100%) diff --git a/app.py b/app.py index d3ac727..7cddaeb 100644 --- a/app.py +++ b/app.py @@ -4,7 +4,7 @@ from enum import Enum from base_mob import BaseMob from character_builder import CharacterBuilder -from level_one import Level +from level import Level class Action(Enum): diff --git a/level_one.py b/level.py similarity index 100% rename from level_one.py rename to level.py -- 2.52.0 From 805a088bf66c2154928db16504dca51b3e9c1938 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:29:03 +0200 Subject: [PATCH 08/29] =?UTF-8?q?=E2=9C=A8=20character=20dynamic=20selecti?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 7cddaeb..4817a5f 100644 --- a/app.py +++ b/app.py @@ -99,4 +99,4 @@ def app(character_name: str) -> None: # Exemple d'utilisation if __name__ == "__main__": - app("Jamin") + app(character_name=sys.argv[1] if len(sys.argv) > 1 else "Jamin") -- 2.52.0 From 38ea663dad386fac15e1b5a9194487aaedb74088 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:28:32 +0200 Subject: [PATCH 09/29] =?UTF-8?q?=F0=9F=8E=A8=20code=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- level.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/level.py b/level.py index ec57aed..e064fcd 100644 --- a/level.py +++ b/level.py @@ -1,5 +1,6 @@ """ Class Level """ import random + import mobs_utils @@ -9,12 +10,10 @@ class Level: def __init__(self, difficulty, player): """ Chargement du niveau """ print("Loading Level") - self.mobs_in_level = mobs_utils.generate_random_mob_list( - random.randint(2, difficulty)) + self.mobs_in_level = mobs_utils.generate_random_mob_list(random.randint(2, difficulty)) self.exit_level = True self.player = player - self.rooms = mobs_utils.generate_random_rooms( - self.mobs_in_level, difficulty) # Liste des pièces du niveau + self.rooms = mobs_utils.generate_random_rooms(self.mobs_in_level, difficulty) # Liste des pièces du niveau self.current_room_index = 0 # Index de la pièce actuelle print("Level Loaded") -- 2.52.0 From b8763ba373e1e6ace39836bcdd2537d08f273bf1 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:41:19 +0200 Subject: [PATCH 10/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20play=5Fro?= =?UTF-8?q?om?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/app.py b/app.py index 4817a5f..42d6a1d 100644 --- a/app.py +++ b/app.py @@ -50,35 +50,38 @@ def action_menu(actions_autorisees: list[Action] = None) -> Action: print("Veuillez saisir un nombre.") -def play_room(room: list[BaseMob], level: Level) -> None: - print(f"Pièce actuelle : {level.current_room_index}") - if room is not None: - for mob in room: - print(f"Un {mob.name} est devant toi !") - match action_menu([Action.COMBAT, Action.FUIR]): - case Action.COMBAT: - level.combat(mob, level.player) - if level.player.current_pv <= 0: - print("!!!!!!!!! Joueur mort !!!!!!!!!!") - break - if mob.current_pv == 0: - print(f"Le {mob.name} est mort !!") - case Action.FUIR: - print("Tu fuis la pièce") - else: +def play_room(room: list[BaseMob], level: Level) -> int: + if room is None: print("\n ------ Pièce vide ------ \n") + return 1 + + for mob in room: + print(f"Un {mob.name} est devant toi !") + match action_menu([Action.COMBAT, Action.FUIR]): + case Action.COMBAT: + level.combat(mob, level.player) + if level.player.current_pv <= 0: + print("!!!!!!!!! Joueur mort !!!!!!!!!!") + sys.exit(0) + if mob.current_pv == 0: + print(f"Le {mob.name} est mort !!") + case Action.FUIR: + print("Tu fuis la pièce") + return 0 + + return 1 def play_donjon(level: Level) -> None: while level.exit_level: + print(f"Pièce actuelle : {level.current_room_index}") match action_menu([Action.PIECE_SUIVANTE, Action.QUITTER]): case Action.PIECE_SUIVANTE: if level.current_room_index >= len(level.rooms): print("fin du donjon !") break - play_room(level.rooms[level.current_room_index], level) + level.current_room_index += play_room(level.rooms[level.current_room_index], level) level.player.current_pv = level.player.max_pv - level.current_room_index += 1 case Action.QUITTER: level.exit_level = False print(f"Au revoir {level.player.name} !") -- 2.52.0 From 052582a0e11eec026aef97f579d091d193022a0a Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Thu, 16 Jul 2026 20:41:44 +0200 Subject: [PATCH 11/29] =?UTF-8?q?=F0=9F=94=A8=20code=20format=20util?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- format.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 format.sh diff --git a/format.sh b/format.sh new file mode 100755 index 0000000..abfd74b --- /dev/null +++ b/format.sh @@ -0,0 +1,2 @@ +isort $1 +autopep8 -i --max-line-length=120 $1 -- 2.52.0 From 32306f041a10bfd6780fd4e5755ce5e350b09381 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:28:42 +0200 Subject: [PATCH 12/29] =?UTF-8?q?=F0=9F=93=9D=20add=20changelog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..825c32f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +# Changelog -- 2.52.0 From bd55060b974f3d49670457ac77958ee69a848aaf Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:29:03 +0200 Subject: [PATCH 13/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor=20entrypoin?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index 42d6a1d..9306e93 100644 --- a/app.py +++ b/app.py @@ -87,8 +87,8 @@ def play_donjon(level: Level) -> None: print(f"Au revoir {level.player.name} !") -def app(character_name: str) -> None: - loaded_character = CharacterBuilder.load_character(character_name) +def app() -> None: + loaded_character = CharacterBuilder.load_character(sys.argv[1] if len(sys.argv) > 1 else "Jamin") if not loaded_character: sys.exit(-1) @@ -102,4 +102,4 @@ def app(character_name: str) -> None: # Exemple d'utilisation if __name__ == "__main__": - app(character_name=sys.argv[1] if len(sys.argv) > 1 else "Jamin") + app() -- 2.52.0 From 4a067283813490f40b85c86b1a3154487ae65f5f Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:29:55 +0200 Subject: [PATCH 14/29] =?UTF-8?q?=F0=9F=99=88=20ignore=20egg-info=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6884755..f8f9316 100644 --- a/.gitignore +++ b/.gitignore @@ -52,5 +52,5 @@ __pycache__/ .spyproject/ .pydevproject - +*.egg-info -- 2.52.0 From 1f1b928fd77597269e23e386ae1f42131c5670b0 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:32:20 +0200 Subject: [PATCH 15/29] =?UTF-8?q?=F0=9F=9A=9A=20mv=20scripts=20into=20src?= =?UTF-8?q?=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py => src/elironwars/app.py | 0 base_mob.py => src/elironwars/base_mob.py | 0 character_builder.py => src/elironwars/character_builder.py | 0 level.py => src/elironwars/level.py | 0 menu.py => src/elironwars/menu.py | 0 mobs_utils.py => src/elironwars/mobs_utils.py | 0 .../elironwars/pydantic_character_builder.py | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename app.py => src/elironwars/app.py (100%) rename base_mob.py => src/elironwars/base_mob.py (100%) rename character_builder.py => src/elironwars/character_builder.py (100%) rename level.py => src/elironwars/level.py (100%) rename menu.py => src/elironwars/menu.py (100%) rename mobs_utils.py => src/elironwars/mobs_utils.py (100%) rename pydantic_character_builder.py => src/elironwars/pydantic_character_builder.py (100%) diff --git a/app.py b/src/elironwars/app.py similarity index 100% rename from app.py rename to src/elironwars/app.py diff --git a/base_mob.py b/src/elironwars/base_mob.py similarity index 100% rename from base_mob.py rename to src/elironwars/base_mob.py diff --git a/character_builder.py b/src/elironwars/character_builder.py similarity index 100% rename from character_builder.py rename to src/elironwars/character_builder.py diff --git a/level.py b/src/elironwars/level.py similarity index 100% rename from level.py rename to src/elironwars/level.py diff --git a/menu.py b/src/elironwars/menu.py similarity index 100% rename from menu.py rename to src/elironwars/menu.py diff --git a/mobs_utils.py b/src/elironwars/mobs_utils.py similarity index 100% rename from mobs_utils.py rename to src/elironwars/mobs_utils.py diff --git a/pydantic_character_builder.py b/src/elironwars/pydantic_character_builder.py similarity index 100% rename from pydantic_character_builder.py rename to src/elironwars/pydantic_character_builder.py -- 2.52.0 From 3bed4f9903314d0915e2c2252b68373c7d5dd191 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:54:57 +0200 Subject: [PATCH 16/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20update=20imports?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/__init__.py | 0 src/elironwars/app.py | 6 +++--- src/elironwars/character_builder.py | 2 +- src/elironwars/level.py | 7 +++---- src/elironwars/mobs_utils.py | 2 +- src/elironwars/pydantic_character_builder.py | 2 +- 6 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 src/elironwars/__init__.py diff --git a/src/elironwars/__init__.py b/src/elironwars/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 9306e93..678ea5c 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -2,9 +2,9 @@ import os import sys from enum import Enum -from base_mob import BaseMob -from character_builder import CharacterBuilder -from level import Level +from .base_mob import BaseMob +from .character_builder import CharacterBuilder +from .level import Level class Action(Enum): diff --git a/src/elironwars/character_builder.py b/src/elironwars/character_builder.py index fa06a6f..713f7e3 100644 --- a/src/elironwars/character_builder.py +++ b/src/elironwars/character_builder.py @@ -4,7 +4,7 @@ import os import sys from typing import Callable -from base_mob import BaseMob +from .base_mob import BaseMob class CharacterBuilder: diff --git a/src/elironwars/level.py b/src/elironwars/level.py index e064fcd..5d27e2d 100644 --- a/src/elironwars/level.py +++ b/src/elironwars/level.py @@ -1,8 +1,7 @@ """ Class Level """ import random -import mobs_utils - +from .mobs_utils import generate_random_mob_list, generate_random_rooms class Level: """ Class Level """ @@ -10,10 +9,10 @@ class Level: def __init__(self, difficulty, player): """ Chargement du niveau """ print("Loading Level") - self.mobs_in_level = mobs_utils.generate_random_mob_list(random.randint(2, difficulty)) + self.mobs_in_level = generate_random_mob_list(random.randint(2, difficulty)) self.exit_level = True self.player = player - self.rooms = mobs_utils.generate_random_rooms(self.mobs_in_level, difficulty) # Liste des pièces du niveau + self.rooms = generate_random_rooms(self.mobs_in_level, difficulty) # Liste des pièces du niveau self.current_room_index = 0 # Index de la pièce actuelle print("Level Loaded") diff --git a/src/elironwars/mobs_utils.py b/src/elironwars/mobs_utils.py index 76a5044..d70d773 100644 --- a/src/elironwars/mobs_utils.py +++ b/src/elironwars/mobs_utils.py @@ -1,5 +1,5 @@ import random -from base_mob import BaseMob +from .base_mob import BaseMob # Créer des instances de BaseMob yanaar = BaseMob("Yanaar", 15, 2, 1, 3, 2) diff --git a/src/elironwars/pydantic_character_builder.py b/src/elironwars/pydantic_character_builder.py index cd6ec29..b5a9f8f 100644 --- a/src/elironwars/pydantic_character_builder.py +++ b/src/elironwars/pydantic_character_builder.py @@ -2,7 +2,7 @@ import pathlib from pydantic import BaseModel -from base_mob import BaseMob +from .base_mob import BaseMob class CharacterModel(BaseModel): -- 2.52.0 From f36c8f6b175d97067a499f5b07e64aea2cc7b1c2 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 19:55:13 +0200 Subject: [PATCH 17/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20update=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_character_builder.py => tests/test_character_builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename test_character_builder.py => tests/test_character_builder.py (97%) diff --git a/test_character_builder.py b/tests/test_character_builder.py similarity index 97% rename from test_character_builder.py rename to tests/test_character_builder.py index 135f49f..16ba5eb 100644 --- a/test_character_builder.py +++ b/tests/test_character_builder.py @@ -3,8 +3,8 @@ from unittest.mock import patch import json import pathlib -from base_mob import BaseMob -from character_builder import CharacterBuilder +from elironwars.base_mob import BaseMob +from elironwars.character_builder import CharacterBuilder ARTHUR_JSON = """{ "name": "Arthur", -- 2.52.0 From e8e6c027563e26daafa59b86989f8b7cf9c804de Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 20:06:27 +0200 Subject: [PATCH 18/29] =?UTF-8?q?=F0=9F=8E=A8=20code=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/base_mob.py | 2 +- src/elironwars/level.py | 1 + src/elironwars/menu.py | 1 - src/elironwars/mobs_utils.py | 3 ++- tests/test_character_builder.py | 4 ++-- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/elironwars/base_mob.py b/src/elironwars/base_mob.py index a863a14..95c95ee 100644 --- a/src/elironwars/base_mob.py +++ b/src/elironwars/base_mob.py @@ -62,4 +62,4 @@ class BaseMob: """Retourne une représentation sous forme de chaîne du mob.""" return (f"{self.name} - PV: {self.current_pv}/{self.max_pv}, " f"Force: {self.strength}, Protection: {self.protection}, " - f"Vitesse: {self.speed}") \ No newline at end of file + f"Vitesse: {self.speed}") diff --git a/src/elironwars/level.py b/src/elironwars/level.py index 5d27e2d..549c9fe 100644 --- a/src/elironwars/level.py +++ b/src/elironwars/level.py @@ -3,6 +3,7 @@ import random from .mobs_utils import generate_random_mob_list, generate_random_rooms + class Level: """ Class Level """ diff --git a/src/elironwars/menu.py b/src/elironwars/menu.py index ab2ce58..df04b3a 100644 --- a/src/elironwars/menu.py +++ b/src/elironwars/menu.py @@ -23,4 +23,3 @@ # print("Quitter") # case _: # print("Mauvais choix") - diff --git a/src/elironwars/mobs_utils.py b/src/elironwars/mobs_utils.py index d70d773..88e309f 100644 --- a/src/elironwars/mobs_utils.py +++ b/src/elironwars/mobs_utils.py @@ -1,4 +1,5 @@ import random + from .base_mob import BaseMob # Créer des instances de BaseMob @@ -46,4 +47,4 @@ def generate_random_rooms(mobs_in_level, num_rooms): # Ajouter une pièce vide si aucun mob n'est disponible rooms.append(None) - return rooms \ No newline at end of file + return rooms diff --git a/tests/test_character_builder.py b/tests/test_character_builder.py index 16ba5eb..4aee50d 100644 --- a/tests/test_character_builder.py +++ b/tests/test_character_builder.py @@ -1,7 +1,7 @@ -import unittest -from unittest.mock import patch import json import pathlib +import unittest +from unittest.mock import patch from elironwars.base_mob import BaseMob from elironwars.character_builder import CharacterBuilder -- 2.52.0 From 0d41da65446fc47064b6b1cf1ea90fde94774439 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 20:25:23 +0200 Subject: [PATCH 19/29] =?UTF-8?q?=F0=9F=8E=89=20pyproject=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..d6d66cf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,41 @@ +[project] +name = "elironwars-python" +version = "0.0.0" +description = "Lovely Spam! Wonderful Spam!" +readme = "README.md" +keywords = [] +requires-python = ">= 3.14" +dependencies = [ + "pydantic >= 2.13.4", +] +authors = [ + { name = "Raggaroth", email = "b.baudouin@pm.me" }, + { name = "Toucan", email = "anthony.melin@laposte.net" }, +] +maintainers = [ + { name = "Raggaroth", email = "b.baudouin@pm.me" } +] + +[project.urls] +Homepage = "https://gitea.raggaroth-factory.fr/public/elironwars-python" +Documentation = "https://gitea.raggaroth-factory.fr/public/elironwars-python/wiki" +Repository = "https://gitea.raggaroth-factory.fr/public/elironwars-python.git" +Issues = "https://gitea.raggaroth-factory.fr/public/elironwars-python/issues" +Changelog = "https://github.com/me/spam/blob/master/CHANGELOG.md" + +[build-system] +requires = ["setuptools >= 77.0.3"] +build-backend = "setuptools.build_meta" + +[project.scripts] +elironwars = "elironwars.app:app" + +[tool.isort] +profile = "black" +src_paths = ["src", "tests"] +known_first_party = ["elironwars"] + +[tool.autopep8] +max_line_length = 120 +in-place = true +recursive = true -- 2.52.0 From 4cfa6b72ff2849aa574f7a640f3f789073245cff Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 20:25:49 +0200 Subject: [PATCH 20/29] =?UTF-8?q?=F0=9F=94=A8=20update=20formatter=20util?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- format.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/format.sh b/format.sh index abfd74b..b8f0563 100755 --- a/format.sh +++ b/format.sh @@ -1,2 +1,2 @@ -isort $1 -autopep8 -i --max-line-length=120 $1 +isort src tests +autopep8 src tests -- 2.52.0 From 35ec79e7e5c28eaae41955adf0ae46f7637f9aba Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 20:42:51 +0200 Subject: [PATCH 21/29] =?UTF-8?q?=F0=9F=9A=9A=20mv=20menu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 46 +----------------------------- src/elironwars/menu.py | 64 +++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 67 deletions(-) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 678ea5c..88aa552 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -1,53 +1,9 @@ -import os import sys -from enum import Enum from .base_mob import BaseMob from .character_builder import CharacterBuilder from .level import Level - - -class Action(Enum): - PIECE_SUIVANTE = (1, "Pièce suivante") - COMBAT = (2, "Combat") - FUIR = (3, "Fuir") - QUITTER = (4, "Quitter") - - @property - def code(self): - return self.value[0] - - @property - def libelle(self): - return self.value[1] - - -def clear_console() -> None: - os.system('cls' if os.name == 'nt' else 'clear') - - -def action_menu(actions_autorisees: list[Action] = None) -> Action: - """Affiche le menu et retourne une action valide.""" - - actions_autorisees = list(Action) if actions_autorisees is None else actions_autorisees - - while True: - print("\n------ Menu Action ------\n") - - for action in actions_autorisees: - print(f"{action.libelle:<20} : {action.code}") - - try: - choix = int(input("\nChoix : ")) - clear_console() - for action in actions_autorisees: - if action.code == choix: - return action - - print("Mauvais choix") - except ValueError: - clear_console() - print("Veuillez saisir un nombre.") +from .menu import Action, action_menu def play_room(room: list[BaseMob], level: Level) -> int: diff --git a/src/elironwars/menu.py b/src/elironwars/menu.py index df04b3a..0d10d47 100644 --- a/src/elironwars/menu.py +++ b/src/elironwars/menu.py @@ -1,25 +1,45 @@ - -# def main_loop(breaker:bool): -# pass - -# def menu (): -# print("Nouvelle partie :\t1") -# print("Charger :\t\t2") -# print("Option :\t\t3") -# print("Quitter :\t\t4") -# return int(input("Choix : ")) +import os +from enum import Enum -# choix = menu() +class Action(Enum): + PIECE_SUIVANTE = (1, "Pièce suivante") + COMBAT = (2, "Combat") + FUIR = (3, "Fuir") + QUITTER = (4, "Quitter") -# match choix: -# case 1: -# print("Nouvelle partie") -# case 2: -# print("Charger") -# case 3: -# print("Option") -# case 4: -# print("Quitter") -# case _: -# print("Mauvais choix") + @property + def code(self): + return self.value[0] + + @property + def libelle(self): + return self.value[1] + + +def clear_console() -> None: + os.system('cls' if os.name == 'nt' else 'clear') + + +def action_menu(actions_autorisees: list[Action] = None) -> Action: + """Affiche le menu et retourne une action valide.""" + + actions_autorisees = list(Action) if actions_autorisees is None else actions_autorisees + + while True: + print("\n------ Menu Action ------\n") + + for action in actions_autorisees: + print(f"{action.libelle:<20} : {action.code}") + + try: + choix = int(input("\nChoix : ")) + clear_console() + for action in actions_autorisees: + if action.code == choix: + return action + + print("Mauvais choix") + except ValueError: + clear_console() + print("Veuillez saisir un nombre.") -- 2.52.0 From 1c260707980820321975a3f663bdf1c7ee3c3495 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 20:58:29 +0200 Subject: [PATCH 22/29] =?UTF-8?q?=F0=9F=9A=A7=20wip=20refactoring=20mob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 4 ++-- src/elironwars/mob/__init__.py | 0 src/elironwars/{ => mob}/base_mob.py | 0 src/elironwars/{ => mob}/character_builder.py | 0 src/elironwars/{ => mob}/pydantic_character_builder.py | 0 src/elironwars/mobs_utils.py | 2 +- tests/test_character_builder.py | 4 ++-- 7 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 src/elironwars/mob/__init__.py rename src/elironwars/{ => mob}/base_mob.py (100%) rename src/elironwars/{ => mob}/character_builder.py (100%) rename src/elironwars/{ => mob}/pydantic_character_builder.py (100%) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 88aa552..c9172fe 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -1,7 +1,7 @@ import sys -from .base_mob import BaseMob -from .character_builder import CharacterBuilder +from elironwars.mob.base_mob import BaseMob +from elironwars.mob.character_builder import CharacterBuilder from .level import Level from .menu import Action, action_menu diff --git a/src/elironwars/mob/__init__.py b/src/elironwars/mob/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/elironwars/base_mob.py b/src/elironwars/mob/base_mob.py similarity index 100% rename from src/elironwars/base_mob.py rename to src/elironwars/mob/base_mob.py diff --git a/src/elironwars/character_builder.py b/src/elironwars/mob/character_builder.py similarity index 100% rename from src/elironwars/character_builder.py rename to src/elironwars/mob/character_builder.py diff --git a/src/elironwars/pydantic_character_builder.py b/src/elironwars/mob/pydantic_character_builder.py similarity index 100% rename from src/elironwars/pydantic_character_builder.py rename to src/elironwars/mob/pydantic_character_builder.py diff --git a/src/elironwars/mobs_utils.py b/src/elironwars/mobs_utils.py index 88e309f..fd8b399 100644 --- a/src/elironwars/mobs_utils.py +++ b/src/elironwars/mobs_utils.py @@ -1,6 +1,6 @@ import random -from .base_mob import BaseMob +from elironwars.mob.base_mob import BaseMob # Créer des instances de BaseMob yanaar = BaseMob("Yanaar", 15, 2, 1, 3, 2) diff --git a/tests/test_character_builder.py b/tests/test_character_builder.py index 4aee50d..18518d9 100644 --- a/tests/test_character_builder.py +++ b/tests/test_character_builder.py @@ -3,8 +3,8 @@ import pathlib import unittest from unittest.mock import patch -from elironwars.base_mob import BaseMob -from elironwars.character_builder import CharacterBuilder +from elironwars.mob.base_mob import BaseMob +from elironwars.mob.character_builder import CharacterBuilder ARTHUR_JSON = """{ "name": "Arthur", -- 2.52.0 From 73b918f2f1a19528d03704d62fd2dcf2eddfa2b1 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:13:12 +0200 Subject: [PATCH 23/29] =?UTF-8?q?=F0=9F=9A=A7=20wip=20refactoring=20mob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 14 +++++++++++--- src/elironwars/level.py | 7 ++----- src/elironwars/mobs_utils.py | 27 +++++++++------------------ 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index c9172fe..413cc28 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -1,9 +1,9 @@ import sys -from elironwars.mob.base_mob import BaseMob -from elironwars.mob.character_builder import CharacterBuilder from .level import Level from .menu import Action, action_menu +from .mob.base_mob import BaseMob +from .mob.character_builder import CharacterBuilder def play_room(room: list[BaseMob], level: Level) -> int: @@ -50,7 +50,15 @@ def app() -> None: print(loaded_character) - level = Level(2, loaded_character) + # Créer des instances de BaseMob + yanaar = BaseMob("Yanaar", 15, 2, 1, 3, 2) + ulnarain = BaseMob("Ulnarain", 20, 3, 3, 2, 2) + skroll = BaseMob("Skroll", 25, 5, 3, 1, 2) + + # Liste d'instances de BaseMob (au lieu d'un ensemble pour autoriser des doublons) + mobs_list = [yanaar, skroll, ulnarain] + + level = Level(2, loaded_character, mobs_list) print(f"Nombre de pièce dans le donjon : {len(level.rooms)}") play_donjon(level) diff --git a/src/elironwars/level.py b/src/elironwars/level.py index 549c9fe..1eb3373 100644 --- a/src/elironwars/level.py +++ b/src/elironwars/level.py @@ -1,16 +1,13 @@ -""" Class Level """ -import random - from .mobs_utils import generate_random_mob_list, generate_random_rooms class Level: """ Class Level """ - def __init__(self, difficulty, player): + def __init__(self, difficulty, player, mob_list): """ Chargement du niveau """ print("Loading Level") - self.mobs_in_level = generate_random_mob_list(random.randint(2, difficulty)) + self.mobs_in_level = generate_random_mob_list(mob_list, difficulty) self.exit_level = True self.player = player self.rooms = generate_random_rooms(self.mobs_in_level, difficulty) # Liste des pièces du niveau diff --git a/src/elironwars/mobs_utils.py b/src/elironwars/mobs_utils.py index fd8b399..94b5596 100644 --- a/src/elironwars/mobs_utils.py +++ b/src/elironwars/mobs_utils.py @@ -1,28 +1,19 @@ import random -from elironwars.mob.base_mob import BaseMob -# Créer des instances de BaseMob -yanaar = BaseMob("Yanaar", 15, 2, 1, 3, 2) -ulnarain = BaseMob("Ulnarain", 20, 3, 3, 2, 2) -skroll = BaseMob("Skroll", 25, 5, 3, 1, 2) - -# Liste d'instances de BaseMob (au lieu d'un ensemble pour autoriser des doublons) -mobs_list = [yanaar, skroll, ulnarain] - - -def generate_random_mob_list(max_mobs): +def generate_random_mob_list(mob_list, max_mobs): """ - Génère une liste aléatoire de mobs à partir de la liste des instances disponibles. + Génère une liste aléatoire de mobs à partir de la liste fournie. - :param max_mobs: Le nombre maximum de mobs dans la liste générée. - :return: Une liste de mobs sélectionnés aléatoirement. + :param mob_list: Liste de mob a choisir aleatoirement. + :param max_mobs: Le nombre maximum de mobs dans la liste générée. + :return: Une liste de mobs sélectionnés aléatoirement. """ if max_mobs <= 0: return [] num_mobs = random.randint(2, max_mobs) - selected_mobs = [random.choice(mobs_list) for _ in range(num_mobs)] + selected_mobs = [random.choice(mob_list) for _ in range(num_mobs)] return selected_mobs @@ -30,9 +21,9 @@ def generate_random_rooms(mobs_in_level, num_rooms): """ Génère un nombre spécifié de pièces et y distribue les mobs disponibles. - :param mobs_in_level: Liste des mobs disponibles pour le niveau. - :param num_rooms: Nombre total de pièces à générer. - :return: Une liste de pièces, chaque pièce contenant un ou plusieurs mobs, ou étant vide si aucun mob n'est disponible. + :param mobs_in_level: Liste des mobs disponibles pour le niveau. + :param num_rooms: Nombre total de pièces à générer. + :return: Une liste de pièces, chaque pièce contenant un ou plusieurs mobs, ou étant vide si aucun mob n'est disponible. """ rooms = [] -- 2.52.0 From 4583fcdea67dd35a2b5d8dc9ff6fc9a6bc2004b5 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:14:32 +0200 Subject: [PATCH 24/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactoring=20mob=20?= =?UTF-8?q?utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/level.py | 2 +- src/elironwars/{mobs_utils.py => random_utils.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/elironwars/{mobs_utils.py => random_utils.py} (100%) diff --git a/src/elironwars/level.py b/src/elironwars/level.py index 1eb3373..b76d7a3 100644 --- a/src/elironwars/level.py +++ b/src/elironwars/level.py @@ -1,4 +1,4 @@ -from .mobs_utils import generate_random_mob_list, generate_random_rooms +from .random_utils import generate_random_mob_list, generate_random_rooms class Level: diff --git a/src/elironwars/mobs_utils.py b/src/elironwars/random_utils.py similarity index 100% rename from src/elironwars/mobs_utils.py rename to src/elironwars/random_utils.py -- 2.52.0 From 3d43f3ee663ed77a076c612587c2bc8ad3874075 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:36:19 +0200 Subject: [PATCH 25/29] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20wip=20refactoring=20?= =?UTF-8?q?builder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 5 +- src/elironwars/mob/__init__.py | 19 ++++ src/elironwars/mob/character_builder.py | 105 ------------------ src/elironwars/mob/default_builder.py | 65 +++++++++++ ...aracter_builder.py => pydantic_builder.py} | 0 tests/test_character_builder.py | 2 +- 6 files changed, 87 insertions(+), 109 deletions(-) delete mode 100644 src/elironwars/mob/character_builder.py create mode 100644 src/elironwars/mob/default_builder.py rename src/elironwars/mob/{pydantic_character_builder.py => pydantic_builder.py} (100%) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 413cc28..51cad90 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -2,8 +2,7 @@ import sys from .level import Level from .menu import Action, action_menu -from .mob.base_mob import BaseMob -from .mob.character_builder import CharacterBuilder +from .mob import BaseMob, load_character, save_character def play_room(room: list[BaseMob], level: Level) -> int: @@ -44,7 +43,7 @@ def play_donjon(level: Level) -> None: def app() -> None: - loaded_character = CharacterBuilder.load_character(sys.argv[1] if len(sys.argv) > 1 else "Jamin") + loaded_character = load_character(sys.argv[1] if len(sys.argv) > 1 else "Jamin") if not loaded_character: sys.exit(-1) diff --git a/src/elironwars/mob/__init__.py b/src/elironwars/mob/__init__.py index e69de29..9a8ab10 100644 --- a/src/elironwars/mob/__init__.py +++ b/src/elironwars/mob/__init__.py @@ -0,0 +1,19 @@ +import importlib.util +import os +import sys + +from .base_mob import BaseMob + +pydantic = None +name = 'pydantic' +if name in sys.modules: + pydantic = sys.modules[name] +elif (spec := importlib.util.find_spec(name)) is not None: + pydantic = importlib.util.module_from_spec(spec) + sys.modules[name] = pydantic + spec.loader.exec_module(pydantic) + +if pydantic and os.environ.get('ELIRON_BUILDER') == 'pydantic': + from .pydantic_builder import load_character, save_character +else: + from .default_builder import load_character, save_character diff --git a/src/elironwars/mob/character_builder.py b/src/elironwars/mob/character_builder.py deleted file mode 100644 index 713f7e3..0000000 --- a/src/elironwars/mob/character_builder.py +++ /dev/null @@ -1,105 +0,0 @@ -import importlib.util -import json -import os -import sys -from typing import Callable - -from .base_mob import BaseMob - - -class CharacterBuilder: - save_character_impl: Callable[[BaseMob], str] - load_character_impl: Callable[[str], None] - - @classmethod - def build_character(cls): - """Demande à l'utilisateur de saisir les attributs du personnage.""" - print("Création d'un nouveau personnage :") - name = input("Nom du personnage : ") - max_pv = int(input("Points de vie maximum : ")) - strength = int(input("Force : ")) - protection = int(input("Protection : ")) - speed = int(input("Vitesse : ")) - mob_type = 0 - return BaseMob(name, max_pv, strength, protection, speed, mob_type) - - @classmethod - def save_character(cls, character: BaseMob) -> None: - """Enregistre un personnage dans un fichier JSON.""" - filename = cls.save_character_impl(character) - print(f"Personnage enregistré dans {filename}.") - - @classmethod - def load_character(cls, name: str) -> BaseMob | None: - """Charge un personnage à partir d'un fichier JSON.""" - try: - return cls.load_character_impl(name) - except Exception as e: - return None - - -def save_character(character: BaseMob) -> str: - """Enregistre un personnage dans un fichier JSON.""" - character_data = { - "name": character.name, - "max_pv": character.max_pv, - "current_pv": character.current_pv, - "strength": character.strength, - "protection": character.protection, - "speed": character.speed, - "mob_type": character.mob_type - } - filename = character.name + ".json" - with open(filename, "w", encoding='UTF-8') as file: - json.dump(character_data, file, indent=4) - return filename - - -def load_character(name: str) -> BaseMob | None: - """Charge un personnage à partir d'un fichier JSON.""" - filename = name + ".json" - if not os.path.exists(filename): - print(f"Erreur : Le fichier {filename} n'existe pas.") - return None - - try: - with open(filename, "r", encoding='UTF-8') as file: - character_data = json.load(file) - - # Vérification des clés essentielles dans le JSON pour éviter les erreurs - required_keys = ["name", "max_pv", "current_pv", - "strength", "protection", "speed", "mob_type"] - if not all(key in character_data for key in required_keys): - print(f"Erreur : Le fichier {filename} ne contient pas toutes les clés nécessaires.") - return None - - # Construction du personnage - return BaseMob( - name=character_data["name"], - max_pv=character_data["max_pv"], - strength=character_data["strength"], - protection=character_data["protection"], - speed=character_data["speed"], - mob_type=character_data["mob_type"] - ) - except json.JSONDecodeError: - print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.") - return None - - -pydantic = None -name = 'pydantic' -if name in sys.modules: - pydantic = sys.modules[name] -elif (spec := importlib.util.find_spec(name)) is not None: - pydantic = importlib.util.module_from_spec(spec) - sys.modules[name] = pydantic - spec.loader.exec_module(pydantic) - -if pydantic and os.environ.get('ELIRON_BUILDER') == 'pydantic': - pydantic_character_builder = importlib.import_module('pydantic_character_builder') - CharacterBuilder.save_character_impl = pydantic_character_builder.save_character - CharacterBuilder.load_character_impl = pydantic_character_builder.load_character -else: - CharacterBuilder.save_character_impl = save_character - CharacterBuilder.load_character_impl = load_character diff --git a/src/elironwars/mob/default_builder.py b/src/elironwars/mob/default_builder.py new file mode 100644 index 0000000..a8f29c9 --- /dev/null +++ b/src/elironwars/mob/default_builder.py @@ -0,0 +1,65 @@ +import json +import os + +from .base_mob import BaseMob + + +def build_character(): + """Demande à l'utilisateur de saisir les attributs du personnage.""" + print("Création d'un nouveau personnage :") + name = input("Nom du personnage : ") + max_pv = int(input("Points de vie maximum : ")) + strength = int(input("Force : ")) + protection = int(input("Protection : ")) + speed = int(input("Vitesse : ")) + mob_type = 0 + return BaseMob(name, max_pv, strength, protection, speed, mob_type) + + +def save_character(character: BaseMob) -> str: + """Enregistre un personnage dans un fichier JSON.""" + character_data = { + "name": character.name, + "max_pv": character.max_pv, + "current_pv": character.current_pv, + "strength": character.strength, + "protection": character.protection, + "speed": character.speed, + "mob_type": character.mob_type + } + filename = character.name + ".json" + with open(filename, "w", encoding='UTF-8') as file: + json.dump(character_data, file, indent=4) + return filename + + +def load_character(name: str) -> BaseMob | None: + """Charge un personnage à partir d'un fichier JSON.""" + filename = name + ".json" + if not os.path.exists(filename): + print(f"Erreur : Le fichier {filename} n'existe pas.") + return None + + try: + with open(filename, "r", encoding='UTF-8') as file: + character_data = json.load(file) + + # Vérification des clés essentielles dans le JSON pour éviter les erreurs + required_keys = ["name", "max_pv", "current_pv", + "strength", "protection", "speed", "mob_type"] + if not all(key in character_data for key in required_keys): + print(f"Erreur : Le fichier {filename} ne contient pas toutes les clés nécessaires.") + return None + + # Construction du personnage + return BaseMob( + name=character_data["name"], + max_pv=character_data["max_pv"], + strength=character_data["strength"], + protection=character_data["protection"], + speed=character_data["speed"], + mob_type=character_data["mob_type"] + ) + except json.JSONDecodeError: + print(f"Erreur : Le fichier {filename} n'est pas un JSON valide.") + return None diff --git a/src/elironwars/mob/pydantic_character_builder.py b/src/elironwars/mob/pydantic_builder.py similarity index 100% rename from src/elironwars/mob/pydantic_character_builder.py rename to src/elironwars/mob/pydantic_builder.py diff --git a/tests/test_character_builder.py b/tests/test_character_builder.py index 18518d9..e3e0414 100644 --- a/tests/test_character_builder.py +++ b/tests/test_character_builder.py @@ -4,7 +4,7 @@ import unittest from unittest.mock import patch from elironwars.mob.base_mob import BaseMob -from elironwars.mob.character_builder import CharacterBuilder +from elironwars.mob.default_builder import CharacterBuilder ARTHUR_JSON = """{ "name": "Arthur", -- 2.52.0 From 9e7968b6b344f43e1cb1a5d48d491ebe4f306b0d Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:43:07 +0200 Subject: [PATCH 26/29] =?UTF-8?q?=E2=9C=85=20fix=20builder=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_character_builder.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_character_builder.py b/tests/test_character_builder.py index e3e0414..e7cbce1 100644 --- a/tests/test_character_builder.py +++ b/tests/test_character_builder.py @@ -3,8 +3,8 @@ import pathlib import unittest from unittest.mock import patch -from elironwars.mob.base_mob import BaseMob -from elironwars.mob.default_builder import CharacterBuilder +from elironwars.mob import BaseMob, save_character, load_character +from elironwars.mob.default_builder import build_character ARTHUR_JSON = """{ "name": "Arthur", @@ -37,7 +37,7 @@ class TestCharacterBuilder(unittest.TestCase): ] # Act - character = CharacterBuilder.build_character() + character = build_character() # Assert self.assertIsInstance(character, BaseMob) @@ -60,7 +60,7 @@ class TestCharacterBuilder(unittest.TestCase): ) # Act - CharacterBuilder.save_character(character) + save_character(character) # Assert self.assertTrue(ARTHUR_FILE.exists()) @@ -68,7 +68,7 @@ class TestCharacterBuilder(unittest.TestCase): def test_load_character_file_not_found(self): # Act - result = CharacterBuilder.load_character("Lancelot") + result = load_character("Lancelot") # Assert self.assertIsNone(result) @@ -78,7 +78,7 @@ class TestCharacterBuilder(unittest.TestCase): ARTHUR_FILE.write_text(ARTHUR_JSON, encoding='utf-8') # Act - character = CharacterBuilder.load_character("Arthur") + character = load_character("Arthur") # Assert self.assertIsNotNone(character) @@ -101,7 +101,7 @@ class TestCharacterBuilder(unittest.TestCase): invalid_dict), encoding='utf-8') # Act - result = CharacterBuilder.load_character("Arthur") + result = load_character("Arthur") # Assert self.assertIsNone(result) @@ -111,7 +111,7 @@ class TestCharacterBuilder(unittest.TestCase): ARTHUR_FILE.write_text(ARTHUR_JSON[1:], encoding='utf-8') # Act - result = CharacterBuilder.load_character("Arthur") + result = load_character("Arthur") # Assert self.assertIsNone(result) -- 2.52.0 From abb1631414cc0c3d311bbd5545f9ebee6b2072b6 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:44:19 +0200 Subject: [PATCH 27/29] =?UTF-8?q?=F0=9F=8E=A8=20unused=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/elironwars/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elironwars/app.py b/src/elironwars/app.py index 51cad90..8e086b9 100644 --- a/src/elironwars/app.py +++ b/src/elironwars/app.py @@ -2,7 +2,7 @@ import sys from .level import Level from .menu import Action, action_menu -from .mob import BaseMob, load_character, save_character +from .mob import BaseMob, load_character def play_room(room: list[BaseMob], level: Level) -> int: -- 2.52.0 From f5716038667e8d43a5b006b681eee9c6880f06e3 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:46:49 +0200 Subject: [PATCH 28/29] =?UTF-8?q?=F0=9F=99=88=20ignore=20build=20folder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f8f9316..cc4f0da 100644 --- a/.gitignore +++ b/.gitignore @@ -53,4 +53,4 @@ __pycache__/ .pydevproject *.egg-info - +build -- 2.52.0 From 464adfa338751ff45c54bca5c6faaba946a9a589 Mon Sep 17 00:00:00 2001 From: anthony-melin Date: Fri, 17 Jul 2026 21:48:48 +0200 Subject: [PATCH 29/29] =?UTF-8?q?=F0=9F=9A=9A=20mv=20builder=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/mob/__init__.py | 0 tests/{test_character_builder.py => mob/test_builder.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/mob/__init__.py rename tests/{test_character_builder.py => mob/test_builder.py} (100%) diff --git a/tests/mob/__init__.py b/tests/mob/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_character_builder.py b/tests/mob/test_builder.py similarity index 100% rename from tests/test_character_builder.py rename to tests/mob/test_builder.py -- 2.52.0