From 5b1d0ca04946a1bb42144c2f7da771227822383e Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 8 Feb 2026 03:53:10 +0900 Subject: [PATCH] platform surface friction --- .../torvald/terrarum/gameactors/ActorMovingPlatform.kt | 7 ++++++- src/net/torvald/terrarum/gameactors/ActorWithBody.kt | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt b/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt index 120c5a27b..496e24e92 100644 --- a/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt +++ b/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt @@ -7,6 +7,8 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.INGAME import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.blockproperties.Block +import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import org.dyn4j.geometry.Vector2 @@ -21,7 +23,7 @@ import org.dyn4j.geometry.Vector2 */ open class ActorMovingPlatform() : ActorWithBody() { - protected var tilewiseWidth = 3 + protected var tilewiseWidth = 3 // default fallback value when no args were given constructor(newTilewiseWidth: Int) : this() { this.tilewiseWidth = newTilewiseWidth @@ -50,6 +52,9 @@ open class ActorMovingPlatform() : ActorWithBody() { /** Minimum combined Y velocity to count as "jumping up" (prevents mount while jumping). */ @Transient private val JUMP_THRESHOLD_Y = -0.5 + /** Block whose friction this platform impersonates. Riders use this for feet friction. */ + var surfaceBlock: ItemID = Block.STONE + @Transient private var platformTexture: Texture? = null @Transient private var platformTextureRegion: TextureRegion? = null diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index ef2e841c7..03447a814 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -294,6 +294,7 @@ open class ActorWithBody : Actor { private inline val grounded: Boolean get() = if (world == null) true else { isNoClip || + platformsRiding.isNotEmpty() || (world!!.gravitation.y > 0 && isWalled(hitbox, COLLIDING_BOTTOM) || world!!.gravitation.y < 0 && isWalled(hitbox, COLLIDING_TOP)) } @@ -1692,6 +1693,14 @@ open class ActorWithBody : Actor { // after all, feet friction is what it matters internal inline val feetFriction: Double get() { + // When riding a platform, use the platform's surface block friction + if (platformsRiding.isNotEmpty()) { + val platform = INGAME.getActorByID(platformsRiding[0]) + if (platform is ActorMovingPlatform) { + return getTileFriction(platform.surfaceBlock) + } + } + var friction = 0.0 forEachFeetTileNum { // get max friction