From 4112dc333fff9fdbb4d18faebd4957b9419c0a20 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 7 Aug 2021 14:21:27 +0900 Subject: [PATCH] tooltip ui update --- .../terrarum-sans-bitmap/puae000-e0ff.tga | 4 +- .../graphics/gui/message_black_tileable.tga | 2 +- .../graphics/gui/message_white_tileable.tga | 2 +- assets/mods/basegame/items/itemid.csv | 1 + src/net/torvald/terrarum/ModMgr.kt | 26 +++++-- .../torvald/terrarum/gameworld/GameWorld.kt | 63 ++++++++++++++--- .../terrarum/modulebasegame/EntryPoint.kt | 2 + .../terrarum/modulebasegame/TerrarumIngame.kt | 2 +- .../gameactors/PlayerBuilderSigrid.kt | 3 +- .../gameitems/PickaxeGeneric.kt | 6 +- .../gameitems/WireGraphDebugger.kt | 69 +++++++++++++++++++ .../gameitems/WirePieceSignalWire.kt | 2 +- .../terrarum/modulebasegame/ui/FloatDrawer.kt | 2 +- .../terrarum/modulebasegame/ui/UITooltip.kt | 45 ++++++++---- work_files/graphics/gui/message.psd | 4 +- 15 files changed, 190 insertions(+), 43 deletions(-) create mode 100644 src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt diff --git a/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga b/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga index 9ab0497a7..92a636540 100644 --- a/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga +++ b/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6dcc1b7ea8d91b536df52f63f207f4c4bf268c78f22d632c1d4e10adf7dc1a4f -size 331820 +oid sha256:2384f584645154b1990b9a802126b954ccfec9cedbf30ffb977eb7009264f788 +size 331794 diff --git a/assets/graphics/gui/message_black_tileable.tga b/assets/graphics/gui/message_black_tileable.tga index 550c42c48..d68f3ef7c 100644 --- a/assets/graphics/gui/message_black_tileable.tga +++ b/assets/graphics/gui/message_black_tileable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c617a8a83164eb5ff875dcc7920cb16cfc3598ccce0e716c2fbbef041a73aa7 +oid sha256:fe03612363989f253356770c4583655772f5868c05bd3f4174113f47e6f585ce size 46674 diff --git a/assets/graphics/gui/message_white_tileable.tga b/assets/graphics/gui/message_white_tileable.tga index 9aca9bd8c..4bb16fa85 100644 --- a/assets/graphics/gui/message_white_tileable.tga +++ b/assets/graphics/gui/message_white_tileable.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eb533ec57a8ec2d6a62d7a8238b6bc334783239040782c8a1e3becffc335b9a +oid sha256:52f56bf021dc19b96c903f3853583e21ec13f70e4d66f05e95e9cecc7e138f38 size 46674 diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index fa69e14f9..a6704e8b8 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -4,3 +4,4 @@ "3";"net.torvald.terrarum.modulebasegame.gameitems.PickaxeSteel" "5";"net.torvald.terrarum.modulebasegame.gameitems.TikiTorchTester" "6";"net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChest" +"7";"net.torvald.terrarum.modulebasegame.gameitems.WireGraphDebugger" diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 4fc3ea60e..0d9735af2 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -106,12 +106,23 @@ object ModMgr { // run entry script in entry point if (entryPoint.isNotBlank()) { - val newClass = Class.forName(entryPoint) - val newClassConstructor = newClass.getConstructor(/* no args defined */) - val newClassInstance = newClassConstructor.newInstance(/* no args defined */) + var newClass: Class<*>? = null + try { + newClass = Class.forName(entryPoint) + } + catch (e: ClassNotFoundException) { + printdbgerr(this, "$moduleName has nonexisting entry point, skipping...") + printdbgerr(this, "\t$e") + moduleInfo.remove(moduleName) + } - entryPointClasses.add(newClassInstance as ModuleEntryPoint) - (newClassInstance as ModuleEntryPoint).invoke() + newClass?.let { + val newClassConstructor = newClass.getConstructor(/* no args defined */) + val newClassInstance = newClassConstructor.newInstance(/* no args defined */) + + entryPointClasses.add(newClassInstance as ModuleEntryPoint) + (newClassInstance as ModuleEntryPoint).invoke() + } } @@ -121,8 +132,9 @@ object ModMgr { printdbgerr(this, "No such module: $moduleName, skipping...") moduleInfo.remove(moduleName) } - catch (e: ClassNotFoundException) { - printdbgerr(this, "$moduleName has nonexisting entry point, skipping...") + catch (e: Throwable) { + printdbgerr(this, "There was an error while loading module $moduleName") + printdbgerr(this, "\t$e") moduleInfo.remove(moduleName) } } diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 6616d84a2..a72f0b67d 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -366,6 +366,16 @@ open class GameWorld : Disposable { return wiringGraph[blockAddr]?.get(itemID)?.generatorState } + fun getWireConsumerStateOf(x: Int, y: Int, itemID: ItemID): ArrayList? { + val (x, y) = coerceXY(x, y) + val blockAddr = LandUtil.getBlockAddr(this, x, y) + return getWireConsumerStateUnsafe(blockAddr, itemID) + } + + fun getWireConsumerStateUnsafe(blockAddr: BlockAddress, itemID: ItemID): ArrayList? { + return wiringGraph[blockAddr]?.get(itemID)?.consumerStates + } + fun setWireGraphOf(x: Int, y: Int, itemID: ItemID, byte: Byte) { val (x, y) = coerceXY(x, y) val blockAddr = LandUtil.getBlockAddr(this, x, y) @@ -373,13 +383,12 @@ open class GameWorld : Disposable { } fun setWireGraphOfUnsafe(blockAddr: BlockAddress, itemID: ItemID, byte: Byte) { - if (wiringGraph[blockAddr] == null) { + if (wiringGraph[blockAddr] == null) wiringGraph[blockAddr] = HashMap() + if (wiringGraph[blockAddr]!![itemID] == null) wiringGraph[blockAddr]!![itemID] = WiringSimCell(byte) - } - else { - wiringGraph[blockAddr]!![itemID]!!.con = byte - } + + wiringGraph[blockAddr]!![itemID]!!.con = byte } fun setWireGeneratorStateOf(x: Int, y: Int, itemID: ItemID, vector: Vector2) { @@ -389,12 +398,48 @@ open class GameWorld : Disposable { } fun setWireGenenatorStateOfUnsafe(blockAddr: BlockAddress, itemID: ItemID, vector: Vector2) { - if (wiringGraph[blockAddr] == null) { + if (wiringGraph[blockAddr] == null) wiringGraph[blockAddr] = HashMap() + if (wiringGraph[blockAddr]!![itemID] == null) wiringGraph[blockAddr]!![itemID] = WiringSimCell(0, vector) - } - else { - wiringGraph[blockAddr]!![itemID]!!.generatorState = vector + + wiringGraph[blockAddr]!![itemID]!!.generatorState = vector + } + + fun addWireConsumerStateOf(x: Int, y: Int, itemID: ItemID, state: WireConsumerState) { + val (x, y) = coerceXY(x, y) + val blockAddr = LandUtil.getBlockAddr(this, x, y) + return addWireConsumerStateOfUnsafe(blockAddr, itemID, state) + } + + fun clearAllWireConsumerState(x: Int, y: Int) { + val (x, y) = coerceXY(x, y) + val blockAddr = LandUtil.getBlockAddr(this, x, y) + return clearAllWireConsumerStateUnsafe(blockAddr) + } + + fun addWireConsumerStateOfUnsafe(blockAddr: BlockAddress, itemID: ItemID, state: WireConsumerState) { + if (wiringGraph[blockAddr] == null) + wiringGraph[blockAddr] = HashMap() + if (wiringGraph[blockAddr]!![itemID] == null) + wiringGraph[blockAddr]!![itemID] = WiringSimCell(0) + + wiringGraph[blockAddr]!![itemID]!!.consumerStates.add(state) + } + + fun getAllWiringGraph(x: Int, y: Int): Iterable>? { + val (x, y) = coerceXY(x, y) + val blockAddr = LandUtil.getBlockAddr(this, x, y) + return getAllWiringGraphUnsafe(blockAddr) + } + + fun getAllWiringGraphUnsafe(blockAddr: BlockAddress): Iterable>? { + return wiringGraph[blockAddr]?.asIterable() + } + + fun clearAllWireConsumerStateUnsafe(blockAddr: BlockAddress) { + wiringGraph[blockAddr]?.forEach { + it.value.consumerStates.clear() } } diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 9d67891dc..b944bd38c 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -25,6 +25,8 @@ class EntryPoint : ModuleEntryPoint() { override fun invoke() { + printdbg(this, "Hello, world!") + // the order of invocation is important! Material should be the first as blocks and items are depend on it. ModMgr.GameMaterialLoader.invoke(moduleName) ModMgr.GameBlockLoader.invoke(moduleName) diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index df0b06b56..4dd98c018 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -683,7 +683,7 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { wires?.forEach { val wireActor = getOrMakeWireActor(wiringCounter) - if (WireCodex[it].renderClass == selectedWireRenderClass) { + if (WireCodex[it].renderClass == selectedWireRenderClass || selectedWireRenderClass == "wire_render_all") { wireActor.isUpdate = true wireActor.isVisible = true wireActor.forceDormant = false diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt index 77d0e941c..264ab8da8 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PlayerBuilderSigrid.kt @@ -94,7 +94,8 @@ object PlayerBuilderSigrid { inventory.add("item@basegame:2") // iron pick inventory.add("item@basegame:3") // steel pick inventory.add("item@basegame:5", 385930603) // test tiki torch - inventory.add("item@basegame:6", 95) // crafting table + inventory.add("item@basegame:6", 95) // storage chest + inventory.add("item@basegame:7", 1) // wire debugger WireCodex.getAll().forEach { try { diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index 3d7ff6cab..dfb7c2444 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -90,7 +90,7 @@ class PickaxeCopper(originalID: ItemID) : GameItem(originalID) { override val isDynamic = true override val material = MaterialCodex["CUPR"] override var baseMass = material.density.toDouble() / MaterialCodex["IRON"].density * BASE_MASS_AND_SIZE - override val itemImage: TextureRegion? + override val itemImage: TextureRegion get() = CommonResourcePool.getAsTextureRegionPack("basegame.items24").get(0,0) init { @@ -117,7 +117,7 @@ class PickaxeIron(originalID: ItemID) : GameItem(originalID) { override val isDynamic = true override val material = MaterialCodex["IRON"] override var baseMass = material.density.toDouble() / MaterialCodex["IRON"].density * BASE_MASS_AND_SIZE - override val itemImage: TextureRegion? + override val itemImage: TextureRegion get() = CommonResourcePool.getAsTextureRegionPack("basegame.items24").get(1,0) init { @@ -144,7 +144,7 @@ class PickaxeSteel(originalID: ItemID) : GameItem(originalID) { override val isDynamic = true override val material = MaterialCodex["STAL"] override var baseMass = material.density.toDouble() / MaterialCodex["IRON"].density * BASE_MASS_AND_SIZE - override val itemImage: TextureRegion? + override val itemImage: TextureRegion get() = CommonResourcePool.getAsTextureRegionPack("basegame.items24").get(2,0) init { diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt new file mode 100644 index 000000000..6b6a9eb11 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/WireGraphDebugger.kt @@ -0,0 +1,69 @@ +package net.torvald.terrarum.modulebasegame.gameitems + +import com.badlogic.gdx.graphics.g2d.TextureRegion +import net.torvald.terrarum.* +import net.torvald.terrarum.blockproperties.WireCodex +import net.torvald.terrarum.gameitem.GameItem +import net.torvald.terrarum.gameitem.ItemID +import net.torvald.terrarum.gameworld.GameWorld +import net.torvald.terrarum.itemproperties.MaterialCodex +import net.torvald.terrarum.modulebasegame.TerrarumIngame +import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore +import kotlin.math.roundToInt + +class WireGraphDebugger(originalID: ItemID) : GameItem(originalID) { + + override val originalName = "WIRE_DEBUGGER" + override var baseToolSize: Double? = PickaxeCore.BASE_MASS_AND_SIZE + override var stackable = false + override var inventoryCategory = Category.TOOL + override val isUnique = true + override val isDynamic = false + override val material = MaterialCodex["CUPR"] + override var baseMass = 2.0 + override val itemImage: TextureRegion + get() = CommonResourcePool.getAsTextureRegion("itemplaceholder_24") + + init { + super.equipPosition = GameItem.EquipPosition.HAND_GRIP + super.name = "Wire Debugger" + } + + private val sb = StringBuilder() + + override fun effectWhenEquipped(delta: Float) { + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "wire_render_all" + + + val mx = Terrarum.mouseTileX + val my = Terrarum.mouseTileY + + sb.clear() + + Terrarum.ingame!!.world.getAllWiringGraph(mx, my)?.let { + it.forEachIndexed { index, (itemID, simCell) -> + if (sb.isNotEmpty()) sb.append('\n') + + + val connexionIcon = (simCell.con + 0xE0A0).toChar() + val wireName = WireCodex[itemID].nameKey + + // todo + + sb.append("$connexionIcon $wireName") + } + } + + if (sb.isNotEmpty()) { + (Terrarum.ingame!! as TerrarumIngame).setTooltipMessage(sb.toString()) + } + else { + (Terrarum.ingame!! as TerrarumIngame).setTooltipMessage(null) + } + } + + override fun effectOnUnequip(delta: Float) { + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" + (Terrarum.ingame!! as TerrarumIngame).setTooltipMessage(null) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt index 67fba231d..08faa4cfc 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/WirePieceSignalWire.kt @@ -23,7 +23,7 @@ class WirePieceSignalWire(originalID: ItemID, private val atlasID: String, priva override val isUnique = false override val isDynamic = false override val material = Material() - override val itemImage: TextureRegion? + override val itemImage: TextureRegion get() = CommonResourcePool.getAsTextureRegionPack(atlasID).get(sheetX, sheetY) init { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/FloatDrawer.kt b/src/net/torvald/terrarum/modulebasegame/ui/FloatDrawer.kt index 6c93aeacd..b25af54b8 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/FloatDrawer.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/FloatDrawer.kt @@ -10,7 +10,7 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack */ object FloatDrawer : Disposable { - val tile = TextureRegionPack("assets/graphics/gui/message_white_tileable.tga", 36, 36) + val tile = TextureRegionPack("assets/graphics/gui/message_black_tileable.tga", 36, 36) init { AppLoader.disposableSingletonsPool.add(this) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt index 43d2d904b..d58b47d97 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt @@ -15,13 +15,17 @@ class UITooltip : UICanvas() { override var openCloseTime: Second = 0f - private val tooltipBackCol = Color(0xd5d4d3ff.toInt()) - private val tooltipForeCol = Color(0x404040ff) + private val tooltipBackCol = Color.WHITE + private val tooltipForeCol = Color(0xfafafaff.toInt()) + private var msgBuffer = ArrayList() var message: String = "" set(value) { field = value - msgWidth = font.getWidth(value) + msgBuffer.clear() + + msgBuffer.addAll(value.split('\n')) + msgWidth = msgBuffer.fold(0) { acc, s -> font.getWidth(s).let { if (it > acc) it else acc } } } private val font = AppLoader.fontGame @@ -37,21 +41,34 @@ class UITooltip : UICanvas() { set(value) { throw Error("You are not supposed to set the height of the tooltip manually.") } override fun renderUI(batch: SpriteBatch, camera: Camera) { - val mouseX = 4f - val mouseY = 6f - - val tooltipYoff = 50 - val tooltipY = mouseY - height + tooltipYoff - + val mouseXoff = 28f + val mouseYoff = 0f val txtW = msgWidth + 2f * textMarginX + val tooltipW = txtW + val tooltipH = font.lineHeight * msgBuffer.size + + val tooltipX = mouseXoff + val tooltipY = mouseYoff - (tooltipH / 2) + + batch.color = tooltipBackCol - FloatDrawer(batch, mouseX - textMarginX, tooltipY, txtW, font.lineHeight) - batch.color = tooltipForeCol - font.draw(batch, message, - mouseX, - mouseY - height + tooltipYoff + + FloatDrawer(batch, + tooltipX - textMarginX, + tooltipY, + tooltipW, + font.lineHeight * msgBuffer.size ) + + batch.color = tooltipForeCol + + msgBuffer.forEachIndexed { index, s -> + font.draw(batch, s, + tooltipX, + tooltipY + font.lineHeight * index + ) + } } override fun updateUI(delta: Float) { diff --git a/work_files/graphics/gui/message.psd b/work_files/graphics/gui/message.psd index c22d87c20..e7b00e432 100755 --- a/work_files/graphics/gui/message.psd +++ b/work_files/graphics/gui/message.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:54217ccafe7013a4561264d6208b90dc91717dfbf81e7631479b99d4bf521acc -size 35389 +oid sha256:0513ff037bafcb692b53df97d3aa84b770532c3031ce4686ef7b42380fc63732 +size 35740