Research:Movement
Jump to navigation
Jump to search
Movement
Actions affected | Movement |
Description | Describes movement speed. |
Implementation status | implemented |
Analysis status | Feeds into animation system; werewolf mechanics not verified; requires testing in combination with physics system |
if actor is a npc:
walkSpeed = fMinWalkSpeed + 0.01 * speedAttribute * (fMaxWalkSpeed - fMinWalkSpeed)
walkSpeed *= 1 - fEncumberedMoveEffect * normalizedEncumbrance
walkSpeed = max(0, walkSpeed)
if sneaking: walkSpeed *= fSneakSpeedMultiplier
elif actor is a creature:
walkSpeed = fMinWalkSpeedCreature + 0.01 * speedAttribute * (fMaxWalkSpeedCreature - fMinWalkSpeedCreature)
runSpeed = walkSpeed * (0.01 * athleticsSkill * fAthleticsRunBonus + fBaseRunMultiplier)
if encumbrance > maxEncumbrance:
moveSpeed = 0
elif flying or levitating:
flySpeed = 0.01 * (speedAttribute + levitationBonus)
flySpeed = fMinFlySpeed + flySpeed * (fMaxFlySpeed - fMinFlySpeed)
flySpeed *= 1 - fEncumberedMoveEffect * normalizedEncumbrance
flySpeed = max(0, flySpeed)
moveSpeed = flySpeed
elif swimming:
if running:
swimSpeed = runSpeed
elif walking:
swimSpeed = walkSpeed
swimSpeed *= 1 + 0.01 * swiftSwimBonus
swimSpeed *= 0.01 * athleticsSkill * fSwimRunAthleticsMult + fSwimRunBase
moveSpeed = swimSpeed
elif running:
moveSpeed = runSpeed
elif walking or sneaking:
moveSpeed = walkSpeed
else:
moveSpeed = 0
if strafing (not including diagonally): moveSpeed *= 0.75
if actor is a werewolf and running: moveSpeed *= fWereWolfRunMult
moveSpeed is passed to animation system.
Comments
Creatures have generalized combat, magic and stealth stats which substitute for the specific skills (in the same way as specializations). Creatures do not suffer slow down from encumbrance (fEncumberedMoveEffect). They will only completely stop dead, once they exceed their encumbrance limit.
Acrobatics
Actions affected | On jumping and landing |
Description | Uses common term fatigueTerm. |
Implementation status | implemented |
Analysis status | Initial velocity verified; requires testing in combination with physics system |
On jumping
encumbranceTerm = fJumpEncumbranceBase + fJumpEncumbranceMultiplier * (1 - normalizedEncumbrance)
where normalizedEncumbrance is a function of encumbrance. empty bar -> 0.0, full bar -> 1.0
if acrobaticsSkill <= 50:
a = acrobaticsSkill, b = 0
else:
a = 50, b = acrobaticsSkill - 50
x = fJumpAcrobaticsBase + pow(a / 15.0, fJumpAcroMultiplier)
x += 3 * b * fJumpAcroMultiplier
x += jumpSpellBonus * 64
x *= encumbranceTerm
if actor is running: x *= fJumpRunMultiplier
x *= fatigueTerm
x -= gravityAcceleration [constant; -627.2 exactly]
x /= 3
if actor is standing still:
set kinematic velocity to {0, 0, x}
if actor is moving:
groundVelocity = normalize({actorVelocity.x, actorVelocity.y})
set kinematic velocity to 0.707 * x * {groundVelocity.x, groundVelocity.y, 1.0}
decrease fatigue by fFatigueJumpBase + (1 - normalizedEncumbrance) * fFatigueJumpMult
On landing
fallingDist = distance from peak height
if fallingDist <= fFallDamageDistanceMin: soft landing; skip the rest of the function
x = fallingDist - fFallDamageDistanceMin
x -= 1.5 * acrobaticsSkill + jumpSpellBonus
x = max(0, x)
a = fFallAcroBase + fFallAcroMult * (100 - acrobaticsSkill)
x = fFallDistanceBase + fFallDistanceMult * x
x *= a
if x > 0: damage health by x * (1 - 0.25 * fatigueTerm)
if acrobaticsSkill * fatigueTerm < x: actor falls over
if actor is not incapacitated: acrobatics skill exercised (skill gain from fall damage)
Comments
Note that initial actor velocity is taken into account. Animation-driven kinematics mean the jump direction can be offset from the player facing if there is root bone movement. Agility does not appear to be involved in this calculation.