void GenerateHallForward(FloorTile refTile, bool hasExitTrigger = true)
    {
        FloorTile anchor = refTile;

        TilesPattern randomPattern = hallPatterns[Random.Range(0, hallPatterns.Count)];

        for (int i = 0; i < randomPattern.pattern.Count; i++)
        {
            GenerateRelativeToTileAt(anchor, TileDirection.Up, randomPattern.pattern[i].col2);
            lastTileGenerated.lifetime = baseDecay + (i * rowDecay) + Random.Range(-0.2f, 0.2f);
            lastTileGenerated.Setup();
            anchor = lastTileGenerated;

            GenerateRelativeToTileAt(anchor, TileDirection.Left, randomPattern.pattern[i].col1);
            lastTileGenerated.lifetime = baseDecay + (i * rowDecay) + Random.Range(-0.2f, 0.2f);
            if (lastLeftGenerated != null)
            {
                lastLeftGenerated.upTile = lastTileGenerated;
            }
            lastTileGenerated.downTile = lastLeftGenerated;
            lastTileGenerated.Setup();
            lastLeftGenerated = lastTileGenerated;

            GenerateRelativeToTileAt(anchor, TileDirection.Right, randomPattern.pattern[i].col3);
            lastTileGenerated.lifetime = baseDecay + (i * rowDecay) + Random.Range(-0.2f, 0.2f);
            if (lastRightGenerated != null)
            {
                lastRightGenerated.upTile = lastTileGenerated;
            }
            lastTileGenerated.downTile = lastRightGenerated;
            lastTileGenerated.Setup();
            lastRightGenerated = lastTileGenerated;
        }

        lastMiddleGenerated = anchor;

        FloorTile exit = GetEmptyHallEndTile();

        if (exit != null)
        {
            exit.isCheckpoint = hasExitTrigger;
            lastTileGenerated = exit;
        }
        else
        {
            Debug.Log("No empty tiles to exit hall into corridor!");
        }
    }
    private void PlaceObject(int width, int height, GameObject objectToInstanciate, Transform holder, Tiles type, Vector2 itemSize, bool fillWith, int marginSize, bool placeByCenter)
    {
        TilesPattern patern         = new TilesPattern(width, height, Tiles.Floor);
        Vector2?     paternPosition = room.FindRandomPattern(patern.pattern);

        if (paternPosition == null)
        {
            Debug.LogWarning("Pattern not found for " + objectToInstanciate.name);
            return;
        }

        //Possibilité de margin de 1 ou pas
        //Possibilité de fillwith ou pas
        //Différente tailles d'item

        //----------------------- Vérifications -----------------------

        if (itemSize.x <= 0 || itemSize.y <= 0)
        {
            //Verification que le itemSize est possible
            Debug.LogError("Erreur itemSize : item size < 1" + " for " + objectToInstanciate.name);
            return;
        }

        if (marginSize != 0)
        {
            if (!fillWith)
            {
                //Verification d'une margin autour du pattern.
                if (itemSize.x + marginSize * 2 != width)
                {
                    Debug.LogError("Erreur MarginSize ; La largeur de l'item est de " + itemSize.x + " alors que la largeur du pattern est de " + width + " for " + objectToInstanciate.name);
                    return;
                }
                if (itemSize.y + marginSize * 2 != height)
                {
                    Debug.LogError("Erreur MarginSize ; La hauteur de l'item est de " + itemSize.y + " alors que la hauteur du pattern est de " + height + " for " + objectToInstanciate.name);
                    return;
                }
            }
            else
            {
                if (itemSize.x + marginSize * 2 > width)
                {
                    Debug.LogError("Erreur MarginSize fillWith ; La largeur de l'item est de " + itemSize.x + " alors que la largeur du pattern est de " + width + " for " + objectToInstanciate.name);
                    return;
                }
                if (itemSize.y + marginSize * 2 > height)
                {
                    Debug.LogError("Erreur MarginSize fillWith ; La hauteur de l'item est de " + itemSize.y + " alors que la hauteur du pattern est de " + height + " for " + objectToInstanciate.name);
                    return;
                }
            }
        }

        //if (fillWith && itemSize == Vector2.one)
        //{
        //    //Verification que le fill width est possible
        //    Debug.LogError("Erreur FillWith : item size = 1" + " for " + objectToInstanciate.name);
        //    return;
        //}

        //----------------------- Instanciation -----------------------

        if (fillWith)
        {
            for (int i = 0 + marginSize; i < width - marginSize; i++)
            {
                for (int j = 0 + marginSize; j < height - marginSize; j++)
                {
                    //Attention on ne prend pas en compte l'item size WTF si il ne fait pas 1...
                    Vector2 anchor = new Vector3(paternPosition.Value.x + i, paternPosition.Value.y + j);
                    if (placeByCenter)
                    {
                        anchor = GameManager.instance.GetCurrentGrid().WorldPointFromNode(anchor);
                    }
                    GameObject o = Instantiate(objectToInstanciate, anchor, Quaternion.identity) as GameObject;
                    o.transform.parent = holder;
                    room.AddPatternToMap((int)anchor.x, (int)anchor.y, 1, 1, type);
                }
            }
        }

        if (!fillWith)
        {
            //Il n'y a qu'un seul objet à instancier.
            Vector2 anchor = new Vector3(paternPosition.Value.x + marginSize, paternPosition.Value.y + marginSize);
            if (placeByCenter)
            {
                anchor = GameManager.instance.GetCurrentGrid().WorldPointFromNode(anchor);
            }
            GameObject o = Instantiate(objectToInstanciate, anchor, Quaternion.identity) as GameObject;
            o.transform.parent = holder;
            room.AddPatternToMap((int)anchor.x, (int)anchor.y, (int)itemSize.x, (int)itemSize.y, type);
        }
    }