diff --git a/Builder/src/fmon/builder/TilesetBuilder.scala b/Builder/src/fmon/builder/TilesetBuilder.scala index f0bb6ac..015db25 100644 --- a/Builder/src/fmon/builder/TilesetBuilder.scala +++ b/Builder/src/fmon/builder/TilesetBuilder.scala @@ -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 { diff --git a/FakeMon/src/fmon/world/GameMap.scala b/FakeMon/src/fmon/world/GameMap.scala index 79c0fa7..7bed438 100644 --- a/FakeMon/src/fmon/world/GameMap.scala +++ b/FakeMon/src/fmon/world/GameMap.scala @@ -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 diff --git a/FakeMon/src/fmon/world/Tileset.scala b/FakeMon/src/fmon/world/Tileset.scala index d6c47af..5c3bc30 100644 --- a/FakeMon/src/fmon/world/Tileset.scala +++ b/FakeMon/src/fmon/world/Tileset.scala @@ -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( diff --git a/FakeMon/src/fmon/world/ui/GameView.scala b/FakeMon/src/fmon/world/ui/GameView.scala index c07f554..3471e8b 100644 --- a/FakeMon/src/fmon/world/ui/GameView.scala +++ b/FakeMon/src/fmon/world/ui/GameView.scala @@ -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) {