computer wires

This commit is contained in:
minjaesong
2025-03-30 20:00:02 +09:00
parent 51da0612d2
commit b6ee5ee0f7
12 changed files with 224 additions and 32 deletions

View File

@@ -37,6 +37,7 @@ import java.io.File
import java.io.FileInputStream
import java.io.FileNotFoundException
import java.io.IOException
import java.lang.reflect.InvocationTargetException
import java.net.MalformedURLException
import java.net.URL
import java.net.URLClassLoader
@@ -525,12 +526,22 @@ object ModMgr {
if (it == null) {
val loadedClass = Class.forName(className)
val loadedClassConstructor = loadedClass.getConstructor(*constructorTypes)
return loadedClassConstructor.newInstance(*initArgs) as T
try {
return loadedClassConstructor.newInstance(*initArgs) as T
}
catch (e: InvocationTargetException) {
throw InvocationTargetException(e, "Failed to load class '$className' with given constructor arguments")
}
}
else {
val loadedClass = it.loadClass(className)
val loadedClassConstructor = loadedClass.getConstructor(*constructorTypes)
return loadedClassConstructor.newInstance(*initArgs) as T
try {
return loadedClassConstructor.newInstance(*initArgs) as T
}
catch (e: InvocationTargetException) {
throw InvocationTargetException(e, "Failed to load class '$className' with given constructor arguments")
}
}
}
}
@@ -541,12 +552,22 @@ object ModMgr {
if (it == null) {
val loadedClass = Class.forName(className)
val loadedClassConstructor = loadedClass.getConstructor()
return loadedClassConstructor.newInstance() as T
try {
return loadedClassConstructor.newInstance() as T
}
catch (e: InvocationTargetException) {
throw InvocationTargetException(e, "Failed to load class '$className' with zero constructor arguments")
}
}
else {
val loadedClass = it.loadClass(className)
val loadedClassConstructor = loadedClass.getConstructor()
return loadedClassConstructor.newInstance() as T
try {
return loadedClassConstructor.newInstance() as T
}
catch (e: InvocationTargetException) {
throw InvocationTargetException(e, "Failed to load class '$className' with zero constructor arguments")
}
}
}
}

View File

@@ -207,12 +207,14 @@ class WireCodex {
val invImgSheet = invImgRef[0]
val invImgX = invImgRef[1].toInt()
val invImgY = invImgRef[2].toInt()
val className = record.get("javaclass")
val loadedClass = Class.forName(className)
val loadedClassConstructor = loadedClass.getConstructor(ItemID::class.java, String::class.java, Int::class.java, Int::class.java)
val loadedClassInstance = loadedClassConstructor.newInstance(prop.id, invImgSheet, invImgX, invImgY)
ItemCodex[prop.id] = loadedClassInstance as GameItem
ModMgr.getJavaClass<GameItem>(modname, className,
arrayOf(ItemID::class.java, String::class.java, Int::class.java, Int::class.java),
arrayOf(prop.id, invImgSheet, invImgX, invImgY)
).let {
ItemCodex[prop.id] = it
}
printdbg(this, "Setting prop ${prop.id} ->>\t${prop.nameKey}")
}

View File

@@ -19,7 +19,7 @@ class WireProp : TaggedProp {
var inputType: String = ""
var outputType: String = ""
var branching: Int = 0 // 0: can't; 1: tee-only, 2: cross-only, 3: tee and cross
var branching: Int = 0 // 0: can't; 1: can't but can be bent, 2: tee-only, 3: cross-only, 4: tee and cross
/**
* Mainly intended to be used by third-party modules

View File

@@ -119,7 +119,7 @@ object BlockBase {
/**
* This function assumes xy and oxy are neighboured and tiles are correctly placed
*
* @param branching 0: no branching, 1: tee-only, 2: cross-only, 3: tee and cross
* @param branching 0: no branching, no bend, 1: no branching, yes bend, 2: tee-only, 3: cross-only, 4: tee and cross
*/
private fun setConnectivity(branching: Int, world: GameWorld, vec: Int, item: ItemID, x: Int, y: Int, ox: Int, oy: Int) {
when (branching) {

View File

@@ -83,6 +83,11 @@ open class ItemFileRef(originalID: ItemID) : GameItem(originalID) {
*/
open var useItemHandler = ""
/**
* In which module the "useItemHandler" is located
*/
open var useItemHandlerModule = "basegame"
override var baseMass = 1.0
override var baseToolSize: Double? = null
@@ -109,10 +114,7 @@ open class ItemFileRef(originalID: ItemID) : GameItem(originalID) {
return if (useItemHandler.isNotBlank()) {
try {
if (classCache == null) {
val newClass = Class.forName(useItemHandler)
val newClassConstructor = newClass.getConstructor(/* no args defined */)
val newClassInstance = newClassConstructor.newInstance(/* no args defined */)
classCache = (newClassInstance as FileRefItemPrimaryUseHandler)
classCache = ModMgr.getJavaClass(useItemHandlerModule, useItemHandler)
}
classCache!!.use(this)
}

View File

@@ -4,11 +4,8 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.OrthographicCamera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.App
import net.torvald.terrarum.*
import net.torvald.terrarum.App.*
import net.torvald.terrarum.QNDTreeNode
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.Yaml
import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.TitleScreen
@@ -60,7 +57,7 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
if (splittedNodeName?.size == 2 && node.data != null) {
try {
val tag = splittedNodeName[0].split(tagSep).getOrNull(1)
val attachedClass = loadClass(splittedNodeName[1]) // check existence
val attachedClass = loadClass("basegame", splittedNodeName[1]) // check existence
screenNames[node.data!!] = splittedNodeName[1] // actual loading will by dynamic as some UIs need to be re-initialised as they're called
}
catch (e: java.lang.ClassNotFoundException) {
@@ -70,11 +67,8 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
}
}
private fun loadClass(name: String): UICanvas {
val newClass = Class.forName(name)
val newClassConstructor = newClass.getConstructor(this.javaClass)
val newClassInstance = newClassConstructor.newInstance(this)
return newClassInstance as UICanvas
private fun loadClass(module: String, name: String): UICanvas {
return ModMgr.getJavaClass<UICanvas>(module, name, arrayOf(this.javaClass), arrayOf(this))
}
private var mouseActionAvailable = true
@@ -202,7 +196,7 @@ open class UIRemoCon(val parent: TitleScreen, val treeRoot: QNDTreeNode<String>)
printdbg(this, "$menuString has screen: ${screenNames.containsKey(menuString)}")
screenNames[menuString]?.let {
val ui = loadClass(it)
val ui = loadClass("basegame", it)
ui.setPosition(0,0)
parent.uiFakeBlurOverlay.setAsOpen()
ui.setAsOpen()