2021-10-10 20:20:01 +02:00
|
|
|
import com.github.gradle.node.npm.task.NpmTask
|
2021-11-27 17:57:50 +01:00
|
|
|
import dev.adamko.factoriowebmap.configurations.asConsumer
|
|
|
|
|
import dev.adamko.factoriowebmap.configurations.typescriptAttributes
|
2021-11-28 18:11:39 +01:00
|
|
|
import groovy.json.JsonOutput
|
|
|
|
|
import kotlinx.serialization.encodeToString
|
|
|
|
|
import kotlinx.serialization.json.Json
|
|
|
|
|
import kotlinx.serialization.json.JsonObject
|
|
|
|
|
import kotlinx.serialization.json.JsonPrimitive
|
|
|
|
|
import kotlinx.serialization.json.jsonObject
|
|
|
|
|
import kotlinx.serialization.json.jsonPrimitive
|
2021-10-25 23:34:38 +02:00
|
|
|
import org.apache.tools.ant.filters.ReplaceTokens
|
2021-11-28 18:11:39 +01:00
|
|
|
import org.gradle.kotlin.dsl.support.useToRun
|
2021-11-03 12:08:07 +01:00
|
|
|
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
|
2021-11-28 18:11:39 +01:00
|
|
|
import org.jetbrains.kotlin.util.suffixIfNot
|
2021-10-09 15:40:45 +02:00
|
|
|
|
|
|
|
|
plugins {
|
2021-11-10 17:34:01 +01:00
|
|
|
idea
|
2021-10-13 21:29:21 +02:00
|
|
|
id("dev.adamko.factoriowebmap.archetype.node")
|
2021-10-09 15:40:45 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
val projectId: String by project.extra
|
2021-10-25 23:34:38 +02:00
|
|
|
val tokens: Map<String, String> by project.extra
|
2021-10-09 15:40:45 +02:00
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val tsSrcDir: Directory = layout.projectDirectory.dir("src/main/typescript")
|
|
|
|
|
val modBuildDir: Directory = layout.buildDirectory.dir(projectId).get()
|
2021-10-10 20:20:01 +02:00
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
node {
|
|
|
|
|
nodeProjectDir.set(tsSrcDir)
|
2021-10-09 15:40:45 +02:00
|
|
|
}
|
2021-10-10 20:20:01 +02:00
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
val tstlTask = tasks.register<NpmTask>("typescriptToLua") {
|
2021-10-17 17:56:19 +02:00
|
|
|
description = "Convert Typescript To Lua"
|
2021-10-10 20:20:01 +02:00
|
|
|
group = projectId
|
|
|
|
|
|
2021-10-09 15:40:45 +02:00
|
|
|
dependsOn(tasks.npmInstall)
|
|
|
|
|
|
2021-10-10 20:20:01 +02:00
|
|
|
execOverrides { standardOutput = System.out }
|
|
|
|
|
|
2021-10-17 17:56:19 +02:00
|
|
|
npmCommand.set(listOf("run", "build"))
|
2021-10-10 20:20:01 +02:00
|
|
|
|
2021-11-03 17:07:59 +01:00
|
|
|
inputs.dir(project.node.nodeProjectDir)
|
2021-10-23 22:46:17 +02:00
|
|
|
.skipWhenEmpty()
|
|
|
|
|
.withPropertyName("sourceFiles")
|
|
|
|
|
.withPathSensitivity(PathSensitivity.RELATIVE)
|
2021-10-13 21:29:21 +02:00
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val intermediateOutputDir = temporaryDir
|
|
|
|
|
args.set(parseSpaceSeparatedArgs("-- --outDir $intermediateOutputDir"))
|
2021-11-10 17:34:01 +01:00
|
|
|
val outputDir: Directory = modBuildDir.dir("typescriptToLua")
|
2021-10-17 17:56:19 +02:00
|
|
|
outputs.dir(outputDir)
|
2021-10-23 22:46:17 +02:00
|
|
|
.withPropertyName("outputDir")
|
2021-10-17 17:56:19 +02:00
|
|
|
|
2021-10-09 15:40:45 +02:00
|
|
|
ignoreExitValue.set(false)
|
2021-10-17 19:47:39 +02:00
|
|
|
|
|
|
|
|
doFirst("clean") {
|
2021-10-23 22:46:17 +02:00
|
|
|
delete(intermediateOutputDir)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
doLast("syncTstlOutput") {
|
|
|
|
|
sync {
|
|
|
|
|
from(intermediateOutputDir)
|
|
|
|
|
into(outputDir)
|
|
|
|
|
}
|
2021-10-17 19:47:39 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-09 15:40:45 +02:00
|
|
|
}
|
|
|
|
|
|
2021-11-28 18:11:39 +01:00
|
|
|
val updatePackageJsonVersion by tasks.registering {
|
|
|
|
|
group = project.name
|
|
|
|
|
description = """
|
|
|
|
|
Read the package.json file and set the version to be the project's version.
|
|
|
|
|
""".trimIndent()
|
|
|
|
|
|
|
|
|
|
val projectVersion = "${project.version}"
|
|
|
|
|
inputs.properties(
|
|
|
|
|
"projectVersion" to projectVersion,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val packageJsonFile = layout.projectDirectory.file("src/main/typescript/package.json")
|
|
|
|
|
outputs.file(packageJsonFile)
|
|
|
|
|
|
|
|
|
|
val jsonFormatter = Json {
|
|
|
|
|
prettyPrint = true
|
|
|
|
|
prettyPrintIndent = " "
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onlyIf {
|
|
|
|
|
val packageJsonContent = packageJsonFile.asFile.readText()
|
|
|
|
|
val packageJson = jsonFormatter.parseToJsonElement(packageJsonContent).jsonObject
|
|
|
|
|
packageJson["version"]?.jsonPrimitive?.content != projectVersion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
doFirst {
|
|
|
|
|
delete(temporaryDir)
|
|
|
|
|
mkdir(temporaryDir)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
|
val packageJsonContent = packageJsonFile.asFile.readText()
|
|
|
|
|
val packageJson = jsonFormatter.parseToJsonElement(packageJsonContent).jsonObject
|
|
|
|
|
val packageJsonUpdate = JsonObject(
|
|
|
|
|
packageJson + ("version" to JsonPrimitive(projectVersion))
|
|
|
|
|
)
|
|
|
|
|
val packageJsonContentUpdated =
|
|
|
|
|
jsonFormatter
|
|
|
|
|
.encodeToString(packageJsonUpdate)
|
|
|
|
|
.suffixIfNot("\n")
|
|
|
|
|
packageJsonFile.asFile.writer().useToRun {
|
|
|
|
|
write(packageJsonContentUpdated)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tasks.assemble { dependsOn(updatePackageJsonVersion) }
|
|
|
|
|
|
|
|
|
|
|
2021-11-27 17:57:50 +01:00
|
|
|
val dataModelTs: Configuration by configurations.creating {
|
|
|
|
|
asConsumer()
|
|
|
|
|
typescriptAttributes(objects)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dependencies {
|
|
|
|
|
dataModelTs(projects.modules.factorioEventsDataModel)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val updateDataModel by tasks.registering(Sync::class) {
|
|
|
|
|
group = project.name
|
|
|
|
|
|
|
|
|
|
dependsOn(dataModelTs)
|
|
|
|
|
|
|
|
|
|
from(
|
|
|
|
|
dataModelTs.incoming
|
|
|
|
|
.artifactView { lenient(true) }
|
|
|
|
|
.artifacts
|
|
|
|
|
.artifactFiles
|
|
|
|
|
.filter { it.exists() }
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
into(layout.projectDirectory.dir("src/main/typescript/generated"))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tasks.assemble { dependsOn(updateDataModel) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-10-31 08:53:11 +01:00
|
|
|
idea {
|
|
|
|
|
module {
|
2021-11-10 17:34:01 +01:00
|
|
|
sourceDirs.add(mkdir(layout.projectDirectory.dir("src/main/typescript").asFile))
|
|
|
|
|
excludeDirs.add(mkdir(layout.projectDirectory.dir("src/main/typescript/node_modules").asFile))
|
|
|
|
|
resourceDirs.add(mkdir(layout.projectDirectory.dir("src/main/resources").asFile))
|
|
|
|
|
resourceDirs.add(mkdir(layout.projectDirectory.dir("infra").asFile))
|
|
|
|
|
excludeDirs.add(mkdir(layout.projectDirectory.dir("infra/factorio-server").asFile))
|
2021-10-31 08:53:11 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-11-03 17:07:59 +01:00
|
|
|
val typescriptSrcSet =
|
|
|
|
|
project.objects.sourceDirectorySet("typescript", "typescript").apply {
|
2021-11-10 17:34:01 +01:00
|
|
|
srcDir(layout.projectDirectory.dir("src/main/typescript"))
|
2021-11-03 17:07:59 +01:00
|
|
|
|
|
|
|
|
destinationDirectory.set(modBuildDir.dir("typescriptToLua").asFile)
|
|
|
|
|
compiledBy(tstlTask) {
|
|
|
|
|
|
|
|
|
|
project.objects.directoryProperty().apply {
|
|
|
|
|
set(modBuildDir.dir("typescriptToLua"))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-10-17 17:56:19 +02:00
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val modPackageTask = tasks.register<Zip>("packageMod") {
|
2021-10-17 17:56:19 +02:00
|
|
|
description = "Package mod files into ZIP"
|
2021-10-10 20:20:01 +02:00
|
|
|
group = projectId
|
2021-10-09 15:40:45 +02:00
|
|
|
|
2021-10-10 20:20:01 +02:00
|
|
|
dependsOn(tstlTask)
|
|
|
|
|
|
2021-10-25 23:34:38 +02:00
|
|
|
inputs.properties(tokens)
|
|
|
|
|
|
|
|
|
|
from(layout.projectDirectory.dir("src/main/resources/mod-data")) {
|
|
|
|
|
include("**/**")
|
|
|
|
|
filter<ReplaceTokens>("tokens" to tokens)
|
|
|
|
|
}
|
2021-10-13 21:29:21 +02:00
|
|
|
from(
|
2021-10-23 22:46:17 +02:00
|
|
|
rootProject.layout.projectDirectory.file("LICENSE"),
|
|
|
|
|
tstlTask,
|
2021-10-13 21:29:21 +02:00
|
|
|
)
|
2021-10-10 20:20:01 +02:00
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
into(rootProject.name)
|
|
|
|
|
|
|
|
|
|
// Factorio required format is:
|
|
|
|
|
// - filename: `mod-name_version.zip`
|
2021-10-17 17:56:19 +02:00
|
|
|
// - zip contains one directory, `mod-name`
|
2021-10-25 23:34:38 +02:00
|
|
|
archiveFileName.set("${rootProject.name}_${project.version}.zip")
|
2021-10-10 20:20:01 +02:00
|
|
|
destinationDirectory.set(modBuildDir.dir("dist"))
|
2021-10-25 23:34:38 +02:00
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
|
val outDir = destinationDirectory.asFile.get().toRelativeString(layout.projectDirectory.asFile)
|
|
|
|
|
val outZip = "${archiveFileName.orNull}"
|
|
|
|
|
logger.lifecycle("Creating mod zip $outDir/$outZip")
|
|
|
|
|
}
|
2021-10-13 21:29:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//tasks.build { dependsOn(tstlTask, modPackageTask) }
|
|
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val modInfraDir: Directory = layout.projectDirectory.dir("infra")
|
|
|
|
|
val factorioServerDataDir: Directory = modInfraDir.dir("factorio-server")
|
2021-10-22 12:29:45 +02:00
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
val copyModToServerTask = tasks.register<Copy>("copyModToServer") {
|
|
|
|
|
description = "Copy the mod to the Factorio Docker server"
|
2021-10-17 17:56:19 +02:00
|
|
|
group = "$projectId.factorioServer"
|
2021-10-10 20:20:01 +02:00
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
dependsOn(modPackageTask)
|
|
|
|
|
|
|
|
|
|
from(modPackageTask)
|
2021-10-22 12:29:45 +02:00
|
|
|
into(factorioServerDataDir.dir("mods"))
|
|
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
|
logger.lifecycle("Copying mod from ${source.files} to $destinationDir")
|
|
|
|
|
}
|
2021-10-13 21:29:21 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val factorioServerStop = tasks.register<Exec>("factorioServerStop") {
|
2021-10-17 17:56:19 +02:00
|
|
|
group = "$projectId.factorioServer"
|
2021-10-13 21:29:21 +02:00
|
|
|
|
2021-10-17 19:47:39 +02:00
|
|
|
mustRunAfter(copyModToServerTask)
|
|
|
|
|
|
2021-10-22 12:29:45 +02:00
|
|
|
workingDir(modInfraDir)
|
2021-10-22 00:07:26 +02:00
|
|
|
commandLine = parseSpaceSeparatedArgs("docker-compose stop factorio-server")
|
2021-10-10 20:20:01 +02:00
|
|
|
}
|
|
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val factorioServerUp = tasks.register<Exec>("factorioServerUp") {
|
2021-10-17 19:47:39 +02:00
|
|
|
group = "$projectId.factorioServer"
|
|
|
|
|
|
2021-10-20 00:51:35 +02:00
|
|
|
mustRunAfter(copyModToServerTask)
|
2021-10-23 22:46:17 +02:00
|
|
|
dependsOn(factorioServerStop)
|
2021-10-17 19:47:39 +02:00
|
|
|
|
2021-10-22 12:29:45 +02:00
|
|
|
workingDir(modInfraDir)
|
2021-10-22 00:07:26 +02:00
|
|
|
commandLine = parseSpaceSeparatedArgs("docker-compose up -d factorio-server")
|
2021-10-17 19:47:39 +02:00
|
|
|
}
|
2021-10-09 15:40:45 +02:00
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
val factorioServerRestart: Task by tasks.creating {
|
|
|
|
|
group = "$projectId.factorioServer"
|
|
|
|
|
|
|
|
|
|
dependsOn(factorioServerStop, factorioServerUp)
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-17 17:56:19 +02:00
|
|
|
//val serverRestartTask = tasks.register<Exec>("dockerRestart") {
|
|
|
|
|
// group = "$projectId.factorioServer"
|
|
|
|
|
//
|
|
|
|
|
// workingDir = layout.projectDirectory.dir("src/test/resources/server/").asFile
|
|
|
|
|
// commandLine = parseSpaceSeparatedArgs("docker-compose restart")
|
|
|
|
|
//}
|
2021-10-13 21:29:21 +02:00
|
|
|
|
2021-10-17 17:56:19 +02:00
|
|
|
val copyModToClientTask = tasks.register<Copy>("copyModToClient") {
|
|
|
|
|
description = "Copy the mod to the Factorio client"
|
|
|
|
|
group = "$projectId.factorioClient"
|
|
|
|
|
|
|
|
|
|
dependsOn(modPackageTask)
|
|
|
|
|
|
|
|
|
|
from(modPackageTask)
|
|
|
|
|
into("""D:\Users\Adam\AppData\Roaming\Factorio\mods""")
|
2021-10-22 12:29:45 +02:00
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
|
logger.lifecycle("Copying mod from ${source.files} to $destinationDir")
|
|
|
|
|
}
|
2021-10-17 17:56:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//val factorioClientLaunch = tasks.register<Exec>("launch") {
|
|
|
|
|
// description = "Run Factorio client"
|
|
|
|
|
// group = "$projectId.factorioClient"
|
|
|
|
|
//
|
|
|
|
|
// dependsOn(
|
|
|
|
|
// serverRestartTask,
|
|
|
|
|
// copyModToClientTask
|
|
|
|
|
// )
|
|
|
|
|
//
|
|
|
|
|
//// workingDir = layout.projectDirectory.dir("src/test/resources/server/").asFile
|
|
|
|
|
// commandLine = parseSpaceSeparatedArgs(
|
|
|
|
|
// """explorer "steam://rungameid/427520 --mp-connect localhost" """
|
|
|
|
|
// )
|
|
|
|
|
//}
|
|
|
|
|
|
2021-10-13 21:29:21 +02:00
|
|
|
val launch = tasks.register("modLauncher") {
|
2021-10-17 17:56:19 +02:00
|
|
|
description = "Build the mod, upload to Server and Client, and start both"
|
2021-10-13 21:29:21 +02:00
|
|
|
group = projectId
|
|
|
|
|
dependsOn(
|
2021-10-23 22:46:17 +02:00
|
|
|
copyModToServerTask,
|
|
|
|
|
copyModToClientTask,
|
|
|
|
|
factorioServerRestart,
|
2021-10-17 17:56:19 +02:00
|
|
|
// factorioClientLaunch,
|
2021-10-13 21:29:21 +02:00
|
|
|
)
|
|
|
|
|
}
|
2021-10-17 17:56:19 +02:00
|
|
|
|
|
|
|
|
tasks.register("downloadFactorioApiDocs") {
|
|
|
|
|
group = projectId
|
|
|
|
|
|
|
|
|
|
val target = uri("https://lua-api.factorio.com/latest/runtime-api.json")
|
|
|
|
|
val apiFilename = File(target.path).name
|
2021-11-03 15:59:24 +01:00
|
|
|
val downloadedFile = file("$temporaryDir/$apiFilename")
|
2021-10-17 17:56:19 +02:00
|
|
|
|
|
|
|
|
val apiFile = modBuildDir.file(apiFilename)
|
|
|
|
|
outputs.file(apiFile)
|
|
|
|
|
|
|
|
|
|
doLast {
|
|
|
|
|
|
2021-10-23 22:46:17 +02:00
|
|
|
ant.invokeMethod(
|
|
|
|
|
"get", mapOf(
|
2021-10-17 17:56:19 +02:00
|
|
|
"src" to target,
|
|
|
|
|
"dest" to downloadedFile,
|
|
|
|
|
"verbose" to true,
|
2021-10-23 22:46:17 +02:00
|
|
|
)
|
|
|
|
|
)
|
2021-10-17 17:56:19 +02:00
|
|
|
|
|
|
|
|
val json = downloadedFile.readText()
|
2021-12-01 13:35:32 +01:00
|
|
|
val prettyJson = JsonOutput.prettyPrint(json)
|
2021-10-17 17:56:19 +02:00
|
|
|
|
|
|
|
|
apiFile.asFile.writeText(prettyJson)
|
|
|
|
|
|
|
|
|
|
logger.lifecycle("Downloaded Factorio API json: $apiFile")
|
|
|
|
|
}
|
|
|
|
|
}
|