test copper sign and it has no sprite

This commit is contained in:
minjaesong
2024-03-20 03:33:24 +09:00
parent b856574d20
commit 8bf3d9666f
6 changed files with 210 additions and 16 deletions

View File

@@ -121,7 +121,12 @@ id;classname;tags
32777;net.torvald.terrarum.modulebasegame.gameitems.MusicDisc09;MUSIC,PHONO
# data storage (tapestries; 256)
#33023;net.torvald.terrarum.modulebasegame.gameitems.ItemTapestry;FIXTURE
#33024;net.torvald.terrarum.modulebasegame.gameitems.ItemTapestry;FIXTURE,BASEOBJECT
# data storage (text signs; 256)
33280;net.torvald.terrarum.modulebasegame.gameitems.ItemTextSignCopper;FIXTURE,BASEOBJECT
# fluids on storage
# preferably autogenerated
1 id classname tags
121 # 10FF00h..10FFFFh : Fluid type 255 (???) x container type 0..255 # 100500h..1005FFh : Fluid type 5 (steam) x container type 0..255
122 # ...
123 # 10FF00h..10FFFFh : Fluid type 255 (???) x container type 0..255
124
125
126
127
128
129
130
131
132

View File

@@ -27,6 +27,7 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
@Transient open val spawnNeedsWall: Boolean = false
@Transient open val spawnNeedsFloor: Boolean = true
@Transient open val spawnNeedsCeiling: Boolean = false
// if both spawnNeedsWall and spawnNeedsFloor are true, the condition will be interpreted as OR-condition
@@ -178,8 +179,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
}
// check for floors, if spawnNeedsFloor == true
if (spawnNeedsFloor) {
val y = posY + blockBox.height
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 {
@@ -188,9 +189,9 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
}
}
if (spawnNeedsWall && spawnNeedsFloor)
if (spawnNeedsWall && (spawnNeedsFloor || spawnNeedsCeiling))
cannotSpawn = cannotSpawn or (cannotSpawnNoWall && cannotSpawnNoFloor)
else if (spawnNeedsFloor)
else if (spawnNeedsFloor || spawnNeedsCeiling)
cannotSpawn = cannotSpawn or cannotSpawnNoFloor
else if (spawnNeedsWall)
cannotSpawn = cannotSpawn or cannotSpawnNoWall
@@ -210,10 +211,14 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
var soundSource =
if (spawnNeedsWall) 1
else if (spawnNeedsFloor) 0
else if (spawnNeedsCeiling) 3
else 2
// 1: wall, 0: floor, 2: if wall is not solid, use wall; else, use floor
val wallTile = world!!.getTileFromWall(posXc, posYb)
val terrTile = world!!.getTileFromTerrain(posXc, posYb + 1)
val terrTile = if (soundSource == 3)
world!!.getTileFromTerrain(posXc, posYb - blockBox.height)
else
world!!.getTileFromTerrain(posXc, posYb + 1)
if (soundSource == 2) {
soundSource = if (BlockCodex[wallTile].isSolid)
@@ -224,7 +229,7 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
when (soundSource) {
1 -> PickaxeCore.makeNoiseTileBurst(this, wallTile)
0 -> PickaxeCore.makeNoiseTileBurst(this, terrTile)
0, 3 -> PickaxeCore.makeNoiseTileBurst(this, terrTile)
}
// make some dust
@@ -235,6 +240,13 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange {
PickaxeCore.makeDust(tile, x, y - 1, 4 + (Math.random() + Math.random()).roundToInt())
}
}
else if (soundSource == 3) {
val y = posY
for (x in posX until posX + blockBox.width) {
val tile = world!!.getTileFromTerrain(x, y)
PickaxeCore.makeDust(tile, x, y - 1, 4 + (Math.random() + Math.random()).roundToInt())
}
}
else {
for (y in posY until posY + blockBox.height) {
for (x in posX until posX + blockBox.width) {

View File

@@ -34,16 +34,16 @@ internal class FixtureTapestry : FixtureBase {
private var tilewiseHitboxWidth by Delegates.notNull<Int>()
private var tilewiseHitboxHeight by Delegates.notNull<Int>()
private constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 1, 1),
renderOrder = RenderOrder.BEHIND,
nameFun = { Lang["ITEM_TAPESTRY"] }
constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 1, 1),
renderOrder = RenderOrder.BEHIND,
nameFun = { Lang["ITEM_TAPESTRY"] }
)
constructor(rawBytes: ByteArray, framingMaterial: ItemID) : super(
BlockBox(BlockBox.NO_COLLISION, 1, 1),
renderOrder = RenderOrder.BEHIND,
nameFun = { Lang["ITEM_TAPESTRY"] }
BlockBox(BlockBox.NO_COLLISION, 1, 1),
renderOrder = RenderOrder.BEHIND,
nameFun = { Lang["ITEM_TAPESTRY"] }
) {
this.rawBytes = rawBytes
this.frameBlock = framingMaterial

View File

@@ -0,0 +1,151 @@
package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.graphics.Pixmap
import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.spriteanimation.SheetSpriteAnimation
import net.torvald.terrarum.App
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.ModMgr
import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.toInt
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack
import java.util.*
/**
* Created by minjaesong on 2024-03-20.
*/
class FixtureTextSignCopper : Electric {
@Transient override val spawnNeedsCeiling = true
@Transient override val spawnNeedsFloor = false
@Transient override val spawnNeedsWall = false
var text = "헬로 월드!"
var panelCount = 5
constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 2, 2),
renderOrder = RenderOrder.BEHIND,
nameFun = { Lang["ITEM_COPPER_SIGN"] }
)
override fun spawn(posX: Int, posY: Int, installersUUID: UUID?): Boolean = spawn(posX, posY, installersUUID, panelCount.coerceAtLeast(2), 2)
override fun reload() {
super.reload()
// must be re-spawned on reload to make it visible after load
spawn(
intTilewiseHitbox.canonicalX.toInt(),
intTilewiseHitbox.canonicalY.toInt(),
actorThatInstalledThisFixture,
panelCount.coerceAtLeast(2),
2
)
setEmitterAndSink()
setSprites(panelCount)
updateSignal()
}
private fun setEmitterAndSink() {
clearStatus()
setWireSinkAt(0, 0, "digital_bit")
setWireSinkAt(panelCount - 1, 0, "digital_bit")
}
init {
CommonResourcePool.addToLoadingList("pixmap:copper_sign") {
Pixmap(ModMgr.getGdxFile("basegame", "sprites/fixtures/text_sign_glass_copper.tga"))
}
CommonResourcePool.loadAll()
}
@Transient private var textOverlay: SheetSpriteAnimation? = null
@Transient private var textOverlayEmissive: SheetSpriteAnimation? = null
/**
* This only constructs the base panel
*/
private fun setSprites(panelCount: Int) {
val panelCount = panelCount.coerceAtLeast(2)
val pixmap = CommonResourcePool.getAs<Pixmap>("pixmap:copper_sign")
val W = TILE_SIZE
val H = 4 * TILE_SIZE
val ROW0 = 0
val ROW1 = H
val pixmapSprite = Pixmap(W * panelCount, H, Pixmap.Format.RGBA8888)
val pixmapSpriteEmsv = Pixmap(W * panelCount, H, Pixmap.Format.RGBA8888)
val pixmapOverlay = Pixmap(W * panelCount, H, Pixmap.Format.RGBA8888)
val pixmapOverlayEmsv = Pixmap(W * panelCount, H, Pixmap.Format.RGBA8888)
pixmapSprite.drawPixmap(pixmap, 0, 0, 0, ROW0, W, H)
pixmapSprite.drawPixmap(pixmap, W * (panelCount - 1), 0, 32, ROW0, W, H)
pixmapSpriteEmsv.drawPixmap(pixmap, 0, 0, 0, ROW1, W, H)
pixmapSpriteEmsv.drawPixmap(pixmap, W * (panelCount - 1), 0, 32, ROW1, W, H)
for (mid in 1 until panelCount - 1) {
pixmapSprite.drawPixmap(pixmap, W * mid, 0, 16, ROW0, W, H)
pixmapSpriteEmsv.drawPixmap(pixmap, W * mid, 0, 16, ROW1, W, H)
}
for (tiles in 0 until panelCount) {
pixmapOverlay.drawPixmap(pixmap, W * tiles, 0, 48, ROW0, W, H)
pixmapOverlayEmsv.drawPixmap(pixmap, W * tiles, 0, 48, ROW1, W, H)
}
makeNewSprite(TextureRegionPack(Texture(pixmapSprite), W * panelCount, H / 2)).let {
it.setRowsAndFrames(2, 1)
it.delays = FloatArray(1) { Float.POSITIVE_INFINITY }
}
makeNewSpriteEmissive(TextureRegionPack(Texture(pixmapSpriteEmsv), W * panelCount, H / 2)).let {
it.setRowsAndFrames(2, 1)
it.delays = FloatArray(1) { Float.POSITIVE_INFINITY }
}
textOverlay = SheetSpriteAnimation(this).also {
it.setSpriteImage(TextureRegionPack(Texture(pixmapOverlay), W, H / 2))
it.setRowsAndFrames(2, 1)
}
textOverlayEmissive = SheetSpriteAnimation(this).also {
it.setSpriteImage(TextureRegionPack(Texture(pixmapOverlayEmsv), W, H / 2))
it.setRowsAndFrames(2, 1)
}
pixmapSprite.dispose()
pixmapSpriteEmsv.dispose()
pixmapOverlay.dispose()
pixmapOverlayEmsv.dispose()
}
@Transient var lit = true
override fun drawEmissive(frameDelta: Float, batch: SpriteBatch) {
super.drawEmissive(frameDelta, batch)
}
override fun drawBody(frameDelta: Float, batch: SpriteBatch) {
super.drawBody(frameDelta, batch)
}
override fun updateSignal() {
lit = !(isSignalHigh(0, 0) || isSignalHigh(panelCount - 1, 0)) // isHigh and isLow are not mutually exclusive!
(sprite as? SheetSpriteAnimation)?.currentRow = 1 - lit.toInt()
(spriteEmissive as? SheetSpriteAnimation)?.currentRow = 1 - lit.toInt()
textOverlay?.currentRow = 1 - lit.toInt()
textOverlayEmissive?.currentRow = 1 - lit.toInt()
}
override fun dispose() {
super.dispose()
if (textOverlay != null) App.disposables.add(textOverlay)
if (textOverlayEmissive != null) App.disposables.add(textOverlayEmissive)
}
}

View File

@@ -0,0 +1,26 @@
package net.torvald.terrarum.modulebasegame.gameitems
import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gameitems.ItemID
import net.torvald.terrarum.modulebasegame.TerrarumIngame
import net.torvald.terrarum.modulebasegame.gameactors.FixtureLogicSignalEmitter
/**
* Created by minjaesong on 2024-03-20.
*/
class ItemTextSignCopper(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureTextSignCopper") {
override var dynamicID: ItemID = originalID
override var baseMass = 10.0
override val canBeDynamic = false
override val materialId = ""
override val itemImage: TextureRegion
get() = CommonResourcePool.getAsItemSheet("basegame.items").get(10, 3)
override var baseToolSize: Double? = baseMass
override var originalName = "ITEM_COPPER_SIGN"
}