wire ports view

This commit is contained in:
minjaesong
2024-03-07 23:46:30 +09:00
parent 0d09a21028
commit bfaa50aea4
26 changed files with 210 additions and 72 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -32,8 +32,8 @@ id;classname;tags
31;net.torvald.terrarum.modulebasegame.gameitems.ItemGunpowder;POWDER,EXPLOSIVE 31;net.torvald.terrarum.modulebasegame.gameitems.ItemGunpowder;POWDER,EXPLOSIVE
32;net.torvald.terrarum.modulebasegame.gameitems.ItemCherryBomb;EXPLOSIVE,THROWABLE 32;net.torvald.terrarum.modulebasegame.gameitems.ItemCherryBomb;EXPLOSIVE,THROWABLE
33;net.torvald.terrarum.modulebasegame.gameitems.ItemTorch;FIXTURE,LIGHT 33;net.torvald.terrarum.modulebasegame.gameitems.ItemTorch;FIXTURE,LIGHT
34;net.torvald.terrarum.modulebasegame.gameitems.ItemSignalSwitchManual;FIXTURE,SIGNAL 34;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalSwitchManual;FIXTURE,SIGNAL
35;net.torvald.terrarum.modulebasegame.gameitems.ItemSignalBulb;FIXTURE,SIGNAL 35;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalBulb;FIXTURE,SIGNAL
36;net.torvald.terrarum.modulebasegame.gameitems.ItemWireRollingMill;FIXTURE,CRAFTING 36;net.torvald.terrarum.modulebasegame.gameitems.ItemWireRollingMill;FIXTURE,CRAFTING
37;net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestEbony;FIXTURE,STORAGE 37;net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestEbony;FIXTURE,STORAGE
38;net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestBirch;FIXTURE,STORAGE 38;net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestBirch;FIXTURE,STORAGE
@@ -42,8 +42,8 @@ id;classname;tags
41;net.torvald.terrarum.modulebasegame.gameitems.ItemTableEbony;FIXTURE,SURFACE 41;net.torvald.terrarum.modulebasegame.gameitems.ItemTableEbony;FIXTURE,SURFACE
42;net.torvald.terrarum.modulebasegame.gameitems.ItemTableBirch;FIXTURE,SURFACE 42;net.torvald.terrarum.modulebasegame.gameitems.ItemTableBirch;FIXTURE,SURFACE
43;net.torvald.terrarum.modulebasegame.gameitems.ItemTableRosewood;FIXTURE,SURFACE 43;net.torvald.terrarum.modulebasegame.gameitems.ItemTableRosewood;FIXTURE,SURFACE
44;net.torvald.terrarum.modulebasegame.gameitems.ItemSignalBlocker;FIXTURE,SIGNAL 44;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalBlocker;FIXTURE,SIGNAL
45;net.torvald.terrarum.modulebasegame.gameitems.ItemSignalLatch;FIXTURE,SIGNAL 45;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalLatch;FIXTURE,SIGNAL
# ingots # ingots
26;net.torvald.terrarum.modulebasegame.gameitems.IngotSteel;INGOT 26;net.torvald.terrarum.modulebasegame.gameitems.IngotSteel;INGOT
1 id classname tags
32 32 net.torvald.terrarum.modulebasegame.gameitems.ItemCherryBomb EXPLOSIVE,THROWABLE
33 33 net.torvald.terrarum.modulebasegame.gameitems.ItemTorch FIXTURE,LIGHT
34 34 net.torvald.terrarum.modulebasegame.gameitems.ItemSignalSwitchManual net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalSwitchManual FIXTURE,SIGNAL
35 35 net.torvald.terrarum.modulebasegame.gameitems.ItemSignalBulb net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalBulb FIXTURE,SIGNAL
36 36 net.torvald.terrarum.modulebasegame.gameitems.ItemWireRollingMill FIXTURE,CRAFTING
37 37 net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestEbony FIXTURE,STORAGE
38 38 net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestBirch FIXTURE,STORAGE
39 39 net.torvald.terrarum.modulebasegame.gameitems.ItemStorageChestRosewood FIXTURE,STORAGE
42 42 net.torvald.terrarum.modulebasegame.gameitems.ItemTableBirch FIXTURE,SURFACE
43 43 net.torvald.terrarum.modulebasegame.gameitems.ItemTableRosewood FIXTURE,SURFACE
44 44 net.torvald.terrarum.modulebasegame.gameitems.ItemSignalBlocker net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalBlocker FIXTURE,SIGNAL
45 45 net.torvald.terrarum.modulebasegame.gameitems.ItemSignalLatch net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalLatch FIXTURE,SIGNAL
46 # ingots
47 26 net.torvald.terrarum.modulebasegame.gameitems.IngotSteel INGOT
48 112 net.torvald.terrarum.modulebasegame.gameitems.IngotCopper INGOT
49 113 net.torvald.terrarum.modulebasegame.gameitems.IngotIron INGOT

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
"accepts";"fileModule";"file";"xpos";"ypos"
"digital_bit";"basegame";"wires/ports.tga";0;0
"power_low";"basegame";"wires/ports.tga";1;0
"power_high";"basegame";"wires/ports.tga";2;0
"10base2";"basegame";"wires/ports.tga";2;0
1 accepts fileModule file xpos ypos
2 digital_bit basegame wires/ports.tga 0 0
3 power_low basegame wires/ports.tga 1 0
4 power_high basegame wires/ports.tga 2 0
5 10base2 basegame wires/ports.tga 2 0

