From 0e58879216207b0a3216c0a59fe8f969a2fd4d72 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 3 Oct 2024 21:35:52 +0900 Subject: [PATCH] axle test with test-motor --- assets/mods/basegame/items/itemid.csv | 2 +- .../sprites/fixtures/induction_motor.tga | 3 ++ src/net/torvald/terrarum/Terrarum.kt | 1 + .../torvald/terrarum/gameactors/WireActor.kt | 30 ++++++++++- .../terrarum/modulebasegame/WorldSimulator.kt | 2 +- .../gameactors/FixtureInductionMotor.kt | 53 +++++++++++++++++++ .../gameitems/ItemInductionMotor.kt | 37 +++++++++++++ .../modulebasegame/ui/UIQuickslotBar.kt | 6 +-- .../modulebasegame/ui/UIQuickslotPie.kt | 3 +- .../sprites/fixtures/induction_motor.kra | 3 ++ 10 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 assets/mods/basegame/sprites/fixtures/induction_motor.tga create mode 100644 src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt create mode 100644 src/net/torvald/terrarum/modulebasegame/gameitems/ItemInductionMotor.kt create mode 100644 work_files/graphics/sprites/fixtures/induction_motor.kra diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index b106f5cd3..6736164dc 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -57,7 +57,7 @@ id;classname;tags 56;net.torvald.terrarum.modulebasegame.gameitems.ItemClayBrick; 57;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalPushbutton;FIXTURE,SIGNAL 58;net.torvald.terrarum.modulebasegame.gameitems.ItemLogicSignalPressurePlate;FIXTURE,SIGNAL - +59;net.torvald.terrarum.modulebasegame.gameitems.ItemInductionMotor;FIXTURE,POWER,KINETIC # ingots diff --git a/assets/mods/basegame/sprites/fixtures/induction_motor.tga b/assets/mods/basegame/sprites/fixtures/induction_motor.tga new file mode 100644 index 000000000..167cd3869 --- /dev/null +++ b/assets/mods/basegame/sprites/fixtures/induction_motor.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f802c88655ca3dcd4d54c8427c05847b844a55f4d773190d2c6986755f7c224e +size 4114 diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 767a708a6..5026d6601 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -1055,3 +1055,4 @@ fun List.cartesianProduct(other: List) = this.flatMap { thisIt -> fun Float.ditherToInt() = (this + Math.random() - 0.5).roundToInt() fun Double.ditherToInt() = (this + Math.random() - 0.5).roundToInt() +fun Double.ditherToLong() = (this + Math.random() - 0.5).roundToLong() diff --git a/src/net/torvald/terrarum/gameactors/WireActor.kt b/src/net/torvald/terrarum/gameactors/WireActor.kt index 34ee51a31..2f3bd2743 100644 --- a/src/net/torvald/terrarum/gameactors/WireActor.kt +++ b/src/net/torvald/terrarum/gameactors/WireActor.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* +import net.torvald.terrarum.App.UPDATE_RATE import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.gameitems.ItemID @@ -11,6 +12,7 @@ import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.WireEmissionType import net.torvald.terrarum.ui.Toolkit import kotlin.math.cos +import kotlin.math.roundToLong /** * Created by minjaesong on 2024-03-05. @@ -57,11 +59,33 @@ class WireActor : ActorWithBody, NoSerialise, InternalActor { this.worldY = worldY setPosition((worldX + 0.5) * TILE_SIZE, (worldY + 1.0) * TILE_SIZE - 1.0) // what the fuck? - (sprite as SheetSpriteAnimation).currentRow = 0 (sprite as SheetSpriteAnimation).currentFrame = cnx } + override fun updateImpl(delta: Float) { + // axles: animate by changing currentRow + if (WireCodex.wireProps[wireID]?.accepts == "axle") { + val speed = world?.getWireEmitStateOf(worldX, worldY, wireID)?.x ?: 0.0 + val targetTick = (App.TICK_SPEED / speed).let { + it.coerceIn(0.0, Long.MAX_VALUE.toDouble()) + }.roundToLong() + + val sprite = (sprite as SheetSpriteAnimation) + val cnx = sprite.currentFrame + + val phaseShift = if (cnx == 5) (worldY % 2 == 0) else (worldX % 2 == 0) + + if (targetTick > 0) { + (INGAME.WORLD_UPDATE_TIMER % (targetTick * 2)).let { + sprite.currentRow = + if (phaseShift) + (it < targetTick).toInt() + else + (it >= targetTick).toInt() + } + } + } } private fun essfun0(x: Double) = -cos(Math.PI * x) / 2.0 + 0.5 @@ -85,6 +109,10 @@ class WireActor : ActorWithBody, NoSerialise, InternalActor { (sprite as SheetSpriteAnimation).currentRow = 1 drawSpriteInGoodPosition(frameDelta, sprite!!, batch, 0, alpha) } + // axles? + else if (WireCodex.wireProps[wireID]?.accepts == "axle") { + drawSpriteInGoodPosition(frameDelta, sprite!!, batch, 0, Color.WHITE) + } 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 aa4ccc38c..74bcea764 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -531,7 +531,7 @@ object WorldSimulator { } private fun calculateDecay(signal: Vector2, dist: Int, wire: ItemID, signalType: WireEmissionType): Vector2 { - val d = WireCodex.wireDecays[wire]!! + val d = WireCodex.wireDecays[wire] ?: 1.0 return signal * d.pow(dist.toDouble()) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt new file mode 100644 index 000000000..1cd3303a4 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt @@ -0,0 +1,53 @@ +package net.torvald.terrarum.modulebasegame.gameactors + +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase +import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.tooltipShowing +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import org.dyn4j.geometry.Vector2 + +/** + * Created by minjaesong on 2024-10-03. + */ +class FixtureInductionMotor : Electric { + + @Transient override val spawnNeedsFloor = true + @Transient override val spawnNeedsWall = false + + constructor() : super( + BlockBox(BlockBox.NO_COLLISION, 1, 1), + nameFun = { Lang["ITEM_INDUCTION_MOTOR"] } + ) + + init { + val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/induction_motor.tga") + + density = 7874.0 + setHitboxDimension(TILE_SIZE, TILE_SIZE, 0, 0) + + makeNewSprite(TextureRegionPack(itemImage.texture, TILE_SIZE, TILE_SIZE)).let { + it.setRowsAndFrames(1,1) + } + + actorValue[AVKey.BASEMASS] = MASS + + setWireEmitterAt(0, 0, "axle") + setWireEmissionAt(0, 0, Vector2(16.0, 1024.0)) // speed and torque + } + + override fun updateSignal() { + setWireEmissionAt(0, 0, Vector2(16.0, 1024.0)) // speed and torque + } + + override fun dispose() { + tooltipShowing.remove(tooltipHash) + } + + companion object { + const val MASS = 20.0 + } + + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemInductionMotor.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemInductionMotor.kt new file mode 100644 index 000000000..0b58fe9c3 --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemInductionMotor.kt @@ -0,0 +1,37 @@ +package net.torvald.terrarum.modulebasegame.gameitems + +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.modulebasegame.TerrarumIngame +import net.torvald.terrarum.modulebasegame.gameactors.FixtureInductionMotor + +/** + * Created by minjaesong on 2024-10-03. + */ +class ItemInductionMotor(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureInductionMotor") { + + override var dynamicID: ItemID = originalID + override var baseMass = FixtureInductionMotor.MASS + override val canBeDynamic = false + override val materialId = "" + init { + itemImage = getItemImageFromSheet("basegame", "sprites/fixtures/induction_motor.tga", TILE_SIZE, TILE_SIZE) + } + + override var baseToolSize: Double? = baseMass + override var originalName = "ITEM_INDUCTION_MOTOR" + override var inventoryCategory = Category.FIXTURE + + override fun effectWhileEquipped(actor: ActorWithBody, delta: Float) { + super.effectWhileEquipped(actor, delta) + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "axle" + } + + override fun effectOnUnequip(actor: ActorWithBody) { + super.effectOnUnequip(actor) + (Terrarum.ingame!! as TerrarumIngame).selectedWireRenderClass = "" + } + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt index 578f43240..49483ee20 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.toItemCountText +import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UINotControllable import kotlin.math.roundToInt @@ -47,6 +48,7 @@ class UIQuickslotBar : UICanvas() { const val SLOT_COUNT = 10 const val DISPLAY_OPACITY = 0.92f const val COMMON_OPEN_CLOSE = 0.12f + val QUICKSLOT_ITEMCOUNT_TEXTCOL = Color(0xde4185ff.toInt()) } @@ -98,8 +100,6 @@ class UIQuickslotBar : UICanvas() { private val drawColor = Color(1f, 1f, 1f, 1f) - private val itemCntTextCol = Color(0x404040ff) - override fun renderImpl(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) { (Terrarum.ingame!! as TerrarumIngame).actorNowPlaying?.let { actor -> @@ -139,7 +139,7 @@ class UIQuickslotBar : UICanvas() { } else if (item.stackable) { val amountString = qs!!.qty.toItemCountText() - batch.color = Color(0xfff066_ff.toInt()) + batch.color = QUICKSLOT_ITEMCOUNT_TEXTCOL val textLen = amountString.length * App.fontSmallNumbers.W val y = slotY + 25 - App.fontSmallNumbers.H val x = slotX - 19 + (38 - textLen) / 2 diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt index 1ce22c0cd..11dc897e4 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.toItemCountText import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.COMMON_OPEN_CLOSE +import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.QUICKSLOT_ITEMCOUNT_TEXTCOL import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.SLOT_COUNT import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas @@ -110,7 +111,7 @@ class UIQuickslotPie : UICanvas() { } else if (item.stackable) { val amountString = qs!!.qty.toItemCountText() - batch.color = Color(0xfff066_ff.toInt()) + batch.color = QUICKSLOT_ITEMCOUNT_TEXTCOL val textLen = amountString.length * App.fontSmallNumbers.W val y = slotY + 25 - App.fontSmallNumbers.H val x = slotX - 19 + (38 - textLen) / 2 diff --git a/work_files/graphics/sprites/fixtures/induction_motor.kra b/work_files/graphics/sprites/fixtures/induction_motor.kra new file mode 100644 index 000000000..c41796ac1 --- /dev/null +++ b/work_files/graphics/sprites/fixtures/induction_motor.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd171521f383950849a7446e13427a8700c2166261d7ceea5a74224a929a3f51 +size 140571