Doodads now affect the passability of terrain.

This commit is contained in:
dalyjame 2019-08-09 15:17:43 -04:00
parent 2fc918a728
commit 1b6a4fac03
4 changed files with 50 additions and 22 deletions

View File

@ -83,7 +83,7 @@ class TilesetBuilder extends Savable {
var bPalette = IndexedSeq[AutoTile]() var bPalette = IndexedSeq[AutoTile]()
var cPalette = 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 files = resourceDir.listFiles()
val filenames = files.map(f => (f.getName(), f)).toMap val filenames = files.map(f => (f.getName(), f)).toMap
@ -149,7 +149,7 @@ class TilesetBuilder extends Savable {
if (a1Palette.size != currTileset.a1Size()) { if (a1Palette.size != currTileset.a1Size()) {
currTileset.tileInfo.removeRange(0, currTileset.a1Size()) currTileset.tileInfo.removeRange(0, currTileset.a1Size())
currTileset.a1Size() = a1Palette.size currTileset.a1Size() = a1Palette.size
val info = a1Palette.map(_ => allPassInfo) val info = a1Palette.map(_ => noPassInfo)
currTileset.tileInfo.insert(0, info : _*) currTileset.tileInfo.insert(0, info : _*)
} }
updateTileView() updateTileView()
@ -159,7 +159,7 @@ class TilesetBuilder extends Savable {
currTileset.a2.value = getSelected(a2Chooser) currTileset.a2.value = getSelected(a2Chooser)
a2Palette = if (getSelected(a2Chooser) == null) IndexedSeq() else AutoTilePalette.a2(getSelected(a2Chooser), Config.tileSize).tiles a2Palette = if (getSelected(a2Chooser) == null) IndexedSeq() else AutoTilePalette.a2(getSelected(a2Chooser), Config.tileSize).tiles
if (a2Palette.size != currTileset.a2Size()) { if (a2Palette.size != currTileset.a2Size()) {
val priorSize = currTileset.a2Size() val priorSize = currTileset.a1Size()
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a2Size()) currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a2Size())
currTileset.a2Size() = a1Palette.size currTileset.a2Size() = a1Palette.size
val info = a2Palette.map(_ => allPassInfo) val info = a2Palette.map(_ => allPassInfo)
@ -175,7 +175,7 @@ class TilesetBuilder extends Savable {
val priorSize = currTileset.a1Size() + currTileset.a2Size() val priorSize = currTileset.a1Size() + currTileset.a2Size()
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a3Size()) currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a3Size())
currTileset.a3Size() = a1Palette.size currTileset.a3Size() = a1Palette.size
val info = a3Palette.map(_ => allPassInfo) val info = a3Palette.map(_ => noPassInfo)
currTileset.tileInfo.insert(priorSize, info : _*) currTileset.tileInfo.insert(priorSize, info : _*)
} }
updateTileView() updateTileView()
@ -188,7 +188,7 @@ class TilesetBuilder extends Savable {
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size()
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a4Size()) currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.a4Size())
currTileset.a4Size() = a4Palette.size 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 : _*) currTileset.tileInfo.insert(priorSize, info : _*)
} }
updateTileView() updateTileView()
@ -214,7 +214,7 @@ class TilesetBuilder extends Savable {
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size() val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size()
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.bSize()) currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.bSize())
currTileset.bSize() = bPalette.size 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 : _*) currTileset.tileInfo.insert(priorSize, info : _*)
} }
updateTileView() updateTileView()
@ -227,7 +227,7 @@ class TilesetBuilder extends Savable {
val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size() + currTileset.bSize() val priorSize = currTileset.a1Size() + currTileset.a2Size() + currTileset.a3Size() + currTileset.a4Size() + currTileset.a5Size() + currTileset.bSize()
currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.cSize()) currTileset.tileInfo.removeRange(priorSize, priorSize + currTileset.cSize())
currTileset.cSize() = cPalette.size currTileset.cSize() = cPalette.size
val info = cPalette.map(_ => allPassInfo) val info = cPalette.map(_ => doodadInfo)
currTileset.tileInfo.insert(priorSize, info : _*) currTileset.tileInfo.insert(priorSize, info : _*)
} }
updateTileView() updateTileView()
@ -255,12 +255,14 @@ class TilesetBuilder extends Savable {
} }
def updateTile(): Unit = { def updateTile(): Unit = {
currTileset.tileInfo(currTileIndex) = TileInfo( val northFlag = if (doesPassNorth.selected()) TileInfo.PassNorth else TileInfo.NoPass
doesPassNorth.selected(), val eastFlag = if (doesPassEast.selected()) TileInfo.PassEast else TileInfo.NoPass
doesPassEast.selected(), val southFlag = if (doesPassSouth.selected()) TileInfo.PassSouth else TileInfo.NoPass
doesPassSouth.selected(), val westFlag = if (doesPassWest.selected()) TileInfo.PassWest else TileInfo.NoPass
doesPassWest.selected(), val counterFlag = if (isCounter.selected()) TileInfo.IsCounter else TileInfo.NoPass
isCounter.selected()) 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 = { def saveTo(file: File): Unit = {
@ -289,7 +291,9 @@ class TilesetBuilder extends Savable {
tilesetList.refresh() 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 { object TilesetBuilder {

View File

@ -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(index: Int) = tileset.infoOf(tiles(index))
def tileInfo(pos: Position) = tileset.infoOf(this(pos)) 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 = { def saveTo(file: File): Unit = {
val ostream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file))) 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() 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 index2x(i: Int) = i % width
def index2y(i: Int) = i / width def index2y(i: Int) = i / width

View File

@ -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 val infoOf = (groundTiles.zipWithIndex.map{case (t, i) => (t, groundInfo(i))} ++ doodadTiles.zipWithIndex.map{case (t, i) => (t, doodadInfo(i))}).toMap
} }
case class TileInfo( case class TileInfo(val flags: Int = TileInfo.PassAll) {
val doesPassNorth: Boolean, def doesPassNorth = (flags & TileInfo.PassNorth) != 0
val doesPassEast: Boolean, def doesPassEast = (flags & TileInfo.PassEast) != 0
val doesPassSouth: Boolean, def doesPassSouth = (flags & TileInfo.PassSouth) != 0
val doesPassWest: Boolean, def doesPassWest = (flags & TileInfo.PassWest) != 0
val isCounter: Boolean) {
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( case class TilesetToken(

View File

@ -124,7 +124,7 @@ class GameView {
if (hero.pose != dir.toString()) { if (hero.pose != dir.toString()) {
hero.pose = dir.toString() hero.pose = dir.toString()
} else { } 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) || val canPass = (dir.x < 0 && info.doesPassEast) || (dir.x > 0 && info.doesPassWest) ||
(dir.y < 0 && info.doesPassSouth) || (dir.y > 0 && info.doesPassNorth) (dir.y < 0 && info.doesPassSouth) || (dir.y > 0 && info.doesPassNorth)
if (canPass) { if (canPass) {