示例#1
0
    private void UpdateNeighboursForRemovedObstacle(ObstacleType obstacleType)
    {
        foreach (KeyValuePair <ObjectDirection, Tile> neighbour in _tile.Neighbours)
        {
            if (!neighbour.Value)
            {
                continue;
            }

            TileObstacle tileObstacleOnNeighbour = neighbour.Value.TryGetTileObstacle();

            if (tileObstacleOnNeighbour == null)
            {
                continue;
            }
            Logger.Log($"We will look for connections for neighbour {neighbour.Value.GridLocation.X},{neighbour.Value.GridLocation.Y}, which is {neighbour.Key} of {_tile.GridLocation.X},{_tile.GridLocation.Y}");
            TileConnectionScoreInfo obstacleConnectionScoreOnNeighbour = NeighbourTileCalculator.MapNeighbourObstaclesOfTile(neighbour.Value, obstacleType);
            Logger.Log($"We calculated an obstacle connection type score of {obstacleConnectionScoreOnNeighbour} for location {neighbour.Value.GridLocation.X}, {neighbour.Value.GridLocation.Y}");

            //update connection score on neighbour
            tileObstacleOnNeighbour.WithConnectionScoreInfo(obstacleConnectionScoreOnNeighbour);

            // If needed, place a background
            if (obstacleConnectionScoreOnNeighbour.RawConnectionScore != NeighbourTileCalculator.ConnectionOnAllSidesScore)
            {
                EditorOverworldTileBackgroundPlacer tileBackgroundPlacer = new EditorOverworldTileBackgroundPlacer(neighbour.Value as EditorOverworldTile);
                tileBackgroundPlacer.PlaceBackground <OverworldTileBaseGround>();
            }
        }
    }
示例#2
0
    public override void RemoveTileObstacle(TileObstacle tileObstacle = null)
    {
        _tile.SetWalkable(true);

        if (!tileObstacle)
        {
            tileObstacle = (TileObstacle)_tile.GetAttributes().FirstOrDefault(attribute => attribute is TileObstacle);
        }
        if (tileObstacle == null)
        {
            return;
        }
        if (tileObstacle is PlayerExit)
        {
            return;
        }

        ObstacleType obstacleType       = tileObstacle.ObstacleType;
        int          oldConnectionScore = tileObstacle.ConnectionScore;

        if (oldConnectionScore == NeighbourTileCalculator.ConnectionOnAllSidesScore)
        {
            EditorOverworldTileBackgroundPlacer tileBackgroundPlacer = new EditorOverworldTileBackgroundPlacer(_tile);
            tileBackgroundPlacer.PlaceBackground <OverworldTileBaseGround>();
        }

        _tile.RemoveAttribute(tileObstacle);
        tileObstacle.Remove();

        //After removing tile, check with neighbour tiles if wall connections should be updated
        UpdateNeighboursForRemovedObstacle(obstacleType);
    }
    public override void RemoveTileObstacle(TileObstacle tileObstacle = null)
    {
        if (!tileObstacle)
        {
            tileObstacle = (TileObstacle)_tile.GetAttributes().FirstOrDefault(attribute => attribute is TileObstacle);
        }

        if (tileObstacle == null)
        {
            return;
        }
        if (tileObstacle is PlayerExit)
        {
            return;
        }

        _tile.SetWalkable(true);

        ObstacleType obstacleType       = tileObstacle.ObstacleType;
        int          oldConnectionScore = tileObstacle.ConnectionScore;

        // If needed, place a background in the gap that the removed path left.
        // OPTIMISATION: Currently only looking at connection score from obstacles, but should also take eg. door attributes into account.
        if (oldConnectionScore == NeighbourTileCalculator.ConnectionOnAllSidesScore)
        {
            EditorMazeTileBackgroundPlacer tileBackgroundPlacer = new EditorMazeTileBackgroundPlacer(_tile);
            tileBackgroundPlacer.PlaceBackground <MazeTileBaseGround>();
        }

        _tile.RemoveAttribute(tileObstacle);
        tileObstacle.Remove();

        //After removing tile, check with neighbour tiles if wall connections should be updated
        UpdateNeighboursForRemovedObstacle(obstacleType);
    }
    private TileObstacle VerticalCombine(TileObstacle with, float cellHeight)
    {
        TileObstacle obstacle;

        obstacle.combineKind      = CombineKind.Vertical;
        obstacle.obstacle         = with.obstacle;
        obstacle.obstacle.center += new Vector3(0, 0, cellHeight / 2f);
        obstacle.obstacle.size   += new Vector3(0, 0, cellHeight);
        return(obstacle);
    }
    private TileObstacle HorizontalCombine(TileObstacle with, float cellWidth)
    {
        TileObstacle obstacle;

        obstacle.combineKind      = CombineKind.Horizontal;
        obstacle.obstacle         = with.obstacle;
        obstacle.obstacle.center += new Vector3(cellWidth / 2f, 0, 0);
        obstacle.obstacle.size   += new Vector3(cellWidth, 0, 0);
        return(obstacle);
    }
    // Loading a tile obstacle for a tile, not creating a new one. We already have the connection score
    public void PlaceTileObstacle(ObstacleType obstacleType, TileConnectionScoreInfo obstacleConnectionScore)
    {
        TileObstacle tileObstacle = (TileObstacle)InstantiateTileAttributeGO <TileObstacle>();

        tileObstacle.WithObstacleType(obstacleType);
        tileObstacle.WithConnectionScoreInfo(obstacleConnectionScore);

        Tile.SetWalkable(false);
        Tile.TryMakeMarkable(false);
        Tile.AddAttribute(tileObstacle);
    }
    public void PlaceTileObstacleVariation(TileObstacle tileObstacle)
    {
        //return only connections that were updated
        List <TileObstacle> updatedObstacleConnections = NeighbourTileCalculator.GetUpdatedTileModifiersForVariation(Tile, tileObstacle, tileObstacle.ObstacleType.ToString());

        //update the sprites with the new variations
        for (int i = 0; i < updatedObstacleConnections.Count; i++)
        {
            updatedObstacleConnections[i].WithConnectionScoreInfo(new TileConnectionScoreInfo(updatedObstacleConnections[i].ConnectionScore, updatedObstacleConnections[i].SpriteNumber));
        }
    }
