mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-12 03:24:06 +09:00
swiming control
This commit is contained in:
@@ -1622,12 +1622,18 @@ open class ActorWithBody : Actor {
|
|||||||
private fun applyBuoyancy() {
|
private fun applyBuoyancy() {
|
||||||
if (world == null) return
|
if (world == null) return
|
||||||
|
|
||||||
|
// this term allows swimming. Model: you're opening a thruster pointing downwards
|
||||||
|
val jumpAcc = if (this is ActorHumanoid)
|
||||||
|
Vector2(0.0, swimAcc)
|
||||||
|
else
|
||||||
|
Vector2()
|
||||||
|
|
||||||
val rho = tileDensityFluid // kg / m^3
|
val rho = tileDensityFluid // kg / m^3
|
||||||
val V_full = mass / density * 2.0 // density = mass / volume, simply rearrange this. Multiplier of 2.0 is a hack!
|
val V_full = mass / density * 2.0 // density = mass / volume, simply rearrange this. Multiplier of 2.0 is a hack!
|
||||||
val V = V_full * submergedRatio
|
val V = V_full * submergedRatio
|
||||||
val g = world!!.gravitation // m / s^2
|
val grav = world!!.gravitation // m / s^2
|
||||||
val F_k = g * mass // Newtons = kg * m / s^2
|
val F_k = (grav + jumpAcc) * mass // F = ma where a is g; TODO add jump-accel into 'a' to allow better jumping under water
|
||||||
val F_bo = g * (rho * V) // Newtons
|
val F_bo = grav * (rho * V) // Newtons
|
||||||
|
|
||||||
// mh'' = mg - rho*gv
|
// mh'' = mg - rho*gv
|
||||||
// h'' = (mg - rho*gv) / m
|
// h'' = (mg - rho*gv) / m
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
/** how long the jump button has down, in frames */
|
/** how long the jump button has down, in frames */
|
||||||
internal var jumpCounter = 0
|
internal var jumpCounter = 0
|
||||||
internal var jumpAcc = 0.0
|
internal var jumpAcc = 0.0
|
||||||
|
internal var swimAcc = 0.0
|
||||||
/** how long the walk button has down, in frames */
|
/** how long the walk button has down, in frames */
|
||||||
internal var walkCounterX = 0
|
internal var walkCounterX = 0
|
||||||
internal var walkCounterY = 0
|
internal var walkCounterY = 0
|
||||||
@@ -402,6 +403,22 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (hasController) {
|
||||||
|
if (axisY != 0f) {
|
||||||
|
swimVertJoypad(axisY > 0, axisY.abs())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ↑E, ↓D
|
||||||
|
if (isDownDown && !isUpDown) {
|
||||||
|
swimDown()
|
||||||
|
prevVMoveKey = ControlPresets.getKey("control_key_down")
|
||||||
|
} // ↓E, ↑D
|
||||||
|
else if (isUpDown && !isDownDown) {
|
||||||
|
swimUp()
|
||||||
|
prevVMoveKey = ControlPresets.getKey("control_key_up")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Jump-key control
|
* Jump-key control
|
||||||
@@ -435,6 +452,7 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
|
|
||||||
// acutally launch the player in the air
|
// acutally launch the player in the air
|
||||||
jump()
|
jump()
|
||||||
|
swimUp()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
walkVertical(true, AXIS_KEYBOARD)
|
walkVertical(true, AXIS_KEYBOARD)
|
||||||
@@ -454,6 +472,11 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// un-release swimAcc
|
||||||
|
if (!isDownDown && !isUpDown && !isJumpDown) {
|
||||||
|
swimAcc = 0.0
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun keyDown(keycode: Int): Boolean {
|
override fun keyDown(keycode: Int): Boolean {
|
||||||
@@ -606,7 +629,7 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
// platformToIgnore = null
|
// platformToIgnore = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getJumpAcc(pwr: Double, timedJumpCharge: Double): Double {
|
fun getJumpAcc(pwr: Double, timedJumpCharge: Double): Double {
|
||||||
return pwr * timedJumpCharge * JUMP_ACCELERATION_MOD
|
return pwr * timedJumpCharge * JUMP_ACCELERATION_MOD
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -621,9 +644,10 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
// compare all the affecting variables
|
// compare all the affecting variables
|
||||||
if (oldMAX_JUMP_LENGTH == MAX_JUMP_LENGTH &&
|
if (oldMAX_JUMP_LENGTH == MAX_JUMP_LENGTH &&
|
||||||
oldJUMPPOWER == actorValue.getAsDouble(AVKey.JUMPPOWER)!! &&
|
oldJUMPPOWER == actorValue.getAsDouble(AVKey.JUMPPOWER)!! &&
|
||||||
oldJUMPPOWERBUFF == actorValue.getAsDouble(AVKey.JUMPPOWERBUFF) ?: 1.0 &&
|
oldJUMPPOWERBUFF == (actorValue.getAsDouble(AVKey.JUMPPOWERBUFF) ?: 1.0) &&
|
||||||
oldScale == scale &&
|
oldScale == scale &&
|
||||||
oldDragCoefficient == dragCoefficient) {
|
oldDragCoefficient == dragCoefficient
|
||||||
|
) {
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
// if variables are changed, get new value, store it and return it
|
// if variables are changed, get new value, store it and return it
|
||||||
@@ -673,16 +697,39 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L
|
|||||||
scale.pow(0.25) *
|
scale.pow(0.25) *
|
||||||
((encumberment / avStrengthNormalised).pow(-1.0/3.0)).coerceIn(0.48, 1.0) // encumbered actors move slower
|
((encumberment / avStrengthNormalised).pow(-1.0/3.0)).coerceIn(0.48, 1.0) // encumbered actors move slower
|
||||||
|
|
||||||
|
private val jumpPower1: Double
|
||||||
|
get() = actorValue.getAsDouble(AVKey.JUMPPOWER)!! * // base stat
|
||||||
|
(actorValue.getAsDouble(AVKey.JUMPPOWERBUFF) ?: 1.0) * // buffed stat
|
||||||
|
scale.pow(0.25) *
|
||||||
|
((encumberment / avStrengthNormalised).pow(-1.0/3.0)).coerceIn(0.48, 1.0) // encumbered actors move slower
|
||||||
|
|
||||||
|
|
||||||
private fun jumpFunc(len: Int, counter: Int): Double {
|
private fun jumpFunc(len: Int, counter: Int): Double {
|
||||||
// linear time mode
|
// linear time mode
|
||||||
val init = (len + 1) / 2.0
|
val init = (len + 1) / 2.0
|
||||||
var timedJumpCharge = init - init / len * counter
|
return (init - init / len * counter).coerceAtLeast(0.0)
|
||||||
if (timedJumpCharge < 0) timedJumpCharge = 0.0
|
}
|
||||||
return timedJumpCharge
|
|
||||||
|
@Transient private val SWIM_ACC_MULT = 4.0
|
||||||
|
|
||||||
|
private fun swimUp() {
|
||||||
|
val timedJumpCharge = jumpFunc(MAX_JUMP_LENGTH, 0)
|
||||||
|
swimAcc = -getJumpAcc(jumpPower1, timedJumpCharge) * SWIM_ACC_MULT
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun swimDown() {
|
||||||
|
val timedJumpCharge = jumpFunc(MAX_JUMP_LENGTH, 0)
|
||||||
|
swimAcc = getJumpAcc(jumpPower1, timedJumpCharge) * SWIM_ACC_MULT
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun swimVertJoypad(up: Boolean, absAxisVal: Float) {
|
||||||
|
val timedJumpCharge = jumpFunc(MAX_JUMP_LENGTH, 0)
|
||||||
|
val sign = if (up) -1.0 else 1.0
|
||||||
|
swimAcc = sign * getJumpAcc(jumpPower1, timedJumpCharge) * absAxisVal * SWIM_ACC_MULT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See ./work_files/Jump power by pressing time.gcx
|
* See ./work_files/Jump power by pressing time.gcx
|
||||||
*/
|
*/
|
||||||
private fun jump() {
|
private fun jump() {
|
||||||
|
|||||||
Reference in New Issue
Block a user