1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-19 11:11:33 +00:00

Detangle attack start, knockdown attack cancel and on-going wind-up logic

This commit is contained in:
Alexei Kotov 2022-08-08 21:14:58 +03:00
parent 8f280c521c
commit 09141388ad

View file

@ -1579,19 +1579,30 @@ bool CharacterController::updateWeaponState()
{ {
resetCurrentIdleState(); resetCurrentIdleState();
} }
}
if (!animPlaying) if (!animPlaying)
animPlaying = mAnimation->getInfo(mCurrentWeapon, &complete); animPlaying = mAnimation->getInfo(mCurrentWeapon, &complete);
if (mUpperBodyState == UpperBodyState::AttackWindUp && !isKnockedDown())
mAttackStrength = complete; if (isKnockedDown())
}
else
{ {
animPlaying = mAnimation->getInfo(mCurrentWeapon, &complete); if (mUpperBodyState > UpperBodyState::WeaponEquipped)
if (mUpperBodyState == UpperBodyState::AttackWindUp && !isKnockedDown()) {
mUpperBodyState = UpperBodyState::WeaponEquipped;
if (mWeaponType > ESM::Weapon::None)
mAnimation->showWeapons(true);
}
if (!mCurrentWeapon.empty())
mAnimation->disable(mCurrentWeapon);
}
if (mUpperBodyState == UpperBodyState::AttackWindUp)
{
mAttackStrength = complete;
if (!getAttackingOrSpell())
{ {
world->breakInvisibility(mPtr); world->breakInvisibility(mPtr);
float attackStrength = complete;
float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack"); float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack");
float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack"); float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack");
if (minAttackTime == maxAttackTime) if (minAttackTime == maxAttackTime)
@ -1599,7 +1610,7 @@ bool CharacterController::updateWeaponState()
// most creatures don't actually have an attack wind-up animation, so use a uniform random value // most creatures don't actually have an attack wind-up animation, so use a uniform random value
// (even some creatures that can use weapons don't have a wind-up animation either, e.g. Rieklings) // (even some creatures that can use weapons don't have a wind-up animation either, e.g. Rieklings)
// Note: vanilla MW uses a random value for *all* non-player actors, but we probably don't need to go that far. // Note: vanilla MW uses a random value for *all* non-player actors, but we probably don't need to go that far.
attackStrength = std::min(1.f, 0.1f + Misc::Rng::rollClosedProbability(prng)); mAttackStrength = std::min(1.f, 0.1f + Misc::Rng::rollClosedProbability(prng));
} }
if(weapclass != ESM::WeaponType::Ranged && weapclass != ESM::WeaponType::Thrown) if(weapclass != ESM::WeaponType::Ranged && weapclass != ESM::WeaponType::Thrown)
@ -1613,11 +1624,11 @@ bool CharacterController::updateWeaponState()
} }
else else
{ {
playSwishSound(attackStrength); playSwishSound(mAttackStrength);
} }
} }
mAttackStrength = attackStrength;
if (animPlaying)
mAnimation->disable(mCurrentWeapon); mAnimation->disable(mCurrentWeapon);
mAnimation->play(mCurrentWeapon, priorityWeapon, mAnimation->play(mCurrentWeapon, priorityWeapon,
MWRender::Animation::BlendMask_All, false, MWRender::Animation::BlendMask_All, false,
@ -1627,17 +1638,6 @@ bool CharacterController::updateWeaponState()
complete = 0.f; complete = 0.f;
mUpperBodyState = UpperBodyState::AttackRelease; mUpperBodyState = UpperBodyState::AttackRelease;
} }
else if (isKnockedDown())
{
if (mUpperBodyState > UpperBodyState::WeaponEquipped)
{
mUpperBodyState = UpperBodyState::WeaponEquipped;
if (mWeaponType > ESM::Weapon::None)
mAnimation->showWeapons(true);
}
if (!mCurrentWeapon.empty())
mAnimation->disable(mCurrentWeapon);
}
} }
mAnimation->setPitchFactor(0.f); mAnimation->setPitchFactor(0.f);