示例#8
0
    public static TileConnectionScoreInfo MapNeighbourObstaclesOfTile(Tile tile, ObstacleType obstacleType)
    {
        Logger.Log($"Map neighbours of {tile.GridLocation.X},{tile.GridLocation.Y}");
        TileModifierConnectionInfo <TileObstacle> obstacleRight = new TileModifierConnectionInfo <TileObstacle>(Direction.Right);
        TileModifierConnectionInfo <TileObstacle> obstacleDown  = new TileModifierConnectionInfo <TileObstacle>(Direction.Down);
        TileModifierConnectionInfo <TileObstacle> obstacleLeft  = new TileModifierConnectionInfo <TileObstacle>(Direction.Left);
        TileModifierConnectionInfo <TileObstacle> obstacleUp    = new TileModifierConnectionInfo <TileObstacle>(Direction.Up);

        if (!EditorManager.InEditor)
        {
            Logger.Error("MapNeighbourObstaclesOfTile was not called from the editor");
            return(null);
        }

        foreach (KeyValuePair <ObjectDirection, Tile> neighbour in tile.Neighbours)
        {
            if (!neighbour.Value)
            {
                continue;
            }

            Logger.Warning($"Neighbour at {neighbour.Value.GridLocation.X},{neighbour.Value.GridLocation.Y} is {neighbour.Key} of {tile.GridLocation.X},{tile.GridLocation.Y}");

            TileObstacle tileObstacle = neighbour.Value.TryGetTileObstacle();

            if (tileObstacle == null || tileObstacle.ObstacleType != obstacleType)
            {
                continue;
            }

            if (neighbour.Key == ObjectDirection.Right)
            {
                obstacleRight.HasConnection = true;
                obstacleRight.TileModifier  = tileObstacle;
            }
            else if (neighbour.Key == ObjectDirection.Down)
            {
                obstacleDown.HasConnection = true;
                obstacleDown.TileModifier  = tileObstacle;
            }
            else if (neighbour.Key == ObjectDirection.Left)
            {
                obstacleLeft.HasConnection = true;
                obstacleLeft.TileModifier  = tileObstacle;
            }
            else if (neighbour.Key == ObjectDirection.Up)
            {
                obstacleUp.HasConnection = true;
                obstacleUp.TileModifier  = tileObstacle;
            }
        }

        return(TileConnectionRegister.CalculateTileConnectionScore(obstacleRight, obstacleDown, obstacleLeft, obstacleUp));
    }
    public void ShowObstacle(TileObstacle t)
    {
        if (_currentStats != t.gameObject)
        {
            RemoveStats();
            _currentStats = t.gameObject;
            Transform canvas = GameObject.Find("Canvas").transform;
            var       n      = t.name.Split("("[0]);

            string statsString =
                n[0];

            InstantiatePanel(statsString, canvas);
        }
    }
