Пример #1
0
    bool CanPlaceFeature(Vector3Int startPos, DungeonFeature feature, out bool inverseX, out bool inverseY)
    {
        bool canPlace = true;

        int startPosX = startPos.x - feature.offset.x - 1;
        int startPosY = startPos.y - feature.offset.y - 1;

        int endPosX = startPosX + feature.size.x + 1;
        int endPosY = startPosY + feature.size.y + 1;

        //if (feature.offset.y == 0)
        //{
        //    startPosY -= 1;
        //    endPosY += 1;
        //}

        //if (feature.offset.x == 0)
        //{
        //    startPosX -= 1;
        //    endPosX += 1;
        //}

        for (int i = startPosX; i <= endPosX; i++)
        {
            for (int j = startPosY; j <= endPosY; j++)
            {
                if (i >= mapSizeX - 1 || j >= mapSizeY - 1 || map.GetTile(new Vector3Int(i, j, 0)) != wall)
                {
                    canPlace = false;
                    j        = mapSizeY + 100;
                    i        = mapSizeX + 100;
                }
            }
        }

        if (canPlace == true)
        {
            inverseX = false;
            inverseY = false;

            return(canPlace);
        }



        //inverse X ?
        canPlace  = true;
        startPosX = startPos.x + feature.offset.x + 1;

        endPosX = startPosX - feature.size.x - 1;

        //if (feature.offset.x == 0)
        //{
        //    startPosX += 1;
        //    endPosX -= 1;
        //}

        for (int i = startPosX; i >= endPosX; i--)
        {
            for (int j = startPosY; j <= endPosY; j++)
            {
                if (i <= -mapSizeX || j >= mapSizeY - 1 || map.GetTile(new Vector3Int(i, j, 0)) != wall)
                {
                    canPlace = false;
                }
            }
        }

        if (canPlace == true)
        {
            inverseX = true;
            inverseY = false;
            return(canPlace);
        }

        //inverse Y ?

        canPlace  = true;
        startPosX = startPos.x - feature.offset.x - 1;
        startPosY = startPos.y + feature.offset.y + 1;

        endPosX = startPosX + feature.size.x + 1;
        endPosY = startPosY - feature.size.y - 1;

        //if (feature.offset.y == 0)
        //{
        //    startPosY += 1;
        //    endPosY -= 1;
        //}

        //if (feature.offset.x == 0)
        //{
        //    startPosX -= 1;
        //    endPosX += 1;
        //}

        for (int i = startPosX; i <= endPosX; i++)
        {
            for (int j = startPosY; j >= endPosY; j--)
            {
                if (i >= mapSizeX - 1 || j <= -mapSizeY || map.GetTile(new Vector3Int(i, j, 0)) != wall)
                {
                    canPlace = false;
                }
            }
        }

        if (canPlace == true)
        {
            inverseX = false;
            inverseY = true;
            return(canPlace);
        }


        //inverse X et Y ?

        canPlace  = true;
        startPosX = startPos.x + feature.offset.x + 1;
        startPosY = startPos.y + feature.offset.y + 1;

        endPosX = startPosX - feature.size.x - 1;
        endPosY = startPosY - feature.size.y - 1;

        //if (feature.offset.y == 0)
        //{
        //    startPosY += 1;
        //    endPosY -= 1;
        //}

        //if (feature.offset.x == 0)
        //{
        //    startPosX += 1;
        //    endPosX -= 1;
        //}

        for (int i = startPosX; i >= endPosX; i--)
        {
            for (int j = startPosY; j >= endPosY; j--)
            {
                if (i <= -mapSizeX || j <= -mapSizeY || map.GetTile(new Vector3Int(i, j, 0)) != wall)
                {
                    canPlace = false;
                }
            }
        }

        if (canPlace == true)
        {
            inverseX = true;
            inverseY = true;
            return(canPlace);
        }

        inverseX = false;
        inverseY = false;
        return(canPlace);
    }
