[Editor] Make MapInitializer inherits from MapHandler
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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 ->
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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() }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user