'problemes on entity instantiation?

I'm working on the pygame code for a game. I have a problem with the characters in my game: I can't instantiate characters (npcs) that aren't in the main map. As my other maps are not loaded at launch, my code gives me an error saying that the characters (npcs) of my code do not exist. How can I instantiate the characters of another map than the main one, so as not to have an error?.

Here is my code, thanks a lot for your help!

from dataclasses import dataclass
import playsound as playsound
import pygame, pytmx, pyscroll


from src.player import NPC


@dataclass
class Portal:
    from_world: str
    origin_point: str
    target_world: str
    teleport_point: str


@dataclass
class Music:
    musicCarte: str  # cette data classe permet de ranger les musqiue dans une liste , pareil pour les portails en haut


@dataclass
class Map:
    name: str
    walls: list[pygame.Rect]
    group: pyscroll.PyscrollGroup
    tmx_data: pytmx.TiledMap
    portail: list[Portal]
    # création des listes
    npcs: list[NPC]
    music: str









class MapManager:
    def __init__(self, screen, player,):

        self.maps = dict()  # "house -> Map("House", walls, group)
        self.screen = screen  # permet davoir le screen des cartes pour l'afficher
        self.player = player  # donne accées au joueur
        self.current_map = "CrapouliWolrd"
        self.map2 = "village"






        self.register_map("CrapouliWolrd", portail=[
            Portal(from_world="CrapouliWolrd", origin_point="enter_house", target_world="Maison_perso",
                   teleport_point="spawn_house", ),
            # ici on rentre les nouvelles maps avec leurs musique et leurs portails
            Portal(from_world="CrapouliWolrd", origin_point="enter_Foret", target_world="Foret",
                   teleport_point="spawn_Foret", )],
                          npcs=[
                              NPC("Perso", nb_points=2)],
                           music="../music/scandinavianz-nature-7504.mp3"



                          )

        self.register_map("Maison_perso", portail=[
            Portal(from_world="Maison_perso", origin_point="exit_house", target_world="CrapouliWolrd",
                   teleport_point="spawn_sortie",)
        ], music="../music/mercantile-the-legend-of-zelda-the-wind-waker-hd-ost.mp3")




        self.register_map("village", portail=[

                Portal(from_world="village", origin_point="entrer_house", target_world="Maison_perso",
                   teleport_point="spawn_house", ),
                Portal(from_world="village", origin_point="exit_village", target_world="Foret",
                   teleport_point="spawn_Foret", )

            ] ,  npcs=[
                    NPC("paul", nb_points=4),
                    NPC("robin", nb_points=1)

            ]
                          )

        self.register_map("Foret", portail=[
            Portal(from_world="Foret", origin_point="exit_foret", target_world="CrapouliWolrd",
                   teleport_point="spawn_zone1", ),
            Portal(from_world="Foret", origin_point="enter_village", target_world="village",
                   teleport_point="spawn_village"),
        ],  # music="../music/mercantile-the-legend-of-zelda-the-wind-waker-hd-ost.mp3"
                          )

        self.teleport_player("Player")
        self.teleport_npcs()









    def check_collisions(self):
        # portails
        for Portal in self.get_map().portail:

            if Portal.from_world == self.current_map:
                point = self.get_object(Portal.origin_point)
                rect = pygame.Rect(point.x, point.y, point.width, point.height)


                if self.player.feet.colliderect(rect):

                    copy_portal = Portal
                    self.current_map = Portal.target_world
                    self.teleport_player(copy_portal.teleport_point)


        # collision
        for sprite in self.get_group().sprites():
            if sprite.feet.collidelist(self.get_walls()) > -1:
                sprite.move_back()

    def teleport_player(self, name,):

        point = self.get_object(name)
        self.player.position[0] = point.x
        self.player.position[1] = point.y
        self.player.save_location()
        #pygame.mixer.Sound(self.get_map().music).play()





    def register_map(self, name, portail=[],
                     npcs=[], music=[]):  # oublie pas de remettre la musique                # on renseigne les listes ici

        tmx_data = pytmx.util_pygame.load_pygame(
            f"../Map/{name}.tmx")  # PERMET DOUVRIR LA MAP SUIVANT SON NOM ! grace a f""
        map_data = pyscroll.data.TiledMapData(tmx_data)
        map_layer = pyscroll.orthographic.BufferedRenderer(map_data, self.screen.get_size())
        map_layer.zoom = 3

        # DEFINIt la liste des rectangle de collision
        walls = []  ##et donc plus besoisn davoir self.walls pouisque le self est initialisé au debut

        for obj in tmx_data.objects:
            if obj.type == "colision":
                walls.append(pygame.Rect(obj.x, obj.y, obj.width, obj.height))

        # dessiner le groupe de calques
        group = pyscroll.PyscrollGroup(map_layer=map_layer, default_layer=6)
        group.add(self.player)  # ici on instancie le joueur dans les calques

        # RECUPERER TOUT LES NPCS POUR LES AJOUTER AU GROUPE
        for npc in npcs:
            group.add(npc)

        # cree un onjet map



        self.maps[name] = Map(name, walls, group, tmx_data, portail, npcs, music)




    def get_map(self):

        return self.maps[self.current_map]  # CETTE FONCTIOn permet d'afficher l'actuelle carte qui est en currentmap soit ici CrapouliWOrld



    def get_group(self):
        return self.get_map().group  # recupere le joueur dans la carte



    def get_walls(self):
        return self.get_map().walls  # recupere les murs de la maps


    def get_object(self, name):
        return self.get_map().tmx_data.get_object_by_name(name)




    def teleport_npcs(self):
        for map in self.maps:
            map_data = self.maps[map]
            npcs = map_data.npcs

            for npc in npcs:
                npc.load_points(self)
                npc.teleport_spawn()

                # permet de rentrer simplement get_object pour faire allusion a un objet du decors

    def draw(self):

        self.get_group().draw(self.screen)
        self.get_group().center(self.player.rect.center)





    def update(self):
        self.get_group().update()
        self.check_collisions()

        for npc in self.get_map().npcs:
            npc.move()

Error: KeyError: 'paul_path1'



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source