diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index ecdbbbf25..292fcceda 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -566,6 +566,7 @@ object ModMgr { } Terrarum.wireCodex.portsFromModule(module, "wires/") + Terrarum.wireCodex.wireDecaysFromModule(module, "wires/") } private fun makeNewItemObj(tile: BlockProp, isWall: Boolean) = object : GameItem( diff --git a/src/net/torvald/terrarum/blockproperties/WireCodex.kt b/src/net/torvald/terrarum/blockproperties/WireCodex.kt index 2458c53e0..bfff155b0 100644 --- a/src/net/torvald/terrarum/blockproperties/WireCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/WireCodex.kt @@ -23,6 +23,8 @@ class WireCodex { @Transient val wirePorts = HashMap>() + @Transient val wireDecays = HashMap() + fun clear() { wireProps.clear() } @@ -123,6 +125,23 @@ class WireCodex { } } + fun wireDecaysFromModule(module: String, path: String) { + printdbg(this, "Building wire ports table for module $module") + try { + registerDecays(module, path, CSVFetcher.readFromModule(module, path + "decayconsts.csv")) + } + catch (e: IOException) { e.printStackTrace() } + } + + private fun registerDecays(module: String, path: String, records: List) { + records.forEach { + val item = it.get("wireItemID") + val d = it.get("const").toDouble() + + wireDecays[item] = d + } + } + fun getAll() = wireProps.values /*fun get(index: Int): WireProp { diff --git a/src/net/torvald/terrarum/gameactors/WireActor.kt b/src/net/torvald/terrarum/gameactors/WireActor.kt index 8ba0efbbe..34ee51a31 100644 --- a/src/net/torvald/terrarum/gameactors/WireActor.kt +++ b/src/net/torvald/terrarum/gameactors/WireActor.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.WireEmissionType import net.torvald.terrarum.ui.Toolkit +import kotlin.math.cos /** * Created by minjaesong on 2024-03-05. @@ -63,11 +64,33 @@ class WireActor : ActorWithBody, NoSerialise, InternalActor { override fun updateImpl(delta: Float) { } + private fun essfun0(x: Double) = -cos(Math.PI * x) / 2.0 + 0.5 + private fun essfun(x: Double) = essfun0(x) + override fun drawBody(frameDelta: Float, batch: SpriteBatch) { if (isVisible && sprite != null) { - (sprite as SheetSpriteAnimation).currentRow = (world?.getWireEmitStateOf(worldX, worldY, wireID)?.isNotZero == true).toInt() BlendMode.resolve(drawMode, batch) - drawSpriteInGoodPosition(frameDelta, sprite!!, batch) + + // signal wires? + if (WireCodex.wireProps[wireID]?.accepts == "digital_bit") { + val strength = world?.getWireEmitStateOf(worldX, worldY, wireID)?.x ?: 0.0 + + // draw base (unlit) sprite + batch.color = Color.WHITE + (sprite as SheetSpriteAnimation).currentRow = 0 + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, 0, Color.WHITE) + + // draw lit sprite + val alpha = Color(1f, 1f, 1f, essfun(strength.coerceIn(0.0, 1.0)).toFloat()) + (sprite as SheetSpriteAnimation).currentRow = 1 + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, 0, alpha) + } + else { + (sprite as SheetSpriteAnimation).currentRow = 0 + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, 0, Color.WHITE) + } + + } } } diff --git a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt index 83f09f92a..bbd57ccda 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -520,7 +520,8 @@ object WorldSimulator { } private fun calculateDecay(signal: Vector2, dist: Int, wire: ItemID, signalType: WireEmissionType): Vector2 { - return signal * 0.995.pow(dist.toDouble()) + val d = WireCodex.wireDecays[wire]!! + return signal * d.pow(dist.toDouble()) } private fun traverseWireGraph(world: GameWorld, wire: ItemID, startingPoint: WireGraphCursor, signal: Vector2, signalType: WireEmissionType) {