Now capable of saving and loading stages

This commit is contained in:
dalyjame
2019-07-06 22:12:47 -04:00
parent 8e7937b3c6
commit 07df031670
8 changed files with 220 additions and 46 deletions

View File

@@ -8,6 +8,8 @@
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
@@ -23,12 +25,12 @@
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="New" />
<MenuItem mnemonicParsing="false" text="Open…" />
<MenuItem mnemonicParsing="false" onAction="#open" text="Open…" />
<Menu mnemonicParsing="false" text="Open Recent" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Close" />
<MenuItem mnemonicParsing="false" text="Save" />
<MenuItem mnemonicParsing="false" text="Save As…" />
<MenuItem mnemonicParsing="false" onAction="#save" text="Save" />
<MenuItem mnemonicParsing="false" onAction="#saveAs" text="Save As…" />
<MenuItem mnemonicParsing="false" text="Revert" />
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" text="Preferences…" />
@@ -59,11 +61,28 @@
</MenuBar>
<SplitPane dividerPositions="0.2505567928730512, 0.7505567928730512" focusTraversable="true" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane>
<children>
<TilePane fx:id="tileSelector" hgap="2.0" prefHeight="542.0" prefWidth="222.0" vgap="2.0" />
</children>
</AnchorPane>
<TabPane>
<tabs>
<Tab closable="false" text="A">
<content>
<AnchorPane>
<children>
<TilePane fx:id="tileSelector" hgap="2.0" prefColumns="8" vgap="2.0" />
</children>
</AnchorPane>
</content>
</Tab>
<Tab closable="false" text="B">
<content>
<AnchorPane>
<children>
<TilePane fx:id="doodadSelector" hgap="2.0" prefColumns="8" vgap="2.0" />
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
<ScrollPane prefHeight="-1.0" prefWidth="-1.0">
<content>
<AnchorPane id="Content" minHeight="-1.0" minWidth="-1.0" prefHeight="545.0" prefWidth="430.0">

View File

