Research:Movement: Difference between revisions

From OpenMW Wiki
Jump to navigation Jump to search
m (Add forgotten syntax highlight closing tag)
Line 50: Line 50:
|On jumping and landing
|On jumping and landing
|Uses common term [[Research:Common_Terms#fatigueTerm|fatigueTerm]].
|Uses common term [[Research:Common_Terms#fatigueTerm|fatigueTerm]].
|{{StatusCol|red|not started yet}}
|{{StatusCol|green|implemented}}
|{{StatusCol|orange|Initial velocity verified; requires testing in combination with physics system}}}}
|{{StatusCol|orange|Initial velocity verified; requires testing in combination with physics system}}}}



Revision as of 12:56, 9 December 2013

Movement

Actions affected Movement
Description Describes movement speed.
Implementation status
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.


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.