Пример #2
0
    void PlaceFeature(Vector3Int position, DungeonFeature feature, bool inverseX, bool inverseY, bool placeDoor = true, int doorSize = 1)
    {
        int startPosX = position.x;
        int startPosY = position.y;

        //*
        if (placeDoor)
        {
            Vector3Int pos = new Vector3Int();

            for (int i = 0; i < doorSize; i++)
            {
                pos.x = startPosX;
                pos.y = startPosY;
                map.SetTile(pos, ground);

                /*
                 * map.SetTileFlags(pos, TileFlags.None);
                 * map.SetColor(pos, Color.red);
                 * //*/
            }


            /*
             * map.SetTileFlags(pos, TileFlags.None);
             * map.SetColor(pos, Color.red);
             * //*/
        }
        if (!inverseX && !inverseY)
        {
            startPosX -= feature.offset.x;
            startPosY -= feature.offset.y;
            if (null != feature.text)
            {
                int i = startPosX;
                int j = startPosY;

                foreach (char c in feature.text.text)
                {
                    switch (c)
                    {
                    case '0':
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                        i++;
                        break;

                    case '1':
                        map.SetTile(new Vector3Int(i, j, 0), wall);
                        i++;
                        break;

                    case '2':
                        map.SetTile(new Vector3Int(i, j, 0), water);
                        i++;
                        break;

                    case 'x':
                        j++;
                        i = startPosX;
                        break;

                    default:
                        break;
                    }
                }
            }
            else
            {
                for (int i = startPosX; i < startPosX + feature.size.x; i++)
                {
                    for (int j = startPosY; j < startPosY + feature.size.y; j++)
                    {
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                    }
                }
            }
        }
        else if (inverseX && !inverseY)
        {
            startPosX += feature.offset.x;
            startPosY -= feature.offset.y;

            if (null != feature.text)
            {
                int i = startPosX;
                int j = startPosY;

                foreach (char c in feature.text.text)
                {
                    switch (c)
                    {
                    case '0':
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                        i--;
                        break;

                    case '1':
                        map.SetTile(new Vector3Int(i, j, 0), wall);
                        i--;
                        break;

                    case '2':
                        map.SetTile(new Vector3Int(i, j, 0), water);
                        i--;
                        break;

                    case 'x':
                        j++;
                        i = startPosX;
                        break;

                    default:
                        break;
                    }
                }
            }
            else
            {
                for (int i = startPosX; i > startPosX - feature.size.x; i--)
                {
                    for (int j = startPosY; j < startPosY + feature.size.y; j++)
                    {
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                    }
                }
            }
        }
        else if (!inverseX && inverseY)
        {
            startPosX -= feature.offset.x;
            startPosY += feature.offset.y;
            if (null != feature.text)
            {
                int i = startPosX;
                int j = startPosY;

                foreach (char c in feature.text.text)
                {
                    switch (c)
                    {
                    case '0':
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                        i++;
                        break;

                    case '1':
                        map.SetTile(new Vector3Int(i, j, 0), wall);
                        i++;
                        break;

                    case '2':
                        map.SetTile(new Vector3Int(i, j, 0), water);
                        i++;
                        break;

                    case 'x':
                        j--;
                        i = startPosX;
                        break;

                    default:
                        break;
                    }
                }
            }
            else
            {
                for (int i = startPosX; i < startPosX + feature.size.x; i++)
                {
                    for (int j = startPosY; j > startPosY - feature.size.y; j--)
                    {
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                    }
                }
            }
        }
        else
        {
            startPosX += feature.offset.x;
            startPosY += feature.offset.y;
            if (null != feature.text)
            {
                int i = startPosX;
                int j = startPosY;

                foreach (char c in feature.text.text)
                {
                    switch (c)
                    {
                    case '0':
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                        i--;
                        break;

                    case '1':
                        map.SetTile(new Vector3Int(i, j, 0), wall);
                        i--;
                        break;

                    case '2':
                        map.SetTile(new Vector3Int(i, j, 0), water);
                        i--;
                        break;

                    case 'x':
                        j--;
                        i = startPosX;
                        break;

                    default:
                        break;
                    }
                }
            }
            else
            {
                for (int i = startPosX; i > startPosX - feature.size.x; i--)
                {
                    for (int j = startPosY; j > startPosY - feature.size.y; j--)
                    {
                        map.SetTile(new Vector3Int(i, j, 0), ground);
                    }
                }
            }
        }
    }
Пример #3
0
        private GameObject MakeFeature(DungeonFeature feature, Vector2 position)
        {
            position += Vector2.one / 2; //needed to align the feature with the center of each cell

            GameObject featureGO =
                (GameObject)Instantiate(
                feature.Prefab,
                GetWorldPosition(position) + feature.Offset,
                Quaternion.identity);

            switch (feature.Alignment)
            {
                case DungeonFeature.CellAlignment.FLOOR:

                    if (!feature.Offset.IsZero())
                        featureGO.transform.forward = feature.Offset;

                    break;

                case DungeonFeature.CellAlignment.WALL:

                    if (dungeon.IsOfType(position + Vector2.up, null))
                        featureGO.transform.up = Vector3.forward;   //wall is "above"
                    else if (dungeon.IsOfType(position + Vector2.down, null))
                        featureGO.transform.up = Vector3.back;      //wall is "below"
                    else if (dungeon.IsOfType(position + Vector2.right, null))
                        featureGO.transform.up = Vector3.right;     //wall is to the right
                    else if (dungeon.IsOfType(position + Vector2.left, null))
                        featureGO.transform.up = Vector3.left;      //wall is to the left

                    break;
            }

            return featureGO;
        }