Added a builder for elements and made the buttons and damage bursts reflect the elemental color
This commit is contained in:
1
Builder/.gitignore
vendored
Normal file
1
Builder/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/bin/
|
||||
63
Builder/src/fmon/builder/App.fxml
Normal file
63
Builder/src/fmon/builder/App.fxml
Normal file
@@ -0,0 +1,63 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.Menu?>
|
||||
<?import javafx.scene.control.MenuBar?>
|
||||
<?import javafx.scene.control.MenuItem?>
|
||||
<?import javafx.scene.control.SeparatorMenuItem?>
|
||||
<?import javafx.scene.layout.AnchorPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Font?>
|
||||
|
||||
<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmon.builder.App">
|
||||
<children>
|
||||
<MenuBar VBox.vgrow="NEVER">
|
||||
<menus>
|
||||
<Menu mnemonicParsing="false" text="File">
|
||||
<items>
|
||||
<MenuItem mnemonicParsing="false" text="New" />
|
||||
<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" onAction="#saveAs" text="Save As…" />
|
||||
<MenuItem mnemonicParsing="false" text="Revert" />
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<MenuItem mnemonicParsing="false" text="Preferences…" />
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<MenuItem mnemonicParsing="false" text="Quit" />
|
||||
</items>
|
||||
</Menu>
|
||||
<Menu mnemonicParsing="false" text="Edit">
|
||||
<items>
|
||||
<MenuItem mnemonicParsing="false" text="Undo" />
|
||||
<MenuItem mnemonicParsing="false" text="Redo" />
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<MenuItem mnemonicParsing="false" text="Cut" />
|
||||
<MenuItem mnemonicParsing="false" text="Copy" />
|
||||
<MenuItem mnemonicParsing="false" text="Paste" />
|
||||
<MenuItem mnemonicParsing="false" text="Delete" />
|
||||
<SeparatorMenuItem mnemonicParsing="false" />
|
||||
<MenuItem mnemonicParsing="false" text="Select All" />
|
||||
<MenuItem mnemonicParsing="false" text="Unselect All" />
|
||||
</items>
|
||||
</Menu>
|
||||
<Menu mnemonicParsing="false" text="Help">
|
||||
<items>
|
||||
<MenuItem mnemonicParsing="false" text="About MyHelloApp" />
|
||||
</items>
|
||||
</Menu>
|
||||
</menus>
|
||||
</MenuBar>
|
||||
<AnchorPane fx:id="pane" maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
|
||||
<children>
|
||||
<Label alignment="CENTER" layoutX="155.0" layoutY="177.0" style=" " text="Drag components from Library here…" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false">
|
||||
<font>
|
||||
<Font size="18.0" />
|
||||
</font>
|
||||
</Label>
|
||||
</children>
|
||||
</AnchorPane>
|
||||
</children>
|
||||
</VBox>
|
||||
54
Builder/src/fmon/builder/App.scala
Normal file
54
Builder/src/fmon/builder/App.scala
Normal file
@@ -0,0 +1,54 @@
|
||||
package fmon.builder
|
||||
|
||||
import java.io.File
|
||||
|
||||
import javafx.fxml.FXML
|
||||
import javafx.fxml.FXMLLoader
|
||||
import javafx.fxml.JavaFXBuilderFactory
|
||||
import javafx.scene.{control => jfxsc, layout => jfxsl}
|
||||
|
||||
import scalafx.Includes._
|
||||
import scalafx.stage.FileChooser
|
||||
import FileChooser.ExtensionFilter
|
||||
|
||||
trait Savable {
|
||||
def saveTo(file: File): Unit
|
||||
def openFrom(file: File): Unit
|
||||
}
|
||||
|
||||
class App {
|
||||
@FXML var pane: jfxsl.Pane = _
|
||||
|
||||
var builder: Savable = _
|
||||
|
||||
|
||||
def open(): Unit = {
|
||||
val fileChooser = new FileChooser {
|
||||
title = "Open Resource File"
|
||||
extensionFilters ++= Seq(
|
||||
new ExtensionFilter("YAML Files", "*.yaml"),
|
||||
new ExtensionFilter("All Files", "*.*")
|
||||
)
|
||||
}
|
||||
|
||||
val selectedFile = fileChooser.showOpenDialog(null)
|
||||
if (selectedFile != null) {
|
||||
builder openFrom selectedFile
|
||||
}
|
||||
}
|
||||
|
||||
def saveAs(): Unit = {
|
||||
val fileChooser = new FileChooser {
|
||||
title = "Open Resource File"
|
||||
extensionFilters ++= Seq(
|
||||
new ExtensionFilter("YAML Files", "*.yaml"),
|
||||
new ExtensionFilter("All Files", "*.*")
|
||||
)
|
||||
}
|
||||
|
||||
val selectedFile = fileChooser.showSaveDialog(null)
|
||||
if (selectedFile != null) {
|
||||
builder saveTo selectedFile
|
||||
}
|
||||
}
|
||||
}
|
||||
93
Builder/src/fmon/builder/ElementBuilder.fxml
Normal file
93
Builder/src/fmon/builder/ElementBuilder.fxml
Normal file
@@ -0,0 +1,93 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ColorPicker?>
|
||||
<?import javafx.scene.control.Label?>
|
||||
<?import javafx.scene.control.ListView?>
|
||||
<?import javafx.scene.control.Separator?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.ColumnConstraints?>
|
||||
<?import javafx.scene.layout.GridPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.RowConstraints?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
|
||||
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fmon.builder.ElementBuilder">
|
||||
<left>
|
||||
<VBox BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<ListView fx:id="elements" prefWidth="200.0" />
|
||||
<HBox prefHeight="0.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Button fx:id="add" mnemonicParsing="false" onAction="#addElement" text="+" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
</VBox>
|
||||
</left>
|
||||
<center>
|
||||
<VBox prefHeight="200.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<GridPane>
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<Label text="Element Name:" />
|
||||
<ColorPicker fx:id="bgColor" onAction="#updateBg" GridPane.columnIndex="1" GridPane.rowIndex="1" />
|
||||
<Label text="Background Color:" GridPane.rowIndex="1" />
|
||||
<Label text="Text Color:" GridPane.rowIndex="2" />
|
||||
<ColorPicker fx:id="textColor" onAction="#updateFont" GridPane.columnIndex="1" GridPane.rowIndex="2" />
|
||||
<Label text="Symbol:" GridPane.rowIndex="3" />
|
||||
<Label text="Example" GridPane.rowIndex="4" />
|
||||
<Button fx:id="button" mnemonicParsing="false" text="Button" GridPane.columnIndex="1" GridPane.rowIndex="4" />
|
||||
<TextField fx:id="name" onAction="#updateName" promptText="Element" GridPane.columnIndex="1" />
|
||||
</children>
|
||||
</GridPane>
|
||||
<Separator prefHeight="0.0" prefWidth="400.0" />
|
||||
<GridPane prefHeight="252.0" prefWidth="400.0">
|
||||
<columnConstraints>
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
|
||||
</columnConstraints>
|
||||
<rowConstraints>
|
||||
<RowConstraints maxHeight="155.0" minHeight="10.0" prefHeight="38.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="186.0" minHeight="10.0" prefHeight="186.0" vgrow="SOMETIMES" />
|
||||
<RowConstraints maxHeight="26.0" minHeight="0.0" prefHeight="26.0" vgrow="SOMETIMES" />
|
||||
</rowConstraints>
|
||||
<children>
|
||||
<Label text="Immune" />
|
||||
<Label text="Resist" GridPane.columnIndex="2" />
|
||||
<Label text="Normal" GridPane.columnIndex="4" />
|
||||
<Label text="Weak" GridPane.columnIndex="6" />
|
||||
<ListView fx:id="immuneView" prefHeight="200.0" prefWidth="200.0" GridPane.columnSpan="2" GridPane.rowIndex="1" />
|
||||
<ListView fx:id="resistView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.columnSpan="2" GridPane.rowIndex="1" />
|
||||
<ListView fx:id="normalView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4" GridPane.columnSpan="2" GridPane.rowIndex="1" />
|
||||
<ListView fx:id="weakView" prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="6" GridPane.columnSpan="2" GridPane.rowIndex="1" />
|
||||
<Button mnemonicParsing="false" onAction="#immune2Resist" text="->" GridPane.columnIndex="1" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#resist2Immune" text="<-" GridPane.columnIndex="2" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#resist2Normal" text="->" GridPane.columnIndex="3" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#normal2Resist" text="<-" GridPane.columnIndex="4" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#normal2Weak" text="->" GridPane.columnIndex="5" GridPane.rowIndex="2" />
|
||||
<Button mnemonicParsing="false" onAction="#weak2Normal" text="<-" GridPane.columnIndex="6" GridPane.rowIndex="2" />
|
||||
</children>
|
||||
</GridPane>
|
||||
</children>
|
||||
</VBox>
|
||||
</center>
|
||||
</BorderPane>
|
||||
227
Builder/src/fmon/builder/ElementBuilder.scala
Normal file
227
Builder/src/fmon/builder/ElementBuilder.scala
Normal file
@@ -0,0 +1,227 @@
|
||||
package fmon.builder
|
||||
|
||||
import java.io._
|
||||
|
||||
import javafx.application.Application
|
||||
import javafx.fxml.FXML
|
||||
import javafx.fxml.FXMLLoader
|
||||
import javafx.fxml.JavaFXBuilderFactory
|
||||
import javafx.scene.{control => jfxsc, Parent, Scene}
|
||||
import javafx.stage.Stage
|
||||
|
||||
import scalafx.Includes._
|
||||
import scalafx.beans.property._
|
||||
import scalafx.collections.ObservableBuffer
|
||||
import scalafx.scene.control._
|
||||
import scalafx.scene.paint.Color
|
||||
import scalafx.scene.layout._
|
||||
|
||||
import org.yaml.snakeyaml.nodes._
|
||||
import org.yaml.snakeyaml.nodes.Tag
|
||||
import org.yaml.snakeyaml.constructor._
|
||||
import org.yaml.snakeyaml.representer._
|
||||
|
||||
import fmon.stat.Element
|
||||
import fmon.util.YamlHelper
|
||||
|
||||
import TableColumn._
|
||||
|
||||
class ObsElement(name_ : String, bgColor_ : Color = Color.Gray, fontColor_ : Color = Color.Black) {
|
||||
val name = new StringProperty(this, "name", name_)
|
||||
val bgColor = new ObjectProperty[Color](this, "bgColor", bgColor_)
|
||||
val fontColor = new ObjectProperty[Color](this, "fontColor", fontColor_)
|
||||
|
||||
val immune = new ObservableBuffer[ObsElement]()
|
||||
val resist = new ObservableBuffer[ObsElement]()
|
||||
val normal = new ObservableBuffer[ObsElement]()
|
||||
val weak = new ObservableBuffer[ObsElement]()
|
||||
|
||||
def asElement = {
|
||||
def toMap(buffer: ObservableBuffer[ObsElement], mult: Double) = {
|
||||
buffer.map(e => (e.name(), mult)).toMap
|
||||
}
|
||||
val effect = toMap(immune, 0.0) ++ toMap(resist, 0.5) ++ toMap(normal, 1.0) ++ toMap(weak, 2.0)
|
||||
new Element(name(), bgColor(), fontColor(), effect)
|
||||
}
|
||||
|
||||
override def toString = name()
|
||||
}
|
||||
|
||||
class ColorRepresenter extends Representer {
|
||||
representers.put(classOf[Color], new ColorRepresent)
|
||||
|
||||
class ColorRepresent extends Represent {
|
||||
override def representData(data: AnyRef): Node = {
|
||||
val color = data.asInstanceOf[Color]
|
||||
representScalar(new Tag("!color"), color.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ColorConstructor extends Constructor {
|
||||
yamlConstructors.put(new Tag("!color"), new ConstructColor)
|
||||
|
||||
class ConstructColor extends AbstractConstruct {
|
||||
override def construct(node: Node): AnyRef = {
|
||||
val string = constructScalar(node.asInstanceOf[ScalarNode])
|
||||
return Color.valueOf(string)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ElementBuilder extends Savable {
|
||||
@FXML var elements: jfxsc.ListView[ObsElement] = _
|
||||
@FXML var add: jfxsc.Button = _
|
||||
//@FXML var matchups: jfxsc.TableView[ObsElement] = _
|
||||
var elementList = ObservableBuffer[ObsElement]()
|
||||
|
||||
@FXML var immuneView: jfxsc.ListView[ObsElement] = _
|
||||
@FXML var resistView: jfxsc.ListView[ObsElement] = _
|
||||
@FXML var normalView: jfxsc.ListView[ObsElement] = _
|
||||
@FXML var weakView: jfxsc.ListView[ObsElement] = _
|
||||
|
||||
@FXML var name: jfxsc.TextField = _
|
||||
@FXML var bgColor: jfxsc.ColorPicker = _
|
||||
@FXML var textColor: jfxsc.ColorPicker = _
|
||||
@FXML var button: jfxsc.Button = _
|
||||
|
||||
@FXML
|
||||
def initialize(): Unit = {
|
||||
elements.items = elementList
|
||||
elementList ++= Seq(new ObsElement("Fire"), new ObsElement("Water"), new ObsElement("Leaf"))
|
||||
elements.selectionModel().selectedIndex.onChange(selectionChange)
|
||||
elements.selectionModel().selectFirst()
|
||||
|
||||
elementList.foreach(e => elementList.foreach(f => e.normal += f))
|
||||
}
|
||||
|
||||
def selectionChange(): Unit = {
|
||||
val element = elementList(elements.selectionModel().selectedIndex())
|
||||
name.text = element.name()
|
||||
bgColor.value = element.bgColor()
|
||||
textColor.value = element.fontColor()
|
||||
|
||||
immuneView.items = element.immune
|
||||
resistView.items = element.resist
|
||||
normalView.items = element.normal
|
||||
weakView.items = element.weak
|
||||
updateFont()
|
||||
}
|
||||
|
||||
def updateName(): Unit = {
|
||||
button.text = name.text()
|
||||
setChanges()
|
||||
}
|
||||
|
||||
def updateBg(): Unit = {
|
||||
updateFont()
|
||||
}
|
||||
|
||||
def updateFont(): Unit = {
|
||||
val bg = bgColor.value().toString().replaceFirst("0x", "#")
|
||||
val color = textColor.value().toString().replaceFirst("0x", "#")
|
||||
button.style = s"-fx-background-color: ${bg}; -fx-text-fill: ${color}"
|
||||
setChanges()
|
||||
}
|
||||
|
||||
def setChanges(): Unit = {
|
||||
val element = elementList(elements.selectionModel().selectedIndex())
|
||||
element.name.value = name.text()
|
||||
element.bgColor.value = bgColor.value()
|
||||
element.fontColor.value = textColor.value()
|
||||
elements.refresh()
|
||||
}
|
||||
|
||||
def addElement(): Unit = {
|
||||
elementList += new ObsElement("New Element")
|
||||
println(elements.items().size())
|
||||
}
|
||||
|
||||
def immune2Resist(): Unit = {
|
||||
val items = immuneView.selectionModel().getSelectedItems
|
||||
resistView.items() ++= items
|
||||
immuneView.items() --= items
|
||||
}
|
||||
|
||||
def resist2Immune(): Unit = {
|
||||
val items = resistView.selectionModel().getSelectedItems
|
||||
immuneView.items() ++= items
|
||||
resistView.items() --= items
|
||||
}
|
||||
|
||||
def resist2Normal(): Unit = {
|
||||
val items = resistView.selectionModel().getSelectedItems
|
||||
normalView.items() ++= items
|
||||
resistView.items() --= items
|
||||
}
|
||||
|
||||
def normal2Resist(): Unit = {
|
||||
val items = normalView.selectionModel().getSelectedItems
|
||||
resistView.items() ++= items
|
||||
normalView.items() --= items
|
||||
}
|
||||
|
||||
def normal2Weak(): Unit = {
|
||||
val items = normalView.selectionModel().getSelectedItems
|
||||
weakView.items() ++= items
|
||||
normalView.items() --= items
|
||||
}
|
||||
|
||||
def weak2Normal(): Unit = {
|
||||
val items = weakView.selectionModel().getSelectedItems
|
||||
normalView.items() ++= items
|
||||
weakView.items() --= items
|
||||
}
|
||||
|
||||
override def saveTo(file: File): Unit = {
|
||||
val elementMap = elementList.map(e => (e.name(), e.asElement)).toMap
|
||||
YamlHelper.writeMap(new FileOutputStream(file), elementMap)
|
||||
}
|
||||
|
||||
override def openFrom(file: File): Unit = {
|
||||
val elementMap = YamlHelper.extractMap[Element](new FileInputStream(file))
|
||||
val es = elementMap.values.map(e => new ObsElement(e.name, e.bgColor, e.fontColor)).toSeq
|
||||
es.foreach(eo => es.foreach(fo => {
|
||||
val e = elementMap(eo.name())
|
||||
val f = elementMap(fo.name())
|
||||
val mult = e <-- f
|
||||
if (mult < 0.1) {
|
||||
eo.immune += fo
|
||||
} else if (mult < 0.75) {
|
||||
eo.resist += fo
|
||||
} else if (mult < 1.25) {
|
||||
eo.normal += fo
|
||||
} else {
|
||||
eo.weak += fo
|
||||
}
|
||||
}))
|
||||
elementList.clear()
|
||||
elementList ++= es
|
||||
elements.selectionModel().selectFirst()
|
||||
}
|
||||
}
|
||||
|
||||
object ElementBuilder {
|
||||
class EBA extends Application {
|
||||
override def start(primaryStage: Stage): Unit = {
|
||||
val frameLoader = new FXMLLoader(getClass.getResource("App.fxml"))
|
||||
val root: Parent = frameLoader.load()
|
||||
val controller = frameLoader.getController[App]()
|
||||
|
||||
val builderLoader = new FXMLLoader(getClass.getResource("ElementBuilder.fxml"))
|
||||
val builder: Parent = builderLoader.load()
|
||||
val builderController = builderLoader.getController[ElementBuilder]()
|
||||
|
||||
controller.pane.children = builder
|
||||
controller.builder = builderController
|
||||
|
||||
val scene: Scene = new Scene(root)
|
||||
primaryStage.setScene(scene)
|
||||
primaryStage.show()
|
||||
}
|
||||
}
|
||||
|
||||
def main(args: Array[String]): Unit = {
|
||||
Application.launch(classOf[EBA], args: _*)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user