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 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 {
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user