Doodads now affect the passability of terrain.
This commit is contained in:
parent
2fc918a728
commit
1b6a4fac03
@ -83,7 +83,7 @@ class TilesetBuilder extends Savable {
|
||||
var bPalette = IndexedSeq[AutoTile]()
|
||||
var cPalette = IndexedSeq[AutoTile]()
|
||||
|
||||
val resourceDir = new File(raw"C:\Users\James\Documents\Design\Project\Progena\Resources\tilesets")
|
||||
val resourceDir = new File(Config.homedir + raw"Progena\Resources\tilesets")
|
||||
val files = resourceDir.listFiles()
|
||||
val filenames = files.map(f => (f.getName(), f)).toMap
|
||||
|
||||
@ -149,7 +149,7 @@ class TilesetBuilder extends Savable {
|
||||
if (a1Palette.size != currTileset.a1Size()) {
|
||||
currTileset.tileInfo.removeRange(0, currTileset.a1Size())
|
||||
currTileset.a1Size() = a1Palette.size
|
||||
val info = a1Palette.map(_ => allPassInfo)
|
||||
val info = a1Palette.map(_ => noPassInfo)
|
||||
currTileset.tileInfo.insert(0, info : _*)
|
||||
}
|
||||
updateTileView()
|
||||
@ -159,7 +159,7 @@ class TilesetBuilder extends Savable {
|
||||
currTileset.a2.value = getSelected(a2Chooser)
|
||||
a2Palette = if (getSelected(a2Chooser) == null) IndexedSeq() else AutoTilePalette.a2(getSelected(a2Chooser), Config.tileSize).tiles
|
||||
if (a2Palette.size != currTileset.a2Size()) {
|
||||
val priorSize = currTileset.a2Size()
|
||||
val priorSize = currTileset.a1Size()
|
||||
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a2Size())
|
||||
currTileset.a2Size() = a1Palette.size
|
||||
val info = a2Palette.map(_ => allPassInfo)
|
||||
@ -175,7 +175,7 @@ class TilesetBuilder extends Savable {
|
||||
val priorSize = currTileset.a1Size() + currTileset.a2Size()
|
||||
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a3Size())
|
||||
currTileset.a3Size() = a1Palette.size
|
||||
val info = a3Palette.map(_ => allPassInfo)
|
||||
val info = a3Palette.map(_ => noPassInfo)
|
||||
currTileset.tileInfo.insert(priorSize, info : _*)
|
||||
}
|
||||
updateTileView()
|
||||
@ -188,7 +188,7 @@ class TilesetBuilder extends Savable {
|
||||
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size()
|
||||
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a4Size())
|
||||
currTileset.a4Size() = a4Palette.size
|
||||
val info = a4Palette.map(_ => allPassInfo)
|
||||
val info = a4Palette.zipWithIndex.map{case (_, i) => if ((i / 8) % 2 == 0) allPassInfo else noPassInfo}
|
||||
currTileset.tileInfo.insert(priorSize, info : _*)
|
||||
}
|
||||
updateTileView()
|
||||
@ -214,7 +214,7 @@ class TilesetBuilder extends Savable {
|
||||
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size()
|
||||
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.bSize())
|
||||
currTileset.bSize() = bPalette.size
|
||||
val info = bPalette.map(_ => allPassInfo)
|
||||
val info = bPalette.zipWithIndex.map{case (_, i) => if (i != 0) doodadInfo else allPassInfo}
|
||||
currTileset.tileInfo.insert(priorSize, info : _*)
|
||||
}
|
||||
updateTileView()
|
||||
@ -227,7 +227,7 @@ class TilesetBuilder extends Savable {
|
||||
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size() + currTileset.bSize()
|
||||
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.cSize())
|
||||
currTileset.cSize() = cPalette.size
|
||||
val info = cPalette.map(_ => allPassInfo)
|
||||
val info = cPalette.map(_ => doodadInfo)
|
||||
currTileset.tileInfo.insert(priorSize, info : _*)
|
||||
}
|
||||
updateTileView()
|
||||
@ -255,12 +255,14 @@ class TilesetBuilder extends Savable {
|
||||
}
|
||||
|
||||
def updateTile(): Unit = {
|
||||
currTileset.tileInfo(currTileIndex) = TileInfo(
|
||||
doesPassNorth.selected(),
|
||||
doesPassEast.selected(),
|
||||
doesPassSouth.selected(),
|
||||
doesPassWest.selected(),
|
||||
isCounter.selected())
|
||||
val northFlag = if (doesPassNorth.selected()) TileInfo.PassNorth else TileInfo.NoPass
|
||||
val eastFlag = if (doesPassEast.selected()) TileInfo.PassEast else TileInfo.NoPass
|
||||
val southFlag = if (doesPassSouth.selected()) TileInfo.PassSouth else TileInfo.NoPass
|
||||
val westFlag = if (doesPassWest.selected()) TileInfo.PassWest else TileInfo.NoPass
|
||||
val counterFlag = if (isCounter.selected()) TileInfo.IsCounter else TileInfo.NoPass
|
||||
val overwriteFlag = currTileset.tileInfo(currTileIndex).flags & TileInfo.Overwrite
|
||||
val flags = northFlag | eastFlag | southFlag | westFlag | counterFlag | overwriteFlag
|
||||
currTileset.tileInfo(currTileIndex) = TileInfo(flags)
|
||||
}
|
||||
|
||||
def saveTo(file: File): Unit = {
|
||||
@ -289,7 +291,9 @@ class TilesetBuilder extends Savable {
|
||||
tilesetList.refresh()
|
||||
}
|
||||
|
||||
private def allPassInfo = TileInfo(true, true, true, true, false)
|
||||
private def allPassInfo = TileInfo(TileInfo.PassAll)
|
||||
private def noPassInfo = TileInfo(TileInfo.NoPass)
|
||||
private def doodadInfo = TileInfo(TileInfo.NoPass | TileInfo.Overwrite)
|
||||
}
|
||||
|
||||
object TilesetBuilder {
|
||||
|
@ -19,6 +19,11 @@ class GameMap(val width: Int, val height: Int, val tileset: Tileset) {
|
||||
|
||||
def tileInfo(index: Int) = tileset.infoOf(tiles(index))
|
||||
def tileInfo(pos: Position) = tileset.infoOf(this(pos))
|
||||
def compositeInfo(pos: Position) = {
|
||||
val gi = tileset.infoOf(this(pos))
|
||||
val di = tileset.infoOf(doodad(pos))
|
||||
if (di.doesOverwrite) di else gi
|
||||
}
|
||||
|
||||
def saveTo(file: File): Unit = {
|
||||
val ostream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)))
|
||||
@ -59,7 +64,8 @@ class GameMap(val width: Int, val height: Int, val tileset: Tileset) {
|
||||
tiles(index).build(dirs.toSet).croppedImage()
|
||||
}
|
||||
|
||||
def pt2index(x: Int, y: Int) = y * width + x
|
||||
def pt2index(x: Int, y: Int): Int = y * width + x
|
||||
def pt2index(pos: Position): Int = pt2index(pos.x, pos.y)
|
||||
def index2x(i: Int) = i % width
|
||||
def index2y(i: Int) = i / width
|
||||
|
||||
|
@ -12,13 +12,31 @@ class Tileset(val groundTiles: IndexedSeq[AutoTile], val doodadTiles: IndexedSeq
|
||||
val infoOf = (groundTiles.zipWithIndex.map{case (t, i) => (t, groundInfo(i))} ++ doodadTiles.zipWithIndex.map{case (t, i) => (t, doodadInfo(i))}).toMap
|
||||
}
|
||||
|
||||
case class TileInfo(
|
||||
val doesPassNorth: Boolean,
|
||||
val doesPassEast: Boolean,
|
||||
val doesPassSouth: Boolean,
|
||||
val doesPassWest: Boolean,
|
||||
val isCounter: Boolean) {
|
||||
case class TileInfo(val flags: Int = TileInfo.PassAll) {
|
||||
def doesPassNorth = (flags & TileInfo.PassNorth) != 0
|
||||
def doesPassEast = (flags & TileInfo.PassEast) != 0
|
||||
def doesPassSouth = (flags & TileInfo.PassSouth) != 0
|
||||
def doesPassWest = (flags & TileInfo.PassWest) != 0
|
||||
|
||||
def doesOverwrite = (flags & TileInfo.Overwrite) != 0
|
||||
|
||||
def isCounter = (flags & TileInfo.IsCounter) != 0
|
||||
}
|
||||
|
||||
|
||||
object TileInfo {
|
||||
val PassNorth = 0x0001
|
||||
val PassEast = 0x0002
|
||||
val PassSouth = 0x0004
|
||||
val PassWest = 0x0008
|
||||
val PassAll = PassNorth | PassEast | PassSouth | PassWest
|
||||
val NoPass = 0
|
||||
|
||||
val Overwrite = 0x0010
|
||||
val Underfoot = 0x0020
|
||||
val Overhead = 0x0040
|
||||
|
||||
val IsCounter = 0x0100
|
||||
}
|
||||
|
||||
case class TilesetToken(
|
||||
|
@ -124,7 +124,7 @@ class GameView {
|
||||
if (hero.pose != dir.toString()) {
|
||||
hero.pose = dir.toString()
|
||||
} else {
|
||||
val info = level.tileInfo(hero.pos + dir)
|
||||
val info = level.compositeInfo(hero.pos + dir)
|
||||
val canPass = (dir.x < 0 && info.doesPassEast) || (dir.x > 0 && info.doesPassWest) ||
|
||||
(dir.y < 0 && info.doesPassSouth) || (dir.y > 0 && info.doesPassNorth)
|
||||
if (canPass) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user