♻️ dynamic import of loader
This commit is contained in:
+84
-45
@@ -1,11 +1,18 @@
|
||||
from base_mob import BaseMob
|
||||
import importlib.util
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from typing import Callable
|
||||
|
||||
from base_mob import BaseMob
|
||||
|
||||
|
||||
class CharacterBuilder:
|
||||
@staticmethod
|
||||
def build_character():
|
||||
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 : ")
|
||||
@@ -16,51 +23,83 @@ class CharacterBuilder:
|
||||
mob_type = 0
|
||||
return BaseMob(name, max_pv, strength, protection, speed, mob_type)
|
||||
|
||||
@staticmethod
|
||||
def save_character(character):
|
||||
@classmethod
|
||||
def save_character(cls, character: BaseMob) -> None:
|
||||
"""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)
|
||||
filename = cls.save_character_impl(character)
|
||||
print(f"Personnage enregistré dans {filename}.")
|
||||
|
||||
@staticmethod
|
||||
def load_character(name):
|
||||
@classmethod
|
||||
def load_character(cls, 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 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
|
||||
|
||||
Reference in New Issue
Block a user