<commit_before># -*-coding:utf-8 -*
import pygame, math, narro.directions, narro.tmxreader, numpy, os, sys
from pygame.locals import *
from narro import *
import pygame.surfarray as surfarray
from collections import OrderedDict
from .tile import *
from .constantes import *
from .observateur import *
from .zonePensee import *

if SESSION_DEBUG:
    import pdb


class Carte(Observateur):
    """Classe représentant une carte au niveau des données"""
    def __init__(self, nomCarte, jeu): 
        """Initialise la carte à exécuter  <carte> à partir des données issues de son fichier SQMAP.
        Cette méthode se charge surtout du transfert du format de carte .narromap à celui du Narro Engine (purement mémoriel)."""
        Observateur.__init__(self)
        self._carteTiled = tmxreader.TileMapParser().parse_decode(os.path.join(DOSSIER_RESSOURCES, nomCarte + ".tmx"))
        self._nom, self._description = self._carteTiled.properties.get("nom", nomCarte), self._carteTiled.properties.get("description", "")
        self._musique = self._carteTiled.properties.get("musique", "")
        self._longueur, self._largeur = self._carteTiled.width, self._carteTiled.height
        self._nombreCouches, self._hauteurTile = len(self._carteTiled.layers), self._carteTiled.tilewidth
        self._scrollingX, self._scrollingY = 0,0
        self._jeu, self._toutAChanger = jeu, True
        self._dicoSurfaces, self._tiles, self._tileRect, self._tilesEtendus, self._blocsRef, self._pnj, i = dict(), list(), Rect(0, 0, 32, 32), dict(), list(), dict(), 0
        self._subTilesEtendus, self._subTilesBlittes, self._ecran = dict(), list(), Rect(0, 0, self._longueur*32, self._largeur*32)
        self._scrollingPossible, self._etapeScrolling = False, 0
        self._surfaceZonePensee, self._positionZonePensee, self._besoinAffichageZonePensee, self._faceActuelle = None, None, False, False
        self._emplacementScrollingX, self._emplacementScrollingY = int(int(FENETRE["longueurFenetre"]/2) / 32)*32, int(int(FENETRE["largeurFenetre"]/2)/32)*32
        self._ecranVisible = Rect(0, 0, FENETRE["longueurFenetre"], FENETRE["largeurFenetre"])
        self._positionsDepart, self._polices = dict(), dict()
        self._ajouterPolice(NOM_FICHIER_POLICE_PAR_DEFAUT, TAILLE_POLICE_SPLASH_SCREEN)
        self._fenetre, self._blitFrame = self._jeu.fenetre, False
        self._transformationsGlobales, self._transformationsParties, self._parametresTransformations = list(), list(), dict()
        self._idParametres, self._donneesParametres, self._messagesCollision = dict(), dict(), list()

        self._dicoGid = dict()
        for tileset in self._carteTiled.tile_sets:
            for image in tileset.images:
                self._ajouterSurface(False, image.source, False, tileset=tileset, mobile=False)
            
        self._tilesLayers = []
        i, x, y = 0, 0, 0
        while i < self._nombreCouches:
            x = 0
            self._tilesLayers.append(pygame.Surface((self._longueur * 32, self._largeur * 32), flags=SRCALPHA))
            self._pnj[i] = dict()
            while x < self._longueur:
                y = 0
                self._tiles.append(list())
                while y < self._largeur:
                    self._tiles[x].append(Tile(self._nombreCouches))
                    gid = self._carteTiled.layers[i].content2D[x][y]
                    if gid != 0: #Bloc plein
                        if gid not in self._tilesEtendus.keys(): #Tile plein standard
                            self._tiles[x][y].bloc.append(Bloc(infos=self._dicoGid[gid]))
                            surfaceTileset, positionSource = self._dicoSurfaces[self._dicoGid[gid][0]]["Source"], self._dicoGid[gid][2]
                            self._tilesLayers[i].blit(surfaceTileset, (x * self._hauteurTile, y * self._hauteurTile), area=positionSource) 
                        else: #Tile étendu formé de sous-tiles
                            self._tiles[x][y].bloc.append(Bloc(vide=True)) #On met un tile vide en la position de réf du tile étendu ; ce sera complété avec un sous-tile étendu
                            if i == 0:
                                self._tilesLayers[i].fill((0,0,0), (x * self._hauteurTile, y * self._hauteurTile, self._hauteurTile, self._hauteurTile))
                            ####
                            positionSource = self._dicoGid[gid][2]
                            longueurTileset, largeurTileset = int(positionSource[2]/self._hauteurTile), int(positionSource[3]/self._hauteurTile)
                            xMin, yMin = x, y - largeurTileset + 1
                            xMax, yMax, xActuel, yActuel, i2 = xMin + longueurTileset, yMin + largeurTileset, xMin, yMin, 0
                            (praticabilites, couches) = self._tilesEtendus[gid] 
                            couches = [i if c == -1 else int(c) for c in couches] #-1 est la valeur par défaut pour dire la couche du tile étendu 
                            while yActuel < yMax:
                                xActuel = xMin
                                while xActuel < xMax:
                                    self._subTilesEtendus.setdefault((xActuel, yActuel, couches[i2]), [])
                                    positionSourceSubTile = positionSource[0] + ((xActuel-xMin)*self._hauteurTile), positionSource[1] + ((yActuel-yMin)*self._hauteurTile), self._hauteurTile, self._hauteurTile
                                    self._subTilesEtendus[(xActuel, yActuel, couches[i2])].append((couches[i2], praticabilites[i2], positionSourceSubTile, self._dicoGid[gid][0]))
                                    if (xActuel <= x or yActuel <= y) and couches[i2] <= i:
                                        self._completerAvecTileEtendu(xActuel,yActuel,couches[i2])
                                    xActuel, i2 = xActuel + 1, i2 + 1
                                yActuel += 1
                    else: #Bloc vide
                        self._tiles[x][y].bloc.append(Bloc(vide=True))
                        if i == 0: #Sur la couche 0, il faut mettre du noir pour les blocs vides
                            self._tilesLayers[i].fill((0,0,0), (x * self._hauteurTile, y * self._hauteurTile, self._hauteurTile, self._hauteurTile))
                    if (x,y,i) in self._subTilesEtendus.keys() and (x,y,i) not in self._subTilesBlittes: #Un sous-tile étendu en cette position qu'on n'a pas encore blitté
                        self._completerAvecTileEtendu(x,y,i)
                    if i == self._nombreCouches - 1:
                        self._tiles[x][y].recalculerPraticabilites()
                    y += 1
                x += 1
            i += 1
        del self._dicoGid

    def _completerAvecTileEtendu(self, x, y, c, initialisation=True):
        for tileEtendu in self._subTilesEtendus[x,y,c]:
            if initialisation:
                self._tiles[x][y].ajouterTileEtendu(*tileEtendu)
            surfaceTileset, positionSource = self._dicoSurfaces[tileEtendu[3]]["Source"], tileEtendu[2]
            self._tilesLayers[c].blit(surfaceTileset, (x * self._hauteurTile, y * self._hauteurTile), area=positionSource) 
            self._subTilesBlittes.append((x,y,c))

    def _completerDicoGids(self, nomTileset, tileset, longueur, largeur):
        """Lors du chargement d'un tileset dans _ajouterSurface (quand une carte est créée), cette fonction se charge de faire correspondre à chaque tile du tileset les infos
        qui lui correspondent. 1 Tile dans le tileset = 1 GID = 1 position source, 1 praticabilité, 1 nom de tileset"""
        gid, idTileset, x, y, tileWidth, tileHeight = int(tileset.firstgid), 0, 0, 0, int(tileset.tilewidth), int(tileset.tileheight)
        tilesEtendus = tileset.properties.get("tileEtendu", False)
        while y < largeur:
            x = 0
            while x < longueur:
                if len(tileset.tiles) > 0:
                    praticabilite = tileset.tiles[idTileset].properties.get("Praticabilite", False) == "True"
                else: #Tileset importé d'ailleurs, les praticabilités n'ont pas été indiquées
                    praticabilite = True
                self._dicoGid[gid] = nomTileset, praticabilite, (x, y, tileWidth, tileHeight)
                if tilesEtendus: #On récupère les praticabilités et couches des sous-tiles
                    if "Praticabilites" in tileset.tiles[idTileset].properties.keys():
                        praticabilitesTile =tileset.tiles[idTileset].properties["Praticabilites"].split(",") 
                        praticabilitesTile = [praticabiliteTile == "True" for praticabiliteTile in praticabilitesTile]
                    else:
                        praticabilitesTile = [praticabilite] * ( int(tileWidth/self._hauteurTile) * int(tileHeight/self._hauteurTile) )
                    if "Couches" in tileset.tiles[idTileset].properties.keys():<commit_msg>Correction de l'ordre d'affichage des autotiles<commit_after># -*-coding:utf-8 -*
