diff --git a/src/net/torvald/terrarum/gameactors/AVKey.kt b/src/net/torvald/terrarum/gameactors/AVKey.kt index d64307874..ca755434c 100644 --- a/src/net/torvald/terrarum/gameactors/AVKey.kt +++ b/src/net/torvald/terrarum/gameactors/AVKey.kt @@ -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 diff --git a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt index 7139b2ccd..b34218ef3 100644 --- a/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/gameactors/ActorHumanoid.kt @@ -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 } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 3ae2eb5f1..cd2dc47f1 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -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) diff --git a/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt b/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt index 0e57d78ac..26b3c1580 100644 --- a/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt +++ b/src/net/torvald/terrarum/gameactors/InjectCreatureRaw.kt @@ -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 diff --git a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt index de7a0d6fc..79327d703 100644 --- a/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt +++ b/src/net/torvald/terrarum/gameactors/PlayerBuilderSigrid.kt @@ -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)