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 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.RawConnectionScore} 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) { MazeTileBaseGround oldMazeTileBaseGround = (MazeTileBaseGround)neighbour.Value.GetBackgrounds().FirstOrDefault(background => background is MazeTileBaseGround); if (oldMazeTileBaseGround == null) { EditorMazeTileBackgroundPlacer tileBackgroundPlacer = new EditorMazeTileBackgroundPlacer(neighbour.Value as EditorMazeTile); tileBackgroundPlacer.PlaceBackground <MazeTileBaseGround>(); } } } }
public override void PlaceBackground(EditorMazeTile tile) { EditorMazeTileBackgroundPlacer tileBackgroundPlacer = new EditorMazeTileBackgroundPlacer(tile); MazeTileBackgroundRemover tileBackgroundRemover = new MazeTileBackgroundRemover(tile); MazeTileAttributeRemover tileAttributeRemover = new MazeTileAttributeRemover(tile); List <ITileBackground> backgrounds = tile.GetBackgrounds(); ITileBackground mazeTileBaseWater = backgrounds.FirstOrDefault(background => background is MazeTileBaseWater); // Only act if there is no water if (mazeTileBaseWater == null) { Type oldMainMaterial = tile.TileMainMaterial?.GetType(); // old material before updating it // Remove any background overlays for Ground tiles, such as paths. if (oldMainMaterial == null || oldMainMaterial == typeof(GroundMainMaterial)) { tileBackgroundRemover.RemoveBackground <MazeTilePath>(); } MazeTileBaseWater water = tileBackgroundPlacer.PlaceBackground <MazeTileBaseWater>(); List <ITileAttribute> attributes = tile.GetAttributes(); for (int i = 0; i < attributes.Count; i++) { tileAttributeRemover.Remove(attributes[i]); } if (oldMainMaterial == null || oldMainMaterial == typeof(GroundMainMaterial)) { if (water.ConnectionScore == 16) // remove background if we completely covered the tile with water { tileBackgroundRemover.RemoveBackground <MazeTileBaseGround>(); } } } }
public override void PlaceBackground(EditorMazeTile tile) { EditorMazeTileBackgroundPlacer tileBackgroundPlacer = new EditorMazeTileBackgroundPlacer(tile); MazeTileBackgroundRemover tileBackgroundRemover = new MazeTileBackgroundRemover(tile); MazeTileAttributeRemover tileAttributeRemover = new MazeTileAttributeRemover(tile); Type oldMainMaterial = tile.TileMainMaterial?.GetType(); // old material before updating it MazeTileBaseGround oldMazeTileBaseGround = (MazeTileBaseGround)tile.GetBackgrounds().FirstOrDefault(background => background is MazeTileBaseGround); if ((oldMainMaterial != typeof(GroundMainMaterial))) { List <ITileAttribute> attributes = tile.GetAttributes(); for (int i = 0; i < attributes.Count; i++) { tileAttributeRemover.Remove(attributes[i]); } // Remove the old land background, because we are going to fully cover it with a new land background if (oldMazeTileBaseGround != null && oldMazeTileBaseGround.ConnectionScore != 16) { tileBackgroundRemover.RemoveBackground <MazeTileBaseGround>(); } MazeTileBaseGround newMazeTileBaseGround = tileBackgroundPlacer.PlaceBackground <MazeTileBaseGround>(); // Remove water from the tile that is fully covered by land if (newMazeTileBaseGround.ConnectionScore == 16) { tileBackgroundRemover.RemoveBackground <MazeTileBaseWater>(); } } // Place corner fillers TileCornerFillerRegister.TryPlaceCornerFillers(tile); TileCornerFillerRegister.TryPlaceCornerFillersForNeighbours(tile); }