Physics stuff Float -> Double

Former-commit-id: 54ccee75769691aa6aaa2416767bd15270f63347
Former-commit-id: 61e892434f48adf11e3ca49b60928a930fd5cde9
This commit is contained in:
Song Minjae
2016-05-01 00:23:36 +09:00
parent fba0b80d24
commit c9f5fde3be
26 changed files with 225 additions and 291 deletions

View File

@@ -87,8 +87,8 @@ class ActorInventory() {
return itemList.clone() as Map<Int, Int>
}
fun getTotalWeight(): Float {
var weight = 0f
fun getTotalWeight(): Double {
var weight = 0.0
for (item in itemList.entries) {
weight += ItemPropCodex.getProp(item.key).mass * item.value

View File

@@ -20,8 +20,8 @@ open class ActorWithBody constructor() : Actor(), Visible {
override var actorValue: ActorValue = ActorValue()
var hitboxTranslateX: Float = 0.toFloat()// relative to spritePosX
var hitboxTranslateY: Float = 0.toFloat()// relative to spritePosY
var hitboxTranslateX: Double = 0.toDouble()// relative to spritePosX
var hitboxTranslateY: Double = 0.toDouble()// relative to spritePosY
var baseHitboxW: Int = 0
var baseHitboxH: Int = 0
@@ -31,9 +31,9 @@ open class ActorWithBody constructor() : Actor(), Visible {
* veloY += 3.0
* +3.0 is acceleration. You __accumulate__ acceleration to the velocity.
*/
@Volatile var veloX: Float = 0.toFloat()
@Volatile var veloY: Float = 0.toFloat()
@Transient private val VELO_HARD_LIMIT = 10000f
@Volatile var veloX: Double = 0.0
@Volatile var veloY: Double = 0.0
@Transient private val VELO_HARD_LIMIT = 10000.0
var grounded = false
@@ -55,18 +55,18 @@ open class ActorWithBody constructor() : Actor(), Visible {
/**
* Positions: top-left point
*/
override val hitbox = Hitbox(0f,0f,0f,0f)
@Transient val nextHitbox = Hitbox(0f,0f,0f,0f)
override val hitbox = Hitbox(0.0,0.0,0.0,0.0)
@Transient val nextHitbox = Hitbox(0.0,0.0,0.0,0.0)
/**
* Physical properties.
* Values derived from ActorValue must be @Transient.
*/
@Transient var scale = 1f
@Transient var mass = 2f
@Transient private val MASS_LOWEST = 2f
@Transient var scale = 1.0
@Transient var mass = 2.0
@Transient private val MASS_LOWEST = 2.0
/** Valid range: [0, 1] */
var elasticity = 0f
var elasticity = 0.0
set(value) {
if (value < 0)
throw IllegalArgumentException("[ActorWithBody] Invalid elasticity value: $value; valid elasticity value is [0, 1].")
@@ -77,8 +77,8 @@ open class ActorWithBody constructor() : Actor(), Visible {
else
field = value * ELASTICITY_MAX
}
@Transient private val ELASTICITY_MAX = 0.993f
private var density = 1000f
@Transient private val ELASTICITY_MAX = 0.993
private var density = 1000.0
/**
* Gravitational Constant G. Load from gamemap.
@@ -86,18 +86,18 @@ open class ActorWithBody constructor() : Actor(), Visible {
* s^2 = 1/FPS = 1/60 if FPS is targeted to 60
* meter to pixel : 24/FPS
*/
@Transient private val METER = 24f
@Transient private val METER = 24.0
/**
* [m / s^2] * SI_TO_GAME_ACC -> [px / InternalFrame^2]
*/
@Transient private val SI_TO_GAME_ACC = METER / FastMath.sqr(Terrarum.TARGET_FPS.toFloat())
@Transient private val SI_TO_GAME_ACC = METER / (Terrarum.TARGET_FPS * Terrarum.TARGET_FPS).toDouble()
/**
* [m / s] * SI_TO_GAME_VEL -> [px / InternalFrame]
*/
@Transient private val SI_TO_GAME_VEL = METER / Terrarum.TARGET_FPS
@Transient private var gravitation: Float = 0.toFloat()
@Transient private val DRAG_COEFF = 1f
@Transient private var gravitation: Double = 0.toDouble()
@Transient private val DRAG_COEFF = 1.0
@Transient private val CONTACT_AREA_TOP = 0
@Transient private val CONTACT_AREA_RIGHT = 1
@@ -110,7 +110,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
/**
* A constant to make falling faster so that the game is more playable
*/
@Transient private val G_MUL_PLAYABLE_CONST = 1.4142f
@Transient private val G_MUL_PLAYABLE_CONST = 1.4142
@Transient private val EVENT_MOVE_TOP = 0
@Transient private val EVENT_MOVE_RIGHT = 1
@@ -127,7 +127,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
@Transient private val map: GameMap
@Transient private val MASS_DEFAULT: Float = 60f
@Transient private val MASS_DEFAULT: Double = 60.0
internal val physSleep: Boolean
get() = veloX.abs() < 0.5 && veloY.abs() < 0.5
@@ -138,7 +138,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
@Transient private var posAdjustX = 0
@Transient private var posAdjustY = 0
@Transient private val BASE_FRICTION = 0.3f
@Transient private val BASE_FRICTION = 0.3
init {
map = Terrarum.game.map
@@ -160,8 +160,8 @@ open class ActorWithBody constructor() : Actor(), Visible {
fun setHitboxDimension(w: Int, h: Int, tx: Int, ty: Int) {
baseHitboxH = h
baseHitboxW = w
hitboxTranslateX = tx.toFloat()
hitboxTranslateY = ty.toFloat()
hitboxTranslateX = tx.toDouble()
hitboxTranslateY = ty.toDouble()
}
/**
@@ -170,7 +170,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
* *
* @param y
*/
fun setPosition(x: Float, y: Float) {
fun setPosition(x: Double, y: Double) {
hitbox.set(
x - (baseHitboxW / 2 - hitboxTranslateX) * scale,
y - (baseHitboxH - hitboxTranslateY) * scale,
@@ -185,9 +185,9 @@ open class ActorWithBody constructor() : Actor(), Visible {
}
private fun updatePhysicalInfos() {
scale = actorValue.getAsFloat(AVKey.SCALE) ?: 1f
mass = (actorValue.getAsFloat(AVKey.BASEMASS) ?: MASS_DEFAULT) * FastMath.pow(scale, 3f)
if (elasticity != 0f) elasticity = 0f
scale = actorValue.getAsDouble(AVKey.SCALE) ?: 1.0
mass = (actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT) * Math.pow(scale, 3.0)
if (elasticity != 0.0) elasticity = 0.0
}
override fun run() = update(Terrarum.appgc, Terrarum.game.DELTA_T)
@@ -278,7 +278,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
* D = Cd (drag coefficient) * 0.5 * rho (density) * V^2 (velocity) * A (area)
*/
val A = scale * scale
val D = DRAG_COEFF * 0.5f * 1.292f * veloY * veloY * A
val D = DRAG_COEFF * 0.5 * 1.292 * veloY * veloY * A
veloY += clampCeil(
(W - D) / mass * SI_TO_GAME_ACC * G_MUL_PLAYABLE_CONST, VELO_HARD_LIMIT)
@@ -289,11 +289,11 @@ open class ActorWithBody constructor() : Actor(), Visible {
val friction = BASE_FRICTION * tileFriction.tileFrictionToMult()
if (veloX < 0) {
veloX += friction
if (veloX > 0) veloX = 0f // compensate overshoot
if (veloX > 0) veloX = 0.0 // compensate overshoot
}
else if (veloX > 0) {
veloX -= friction
if (veloX < 0) veloX = 0f // compensate overshoot
if (veloX < 0) veloX = 0.0 // compensate overshoot
}
}
@@ -302,12 +302,12 @@ open class ActorWithBody constructor() : Actor(), Visible {
if (veloY >= 0) { // check downward
if (isColliding(CONTACT_AREA_BOTTOM)) { // the ground has dug into the body
adjustHitBottom()
veloY = 0f // reset veloY, simulating normal force
veloY = 0.0 // reset veloY, simulating normal force
elasticReflectY()
grounded = true
}
else if (isColliding(CONTACT_AREA_BOTTOM, 0, 1)) { // the actor is standing ON the ground
veloY = 0f // reset veloY, simulating normal force
veloY = 0.0 // reset veloY, simulating normal force
elasticReflectY()
grounded = true
}
@@ -319,11 +319,11 @@ open class ActorWithBody constructor() : Actor(), Visible {
grounded = false
if (isColliding(CONTACT_AREA_TOP)) { // the ceiling has dug into the body
adjustHitTop()
veloY = 0f // reset veloY, simulating normal force
veloY = 0.0 // reset veloY, simulating normal force
elasticReflectY()
}
else if (isColliding(CONTACT_AREA_TOP, 0, -1)) { // the actor is touching the ceiling
veloY = 0f // reset veloY, simulating normal force
veloY = 0.0 // reset veloY, simulating normal force
elasticReflectY() // reflect on ceiling, for reversed gravity
}
else { // the actor is not grounded at all
@@ -335,7 +335,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
private fun adjustHitBottom() {
val newX = nextHitbox.pointedX // look carefully, getPos or getPointed
// int-ify posY of nextHitbox
nextHitbox.setPositionYFromPoint(FastMath.floor(nextHitbox.pointedY).toFloat())
nextHitbox.setPositionYFromPoint(Math.floor(nextHitbox.pointedY).toDouble())
var newYOff = 0 // always positive
@@ -354,7 +354,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
private fun adjustHitTop() {
val newX = nextHitbox.posX
// int-ify posY of nextHitbox
nextHitbox.setPositionY(FastMath.ceil(nextHitbox.posY).toFloat())
nextHitbox.setPositionY(Math.ceil(nextHitbox.posY).toDouble())
var newYOff = 0 // always positive
@@ -376,12 +376,12 @@ open class ActorWithBody constructor() : Actor(), Visible {
if (isColliding(CONTACT_AREA_RIGHT) && !isColliding(CONTACT_AREA_LEFT)) {
// the actor is embedded to the wall
adjustHitRight()
veloX = 0f // reset veloX, simulating normal force
veloX = 0.0 // reset veloX, simulating normal force
elasticReflectX()
}
else if (isColliding(CONTACT_AREA_RIGHT, 2, 0) && !isColliding(CONTACT_AREA_LEFT, 0, 0)) { // offset by +1, to fix directional quarks
// the actor is touching the wall
veloX = 0f // reset veloX, simulating normal force
veloX = 0.0 // reset veloX, simulating normal force
elasticReflectX()
}
else {
@@ -392,12 +392,12 @@ open class ActorWithBody constructor() : Actor(), Visible {
if (isColliding(CONTACT_AREA_LEFT) && !isColliding(CONTACT_AREA_RIGHT)) {
// the actor is embedded to the wall
adjustHitLeft()
veloX = 0f // reset veloX, simulating normal force
veloX = 0.0 // reset veloX, simulating normal force
elasticReflectX()
}
else if (isColliding(CONTACT_AREA_LEFT, -1, 0) && !isColliding(CONTACT_AREA_RIGHT, 1, 0)) {
// the actor is touching the wall
veloX = 0f // reset veloX, simulating normal force
veloX = 0.0 // reset veloX, simulating normal force
elasticReflectX()
}
else {
@@ -406,7 +406,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
else { // check both sides?
// System.out.println("updatehorizontal - |velo| < 0.5");
//if (isColliding(CONTACT_AREA_LEFT) || isColliding(CONTACT_AREA_RIGHT)) {
// veloX = 0f // reset veloX, simulating normal force
// veloX = 0.0 // reset veloX, simulating normal force
// elasticReflectX()
//}
}
@@ -416,7 +416,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
private fun adjustHitRight() {
val newY = nextHitbox.posY // look carefully, posY or pointedY
// int-ify posY of nextHitbox
nextHitbox.setPositionX(FastMath.floor(nextHitbox.posX + nextHitbox.width) - nextHitbox.width)
nextHitbox.setPositionX(Math.floor(nextHitbox.posX + nextHitbox.width) - nextHitbox.width)
var newXOff = 0 // always positive
@@ -434,7 +434,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
private fun adjustHitLeft() {
val newY = nextHitbox.posY
// int-ify posY of nextHitbox
nextHitbox.setPositionX(FastMath.ceil(nextHitbox.posX).toFloat())
nextHitbox.setPositionX(Math.ceil(nextHitbox.posX).toDouble())
var newXOff = 0 // always positive
@@ -451,14 +451,14 @@ open class ActorWithBody constructor() : Actor(), Visible {
}
private fun elasticReflectX() {
if (veloX != 0f && (veloX * elasticity).abs() > 0.5) {
if (veloX != 0.0 && (veloX * elasticity).abs() > 0.5) {
veloX = -veloX * elasticity
}
}
private fun elasticReflectY() {
if (veloY != 0f && (veloY * elasticity).abs() > 0.5) {
if (veloY != 0.0 && (veloY * elasticity).abs() > 0.5) {
veloY = -veloY * elasticity
}
}
@@ -556,18 +556,18 @@ open class ActorWithBody constructor() : Actor(), Visible {
veloY -= ((fluidDensity - this.density).toDouble()
* map.gravitation.toDouble() * submergedVolume.toDouble()
* Math.pow(mass.toDouble(), -1.0)
* SI_TO_GAME_ACC.toDouble()).toFloat()
* SI_TO_GAME_ACC.toDouble()).toDouble()
}
}*/
/*private val submergedVolume: Float
/*private val submergedVolume: Double
get() = submergedHeight * hitbox.width * hitbox.width
private val submergedHeight: Float
private val submergedHeight: Double
get() = Math.max(
getContactingAreaFluid(CONTACT_AREA_LEFT),
getContactingAreaFluid(CONTACT_AREA_RIGHT)
).toFloat()*/
).toDouble()*/
/**
@@ -591,7 +591,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
return friction
}
fun Int.tileFrictionToMult() = this / 16f
fun Int.tileFrictionToMult() = this / 16.0
/**
* Get highest density (specific gravity) value from tiles that the body occupies.
@@ -645,7 +645,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
return resistance
}
fun Int.resistanceToMult(): Float = 1f / (1 + this / 16f)
fun Int.resistanceToMult(): Double = 1.0 / (1 + this / 16.0)
private fun clampHitbox() {
hitbox.setPositionFromPoint(
@@ -682,9 +682,17 @@ open class ActorWithBody constructor() : Actor(), Visible {
override fun drawGlow(gc: GameContainer, g: Graphics) {
if (isVisible && spriteGlow != null) {
if (!sprite!!.flippedHorizontal()) {
spriteGlow!!.render(g, hitbox.posX - hitboxTranslateX * scale, hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2, scale)
spriteGlow!!.render(g,
(hitbox.posX - hitboxTranslateX * scale).toFloat(),
(hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2).toFloat(),
(scale).toFloat()
)
} else {
spriteGlow!!.render(g, hitbox.posX - scale, hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2, scale)
spriteGlow!!.render(g,
(hitbox.posX - scale).toFloat(),
(hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2).toFloat(),
(scale).toFloat()
)
}
}
}
@@ -692,9 +700,17 @@ open class ActorWithBody constructor() : Actor(), Visible {
override fun drawBody(gc: GameContainer, g: Graphics) {
if (isVisible && sprite != null) {
if (!sprite!!.flippedHorizontal()) {
sprite!!.render(g, hitbox.posX - hitboxTranslateX * scale, hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2, scale)
sprite!!.render(g,
(hitbox.posX - hitboxTranslateX * scale).toFloat(),
(hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2).toFloat(),
(scale).toFloat()
)
} else {
sprite!!.render(g, hitbox.posX - scale, hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2, scale)
sprite!!.render(g,
(hitbox.posX - scale).toFloat(),
(hitbox.posY + hitboxTranslateY * scale - (baseSpriteHeight - baseHitboxH) * scale + 2).toFloat(),
(scale).toFloat()
)
}
}
}
@@ -707,20 +723,20 @@ open class ActorWithBody constructor() : Actor(), Visible {
if (sprite != null) sprite!!.update(delta)
}
private fun clampW(x: Float): Float =
private fun clampW(x: Double): Double =
if (x < TSIZE + nextHitbox.width / 2) {
TSIZE + nextHitbox.width / 2
} else if (x >= (map.width * TSIZE).toFloat() - TSIZE.toFloat() - nextHitbox.width / 2) {
(map.width * TSIZE).toFloat() - 1f - TSIZE.toFloat() - nextHitbox.width / 2
} else if (x >= (map.width * TSIZE).toDouble() - TSIZE.toDouble() - nextHitbox.width / 2) {
(map.width * TSIZE).toDouble() - 1.0 - TSIZE.toDouble() - nextHitbox.width / 2
} else {
x
}
private fun clampH(y: Float): Float =
private fun clampH(y: Double): Double =
if (y < TSIZE + nextHitbox.height) {
TSIZE + nextHitbox.height
} else if (y >= (map.height * TSIZE).toFloat() - TSIZE.toFloat() - nextHitbox.height) {
(map.height * TSIZE).toFloat() - 1f - TSIZE.toFloat() - nextHitbox.height
} else if (y >= (map.height * TSIZE).toDouble() - TSIZE.toDouble() - nextHitbox.height) {
(map.height * TSIZE).toDouble() - 1.0 - TSIZE.toDouble() - nextHitbox.height
} else {
y
}
@@ -746,21 +762,20 @@ open class ActorWithBody constructor() : Actor(), Visible {
private val isPlayerNoClip: Boolean
get() = this is Player && this.isNoClip()
private fun quantiseTSize(v: Float): Int = FastMath.floor(v / TSIZE) * TSIZE
fun setDensity(density: Int) {
if (density < 0)
throw IllegalArgumentException("[ActorWithBody] $density: density cannot be negative.")
this.density = density.toFloat()
this.density = density.toDouble()
}
private val AUTO_CLIMB_RATE: Int
get() = Math.min(TSIZE / 8 * FastMath.sqrt(scale), TSIZE.toFloat()).toInt()
get() = Math.min(TSIZE / 8 * Math.sqrt(scale), TSIZE.toDouble()).toInt()
fun Float.round() = Math.round(this).toFloat()
fun Float.roundToInt(): Int = Math.round(this)
fun Float.abs() = FastMath.abs(this)
fun Double.round() = Math.round(this).toDouble()
fun Double.roundToInt(): Int = Math.round(this).toInt()
fun Double.abs() = Math.abs(this)
fun Double.sqr() = this * this
fun Int.abs() = if (this < 0) -this else this
companion object {
@@ -785,7 +800,7 @@ open class ActorWithBody constructor() : Actor(), Visible {
return y and 0x7FFFFFFF shr 4
}
private fun clampCeil(x: Float, ceil: Float): Float {
private fun clampCeil(x: Double, ceil: Double): Double {
return if (Math.abs(x) > ceil) ceil else x
}
}

View File

@@ -9,7 +9,7 @@ interface CanBeAnItem {
fun attachItemData()
fun getItemWeight(): Float
fun getItemWeight(): Double
fun stopUpdateAndDraw()

View File

@@ -17,7 +17,7 @@ class DroppedItem constructor(itemID: Int) : ActorWithBody() {
isVisible = true
mass = if (itemID < 4096)
TilePropCodex.getProp(itemID).density / 1000f
TilePropCodex.getProp(itemID).density / 1000.0
else
ItemPropCodex.getProp(itemID).mass
}

View File

@@ -1,24 +1,24 @@
package net.torvald.terrarum.gameactors
import net.torvald.point.Point2f
import net.torvald.point.Point2d
/**
* Created by minjaesong on 16-01-15.
*/
class Hitbox(x1: Float, y1: Float, width: Float, height: Float) {
class Hitbox(x1: Double, y1: Double, width: Double, height: Double) {
@Volatile var hitboxStart: Point2f
@Volatile var hitboxStart: Point2d
private set
@Volatile var hitboxEnd: Point2f
@Volatile var hitboxEnd: Point2d
private set
var width: Float = 0.toFloat()
var width: Double = 0.toDouble()
private set
var height: Float = 0.toFloat()
var height: Double = 0.toDouble()
private set
init {
hitboxStart = Point2f(x1, y1)
hitboxEnd = Point2f(x1 + width, y1 + height)
hitboxStart = Point2d(x1, y1)
hitboxEnd = Point2d(x1 + width, y1 + height)
this.width = width
this.height = height
}
@@ -27,14 +27,14 @@ class Hitbox(x1: Float, y1: Float, width: Float, height: Float) {
* Returns bottom-centered point of hitbox.
* @return pointX
*/
val pointedX: Float
val pointedX: Double
get() = hitboxStart.x + width / 2
/**
* Returns bottom-centered point of hitbox.
* @return pointY
*/
val pointedY: Float
val pointedY: Double
get() = hitboxEnd.y
/**
@@ -47,48 +47,48 @@ class Hitbox(x1: Float, y1: Float, width: Float, height: Float) {
* *
* @param height
*/
operator fun set(x1: Float, y1: Float, width: Float, height: Float) {
hitboxStart = Point2f(x1, y1)
hitboxEnd = Point2f(x1 + width, y1 + height)
operator fun set(x1: Double, y1: Double, width: Double, height: Double) {
hitboxStart = Point2d(x1, y1)
hitboxEnd = Point2d(x1 + width, y1 + height)
this.width = width
this.height = height
}
fun setPosition(x1: Float, y1: Float) {
hitboxStart = Point2f(x1, y1)
hitboxEnd = Point2f(x1 + width, y1 + height)
fun setPosition(x1: Double, y1: Double) {
hitboxStart = Point2d(x1, y1)
hitboxEnd = Point2d(x1 + width, y1 + height)
}
fun setPositionX(x: Float) {
fun setPositionX(x: Double) {
setPosition(x, posY)
}
fun setPositionY(y: Float) {
fun setPositionY(y: Double) {
setPosition(posX, y)
}
fun setPositionFromPoint(x1: Float, y1: Float) {
hitboxStart = Point2f(x1 - width / 2, y1 - height)
hitboxEnd = Point2f(hitboxStart.x + width, hitboxStart.y + height)
fun setPositionFromPoint(x1: Double, y1: Double) {
hitboxStart = Point2d(x1 - width / 2, y1 - height)
hitboxEnd = Point2d(hitboxStart.x + width, hitboxStart.y + height)
}
fun setPositionXFromPoint(x: Float) {
fun setPositionXFromPoint(x: Double) {
setPositionFromPoint(x, pointedY)
}
fun setPositionYFromPoint(y: Float) {
fun setPositionYFromPoint(y: Double) {
setPositionFromPoint(pointedX, y)
}
fun translatePosX(d: Float) {
fun translatePosX(d: Double) {
setPositionX(posX + d)
}
fun translatePosY(d: Float) {
fun translatePosY(d: Double) {
setPositionY(posY + d)
}
fun setDimension(w: Float, h: Float) {
fun setDimension(w: Double, h: Double) {
width = w
height = h
}
@@ -97,19 +97,19 @@ class Hitbox(x1: Float, y1: Float, width: Float, height: Float) {
* Returns x value of start point
* @return top-left point posX
*/
val posX: Float
val posX: Double
get() = hitboxStart.x
/**
* Returns y value of start point
* @return top-left point posY
*/
val posY: Float
val posY: Double
get() = hitboxStart.y
val centeredX: Float
val centeredX: Double
get() = (hitboxStart.x + hitboxEnd.x) * 0.5f
val centeredY: Float
val centeredY: Double
get() = (hitboxStart.y + hitboxEnd.y) * 0.5f
}

View File

@@ -17,14 +17,14 @@ open class NPCIntelligentBase : ActorWithBody()
override var itemData: InventoryItem = object : InventoryItem {
override var itemID = HQRNG().nextInt()
override var mass: Float
get() = actorValue.get("mass") as Float
override var mass: Double
get() = actorValue.getAsDouble("mass")!!
set(value) {
actorValue.set("mass", value)
}
override var scale: Float
get() = actorValue.get("scale") as Float
override var scale: Double
get() = actorValue.getAsDouble("scale")!!
set(value) {
actorValue.set("scale", value)
}
@@ -70,7 +70,7 @@ open class NPCIntelligentBase : ActorWithBody()
}
override fun getItemWeight(): Float {
override fun getItemWeight(): Double {
return mass
}

View File

@@ -23,7 +23,7 @@ object PBCynthia {
p.setHitboxDimension(15, p.actorValue.getAsInt(AVKey.BASEHEIGHT) ?: Player.BASE_HEIGHT, 9, 0)
p.setPosition((4096 * MapDrawer.TILE_SIZE).toFloat(), (300 * 16).toFloat())
p.setPosition((4096 * MapDrawer.TILE_SIZE).toDouble(), (300 * 16).toDouble())
return p
}

View File

@@ -33,14 +33,14 @@ object PBSigrid {
p.spriteGlow!!.setAsVisible()
p.actorValue = ActorValue()
p.actorValue[AVKey.SCALE] = 1.0f
p.actorValue[AVKey.SPEED] = 4.0f
p.actorValue[AVKey.SPEEDMULT] = 1.0f
p.actorValue[AVKey.SCALE] = 1.0
p.actorValue[AVKey.SPEED] = 4.0
p.actorValue[AVKey.SPEEDMULT] = 1.0
p.actorValue[AVKey.ACCEL] = Player.WALK_ACCEL_BASE
p.actorValue[AVKey.ACCELMULT] = 1.0f
p.actorValue[AVKey.JUMPPOWER] = 5f
p.actorValue[AVKey.ACCELMULT] = 1.0
p.actorValue[AVKey.JUMPPOWER] = 5.0
p.actorValue[AVKey.BASEMASS] = 80f
p.actorValue[AVKey.BASEMASS] = 80.0
p.actorValue[AVKey.PHYSIQUEMULT] = 1 // Constant 1.0 for player, meant to be used by random mobs
/**
* fixed value, or 'base value', from creature strength of Dwarf Fortress.
@@ -64,7 +64,7 @@ object PBSigrid {
p.inventory = ActorInventory(0x7FFFFFFF, true)
p.setPosition((4096 * MapDrawer.TILE_SIZE).toFloat(), (300 * 16).toFloat())
p.setPosition((4096 * MapDrawer.TILE_SIZE).toDouble(), (300 * 16).toDouble())
p.faction.add(FactionFactory.create("FactionSigrid.json"))

View File

@@ -23,9 +23,9 @@ class PhysTestBall : ActorWithBody {
override fun drawBody(gc: GameContainer, g: Graphics) {
g.color = color
g.fillOval(
hitbox.posX,
hitbox.posY,
hitbox.width,
hitbox.height)
hitbox.posX.toFloat(),
hitbox.posY.toFloat(),
hitbox.width.toFloat(),
hitbox.height.toFloat())
}
}

View File

@@ -6,7 +6,6 @@ import net.torvald.terrarum.gamecontroller.KeyMap
import net.torvald.terrarum.mapdrawer.MapDrawer
import net.torvald.terrarum.Terrarum
import net.torvald.spriteanimation.SpriteAnimation
import com.jme3.math.FastMath
import org.lwjgl.input.Controller
import org.lwjgl.input.Controllers
import org.newdawn.slick.GameContainer
@@ -23,7 +22,7 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
/**
* empirical value.
*/
@Transient private val JUMP_ACCELERATION_MOD = 170f / 10000f //linear mode
@Transient private val JUMP_ACCELERATION_MOD = 170.0 / 10000.0 //linear mode
@Transient private val WALK_FRAMES_TO_MAX_ACCEL = 6
@Transient private val LEFT = 1
@@ -38,8 +37,8 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
internal var walkPowerCounter = 0
@Transient private val MAX_JUMP_LENGTH = 17 // use 17; in internal frames
private var readonly_totalX = 0f
private var readonly_totalY = 0f
private var readonly_totalX = 0.0
private var readonly_totalY = 0.0
internal var jumping = false
@@ -72,8 +71,8 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
}
companion object {
@Transient internal const val ACCEL_MULT_IN_FLIGHT = 0.31f
@Transient internal const val WALK_ACCEL_BASE = 0.67f
@Transient internal const val ACCEL_MULT_IN_FLIGHT: Double = 0.31
@Transient internal const val WALK_ACCEL_BASE: Double = 0.67
@Transient const val PLAYER_REF_ID: Int = 0x51621D
@Transient const val BASE_HEIGHT = 40
@@ -116,14 +115,13 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
* @param absAxisVal (set AXIS_POSMAX if keyboard controlled)
*/
private fun walkHorizontal(left: Boolean, absAxisVal: Float) {
//if ((!super.isWalledLeft() && left) || (!super.isWalledRight() && !left)) {
readonly_totalX = veloX +
actorValue.getAsFloat(AVKey.ACCEL)!! *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale) *
applyAccelRealism(walkPowerCounter) *
(if (left) -1 else 1).toFloat() *
absAxisVal
actorValue.getAsDouble(AVKey.ACCEL)!! *
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale) *
applyAccelRealism(walkPowerCounter) *
(if (left) -1 else 1).toFloat() *
absAxisVal
veloX = readonly_totalX
@@ -132,16 +130,15 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
}
// Clamp veloX
veloX = absClamp(veloX, actorValue.getAsFloat(AVKey.SPEED)!!
* actorValue.getAsFloat(AVKey.SPEEDMULT)!!
* FastMath.sqrt(scale))
veloX = absClamp(veloX, actorValue.getAsDouble(AVKey.SPEED)!!
* actorValue.getAsDouble(AVKey.SPEEDMULT)!!
* Math.sqrt(scale))
// Heading flag
if (left)
walkHeading = LEFT
else
walkHeading = RIGHT
//}
}
/**
@@ -152,9 +149,9 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
*/
private fun walkVertical(up: Boolean, absAxisVal: Float) {
readonly_totalY = veloY +
actorValue.getAsFloat(AVKey.ACCEL)!! *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale) *
actorValue.getAsDouble(AVKey.ACCEL)!! *
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale) *
applyAccelRealism(walkPowerCounter) *
(if (up) -1 else 1).toFloat() *
absAxisVal
@@ -166,9 +163,9 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
}
// Clamp veloX
veloY = absClamp(veloY, actorValue.getAsFloat(AVKey.SPEED)!!
* actorValue.getAsFloat(AVKey.SPEEDMULT)!!
* FastMath.sqrt(scale))
veloY = absClamp(veloY, actorValue.getAsDouble(AVKey.SPEED)!!
* actorValue.getAsDouble(AVKey.SPEEDMULT)!!
* Math.sqrt(scale))
}
/**
@@ -194,23 +191,23 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
* @param x
*/
private fun applyAccelRealism(x: Int): Float {
return 0.5f + 0.5f * -FastMath.cos(10 * x / (WALK_FRAMES_TO_MAX_ACCEL * FastMath.PI))
private fun applyAccelRealism(x: Int): Double {
return 0.5 + 0.5 * -Math.cos(10 * x / (WALK_FRAMES_TO_MAX_ACCEL * Math.PI))
}
// stops; let the friction kick in by doing nothing to the velocity here
private fun walkHStop() {
/*if (veloX > 0) {
veloX -= actorValue.getAsFloat(AVKey.ACCEL)!! *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale)
veloX -= actorValue.getAsDouble(AVKey.ACCEL)!! *
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale)
// compensate overshoot
if (veloX < 0) veloX = 0f
} else if (veloX < 0) {
veloX += actorValue.getAsFloat(AVKey.ACCEL)!! *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale)
veloX += actorValue.getAsDouble(AVKey.ACCEL)!! *
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale)
// compensate overshoot
if (veloX > 0) veloX = 0f
@@ -227,16 +224,16 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
private fun walkVStop() {
/*if (veloY > 0) {
veloY -= WALK_STOP_ACCEL *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale)
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale)
// compensate overshoot
if (veloY < 0)
veloY = 0f
} else if (veloY < 0) {
veloY += WALK_STOP_ACCEL *
actorValue.getAsFloat(AVKey.ACCELMULT)!! *
FastMath.sqrt(scale)
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
Math.sqrt(scale)
// compensate overshoot
if (veloY > 0) veloY = 0f
@@ -252,12 +249,12 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
private fun updateMovementControl() {
if (!noClip) {
if (grounded) {
actorValue[AVKey.ACCELMULT] = 1f
actorValue[AVKey.ACCELMULT] = 1.0
} else {
actorValue[AVKey.ACCELMULT] = ACCEL_MULT_IN_FLIGHT
}
} else {
actorValue[AVKey.ACCELMULT] = 1f
actorValue[AVKey.ACCELMULT] = 1.0
}
}
@@ -401,17 +398,17 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
private fun jump() {
if (jumping) {
val len = MAX_JUMP_LENGTH.toFloat()
val pwr = actorValue.getAsFloat(AVKey.JUMPPOWER)!! * (actorValue.getAsFloat(AVKey.JUMPPOWERMULT) ?: 1f)
val pwr = actorValue.getAsDouble(AVKey.JUMPPOWER)!! * (actorValue.getAsDouble(AVKey.JUMPPOWERMULT) ?: 1.0)
// increment jump counter
if (jumpCounter < len) jumpCounter += 1
// linear time mode
val init = (len + 1) / 2f
val init = (len + 1) / 2.0
var timedJumpCharge = init - init / len * jumpCounter
if (timedJumpCharge < 0) timedJumpCharge = 0f
if (timedJumpCharge < 0) timedJumpCharge = 0.0
val jumpAcc = pwr * timedJumpCharge * JUMP_ACCELERATION_MOD * FastMath.sqrt(scale)
val jumpAcc = pwr * timedJumpCharge * JUMP_ACCELERATION_MOD * Math.sqrt(scale)
veloY -= jumpAcc
}
@@ -419,34 +416,21 @@ class Player : ActorWithBody, Controllable, Pocketed, Factionable, Luminous, Lan
// for mob ai:
//super.setVeloY(veloY
// -
// pwr * FastMath.sqrt(scale)
// pwr * Math.sqrt(scale)
//);
}
private fun jumpFuncLin(pwr: Float, len: Float): Float {
return -(pwr / len) * jumpCounter
}
private fun jumpFuncSqu(pwr: Float, len: Float): Float {
return pwr / (len * len) * (jumpCounter - len * jumpCounter - len) - pwr
}
private fun jumpFuncExp(pwr: Float, len: Float): Float {
val a = FastMath.pow(pwr + 1, 1 / len)
return -FastMath.pow(a, len) + 1
}
private fun isFuncDown(input: Input, fn: EnumKeyFunc): Boolean {
return input.isKeyDown(KeyMap.getKeyCode(fn))
}
private fun absClamp(i: Float, ceil: Float): Float {
private fun absClamp(i: Double, ceil: Double): Double {
if (i > 0)
return if (i > ceil) ceil else i
else if (i < 0)
return if (-i > ceil) -ceil else i
else
return 0f
return 0.0
}
private fun updateSprite(delta_t: Int) {

View File

@@ -151,7 +151,7 @@ object CollisionSolver {
val dist_y = (ay - by).abs() // 'ty'
val tangent = dist_y / dist_x
var t_ax: Float; var t_ay: Float
var t_ax: Double; var t_ay: Double
if (dist_x > dist_y) {
t_ax = this.hitbox.width / 2
t_ay = t_ax * tangent
@@ -164,11 +164,11 @@ object CollisionSolver {
return (t_ax.sqr() + t_ay.sqr()) < actor_dist_t_sqr
}
fun Float.abs() = if (this < 0) -this else this
fun Float.sqr() = this * this
fun Double.abs() = if (this < 0) -this else this
fun Double.sqr() = this * this
class CollisionMarkings(
val pos: Float,
val pos: Double,
val kind: Int,
val actor: ActorWithBody
) : Comparable<CollisionMarkings> {