private void renderSkeletonChunk(int i, int j, bool mustHaveTrap)
    {
        DungeonSkeletonChunk skeletonChunk = skeleton[i, j];
        MapChunk             current;

        MapChunk[] chunks;
        switch (skeletonChunk.getSkeletonType())
        {
        case ChunkType.FourDoors:
            chunks = fourDoorsChunks;
            break;

        case ChunkType.ThreeDoors:
            chunks = threeDoorsChunks;
            break;

        case ChunkType.OneDoor:
            chunks = oneDoorChunks;
            break;

        case ChunkType.OppositeDoors:
            chunks = oppositeDoorChunks;
            break;

        default:
            chunks = sideDoorChunks;
            break;
        }
        if (mustHaveTrap)
        {
            current = getRandomChunkWithTrap(chunks);
        }
        else
        {
            current = getRandomChunk(chunks);
        }
        MapChunk newGO = Instantiate(current);

        newGO.name                    = String.Format("dungeon-{0}-{1}", i, j);
        newGO.transform.parent        = transform;
        newGO.transform.localPosition = new Vector3(i * 3, j * 3, 0);
        newGO.RotateToMatch(skeletonChunk.doors);
        map[i, j] = newGO;
        if (newGO.isTrap)
        {
            trapCount++;
        }
        itemsAvailable += newGO.itemsAvailable();
    }
    private DungeonSkeletonChunk createSkeletonChunk(int x, int y)
    {
        bool[] doorsNeeded     = { false, false, false, false };
        bool[] doorsNotAllowed = { false, false, false, false };
        DungeonSkeletonChunk neighbour;

        if (x + 1 >= mapSize)
        {
            doorsNotAllowed[0] = true;
        }
        else
        {
            neighbour = skeleton[x + 1, y];
            if (neighbour != null)
            {
                if (neighbour.doors[2])
                {
                    doorsNeeded[0] = true;
                }
                else
                {
                    doorsNotAllowed[0] = true;
                }
            }
        }

        if (y + 1 >= mapSize)
        {
            doorsNotAllowed[1] = true;
        }
        else
        {
            neighbour = skeleton[x, y + 1];
            if (neighbour != null)
            {
                if (neighbour.doors[3])
                {
                    doorsNeeded[1] = true;
                }
                else
                {
                    doorsNotAllowed[1] = true;
                }
            }
        }

        if (x - 1 < 0)
        {
            doorsNotAllowed[2] = true;
        }
        else
        {
            neighbour = skeleton[x - 1, y];
            if (neighbour != null)
            {
                if (neighbour.doors[0])
                {
                    doorsNeeded[2] = true;
                }
                else
                {
                    doorsNotAllowed[2] = true;
                }
            }
        }

        if (y - 1 < 0)
        {
            doorsNotAllowed[3] = true;
        }
        else
        {
            neighbour = skeleton[x, y - 1];
            if (neighbour != null)
            {
                if (neighbour.doors[1])
                {
                    doorsNeeded[3] = true;
                }
                else
                {
                    doorsNotAllowed[3] = true;
                }
            }
        }

        skeleton[x, y] = new DungeonSkeletonChunk(doorsNeeded, doorsNotAllowed, x, y);
        return(skeleton[x, y]);
    }
    private void buildDungeonSkeleton()
    {
        List <DungeonSkeletonChunk> frontier = new List <DungeonSkeletonChunk>();
        int chunkCount = 0;

        while (chunkCount < mapSize * mapSize)
        {
            if (chunkCount == 0)
            {
                skeleton[0, 0] = new DungeonSkeletonChunk(new bool[] { false, false, false, false }, new bool[] { false, false, true, true }, 0, 0);
                frontier.Add(skeleton[0, 0]);
                chunkCount++;
            }
            else
            {
                for (int i = 0; i < mapSize; i++)
                {
                    for (int j = 0; j < mapSize; j++)
                    {
                        if (skeleton[i, j] == null)
                        {
                            if (i - 1 >= 0 && skeleton[i - 1, j] != null)
                            {
                                skeleton[i - 1, j].doors[0] = true;
                            }
                            else if (j - 1 >= 0 && skeleton[i, j - 1] != null)
                            {
                                skeleton[i, j - 1].doors[1] = true;
                            }
                            else if (i + 1 < mapSize && skeleton[i + 1, j] != null)
                            {
                                skeleton[i + 1, j].doors[2] = true;
                            }
                            else if (j + 1 < mapSize && skeleton[i, j + 1] != null)
                            {
                                skeleton[i, j + 1].doors[3] = true;
                            }
                            frontier.Add(createSkeletonChunk(i, j));
                            chunkCount++;
                        }
                    }
                }
            }

            while (frontier.Count > 0)
            {
                DungeonSkeletonChunk chunk = frontier[0];
                frontier.RemoveAt(0);
                int x, y;
                for (int i = 0; i < 4; i++)
                {
                    if (chunk.doors[i])
                    {
                        switch (i)
                        {
                        case 0:
                            x = chunk.x + 1;
                            y = chunk.y;
                            break;

                        case 1:
                            x = chunk.x;
                            y = chunk.y + 1;
                            break;

                        case 2:
                            x = chunk.x - 1;
                            y = chunk.y;
                            break;

                        default:
                            x = chunk.x;
                            y = chunk.y - 1;
                            break;
                        }
                        if (skeleton[x, y] == null)
                        {
                            frontier.Add(createSkeletonChunk(x, y));
                            chunkCount++;
                        }
                    }
                }
            }
        }
    }