View File

@@ -565,6 +565,7 @@ object ModMgr {
Terrarum.wireCodex.fromModule(module, "wires/") { wire -> Terrarum.wireCodex.fromModule(module, "wires/") { wire ->
} }
Terrarum.wireCodex.portsFromModule(module, "wires/")
} }
private fun makeNewItemObj(tile: BlockProp, isWall: Boolean) = object : GameItem( private fun makeNewItemObj(tile: BlockProp, isWall: Boolean) = object : GameItem(

View File

@@ -12,13 +12,13 @@ object ReferencingRanges {
val ITEMS_DYNAMIC = 0x10_0000..0x0FFF_FFFF // 267 386 880 pseudo-items val ITEMS_DYNAMIC = 0x10_0000..0x0FFF_FFFF // 267 386 880 pseudo-items
val ACTORS = 0x1000_0000..0x7FFE_FFFF val ACTORS = 0x1000_0000..0x7FFE_FFFF
// there is a gap between 0x7FFF_0000..0x7FFF_BFFF // there is a gap between 0x7FFF_0000..0x7FFF_7FFF
// IDs doesn't effect the render order at all, but we're kinda enforcing these ID ranging. // IDs doesn't effect the render order at all, but we're kinda enforcing these ID ranging.
// However, these two wire-related actor will break the rule. But as we want them to render on top of others // However, these two wire-related actor will break the rule. But as we want them to render on top of others
// in the same render orders, we're giveng them relatively high IDs for them. // in the same render orders, we're giveng them relatively high IDs for them.
val ACTORS_WIRES = 0x7FFF_C000..0x7FFF_EFFF // Rendered front--wires val ACTORS_WIRE_PORTS = 0x7FFF_8000..0x7FFF_BEFF // Rendered front--wires
val ACTORS_WIRES_HELPER = 0x7FFF_F000..0x7FFF_FEFF // Rendered overlay--wiring port icons and logic gates val ACTORS_WIRES = 0x7FFF_BF00..0x7FFF_FEFF // Rendered overlay--wiring port icons
val ACTORS_INTERNAL_USE = 0x7FFF_FF00..0x7FFF_FFFF // Actor ID 0x7FFF_FFFF is pre-assigned to the block cursor! val ACTORS_INTERNAL_USE = 0x7FFF_FF00..0x7FFF_FFFF // Actor ID 0x7FFF_FFFF is pre-assigned to the block cursor!

View File

@@ -1,10 +1,12 @@
package net.torvald.terrarum.blockproperties package net.torvald.terrarum.blockproperties
import com.badlogic.gdx.files.FileHandle
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.GameItem
import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.modulebasegame.gameactors.WireEmissionType
import net.torvald.terrarum.utils.CSVFetcher import net.torvald.terrarum.utils.CSVFetcher
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.apache.commons.csv.CSVRecord import org.apache.commons.csv.CSVRecord
@@ -17,9 +19,10 @@ import java.io.IOException
class WireCodex { class WireCodex {
@Transient val wireProps = HashMap<ItemID, WireProp>() @Transient val wireProps = HashMap<ItemID, WireProp>()
@Transient private val nullProp = WireProp() @Transient private val nullProp = WireProp()
@Transient val wirePorts = HashMap<WireEmissionType, Triple<TextureRegionPack, Int, Int>>()
fun clear() { fun clear() {
wireProps.clear() wireProps.clear()
} }
@@ -81,6 +84,45 @@ class WireCodex {
} }
fun portsFromModule(module: String, path: String) {
printdbg(this, "Building wire ports table for module $module")
try {
registerPorts(module, path, CSVFetcher.readFromModule(module, path + "wireports.csv"))
}
catch (e: IOException) { e.printStackTrace() }
}
private fun registerPorts(module: String, path: String, records: List<CSVRecord>) {
val spriteSheetFiles = ArrayList<Pair<FileHandle, String>>()
val tempRecords = HashMap<WireEmissionType, Triple<String, Int, Int>>()
records.forEach {
val type = it.get("accepts")
val fileModule = it.get("fileModule")
val filePath = it.get("file")
val x = it.get("xpos").toInt()
val y = it.get("ypos").toInt()
val file = ModMgr.getGdxFile(fileModule, filePath)
val fileID = "wireport:$fileModule.${filePath.replace('\\','/')}"
spriteSheetFiles.add(file to fileID)
tempRecords[type] = Triple(fileID, x, y)
}
spriteSheetFiles.forEach { (file, id) ->
CommonResourcePool.addToLoadingList(id) {
TextureRegionPack(file, TILE_SIZE, TILE_SIZE)
}
}
CommonResourcePool.loadAll()
tempRecords.forEach { type, (fileID, x, y) ->
wirePorts[type] = Triple(CommonResourcePool.getAsTextureRegionPack(fileID), x, y)
}
}
fun getAll() = wireProps.values fun getAll() = wireProps.values
/*fun get(index: Int): WireProp { /*fun get(index: Int): WireProp {
@@ -159,4 +201,8 @@ class WireCodex {
fun getAllWiresThatAccepts(accept: String): List<Pair<ItemID, WireProp>> { fun getAllWiresThatAccepts(accept: String): List<Pair<ItemID, WireProp>> {
return wireProps.filter { it.value.accepts == accept }.toList() return wireProps.filter { it.value.accepts == accept }.toList()
} }
fun getWirePortSpritesheet(emissionType: WireEmissionType): Triple<TextureRegionPack, Int, Int>? {
return wirePorts[emissionType]
}
} }

View File

@@ -1,10 +1,15 @@
package net.torvald.terrarum.gameactors package net.torvald.terrarum.gameactors
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.App.printdbg
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.gameitems.ItemID 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
/** /**
* Created by minjaesong on 2024-03-05. * Created by minjaesong on 2024-03-05.
@@ -18,15 +23,6 @@ interface InternalActor {
*/ */
class WireActor : ActorWithBody, NoSerialise, InternalActor { class WireActor : ActorWithBody, NoSerialise, InternalActor {
companion object {
val WIRE_NEARBY = arrayOf(
(+1 to 0), // tileR
(0 to +1), // tileB
(-1 to 0), // tileL
(0 to -1) // tileT
)
}
private constructor() private constructor()
constructor(id: ActorID) : super(RenderOrder.OVERLAY, PhysProperties.IMMOBILE(), id) constructor(id: ActorID) : super(RenderOrder.OVERLAY, PhysProperties.IMMOBILE(), id)
@@ -39,7 +35,6 @@ class WireActor : ActorWithBody, NoSerialise, InternalActor {
private var worldX = 0 private var worldX = 0
private var worldY = 0 private var worldY = 0
/** /**
* @param itemID must start with "wire@" * @param itemID must start with "wire@"
*/ */
@@ -65,34 +60,77 @@ class WireActor : ActorWithBody, NoSerialise, InternalActor {
(sprite as SheetSpriteAnimation).currentFrame = cnx (sprite as SheetSpriteAnimation).currentFrame = cnx
} }
private fun getNearbyTilesPos(x: Int, y: Int): Array<Point2i> { override fun updateImpl(delta: Float) {
return arrayOf( }
Point2i(x + 1, y),
Point2i(x, y + 1), override fun drawBody(frameDelta: Float, batch: SpriteBatch) {
Point2i(x - 1, y), if (isVisible && sprite != null) {
Point2i(x, y - 1) (sprite as SheetSpriteAnimation).currentRow = (world?.getWireEmitStateOf(worldX, worldY, wireID)?.isNotZero == true).toInt()
) BlendMode.resolve(drawMode, batch)
drawSpriteInGoodPosition(frameDelta, sprite!!, batch)
}
}
}
/**
* Created by minjaesong on 2024-03-07.
*/
class WirePortActor : ActorWithBody, NoSerialise, InternalActor {
private constructor()
constructor(id: ActorID) : super(RenderOrder.OVERLAY, PhysProperties.IMMOBILE(), id)
init {
setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, 0)
renderOrder = RenderOrder.OVERLAY
}
private var portID: WireEmissionType = ""
private var worldX = 0
private var worldY = 0
/**
*/
fun setPort(emissionType: WireEmissionType, worldX: Int, worldY: Int) {
setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, 0)
if (portID != emissionType) {
WireCodex.getWirePortSpritesheet(emissionType)?.let { (sheet, x, y) ->
if (sprite == null) {
makeNewSprite(sheet).let {
it.delays = floatArrayOf(Float.POSITIVE_INFINITY,Float.POSITIVE_INFINITY,Float.POSITIVE_INFINITY,Float.POSITIVE_INFINITY)
it.setRowsAndFrames(1, 16)
}
}
else {
(sprite as SheetSpriteAnimation).let {
it.setSpriteImage(sheet)
}
}
(sprite as SheetSpriteAnimation).let {
it.currentFrame = x
it.currentRow = y
}
portID = emissionType
}
}
this.worldX = worldX
this.worldY = worldY
setPosition((worldX + 0.5) * TILE_SIZE, (worldY + 1.0) * TILE_SIZE - 1.0) // what the fuck?
} }
override fun updateImpl(delta: Float) { override fun updateImpl(delta: Float) {
} }
override fun drawBody(frameDelta: Float, batch: SpriteBatch) { override fun drawBody(frameDelta: Float, batch: SpriteBatch) {
if (isVisible && sprite != null) { if (isVisible && sprite != null && (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass.isNotBlank()) {
if (WireCodex[wireID].accepts == "digital_3bits") {
// "digital_3bits" must come right after three wires it bundles
val rootID = wireID.substringBefore(':') + ":"
var row = 0
(WireCodex[wireID].numericID - 3 .. WireCodex[wireID].numericID - 1).forEachIndexed { index, it ->
val itemID = rootID + it
row = row or ((world?.getWireEmitStateOf(worldX, worldY, itemID)?.isNotZero == true).toInt() shl index)
}
(sprite as SheetSpriteAnimation).currentRow = row
}
else {
(sprite as SheetSpriteAnimation).currentRow = (world?.getWireEmitStateOf(worldX, worldY, wireID)?.isNotZero == true).toInt()
}
BlendMode.resolve(drawMode, batch) BlendMode.resolve(drawMode, batch)
drawSpriteInGoodPosition(frameDelta, sprite!!, batch) drawSpriteInGoodPosition(frameDelta, sprite!!, batch)
} }

View File

@@ -57,7 +57,6 @@ import net.torvald.terrarum.ui.UICanvas
import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.weather.WeatherMixer
import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.terrarum.worlddrawer.BlocksDrawer
import net.torvald.terrarum.worlddrawer.FeaturesDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.worlddrawer.LightmapRenderer.LIGHTMAP_OVERRENDER
import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarum.worlddrawer.WorldCamera
import net.torvald.unicode.EMDASH import net.torvald.unicode.EMDASH
import net.torvald.util.CircularArray import net.torvald.util.CircularArray
@@ -710,7 +709,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
var uiOpened = false var uiOpened = false
val fixtureUnderMouse0: List<FixtureBase> = getActorsUnderMouse(Terrarum.mouseX, Terrarum.mouseY).filterIsInstance<FixtureBase>() val fixtureUnderMouse0: List<FixtureBase> = getActorsUnderMouse(Terrarum.mouseX, Terrarum.mouseY).filterIsInstance<FixtureBase>()
if (fixtureUnderMouse0.size > 1) { if (fixtureUnderMouse0.size > 1) {
App.printdbgerr(this, "Multiple fixtures at world coord ${Terrarum.mouseX}, ${Terrarum.mouseY}") App.printdbgerr(this, "Multiple fixtures at tile coord ${Terrarum.mouseX / TILE_SIZED}, ${Terrarum.mouseY / TILE_SIZED}: [${fixtureUnderMouse0.map { it.javaClass.simpleName }.joinToString()}]")
} }
val fixtureUnderMouse = fixtureUnderMouse0.firstOrNull() val fixtureUnderMouse = fixtureUnderMouse0.firstOrNull()
@@ -956,6 +955,12 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
fillUpWiresBuffer() fillUpWiresBuffer()
} }
} }
measureDebugTime("Ingame.FillUpWirePortsView*") {
if (WORLD_UPDATE_TIMER % 2 == 0) {
val fixtures = INGAME.actorContainerActive.filterIsInstance<Electric>()
fillUpWirePortsView(fixtures)
}
}
oldCamX = WorldCamera.x oldCamX = WorldCamera.x
oldPlayerX = actorNowPlaying?.hitbox?.canonicalX ?: 0.0 oldPlayerX = actorNowPlaying?.hitbox?.canonicalX ?: 0.0
@@ -1227,17 +1232,22 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
} }
private val maxRenderableWires = ReferencingRanges.ACTORS_WIRES.last - ReferencingRanges.ACTORS_WIRES.first + 1 private val maxRenderableWires = ReferencingRanges.ACTORS_WIRES.last - ReferencingRanges.ACTORS_WIRES.first + 1
private val maxRenderablePorts = ReferencingRanges.ACTORS_WIRE_PORTS.last - ReferencingRanges.ACTORS_WIRE_PORTS.first + 1
private val wireActorsContainer = Array(maxRenderableWires) { WireActor(ReferencingRanges.ACTORS_WIRES.first + it).let { private val wireActorsContainer = Array(maxRenderableWires) { WireActor(ReferencingRanges.ACTORS_WIRES.first + it).let {
forceAddActor(it) forceAddActor(it)
/*^let*/ it /*^let*/ it
} } } }
private val wirePortActorsContainer = Array(maxRenderablePorts) { WirePortActor(ReferencingRanges.ACTORS_WIRE_PORTS.first + it).let {
forceAddActor(it)
/*^let*/ it
} }
private fun fillUpWiresBuffer() { private fun fillUpWiresBuffer() {
val for_y_start = (WorldCamera.y.toFloat() / TILE_SIZE).floorToInt() - LIGHTMAP_OVERRENDER val for_y_start = (WorldCamera.y.toFloat() / TILE_SIZE).floorToInt() - 1
val for_y_end = for_y_start + BlocksDrawer.tilesInVertical + 2*LIGHTMAP_OVERRENDER val for_y_end = for_y_start + BlocksDrawer.tilesInVertical + 2*1
val for_x_start = (WorldCamera.x.toFloat() / TILE_SIZE).floorToInt() - LIGHTMAP_OVERRENDER val for_x_start = (WorldCamera.x.toFloat() / TILE_SIZE).floorToInt() - 1
val for_x_end = for_x_start + BlocksDrawer.tilesInHorizontal + 2*LIGHTMAP_OVERRENDER val for_x_end = for_x_start + BlocksDrawer.tilesInHorizontal + 2*1
var wiringCounter = 0 var wiringCounter = 0
for (y in for_y_start..for_y_end) { for (y in for_y_start..for_y_end) {
@@ -1269,9 +1279,39 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
} }
for (i in wiringCounter until maxRenderableWires) { for (i in wiringCounter until maxRenderableWires) {
wireActorsContainer[i].isUpdate = false val wireActor = wireActorsContainer[i]
wireActorsContainer[i].isVisible = false wireActor.isUpdate = false
wireActorsContainer[i].forceDormant = true wireActor.isVisible = false
wireActor.forceDormant = true
}
}
private fun fillUpWirePortsView(fixtures: List<Electric>) {
var portsCounter = 0
fixtures.forEach {
(it.wireSinkTypes.toList() + it.wireEmitterTypes.toList()).forEach { (boxIndex, type) ->
if (portsCounter < wirePortActorsContainer.size) {
val wireActor = wirePortActorsContainer[portsCounter]
val (wx, wy) = it.worldBlockPos!! + it.blockBoxIndexToPoint2i(boxIndex)
wireActor.setPort(type, wx, wy)
wireActor.isUpdate = true
wireActor.isVisible = true
wireActor.forceDormant = false
portsCounter += 1
}
}
}
for (i in portsCounter until maxRenderablePorts) {
val wireActor = wirePortActorsContainer[i]
wireActor.isUpdate = false
wireActor.isVisible = false
wireActor.forceDormant = true
} }
} }
@@ -1641,8 +1681,6 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
} }
fun pickupFixture(actor: ActorWithBody, delta: Float, mwx: Double, mwy: Double, mtx: Int, mty: Int, assignToQuickslot: Boolean = true) { fun pickupFixture(actor: ActorWithBody, delta: Float, mwx: Double, mwy: Double, mtx: Int, mty: Int, assignToQuickslot: Boolean = true) {
printdbg(this, "Pickup fixture fired")
val actorsUnderMouse = getActorsUnderMouse(mwx, mwy) val actorsUnderMouse = getActorsUnderMouse(mwx, mwy)
val fixture = actorsUnderMouse.firstOrNull { val fixture = actorsUnderMouse.firstOrNull {

View File

@@ -501,7 +501,7 @@ object WorldSimulator {
wiresimGetSourceBlocks().let { sources -> wiresimGetSourceBlocks().let { sources ->
// signal-emitting fixtures must set emitState of its own tiles via update() // signal-emitting fixtures must set emitState of its own tiles via update()
sources.forEach { sources.forEach {
it.wireEmitterTypes.forEach { bbi, wireType -> it.wireEmitterTypes.forEach { (bbi, wireType) ->
val startingPoint = it.worldBlockPos!! + it.blockBoxIndexToPoint2i(bbi) val startingPoint = it.worldBlockPos!! + it.blockBoxIndexToPoint2i(bbi)
val signal = it.wireEmission[bbi] ?: Vector2(0.0, 0.0) val signal = it.wireEmission[bbi] ?: Vector2(0.0, 0.0)

View File

@@ -73,6 +73,13 @@ open class Electric : FixtureBase {
fun setWireEmissionAt(x: Int, y: Int, emission: Vector2) { wireEmission[pointToBlockBoxIndex(x, y)] = emission } fun setWireEmissionAt(x: Int, y: Int, emission: Vector2) { wireEmission[pointToBlockBoxIndex(x, y)] = emission }
fun setWireConsumptionAt(x: Int, y: Int, consumption: Vector2) { wireConsumption[pointToBlockBoxIndex(x, y)] = consumption } fun setWireConsumptionAt(x: Int, y: Int, consumption: Vector2) { wireConsumption[pointToBlockBoxIndex(x, y)] = consumption }
fun clearStatus() {
wireSinkTypes.clear()
wireEmitterTypes.clear()
wireEmission.clear()
wireConsumption.clear()
}
// these are characteristic properties of the fixture (they have constant value) so must not be serialised // these are characteristic properties of the fixture (they have constant value) so must not be serialised
@Transient val wireEmitterTypes: HashMap<BlockBoxIndex, WireEmissionType> = HashMap() @Transient val wireEmitterTypes: HashMap<BlockBoxIndex, WireEmissionType> = HashMap()
@Transient val wireSinkTypes: HashMap<BlockBoxIndex, WireEmissionType> = HashMap() @Transient val wireSinkTypes: HashMap<BlockBoxIndex, WireEmissionType> = HashMap()

View File

@@ -31,7 +31,7 @@ interface Reorientable {
/** /**
* Created by minjaesong on 2024-03-04. * Created by minjaesong on 2024-03-04.
*/ */
class FixtureSignalBlocker : Electric, Reorientable { class FixtureLogicSignalBlocker : Electric, Reorientable {
@Transient override val spawnNeedsWall = false @Transient override val spawnNeedsWall = false
@Transient override val spawnNeedsFloor = false @Transient override val spawnNeedsFloor = false
@@ -44,6 +44,7 @@ class FixtureSignalBlocker : Electric, Reorientable {
override var orientation = 0 // 0 1 2 3 override var orientation = 0 // 0 1 2 3
private fun setEmitterAndSink() { private fun setEmitterAndSink() {
clearStatus()
when (orientation) { when (orientation) {
0 -> { 0 -> {
setWireSinkAt(0, 0, "digital_bit") setWireSinkAt(0, 0, "digital_bit")

View File

@@ -11,7 +11,7 @@ import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
/** /**
* Created by minjaesong on 2024-03-01. * Created by minjaesong on 2024-03-01.
*/ */
class FixtureSignalBulb : Electric { class FixtureLogicSignalBulb : Electric {
@Transient override val spawnNeedsFloor = false @Transient override val spawnNeedsFloor = false

View File

@@ -13,7 +13,7 @@ import org.dyn4j.geometry.Vector2
* *
* Created by minjaesong on 2024-03-05. * Created by minjaesong on 2024-03-05.
*/ */
class FixtureSignalLatch : Electric, Reorientable { class FixtureLogicSignalLatch : Electric, Reorientable {
@Transient override val spawnNeedsWall = false @Transient override val spawnNeedsWall = false
@Transient override val spawnNeedsFloor = false @Transient override val spawnNeedsFloor = false
@@ -26,6 +26,7 @@ class FixtureSignalLatch : Electric, Reorientable {
override var orientation = 0 // 0 2, where 2 is a mirror-image rather than rotation override var orientation = 0 // 0 2, where 2 is a mirror-image rather than rotation
private fun setEmitterAndSink() { private fun setEmitterAndSink() {
clearStatus()
when (orientation) { when (orientation) {
0 -> { 0 -> {
setWireSinkAt(0, 0, "digital_bit") // D setWireSinkAt(0, 0, "digital_bit") // D

View File

@@ -1,20 +1,18 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.App
import net.torvald.terrarum.TerrarumAppConfiguration import net.torvald.terrarum.TerrarumAppConfiguration
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase
import net.torvald.terrarum.toInt import net.torvald.terrarum.toInt
import net.torvald.terrarum.ui.MouseLatch
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import org.dyn4j.geometry.Vector2 import org.dyn4j.geometry.Vector2
/** /**
* Created by minjaesong on 2024-03-01. * Created by minjaesong on 2024-03-01.
*/ */
class FixtureSignalSwitchManual : Electric { class FixtureLogicSignalSwitchManual : Electric {
@Transient override val spawnNeedsFloor = false @Transient override val spawnNeedsFloor = false

View File

@@ -11,7 +11,7 @@ import net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalEmitter
/** /**
* Created by minjaesong on 2024-03-04. * Created by minjaesong on 2024-03-04.
*/ */
class ItemSignalBlocker(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureSignalBlocker") { class ItemLogicSignalBlocker(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalBlocker") {
override var dynamicID: ItemID = originalID override var dynamicID: ItemID = originalID
override var baseMass = FixtureLogicSignalEmitter.MASS override var baseMass = FixtureLogicSignalEmitter.MASS
@@ -38,7 +38,7 @@ class ItemSignalBlocker(originalID: ItemID) : FixtureItemBase(originalID, "net.t
/** /**
* Created by minjaesong on 2024-03-05. * Created by minjaesong on 2024-03-05.
*/ */
class ItemSignalLatch(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureSignalLatch") { class ItemLogicSignalLatch(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalLatch") {
override var dynamicID: ItemID = originalID override var dynamicID: ItemID = originalID
override var baseMass = FixtureLogicSignalEmitter.MASS override var baseMass = FixtureLogicSignalEmitter.MASS

View File

@@ -11,7 +11,7 @@ import net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalEmitter
/** /**
* Created by minjaesong on 2024-03-01. * Created by minjaesong on 2024-03-01.
*/ */
class ItemSignalBulb(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureSignalBulb") { class ItemLogicSignalBulb(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalBulb") {
override var dynamicID: ItemID = originalID override var dynamicID: ItemID = originalID
override var baseMass = FixtureLogicSignalEmitter.MASS override var baseMass = FixtureLogicSignalEmitter.MASS

View File

@@ -11,7 +11,7 @@ import net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalEmitter
/** /**
* Created by minjaesong on 2024-03-01. * Created by minjaesong on 2024-03-01.
*/ */
class ItemSignalSwitchManual(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureSignalSwitchManual") { class ItemLogicSignalSwitchManual(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalSwitchManual") {
override var dynamicID: ItemID = originalID override var dynamicID: ItemID = originalID
override var baseMass = FixtureLogicSignalEmitter.MASS override var baseMass = FixtureLogicSignalEmitter.MASS

Binary file not shown.