From 91a920a14c5ed89d96e9459246629e03f951c55a Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Fri, 27 Jan 2017 18:45:52 -0500 Subject: [PATCH] v0.5.0: performance & functionality improvements to wall blocking & fog --- .../scenes/GameScene.java | 22 +++++++++++++++++-- .../tiles/DungeonTileSheet.java | 14 ++++++------ .../tiles/WallBlockingTilemap.java | 22 ++++++++++++------- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java index 476bed90a..09fd0e296 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/GameScene.java @@ -102,6 +102,7 @@ import com.watabou.noosa.audio.Music; import com.watabou.noosa.audio.Sample; import com.watabou.noosa.particles.Emitter; import com.watabou.utils.GameMath; +import com.watabou.utils.PathFinder; import com.watabou.utils.Random; import java.io.IOException; @@ -706,6 +707,7 @@ public class GameScene extends PixelScene { scene.visualGrid.updateMap(); scene.terrainFeatures.updateMap(); scene.walls.updateMap(); + updateFog(); } } @@ -715,8 +717,7 @@ public class GameScene extends PixelScene { scene.visualGrid.updateMapCell( cell ); scene.terrainFeatures.updateMapCell( cell ); scene.walls.updateMapCell( cell ); - scene.fog.updateFogCell( cell ); - scene.wallBlocking.updateMapCell( cell ); + updateFog( cell ); } } @@ -750,6 +751,23 @@ public class GameScene extends PixelScene { scene.wallBlocking.updateArea(x, y, w, h); } } + + public static void updateFog( int cell ){ + if (scene != null) { + //update in a 3x3 grid to account for neighbours which might also be affected + if (Dungeon.level.insideMap(cell)) { + for (int i : PathFinder.NEIGHBOURS9) { + scene.fog.updateFogCell( cell + i ); + scene.wallBlocking.updateMapCell( cell + i ); + } + + //unless we're at the level's edge, then just do the one tile. + } else { + scene.fog.updateFogCell( cell ); + scene.wallBlocking.updateMapCell( cell ); + } + } + } public static void afterObserve() { if (scene != null) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/DungeonTileSheet.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/DungeonTileSheet.java index af1508248..c3bee802b 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/DungeonTileSheet.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/DungeonTileSheet.java @@ -26,7 +26,7 @@ import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain; import com.watabou.utils.Random; import java.util.Arrays; -import java.util.List; +import java.util.HashSet; public class DungeonTileSheet { @@ -83,14 +83,14 @@ public class DungeonTileSheet { //next 15 slots are all water stitching with ground. //These tiles can stitch with water - public static List waterStitcheable = Arrays.asList( + public static HashSet waterStitcheable = new HashSet<>(Arrays.asList( Terrain.EMPTY, Terrain.GRASS, Terrain.EMPTY_WELL, Terrain.ENTRANCE, Terrain.EXIT, Terrain.EMBERS, Terrain.BARRICADE, Terrain.HIGH_GRASS, Terrain.SECRET_TRAP, Terrain.TRAP, Terrain.INACTIVE_TRAP, Terrain.EMPTY_DECO, Terrain.SIGN, Terrain.WELL, Terrain.STATUE, Terrain.ALCHEMY, Terrain.DOOR, Terrain.OPEN_DOOR, Terrain.LOCKED_DOOR - ); + )); //+1 for ground above, +2 for ground right, +4 for ground below, +8 for ground left. public static int stitchWaterTile(int top, int right, int bottom, int left){ @@ -191,10 +191,10 @@ public class DungeonTileSheet { public static final int RAISED_WALL_BOOKSHELF_ALT = RAISED_WALLS+28; //These tiles count as wall for the purposes of wall stitching - public static List wallStitcheable = Arrays.asList( + public static HashSet wallStitcheable = new HashSet<>(Arrays.asList( Terrain.WALL, Terrain.WALL_DECO, Terrain.SECRET_DOOR, Terrain.LOCKED_EXIT, Terrain.UNLOCKED_EXIT, Terrain.BOOKSHELF, NULL_TILE - ); + )); public static int getRaisedWallTile(int tile, int pos, int right, int below, int left){ int result; @@ -227,9 +227,9 @@ public class DungeonTileSheet { else return -1; } - public static List doorTiles = Arrays.asList( + public static HashSet doorTiles = new HashSet<>(Arrays.asList( Terrain.DOOR, Terrain.LOCKED_DOOR, Terrain.OPEN_DOOR - ); + )); public static final int RAISED_BARRICADE = xy(1, 11); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/WallBlockingTilemap.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/WallBlockingTilemap.java index f22e6df4d..e1779fdb3 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/WallBlockingTilemap.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/tiles/WallBlockingTilemap.java @@ -52,7 +52,7 @@ public class WallBlockingTilemap extends Tilemap { int curr; //no point in blocking tiles that are already obscured by fog - if (fogHidden(cell) && fogHidden(cell - mapWidth)){ + if (fogHidden(cell) && fogHidden(cell - mapWidth) && fogHidden(cell + mapWidth)){ curr = BLOCK_NONE; } else if (wall(cell)) { @@ -115,7 +115,14 @@ public class WallBlockingTilemap extends Tilemap { } } else { - curr = BLOCK_NONE; + if (fogHidden(cell - 1) && fogHidden(cell) && fogHidden(cell + 1) + && cell + mapWidth < Dungeon.level.map.length + && wall(cell + mapWidth -1 ) && wall(cell + mapWidth) && wall(cell + mapWidth + 1) + && !fogHidden(cell + mapWidth)){ + curr = BLOCK_ALL; + } else { + curr = BLOCK_NONE; + } } if (prev != curr){ @@ -126,12 +133,11 @@ public class WallBlockingTilemap extends Tilemap { private boolean fogHidden(int cell){ if (cell < 0 || cell >= Dungeon.level.length()) return false; - if (wall(cell) && cell + mapWidth < Dungeon.level.length() && !wall(cell + mapWidth)){ - return (!Dungeon.level.visited[cell] && !Dungeon.level.mapped[cell]) - || (!Dungeon.level.visited[cell + mapWidth] && !Dungeon.level.mapped[cell + mapWidth]); - } else { - return (!Dungeon.level.visited[cell] && !Dungeon.level.mapped[cell]); - } + if (!Dungeon.level.visited[cell] && !Dungeon.level.mapped[cell]) return true; + if (wall(cell) && cell + mapWidth < Dungeon.level.length() && !wall(cell + mapWidth) && + !Dungeon.level.visited[cell + mapWidth] && !Dungeon.level.mapped[cell + mapWidth]) + return true; + return false; } private boolean wall(int cell){