diff --git a/.run/Mindustry-moreLogicMod [jar].run.xml b/.run/Mindustry-moreLogicMod [jar].run.xml new file mode 100644 index 0000000..b9832a2 --- /dev/null +++ b/.run/Mindustry-moreLogicMod [jar].run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 9844352..dada7b2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,43 +1,55 @@ -version '1.0' +apply plugin: "java" -buildscript { - repositories { - mavenCentral() - } +version '1.0' - ext { - //the build number that this mod is made for - mindustryVersion = 'v136' - kotlinVersion = "1.7.10" - sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") - gameData = System.getenv("TEMP") ?: System.getenv("TMP") - } +sourceSets.main.java.srcDirs = ["src"] - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - } +repositories { + mavenCentral() + maven { url "https://raw.githubusercontent.com/Zelaux/MindustryRepo/master/repository" } + maven { url 'https://www.jitpack.io' } } -apply plugin: "kotlin" +java { + targetCompatibility = 8 + sourceCompatibility = JavaVersion.VERSION_17 +} -sourceSets.main.kotlin.srcDirs = ["src"] +ext { + //the build number that this mod is made for + mindustryVersion = 'v146' + jabelVersion = "93fde537c7" + //windows sucks + isWindows = System.getProperty("os.name").toLowerCase().contains("windows") + sdkRoot = System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") +} -repositories { - mavenCentral() - maven { url 'https://www.jitpack.io' } +//java 8 backwards compatibility flag +allprojects { + tasks.withType(JavaCompile).tap { + configureEach { + options.compilerArgs.addAll(['--release', '8']) + } + } } dependencies { compileOnly "com.github.Anuken.Arc:arc-core:$mindustryVersion" compileOnly "com.github.Anuken.Mindustry:core:$mindustryVersion" + + annotationProcessor "com.github.Anuken:jabel:$jabelVersion" } -compileKotlin { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_1_8 +//force arc version +configurations.configureEach { + resolutionStrategy.eachDependency { details -> + if (details.requested.group == 'com.github.Anuken.Arc') { + details.useVersion "$mindustryVersion" + } + } } -task jarAndroid { +tasks.register('jarAndroid') { dependsOn "jar" doLast { @@ -50,15 +62,16 @@ task jarAndroid { //collect dependencies needed for desugaring def dependencies = (configurations.compileClasspath.asList() + configurations.runtimeClasspath.asList() + [new File(platformRoot, "android.jar")]).collect { "--classpath $it.path" }.join(" ") + def d8 = isWindows ? "d8.bat" : "d8" + //dex and desugar files - this requires d8 in your PATH - "d8 $dependencies --min-api 14 --output ${project.archivesBaseName}Android.jar ${project.archivesBaseName}Desktop.jar" + "$d8 $dependencies --min-api 14 --output ${base.archivesBaseName}Android.jar ${base.archivesBaseName}Desktop.jar" .execute(null, new File("$buildDir/libs")).waitForProcessOutput(System.out, System.err) } } jar { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - archiveFileName = "${project.archivesBaseName}Desktop.jar" + archiveFileName = "${base.archivesBaseName}Desktop.jar" from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } @@ -73,28 +86,17 @@ jar { } } -task deploy(type: Jar) { +tasks.register('deploy', Jar) { dependsOn jarAndroid dependsOn jar - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - archiveFileName = "${project.archivesBaseName}.jar" + archiveFileName = "${base.archivesBaseName}.jar" - from { [zipTree("$buildDir/libs/${project.archivesBaseName}Desktop.jar"), zipTree("$buildDir/libs/${project.archivesBaseName}Android.jar")] } + from { [zipTree("$buildDir/libs/${base.archivesBaseName}Desktop.jar"), zipTree("$buildDir/libs/${base.archivesBaseName}Android.jar")] } doLast { delete { - delete "$buildDir/libs/${project.archivesBaseName}Desktop.jar" - delete "$buildDir/libs/${project.archivesBaseName}Android.jar" + delete "$buildDir/libs/${base.archivesBaseName}Desktop.jar" + delete "$buildDir/libs/${base.archivesBaseName}Android.jar" } } } - -task copy2game(type: Copy) { - dependsOn jar - from file("$buildDir/libs/") - include("${project.archivesBaseName}Desktop.jar") - into "$gameData/../../Roaming/Mindustry/mods" - doLast { - println "copy jar" - } -} diff --git a/mod.hjson b/mod.hjson index ef15c79..2facd06 100644 --- a/mod.hjson +++ b/mod.hjson @@ -17,7 +17,7 @@ description: "添加更多逻辑条:打印缓存处理逻辑" version: 1.2 #the minimum game build required to run this mod -minGameVersion: 136 +minGameVersion: 146 #this is a java mod java: true diff --git a/src/bin/morelogic/MoreStringLogicJavaPlugin.java b/src/bin/morelogic/MoreStringLogicJavaPlugin.java new file mode 100644 index 0000000..2c47a12 --- /dev/null +++ b/src/bin/morelogic/MoreStringLogicJavaPlugin.java @@ -0,0 +1,22 @@ +package bin.morelogic; + +import arc.util.Log; +import mindustry.gen.LogicIO; +import mindustry.logic.LAssembler; +import mindustry.mod.Plugin; + +/** + * @author bin + * @version 1.0.0 + * @since 2024/2/14 + */ +@SuppressWarnings("unused") +public class MoreStringLogicJavaPlugin extends Plugin { + @Override + public void init() { + Log.info("Loading MoreStringLogicJavaPlugin."); + LAssembler.customParsers.put(PrintBufferStatement.ID, PrintBufferStatement::read); + LogicIO.allStatements.add(PrintBufferStatement::new); + Log.info("End Loaded MoreStringLogicJavaPlugin."); + } +} diff --git a/src/bin/morelogic/MoreStringLogicJavaPlugin.kt b/src/bin/morelogic/MoreStringLogicJavaPlugin.kt deleted file mode 100644 index 37c4028..0000000 --- a/src/bin/morelogic/MoreStringLogicJavaPlugin.kt +++ /dev/null @@ -1,18 +0,0 @@ -package bin.morelogic - -import arc.util.Log -import mindustry.gen.LogicIO -import mindustry.logic.LAssembler -import mindustry.mod.Plugin - -/** - * @author bin - */ -class MoreStringLogicJavaPlugin : Plugin() { - override fun init() { - Log.info("Loading MoreStringLogicJavaPlugin.") - LAssembler.customParsers.put(PrintBufferStatement.ID, PrintBufferStatement::read) - LogicIO.allStatements.add(::PrintBufferStatement) - Log.info("End Loaded MoreStringLogicJavaPlugin.") - } -} diff --git a/src/bin/morelogic/PrintBufferStatement.java b/src/bin/morelogic/PrintBufferStatement.java new file mode 100644 index 0000000..5e58ae0 --- /dev/null +++ b/src/bin/morelogic/PrintBufferStatement.java @@ -0,0 +1,88 @@ +package bin.morelogic; + +import arc.func.Cons; +import arc.scene.ui.Button; +import arc.scene.ui.TextField; +import arc.scene.ui.layout.Cell; +import arc.scene.ui.layout.Table; +import arc.util.Strings; +import bin.morelogic.statement.StringOp; +import mindustry.logic.LAssembler; +import mindustry.logic.LCategory; +import mindustry.logic.LExecutor; +import mindustry.logic.LStatement; + +/** + * @author bin + * @version 1.0.0 + * @since 2024/2/14 + */ +public class PrintBufferStatement extends LStatement { + public static final String ID = "bin_String"; + + public StringOp op = StringOp.GetLength; + public String[] args = {"dest", "a", "b", "c"}; + + @Override + public Cell field(Table table, String value, Cons setter) { + return super.field(table, value, setter); + } + + @Override + public void build(Table table) { + op.invoke(this, table); + } + + @Override + public void showSelect(Button b, T[] values, T current, Cons getter) { + super.showSelect(b, values, current, getter, 4, it -> it.size(144f, 40f)); + } + + @Override + public LExecutor.LInstruction build(LAssembler builder) { + return op.invoke(vars(builder, args)); + } + + @Override + public LCategory category() { + return LCategory.operation; + } + + @Override + public void write(StringBuilder builder) { + builder.append(ID); + builder.append(" ").append(op.name()); + for (var s : args) { + builder.append(" ").append(s); + } + } + + @Override + public String name() { + return Strings.insertSpaces("PrintBuffer"); + } + + public static LStatement read(String[] tokens) { + var statement = new PrintBufferStatement(); + var length = tokens.length; + if (length > 1) { + statement.op = StringOp.value(tokens[1]); + } + var args = statement.args; + for (int it = 0, size = Math.min(args.length, length - 2); it < size; it++) { + String token = tokens[it + 2]; + if (token != null) { + args[it] = token; + } + } + return statement; + } + + public static int[] vars(LAssembler builder, String[] symbols) { + var arr = new int[symbols.length]; + for (int it = 0, size = symbols.length; it < size; it++) { + arr[it] = builder.var(symbols[it]); + } + return arr; + } +} diff --git a/src/bin/morelogic/PrintBufferStatement.kt b/src/bin/morelogic/PrintBufferStatement.kt deleted file mode 100644 index ef8b7e9..0000000 --- a/src/bin/morelogic/PrintBufferStatement.kt +++ /dev/null @@ -1,71 +0,0 @@ -package bin.morelogic - -import arc.func.Cons -import arc.scene.ui.Button -import arc.scene.ui.TextField -import arc.scene.ui.layout.Cell -import arc.scene.ui.layout.Table -import arc.util.Strings -import bin.morelogic.statement.StringOp -import mindustry.logic.LAssembler -import mindustry.logic.LCategory -import mindustry.logic.LExecutor.LInstruction -import mindustry.logic.LStatement -import kotlin.math.min - -/** - * 字符串拼接 - * TODO: 字符串的切片,插入,拆除,判断 - * @author bin - */ -class PrintBufferStatement : LStatement() { - var op = StringOp.GetLength - var args = arrayOf("dest", "a", "b", "c") - - override fun build(table: Table) = op.run { invoke(table) } - - public override fun field(table: Table?, value: String?, setter: Cons?): Cell = - super.field(table, value, setter) - - public override fun row(table: Table?) = super.row(table) - public override fun showSelect(b: Button?, values: Array?, current: T, getter: Cons?) = - super.showSelect(b, values, current, getter, 4) { it.size(144f, 40f) } - - override fun build(builder: LAssembler): LInstruction = op(builder.vars(args)) - - override fun category(): LCategory = LCategory.operation - - override fun write(builder: StringBuilder) { - builder.append(ID) - builder.append(" ").append(op.name) - for (s in args) { - builder.append(" ").append(s) - } - } - - override fun name(): String { - return Strings.insertSpaces(javaClass.simpleName.replace("Statement", "")) - } - - companion object { - const val ID = "bin_String" - fun read(tokens: Array): LStatement { - return PrintBufferStatement().apply { - val length = tokens.size - if (length > 1) op = StringOp.value(tokens[1]) - repeat(min(args.size, length - 2)) { - args[it] = tokens[it + 2] ?: args[it] - } - } - } - - @JvmStatic - fun LAssembler.vars(symbols: Array): IntArray { - return IntArray(symbols.size) { - `var`(symbols[it]) - } - } - - } -} - diff --git a/src/bin/morelogic/statement/StringOp.java b/src/bin/morelogic/statement/StringOp.java new file mode 100644 index 0000000..1886eba --- /dev/null +++ b/src/bin/morelogic/statement/StringOp.java @@ -0,0 +1,383 @@ +package bin.morelogic.statement; + +import arc.scene.ui.Button; +import arc.scene.ui.layout.Cell; +import arc.scene.ui.layout.Table; +import bin.morelogic.PrintBufferStatement; +import mindustry.content.Blocks; +import mindustry.ctype.Content; +import mindustry.ctype.MappableContent; +import mindustry.game.Team; +import mindustry.gen.Building; +import mindustry.gen.Unit; +import mindustry.logic.LExecutor; +import mindustry.ui.Styles; +import mindustry.world.blocks.logic.MessageBlock; + +/** + * @author bin + * @version 1.0.0 + * @since 2024/2/14 + */ +public enum StringOp { + ReadFrom { + @Override + public LExecutor.LInstruction invoke(int[] args) { + return new OpI(args); + } + + @Override + public void buttonTooltip(Cell