diff --git a/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt b/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt index 3f7a2b8..f941fe9 100644 --- a/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt +++ b/befunge/src/main/kotlin/befide/befunge/b93/B93Funge.kt @@ -14,6 +14,14 @@ class B93Funge : Funge { private var cars = Array(height) { Array(width) { Value(' ') } } + override var values + get() = cars.map { it.toList() } + set(data) { + for (y in 0 until cars.size) + for (x in 0 until cars[y].size) + cars[y][x] = data[y][x] + } + override fun get(vec: Vec): Value { return cars[vec.y][vec.x] } diff --git a/befunge/src/main/kotlin/befide/befunge/core/Funge.kt b/befunge/src/main/kotlin/befide/befunge/core/Funge.kt index c8e3264..1cb0189 100644 --- a/befunge/src/main/kotlin/befide/befunge/core/Funge.kt +++ b/befunge/src/main/kotlin/befide/befunge/core/Funge.kt @@ -12,6 +12,8 @@ interface Funge { operator fun get(vec: Vec): Value operator fun set(vec: Vec, value: Value) + var values: List> + /** * Get the next position to be executed starting at [vec] and stepping by [delta] */ diff --git a/ide/src/main/kotlin/befide/ide/ActionView.kt b/ide/src/main/kotlin/befide/ide/ActionView.kt index 2429f10..29475a7 100644 --- a/ide/src/main/kotlin/befide/ide/ActionView.kt +++ b/ide/src/main/kotlin/befide/ide/ActionView.kt @@ -22,7 +22,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO override val root = hbox { button("step") { setOnAction { - interp.funge.setString(codeView.src) + interp.funge.values = codeView.values + interp.step() } } @@ -31,13 +32,15 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO setOnAction { interp.reset() ioView.reset() - codeView.src = interp.funge.toString() + + codeView.values = interp.funge.values } } button("run") { setOnAction { - interp.funge.setString(codeView.src) + interp.funge.values = codeView.values + runTimeline.rate = 10000.0 runTimeline.playFromStart() } @@ -45,7 +48,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO button("walk") { setOnAction { - interp.funge.setString(codeView.src) + interp.funge.values = codeView.values + runTimeline.rate = 50.0 runTimeline.playFromStart() } @@ -53,7 +57,8 @@ class ActionView(val interp: Interpreter, val codeView: CodeView, val ioView: IO button("crawl") { setOnAction { - interp.funge.setString(codeView.src) + interp.funge.values = codeView.values + runTimeline.rate = 4.0 runTimeline.playFromStart() } diff --git a/ide/src/main/kotlin/befide/ide/CodeLabel.kt b/ide/src/main/kotlin/befide/ide/CodeLabel.kt index d3d423b..dbe39e9 100644 --- a/ide/src/main/kotlin/befide/ide/CodeLabel.kt +++ b/ide/src/main/kotlin/befide/ide/CodeLabel.kt @@ -1,6 +1,7 @@ package befide.ide import befide.befunge.core.Interpreter +import befide.befunge.state.Value import befide.befunge.state.Vec import javafx.beans.property.ObjectProperty import javafx.beans.property.SimpleObjectProperty @@ -8,12 +9,14 @@ import javafx.scene.control.Label import tornadofx.* class CodeLabel(val pos: Vec, val cursorPos: ObjectProperty, val interp: Interpreter) : Label() { - val charProperty = SimpleObjectProperty('\u0000') - var char: Char by charProperty + var valueProperty = SimpleObjectProperty(Value(' ')) + var value: Value by valueProperty fun restyle() { styleClass.setAll("code") + val char = value.asChar ?: '\u2022' + if (char in "0123456789") styleClass.add("code-num") if (char in "gp") styleClass.add("code-funge") if (char in "<>^v?#") styleClass.add("code-dir") @@ -27,14 +30,14 @@ class CodeLabel(val pos: Vec, val cursorPos: ObjectProperty, val interp: In } init { - textProperty().bind(charProperty.stringBinding { it?.toString() ?: " " }) + textProperty().bind(valueProperty.stringBinding { it?.asChar?.toString() ?: "\u2022" }) setOnMouseClicked { cursorPos.value = pos } - charProperty.addListener { _, _, _ -> restyle() } + valueProperty.addListener { _, _, _ -> restyle() } - char = ' ' + restyle() } } \ No newline at end of file diff --git a/ide/src/main/kotlin/befide/ide/CodeView.kt b/ide/src/main/kotlin/befide/ide/CodeView.kt index fd97d09..02333e8 100644 --- a/ide/src/main/kotlin/befide/ide/CodeView.kt +++ b/ide/src/main/kotlin/befide/ide/CodeView.kt @@ -1,14 +1,12 @@ package befide.ide import befide.befunge.core.Interpreter +import befide.befunge.state.Value import befide.befunge.state.Vec import javafx.beans.property.ObjectProperty -import javafx.beans.property.SimpleBooleanProperty import javafx.beans.property.SimpleObjectProperty import javafx.scene.input.KeyCode import tornadofx.* -import tornadofx.getValue -import tornadofx.setValue operator fun List>.get(v: Vec): T = this[v.y][v.x] @@ -21,6 +19,14 @@ class CodeView(val interp: Interpreter) : View() { var labels: List> = List(25) { y -> List(80) { x -> CodeLabel(Vec(x, y), cursorPosProperty, interp) } } + var values: List> + get() = labels.map { it.map { it.value } } + set(data) { + for (y in 0 until labels.size) + for (x in 0 until labels[y].size) + labels[y][x].value = data[y][x] + } + init { cursorPosProperty.addListener { _, old, new -> labels[old].restyle() @@ -34,7 +40,7 @@ class CodeView(val interp: Interpreter) : View() { interp.fungeChanged += { for (change in it.changes) { - labels[change.vec].char = change.to.asChar ?: '\u2022' + labels[change.vec].value = change.to labels[change.vec].restyle() } } @@ -47,9 +53,9 @@ class CodeView(val interp: Interpreter) : View() { var src: String get() = labels.joinToString("\n") { row -> row.dropLastWhile { lbl -> - lbl.char.isWhitespace() + lbl.value.asChar?.isWhitespace() ?: false }.joinToString("") { lbl -> - lbl.char.toString() + lbl.value.asChar?.toString() ?: "\u2022" } } set(value) { @@ -57,7 +63,8 @@ class CodeView(val interp: Interpreter) : View() { for (row in labels) { for (lbl in row) { - lbl.char = lines.getOrNull(lbl.pos.y)?.getOrNull(lbl.pos.x) ?: ' ' + val char = lines.getOrNull(lbl.pos.y)?.getOrNull(lbl.pos.x) ?: ' ' + lbl.value = Value(char) } } } @@ -105,7 +112,7 @@ class CodeView(val interp: Interpreter) : View() { else -> cursorDelta } - labels[cursorPos].char = ch + labels[cursorPos].value = Value(ch) move() } @@ -113,7 +120,7 @@ class CodeView(val interp: Interpreter) : View() { ch == '\u0008' -> { // backspace move(-cursorDelta) - labels[cursorPos].char = ' ' + labels[cursorPos].value = Value(' ') } else -> {