@@ -1,6 +1,9 @@
package fmon.builder
import java.io._
import java.util.prefs.Preferences
import scala.util.Properties
import javafx.application.Application
import javafx.fxml.FXML
@@ -17,9 +20,14 @@ import scalafx.scene.image.ImageView
import scalafx.scene.input.MouseEvent
import scalafx.scene.paint.Color
import scalafx.scene.layout._
import scalafx.stage.FileChooser
import FileChooser.ExtensionFilter
import fmon._
import fmon.draw.Palette
import fmon.draw.tile._
import fmon.util.Direction
import fmon.world._
import Direction._
@@ -27,24 +35,41 @@ import scala.math.{min, max}
class MapBuilder {
@FXML var tileSelector: jfxsl.TilePane = _
@FXML var doodadSelector: jfxsl.TilePane = _
@FXML var gameMap: jfxsl.TilePane = _
var tileSeq: IndexedSeq[AutoFloorTile] = _
var imgSeq: IndexedSeq[ImageView] = _
var currTile: AutoFloorTile = _
var tileset: Tileset = _
var currTile: AutoTile = _
val numRows = 10
val numCols = 10
var level: GameMap = _
var lastFile: File = _
def lastDir(): String = {
val prefs = Preferences.userNodeForPackage(classOf[MapBuilder])
prefs.get("dir", Properties.userDir)
}
def rememberDir(file: File): Unit = {
val dir = if (file.isDirectory()) file.getPath else file.getParent
if (dir != lastDir) {
val prefs = Preferences.userNodeForPackage(classOf[MapBuilder])
prefs.put("dir", dir)
}
}
@FXML
def initialize(): Unit = {
val file = new File(raw"C:\Users\dalyj\Documents\Design\Images\AutoTiles\tilea2.png")
val palette = new AutoTilePalette(file, 32)
val tiles = for (y <- 0 until 4; x <- 0 until 8) yield {
palette(x, y)
}
val icons = tiles.zipWithIndex.map{case(t, i) => {
tileset = new Tileset(new TilesetToken(raw"C:\Users\dalyj\Documents\Design\Images\AutoTiles\tilea2.png"))
level = new GameMap(10, 10, tileset)
setup()
}
def setup(): Unit = {
val icons = tileset.groundTiles.map(t => {
val view = new ImageView(t.icon.croppedImage())
view.handleEvent(MouseEvent.Any) {
e: MouseEvent => if (e.eventType == MouseEvent.MouseClicked) {
@@ -52,33 +77,45 @@ class MapBuilder {
}
}
view.delegate
}}
})
tileSelector.children.clear()
tileSelector.children ++= icons
currTile = tiles.head
currTile = tileset.groundTiles.head
tileSeq = for (y <- 0 until numRows; x <- 0 until numCols) yield currTile
imgSeq = for (y <- 0 until numRows; x <- 0 until numCols) yield {
val doodadFile = new File(raw"C:\Users\dalyj\Documents\Design\Images\Icons\equipment-icons-tileset.png")
val doodadPalette = Palette.bySize(doodadFile, Config.tileSize, Config.tileSize)
val doodads = doodadPalette.images.map(d => {
val view = new ImageView(d.croppedImage())
view.delegate
})
doodadSelector.children.clear()
doodadSelector.children ++= doodads
imgSeq = for (y <- 0 until level.height; x <- 0 until level.width) yield {
val view = new ImageView(currTile.icon.croppedImage()) // TODO Tile with adjacent
view.handleEvent(MouseEvent.Any) {
e: MouseEvent => if (e.eventType == MouseEvent.MouseClicked) {
val index = point2index(x, y)
tileSeq = tileSeq.updated(index, currTile)
level.tiles = level.tiles.updated(index, currTile)
autotile(x, y)
}
}
view
}
gameMap.prefColumns = numCols
gameMap.prefRows = numRows
gameMap.children.clear()
gameMap.prefColumns = level.width
gameMap.prefRows = level.height
gameMap.children ++= imgSeq.map(_.delegate)
for (y <- 0 until numRows; x <- 0 until numCols) {
for (y <- 0 until level.height; x <- 0 until level.width) {
smoothTile(x, y)
}
}
def autotile(x: Int, y: Int) = {
for (yy <- max(y - 1, 0) to min(y + 1, numCols - 1); xx <- max(x - 1, 0) to min(x + 1, numRows - 1)) {
for (yy <- max(y - 1, 0) to min(y + 1, level.height - 1);
xx <- max(x - 1, 0) to min(x + 1, level.width - 1)) {
smoothTile(xx, yy)
}
}
@@ -88,28 +125,74 @@ class MapBuilder {
val dirs = scala.collection.mutable.Set[Direction.Value]()
val onLeft = x == 0
val onRight = x + 1 == numCols
val onRight = x + 1 == level.width
val onTop = y == 0
val onBottom = y + 1 == numRows
val onBottom = y + 1 == level.height
if (onLeft || tileSeq(left(i)) == tileSeq(i)) dirs += West
if (onRight || tileSeq(right(i)) == tileSeq(i)) dirs += East
if (onTop || tileSeq(up(i)) == tileSeq(i)) dirs += North
if (onBottom || tileSeq(down(i)) == tileSeq(i)) dirs += South
if (onLeft || onTop || tileSeq(left(up(i))) == tileSeq(i)) dirs += Northwest
if (onLeft || onBottom || tileSeq(down(left(i))) == tileSeq(i)) dirs += Southwest
if (onTop || onRight || tileSeq(right(up(i))) == tileSeq(i)) dirs += Northeast
if (onBottom || onRight || tileSeq(right(down(i))) == tileSeq(i)) dirs += Southeast
if (onLeft || level.tiles(left(i)) == level.tiles(i)) dirs += West
if (onRight || level.tiles(right(i)) == level.tiles(i)) dirs += East
if (onTop || level.tiles(up(i)) == level.tiles(i)) dirs += North
if (onBottom || level.tiles(down(i)) == level.tiles(i)) dirs += South
if (onLeft || onTop || level.tiles(left(up(i))) == level.tiles(i)) dirs += Northwest
if (onLeft || onBottom || level.tiles(down(left(i))) == level.tiles(i)) dirs += Southwest
if (onTop || onRight || level.tiles(right(up(i))) == level.tiles(i)) dirs += Northeast
if (onBottom || onRight || level.tiles(right(down(i))) == level.tiles(i)) dirs += Southeast
val index = point2index(x, y)
imgSeq(index).image = tileSeq(index).build(dirs.toSet).croppedImage()
imgSeq(index).image = level.tiles(index).build(dirs.toSet).croppedImage()
}
def point2index(x: Int, y: Int) = y * numCols + x
def save() = {
if (lastFile != null) {
level saveTo lastFile
} else {
saveAs()
}
}
def saveAs() = {
val fileChooser = new FileChooser {
title = "Open Resource File"
initialDirectory = new File(lastDir())
extensionFilters ++= Seq(
new ExtensionFilter("MAP Files", "*.map"),
new ExtensionFilter("All Files", "*.*")
)
}
val selectedFile = fileChooser.showSaveDialog(null)
if (selectedFile != null) {
rememberDir(selectedFile)
level saveTo selectedFile
lastFile = selectedFile
}
}
def open() = {
val fileChooser = new FileChooser {
title = "Open Resource File"
initialDirectory = new File(lastDir())
extensionFilters ++= Seq(
new ExtensionFilter("MAP Files", "*.map"),
new ExtensionFilter("All Files", "*.*")
)
}
val selectedFile = fileChooser.showOpenDialog(null)
if (selectedFile != null) {
rememberDir(selectedFile)
level = GameMap loadFrom selectedFile
tileset = level.tileset
setup()
lastFile = selectedFile
}
}
def point2index(x: Int, y: Int) = level.pt2index(x, y)
def left(i: Int) = i - 1
def right(i: Int) = i + 1
def up(i: Int) = i - numCols
def down(i: Int) = i + numCols
def up(i: Int) = i - level.width
def down(i: Int) = i + level.width
}
object MapBuilder {