示例#10
0
    public override TileObstacle TryGetTileObstacle()
    {
        for (int i = 0; i < _tileAttributes.Count; i++)
        {
            Logger.Log($"found attribute for {GridLocation.X}, {GridLocation.Y} is {_tileAttributes[i].GetType()}");
        }
        TileObstacle tileObstacle = (TileObstacle)_tileAttributes.FirstOrDefault(attribute => attribute is TileObstacle);

        if (tileObstacle == null)
        {
            Logger.Log($"did not find a tile obstacle on {GridLocation.X},{GridLocation.Y}");
            return(null);
        }
        Logger.Log($"found tileObstacle {tileObstacle.ObstacleType} on {GridLocation.X},{GridLocation.Y}");
        return(tileObstacle);
    }
    void Start()
    {
        Tilemap tilemap  = GetComponent <Tilemap>();
        Vector3 cellSize = tilemap.cellSize;

        cellSize.Scale(transform.lossyScale);

        Quaternion rotation = Quaternion.AngleAxis(-90, transform.right) * transform.rotation;

        BoundsInt bounds = tilemap.cellBounds;

        TileBase[]     allTiles      = tilemap.GetTilesBlock(bounds);
        TileObstacle[] tileObstacles = new TileObstacle[(bounds.size.x + 1) * (bounds.size.y + 1)];

        int width = bounds.size.x, height = bounds.size.y;

        for (int x = 0; x < width; x++)
        {
            int ox = x + 1;
            for (int y = 0; y < height; y++)
            {
                int oy = y + 1;

                Tile tile = (allTiles[x + y * width] as Tile);
                if (tile == null || tile.colliderType == Tile.ColliderType.None)
                {
                    continue;
                }

                int          oi = ox + oy * width;
                TileObstacle combineCandidate = tileObstacles[oi - 1];      // on the left of current tile
                CombineKind  kind             = combineCandidate.combineKind;
                if (kind == CombineKind.Single || kind == CombineKind.Horizontal)
                {
                    tileObstacles[oi - 1].combineKind = CombineKind.Horizontal;
                    tileObstacles[oi] = HorizontalCombine(combineCandidate, cellSize.x);
                    continue;
                }

                combineCandidate = tileObstacles[oi - width];  // on the top of current tile
                kind             = combineCandidate.combineKind;
                if (kind == CombineKind.Single || kind == CombineKind.Vertical)
                {
                    tileObstacles[oi - width].combineKind = CombineKind.Vertical;
                    tileObstacles[oi] = VerticalCombine(combineCandidate, cellSize.y);
                    continue;
                }

                var obstacleObject = new GameObject(this.name + " Nav Obstacle");
                obstacleObject.isStatic         = this.gameObject.isStatic;
                obstacleObject.transform.parent = NavigationMain.current.transform;
                Vector3 position = tilemap.CellToWorld(new Vector3Int(bounds.x + x, bounds.y + y, 0));
                obstacleObject.transform.SetPositionAndRotation(new Vector3(position.x + cellSize.x / 2f, position.y + cellSize.y / 2f, 0), rotation);

                var nmObstacle = obstacleObject.AddComponent <NavMeshObstacle>();
                nmObstacle.carving = true;
                nmObstacle.size    = new Vector3(cellSize.x, obstacleHeight, cellSize.y);

                tileObstacles[oi].obstacle    = nmObstacle;
                tileObstacles[oi].combineKind = CombineKind.Single;
            }
        }
        Destroy(this);
    }
