mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-07 20:31:51 +09:00
"mult" renamed to "buff" to prevent confusion with pre-calculated "mult" (character variants)
Former-commit-id: 104d0a57bc67491427d823c2f91688c85e8841c5 Former-commit-id: 5a835c7a759006df25d8783f4f97b568a1517104
This commit is contained in:
@@ -6,38 +6,39 @@ package net.torvald.terrarum.gameactors
|
||||
* Created by minjaesong on 16-04-02.
|
||||
*/
|
||||
object AVKey {
|
||||
const val MULT = "mult"
|
||||
const val BUFF = "buff"
|
||||
|
||||
/** pixels per frame
|
||||
* walking/running speed
|
||||
*/
|
||||
const val SPEED = "speed"
|
||||
const val SPEEDMULT = "$SPEED$MULT"
|
||||
const val SPEEDBUFF = "$SPEED$BUFF"
|
||||
/** pixels per frame squared
|
||||
* acceleration of the movement (e.g. running, flying, driving, etc.)
|
||||
*/
|
||||
const val ACCEL = "accel"
|
||||
const val ACCELMULT = "$ACCEL$MULT"
|
||||
const val ACCELBUFF = "$ACCEL$BUFF"
|
||||
const val SCALE = "scale"
|
||||
const val SCALEBUFF = "$SCALE$BUFF" // aka PHYSIQUE
|
||||
/** pixels */
|
||||
const val BASEHEIGHT = "baseheight"
|
||||
/** kilogrammes */
|
||||
const val BASEMASS = "basemass"
|
||||
/** pixels per frame */
|
||||
const val JUMPPOWER = "jumppower"
|
||||
const val JUMPPOWERMULT = "$JUMPPOWER$MULT"
|
||||
const val JUMPPOWERBUFF = "$JUMPPOWER$BUFF"
|
||||
|
||||
/** Int
|
||||
* "Default" value of 1 000
|
||||
*/
|
||||
const val STRENGTH = "strength"
|
||||
const val STRENGTHBUFF = "$STRENGTH$BUFF"
|
||||
const val ENCUMBRANCE = "encumbrance"
|
||||
/** 30-bit RGB (Int)
|
||||
* 0000 0010000000 0010000000 0010000000
|
||||
* ^ Red ^ Green ^ Blue
|
||||
*/
|
||||
const val LUMINOSITY = "luminosity"
|
||||
const val PHYSIQUEMULT = "physique$MULT"
|
||||
const val DRAGCOEFF = "dragcoeff"
|
||||
|
||||
/** String
|
||||
@@ -46,7 +47,7 @@ object AVKey {
|
||||
const val NAME = "name"
|
||||
|
||||
/** String
|
||||
* e.g. Duudson
|
||||
* e.g. Duudsoni
|
||||
*/
|
||||
const val RACENAME = "racename"
|
||||
/** String
|
||||
@@ -72,10 +73,10 @@ object AVKey {
|
||||
* current defence point of worn armour(s)
|
||||
*/
|
||||
const val ARMOURDEFENCE = "armourdefence"
|
||||
const val ARMOURDEFENCEMULT = "$ARMOURDEFENCE$MULT"
|
||||
const val ARMOURDEFENCEBUFF = "$ARMOURDEFENCE$BUFF"
|
||||
|
||||
const val MAGICREGENRATE = "magicregenrate"
|
||||
const val MAGICREGENRATEMULT = "$MAGICREGENRATE$MULT"
|
||||
const val MAGICREGENRATEBUFF = "$MAGICREGENRATE$BUFF"
|
||||
|
||||
|
||||
/** String
|
||||
|
||||
@@ -219,14 +219,14 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
private fun updateMovementControl() {
|
||||
if (!noClip) {
|
||||
if (grounded) {
|
||||
actorValue[AVKey.ACCELMULT] = 1.0
|
||||
actorValue[AVKey.ACCELBUFF] = 1.0
|
||||
}
|
||||
else {
|
||||
actorValue[AVKey.ACCELMULT] = ACCEL_MULT_IN_FLIGHT
|
||||
actorValue[AVKey.ACCELBUFF] = ACCEL_MULT_IN_FLIGHT
|
||||
}
|
||||
}
|
||||
else {
|
||||
actorValue[AVKey.ACCELMULT] = 1.0
|
||||
actorValue[AVKey.ACCELBUFF] = 1.0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -382,23 +382,15 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
private fun walkHorizontal(left: Boolean, absAxisVal: Float) {
|
||||
if ((!walledLeft && left) || (!walledRight && !left)) {
|
||||
readonly_totalX =
|
||||
absMax(// keyboard
|
||||
actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
|
||||
Math.sqrt(scale) *
|
||||
applyVelo(walkCounterX) *
|
||||
(if (left) -1f else 1f)
|
||||
, // gamepad
|
||||
actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
|
||||
Math.sqrt(scale) *
|
||||
(if (left) -1f else 1f) * absAxisVal
|
||||
// do not add applyVelo(walkCounterY) here, as it prevents player from moving with gamepad
|
||||
absMax( // keyboard
|
||||
avAcceleration * applyVelo(walkCounterX) * (if (left) -1f else 1f),
|
||||
// gamepad
|
||||
avAcceleration * (if (left) -1f else 1f) * absAxisVal
|
||||
)
|
||||
|
||||
//applyForce(Vector2(readonly_totalX, 0.0))
|
||||
walkX += readonly_totalX
|
||||
walkX = absClamp(walkX, actorValue.getAsDouble(AVKey.SPEED)!! * actorValue.getAsDouble(AVKey.SPEEDMULT)!!)
|
||||
walkX = walkX.bipolarClamp(avSpeedCap)
|
||||
|
||||
walkCounterX += 1
|
||||
|
||||
@@ -420,21 +412,14 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
*/
|
||||
private fun walkVertical(up: Boolean, absAxisVal: Float) {
|
||||
readonly_totalY =
|
||||
absMax(// keyboard
|
||||
actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
|
||||
Math.sqrt(scale) *
|
||||
applyVelo(walkCounterY) *
|
||||
(if (up) -1f else 1f)
|
||||
, // gamepad
|
||||
actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELMULT)!! *
|
||||
Math.sqrt(scale) *
|
||||
(if (up) -1f else 1f) * absAxisVal
|
||||
absMax( // keyboard
|
||||
avAcceleration * applyVelo(walkCounterY) * (if (up) -1f else 1f),
|
||||
// gamepad
|
||||
avAcceleration * (if (up) -1f else 1f) * absAxisVal
|
||||
)
|
||||
|
||||
walkY += readonly_totalY
|
||||
walkY = absClamp(walkY, actorValue.getAsDouble(AVKey.SPEED)!! * actorValue.getAsDouble(AVKey.SPEEDMULT)!!)
|
||||
walkY = walkY.bipolarClamp(avSpeedCap)
|
||||
|
||||
walkCounterY += 1
|
||||
|
||||
@@ -472,7 +457,7 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
*/
|
||||
private fun jump() {
|
||||
val len = MAX_JUMP_LENGTH.toFloat()
|
||||
val pwr = actorValue.getAsDouble(AVKey.JUMPPOWER)!! * (actorValue.getAsDouble(AVKey.JUMPPOWERMULT) ?: 1.0)
|
||||
val pwr = actorValue.getAsDouble(AVKey.JUMPPOWER)!! * (actorValue.getAsDouble(AVKey.JUMPPOWERBUFF) ?: 1.0)
|
||||
val jumpLinearThre = 0.08
|
||||
|
||||
fun jumpFunc(x: Int): Double {
|
||||
@@ -511,15 +496,6 @@ open class ActorHumanoid(birth: GameDate, death: GameDate? = null)
|
||||
return input.isKeyDown(KeyMap.getKeyCode(fn))
|
||||
}
|
||||
|
||||
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 0.0
|
||||
}
|
||||
|
||||
fun isNoClip(): Boolean {
|
||||
return noClip
|
||||
}
|
||||
|
||||
@@ -23,6 +23,10 @@ import java.util.*
|
||||
*/
|
||||
open class ActorWithBody : Actor() {
|
||||
|
||||
|
||||
/** !! ActorValue macros are on the very bottom of the source !! **/
|
||||
|
||||
|
||||
override var actorValue: ActorValue = ActorValue()
|
||||
|
||||
@Transient internal var sprite: SpriteAnimation? = null
|
||||
@@ -93,10 +97,13 @@ open class ActorWithBody : Actor() {
|
||||
/**
|
||||
* Physical properties.
|
||||
*/
|
||||
/** Apparent scale. Use "avBaseScale" for base scale */
|
||||
var scale: Double
|
||||
get() = actorValue.getAsDouble(AVKey.SCALE) ?: 1.0
|
||||
set(value) = actorValue.set(AVKey.SCALE, value)
|
||||
get() = (actorValue.getAsDouble(AVKey.SCALE) ?: 1.0) *
|
||||
(actorValue.getAsDouble(AVKey.SCALEBUFF) ?: 1.0)
|
||||
set(value) = actorValue.set(AVKey.SCALE, value / (actorValue.getAsDouble(AVKey.SCALEBUFF) ?: 1.0))
|
||||
@Transient val MASS_LOWEST = 0.1 // Kilograms
|
||||
/** Apparent mass. Use "avBaseMass" for base mass */
|
||||
var mass: Double
|
||||
get() = actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT * Math.pow(scale, 3.0)
|
||||
set(value) {
|
||||
@@ -107,7 +114,7 @@ open class ActorWithBody : Actor() {
|
||||
actorValue[AVKey.BASEMASS] = MASS_LOWEST
|
||||
}
|
||||
|
||||
actorValue[AVKey.BASEMASS] = value
|
||||
actorValue[AVKey.BASEMASS] = value / Math.pow(scale, 3.0)
|
||||
}
|
||||
@Transient private val MASS_DEFAULT: Double = 60.0
|
||||
/** Valid range: [0, 1] */
|
||||
@@ -1134,16 +1141,45 @@ open class ActorWithBody : Actor() {
|
||||
return if (Math.abs(x) > ceil) ceil else x
|
||||
}
|
||||
}
|
||||
|
||||
// gameplay-related actorvalue macros
|
||||
|
||||
var avBaseScale: Double // use canonical "scale" for apparent scale (base * buff)
|
||||
get() = actorValue.getAsDouble(AVKey.SCALE) ?: 1.0
|
||||
set(value) { actorValue[AVKey.SCALE] = value }
|
||||
/** Apparent strength */
|
||||
var avStrength: Double
|
||||
get() = (actorValue.getAsDouble(AVKey.STRENGTH) ?: 0.0) *
|
||||
(actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 0.0) * scale
|
||||
set(value) {
|
||||
actorValue[AVKey.STRENGTH] =
|
||||
value /
|
||||
((actorValue.getAsDouble(AVKey.STRENGTHBUFF) ?: 1.0) * (avBaseStrength ?: 1.0))
|
||||
}
|
||||
var avBaseStrength: Double?
|
||||
get() = actorValue.getAsDouble(AVKey.STRENGTH)
|
||||
set(value) { actorValue[AVKey.STRENGTH] = value!! }
|
||||
var avBaseMass: Double
|
||||
get() = actorValue.getAsDouble(AVKey.BASEMASS) ?: MASS_DEFAULT
|
||||
set(value) { actorValue[AVKey.BASEMASS] = value }
|
||||
val avAcceleration: Double
|
||||
get() = actorValue.getAsDouble(AVKey.ACCEL)!! *
|
||||
actorValue.getAsDouble(AVKey.ACCELBUFF)!! *
|
||||
scale.sqrt()
|
||||
val avSpeedCap: Double
|
||||
get() = actorValue.getAsDouble(AVKey.SPEED)!! *
|
||||
actorValue.getAsDouble(AVKey.SPEEDBUFF)!! *
|
||||
scale.sqrt()
|
||||
}
|
||||
|
||||
fun Double.floorInt() = Math.floor(this).toInt()
|
||||
fun Float.floorInt() = FastMath.floor(this).toInt()
|
||||
fun Float.ceilInt() = FastMath.ceil(this).toInt()
|
||||
fun Float.floorInt() = FastMath.floor(this)
|
||||
fun Float.ceilInt() = FastMath.ceil(this)
|
||||
fun Double.round() = Math.round(this).toDouble()
|
||||
fun Double.floor() = Math.floor(this)
|
||||
fun Double.ceil() = this.floor() + 1.0
|
||||
fun Double.roundInt(): Int = Math.round(this).toInt()
|
||||
fun Float.roundInt(): Int = Math.round(this).toInt()
|
||||
fun Float.roundInt(): Int = Math.round(this)
|
||||
fun Double.abs() = Math.abs(this)
|
||||
fun Double.sqr() = this * this
|
||||
fun Double.sqrt() = Math.sqrt(this)
|
||||
|
||||
@@ -17,7 +17,7 @@ object InjectCreatureRaw {
|
||||
// FIXME strength not injected properly?
|
||||
|
||||
const val JSONPATH = "./assets/raw/creatures/"
|
||||
private const val MULTIPLIER_RAW_ELEM_SUFFIX = AVKey.MULT
|
||||
private const val JSONMULT = "mult" // one appears in JSON files
|
||||
|
||||
/**
|
||||
* 'Injects' creature raw ActorValue to the ActorValue reference provided.
|
||||
@@ -43,7 +43,7 @@ object InjectCreatureRaw {
|
||||
setAVBooleans(actorValueRef, elementsBoolean, jsonObj)
|
||||
|
||||
actorValueRef[AVKey.ACCEL] = ActorHumanoid.WALK_ACCEL_BASE
|
||||
actorValueRef[AVKey.ACCELMULT] = 1.0
|
||||
actorValueRef[AVKey.ACCELBUFF] = 1.0
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,11 +60,11 @@ object InjectCreatureRaw {
|
||||
// roll fudge dice and get value [-3, 3] as [0, 6]
|
||||
val varSelected = Fudge3(SecureRandom()).rollForArray()
|
||||
// get multiplier from json. Assuming percentile
|
||||
val multiplier = jsonObject.get(s + MULTIPLIER_RAW_ELEM_SUFFIX).asJsonArray.get(varSelected).asInt
|
||||
val multiplier = jsonObject.get(s + JSONMULT).asJsonArray.get(varSelected).asInt
|
||||
val realValue = baseValue * multiplier / 100.0
|
||||
|
||||
avRef[s] = realValue
|
||||
avRef[s + MULTIPLIER_RAW_ELEM_SUFFIX] = 1.0 // use multiplied value as 'base' for all sort of things
|
||||
avRef[s + "buff"] = 1.0 // buffed value: use multiplied value as 'base' for all sort of things
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,7 +113,6 @@ object InjectCreatureRaw {
|
||||
|
||||
/**
|
||||
* Fetch and set actor values that should multiplier be applied to the base value of 1.
|
||||
* E.g. physiquemult
|
||||
* @param avRef
|
||||
* *
|
||||
* @param elemSet
|
||||
|
||||
@@ -39,13 +39,13 @@ object PlayerBuilderSigrid {
|
||||
p.actorValue = ActorValue()
|
||||
p.actorValue[AVKey.SCALE] = 1.0
|
||||
p.actorValue[AVKey.SPEED] = 4.0
|
||||
p.actorValue[AVKey.SPEEDMULT] = 1.0
|
||||
p.actorValue[AVKey.SPEEDBUFF] = 1.0
|
||||
p.actorValue[AVKey.ACCEL] = ActorHumanoid.WALK_ACCEL_BASE
|
||||
p.actorValue[AVKey.ACCELMULT] = 1.0
|
||||
p.actorValue[AVKey.ACCELBUFF] = 1.0
|
||||
p.actorValue[AVKey.JUMPPOWER] = 5.0
|
||||
|
||||
p.actorValue[AVKey.BASEMASS] = 80.0
|
||||
p.actorValue[AVKey.PHYSIQUEMULT] = 1 // Constant 1.0 for player, meant to be used by random mobs
|
||||
p.actorValue[AVKey.SCALEBUFF] = 1.0 // Constant 1.0 for player, meant to be used by random mobs
|
||||
/**
|
||||
* fixed value, or 'base value', from creature strength of Dwarf Fortress.
|
||||
* Human race uses 1000. (see CreatureHuman.json)
|
||||
|
||||
Reference in New Issue
Block a user