cut wires are also power-cut

This commit is contained in:
minjaesong
2021-09-18 23:30:45 +09:00
parent 9e8bd5e4a9
commit e68d82f280
2 changed files with 28 additions and 16 deletions

View File

@@ -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<WireRecvState> = 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<WireRecvState> = ArrayList() // how far away are the power sources
)
fun getTemperature(worldTileX: Int, worldTileY: Int): Float? {

View File

@@ -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<FixtureBase>
private val wireSimMarked = HashSet<Long>()
private val wireSimPoints = Queue<WireGraphCursor>()
private val oldTraversedNodes = ArrayList<WireGraphCursor>()
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<WireGraphCursor>() // a queue, enqueued at the end
val marked = HashSet<Long>()
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) {