diff --git a/src/net/torvald/terrarum/gameactors/Hitbox.kt b/src/net/torvald/terrarum/gameactors/Hitbox.kt index 6369f695d..bb8690d05 100644 --- a/src/net/torvald/terrarum/gameactors/Hitbox.kt +++ b/src/net/torvald/terrarum/gameactors/Hitbox.kt @@ -103,6 +103,9 @@ class Hitbox (x1: Double, y1: Double, width: Double, height: Double, var suppres fun setPositionX(x: Double) = setPosition(x, startY) fun setPositionY(y: Double) = setPosition(startX, y) + /** + * Set position from bottom-centre point + */ fun setPositionFromPointed(x1: Double, y1: Double): Hitbox { hitboxStart = Point2d(x1 - width / 2, y1 - height) return this diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleBase.kt b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt similarity index 77% rename from src/net/torvald/terrarum/modulebasegame/gameactors/ParticleBase.kt rename to src/net/torvald/terrarum/gameparticles/ParticleBase.kt index fdc630399..4eba6c631 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleBase.kt +++ b/src/net/torvald/terrarum/gameparticles/ParticleBase.kt @@ -1,9 +1,9 @@ -package net.torvald.terrarum.modulebasegame.gameactors +package net.torvald.terrarum.gameparticles +import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.* -import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.Actor @@ -25,8 +25,9 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision var isNoSubjectToGrav = false var dragCoefficient = 3.0 - private val lifetimeMax = maxLifeTime ?: 5f - private var lifetimeCounter = 0f + val lifetimeMax = maxLifeTime ?: 5f + var lifetimeCounter = 0f + protected set val velocity = Vector2(0.0, 0.0) val hitbox = Hitbox(0.0, 0.0, 0.0, 0.0) @@ -34,19 +35,21 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision open lateinit var body: TextureRegion // you might want to use SpriteAnimation open var glow: TextureRegion? = null + val drawColour = Color(1f, 1f, 1f, 1f) + init { } - fun update(delta: Float) { + open fun update(delta: Float) { if (!flagDespawn) { lifetimeCounter += delta if (despawnUponCollision) { if (velocity.isZero || // simple stuck check BlockCodex[(Terrarum.ingame!!.world).getTileFromTerrain( - hitbox.canonicalX.div(TILE_SIZE).floorInt(), - hitbox.canonicalY.div(TILE_SIZE).floorInt() + hitbox.canonicalX.div(TerrarumAppConfiguration.TILE_SIZE).floorInt(), + hitbox.canonicalY.div(TerrarumAppConfiguration.TILE_SIZE).floorInt() ) ?: Block.STONE].isSolid) { flagDespawn = true } @@ -67,15 +70,21 @@ open class ParticleBase(renderOrder: Actor.RenderOrder, val despawnUponCollision } } - fun drawBody(batch: SpriteBatch) { + open fun drawBody(batch: SpriteBatch) { if (!flagDespawn) { + batch.color = drawColour batch.draw(body, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat()) } } - fun drawGlow(batch: SpriteBatch) { + open fun drawGlow(batch: SpriteBatch) { if (!flagDespawn && glow != null) { + batch.color = drawColour batch.draw(glow, hitbox.startX.toFloat(), hitbox.startY.toFloat(), hitbox.width.toFloat(), hitbox.height.toFloat()) } } + + open fun dispose() { + + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameparticles/ParticleVanishingTexture.kt b/src/net/torvald/terrarum/gameparticles/ParticleVanishingTexture.kt new file mode 100644 index 000000000..732e9f2b8 --- /dev/null +++ b/src/net/torvald/terrarum/gameparticles/ParticleVanishingTexture.kt @@ -0,0 +1,58 @@ +package net.torvald.terrarum.gameparticles + +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.badlogic.gdx.graphics.g2d.TextureRegion +import net.torvald.terrarum.gameactors.Actor +import net.torvald.terrarum.imagefont.TinyAlphNum + +/** + * @param tex image + * @param x x-coord of the particle's initial spawn position, bottom-centre + * @param y y-coord of the particle's initial spawn position, bottom-centre + */ +open class ParticleVanishingTexture(val tex: TextureRegion, x: Double, y: Double) : ParticleBase(Actor.RenderOrder.OVERLAY, false, 2f) { + + init { + velocity.set(0.0, -1.0) + hitbox.setDimension(2.0, 2.0) + hitbox.setPositionFromPointed(x, y) + + body = tex + + isNoSubjectToGrav = true + } + + override fun update(delta: Float) { + super.update(delta) + + drawColour.a = (lifetimeMax - lifetimeCounter) / lifetimeMax + } +} + +class ParticleVanishingText(val text: String, x: Double, y: Double) : ParticleBase(Actor.RenderOrder.OVERLAY, false, 2f) { + + private val lines = text.split('\n') + + init { + velocity.set(0.0, -1.0) + + hitbox.setDimension(lines.maxOf { TinyAlphNum.getWidth(it) }.toDouble(), lines.size * TinyAlphNum.H.toDouble()) + hitbox.setPositionFromPointed(x, y) + + isNoSubjectToGrav = true + } + + override fun update(delta: Float) { + super.update(delta) + drawColour.a = (lifetimeMax - lifetimeCounter) / lifetimeMax + } + + override fun drawBody(batch: SpriteBatch) { + if (!flagDespawn) { + batch.color = drawColour + lines.forEachIndexed { index, line -> + TinyAlphNum.draw(batch, line, hitbox.startX.toFloat(), hitbox.startY.toFloat() + TinyAlphNum.H * index) + } + } + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/imagefont/TinyAlphNum.kt b/src/net/torvald/terrarum/imagefont/TinyAlphNum.kt index 544d65563..f1e41f86d 100644 --- a/src/net/torvald/terrarum/imagefont/TinyAlphNum.kt +++ b/src/net/torvald/terrarum/imagefont/TinyAlphNum.kt @@ -24,7 +24,13 @@ object TinyAlphNum : BitmapFont() { } fun getWidth(str: String): Int { - return W * str.length + var l = 0 + for (char in str) { + if (!isColourCodeHigh(char) && !isColourCodeLow(char)) { + l += 1 + } + } + return W * l } lateinit var colMain: Color diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 4f3852499..7ab98de43 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -19,7 +19,7 @@ import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.fmod -import net.torvald.terrarum.modulebasegame.gameactors.ParticleBase +import net.torvald.terrarum.gameparticles.ParticleBase import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.worlddrawer.* diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index c4728aa08..cb3b8aaa2 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -24,6 +24,7 @@ import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.console.AVTracker import net.torvald.terrarum.console.ActorsList +import net.torvald.terrarum.gameparticles.ParticleBase import net.torvald.terrarum.gameactors.WireActor import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.modulebasegame.gameactors.* @@ -38,7 +39,6 @@ import net.torvald.terrarum.modulebasegame.worldgenerator.WorldgenParams import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.terrarum.worlddrawer.FeaturesDrawer -import net.torvald.terrarum.worlddrawer.LightmapRenderer import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.util.CircularArray import net.torvald.util.SortedArrayList diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt index fe979d3f8..36a7cdaae 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt @@ -1,21 +1,29 @@ package net.torvald.terrarum.modulebasegame.gameactors +import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.gdx.graphics.Cvec import net.torvald.random.HQRNG +import net.torvald.terrarum.AppLoader +import net.torvald.terrarum.IngameInstance import net.torvald.terrarum.ModMgr +import net.torvald.terrarum.Terrarum import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous +import net.torvald.terrarum.gameparticles.ParticleVanishingText +import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import java.util.* +import kotlin.math.roundToInt /** * Created by minjaesong on 2016-06-17. */ internal class FixtureTikiTorch(nameFun: () -> String) : FixtureBase(BlockBox(BlockBox.NO_COLLISION, 1, 2), nameFun = nameFun), Luminous { + private val rng = HQRNG() private val rndHash1: Int private val rndHash2: Int @@ -40,11 +48,31 @@ internal class FixtureTikiTorch(nameFun: () -> String) : FixtureBase(BlockBox(Bl actorValue[AVKey.BASEMASS] = MASS - val rng = HQRNG() rndHash1 = rng.nextInt() rndHash2 = rng.nextInt() } + private var nextDelay = 0.4f + private var spawnTimer = 0f + + override fun update(delta: Float) { + super.update(delta) + + if (spawnTimer >= nextDelay) { + val s = rng.nextInt(1, 1000).toString() + (Terrarum.ingame as TerrarumIngame).addParticle(ParticleVanishingText(s, hitbox.centeredX, hitbox.startY + 10)) + + spawnTimer -= nextDelay + nextDelay = rng.nextFloat() * 0.4f + 0.4f + } + + spawnTimer += delta + } + + override fun drawBody(batch: SpriteBatch) { + super.drawBody(batch) + } + companion object { const val MASS = 1.0 } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleMegaRain.kt b/src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleMegaRain.kt similarity index 98% rename from src/net/torvald/terrarum/modulebasegame/gameactors/ParticleMegaRain.kt rename to src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleMegaRain.kt index 414d48cbf..494f1ab73 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleMegaRain.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleMegaRain.kt @@ -7,6 +7,7 @@ import net.torvald.random.HQRNG import net.torvald.terrarum.ModMgr import net.torvald.terrarum.Second import net.torvald.terrarum.gameactors.Actor +import net.torvald.terrarum.gameparticles.ParticleBase /** * Created by minjaesong on 2017-12-18. diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleTestRain.kt b/src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleTestRain.kt similarity index 86% rename from src/net/torvald/terrarum/modulebasegame/gameactors/ParticleTestRain.kt rename to src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleTestRain.kt index a7f594e81..6c70ae8a2 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ParticleTestRain.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameparticles/ParticleTestRain.kt @@ -1,9 +1,10 @@ -package net.torvald.terrarum.modulebasegame.gameactors +package net.torvald.terrarum.modulebasegame.gameparticles import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.ModMgr import net.torvald.terrarum.gameactors.Actor +import net.torvald.terrarum.gameparticles.ParticleBase /** * Created by minjaesong on 2017-01-20. diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt index d58b47d97..cbf01b3a3 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt @@ -25,7 +25,7 @@ class UITooltip : UICanvas() { msgBuffer.clear() msgBuffer.addAll(value.split('\n')) - msgWidth = msgBuffer.fold(0) { acc, s -> font.getWidth(s).let { if (it > acc) it else acc } } + msgWidth = msgBuffer.maxOf { font.getWidth(it) } } private val font = AppLoader.fontGame