KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/defs/MovementParameters.kt
2024-02-03 20:41:51 +07:00

218 lines
9.8 KiB
Kotlin

package ru.dbotthepony.kstarbound.defs
import com.google.common.collect.ImmutableList
import com.google.common.collect.ImmutableSet
import ru.dbotthepony.kommons.core.Either
import ru.dbotthepony.kstarbound.json.builder.JsonAlias
import ru.dbotthepony.kstarbound.json.builder.JsonFactory
import ru.dbotthepony.kstarbound.world.physics.Poly
sealed class BaseMovementParameters {
abstract val mass: Double?
abstract val gravityMultiplier: Double?
abstract val liquidBuoyancy: Double?
abstract val airBuoyancy: Double?
abstract val bounceFactor: Double?
// If set to true, during an update that has more than one internal movement
// step, the movement will stop on the first bounce.
abstract val stopOnFirstBounce: Boolean?
// Cheat when sliding on the ground, by trying to correct upwards before
// other directions (within a set limit). Allows smooth sliding along
// horizontal ground without losing horizontal speed.
abstract val enableSurfaceSlopeCorrection: Boolean?
abstract val slopeSlidingFactor: Double?
abstract val maxMovementPerStep: Double?
abstract val maximumCorrection: Double?
abstract val speedLimit: Double?
abstract val stickyCollision: Boolean?
abstract val stickyForce: Double?
abstract val airFriction: Double?
abstract val liquidFriction: Double?
abstract val groundFriction: Double?
abstract val collisionEnabled: Boolean?
abstract val frictionEnabled: Boolean?
abstract val gravityEnabled: Boolean?
abstract val maximumPlatformCorrection: Double?
abstract val maximumPlatformCorrectionVelocityFactor: Double?
abstract val physicsEffectCategories: ImmutableSet<String>?
}
@JsonFactory
data class MovementParameters(
override val mass: Double? = null,
override val gravityMultiplier: Double? = null,
override val liquidBuoyancy: Double? = null,
override val airBuoyancy: Double? = null,
override val bounceFactor: Double? = null,
override val stopOnFirstBounce: Boolean? = null,
override val enableSurfaceSlopeCorrection: Boolean? = null,
override val slopeSlidingFactor: Double? = null,
override val maxMovementPerStep: Double? = null,
override val maximumCorrection: Double? = null,
override val speedLimit: Double? = null,
override val stickyCollision: Boolean? = null,
override val stickyForce: Double? = null,
override val airFriction: Double? = null,
override val liquidFriction: Double? = null,
override val groundFriction: Double? = null,
override val collisionEnabled: Boolean? = null,
override val frictionEnabled: Boolean? = null,
override val gravityEnabled: Boolean? = null,
override val maximumPlatformCorrection: Double? = null,
override val maximumPlatformCorrectionVelocityFactor: Double? = null,
override val physicsEffectCategories: ImmutableSet<String>? = null,
val discontinuityThreshold: Float? = null,
val collisionPoly: Either<Poly, ImmutableList<Poly>>? = null,
val ignorePlatformCollision: Boolean? = null,
val restDuration: Int? = null,
) : BaseMovementParameters() {
fun merge(other: MovementParameters): MovementParameters {
return MovementParameters(
mass = other.mass ?: mass,
gravityMultiplier = other.gravityMultiplier ?: gravityMultiplier,
liquidBuoyancy = other.liquidBuoyancy ?: liquidBuoyancy,
airBuoyancy = other.airBuoyancy ?: airBuoyancy,
bounceFactor = other.bounceFactor ?: bounceFactor,
stopOnFirstBounce = other.stopOnFirstBounce ?: stopOnFirstBounce,
enableSurfaceSlopeCorrection = other.enableSurfaceSlopeCorrection ?: enableSurfaceSlopeCorrection,
slopeSlidingFactor = other.slopeSlidingFactor ?: slopeSlidingFactor,
maxMovementPerStep = other.maxMovementPerStep ?: maxMovementPerStep,
maximumCorrection = other.maximumCorrection ?: maximumCorrection,
speedLimit = other.speedLimit ?: speedLimit,
stickyCollision = other.stickyCollision ?: stickyCollision,
stickyForce = other.stickyForce ?: stickyForce,
airFriction = other.airFriction ?: airFriction,
liquidFriction = other.liquidFriction ?: liquidFriction,
groundFriction = other.groundFriction ?: groundFriction,
collisionEnabled = other.collisionEnabled ?: collisionEnabled,
frictionEnabled = other.frictionEnabled ?: frictionEnabled,
gravityEnabled = other.gravityEnabled ?: gravityEnabled,
maximumPlatformCorrection = other.maximumPlatformCorrection ?: maximumPlatformCorrection,
maximumPlatformCorrectionVelocityFactor = other.maximumPlatformCorrectionVelocityFactor ?: maximumPlatformCorrectionVelocityFactor,
physicsEffectCategories = other.physicsEffectCategories ?: physicsEffectCategories,
discontinuityThreshold = other.discontinuityThreshold ?: discontinuityThreshold,
collisionPoly = other.collisionPoly ?: collisionPoly,
ignorePlatformCollision = other.ignorePlatformCollision ?: ignorePlatformCollision,
restDuration = other.restDuration ?: restDuration,
)
}
companion object {
val EMPTY = MovementParameters()
}
}
@JsonFactory
data class ActorMovementParameters(
override val mass: Double? = null,
override val gravityMultiplier: Double? = null,
override val liquidBuoyancy: Double? = null,
override val airBuoyancy: Double? = null,
override val bounceFactor: Double? = null,
override val stopOnFirstBounce: Boolean? = null,
override val enableSurfaceSlopeCorrection: Boolean? = null,
override val slopeSlidingFactor: Double? = null,
override val maxMovementPerStep: Double? = null,
override val maximumCorrection: Double? = null,
override val speedLimit: Double? = null,
override val stickyCollision: Boolean? = null,
override val stickyForce: Double? = null,
override val airFriction: Double? = null,
override val liquidFriction: Double? = null,
override val groundFriction: Double? = null,
override val collisionEnabled: Boolean? = null,
override val frictionEnabled: Boolean? = null,
override val gravityEnabled: Boolean? = null,
override val maximumPlatformCorrection: Double? = null,
override val maximumPlatformCorrectionVelocityFactor: Double? = null,
override val physicsEffectCategories: ImmutableSet<String>? = null,
@JsonAlias("collisionPoly")
val standingPoly: Either<Poly, ImmutableList<Poly>>? = null,
@JsonAlias("collisionPoly")
val crouchingPoly: Either<Poly, ImmutableList<Poly>>? = null,
val walkSpeed: Double? = null,
val runSpeed: Double? = null,
val flySpeed: Double? = null,
val minimumLiquidPercentage: Double? = null,
val liquidImpedance: Double? = null,
val normalGroundFriction: Double? = null,
val ambulatingGroundFriction: Double? = null,
val groundForce: Double? = null,
val airForce: Double? = null,
val liquidForce: Double? = null,
val airJumpProfile: JumpProfile = JumpProfile.EMPTY,
val liquidJumpProfile: JumpProfile = JumpProfile.EMPTY,
val fallStatusSpeedMin: Double? = null,
val fallThroughSustainFrames: Int? = null,
val groundMovementMinimumSustain: Double? = null,
val groundMovementMaximumSustain: Double? = null,
val groundMovementCheckDistance: Double? = null,
val pathExploreRate: Double? = null,
) : BaseMovementParameters() {
fun merge(other: ActorMovementParameters): ActorMovementParameters {
return ActorMovementParameters(
mass = other.mass ?: mass,
gravityMultiplier = other.gravityMultiplier ?: gravityMultiplier,
liquidBuoyancy = other.liquidBuoyancy ?: liquidBuoyancy,
airBuoyancy = other.airBuoyancy ?: airBuoyancy,
bounceFactor = other.bounceFactor ?: bounceFactor,
stopOnFirstBounce = other.stopOnFirstBounce ?: stopOnFirstBounce,
enableSurfaceSlopeCorrection = other.enableSurfaceSlopeCorrection ?: enableSurfaceSlopeCorrection,
slopeSlidingFactor = other.slopeSlidingFactor ?: slopeSlidingFactor,
maxMovementPerStep = other.maxMovementPerStep ?: maxMovementPerStep,
maximumCorrection = other.maximumCorrection ?: maximumCorrection,
speedLimit = other.speedLimit ?: speedLimit,
stickyCollision = other.stickyCollision ?: stickyCollision,
stickyForce = other.stickyForce ?: stickyForce,
airFriction = other.airFriction ?: airFriction,
liquidFriction = other.liquidFriction ?: liquidFriction,
groundFriction = other.groundFriction ?: groundFriction,
collisionEnabled = other.collisionEnabled ?: collisionEnabled,
frictionEnabled = other.frictionEnabled ?: frictionEnabled,
gravityEnabled = other.gravityEnabled ?: gravityEnabled,
maximumPlatformCorrection = other.maximumPlatformCorrection ?: maximumPlatformCorrection,
maximumPlatformCorrectionVelocityFactor = other.maximumPlatformCorrectionVelocityFactor ?: maximumPlatformCorrectionVelocityFactor,
physicsEffectCategories = other.physicsEffectCategories ?: physicsEffectCategories,
standingPoly = other.standingPoly ?: standingPoly,
crouchingPoly = other.crouchingPoly ?: crouchingPoly,
walkSpeed = other.walkSpeed ?: walkSpeed,
runSpeed = other.runSpeed ?: runSpeed,
flySpeed = other.flySpeed ?: flySpeed,
minimumLiquidPercentage = other.minimumLiquidPercentage ?: minimumLiquidPercentage,
liquidImpedance = other.liquidImpedance ?: liquidImpedance,
normalGroundFriction = other.normalGroundFriction ?: normalGroundFriction,
ambulatingGroundFriction = other.ambulatingGroundFriction ?: ambulatingGroundFriction,
groundForce = other.groundForce ?: groundForce,
airForce = other.airForce ?: airForce,
liquidForce = other.liquidForce ?: liquidForce,
airJumpProfile = airJumpProfile.merge(other.airJumpProfile),
liquidJumpProfile = liquidJumpProfile.merge(other.liquidJumpProfile),
fallStatusSpeedMin = other.fallStatusSpeedMin ?: fallStatusSpeedMin,
fallThroughSustainFrames = other.fallThroughSustainFrames ?: fallThroughSustainFrames,
groundMovementMinimumSustain = other.groundMovementMinimumSustain ?: groundMovementMinimumSustain,
groundMovementMaximumSustain = other.groundMovementMaximumSustain ?: groundMovementMaximumSustain,
groundMovementCheckDistance = other.groundMovementCheckDistance ?: groundMovementCheckDistance,
)
}
companion object {
val EMPTY = ActorMovementParameters()
}
}