diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 74c70c890..ca1dd5e6e 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -410,7 +410,7 @@ open class GameWorld() : Disposable { if (wiringGraph[blockAddr]!![itemID] == null) wiringGraph[blockAddr]!![itemID] = WiringSimCell(0, vector) - wiringGraph[blockAddr]!![itemID]!!.emt = vector + wiringGraph[blockAddr]!![itemID]!!.emt.set(vector) } fun addWireRecvStateOf(x: Int, y: Int, itemID: ItemID, state: WireRecvState) { @@ -649,8 +649,8 @@ open class GameWorld() : Disposable { */ data class WiringSimCell( var cnx: Int = 0, // connections - var emt: Vector2 = Vector2(0.0, 0.0), // i'm emitting this much power - var rcv: ArrayList = ArrayList() // how far away are the power sources + val emt: Vector2 = Vector2(0.0, 0.0), // i'm emitting this much power + val rcv: ArrayList = ArrayList() // how far away are the power sources ) fun getTemperature(worldTileX: Int, worldTileY: Int): Float? { diff --git a/src/net/torvald/terrarum/gameworld/WorldSimulator.kt b/src/net/torvald/terrarum/gameworld/WorldSimulator.kt index 89e82561e..11b3bcd24 100644 --- a/src/net/torvald/terrarum/gameworld/WorldSimulator.kt +++ b/src/net/torvald/terrarum/gameworld/WorldSimulator.kt @@ -11,8 +11,6 @@ import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import net.torvald.terrarum.modulebasegame.gameactors.Electric import net.torvald.terrarum.modulebasegame.gameactors.FixtureBase import org.dyn4j.geometry.Vector2 -import java.util.* -import kotlin.collections.ArrayList import kotlin.math.roundToInt /** @@ -442,17 +440,31 @@ object WorldSimulator { it is FixtureBase && it is Electric && it.inUpdateRange(world) && it.wireEmitterTypes.isNotEmpty() } as List + private val wireSimMarked = HashSet() + private val wireSimPoints = Queue() + private val oldTraversedNodes = ArrayList() + private fun simulateWires(delta: Float) { + // unset old wires before we begin + oldTraversedNodes.forEach { (x, y, _, _, wire) -> + world.getAllWiringGraph(x, y)?.get(wire)?.emt?.set(0.0, 0.0) + } + + oldTraversedNodes.clear() + wiresimGetSourceBlocks().let { sources -> // signal-emitting fixtures must set emitState of its own tiles via update() sources.forEach { (it as Electric).wireEmitterTypes.forEach { wireType, bbi -> - val startingPoint = WireGraphCursor(it.worldBlockPos!! + it.blockBoxIndexToPoint2i(bbi)) + val startingPoint = it.worldBlockPos!! + it.blockBoxIndexToPoint2i(bbi) val signal = (it as Electric).wireEmission[bbi] ?: Vector2(0.0, 0.0) world.getAllWiringGraph(startingPoint.x, startingPoint.y)?.keys?.filter { WireCodex[it].accepts == wireType }?.forEach { wire -> - traverseWireGraph(world, wire, startingPoint, signal) + val simStartingPoint = WireGraphCursor(startingPoint, wire) + wireSimMarked.clear() + wireSimPoints.clear() + traverseWireGraph(world, wire, simStartingPoint, signal) } } } @@ -470,23 +482,22 @@ object WorldSimulator { } var point = startingPoint.copy() - val points = Queue() // a queue, enqueued at the end - val marked = HashSet() fun mark(point: WireGraphCursor) { - marked.add(point.longHash()) + wireSimMarked.add(point.longHash()) + oldTraversedNodes.add(point.copy()) // do some signal action world.setWireEmitStateOf(point.x, point.y, wire, signal) } - fun isMarked(point: WireGraphCursor) = marked.contains(point.longHash()) - fun enq(point: WireGraphCursor) = points.addFirst(point.copy()) - fun deq() = points.removeLast() + fun isMarked(point: WireGraphCursor) = wireSimMarked.contains(point.longHash()) + fun enq(point: WireGraphCursor) = wireSimPoints.addFirst(point.copy()) + fun deq() = wireSimPoints.removeLast() enq(point) mark(point) - while (points.notEmpty()) { + while (wireSimPoints.notEmpty()) { point = deq() // TODO if we found a power receiver, do something to it world.getWireGraphOf(point.x, point.y, wire)?.let { connections -> @@ -519,9 +530,10 @@ object WorldSimulator { var x: Int, var y: Int, var fromWhere: Int, //1: right, 2: down, 4: left, 8: up, 0: *shrug* - var len: Int + var len: Int, + var wire: ItemID ) { - constructor(point2i: Point2i): this(point2i.x, point2i.y, 0, 0) + constructor(point2i: Point2i, wire: ItemID): this(point2i.x, point2i.y, 0, 0, wire) fun moveOneCell(dir: Int): WireGraphCursor { when (dir) {