#-*- coding: utf-8 -*-

import json
import importlib


groupes  = {
    'ennemis'     : ['Ennemi1', 'Ennemi2'], #  , 'Ennemi3', 'Ennemi4'],
    'murs'        : ['Mur', 'Plateforme'],
    'obstacles'   : ['Obstacles'],
    'checkpoints' : ['Checkpoint'],
    'portails'    : ['Portail'],
    'joueur'      : ['Joueur'],
    'boss'        : ['Boss']
}

dynamiques = ['ennemis', 'checkpoints', 'joueur', 'checkpoints']


def groupe(classe) :

    for k, v in groupes.items() :
        if classe in v :
            return k

    return None


def constructionTiles(data) :

    tiles = {}

    for tileset in data['tilesets'] :

        setId = tileset['firstgid']

        image = 'img/' + tileset['name'] + '.png'

        tileHeight = tileset['tileheight']
        tileWidth  = tileset['tilewidth']

        gridWidth  = tileset['imagewidth'] / tileWidth
        gridHeight = tileset['imageheight'] / tileHeight
        grid       = gridWidth * gridHeight

        if 'tileproperties' in tileset :
            for t, val in tileset['tileproperties'].items() :
                id = setId + int(t)

                i = int(t) % gridWidth
                j = int(t) // gridHeight

                if 'class' in val :
                    classe = val['class']
                else :
                    classe = None

                if 'suivant' in val :
                    suivant = val['suivant']
                else:
                    suivant = None

                tiles[id] = {
                    'image' : image,
                    'rect'  : {
                        'x'     : j * tileWidth,
                        'y'     : i * tileHeight,
                        'width' : tileWidth,
                        'height': tileHeight
                        },
                    'classe'  : classe,
                    'groupe'  : groupe(classe),
                    'suivant' : suivant
                }

    #with open('lib/data.json', 'w') as outfile:
        #json.dump(tiles, outfile)

    return tiles


def recupererCalquePrincipal(data) :

    for l in data['layers'] :
        if l['name'] in ['Principal', 'principal'] :
            return l

def importClass(groupe, classe):

    if groupe not in ['ennemis', 'obstacles', 'murs', 'joueur'] :
        module = importlib.import_module(classe.lower())
    else :
        module = importlib.import_module('entites.' + classe.lower())

    return getattr(module, classe)


def construction(calque, tiles, tileWidth, tileHeight):

    niveau = {
        'murs':        [],
        'obstacles':   [],
        'plateformes': [],
        'ennemis':     [],
        'boss':        [],
        'checkpoints': [],
        'portails':    [],
        'joueur':      [],
        'width':       0,  #longueur du niveau en px
        'height':      0   #hauteur du niveau en px
    }

    layerWidth  = calque['width']
    layerHeight = calque['height']


    for index, item in enumerate(calque['data']) :

        if item != 0 and item in tiles:

            tile   = tiles[item]
            groupe = tile['groupe']
            classe = tile['classe']

            i = (index % layerWidth) * tileWidth
            j = (index // layerWidth) * tileHeight

            if groupe in niveau :

                if classe == "Joueur" :
                    instance = (i,j)
                elif classe == "Portail" :
                    instance = importClass(groupe, classe)((i,j), tile['suivant'])
                elif groupe in dynamiques :
                    instance = importClass(groupe, classe)((i,j))
                else :
                    instance = importClass(groupe, classe)((i,j), tile['image'], tile['rect'])

                niveau[groupe].append(instance)

    return niveau


def genererNiveau(fichier) :

    print("Construction niveau :")

    contenu = open(fichier, 'r' ).read()

    data = json.loads(contenu)

    print("- les éléments")
    tiles = constructionTiles(data)
    tileWidth  = data['tilewidth']
    tileHeight = data['tileheight']

    print("- les positions")
    principal = recupererCalquePrincipal(data)

    width  = data['width'] * tileWidth
    height = data['height'] * tileHeight

    if not principal :
        print("Pas de calque principal")
        return None
    else :
        print("- instanciation")
        niveau           = construction(principal, tiles, tileWidth, tileHeight)
        niveau['width']  = width
        niveau['height'] = height

        return niveau



@@ -788,24 +788,98 @@
 ilewidth'%5D%0A%0A
+        margin  = tileset%5B'margin'%5D%0A        spacing = tileset%5B'spacing'%5D%0A%0A
         grid
@@ -913,32 +913,32 @@
 h'%5D / tileWidth%0A
-
         gridHeig
@@ -1232,30 +1232,29 @@
 t(t) // grid
-Height
+Width
 %0A%0A          
@@ -1653,17 +1653,26 @@
 '     : 
-j
+margin + i
  * tileW
@@ -1667,32 +1667,46 @@
  + i * tileWidth
+ + spacing * i
 ,%0A              
@@ -1725,17 +1725,26 @@
 '     : 
-i
+margin + j
  * tileH
@@ -1748,16 +1748,30 @@
 leHeight
+ + spacing * j
 ,%0A      

Fix calcul position image dans sprites + ajout marges et spaces