v2.2.0: restructured terrain assets to make more free space

This commit is contained in:
Evan Debenham
2023-08-02 13:46:50 -04:00
parent 6ca1846fd1
commit 6e5687e580
12 changed files with 100 additions and 121 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -200,7 +200,6 @@ levels.level.barricade_name=Barricade
levels.level.high_grass_name=High grass
levels.level.locked_exit_name=Locked depth exit
levels.level.unlocked_exit_name=Unlocked depth exit
levels.level.sign_name=Sign
levels.level.well_name=Well
levels.level.empty_well_name=Empty well
levels.level.statue_name=Statue
@@ -218,7 +217,6 @@ levels.level.locked_door_desc=This door is locked, you need a matching key to un
levels.level.crystal_door_desc=This locked door is made of magical crystal. You can see through, but you'll need a crystal key to open it.
levels.level.locked_exit_desc=Heavy bars block the stairs leading down.
levels.level.barricade_desc=The wooden barricade is firmly set but has dried over the years. Might it burn?
levels.level.sign_desc=You can't read the text from here.
levels.level.inactive_trap_desc=The trap has been triggered before and it's not dangerous anymore.
levels.level.statue_desc=Someone wanted to adorn this place, but failed, obviously.
levels.level.alchemy_desc=This pot is filled with magical water. Items can be mixed into the pot to create something new!

View File

