diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index d026ed609..c03329255 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -366,7 +366,7 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { } } - private class CameraPlayer(val demoWorld: GameWorld, override val ai: ActorAI) : ActorWithBody(RenderOrder.FRONT, usePhysics = false), AIControlled { + private class CameraPlayer(val demoWorld: GameWorld, override val ai: ActorAI) : ActorWithBody(RenderOrder.FRONT, physProp = PhysProperties.MOBILE_OBJECT), AIControlled { override val hitbox = Hitbox(0.0, 0.0, 2.0, 2.0) diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index d809e4d18..2007cffe8 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -31,7 +31,7 @@ import java.util.* * * Created by minjaesong on 2016-01-13. */ -open class ActorWithBody(renderOrder: RenderOrder, val immobileBody: Boolean = false, var usePhysics: Boolean = true) : +open class ActorWithBody(renderOrder: RenderOrder, val physProp: PhysProperties) : Actor(renderOrder) { @@ -389,7 +389,7 @@ open class ActorWithBody(renderOrder: RenderOrder, val immobileBody: Boolean = f isNoSubjectToFluidResistance = isNoClip } - if (!usePhysics) { + if (!physProp.usePhysics) { isNoCollideWorld = true isNoSubjectToFluidResistance = true isNoSubjectToGrav = true @@ -1154,7 +1154,7 @@ open class ActorWithBody(renderOrder: RenderOrder, val immobileBody: Boolean = f } private fun getTileFriction(tile: Int) = - if (immobileBody && tile == Block.AIR) + if (physProp.immobileBody && tile == Block.AIR) BlockCodex[Block.AIR].friction.frictionToMult().div(500) .times(if (!grounded) elasticity else 1.0) else diff --git a/src/net/torvald/terrarum/gameactors/PhysProperties.kt b/src/net/torvald/terrarum/gameactors/PhysProperties.kt new file mode 100644 index 000000000..4badf82c2 --- /dev/null +++ b/src/net/torvald/terrarum/gameactors/PhysProperties.kt @@ -0,0 +1,33 @@ +package net.torvald.terrarum.gameactors + +data class PhysProperties( + val immobileBody: Boolean, + var usePhysics: Boolean, + val useStairs: Boolean +) { + companion object { + val HUMANOID_DEFAULT = PhysProperties( + immobileBody = false, + usePhysics = true, + useStairs = true + ) + /** e.g. dropped items, balls */ + val PHYSICS_OBJECT = PhysProperties( + immobileBody = false, + usePhysics = true, + useStairs = false + ) + /** e.g. voice maker */ + val IMMOBILE = PhysProperties( + immobileBody = true, + usePhysics = false, + useStairs = false + ) + /** e.g. camera */ + val MOBILE_OBJECT = PhysProperties( + immobileBody = false, + usePhysics = false, + useStairs = false + ) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index a18805ef1..9525e97a3 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -134,7 +134,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { val blockMarkings = CommonResourcePool.getAsTextureRegionPack("blockmarkings_common") internal var showSelection = true - val blockPointingCursor = object : ActorWithBody(Actor.RenderOrder.OVERLAY, usePhysics = false) { + val blockPointingCursor = object : ActorWithBody(Actor.RenderOrder.OVERLAY, physProp = PhysProperties.MOBILE_OBJECT) { override var referenceID: ActorID = 1048575 // custom refID override val hitbox = Hitbox(0.0, 0.0, 16.0, 16.0) @@ -175,7 +175,7 @@ class BuildingMaker(batch: SpriteBatch) : IngameInstance(batch) { private var _testMarkerDrawCalls = 0L - private fun generateNewBlockMarkerVisible(x: Int, y: Int) = object : ActorWithBody(Actor.RenderOrder.OVERLAY, usePhysics = false) { + private fun generateNewBlockMarkerVisible(x: Int, y: Int) = object : ActorWithBody(Actor.RenderOrder.OVERLAY, physProp = PhysProperties.MOBILE_OBJECT) { override var referenceID: ActorID = blockPosToRefID(x, y) // custom refID override val hitbox = Hitbox(x * 16.0, y * 16.0, 16.0, 16.0) @@ -543,7 +543,7 @@ class BuildingMakerController(val screen: BuildingMaker) : InputAdapter() { } } -class MovableWorldCamera(val parent: BuildingMaker) : ActorHumanoid(0, usePhysics = false) { +class MovableWorldCamera(val parent: BuildingMaker) : ActorHumanoid(0, physProp = PhysProperties.MOBILE_OBJECT) { init { referenceID = Terrarum.PLAYER_REF_ID diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index 404e0e5cf..8de8779b0 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -31,8 +31,8 @@ import java.util.* open class ActorHumanoid( birth: Long, death: Long? = null, - usePhysics: Boolean = true -) : ActorWithBody(RenderOrder.MIDDLE, usePhysics = usePhysics), Controllable, Pocketed, Factionable, Luminous, LandHolder, HistoricalFigure { + physProp: PhysProperties = PhysProperties.HUMANOID_DEFAULT +) : ActorWithBody(RenderOrder.MIDDLE, physProp = physProp), Controllable, Pocketed, Factionable, Luminous, LandHolder, HistoricalFigure { private val world: GameWorld? get() = Terrarum.ingame?.world diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/CreatureBuilder.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/CreatureBuilder.kt index 337688c2a..5ba099017 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/CreatureBuilder.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/CreatureBuilder.kt @@ -3,6 +3,7 @@ package net.torvald.terrarum.modulebasegame.gameactors import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameactors.PhysProperties import net.torvald.terrarum.gameworld.GameWorld @@ -16,7 +17,7 @@ object CreatureBuilder { * @Param jsonFileName with extension */ operator fun invoke(module: String, jsonFileName: String): ActorWithBody { - val actor = ActorWithBody(Actor.RenderOrder.MIDDLE) + val actor = ActorWithBody(Actor.RenderOrder.MIDDLE, physProp = PhysProperties.HUMANOID_DEFAULT) InjectCreatureRaw(actor.actorValue, module, jsonFileName) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt index d75cac245..79ecc61e5 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt @@ -4,13 +4,14 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameactors.PhysProperties import net.torvald.terrarum.gameitem.GameItem import net.torvald.terrarum.itemproperties.ItemCodex /** * Created by minjaesong on 2016-03-15. */ -open class DroppedItem(private val item: GameItem) : ActorWithBody(RenderOrder.MIDTOP) { +open class DroppedItem(private val item: GameItem) : ActorWithBody(RenderOrder.MIDTOP, PhysProperties.PHYSICS_OBJECT) { init { if (item.dynamicID >= ItemCodex.ACTORID_MIN) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt index 67dfc9eff..5ea16af02 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt @@ -6,6 +6,7 @@ import net.torvald.terrarum.Terrarum import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameactors.PhysProperties import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.ui.UICanvas @@ -19,7 +20,7 @@ open class FixtureBase( val mainUI: UICanvas? = null // disabling physics (not allowing the fixture to move) WILL make things easier in many ways -) : ActorWithBody(renderOrder, immobileBody = true, usePhysics = false), CuedByTerrainChange { +) : ActorWithBody(renderOrder, PhysProperties.IMMOBILE), CuedByTerrainChange { var blockBox: BlockBox = blockBox0 protected set // something like TapestryObject will want to redefine this diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt index d6ecbaf1c..f01e52aa0 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt @@ -14,10 +14,9 @@ import net.torvald.terrarum.itemproperties.Material */ open class HumanoidNPC( override val ai: ActorAI, // it's there for written-in-Kotlin, "hard-wired" AIs - born: Long, - usePhysics: Boolean = true + born: Long //forceAssignRefID: Int? = null -) : ActorHumanoid(born, usePhysics = usePhysics), AIControlled, CanBeAnItem { +) : ActorHumanoid(born), AIControlled, CanBeAnItem { companion object { val DEFAULT_COLLISION_TYPE = COLLISION_DYNAMIC diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestBall.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestBall.kt index 8d5d1663f..d4087524d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestBall.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestBall.kt @@ -4,12 +4,13 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gameactors.ActorWithBody +import net.torvald.terrarum.gameactors.PhysProperties import net.torvald.terrarum.modulebasegame.worldgenerator.RoguelikeRandomiser /** * Created by minjaesong on 2016-03-05. */ -class PhysTestBall : ActorWithBody(RenderOrder.MIDDLE, immobileBody = true) { +class PhysTestBall : ActorWithBody(RenderOrder.MIDDLE, PhysProperties.PHYSICS_OBJECT) { private var color = Color.GOLD diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt index be98ddf89..65f2277fa 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt @@ -11,7 +11,7 @@ import net.torvald.terrarum.gameactors.* /** * Created by minjaesong on 2018-01-17. */ -class PhysTestLuarLander : ActorWithBody(RenderOrder.MIDTOP), Controllable { +class PhysTestLuarLander : ActorWithBody(RenderOrder.MIDTOP, PhysProperties.PHYSICS_OBJECT), Controllable { private val texture = Texture(ModMgr.getGdxFile("basegame", "sprites/phystest_lunarlander.tga")) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt index 433a2dcf7..c2afe3777 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous +import net.torvald.terrarum.gameactors.PhysProperties import org.dyn4j.geometry.Vector2 import java.util.* @@ -24,7 +25,7 @@ open class ProjectileSimple( private val type: Int, fromPoint: Vector2, // projected coord toPoint: Vector2 // arriving coord -) : ActorWithBody(RenderOrder.MIDTOP), Luminous, Projectile { +) : ActorWithBody(RenderOrder.MIDTOP, PhysProperties.PHYSICS_OBJECT), Luminous, Projectile { val damage: Int val displayColour: Color diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt index 758704d44..7920fd643 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/WeaponSwung.kt @@ -4,11 +4,12 @@ import net.torvald.gdx.graphics.Cvec import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.Hitbox import net.torvald.terrarum.gameactors.Luminous +import net.torvald.terrarum.gameactors.PhysProperties /** * Created by minjaesong on 2016-04-26. */ -class WeaponSwung(val itemID: Int) : ActorWithBody(RenderOrder.MIDTOP), Luminous { +class WeaponSwung(val itemID: Int) : ActorWithBody(RenderOrder.MIDTOP, PhysProperties.IMMOBILE), Luminous { // just let the solver use AABB; it's cheap but works just enough /** diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/physicssolver/CollisionSolver.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/physicssolver/CollisionSolver.kt index 169f12107..b01d05e0b 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/physicssolver/CollisionSolver.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/physicssolver/CollisionSolver.kt @@ -40,7 +40,7 @@ object CollisionSolver { // mark list x (Terrarum.ingame!! as TerrarumIngame).actorContainerActive.forEach { it -> - if (it is ActorWithBody && it.usePhysics) { + if (it is ActorWithBody && it.physProp.usePhysics) { collListX.add(CollisionMarkings(it.hitbox.hitboxStart.x, STARTPOINT, it)) collListX.add(CollisionMarkings(it.hitbox.hitboxEnd.x, ENDPOINT, it)) } @@ -73,7 +73,7 @@ object CollisionSolver { // mark list y (Terrarum.ingame!! as TerrarumIngame).actorContainerActive.forEach { it -> - if (it is ActorWithBody && it.usePhysics) { + if (it is ActorWithBody && it.physProp.usePhysics) { collListY.add(CollisionMarkings(it.hitbox.hitboxStart.y, STARTPOINT, it)) collListY.add(CollisionMarkings(it.hitbox.hitboxEnd.y, ENDPOINT, it)) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt index cd78e8f1b..345a8db2f 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/BlockBase.kt @@ -35,7 +35,7 @@ object BlockBase { if (gameItem.inventoryCategory == GameItem.Category.BLOCK) { var ret1 = true ingame.actorContainerActive.forEach { - if (it is ActorWithBody && it.usePhysics && it.intTilewiseHitbox.intersects(mousePoint)) + if (it is ActorWithBody && it.physProp.usePhysics && it.intTilewiseHitbox.intersects(mousePoint)) ret1 = false // return is not allowed here } if (!ret1) return ret1 diff --git a/work_files/physics_staircasing.kra b/work_files/physics_staircasing.kra new file mode 100644 index 000000000..3a2046800 Binary files /dev/null and b/work_files/physics_staircasing.kra differ