make mutablefunge abstract, add notify method
This commit is contained in:
@@ -1,33 +1,28 @@
|
|||||||
package befide.befunge.b93.state
|
package befide.befunge.b93.state
|
||||||
|
|
||||||
import befide.befunge.core.events.FungeChange
|
|
||||||
import befide.befunge.core.state.MutableFunge
|
import befide.befunge.core.state.MutableFunge
|
||||||
import befide.befunge.core.util.Event
|
|
||||||
|
|
||||||
class Funge93
|
class Funge93
|
||||||
: MutableFunge<Vec2, LongData> {
|
: MutableFunge<Vec2, Data93>() {
|
||||||
override val size = Vec2(80, 25)
|
companion object {
|
||||||
|
val DEFAULT_DATA = Data93.SPACE
|
||||||
|
const val DEFAULT_CHAR = '\u2022' // bullet
|
||||||
|
}
|
||||||
|
|
||||||
override val onChange = Event<FungeChange<Vec2, LongData>>()
|
override val size = Vec2(80, 25)
|
||||||
|
|
||||||
override fun next(pos: Vec2, delta: Vec2): Vec2 = (pos + delta) mod size
|
override fun next(pos: Vec2, delta: Vec2): Vec2 = (pos + delta) mod size
|
||||||
|
|
||||||
override fun defaultData(): LongData = LongData.SPACE
|
val contents = hashMapOf<Vec2, Data93>()
|
||||||
override fun defaultChar(): Char = '\u2022' // bullet
|
|
||||||
|
|
||||||
val contents = hashMapOf<Vec2, LongData>()
|
override fun get(pos: Vec2): Data93 = contents[pos] ?: DEFAULT_DATA
|
||||||
|
override fun set(pos: Vec2, data: Data93) {
|
||||||
override fun get(pos: Vec2): LongData = contents[pos] ?: defaultData()
|
if (pos in Vec2.ZERO until size) notify(pos) {
|
||||||
override fun set(pos: Vec2, data: LongData) {
|
contents[pos] = data
|
||||||
if (pos.x !in 0 until size.x || pos.y !in 0 until size.y)
|
}
|
||||||
return
|
|
||||||
|
|
||||||
val from = this[pos]
|
|
||||||
contents[pos] = data
|
|
||||||
onChange(FungeChange(this, pos, from, data))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override var data: Map<Vec2, LongData>
|
override var data: Map<Vec2, Data93>
|
||||||
get() {
|
get() {
|
||||||
return contents.toMap()
|
return contents.toMap()
|
||||||
}
|
}
|
||||||
@@ -40,13 +35,13 @@ class Funge93
|
|||||||
override var src: String
|
override var src: String
|
||||||
get() {
|
get() {
|
||||||
val lines = mutableListOf<String>()
|
val lines = mutableListOf<String>()
|
||||||
for ((y, row) in contents.entries.groupBy { it.key.y }.toSortedMap()) {
|
for ((y, row) in data.entries.groupBy { it.key.y }.toSortedMap()) {
|
||||||
lines += List(y - lines.size) { "" }
|
lines += List(y - lines.size) { "" }
|
||||||
|
|
||||||
val chars = mutableListOf<Char>()
|
val chars = mutableListOf<Char>()
|
||||||
for ((v, ch) in row.sortedBy { it.key.x }) {
|
for ((v, ch) in row.sortedBy { it.key.x }) {
|
||||||
chars += List(v.x - chars.size) { ' ' }
|
chars += List(v.x - chars.size) { ' ' }
|
||||||
chars += ch.char ?: defaultChar()
|
chars += ch.char ?: DEFAULT_CHAR
|
||||||
}
|
}
|
||||||
lines += chars.joinToString("")
|
lines += chars.joinToString("")
|
||||||
}
|
}
|
||||||
@@ -55,7 +50,7 @@ class Funge93
|
|||||||
set(src) {
|
set(src) {
|
||||||
data = src.lines().mapIndexed { y, line ->
|
data = src.lines().mapIndexed { y, line ->
|
||||||
line.mapIndexed { x, ch ->
|
line.mapIndexed { x, ch ->
|
||||||
Pair(Vec2(x, y), LongData(ch))
|
Pair(Vec2(x, y), Data93(ch))
|
||||||
}
|
}
|
||||||
}.flatten().toMap()
|
}.flatten().toMap()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user