[Editor] Make MapInitializer inherits from MapHandler

This commit is contained in:
2023-11-02 15:58:07 +01:00
parent 2ebc5e22e3
commit 4bc8999adf
8 changed files with 42 additions and 67 deletions

View File

@@ -1,12 +1,9 @@
package com.bartlomiejpluta.base.editor.code.build.generator
import com.bartlomiejpluta.base.api.context.Context
import com.bartlomiejpluta.base.api.map.handler.MapHandler
import com.bartlomiejpluta.base.editor.map.asset.GameMapAsset
import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer
import com.bartlomiejpluta.base.editor.map.model.map.GameMap
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import com.bartlomiejpluta.base.editor.project.model.Project
import com.bartlomiejpluta.base.internal.map.MapInitializer
import com.squareup.javapoet.*
import org.springframework.beans.factory.annotation.Autowired
@@ -30,32 +27,15 @@ class MapObjectsCodeGenerator : CodeGenerator {
projectContext.project?.let { project ->
project.maps
.map { it to projectContext.loadMap(it.uid) }
.forEach { generateMapObjects(it.first, it.second, project) }
.forEach { generateMapInitializer(project.buildGeneratedCodeDirectory, it.first, it.second) }
}
}
private fun generateMapObjects(asset: GameMapAsset, map: GameMap, project: Project) {
val runner = className(project.runner)
map.layers.forEachIndexed { index, layer ->
if (layer is ObjectLayer) {
generateLayerClass(project.buildGeneratedCodeDirectory, asset, map, layer, index, runner)
}
}
}
private fun generateLayerClass(
directory: File,
asset: GameMapAsset,
map: GameMap,
layer: ObjectLayer,
layerIndex: Int,
runner: ClassName
) {
private fun generateMapInitializer(directory: File, asset: GameMapAsset, map: GameMap) {
val packageName = "com.bartlomiejpluta.base.generated.map"
val className = ClassName.get(
packageName,
format("MapInitializer_%s\$\$Layer%d", map.uid.replace("-", "_"), map.layers.indexOf(layer))
format("MapInitializer_%s", map.uid.replace("-", "_"))
)
val annotation = AnnotationSpec.builder(Generated::class.java)
@@ -64,44 +44,43 @@ class MapObjectsCodeGenerator : CodeGenerator {
.addMember("comments", "\$S", "Initializer for map '${asset.name}' (UID: ${asset.uid})")
.build()
val handler = className(map.handler)
val generatedClass = TypeSpec.classBuilder(className)
.addSuperinterface(MapInitializer::class.java)
.superclass(className(map.handler))
.addModifiers(Modifier.FINAL, Modifier.PUBLIC)
.addAnnotation(annotation)
layer.objects.forEach {
MethodSpec.methodBuilder("_${it.x}x${it.y}")
.addModifiers(Modifier.PRIVATE, Modifier.FINAL)
.addParameter(Context::class.java, "context", Modifier.FINAL)
.addParameter(runner, "runner", Modifier.FINAL)
.addParameter(handler, "handler", Modifier.FINAL)
.addParameter(EngineGameMap::class.java, "map", Modifier.FINAL)
.addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL)
.addParameter(TypeName.INT, "x", Modifier.FINAL)
.addParameter(TypeName.INT, "y", Modifier.FINAL)
.addParameter(MAP_PIN_TYPE, "here", Modifier.FINAL)
.addCode(it.code.replace("\$", "\$\$"))
.build()
.let(generatedClass::addMethod)
map.layers.forEachIndexed { index, layer ->
if (layer is ObjectLayer) {
layer.objects.forEach {
MethodSpec.methodBuilder("_layer${index}_${it.x}x${it.y}")
.addModifiers(Modifier.PRIVATE, Modifier.FINAL)
.addParameter(EngineGameMap::class.java, "map", Modifier.FINAL)
.addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL)
.addParameter(TypeName.INT, "x", Modifier.FINAL)
.addParameter(TypeName.INT, "y", Modifier.FINAL)
.addParameter(MAP_PIN_TYPE, "here", Modifier.FINAL)
.addCode(it.code.replace("\$", "\$\$"))
.build()
.let(generatedClass::addMethod)
}
}
}
val runMethod = MethodSpec.methodBuilder("run")
val initializeMethod = MethodSpec.methodBuilder("initialize")
.addAnnotation(Override::class.java)
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addParameter(Context::class.java, "context", Modifier.FINAL)
.addParameter(MapHandler::class.java, "handler", Modifier.FINAL)
.addParameter(EngineGameMap::class.java, "map", Modifier.FINAL)
.addParameter(EngineObjectLayer::class.java, "layer", Modifier.FINAL)
.addStatement("var customRunner = (\$T) context.getGameRunner()", runner)
.addStatement("var customHandler = (\$T) handler", handler)
layer.objects.forEach {
runMethod.addStatement("_${it.x}x${it.y}(context, customRunner, customHandler, map, layer, ${it.x}, ${it.y}, \$T.builder().map(\"${map.uid}\").layer($layerIndex).x(${it.x}).y(${it.y}).build())", MAP_PIN_TYPE)
map.layers.forEachIndexed { index, layer ->
if (layer is ObjectLayer) {
layer.objects.forEach {
initializeMethod.addStatement("_layer${index}_${it.x}x${it.y}(map, map.getObjectLayer(${index}), ${it.x}, ${it.y}, \$T.builder().map(\"${map.uid}\").layer($index).x(${it.x}).y(${it.y}).build())", MAP_PIN_TYPE)
}
}
}
generatedClass
.addMethod(runMethod.build())
.addMethod(initializeMethod.build())
val javaFile = JavaFile
.builder(packageName, generatedClass.build())
@@ -117,7 +96,7 @@ class MapObjectsCodeGenerator : CodeGenerator {
if (s.startsWith("package ")) {
println()
println("// User imports")
for (i in layer.javaImports.lines()) {
for (i in map.javaImports.lines()) {
println(i)
}
println("// End of user imports")

View File

@@ -7,14 +7,12 @@ import javafx.beans.property.SimpleStringProperty
import tornadofx.asObservable
import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class ObjectLayer(
name: String,
rows: Int,
columns: Int,
objects: List<MapObject> = mutableListOf(),
javaImports: String = "",
passageMap: Array<Array<PassageAbility>> = Array(rows) { Array(columns) { PassageAbility.ALLOW } },
labels: List<MapLabel> = mutableListOf()
) : Layer {
@@ -27,9 +25,6 @@ class ObjectLayer(
override val nameProperty = SimpleStringProperty(name)
val javaImportsProperty = javaImports.toProperty()
var javaImports by javaImportsProperty
override fun resize(rows: Int, columns: Int) {
passageMap = Array(rows) { row ->
Array(columns) { column ->

View File

@@ -1,13 +1,13 @@
package com.bartlomiejpluta.base.editor.map.model.map
import com.bartlomiejpluta.base.editor.map.model.layer.Layer
import com.bartlomiejpluta.base.editor.tileset.model.TileSet
import javafx.beans.property.SimpleDoubleProperty
import javafx.beans.property.SimpleIntegerProperty
import javafx.beans.property.SimpleStringProperty
import javafx.collections.FXCollections
import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class GameMap(val tileWidth: Double, val tileHeight: Double) {
@@ -33,6 +33,9 @@ class GameMap(val tileWidth: Double, val tileHeight: Double) {
val handlerProperty = SimpleStringProperty()
var handler by handlerProperty
val javaImportsProperty = "".toProperty()
var javaImports by javaImportsProperty
init {
rowsProperty.addListener { _, _, newValue ->
val newRows = newValue.toInt()

View File

@@ -1,7 +1,5 @@
package com.bartlomiejpluta.base.editor.map.parameter.layer
import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.common.parameter.model.CodeSnippetParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.Parameter
import com.bartlomiejpluta.base.editor.map.model.layer.ObjectLayer
import com.bartlomiejpluta.base.editor.project.model.Project
@@ -11,13 +9,6 @@ import org.springframework.stereotype.Component
@Component
class ObjectLayerParametersBinder : LayerParametersBinder<ObjectLayer> {
override fun bind(layer: ObjectLayer, parameters: ObservableList<Parameter<*>>, project: Project, onCommit: () -> Unit) {
val imports = CodeSnippetParameter("javaImports", layer.javaImports, CodeType.JAVA, "Provide Java imports") { _, _, submit ->
onCommit()
submit()
}
imports.bindBidirectional(layer.javaImportsProperty)
parameters.addAll(imports)
}
}

View File

@@ -37,6 +37,7 @@ class ProtobufMapDeserializer : MapDeserializer {
map.rows = proto.rows
map.columns = proto.columns
map.handler = proto.handler
map.javaImports = proto.javaImports
proto.layersList
.filter { it.hasTileLayer() || it.hasAutoTileLayer() || it.hasObjectLayer() || it.hasColorLayer() }
@@ -126,7 +127,7 @@ class ProtobufMapDeserializer : MapDeserializer {
MapLabel(it.x, it.y, it.label)
}
return ObjectLayer(proto.name, rows, columns, objects, proto.objectLayer.javaImports, passageMap, labels)
return ObjectLayer(proto.name, rows, columns, objects, passageMap, labels)
}
private fun deserializeColorLayer(proto: GameMapProto.Layer): Layer {

View File

@@ -19,6 +19,7 @@ class ProtobufMapSerializer : MapSerializer {
protoMap.tileWidth = item.tileWidth.toInt()
protoMap.tileHeight = item.tileHeight.toInt()
protoMap.handler = item.handler
protoMap.javaImports = item.javaImports
item.layers.forEach { layer -> protoMap.addLayers(serializeLayer(layer)) }
@@ -69,7 +70,6 @@ class ProtobufMapSerializer : MapSerializer {
})
}
}
.setJavaImports(layer.javaImports)
.build()
.let { GameMapProto.Layer.newBuilder().setName(layer.name).setObjectLayer(it).build() }

View File

@@ -1,5 +1,7 @@
package com.bartlomiejpluta.base.editor.map.view.editor
import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.common.parameter.model.CodeSnippetParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.IntegerParameter
import com.bartlomiejpluta.base.editor.common.parameter.model.JavaClassParameter
import com.bartlomiejpluta.base.editor.common.parameter.view.ParametersTableFragment
@@ -13,7 +15,8 @@ class MapParameters : View() {
private val parameters = observableListOf(
IntegerParameter("rows", mapVM.rows, 1, 100).apply { bindBidirectional(mapVM.item.rowsProperty) },
IntegerParameter("columns", mapVM.columns, 1, 100).apply { bindBidirectional(mapVM.item.columnsProperty) },
JavaClassParameter("handler", mapVM.handler).apply { bindBidirectional(mapVM.item.handlerProperty) }
JavaClassParameter("handler", mapVM.handler).apply { bindBidirectional(mapVM.item.handlerProperty) },
CodeSnippetParameter("javaImports", mapVM.javaImports, CodeType.JAVA).apply { bindBidirectional(mapVM.item.javaImportsProperty) }
)
override val root = find<ParametersTableFragment>(ParametersTableFragment::parameters to parameters).root

View File

@@ -33,6 +33,9 @@ class GameMapVM(map: GameMap) : ItemViewModel<GameMap>(map) {
val handlerProperty = bind(GameMap::handlerProperty)
var handler by handlerProperty
val javaImportsProperty = bind(GameMap::javaImportsProperty)
val javaImports by javaImportsProperty
}