import pygame, math, narro.directions, narro.tmxreader, numpy, os, sys
from pygame.locals import *
from narro import *
import pygame.surfarray as surfarray
from collections import OrderedDict
from .tile import *
from .constantes import *
from .observateur import *
from .zonePensee import *

if SESSION_DEBUG:
    import pdb


class Carte(Observateur):
    """Classe représentant une carte au niveau des données"""
    def __init__(self, nomCarte, jeu): 
        """Initialise la carte à exécuter  <carte> à partir des données issues de son fichier SQMAP.
        Cette méthode se charge surtout du transfert du format de carte .narromap à celui du Narro Engine (purement mémoriel)."""
        Observateur.__init__(self)
        self._carteTiled = tmxreader.TileMapParser().parse_decode(os.path.join(DOSSIER_RESSOURCES, nomCarte + ".tmx"))
        self._nom, self._description = self._carteTiled.properties.get("nom", nomCarte), self._carteTiled.properties.get("description", "")
        self._musique = self._carteTiled.properties.get("musique", "")
        self._longueur, self._largeur = self._carteTiled.width, self._carteTiled.height
        self._nombreCouches, self._hauteurTile = len(self._carteTiled.layers), self._carteTiled.tilewidth
        self._scrollingX, self._scrollingY = 0,0
        self._jeu, self._toutAChanger = jeu, True
        self._dicoSurfaces, self._tiles, self._tileRect, self._tilesEtendus, self._blocsRef, self._pnj, i = dict(), list(), Rect(0, 0, 32, 32), dict(), list(), dict(), 0
        self._subTilesEtendus, self._subTilesBlittes, self._ecran = dict(), list(), Rect(0, 0, self._longueur*32, self._largeur*32)
        self._scrollingPossible, self._etapeScrolling = False, 0
        self._surfaceZonePensee, self._positionZonePensee, self._besoinAffichageZonePensee, self._faceActuelle = None, None, False, False
        self._emplacementScrollingX, self._emplacementScrollingY = int(int(FENETRE["longueurFenetre"]/2) / 32)*32, int(int(FENETRE["largeurFenetre"]/2)/32)*32
        self._ecranVisible = Rect(0, 0, FENETRE["longueurFenetre"], FENETRE["largeurFenetre"])
        self._positionsDepart, self._polices = dict(), dict()
        self._ajouterPolice(NOM_FICHIER_POLICE_PAR_DEFAUT, TAILLE_POLICE_SPLASH_SCREEN)
        self._fenetre, self._blitFrame = self._jeu.fenetre, False
        self._transformationsGlobales, self._transformationsParties, self._parametresTransformations = list(), list(), dict()
        self._idParametres, self._donneesParametres, self._messagesCollision = dict(), dict(), list()

        self._dicoGid = dict()
        for tileset in self._carteTiled.tile_sets:
            for image in tileset.images:
                self._ajouterSurface(False, image.source, False, tileset=tileset, mobile=False)
            
        #Création des tiles vides, le parcours de blit a lieu ensuite
        self._tilesLayers = []
        i, x, y = 0, 0, 0
        while i < self._nombreCouches:
            x = 0
            self._tilesLayers.append(pygame.Surface((self._longueur * 32, self._largeur * 32), flags=SRCALPHA))
            self._pnj[i] = dict()
            while x < self._longueur:
                y = 0
                self._tiles.append(list())
                while y < self._largeur:
                    self._tiles[x].append(Tile(self._nombreCouches))
                    y += 1
                x += 1
            i += 1
        ###


        i, x, y = 0, 0, 0
        while i < self._nombreCouches:
            y = 0
            while y < self._largeur:
                x = 0
                while x < self._longueur:
                    gid = self._carteTiled.layers[i].content2D[x][y]
                    if gid != 0: #Bloc plein
                        if gid not in self._tilesEtendus.keys(): #Tile plein standard
                            self._tiles[x][y].bloc.append(Bloc(infos=self._dicoGid[gid]))
                            surfaceTileset, positionSource = self._dicoSurfaces[self._dicoGid[gid][0]]["Source"], self._dicoGid[gid][2]
                            self._tilesLayers[i].blit(surfaceTileset, (x * self._hauteurTile, y * self._hauteurTile), area=positionSource) 
                        else: #Tile étendu formé de sous-tiles
                            self._tiles[x][y].bloc.append(Bloc(vide=True)) #On met un tile vide en la position de réf du tile étendu ; ce sera complété avec un sous-tile étendu
                            if i == 0:
                                self._tilesLayers[i].fill((0,0,0), (x * self._hauteurTile, y * self._hauteurTile, self._hauteurTile, self._hauteurTile))
                            ####
                            positionSource = self._dicoGid[gid][2]
                            longueurTileset, largeurTileset = int(positionSource[2]/self._hauteurTile), int(positionSource[3]/self._hauteurTile)
                            xMin, yMin = x, y - largeurTileset + 1
                            xMax, yMax, xActuel, yActuel, i2 = xMin + longueurTileset, yMin + largeurTileset, xMin, yMin, 0
                            (praticabilites, couches) = self._tilesEtendus[gid] 
                            couches = [i if c == -1 else int(c) for c in couches] #-1 est la valeur par défaut pour dire la couche du tile étendu 
                            while yActuel < yMax:
                                xActuel = xMin
                                while xActuel < xMax:
                                    self._subTilesEtendus.setdefault((xActuel, yActuel, couches[i2]), [])
                                    positionSourceSubTile = positionSource[0] + ((xActuel-xMin)*self._hauteurTile), positionSource[1] + ((yActuel-yMin)*self._hauteurTile), self._hauteurTile, self._hauteurTile
                                    self._subTilesEtendus[(xActuel, yActuel, couches[i2])].append((couches[i2], praticabilites[i2], positionSourceSubTile, self._dicoGid[gid][0]))
                                    if couches[i2] <= i:
                                        self._completerAvecTileEtendu(xActuel,yActuel,couches[i2])
                                    xActuel, i2 = xActuel + 1, i2 + 1
                                yActuel += 1
                    else: #Bloc vide
                        self._tiles[x][y].bloc.append(Bloc(vide=True))
                        if i == 0: #Sur la couche 0, il faut mettre du noir pour les blocs vides
                            self._tilesLayers[i].fill((0,0,0), (x * self._hauteurTile, y * self._hauteurTile, self._hauteurTile, self._hauteurTile))
                    if i == self._nombreCouches - 1:
                        self._tiles[x][y].recalculerPraticabilites()
                    x += 1
                y += 1
            i += 1
        del self._dicoGid

    def _completerAvecTileEtendu(self, x, y, c, initialisation=True):
        for tileEtendu in self._subTilesEtendus[x,y,c]:
            if initialisation:
                self._tiles[x][y].ajouterTileEtendu(*tileEtendu)
            surfaceTileset, positionSource = self._dicoSurfaces[tileEtendu[3]]["Source"], tileEtendu[2]
            self._tilesLayers[c].blit(surfaceTileset, (x * self._hauteurTile, y * self._hauteurTile), area=positionSource) 
            self._subTilesBlittes.append((x,y,c))

    def _completerDicoGids(self, nomTileset, tileset, longueur, largeur):
        """Lors du chargement d'un tileset dans _ajouterSurface (quand une carte est créée), cette fonction se charge de faire correspondre à chaque tile du tileset les infos
        qui lui correspondent. 1 Tile dans le tileset = 1 GID = 1 position source, 1 praticabilité, 1 nom de tileset"""
        gid, idTileset, x, y, tileWidth, tileHeight = int(tileset.firstgid), 0, 0, 0, int(tileset.tilewidth), int(tileset.tileheight)
        tilesEtendus = tileset.properties.get("tileEtendu", False)
        while y < largeur:
            x = 0
            while x < longueur:
                if len(tileset.tiles) > 0:
                    praticabilite = tileset.tiles[idTileset].properties.get("Praticabilite", False) == "True"
                else: #Tileset importé d'ailleurs, les praticabilités n'ont pas été indiquées
                    praticabilite = True
                self._dicoGid[gid] = nomTileset, praticabilite, (x, y, tileWidth, tileHeight)
                if tilesEtendus: #On récupère les praticabilités et couches des sous-tiles
                    if "Praticabilites" in tileset.tiles[idTileset].properties.keys():
                        praticabilitesTile =tileset.tiles[idTileset].properties["Praticabilites"].split(",") 
                        praticabilitesTile = [praticabiliteTile == "True" for praticabiliteTile in praticabilitesTile]
                    else:
                        praticabilitesTile = [praticabilite] * ( int(tileWidth/self._hauteurTile) * int(tileHeight/self._hauteurTile) )
                    if "Couches" in tileset.tiles[idTileset].properties.keys():
{'fraction_non_alphanumeric': 0.10582779236743588, 'fraction_numerical': 0.010392803263116724, 'mean_word_length': 2.2150170648464163, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2506248', 'n_tokens_mistral': 5880, 'n_tokens_neox': 5602, 'n_words': 1217}