示例#12
0
 public abstract void RemoveTileObstacle(TileObstacle tileObstacle             = null);
示例#13
0
    private ISerialisableTileAttribute CreateSerialisableTileAttribute(Tile tile, ITileAttribute tileAttribute)
    {
        if (tileAttribute.GetType() == typeof(TileObstacle))
        {
            TileObstacle tileObstacle = tileAttribute as TileObstacle;
            SerialisableTileObstacleAttribute serialisableTileObstacleAttribute =
                new SerialisableTileObstacleAttribute(
                    new TileConnectionScoreInfo(tileObstacle.ConnectionScore, tileObstacle.SpriteNumber));
            return(serialisableTileObstacleAttribute);
        }
        else if (tileAttribute.GetType() == typeof(PlayerExit))
        {
            PlayerExit playerExit = tileAttribute as PlayerExit;

            SerialisablePlayerExitAttribute serialisablePlayerExitAttribute = new SerialisablePlayerExitAttribute(
                new TileConnectionScoreInfo(playerExit.ConnectionScore, playerExit.SpriteNumber));
            return(serialisablePlayerExitAttribute);
        }
        else if (tileAttribute.GetType() == typeof(PlayerOnly))
        {
            SerialisablePlayerOnlyAttribute serialisablePlayerOnlyAttribute = new SerialisablePlayerOnlyAttribute();
            return(serialisablePlayerOnlyAttribute);
        }
        else if (tileAttribute.GetType() == typeof(PlayerSpawnpoint))
        {
            SerialisablePlayerSpawnpointAttribute serialisablePlayerSpawnpointAttribute = new SerialisablePlayerSpawnpointAttribute();
            return(serialisablePlayerSpawnpointAttribute);
        }
        else if (tileAttribute.GetType() == typeof(EnemySpawnpoint))
        {
            EnemySpawnpoint enemySpawnpoint = tileAttribute as EnemySpawnpoint;
            SerialisableEnemySpawnpointAttribute serialisableEnemySpawnpointAttribute = new SerialisableEnemySpawnpointAttribute(enemySpawnpoint.TileAreas);
            return(serialisableEnemySpawnpointAttribute);
        }
        else if (tileAttribute.GetType() == typeof(MazeLevelEntry))
        {
            MazeLevelEntry mazeLevelEntry = tileAttribute as MazeLevelEntry;
            SerialisableMazeLevelEntryAttribute serialisableMazeLevelEntryAttribute = new SerialisableMazeLevelEntryAttribute(mazeLevelEntry.MazeLevelName);
            return(serialisableMazeLevelEntryAttribute);
        }
        else if (tileAttribute.GetType() == typeof(BridgePiece))
        {
            BridgePiece          bridgePiece          = tileAttribute as BridgePiece;
            BridgePieceDirection bridgePieceDirection = bridgePiece.BridgePieceDirection;

            SerialisableBridgePieceAttribute serialisableBridgePieceAttribute = new SerialisableBridgePieceAttribute(bridgePieceDirection);
            return(serialisableBridgePieceAttribute);
        }
        else if (tileAttribute.GetType() == typeof(BridgeEdge))
        {
            BridgeEdge bridgeEdge = tileAttribute as BridgeEdge;

            SerialisableBridgeEdgeAttribute serialisableBridgeEdgeAttribute = new SerialisableBridgeEdgeAttribute(bridgeEdge.EdgeSide);
            return(serialisableBridgeEdgeAttribute);
        }
        else if (tileAttribute.GetType() == typeof(MusicInstrumentCase))
        {
            SerialisableMusicInstrumentCaseAttribute serialisableMusicInstrumentCaseAttribute = new SerialisableMusicInstrumentCaseAttribute();
            return(serialisableMusicInstrumentCaseAttribute);
        }
        else
        {
            Logger.Error($"Could not serialise the tile attribute {tileAttribute.GetType()}");
            return(null);
        }
    }