@@ -1475,8 +1475,6 @@ public abstract class Level implements Bundlable {
return Messages.get(Level.class, "locked_exit_name");
case Terrain.UNLOCKED_EXIT:
return Messages.get(Level.class, "unlocked_exit_name");
case Terrain.SIGN:
return Messages.get(Level.class, "sign_name");
case Terrain.WELL:
return Messages.get(Level.class, "well_name");
case Terrain.EMPTY_WELL:
@@ -1520,8 +1518,6 @@ public abstract class Level implements Bundlable {
return Messages.get(Level.class, "locked_exit_desc");
case Terrain.BARRICADE:
return Messages.get(Level.class, "barricade_desc");
case Terrain.SIGN:
return Messages.get(Level.class, "sign_desc");
case Terrain.INACTIVE_TRAP:
return Messages.get(Level.class, "inactive_trap_desc");
case Terrain.STATUE:

View File

@@ -50,7 +50,7 @@ public class Terrain {
public static final int EMPTY_DECO = 20;
public static final int LOCKED_EXIT = 21;
public static final int UNLOCKED_EXIT = 22;
public static final int SIGN = 23;
public static final int SIGN = 23; //currently used purely for custom tile visuals
public static final int WELL = 24;
public static final int STATUE = 25;
public static final int STATUE_SP = 26;
@@ -118,14 +118,4 @@ public class Terrain {
}
}
//removes signs, places floors instead
public static int[] convertTilesFrom0_6_0b(int[] map){
for (int i = 0; i < map.length; i++){
if (map[i] == 23){
map[i] = 1;
}
}
return map;
}
}

View File

@@ -66,8 +66,6 @@ public class DungeonTerrainTilemap extends DungeonTilemap {
pos + mapWidth < size ? map[pos + mapWidth] : -1,
pos % mapWidth != 0 ? map[pos - 1] : -1
);
} else if (tile == Terrain.SIGN) {
return DungeonTileSheet.RAISED_SIGN;
} else if (tile == Terrain.STATUE) {
return DungeonTileSheet.RAISED_STATUE;
} else if (tile == Terrain.STATUE_SP) {

View File

@@ -47,7 +47,7 @@ public class DungeonTileSheet {
* Floor Tiles
**********************************************************************/
private static final int GROUND = xy(1, 1); //32 slots
private static final int GROUND = xy(1, 1); //24 slots
public static final int FLOOR = GROUND +0;
public static final int FLOOR_DECO = GROUND +1;
public static final int GRASS = GROUND +2;
@@ -68,51 +68,12 @@ public class DungeonTileSheet {
public static final int EMPTY_WELL = GROUND +19;
public static final int PEDESTAL = GROUND +20;
/**********************************************************************
* Water Tiles
**********************************************************************/
public static final int WATER = xy(1, 3); //16 slots
//next 15 slots are all water stitching with ground.
//These tiles can stitch with water
public static HashSet<Integer> waterStitcheable = new HashSet<>(Arrays.asList(
Terrain.EMPTY, Terrain.GRASS, Terrain.EMPTY_WELL,
Terrain.ENTRANCE, Terrain.EXIT, Terrain.EMBERS,
Terrain.BARRICADE, Terrain.HIGH_GRASS, Terrain.FURROWED_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, Terrain.CRYSTAL_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){
int result = WATER;
if (waterStitcheable.contains(top)) result += 1;
if (waterStitcheable.contains(right)) result += 2;
if (waterStitcheable.contains(bottom)) result += 4;
if (waterStitcheable.contains(left)) result += 8;
return result;
}
public static boolean floorTile(int tile){
return tile == Terrain.WATER || directVisuals.get(tile, CHASM) < CHASM;
}
/**********************************************************************
* Chasm Tiles
**********************************************************************/
public static final int CHASM = xy(1, 4); //16 tiles
public static final int CHASM = xy(9, 2); //8 slots
//chasm stitching visuals...
public static final int CHASM_FLOOR = CHASM+1;
public static final int CHASM_FLOOR_SP = CHASM+2;
public static final int CHASM_WALL = CHASM+3;
public static final int CHASM_WATER = CHASM+4;
public static final int CHASM_FLOOR = CHASM+1;
public static final int CHASM_FLOOR_SP = CHASM+2;
public static final int CHASM_WALL = CHASM+3;
public static final int CHASM_WATER = CHASM+4;
//tiles that can stitch with chasms (from above), and which visual represents the stitching
public static SparseArray<Integer> chasmStitcheable = new SparseArray<>();
@@ -156,11 +117,44 @@ public class DungeonTileSheet {
return chasmStitcheable.get(above, CHASM);
}
/**********************************************************************
* Water Tiles
**********************************************************************/
public static final int WATER = xy(1, 3); //16 slots
//next 15 slots are all water stitching with ground.
//These tiles can stitch with water
public static HashSet<Integer> waterStitcheable = new HashSet<>(Arrays.asList(
Terrain.EMPTY, Terrain.GRASS, Terrain.EMPTY_WELL,
Terrain.ENTRANCE, Terrain.EXIT, Terrain.EMBERS,
Terrain.BARRICADE, Terrain.HIGH_GRASS, Terrain.FURROWED_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, Terrain.CRYSTAL_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){
int result = WATER;
if (waterStitcheable.contains(top)) result += 1;
if (waterStitcheable.contains(right)) result += 2;
if (waterStitcheable.contains(bottom)) result += 4;
if (waterStitcheable.contains(left)) result += 8;
return result;
}
public static boolean floorTile(int tile){
return tile == Terrain.WATER || directVisuals.get(tile, CHASM) < CHASM;
}
/**********************************************************************
Flat Tiles
**********************************************************************/
private static final int FLAT_WALLS = xy(1, 5); //16 slots
private static final int FLAT_WALLS = xy(1, 4); //16 slots
public static final int FLAT_WALL = FLAT_WALLS+0;
public static final int FLAT_WALL_DECO = FLAT_WALLS+1;
public static final int FLAT_BOOKSHELF = FLAT_WALLS+2;
@@ -176,24 +170,24 @@ public class DungeonTileSheet {
public static final int UNLOCKED_EXIT = FLAT_WALLS+12;
public static final int LOCKED_EXIT = FLAT_WALLS+13;
public static final int FLAT_OTHER = xy(1, 6); //16 slots
public static final int FLAT_SIGN = FLAT_OTHER+0;
public static final int FLAT_STATUE = FLAT_OTHER+1;
public static final int FLAT_STATUE_SP = FLAT_OTHER+2;
public static final int FLAT_ALCHEMY_POT = FLAT_OTHER+3;
public static final int FLAT_BARRICADE = FLAT_OTHER+4;
public static final int FLAT_HIGH_GRASS = FLAT_OTHER+5;
public static final int FLAT_FURROWED_GRASS = FLAT_OTHER+6;
public static final int FLAT_OTHER = xy(1, 5); //16 slots
public static final int FLAT_ALCHEMY_POT = FLAT_OTHER+0;
public static final int FLAT_BARRICADE = FLAT_OTHER+1;
public static final int FLAT_HIGH_GRASS = FLAT_OTHER+2;
public static final int FLAT_FURROWED_GRASS = FLAT_OTHER+3;
public static final int FLAT_HIGH_GRASS_ALT = FLAT_OTHER+8;
public static final int FLAT_FURROWED_ALT = FLAT_OTHER+9;
public static final int FLAT_HIGH_GRASS_ALT = FLAT_OTHER+5;
public static final int FLAT_FURROWED_ALT = FLAT_OTHER+6;
public static final int FLAT_STATUE = FLAT_OTHER+8;
public static final int FLAT_STATUE_SP = FLAT_OTHER+9;
/**********************************************************************
* Raised Tiles, Lower Layer
**********************************************************************/
private static final int RAISED_WALLS = xy(1, 7); //32 slots
private static final int RAISED_WALLS = xy(1, 6); //32 slots
//+1 for open to the right, +2 for open to the left
public static final int RAISED_WALL = RAISED_WALLS+0;
public static final int RAISED_WALL_DECO = RAISED_WALLS+4;
@@ -238,7 +232,7 @@ public class DungeonTileSheet {
return result;
}
private static final int RAISED_DOORS = xy(1, 9); //16 slots
private static final int RAISED_DOORS = xy(1, 8); //8 slots
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_LOCKED = RAISED_DOORS+2;
@@ -267,25 +261,17 @@ public class DungeonTileSheet {
return false;
}
private static final int RAISED_OTHER = xy(1, 10); //16 slots
public static final int RAISED_SIGN = RAISED_OTHER+0;
public static final int RAISED_STATUE = RAISED_OTHER+1;
public static final int RAISED_STATUE_SP = RAISED_OTHER+2;
public static final int RAISED_ALCHEMY_POT = RAISED_OTHER+3;
public static final int RAISED_BARRICADE = RAISED_OTHER+4;
public static final int RAISED_HIGH_GRASS = RAISED_OTHER+5;
public static final int RAISED_FURROWED_GRASS = RAISED_OTHER+6;
private static final int RAISED_OTHER = xy(9, 8); //24 slots
public static final int RAISED_ALCHEMY_POT = RAISED_OTHER+0;
public static final int RAISED_BARRICADE = RAISED_OTHER+1;
public static final int RAISED_HIGH_GRASS = RAISED_OTHER+2;
public static final int RAISED_FURROWED_GRASS = RAISED_OTHER+3;
//these are part of a layer that appears above characters, despite not being part of overhang
public static final int RAISED_HIGH_GRASS_OVER = RAISED_OTHER+7;
public static final int RAISED_FURROWED_GRASS_OVER = RAISED_OTHER+8;
public static final int RAISED_HIGH_GRASS_ALT = RAISED_OTHER+5;
public static final int RAISED_FURROWED_ALT = RAISED_OTHER+6;
public static final int RAISED_HIGH_GRASS_ALT = RAISED_OTHER+9;
public static final int RAISED_FURROWED_ALT = RAISED_OTHER+10;
//these are part of a layer that appears above characters, despite not being part of overhang
public static final int RAISED_HIGH_GRASS_OVER_ALT = RAISED_OTHER+11;
public static final int RAISED_FURROWED_OVER_ALT = RAISED_OTHER+12;
public static final int RAISED_STATUE = RAISED_OTHER+8;
public static final int RAISED_STATUE_SP = RAISED_OTHER+9;
/**********************************************************************
@@ -293,7 +279,7 @@ public class DungeonTileSheet {
**********************************************************************/
//+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, 11); //48 slots
public static final int WALLS_INTERNAL = xy(1, 10); //48 slots
private static final int WALL_INTERNAL = WALLS_INTERNAL+0;
private static final int WALL_INTERNAL_DECO = WALLS_INTERNAL+16;
private static final int WALL_INTERNAL_WOODEN = WALLS_INTERNAL+32;
@@ -314,7 +300,7 @@ public class DungeonTileSheet {
}
//+1 for open to the down-right, +2 for open to the down-left
private static final int WALLS_OVERHANG = xy(1, 14); //32 slots
private static final int WALLS_OVERHANG = xy(1, 13); //32 slots
public static final int WALL_OVERHANG = WALLS_OVERHANG+0;
public static final int WALL_OVERHANG_DECO = WALLS_OVERHANG+4;
public static final int WALL_OVERHANG_WOODEN = WALLS_OVERHANG+8;
@@ -340,24 +326,33 @@ public class DungeonTileSheet {
return visual;
}
private static final int OTHER_OVERHANG = xy(1, 16); //16 slots
public static final int STATUE_OVERHANG = OTHER_OVERHANG+0;
public static final int ALCHEMY_POT_OVERHANG = OTHER_OVERHANG+1;
public static final int BARRICADE_OVERHANG = OTHER_OVERHANG+2;
public static final int HIGH_GRASS_OVERHANG = OTHER_OVERHANG+3;
public static final int FURROWED_OVERHANG = OTHER_OVERHANG+4;
public static final int HIGH_GRASS_OVERHANG_ALT = OTHER_OVERHANG+6;
public static final int FURROWED_OVERHANG_ALT = OTHER_OVERHANG+7;
public static final int DOOR_OVERHANG = OTHER_OVERHANG+9;
public static final int DOOR_OVERHANG_OPEN = OTHER_OVERHANG+10;
public static final int DOOR_OVERHANG_CRYSTAL = OTHER_OVERHANG+11;
public static final int DOOR_SIDEWAYS = OTHER_OVERHANG+12;
public static final int DOOR_SIDEWAYS_LOCKED = OTHER_OVERHANG+13;
public static final int DOOR_SIDEWAYS_CRYSTAL = OTHER_OVERHANG+14;
public static final int DOOR_OVERHANG = xy(1, 15); //8 slots
public static final int DOOR_OVERHANG_OPEN = DOOR_OVERHANG+1;
public static final int DOOR_OVERHANG_CRYSTAL = DOOR_OVERHANG+2;
public static final int DOOR_SIDEWAYS = DOOR_OVERHANG+3;
public static final int DOOR_SIDEWAYS_LOCKED = DOOR_OVERHANG+4;
public static final int DOOR_SIDEWAYS_CRYSTAL = DOOR_OVERHANG+5;
//exit visuals are rendered flat atm, so they actually underhang
public static final int EXIT_UNDERHANG = OTHER_OVERHANG+15;
public static final int EXIT_UNDERHANG = DOOR_OVERHANG+6;
private static final int OTHER_OVERHANG = xy(9, 15); //24 slots
public static final int ALCHEMY_POT_OVERHANG = OTHER_OVERHANG+0;
public static final int BARRICADE_OVERHANG = OTHER_OVERHANG+1;
public static final int HIGH_GRASS_OVERHANG = OTHER_OVERHANG+2;
public static final int FURROWED_OVERHANG = OTHER_OVERHANG+3;
public static final int HIGH_GRASS_OVERHANG_ALT = OTHER_OVERHANG+5;
public static final int FURROWED_OVERHANG_ALT = OTHER_OVERHANG+6;
public static final int STATUE_OVERHANG = OTHER_OVERHANG+8;
public static final int STATUE_SP_OVERHANG = OTHER_OVERHANG+9;
public static final int HIGH_GRASS_UNDERHANG = OTHER_OVERHANG+18;
public static final int FURROWED_UNDERHANG = OTHER_OVERHANG+19;
public static final int HIGH_GRASS_UNDERHANG_ALT = OTHER_OVERHANG+21;
public static final int FURROWED_UNDERHANG_ALT = OTHER_OVERHANG+22;
/**********************************************************************
* Logic for the selection of tile visuals
@@ -396,14 +391,14 @@ public class DungeonTileSheet {
directFlatVisuals.put(Terrain.CRYSTAL_DOOR, FLAT_DOOR_CRYSTAL);
directFlatVisuals.put(Terrain.WALL_DECO, FLAT_WALL_DECO);
directFlatVisuals.put(Terrain.BOOKSHELF, FLAT_BOOKSHELF);
directFlatVisuals.put(Terrain.SIGN, FLAT_SIGN);
directFlatVisuals.put(Terrain.STATUE, FLAT_STATUE);
directFlatVisuals.put(Terrain.STATUE_SP, FLAT_STATUE_SP);
directFlatVisuals.put(Terrain.ALCHEMY, FLAT_ALCHEMY_POT);
directFlatVisuals.put(Terrain.BARRICADE, FLAT_BARRICADE);
directFlatVisuals.put(Terrain.HIGH_GRASS, FLAT_HIGH_GRASS);
directFlatVisuals.put(Terrain.FURROWED_GRASS, FLAT_FURROWED_GRASS);
directFlatVisuals.put(Terrain.STATUE, FLAT_STATUE);
directFlatVisuals.put(Terrain.STATUE_SP, FLAT_STATUE_SP);
directFlatVisuals.put(Terrain.SECRET_DOOR, directFlatVisuals.get(Terrain.WALL));
}
@@ -446,10 +441,10 @@ public class DungeonTileSheet {
commonAltVisuals.put(RAISED_HIGH_GRASS, RAISED_HIGH_GRASS_ALT);
commonAltVisuals.put(RAISED_FURROWED_GRASS, RAISED_FURROWED_ALT);
commonAltVisuals.put(RAISED_HIGH_GRASS_OVER, RAISED_HIGH_GRASS_OVER_ALT);
commonAltVisuals.put(RAISED_FURROWED_GRASS_OVER, RAISED_FURROWED_OVER_ALT);
commonAltVisuals.put(HIGH_GRASS_OVERHANG, HIGH_GRASS_OVERHANG_ALT);
commonAltVisuals.put(FURROWED_OVERHANG, FURROWED_OVERHANG_ALT);
commonAltVisuals.put(HIGH_GRASS_UNDERHANG, HIGH_GRASS_UNDERHANG_ALT);
commonAltVisuals.put(FURROWED_UNDERHANG, FURROWED_UNDERHANG_ALT);
}
//These alt visuals trigger 5% of the time (and also override common alts when they show up)

View File

@@ -80,8 +80,10 @@ public class DungeonWallsTilemap extends DungeonTilemap {
return DungeonTileSheet.DOOR_OVERHANG_OPEN;
} else if (Dungeon.level.insideMap(pos) && map[pos+mapWidth] == Terrain.CRYSTAL_DOOR ) {
return DungeonTileSheet.DOOR_OVERHANG_CRYSTAL;
} else if (pos + mapWidth < size && (map[pos+mapWidth] == Terrain.STATUE || map[pos+mapWidth] == Terrain.STATUE_SP)){
} else if (pos + mapWidth < size && map[pos+mapWidth] == Terrain.STATUE){
return DungeonTileSheet.STATUE_OVERHANG;
} else if (pos + mapWidth < size && map[pos+mapWidth] == Terrain.STATUE_SP){
return DungeonTileSheet.STATUE_SP_OVERHANG;
} else if (pos + mapWidth < size && map[pos+mapWidth] == Terrain.ALCHEMY){
return DungeonTileSheet.ALCHEMY_POT_OVERHANG;
} else if (pos + mapWidth < size && map[pos+mapWidth] == Terrain.BARRICADE){

View File

@@ -38,11 +38,11 @@ public class RaisedTerrainTilemap extends DungeonTilemap {
if (tile == Terrain.HIGH_GRASS){
return DungeonTileSheet.getVisualWithAlts(
DungeonTileSheet.RAISED_HIGH_GRASS_OVER,
DungeonTileSheet.HIGH_GRASS_UNDERHANG,
pos);
} else if (tile == Terrain.FURROWED_GRASS){
return DungeonTileSheet.getVisualWithAlts(
DungeonTileSheet.RAISED_FURROWED_GRASS_OVER,
DungeonTileSheet.FURROWED_UNDERHANG,
pos);
}