From 2943f4119c3e115706305c8ffbebb1d84d0cbb2e Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 10 Mar 2024 19:44:16 +0900 Subject: [PATCH] signal adder --- assets/mods/basegame/crafting/wires.json | 12 +- assets/mods/basegame/items/itemid.csv | 1 + assets/mods/basegame/items/items.tga | 2 +- assets/mods/basegame/locales/en/itemdesc.json | 3 +- assets/mods/basegame/locales/en/items.json | 1 + .../mods/basegame/locales/koKR/itemdesc.json | 3 +- assets/mods/basegame/locales/koKR/items.json | 1 + .../sprites/fixtures/signal_adder.tga | 3 + .../sprites/fixtures/signal_adder_emsv.tga | 3 + .../sprites/fixtures/signal_blocker_emsv.tga | 2 +- .../gameactors/FixtureLogicSignalAdder.kt | 152 ++++++++++++++++++ .../gameitems/ItemLogicSignalBlocker.kt | 27 ++++ work_files/graphics/items/basegame_items.kra | 4 +- .../graphics/wires/wire_single_items.kra | 4 +- 14 files changed, 207 insertions(+), 11 deletions(-) create mode 100644 assets/mods/basegame/sprites/fixtures/signal_adder.tga create mode 100644 assets/mods/basegame/sprites/fixtures/signal_adder_emsv.tga create mode 100644 src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalAdder.kt diff --git a/assets/mods/basegame/crafting/wires.json b/assets/mods/basegame/crafting/wires.json index 013714960..d85017691 100644 --- a/assets/mods/basegame/crafting/wires.json +++ b/assets/mods/basegame/crafting/wires.json @@ -50,19 +50,25 @@ "item@basegame:45": { /* signal latch */ "workbench": "basiccrafting", "ingredients": [ - [1, 3, "basegame:21", 1, "item@basegame:116", 2, "item@basegame:112"] /* 3 marbles, 1 tin, 2 copper */ + [1, 3, "basegame:21", 1, "item@basegame:116", 2, "item@basegame:112"] /* 3 marbles, 3 tin, 3 copper */ ] }, "item@basegame:8": { /* signal emitter */ "workbench": "basiccrafting", "ingredients": [ - [2, 1, "basegame:21", 1, "item@basegame:116"] /* 1 marbles, 1 tin, 2 copper */ + [2, 1, "basegame:21", 1, "item@basegame:116"] /* 1 marbles, 1 tin, 1 copper */ ] }, "item@basegame:46": { /* signal repeater */ "workbench": "basiccrafting", "ingredients": [ - [1, 1, "basegame:21", 1, "item@basegame:116"] /* 1 marbles, 1 tin, 2 copper */ + [1, 1, "basegame:21", 1, "item@basegame:116"] /* 1 marbles, 1 tin, 1 copper */ + ] + }, + "item@basegame:49": { /* signal adder */ + "workbench": "basiccrafting", + "ingredients": [ + [1, 1, "basegame:21", 1, "item@basegame:116"] /* 2 marbles, 2 tin, 2 copper */ ] } } \ No newline at end of file diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index e58a8d7d8..21c0fd6b5 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -47,6 +47,7 @@ id;classname;tags 46;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalRepeaterHorz;FIXTURE,SIGNAL 47;net.torvald.terrarum.modulebasegame.gameitems.ItemWrench;TOOL,WRENCH 48;net.torvald.terrarum.modulebasegame.gameitems.ItemAlloyingFurnace;FIXTURE,STATION +49;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalAdder;FIXTURE,SIGNAL # ingots 112;net.torvald.terrarum.modulebasegame.gameitems.IngotCopper;INGOT diff --git a/assets/mods/basegame/items/items.tga b/assets/mods/basegame/items/items.tga index b952e36c9..23b232b9c 100644 --- a/assets/mods/basegame/items/items.tga +++ b/assets/mods/basegame/items/items.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7225619633ef3ec7de8d005d2295ba96ffe48f2f56ed740e389fac58f0b6b721 +oid sha256:bcd48b139db6534db0794f2172275001be7a4702902aa59834ddef556be2774c size 2408466 diff --git a/assets/mods/basegame/locales/en/itemdesc.json b/assets/mods/basegame/locales/en/itemdesc.json index ddca16a6a..9f8691b6b 100644 --- a/assets/mods/basegame/locales/en/itemdesc.json +++ b/assets/mods/basegame/locales/en/itemdesc.json @@ -55,5 +55,6 @@ "TOOLTIP_item@basegame:35": "Shows a signal status", "TOOLTIP_item@basegame:44": "Cuts the signal using the cutting signal", "TOOLTIP_item@basegame:45": "Latches onto the signal on the latch signal", - "TOOLTIP_item@basegame:46": "Delays a signal by a short amount" + "TOOLTIP_item@basegame:46": "Delays a signal by a short amount", + "TOOLTIP_item@basegame:49": "Logically adds two signals" } \ No newline at end of file diff --git a/assets/mods/basegame/locales/en/items.json b/assets/mods/basegame/locales/en/items.json index 1e19a82ce..d23cbeb92 100644 --- a/assets/mods/basegame/locales/en/items.json +++ b/assets/mods/basegame/locales/en/items.json @@ -38,6 +38,7 @@ "ITEM_INGOT_TIN": "Tin Ingot", "ITEM_INGOT_ZINC": "Zinc Ingot", "ITEM_JUKEBOX": "Jukebox", + "ITEM_LOGIC_SIGNAL_ADDER": "Logic Signal Adder", "ITEM_LOGIC_SIGNAL_BLOCKER": "Logic Signal Blocker", "ITEM_LOGIC_SIGNAL_EMITTER": "Logic Signal Emitter", "ITEM_LOGIC_SIGNAL_LATCH": "Logic Signal Latch", diff --git a/assets/mods/basegame/locales/koKR/itemdesc.json b/assets/mods/basegame/locales/koKR/itemdesc.json index c1509eb9f..ae6d95bda 100644 --- a/assets/mods/basegame/locales/koKR/itemdesc.json +++ b/assets/mods/basegame/locales/koKR/itemdesc.json @@ -53,5 +53,6 @@ "TOOLTIP_item@basegame:35": "신호의 상태를 보여줍니다", "TOOLTIP_item@basegame:44": "지나가는 신호를 자르기 신호에 따라 자릅니다", "TOOLTIP_item@basegame:45": "들어오는 신호를 걸쇠 신호에 따라 잠시 저장합니다", - "TOOLTIP_item@basegame:46": "들어오는 신호를 살짝 지연시킵니다" + "TOOLTIP_item@basegame:46": "들어오는 신호를 살짝 지연시킵니다", + "TOOLTIP_item@basegame:49": "들어오는 신호의 합을 구합니다" } \ No newline at end of file diff --git a/assets/mods/basegame/locales/koKR/items.json b/assets/mods/basegame/locales/koKR/items.json index 8552989de..9edd53306 100644 --- a/assets/mods/basegame/locales/koKR/items.json +++ b/assets/mods/basegame/locales/koKR/items.json @@ -38,6 +38,7 @@ "ITEM_INGOT_TIN": "주석괴", "ITEM_INGOT_ZINC": "아연괴", "ITEM_JUKEBOX": "주크박스", + "ITEM_LOGIC_SIGNAL_ADDER": "신호 가산기", "ITEM_LOGIC_SIGNAL_BLOCKER": "신호 차단기", "ITEM_LOGIC_SIGNAL_EMITTER": "신호발생기", "ITEM_LOGIC_SIGNAL_LATCH": "신호 걸쇠", diff --git a/assets/mods/basegame/sprites/fixtures/signal_adder.tga b/assets/mods/basegame/sprites/fixtures/signal_adder.tga new file mode 100644 index 000000000..819554394 --- /dev/null +++ b/assets/mods/basegame/sprites/fixtures/signal_adder.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9448d8e121ebf0e65b61e5654846e27d7b70c3c0760c349d669c6b01aab2c156 +size 262162 diff --git a/assets/mods/basegame/sprites/fixtures/signal_adder_emsv.tga b/assets/mods/basegame/sprites/fixtures/signal_adder_emsv.tga new file mode 100644 index 000000000..080ad6649 --- /dev/null +++ b/assets/mods/basegame/sprites/fixtures/signal_adder_emsv.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25390d9d8d0092a498f4226462a5ffb07b6a22207899fd6b19ccfab48865743a +size 262162 diff --git a/assets/mods/basegame/sprites/fixtures/signal_blocker_emsv.tga b/assets/mods/basegame/sprites/fixtures/signal_blocker_emsv.tga index a96ddc7b3..5bc80b547 100644 --- a/assets/mods/basegame/sprites/fixtures/signal_blocker_emsv.tga +++ b/assets/mods/basegame/sprites/fixtures/signal_blocker_emsv.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62a14017b8622f02aba0a0ab6a3b4c58ba5003a1731fa84712569d9f7fc9e7dc +oid sha256:056f4a3311f8051bb506b10144579b7215daf0d3988cd7ae1e19dbf132784b7b size 262162 diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalAdder.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalAdder.kt new file mode 100644 index 000000000..a99272e0a --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalAdder.kt @@ -0,0 +1,152 @@ +package net.torvald.terrarum.modulebasegame.gameactors + +import net.torvald.spriteanimation.SheetSpriteAnimation +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.gameworld.fmod +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase +import net.torvald.terrarum.toInt +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import org.dyn4j.geometry.Vector2 + +/** + * Created by minjaesong on 2024-03-10. + */ +class FixtureLogicSignalAdder : Electric, Reorientable { + + @Transient override val spawnNeedsWall = false + @Transient override val spawnNeedsFloor = false + + constructor() : super( + BlockBox(BlockBox.NO_COLLISION, 2, 2), + nameFun = { Lang["ITEM_LOGIC_SIGNAL_ADDER"] } + ) + + override var orientation = 0 // 0 1 2 3 + + private fun setEmitterAndSink() { + clearStatus() + when (orientation) { + 0 -> { + setWireSinkAt(0, 0, "digital_bit") + setWireSinkAt(0, 1, "digital_bit") + setWireEmitterAt(1, 0, "digital_bit") + setWireEmitterAt(1, 1, "digital_bit") + } + 1 -> { + setWireSinkAt(1, 0, "digital_bit") + setWireSinkAt(0, 0, "digital_bit") + setWireEmitterAt(1, 1, "digital_bit") + setWireEmitterAt(0, 1, "digital_bit") + } + 2 -> { + setWireSinkAt(1, 1, "digital_bit") + setWireSinkAt(1, 0, "digital_bit") + setWireEmitterAt(0, 1, "digital_bit") + setWireEmitterAt(0, 0, "digital_bit") + } + 3 -> { + setWireSinkAt(0, 1, "digital_bit") + setWireSinkAt(1, 1, "digital_bit") + setWireEmitterAt(0, 0, "digital_bit") + setWireEmitterAt(1, 0, "digital_bit") + } + else -> throw IllegalStateException("Orientation not in range ($orientation)") + } + } + + private fun reorient() { + (sprite as SheetSpriteAnimation).currentFrame = orientation + (spriteEmissive as SheetSpriteAnimation).currentFrame = orientation + } + + override fun orientClockwise() { + orientation = (orientation + 1) fmod 4 + reorient(); setEmitterAndSink(); updateK() + } + override fun orientAnticlockwise() { + orientation = (orientation - 1) fmod 4 + reorient(); setEmitterAndSink(); updateK() + } + + init { + val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_adder.tga") + val itemImage2 = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/signal_adder_emsv.tga") + + density = 1400.0 + setHitboxDimension(2*TILE_SIZE, 2*TILE_SIZE, 0, 1) + + makeNewSprite(TextureRegionPack(itemImage.texture, 2*TILE_SIZE, 2*TILE_SIZE)).let { + it.setRowsAndFrames(16,4) + it.delays = FloatArray(16) { Float.POSITIVE_INFINITY } + } + makeNewSpriteEmissive(TextureRegionPack(itemImage2.texture, 2*TILE_SIZE, 2*TILE_SIZE)).let { + it.setRowsAndFrames(16,4) + it.delays = FloatArray(16) { Float.POSITIVE_INFINITY } + } + + setEmitterAndSink() + } + + override fun reload() { + super.reload() + reorient() + setEmitterAndSink() + updateK() + } + + private val I: Boolean + get() = when (orientation) { + 0 -> getWireStateAt(0, 0, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 1 -> getWireStateAt(1, 0, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 2 -> getWireStateAt(1, 1, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 3 -> getWireStateAt(0, 1, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + else -> throw IllegalStateException("Orientation not in range ($orientation)") + } + + private val J: Boolean + get() = when (orientation) { + 0 -> getWireStateAt(0, 1, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 1 -> getWireStateAt(0, 0, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 2 -> getWireStateAt(1, 0, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + 3 -> getWireStateAt(1, 1, "digital_bit").x >= ELECTRIC_THRESHOLD_HIGH + else -> throw IllegalStateException("Orientation not in range ($orientation)") + } + + private fun updateK() { + val (x1, y1) = when (orientation) { + 0 -> 1 to 0 + 1 -> 1 to 1 + 2 -> 0 to 1 + 3 -> 0 to 0 + else -> throw IllegalStateException("Orientation not in range ($orientation)") + } + val (x2, y2) = when (orientation) { + 0 -> 1 to 1 + 1 -> 0 to 1 + 2 -> 0 to 0 + 3 -> 1 to 0 + else -> throw IllegalStateException("Orientation not in range ($orientation)") + } + val output1 = (I xor J).toInt().toDouble() + val output2 = (I and J).toInt().toDouble() + setWireEmissionAt(x1, y1, Vector2(output1, 0.0)) + setWireEmissionAt(x2, y2, Vector2(output2, 0.0)) + + // update sprite + val one = isSignalHigh(0, 0) + val two = isSignalHigh(1, 0) + val four = isSignalHigh(0, 1) + val eight = isSignalHigh(1, 1) + + val state = one.toInt(0) or two.toInt(1) or four.toInt(2) or eight.toInt(3) + + (sprite as SheetSpriteAnimation).currentRow = state + (spriteEmissive as SheetSpriteAnimation).currentRow = state + } + + override fun updateSignal() { + updateK() + } + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalBlocker.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalBlocker.kt index 0b94e1a9a..b5cb973d2 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalBlocker.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemLogicSignalBlocker.kt @@ -87,4 +87,31 @@ class ItemLogicSignalRepeaterHorz(originalID: ItemID) : FixtureItemBase(original (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" } +} + +/** + * Created by minjaesong on 2024-03-10. + */ +class ItemLogicSignalAdder(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalAdder") { + + override var dynamicID: ItemID = originalID + override var baseMass = FixtureLogicSignalEmitter.MASS + override val canBeDynamic = false + override val materialId = "" + override val itemImage: TextureRegion + get() = CommonResourcePool.getAsItemSheet("basegame.items").get(14, 3) + + override var baseToolSize: Double? = baseMass + override var originalName = "ITEM_LOGIC_SIGNAL_ADDER" + + override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) { + super.effectWhileEquipped(actor, delta) + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "signal" + } + + override fun effectOnUnequip(actor: ActorWithBody) { + super.effectOnUnequip(actor) + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" + } + } \ No newline at end of file diff --git a/work_files/graphics/items/basegame_items.kra b/work_files/graphics/items/basegame_items.kra index e83a60290..963412709 100644 --- a/work_files/graphics/items/basegame_items.kra +++ b/work_files/graphics/items/basegame_items.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdfe3f0cc5878c4082acced3d2858bc4f712d124e2ba25c7f16c6f8d0cfb6251 -size 1536221 +oid sha256:7f2a20d3916aea109b502811f800de5767a5d3be5cbdd97741a6be4072120820 +size 1538298 diff --git a/work_files/graphics/wires/wire_single_items.kra b/work_files/graphics/wires/wire_single_items.kra index 49bde9d77..bddcecf2b 100644 --- a/work_files/graphics/wires/wire_single_items.kra +++ b/work_files/graphics/wires/wire_single_items.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e698c347662084aa0eaa4526ff18e77a54e2f07b9a11ce1572d3d05336b20c3a -size 573675 +oid sha256:b96209d2d093c86e91c700ba567db87981a6a76dedb65e7a995a86e1d8ea9d17 +size 599484