From af0be41a82032e0f4a5c7a2a51deeeea5e9ca0c5 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 4 Oct 2024 01:22:45 +0900 Subject: [PATCH] more flexible blockbox definition and their utilisation --- .../sprites/fixtures/induction_motor.tga | 4 +-- .../gameactors/FixtureAlloyingFurnace.kt | 18 ++++--------- .../modulebasegame/gameactors/FixtureBase.kt | 27 +++++++++++-------- .../gameactors/FixtureFurnaceAndAnvil.kt | 17 ++++-------- .../gameactors/FixtureInductionMotor.kt | 15 ++++++++++- .../gameactors/FixtureLogicSignalSevenSeg.kt | 21 +++++---------- .../gameactors/FixtureSmelterBasic.kt | 20 +++++--------- .../gameactors/FixtureSwingingDoorBase.kt | 4 +-- .../modulebasegame/ui/UIQuickslotBar.kt | 3 ++- .../sprites/fixtures/induction_motor.kra | 4 +-- 10 files changed, 61 insertions(+), 72 deletions(-) diff --git a/assets/mods/basegame/sprites/fixtures/induction_motor.tga b/assets/mods/basegame/sprites/fixtures/induction_motor.tga index 167cd3869..34fa6cb2e 100644 --- a/assets/mods/basegame/sprites/fixtures/induction_motor.tga +++ b/assets/mods/basegame/sprites/fixtures/induction_motor.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f802c88655ca3dcd4d54c8427c05847b844a55f4d773190d2c6986755f7c224e -size 4114 +oid sha256:db55e28ccfc18cde025cd191272b9e1a9a7a8590f9d9fe2142f671c12062be90 +size 1042 diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt index c3f3f5562..cc1a7f321 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt @@ -176,21 +176,13 @@ class FixtureAlloyingFurnace : FixtureBase { @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 0.0, TILE_SIZED * 2, TILE_SIZED * 2), light)) - @Transient private val actorBlocks = arrayOf( - arrayOf(Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION), - ) - - override fun placeActorBlocks() { - forEachBlockbox { x, y, ox, oy -> - val tile = actorBlocks[oy][ox] - if (tile != null) { - world!!.setTileTerrain(x, y, tile, true) - } - } + override fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return listOf( + (posX+0 to posY+0), + (posX+0 to posY+1), (posX+1 to posY+1), + ) } - private var nextDelayBase = 0.25f // use smokiness value of the item private var nextDelay = 0.25f // use smokiness value of the item private var spawnTimer = 0f diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt index cb9a52d20..837797576 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt @@ -6,7 +6,6 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.* -import net.torvald.terrarum.gameitems.GameItem import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.langpack.Lang @@ -129,10 +128,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { open fun forEachBlockbox(action: (Int, Int, Int, Int) -> Unit) { // TODO scale-aware worldBlockPos?.let { (posX, posY) -> - for (y in posY until posY + blockBox.height) { - for (x in posX until posX + blockBox.width) { - action(x, y, x - posX, y - posY) - } + getBlockBoxPositions(posX, posY).forEach { (x, y) -> + action(x, y, x - posX, y - posY) } } } @@ -147,7 +144,7 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { } // something like TapestryObject will want to redefine this - open protected fun placeActorBlocks() { + protected open fun placeActorBlocks() { forEachBlockbox { x, y, _, _ -> //printdbg(this, "fillerblock ${blockBox.collisionType} at ($x, $y)") if (blockBox.collisionType == BlockBox.ALLOW_MOVE_DOWN) { @@ -175,8 +172,17 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { return canSpawnHere0(posX, posY) } + /** + * @param posX start position of the BlockBox, top-left + * @param posY start position of the BlockBox, top-left + * @return real block positions, in List of Pair(x, y) + */ + open fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return (posX until posX + blockBox.width).toList().cartesianProduct((posY until posY + blockBox.height).toList()) + } + open fun canSpawnHere0(posX: Int, posY: Int): Boolean { - val everyBlockboxPos = (posX until posX + blockBox.width).toList().cartesianProduct((posY until posY + blockBox.height).toList()) + val everyBlockboxPos = getBlockBoxPositions(posX, posY) // check for existing blocks (and fixtures) var cannotSpawn = false @@ -195,10 +201,9 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { // check for floors, if spawnNeedsFloor == true if (spawnNeedsFloor || spawnNeedsCeiling) { - val y = posY + if (spawnNeedsFloor) blockBox.height else -1 - val xs = posX until posX + blockBox.width - cannotSpawnNoFloor = xs.any { x -> - world!!.getTileFromTerrain(x, y).let { + val yOff = if (spawnNeedsFloor) 1 else -1 + cannotSpawnNoFloor = everyBlockboxPos.filter { if (spawnNeedsFloor) it.second == posY + blockBox.height - 1 else it.second == posY }.any { (x, y) -> + world!!.getTileFromTerrain(x, y + yOff).let { !canSpawnOnThisFloor(it) } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt index 364a44689..d16de6535 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt @@ -61,20 +61,13 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 0.0, TerrarumAppConfiguration.TILE_SIZED * 2, TerrarumAppConfiguration.TILE_SIZED * 2), Cvec(0.5f, 0.18f, 0f, 0f))) - @Transient private val actorBlocks = arrayOf( - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION), - ) - override fun placeActorBlocks() { - forEachBlockbox { x, y, ox, oy -> - val tile = actorBlocks[oy][ox] - if (tile != null) { - world!!.setTileTerrain(x, y, tile, true) - } - } + override fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return listOf( + (posX+0 to posY+0), (posX+1 to posY+0), + (posX+0 to posY+1), (posX+1 to posY+1), (posX+2 to posY+1) + ) } - private var nextDelay = 0.25f private var spawnTimer = 0f diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt index 1cd3303a4..457267acf 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureInductionMotor.kt @@ -17,10 +17,20 @@ class FixtureInductionMotor : Electric { @Transient override val spawnNeedsWall = false constructor() : super( - BlockBox(BlockBox.NO_COLLISION, 1, 1), + BlockBox(BlockBox.NO_COLLISION, 3, 1), nameFun = { Lang["ITEM_INDUCTION_MOTOR"] } ) + override fun placeActorBlocks() { + worldBlockPos?.let { (x, y) -> + world!!.setTileTerrain(x+1, y, blockBox.collisionType, true) + } + } + + override fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return listOf(posX+1 to posY) + } + init { val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/induction_motor.tga") @@ -34,11 +44,14 @@ class FixtureInductionMotor : Electric { actorValue[AVKey.BASEMASS] = MASS setWireEmitterAt(0, 0, "axle") + setWireEmitterAt(2, 0, "axle") setWireEmissionAt(0, 0, Vector2(16.0, 1024.0)) // speed and torque + setWireEmissionAt(2, 0, Vector2(16.0, 1024.0)) // speed and torque } override fun updateSignal() { setWireEmissionAt(0, 0, Vector2(16.0, 1024.0)) // speed and torque + setWireEmissionAt(2, 0, Vector2(16.0, 1024.0)) // speed and torque } override fun dispose() { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalSevenSeg.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalSevenSeg.kt index f5a9c0b52..93373be30 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalSevenSeg.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureLogicSignalSevenSeg.kt @@ -21,20 +21,13 @@ class FixtureLogicSignalSevenSeg : Electric { nameFun = { Lang["ITEM_LOGIC_SIGNAL_DISPLAY"] } ) - - @Transient private val actorBlocks = arrayOf( - arrayOf(null, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(null, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(null, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION), - ) - override fun placeActorBlocks() { - forEachBlockbox { x, y, ox, oy -> - val tile = actorBlocks[oy][ox] - if (tile != null) { - world!!.setTileTerrain(x, y, tile, true) - } - } + override fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return listOf( + (posX+1 to posY+0), (posX+2 to posY+0), + (posX+1 to posY+1), (posX+2 to posY+1), + (posX+1 to posY+2), (posX+2 to posY+2), + (posX+0 to posY+3), (posX+1 to posY+3), (posX+2 to posY+3), (posX+3 to posY+3) + ) } init { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index 489780218..bf1706add 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -161,19 +161,13 @@ class FixtureSmelterBasic : FixtureBase { @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 2*TILE_SIZED, TILE_SIZED * 2, TILE_SIZED * 2), light)) - @Transient private val actorBlocks = arrayOf( - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, null), - arrayOf(Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION, Block.ACTORBLOCK_NO_COLLISION), - ) - override fun placeActorBlocks() { - forEachBlockbox { x, y, ox, oy -> - val tile = actorBlocks[oy][ox] - if (tile != null) { - world!!.setTileTerrain(x, y, tile, true) - } - } + override fun getBlockBoxPositions(posX: Int, posY: Int): List> { + return listOf( + (posX+0 to posY+0), (posX+1 to posY+0), + (posX+0 to posY+1), (posX+1 to posY+1), + (posX+0 to posY+2), (posX+1 to posY+2), + (posX+0 to posY+3), (posX+1 to posY+3), (posX+2 to posY+3) + ) } private var nextDelayBase = 0.25f // use smokiness value of the item diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt index 47e90316f..aaede77ec 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.Gdx import net.torvald.gdx.graphics.Cvec import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* @@ -9,7 +8,6 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.* -import net.torvald.terrarum.gameitems.mouseInInteractableRange import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack @@ -191,7 +189,7 @@ open class FixtureSwingingDoorBase : FixtureBase { } override fun canSpawnHere0(posX: Int, posY: Int): Boolean { - val everyBlockboxPos = (posX until posX + blockBox.width).toList().cartesianProduct((posY until posY + blockBox.height).toList()) + val everyBlockboxPos = getBlockBoxPositions(posX, posY) val xoffToFrame = (tilewiseHitboxWidth - twClosed) / 2 val everyDoorframePos = (posX + xoffToFrame until posX + blockBox.width - 1).toList().cartesianProduct((posY until posY + blockBox.height).toList()) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt index 49483ee20..8f42f98d9 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt @@ -48,7 +48,8 @@ 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()) +// val QUICKSLOT_ITEMCOUNT_TEXTCOL = Color(0xdb6f00ff.toInt()) + val QUICKSLOT_ITEMCOUNT_TEXTCOL = Color(0x0099bbff.toInt()) } diff --git a/work_files/graphics/sprites/fixtures/induction_motor.kra b/work_files/graphics/sprites/fixtures/induction_motor.kra index c41796ac1..ef9cc6c2a 100644 --- a/work_files/graphics/sprites/fixtures/induction_motor.kra +++ b/work_files/graphics/sprites/fixtures/induction_motor.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd171521f383950849a7446e13427a8700c2166261d7ceea5a74224a929a3f51 -size 140571 +oid sha256:beb197bfef2de54b1aaa6541926fab1a149b74468fba0dfcaf372ea6f3bf37fa +size 80378