v0.5.0: more refactoring and improvements to the dungeon tilemaps
This commit is contained in:
parent
47fafadade
commit
9472cd2953
|
@ -25,6 +25,7 @@ import android.opengl.GLES20;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
import com.shatteredpixel.shatteredpixeldungeon.Assets;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
import com.shatteredpixel.shatteredpixeldungeon.Badges;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.FogOfWar;
|
import com.shatteredpixel.shatteredpixeldungeon.FogOfWar;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.ShatteredPixelDungeon;
|
||||||
|
@ -110,7 +111,7 @@ public class GameScene extends PixelScene {
|
||||||
static GameScene scene;
|
static GameScene scene;
|
||||||
|
|
||||||
private SkinnedBlock water;
|
private SkinnedBlock water;
|
||||||
private DungeonTilemap tiles;
|
private DungeonTerrainTilemap tiles;
|
||||||
private TerrainFeaturesTilemap terrainFeatures;
|
private TerrainFeaturesTilemap terrainFeatures;
|
||||||
private DungeonWallsTilemap walls;
|
private DungeonWallsTilemap walls;
|
||||||
private FogOfWar fog;
|
private FogOfWar fog;
|
||||||
|
@ -185,7 +186,7 @@ public class GameScene extends PixelScene {
|
||||||
|
|
||||||
DungeonTileSheet.setupVariance(Dungeon.level.map.length, Dungeon.seedCurDepth());
|
DungeonTileSheet.setupVariance(Dungeon.level.map.length, Dungeon.seedCurDepth());
|
||||||
|
|
||||||
tiles = new DungeonTilemap();
|
tiles = new DungeonTerrainTilemap();
|
||||||
terrain.add( tiles );
|
terrain.add( tiles );
|
||||||
|
|
||||||
ripples = new Group();
|
ripples = new Group();
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
package com.shatteredpixel.shatteredpixeldungeon.tiles;
|
||||||
|
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
||||||
|
import com.watabou.noosa.Image;
|
||||||
|
import com.watabou.utils.PathFinder;
|
||||||
|
|
||||||
|
public class DungeonTerrainTilemap extends DungeonTilemap {
|
||||||
|
|
||||||
|
static DungeonTerrainTilemap instance;
|
||||||
|
|
||||||
|
public DungeonTerrainTilemap(){
|
||||||
|
super(Dungeon.level.tilesTex());
|
||||||
|
|
||||||
|
map( Dungeon.level.map, Dungeon.level.width() );
|
||||||
|
|
||||||
|
instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getTileVisual(int pos, int tile, boolean flat) {
|
||||||
|
int visual = DungeonTileSheet.directVisuals.get(tile, -1);
|
||||||
|
if (visual != -1) return DungeonTileSheet.getVisualWithAlts(visual, pos);
|
||||||
|
|
||||||
|
if (tile == Terrain.WATER) {
|
||||||
|
return DungeonTileSheet.stitchWaterTile(
|
||||||
|
map[pos + PathFinder.CIRCLE4[0]],
|
||||||
|
map[pos + PathFinder.CIRCLE4[1]],
|
||||||
|
map[pos + PathFinder.CIRCLE4[2]],
|
||||||
|
map[pos + PathFinder.CIRCLE4[3]]
|
||||||
|
);
|
||||||
|
|
||||||
|
} else if (tile == Terrain.CHASM) {
|
||||||
|
return DungeonTileSheet.stitchChasmTile( pos > mapWidth ? map[pos - mapWidth] : -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!flat) {
|
||||||
|
if ((DungeonTileSheet.doorTiles.contains(tile))) {
|
||||||
|
return DungeonTileSheet.getRaisedDoorTile(tile, map[pos - mapWidth]);
|
||||||
|
} else if (tile == Terrain.WALL || tile == Terrain.WALL_DECO){
|
||||||
|
return DungeonTileSheet.getRaisedWallTile(
|
||||||
|
tile,
|
||||||
|
pos,
|
||||||
|
(pos+1) % mapWidth != 0 ? map[pos + 1] : -1,
|
||||||
|
pos + mapWidth < size ? map[pos + mapWidth] : -1,
|
||||||
|
pos % mapWidth != 0 ? map[pos - 1] : -1
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return DungeonTileSheet.getVisualWithAlts(
|
||||||
|
DungeonTileSheet.directFlatVisuals.get(tile),
|
||||||
|
pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Image tile(int pos, int tile ) {
|
||||||
|
Image img = new Image( instance.texture );
|
||||||
|
img.frame( instance.tileset.get( instance.getTileVisual( pos, tile, true ) ) );
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean needsRender(int pos) {
|
||||||
|
return (Level.discoverable[pos] || data[pos] == DungeonTileSheet.CHASM)
|
||||||
|
&& data[pos] != DungeonTileSheet.WATER;
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,11 +37,14 @@ public class DungeonTileSheet {
|
||||||
return x + WIDTH*y;
|
return x + WIDTH*y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//used in cases like map-edge decision making.
|
||||||
|
public static final int NULL_TILE = -1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Floor Tiles
|
* Floor Tiles
|
||||||
************************/
|
**********************************************************************/
|
||||||
|
|
||||||
private static final int GROUND = xy(1, 1); //32 slots
|
private static final int GROUND = xy(1, 1); //32 slots
|
||||||
public static final int FLOOR = GROUND +0;
|
public static final int FLOOR = GROUND +0;
|
||||||
|
@ -94,7 +97,7 @@ public class DungeonTileSheet {
|
||||||
);
|
);
|
||||||
|
|
||||||
//+1 for ground above, +2 for ground right, +4 for ground below, +8 for ground left.
|
//+1 for ground above, +2 for ground right, +4 for ground below, +8 for ground left.
|
||||||
public static int getWaterTile(int top, int right, int bottom, int left){
|
public static int stitchWaterTile(int top, int right, int bottom, int left){
|
||||||
int result = WATER;
|
int result = WATER;
|
||||||
if (waterStitcheable.contains(top)) result += 1;
|
if (waterStitcheable.contains(top)) result += 1;
|
||||||
if (waterStitcheable.contains(right)) result += 2;
|
if (waterStitcheable.contains(right)) result += 2;
|
||||||
|
@ -144,7 +147,9 @@ public class DungeonTileSheet {
|
||||||
chasmStitcheable.put( Terrain.WATER, CHASM_WATER );
|
chasmStitcheable.put( Terrain.WATER, CHASM_WATER );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int stitchChasmTile(int above){
|
||||||
|
return chasmStitcheable.get(above, CHASM);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
Flat Wall Tiles
|
Flat Wall Tiles
|
||||||
|
@ -165,9 +170,6 @@ public class DungeonTileSheet {
|
||||||
public static final int LOCKED_EXIT = FLAT_DOORS+4;
|
public static final int LOCKED_EXIT = FLAT_DOORS+4;
|
||||||
|
|
||||||
|
|
||||||
public static SparseIntArray defaultFlatVisuals = new SparseIntArray(32);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Raised Wall Tiles, Lower Layer
|
* Raised Wall Tiles, Lower Layer
|
||||||
|
@ -183,6 +185,26 @@ public class DungeonTileSheet {
|
||||||
public static final int RAISED_WALL_ALT = RAISED_WALLS+16;
|
public static final int RAISED_WALL_ALT = RAISED_WALLS+16;
|
||||||
public static final int RAISED_WALL_DECO_ALT = RAISED_WALLS+20;
|
public static final int RAISED_WALL_DECO_ALT = RAISED_WALLS+20;
|
||||||
|
|
||||||
|
//These tiles count as wall for the purposes of wall stitching
|
||||||
|
public static List wallStitcheable = Arrays.asList(
|
||||||
|
Terrain.WALL, Terrain.WALL_DECO, Terrain.SECRET_DOOR,
|
||||||
|
Terrain.LOCKED_EXIT, Terrain.UNLOCKED_EXIT, NULL_TILE
|
||||||
|
);
|
||||||
|
|
||||||
|
public static int getRaisedWallTile(int tile, int pos, int right, int below, int left){
|
||||||
|
int result;
|
||||||
|
if (doorTiles.contains(below)) result = RAISED_WALL_DOOR;
|
||||||
|
else if (tile == Terrain.WALL) result = RAISED_WALL;
|
||||||
|
else if (tile == Terrain.WALL_DECO) result = RAISED_WALL_DECO;
|
||||||
|
else return -1;
|
||||||
|
|
||||||
|
result = getVisualWithAlts(result, pos);
|
||||||
|
|
||||||
|
if (wallStitcheable.contains(right)) result += 1;
|
||||||
|
if (wallStitcheable.contains(left)) result += 2;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private static final int RAISED_DOORS = xy(1, 10); //16 slots
|
private static final int RAISED_DOORS = xy(1, 10); //16 slots
|
||||||
public static final int RAISED_DOOR = RAISED_DOORS+0;
|
public static final int RAISED_DOOR = RAISED_DOORS+0;
|
||||||
public static final int RAISED_DOOR_OPEN = RAISED_DOORS+1;
|
public static final int RAISED_DOOR_OPEN = RAISED_DOORS+1;
|
||||||
|
@ -191,10 +213,16 @@ public class DungeonTileSheet {
|
||||||
public static final int RAISED_DOOR_SIDEWAYS = RAISED_DOORS+3;
|
public static final int RAISED_DOOR_SIDEWAYS = RAISED_DOORS+3;
|
||||||
|
|
||||||
|
|
||||||
//These tiles count as wall for the purposes of wall stitching
|
public static int getRaisedDoorTile(int tile, int below){
|
||||||
public static List wallStitcheable = Arrays.asList(
|
if (wallStitcheable.contains(below)) return RAISED_DOOR_SIDEWAYS;
|
||||||
Terrain.WALL, Terrain.WALL_DECO, Terrain.SECRET_DOOR,
|
else if (tile == Terrain.DOOR) return DungeonTileSheet.RAISED_DOOR;
|
||||||
Terrain.LOCKED_EXIT, Terrain.UNLOCKED_EXIT
|
else if (tile == Terrain.OPEN_DOOR) return DungeonTileSheet.RAISED_DOOR_OPEN;
|
||||||
|
else if (tile == Terrain.LOCKED_DOOR) return DungeonTileSheet.RAISED_DOOR_LOCKED;
|
||||||
|
else return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List doorTiles = Arrays.asList(
|
||||||
|
Terrain.DOOR, Terrain.LOCKED_DOOR, Terrain.OPEN_DOOR
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@ -203,21 +231,42 @@ public class DungeonTileSheet {
|
||||||
* Raised Wall Tiles, Upper Layer
|
* Raised Wall Tiles, Upper Layer
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
//+1 for wall right, +2 for wall right-below, +4 for wall left-below, +8 for wall left.
|
//+1 for open right, +2 for open right-below, +4 for open left-below, +8 for open left.
|
||||||
public static final int WALLS_INTERNAL = xy(1, 12); //16 slots
|
public static final int WALLS_INTERNAL = xy(1, 12); //16 slots
|
||||||
|
|
||||||
//+1 for walls to the down-right, +2 for walls to the down-left
|
public static int stitchInternalWallTile(int right, int rightBelow, int leftBelow, int left){
|
||||||
|
int result = WALLS_INTERNAL;
|
||||||
|
if (!wallStitcheable.contains(right)) result += 1;
|
||||||
|
if (!wallStitcheable.contains(rightBelow)) result += 2;
|
||||||
|
if (!wallStitcheable.contains(leftBelow)) result += 4;
|
||||||
|
if (!wallStitcheable.contains(left)) result += 8;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//+1 for open to the down-right, +2 for open to the down-left
|
||||||
private static final int WALLS_OVERHANG = xy(1, 13); //16 slots
|
private static final int WALLS_OVERHANG = xy(1, 13); //16 slots
|
||||||
public static final int WALL_OVERHANG = WALLS_OVERHANG+0;
|
public static final int WALL_OVERHANG = WALLS_OVERHANG+0;
|
||||||
public static final int DOOR_SIDEWAYS_OVERHANG = WALL_OVERHANG+4;
|
public static final int DOOR_SIDEWAYS_OVERHANG = WALL_OVERHANG+4;
|
||||||
public static final int DOOR_SIDEWAYS_OVERHANG_OPEN = WALL_OVERHANG+8;
|
public static final int DOOR_SIDEWAYS_OVERHANG_OPEN = WALL_OVERHANG+8;
|
||||||
|
|
||||||
|
public static int stitchWallOverhangTile(int tile, int rightBelow, int leftBelow){
|
||||||
|
int visual;
|
||||||
|
if (tile == Terrain.DOOR || tile == Terrain.LOCKED_DOOR) visual = DOOR_SIDEWAYS_OVERHANG;
|
||||||
|
else if (tile == Terrain.OPEN_DOOR) visual = DOOR_SIDEWAYS_OVERHANG_OPEN;
|
||||||
|
else visual = WALL_OVERHANG;
|
||||||
|
|
||||||
|
if (!wallStitcheable.contains(rightBelow)) visual += 1;
|
||||||
|
if (!wallStitcheable.contains(leftBelow)) visual += 2;
|
||||||
|
|
||||||
|
return visual;
|
||||||
|
}
|
||||||
|
|
||||||
//no attachment to adjacent walls
|
//no attachment to adjacent walls
|
||||||
public static final int DOOR_OVERHANG = WALL_OVERHANG+12;
|
public static final int DOOR_OVERHANG = WALL_OVERHANG+12;
|
||||||
public static final int DOOR_OVERHANG_OPEN = WALL_OVERHANG+13;
|
public static final int DOOR_OVERHANG_OPEN = WALL_OVERHANG+13;
|
||||||
public static final int DOOR_SIDEWAYS = WALL_OVERHANG+14;
|
public static final int DOOR_SIDEWAYS = WALL_OVERHANG+14;
|
||||||
public static final int DOOR_SIDEWAYS_LOCKED = WALL_OVERHANG+15;
|
public static final int DOOR_SIDEWAYS_LOCKED = WALL_OVERHANG+15;
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Logic for the selection of tile visuals
|
* Logic for the selection of tile visuals
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.tiles;
|
package com.shatteredpixel.shatteredpixeldungeon.tiles;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Terrain;
|
|
||||||
import com.watabou.noosa.Image;
|
import com.watabou.noosa.Image;
|
||||||
import com.watabou.noosa.TextureFilm;
|
import com.watabou.noosa.TextureFilm;
|
||||||
import com.watabou.noosa.Tilemap;
|
import com.watabou.noosa.Tilemap;
|
||||||
|
@ -31,22 +29,14 @@ import com.watabou.utils.PathFinder;
|
||||||
import com.watabou.utils.Point;
|
import com.watabou.utils.Point;
|
||||||
import com.watabou.utils.PointF;
|
import com.watabou.utils.PointF;
|
||||||
|
|
||||||
public class DungeonTilemap extends Tilemap {
|
public abstract class DungeonTilemap extends Tilemap {
|
||||||
|
|
||||||
public static final int SIZE = 16;
|
public static final int SIZE = 16;
|
||||||
|
|
||||||
private static DungeonTilemap instance;
|
protected int[] map;
|
||||||
|
|
||||||
private int[] map;
|
public DungeonTilemap(String tex) {
|
||||||
|
super(tex, new TextureFilm( tex, SIZE, SIZE ) );
|
||||||
public DungeonTilemap() {
|
|
||||||
super(
|
|
||||||
Dungeon.level.tilesTex(),
|
|
||||||
new TextureFilm( Dungeon.level.tilesTex(), SIZE, SIZE ) );
|
|
||||||
|
|
||||||
map( Dungeon.level.map, Dungeon.level.width() );
|
|
||||||
|
|
||||||
instance = this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -80,56 +70,7 @@ public class DungeonTilemap extends Tilemap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getTileVisual(int pos, int tile, boolean flat) {
|
protected abstract int getTileVisual(int pos, int tile, boolean flat);
|
||||||
int visual = DungeonTileSheet.directVisuals.get(tile, -1);
|
|
||||||
|
|
||||||
if (tile == Terrain.WATER) {
|
|
||||||
return DungeonTileSheet.getWaterTile(
|
|
||||||
map[pos + PathFinder.CIRCLE4[0]],
|
|
||||||
map[pos + PathFinder.CIRCLE4[1]],
|
|
||||||
map[pos + PathFinder.CIRCLE4[2]],
|
|
||||||
map[pos + PathFinder.CIRCLE4[3]]
|
|
||||||
);
|
|
||||||
|
|
||||||
} else if (tile == Terrain.CHASM && pos >= mapWidth) {
|
|
||||||
return DungeonTileSheet.chasmStitcheable.get(map[pos - mapWidth], DungeonTileSheet.CHASM);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!flat) {
|
|
||||||
if ((tile == Terrain.DOOR || tile == Terrain.LOCKED_DOOR || tile == Terrain.OPEN_DOOR) && map[pos - mapWidth] == Terrain.WALL) {
|
|
||||||
return DungeonTileSheet.RAISED_DOOR_SIDEWAYS;
|
|
||||||
} else if (tile == Terrain.DOOR) {
|
|
||||||
return DungeonTileSheet.RAISED_DOOR;
|
|
||||||
} else if (tile == Terrain.OPEN_DOOR) {
|
|
||||||
return DungeonTileSheet.RAISED_DOOR_OPEN;
|
|
||||||
} else if (tile == Terrain.LOCKED_DOOR) {
|
|
||||||
return DungeonTileSheet.RAISED_DOOR_LOCKED;
|
|
||||||
} else if (tile == Terrain.WALL || tile == Terrain.WALL_DECO){
|
|
||||||
if (tile == Terrain.WALL) {
|
|
||||||
if (pos + mapWidth < size && (map[pos + mapWidth] == Terrain.DOOR || map[pos + mapWidth] == Terrain.LOCKED_DOOR || map[pos + mapWidth] == Terrain.OPEN_DOOR)){
|
|
||||||
visual = DungeonTileSheet.RAISED_WALL_DOOR;
|
|
||||||
} else {
|
|
||||||
visual = DungeonTileSheet.RAISED_WALL;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
visual = DungeonTileSheet.RAISED_WALL_DECO;
|
|
||||||
|
|
||||||
visual = DungeonTileSheet.getVisualWithAlts(visual, pos);
|
|
||||||
|
|
||||||
if (pos % mapWidth != 0 && !DungeonTileSheet.wallStitcheable.contains(map[pos - 1]))
|
|
||||||
visual += 2;
|
|
||||||
if (pos % mapWidth != mapWidth-1 && !DungeonTileSheet.wallStitcheable.contains(map[pos + 1]))
|
|
||||||
visual += 1;
|
|
||||||
|
|
||||||
return visual;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (visual == -1)
|
|
||||||
visual = DungeonTileSheet.directFlatVisuals.get(tile);
|
|
||||||
}
|
|
||||||
|
|
||||||
return DungeonTileSheet.getVisualWithAlts(visual, pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int screenToTile(int x, int y ) {
|
public int screenToTile(int x, int y ) {
|
||||||
Point p = camera().screenToCamera( x, y ).
|
Point p = camera().screenToCamera( x, y ).
|
||||||
|
@ -151,7 +92,8 @@ public class DungeonTilemap extends Tilemap {
|
||||||
|
|
||||||
public void discover( int pos, int oldValue ) {
|
public void discover( int pos, int oldValue ) {
|
||||||
|
|
||||||
final Image tile = tile( pos, oldValue );
|
final Image tile = new Image( texture );
|
||||||
|
tile.frame( tileset.get( getTileVisual( pos, oldValue, false)));
|
||||||
tile.point( tileToWorld( pos ) );
|
tile.point( tileToWorld( pos ) );
|
||||||
|
|
||||||
parent.add( tile );
|
parent.add( tile );
|
||||||
|
@ -174,20 +116,9 @@ public class DungeonTilemap extends Tilemap {
|
||||||
(pos / Dungeon.level.width() + 0.5f) * SIZE );
|
(pos / Dungeon.level.width() + 0.5f) * SIZE );
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Image tile( int pos, int tile ) {
|
|
||||||
Image img = new Image( instance.texture );
|
|
||||||
img.frame( instance.tileset.get( instance.getTileVisual( pos, tile, true ) ) );
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean overlapsScreenPoint( int x, int y ) {
|
public boolean overlapsScreenPoint( int x, int y ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean needsRender(int pos) {
|
|
||||||
return (Level.discoverable[pos] || data[pos] == DungeonTileSheet.CHASM)
|
|
||||||
&& data[pos] != DungeonTileSheet.WATER;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,56 +31,17 @@ import com.watabou.utils.Random;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class DungeonWallsTilemap extends Tilemap {
|
public class DungeonWallsTilemap extends DungeonTilemap {
|
||||||
|
|
||||||
public static final int SIZE = 16;
|
|
||||||
|
|
||||||
private static DungeonWallsTilemap instance;
|
|
||||||
|
|
||||||
private int[] map;
|
|
||||||
|
|
||||||
public DungeonWallsTilemap(){
|
public DungeonWallsTilemap(){
|
||||||
super(
|
super(Dungeon.level.tilesTex());
|
||||||
Dungeon.level.tilesTex(),
|
|
||||||
new TextureFilm( Dungeon.level.tilesTex(), SIZE, SIZE ) );
|
|
||||||
|
|
||||||
map( Dungeon.level.map, Dungeon.level.width() );
|
map( Dungeon.level.map, Dungeon.level.width() );
|
||||||
|
|
||||||
instance = this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
//we need to retain two arrays, map is the dungeon tilemap which we can reference.
|
protected int getTileVisual(int pos, int tile, boolean flat){
|
||||||
// Data is our own internal image representation of the tiles, which may differ.
|
|
||||||
public void map(int[] data, int cols) {
|
|
||||||
map = data;
|
|
||||||
super.map(new int[data.length], cols);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
if (flat) return -1;
|
||||||
public synchronized void updateMap() {
|
|
||||||
super.updateMap();
|
|
||||||
for (int i = 0; i < data.length; i++)
|
|
||||||
data[i] = getTileVisual(i ,map[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void updateMapCell(int cell) {
|
|
||||||
//update in a 3x3 grid to account for neighbours which might also be affected
|
|
||||||
if (Dungeon.level.insideMap(cell)) {
|
|
||||||
super.updateMapCell(cell - mapWidth - 1);
|
|
||||||
super.updateMapCell(cell + mapWidth + 1);
|
|
||||||
for (int i : PathFinder.NEIGHBOURS9)
|
|
||||||
data[cell + i] = getTileVisual(cell + i, map[cell + i]);
|
|
||||||
|
|
||||||
//unless we're at the level's edge, then just do the one tile.
|
|
||||||
} else {
|
|
||||||
super.updateMapCell(cell);
|
|
||||||
data[cell] = getTileVisual(cell, map[cell]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getTileVisual(int pos, int tile){
|
|
||||||
|
|
||||||
if (DungeonTileSheet.wallStitcheable.contains(tile)) {
|
if (DungeonTileSheet.wallStitcheable.contains(tile)) {
|
||||||
if (pos + mapWidth < size && !DungeonTileSheet.wallStitcheable.contains(map[pos + mapWidth])){
|
if (pos + mapWidth < size && !DungeonTileSheet.wallStitcheable.contains(map[pos + mapWidth])){
|
||||||
|
@ -89,38 +50,26 @@ public class DungeonWallsTilemap extends Tilemap {
|
||||||
return DungeonTileSheet.DOOR_SIDEWAYS;
|
return DungeonTileSheet.DOOR_SIDEWAYS;
|
||||||
} else if (map[pos + mapWidth] == Terrain.LOCKED_DOOR){
|
} else if (map[pos + mapWidth] == Terrain.LOCKED_DOOR){
|
||||||
return DungeonTileSheet.DOOR_SIDEWAYS_LOCKED;
|
return DungeonTileSheet.DOOR_SIDEWAYS_LOCKED;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//otherwise, need to stitch with right, bottom-right, bottom-left, and left.
|
return DungeonTileSheet.stitchInternalWallTile(
|
||||||
int visual = DungeonTileSheet.WALLS_INTERNAL;
|
(pos+1) % mapWidth != 0 ? map[pos + 1] : -1,
|
||||||
if (pos % mapWidth != 0 && !DungeonTileSheet.wallStitcheable.contains(map[pos - 1]))
|
(pos+1) % mapWidth != 0 && pos + mapWidth < size ? map[pos + 1 + mapWidth] : -1,
|
||||||
visual += 8;
|
pos % mapWidth != 0 && pos + mapWidth < size ? map[pos - 1 + mapWidth] : -1,
|
||||||
if (pos % mapWidth != 0 && pos + mapWidth < size && !DungeonTileSheet.wallStitcheable.contains(map[pos - 1 + mapWidth]))
|
pos % mapWidth != 0 ? map[pos - 1] : -1
|
||||||
visual += 4;
|
);
|
||||||
if ((pos+1) % mapWidth != 0 && pos + mapWidth < size && !DungeonTileSheet.wallStitcheable.contains(map[pos + 1 + mapWidth]))
|
|
||||||
visual += 2;
|
|
||||||
if ((pos+1) % mapWidth != 0 && !DungeonTileSheet.wallStitcheable.contains(map[pos + 1]))
|
|
||||||
visual += 1;
|
|
||||||
return visual;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (Dungeon.level.insideMap(pos) && DungeonTileSheet.wallStitcheable.contains(map[pos+mapWidth])) {
|
} else if (Dungeon.level.insideMap(pos) && DungeonTileSheet.wallStitcheable.contains(map[pos+mapWidth])) {
|
||||||
|
|
||||||
int visual;
|
return DungeonTileSheet.stitchWallOverhangTile(
|
||||||
if (map[pos] == Terrain.DOOR || map[pos] == Terrain.LOCKED_DOOR)
|
tile,
|
||||||
visual = DungeonTileSheet.DOOR_SIDEWAYS_OVERHANG;
|
map[pos + 1 + mapWidth],
|
||||||
else if (map[pos] == Terrain.OPEN_DOOR)
|
map[pos - 1 + mapWidth]
|
||||||
visual = DungeonTileSheet.DOOR_SIDEWAYS_OVERHANG_OPEN;
|
);
|
||||||
else
|
|
||||||
visual = DungeonTileSheet.WALL_OVERHANG;
|
|
||||||
|
|
||||||
if (!DungeonTileSheet.wallStitcheable.contains(map[pos - 1 + mapWidth]))
|
|
||||||
visual += 2;
|
|
||||||
if (!DungeonTileSheet.wallStitcheable.contains(map[pos + 1 + mapWidth]))
|
|
||||||
visual += 1;
|
|
||||||
|
|
||||||
return visual;
|
|
||||||
|
|
||||||
} else if (Dungeon.level.insideMap(pos) && (map[pos+mapWidth] == Terrain.DOOR || map[pos+mapWidth] == Terrain.LOCKED_DOOR) ) {
|
} else if (Dungeon.level.insideMap(pos) && (map[pos+mapWidth] == Terrain.DOOR || map[pos+mapWidth] == Terrain.LOCKED_DOOR) ) {
|
||||||
return DungeonTileSheet.DOOR_OVERHANG;
|
return DungeonTileSheet.DOOR_OVERHANG;
|
||||||
|
|
|
@ -34,19 +34,15 @@ import com.watabou.utils.PointF;
|
||||||
import com.watabou.utils.SparseArray;
|
import com.watabou.utils.SparseArray;
|
||||||
|
|
||||||
//TODO add in a proper set of vfx for plants growing/withering, grass burning, discovering traps
|
//TODO add in a proper set of vfx for plants growing/withering, grass burning, discovering traps
|
||||||
public class TerrainFeaturesTilemap extends Tilemap {
|
public class TerrainFeaturesTilemap extends DungeonTilemap {
|
||||||
|
|
||||||
public static final int SIZE = 16;
|
|
||||||
|
|
||||||
private static TerrainFeaturesTilemap instance;
|
private static TerrainFeaturesTilemap instance;
|
||||||
|
|
||||||
private int[] map;
|
|
||||||
|
|
||||||
private SparseArray<Plant> plants;
|
private SparseArray<Plant> plants;
|
||||||
private SparseArray<Trap> traps;
|
private SparseArray<Trap> traps;
|
||||||
|
|
||||||
public TerrainFeaturesTilemap(SparseArray<Plant> plants, SparseArray<Trap> traps) {
|
public TerrainFeaturesTilemap(SparseArray<Plant> plants, SparseArray<Trap> traps) {
|
||||||
super(Assets.TERRAIN_FEATURES, new TextureFilm( Assets.TERRAIN_FEATURES, SIZE, SIZE ));
|
super(Assets.TERRAIN_FEATURES);
|
||||||
|
|
||||||
this.plants = plants;
|
this.plants = plants;
|
||||||
this.traps = traps;
|
this.traps = traps;
|
||||||
|
@ -56,38 +52,7 @@ public class TerrainFeaturesTilemap extends Tilemap {
|
||||||
instance = this;
|
instance = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected int getTileVisual(int pos, int tile, boolean flat){
|
||||||
//we need to retain two arrays, map is the dungeon tilemap which we can reference.
|
|
||||||
// Data is our own internal image representation of the tiles, which may differ.
|
|
||||||
public void map(int[] data, int cols) {
|
|
||||||
map = data;
|
|
||||||
super.map(new int[data.length], cols);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void updateMap() {
|
|
||||||
super.updateMap();
|
|
||||||
for (int i = 0; i < data.length; i++)
|
|
||||||
data[i] = getTileVisual(i ,map[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public synchronized void updateMapCell(int cell) {
|
|
||||||
//update in a 3x3 grid to account for neighbours which might also be affected
|
|
||||||
if (Dungeon.level.insideMap(cell)) {
|
|
||||||
super.updateMapCell(cell - mapWidth - 1);
|
|
||||||
super.updateMapCell(cell + mapWidth + 1);
|
|
||||||
for (int i : PathFinder.NEIGHBOURS9)
|
|
||||||
data[cell + i] = getTileVisual(cell + i, map[cell + i]);
|
|
||||||
|
|
||||||
//unless we're at the level's edge, then just do the one tile.
|
|
||||||
} else {
|
|
||||||
super.updateMapCell(cell);
|
|
||||||
data[cell] = getTileVisual(cell, map[cell]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private int getTileVisual(int pos, int tile){
|
|
||||||
if (traps.get(pos) != null){
|
if (traps.get(pos) != null){
|
||||||
Trap trap = traps.get(pos);
|
Trap trap = traps.get(pos);
|
||||||
if (!trap.visible)
|
if (!trap.visible)
|
||||||
|
@ -113,7 +78,7 @@ public class TerrainFeaturesTilemap extends Tilemap {
|
||||||
|
|
||||||
public static Image tile(int pos, int tile ) {
|
public static Image tile(int pos, int tile ) {
|
||||||
Image img = new Image( instance.texture );
|
Image img = new Image( instance.texture );
|
||||||
img.frame( instance.tileset.get( instance.getTileVisual( pos, tile ) ) );
|
img.frame( instance.tileset.get( instance.getTileVisual( pos, tile, true ) ) );
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,16 +99,6 @@ public class TerrainFeaturesTilemap extends Tilemap {
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean overlapsPoint( float x, float y ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean overlapsScreenPoint( int x, int y ) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean needsRender(int pos) {
|
protected boolean needsRender(int pos) {
|
||||||
return data[pos] != -1;
|
return data[pos] != -1;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
package com.shatteredpixel.shatteredpixeldungeon.windows;
|
package com.shatteredpixel.shatteredpixeldungeon.windows;
|
||||||
|
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
import com.shatteredpixel.shatteredpixeldungeon.Dungeon;
|
||||||
|
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTerrainTilemap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
import com.shatteredpixel.shatteredpixeldungeon.tiles.DungeonTilemap;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
import com.shatteredpixel.shatteredpixeldungeon.actors.blobs.Blob;
|
||||||
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
import com.shatteredpixel.shatteredpixeldungeon.levels.Level;
|
||||||
|
@ -76,7 +77,7 @@ public class WndInfoCell extends Window {
|
||||||
water.frame(0, 0, DungeonTilemap.SIZE, DungeonTilemap.SIZE);
|
water.frame(0, 0, DungeonTilemap.SIZE, DungeonTilemap.SIZE);
|
||||||
titlebar.icon(water);
|
titlebar.icon(water);
|
||||||
} else {
|
} else {
|
||||||
titlebar.icon(DungeonTilemap.tile( cell, tile ));
|
titlebar.icon(DungeonTerrainTilemap.tile( cell, tile ));
|
||||||
}
|
}
|
||||||
titlebar.label(Dungeon.level.tileName(tile));
|
titlebar.label(Dungeon.level.tileName(tile));
|
||||||
desc += Dungeon.level.tileDesc(tile);
|
desc += Dungeon.level.tileDesc(tile);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user