Added a tileset builder
This commit is contained in:
@@ -6,4 +6,4 @@ resistMult: 0.5
|
||||
immuneMult: 0.0
|
||||
maxBoost: 6
|
||||
newday: 02:00
|
||||
tileSize: 32
|
||||
tileSize: 48
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user