Added a tileset builder

This commit is contained in:
James Daly
2019-07-14 21:15:57 -04:00
parent 07df031670
commit 807970db5e
11 changed files with 541 additions and 13 deletions

View File

@@ -6,4 +6,4 @@ resistMult: 0.5
immuneMult: 0.0
maxBoost: 6
newday: 02:00
tileSize: 32
tileSize: 48

View File

@@ -17,6 +17,10 @@ trait AutoTile {
def build(dirs: Set[Direction.Value]): StillImg
}
class BasicTile(val icon: StillImg) extends AutoTile {
def build(dirs: Set[Direction.Value]) = icon
}
class AutoFloorTile(val palette: Palette, val size: Int = 48) extends AutoTile {
def icon: StillImg = palette.apply(0, 0, 2, 2)
@@ -154,13 +158,81 @@ class AutoWallTile(val palette: Palette, val size: Int = 48) extends AutoTile {
}
}
class AutoTilePalette(val palette: Palette, val size: Int) {
trait AutoTilePalette {
def apply(x: Int, y: Int): AutoTile
def tiles: IndexedSeq[AutoTile]
}
class AutoFloorTilePalette(val palette: Palette, val size: Int) extends AutoTilePalette {
final val TileWidth = 2
final val TileHeight = 3
def this(file: File, size: Int = 48) = this(Palette.bySize(new FileInputStream(file), size, size), size)
def apply(x: Int, y: Int) = {
val img = palette.apply(x * 2, y * 3, 2, 3).croppedImage()
new AutoFloorTile(new Palette(img, 4, 6), size)
val img = palette.apply(x * TileWidth, y * TileHeight, TileWidth, TileHeight).croppedImage()
new AutoFloorTile(new Palette(img, 2 * TileWidth, 2 * TileHeight), size)
}
def tiles = for (y <- 0 until palette.numDown / TileHeight; x <- 0 until palette.numAcross / TileWidth) yield {
this(x, y)
}
}
class AutoWallTilePalette(val palette: Palette, val size: Int) extends AutoTilePalette {
final val TileWidth = 2
final val TileHeight = 2
def this(file: File, size: Int = 48) = this(Palette.bySize(new FileInputStream(file), size, size), size)
def apply(x: Int, y: Int) = {
val img = palette.apply(x * TileWidth, y * TileHeight, TileWidth, TileHeight).croppedImage()
new AutoWallTile(new Palette(img, 2 * TileWidth, 2 * TileHeight), size)
}
def tiles = for (y <- 0 until palette.numDown / TileHeight; x <- 0 until palette.numAcross / TileWidth) yield {
this(x, y)
}
}
class AutoComboTilePalette(val palette: Palette, val size: Int) extends AutoTilePalette {
final val TileWidth = 2
final val CeilHeight = 3
final val WallHeight = 2
final val TotalHeight = CeilHeight + WallHeight
def this(file: File, size: Int = 48) = this(Palette.bySize(new FileInputStream(file), size, size), size)
def apply(x: Int, y: Int) = {
val yy = y / 2
if (y % 2 == 0) {
// Ceiling
val img = palette.apply(x * TileWidth, yy * TotalHeight, TileWidth, CeilHeight).croppedImage()
new AutoFloorTile(new Palette(img, 2 * TileWidth, 2 * CeilHeight), size)
} else {
// Wall
val img = palette.apply(x * TileWidth, yy * TotalHeight + CeilHeight, TileWidth, WallHeight).croppedImage()
new AutoWallTile(new Palette(img, 2 * TileWidth, 2 * WallHeight), size)
}
}
def tiles = for (y <- 0 until 2 * palette.numDown / TotalHeight; x <- 0 until palette.numAcross / TileWidth) yield {
this(x, y)
}
}
class BasicTilePalette(val palette: Palette, val size: Int) extends AutoTilePalette {
def this(file: File, size: Int = 48) = this(Palette.bySize(new FileInputStream(file), size, size), size)
def apply(x: Int, y: Int) = new BasicTile(palette(x, y))
def tiles = palette.images.map(new BasicTile(_))
}
object AutoTilePalette {
def a2(file: File, size: Int = 48) = new AutoFloorTilePalette(file, size)
def a3(file: File, size: Int = 48) = new AutoWallTilePalette(file, size)
def a4(file: File, size: Int = 48) = new AutoComboTilePalette(file, size)
def basic(file: File, size: Int = 48) = new BasicTilePalette(file, size)
}
import scalafx.Includes._
@@ -177,7 +249,7 @@ object AutoTileDemo extends JFXApp {
final val MaxY = 3
val file = raw"C:\Users\dalyj\Documents\Design\Images\AutoTiles\tilea2.png"
val palette = new AutoTilePalette(new File(file), 32)
val palette = new AutoFloorTilePalette(new File(file), 32)
val tile = palette(2, 0)
val imgs = for (y <- 0 to MaxY; x <- 0 to MaxX) yield {
val dirs = (x, y) match {

View File

@@ -90,6 +90,10 @@ object YamlHelper {
mapper.writeValue(source, item)
}
def writeSeq[T](source: OutputStream, items: Seq[T]) = {
mapper.writeValue(source, items)
}
def writeMap[T](source: OutputStream, items: Map[String, T])(implicit m: Manifest[T]) = {
mapper.writeValue(source, items)
}

View File

@@ -31,7 +31,7 @@ object GameMap {
val istream = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)))
val width = istream.readInt()
val height = istream.readInt()
val tileset = new Tileset(new TilesetToken(istream.readObject().toString))
val tileset = new Tileset(new TilesetToken("Tileset", null, istream.readObject().toString, null, null, null, null, null, IndexedSeq()))
val indices = for (y <- 0 until height; x <- 0 until width) yield istream.readInt()
val map = new GameMap(width, height, tileset)
val tiles = indices.map(i => tileset.groundTiles(i))

View File

@@ -8,11 +8,32 @@ import fmon.draw.tile._
class Tileset(val token: TilesetToken) {
val groundTiles: IndexedSeq[AutoTile] = {
val file = new File(token.a2)
val palette = new AutoTilePalette(file, Config.tileSize)
val palette = new AutoFloorTilePalette(file, Config.tileSize)
for (y <- 0 until 4; x <- 0 until 8) yield {
palette(x, y)
}
}
}
case class TilesetToken(val a2: String)
case class TileInfo(
val doesPassNorth: Boolean,
val doesPassEast: Boolean,
val doesPassSouth: Boolean,
val doesPassWest: Boolean,
val isCounter: Boolean) {
}
case class TilesetToken(
val name: String,
val a1: String,
val a2: String,
val a3: String,
val a4: String,
val a5: String,
val b: String,
val c: String,
val info: IndexedSeq[TileInfo]) {
override def toString = name
}