From d72bbb0355c9576f59af9a694a14fcd8bacb2545 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 17 Jul 2024 01:41:32 +0900 Subject: [PATCH] better buoyancy but still wip --- src/net/torvald/terrarum/CreditSingleton.kt | 23 ++++++----- .../terrarum/gameactors/ActorWithBody.kt | 38 +++++++++++++++---- .../torvald/terrarum/gameworld/GameWorld.kt | 8 +++- .../terrarum/modulebasegame/WorldSimulator.kt | 2 +- .../terrarum/worlddrawer/BlocksDrawer.kt | 2 +- work_files/graphics/terrain/fluid_wetting.kra | 3 ++ 6 files changed, 55 insertions(+), 21 deletions(-) create mode 100644 work_files/graphics/terrain/fluid_wetting.kra diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index f828b4d7a..af412e97b 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -347,11 +347,11 @@ $BULLET Foleys: ℗ 2011, 2013, 2015, 2020, 2021 Klankbeeld Sound from - - effects/steps/GRSS.*.ogg - - effects/steps/GRVL.*.ogg - - effects/steps/ROCK.*.ogg - - effects/steps/SAND.*.ogg - - effects/steps/WOOD.*.ogg + - effects/{mining|steps}/GRSS.*.wav + - effects/{mining|steps}/GRVL.*.wav + - effects/{mining|steps}/ROCK.*.wav + - effects/{mining|steps}/SAND.*.wav + - effects/{mining|steps}/WOOD.*.wav - effects/door/wooden_open.*.ogg - effects/door/wooden_close.*.ogg ℗ 2020, 2021, 2022 Nox Sound @@ -373,12 +373,12 @@ Sound from ℗ 2019 DrinkingWindGames Sound from - - effects/explosion/bang_bomb.ogg + - effects/explosion/bang_bomb.wav ℗ 2019 Richwise -Sound from +Remixed sound from - - effects/explosion/fuse.ogg - - effects/explosion/fuse_continue.ogg + - effects/explosion/fuse.wav + - effects/explosion/fuse_continue.wav ℗ 2012, 2015 j1987 and ScouseMouseJB Remixed sound from and @@ -394,6 +394,11 @@ Sound from ℗ 2013 Ubikphonik Sound from + - effects/throwing/throw_low_short.wav +℗ 2023 Killerkipler +Remixed sound from + + $BULLET Impulse Responses: diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 0ab5c0b28..351e30835 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -13,12 +13,11 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZEF import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockProp -import net.torvald.terrarum.blockproperties.Fluid -import net.torvald.terrarum.blockproperties.FluidCodex import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameparticles.createRandomBlockParticle import net.torvald.terrarum.gameworld.BlockAddress +import net.torvald.terrarum.gameworld.FLUID_MIN_MASS import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.itemproperties.Calculate import net.torvald.terrarum.modulebasegame.TerrarumIngame @@ -690,10 +689,7 @@ open class ActorWithBody : Actor { feetPosPoint.set(hitbox.centeredX, hitbox.endY) feetPosTile.set(hIntTilewiseHitbox.centeredX.floorToInt(), hIntTilewiseHitbox.endY.floorToInt()) - submergedHeight = max( - getContactingAreaFluid(COLLIDING_LEFT), - getContactingAreaFluid(COLLIDING_RIGHT) - ).toDouble() + submergedHeight = getSubmergedHeight() submergedVolume = submergedHeight * hitbox.width * hitbox.width submergedRatio = if (hitbox.height == 0.0) throw RuntimeException("Hitbox.height is zero") else submergedHeight / hitbox.height @@ -712,6 +708,11 @@ open class ActorWithBody : Actor { // isStationary = (hitbox - oldHitbox).magnitudeSquared < PHYS_EPSILON_VELO isStationary = isCloseEnough(hitbox.startX, oldHitbox.startX) && // this is supposed to be more accurate, idk isCloseEnough(hitbox.startY, oldHitbox.startY) + + + if (this is IngamePlayer) { + printdbg(this, "Submerged=$submergedVolume rho=$tileDensityFluid") + } } fun getDrag(externalForce: Vector2): Vector2 { @@ -1507,8 +1508,29 @@ open class ActorWithBody : Actor { // TODO: as for the platform, only apply it when it's a feet tile + private fun getSubmergedHeight(): Double { + if (world == null) return 0.0 + val straightGravity = (world!!.gravitation.y > 0) - private fun getContactingAreaFluid(side: Int, translateX: Int = 0, translateY: Int = 0): Int { + val dbgTYLs = HashSet() + + val txL = (hitbox.startX / TILE_SIZED).floorToInt() + val txR = (hitbox.endX / TILE_SIZED).floorToInt() + var hL = 0 + var hR = 0 + for (q in 0 until hitbox.height.toInt()) { + val y = if (straightGravity) hitbox.endY - q else hitbox.startX + q + val ty = (y / TILE_SIZED).floorToInt() + if (world!!.getFluid(txL, ty).amount >= FLUID_MIN_MASS) hL += 1 + if (world!!.getFluid(txR, ty).amount >= FLUID_MIN_MASS) hR += 1 + dbgTYLs.add(ty) + } + + // returns average of two sides + return (hL + hR) / 2.0 + } + + private fun xxxxgetContactingAreaFluid(side: Int, translateX: Int = 0, translateY: Int = 0): Int { if (world == null) return 0 var contactAreaCounter = 0 @@ -1621,7 +1643,7 @@ open class ActorWithBody : Actor { * F(bo) = density * submerged_volume * gravitational_acceleration [N] */ private fun applyBuoyancy(): Vector2 { - val rho = FluidCodex[Fluid.WATER].density //tileDensityFluid // kg / m^3 + val rho = tileDensityFluid // kg / m^3 val V = submergedVolume / (METER.pow(3)) // m^3 val g = world?.gravitation ?: Vector2() // m / s^2 val F = g * (rho * V / SI_TO_GAME_VELO) // Newtons = kg * m / s^2 diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 1a57662f6..bba1e1ac1 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -263,6 +263,8 @@ open class GameWorld( fun coordInWorldStrict(x: Int, y: Int) = x in 0 until width && y in 0 until height // ROUNDWORLD implementation fun renumberTilesAfterLoad() { + printdbg(this, "renumberTilesAfterLoad()") + // patch the "old"map tileNumberToNameMap[0] = Block.AIR tileNumberToNameMap[1] = Block.UPDATE @@ -307,6 +309,8 @@ open class GameWorld( } BlocksDrawer.rebuildInternalPrecalculations() + + printdbg(this, "renumberTilesAfterLoad done!") } /** @@ -769,7 +773,7 @@ open class GameWorld( val fluidNumber = tileNameToNumberMap[fluidType] ?: throw NullPointerException("No such fluid: $fluidType") - if (fill > WorldSimulator.FLUID_MIN_MASS) { + if (fill > FLUID_MIN_MASS) { //setTileTerrain(x, y, fluidTypeToBlock(fluidType)) layerFluids.unsafeSetTile(x, y, fluidNumber, fill) } @@ -804,7 +808,7 @@ open class GameWorld( data class FluidInfo(val type: ItemID = Fluid.NULL, val amount: Float = 0f) { /** test if this fluid should be considered as one */ - fun isFluid() = type != Fluid.NULL && amount >= WorldSimulator.FLUID_MIN_MASS + fun isFluid() = type != Fluid.NULL && amount >= FLUID_MIN_MASS fun getProp() = FluidCodex[type] override fun toString() = "Fluid type: ${type}, amount: $amount" } diff --git a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt index 3cdedfdec..6c35ae0de 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -45,7 +45,7 @@ object WorldSimulator { const val FLUID_MAX_MASS = 1f // The normal, un-pressurized mass of a full water cell const val FLUID_MAX_COMP = 0.02f // How much excess water a cell can store, compared to the cell above it. A tile of fluid can contain more than MaxMass water. - const val FLUID_MIN_MASS = net.torvald.terrarum.gameworld.FLUID_MIN_MASS //Ignore cells that are almost dry (smaller than epsilon of float16) +// const val FLUID_MIN_MASS = net.torvald.terrarum.gameworld.FLUID_MIN_MASS //Ignore cells that are almost dry (smaller than epsilon of float16) const val minFlow = 1f / 512f const val maxSpeed = 1f // max units of water moved out of one block to another, per timestamp diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt index 50299cd6a..f676b1d59 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt @@ -14,9 +14,9 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.gameworld.FLUID_MIN_MASS import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.fmod -import net.torvald.terrarum.modulebasegame.WorldSimulator.FLUID_MIN_MASS import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.serialise.toBig64 import net.torvald.terrarum.worlddrawer.CreateTileAtlas.Companion.WALL_OVERLAY_COLOUR diff --git a/work_files/graphics/terrain/fluid_wetting.kra b/work_files/graphics/terrain/fluid_wetting.kra new file mode 100644 index 000000000..1e76c7cd8 --- /dev/null +++ b/work_files/graphics/terrain/fluid_wetting.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e3f8bd9783ae603359635b4463ce9f30ab67e596458f6ce50bd787045346ceb +size 141800