From 14dd99f79ac2c03c5fa64ddc2f0a761bbc1d9f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Thu, 16 Nov 2023 10:56:51 +0100 Subject: [PATCH] [Editor] Make MapInitializer generator implementations accepts additional arguments --- .../build/generator/MapObjectsCodeGenerator.kt | 16 +++++++++++++--- .../editor/map/canvas/ObjectPaintingTrace.kt | 5 +++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt index 194fcb62..a3a6c1bd 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/build/generator/MapObjectsCodeGenerator.kt @@ -1,9 +1,12 @@ package com.bartlomiejpluta.base.editor.code.build.generator +import com.bartlomiejpluta.base.api.context.Context +import com.bartlomiejpluta.base.api.context.ContextHolder 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 @@ -27,11 +30,11 @@ class MapObjectsCodeGenerator : CodeGenerator { projectContext.project?.let { project -> project.maps .map { it to projectContext.loadMap(it.uid) } - .forEach { generateMapInitializer(project.buildGeneratedCodeDirectory, it.first, it.second) } + .forEach { generateMapInitializer(project, project.buildGeneratedCodeDirectory, it.first, it.second) } } } - private fun generateMapInitializer(directory: File, asset: GameMapAsset, map: GameMap) { + private fun generateMapInitializer(project: Project, directory: File, asset: GameMapAsset, map: GameMap) { val packageName = "com.bartlomiejpluta.base.generated.map" val className = ClassName.get( packageName, @@ -50,6 +53,8 @@ class MapObjectsCodeGenerator : CodeGenerator { .addModifiers(Modifier.FINAL, Modifier.PUBLIC) .addAnnotation(annotation) + val runnerType = className(project.runner) + map.layers.forEachIndexed { index, layer -> if (layer is ObjectLayer) { layer.objects.forEach { @@ -60,6 +65,8 @@ class MapObjectsCodeGenerator : CodeGenerator { .addParameter(TypeName.INT, "x", Modifier.FINAL) .addParameter(TypeName.INT, "y", Modifier.FINAL) .addParameter(MAP_PIN_TYPE, "here", Modifier.FINAL) + .addParameter(runnerType, "runner", Modifier.FINAL) + .addParameter(Context::class.java, "context", Modifier.FINAL) .addCode(it.code.replace("\$", "\$\$")) .build() .let(generatedClass::addMethod) @@ -69,12 +76,15 @@ class MapObjectsCodeGenerator : CodeGenerator { val initializeMethod = MethodSpec.methodBuilder("initialize") .addAnnotation(Override::class.java) + .addParameter(Context::class.java, "context", Modifier.FINAL) .addModifiers(Modifier.PUBLIC, Modifier.FINAL) + initializeMethod.addStatement("var runner = (\$T) context.getGameRunner()", runnerType) + 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) + 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(), runner, context)", MAP_PIN_TYPE) } } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt index 2fe553b8..3a715eda 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/canvas/ObjectPaintingTrace.kt @@ -84,13 +84,14 @@ class ObjectPaintingTrace( get() = """ /* * Following final parameters are available to use: + * this: ? extends ${className(map.handler)} - an object of ${className(map.handler)}'s generated subclass + * so has an access to all members except the private ones * here: MapPin - the composite object containing current map UID, * layer's index and x,y coordinates of the current tile * x: int - the x coordinate of the current tile * y: int - the y coordinate of the current tile * layer: ObjectLayer - current object layer - * map: GameMap - current map - * handler: ${className(map.handler)} - current map handler + * map: GameMap - current map * runner: ${className(projectContext.project?.runner)} - the game runner of the project * context: Context - the game context */