1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-06-19 07:41: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,55 +1579,12 @@ 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;
}
else
{
animPlaying = mAnimation->getInfo(mCurrentWeapon, &complete);
if (mUpperBodyState == UpperBodyState::AttackWindUp && !isKnockedDown())
{
world->breakInvisibility(mPtr);
float attackStrength = complete;
float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack");
float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack");
if (minAttackTime == maxAttackTime)
{
// 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)
// 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));
}
if(weapclass != ESM::WeaponType::Ranged && weapclass != ESM::WeaponType::Thrown) if (isKnockedDown())
{
if(isWerewolf)
{
const MWWorld::ESMStore &store = world->getStore();
const ESM::Sound *sound = store.get<ESM::Sound>().searchRandom("WolfSwing", prng);
if(sound)
sndMgr->playSound3D(mPtr, sound->mId, 1.0f, 1.0f);
}
else
{
playSwishSound(attackStrength);
}
}
mAttackStrength = attackStrength;
mAnimation->disable(mCurrentWeapon);
mAnimation->play(mCurrentWeapon, priorityWeapon,
MWRender::Animation::BlendMask_All, false,
weapSpeed, mAttackType+" max attack", mAttackType+" min hit",
1.0f-complete, 0);
complete = 0.f;
mUpperBodyState = UpperBodyState::AttackRelease;
}
else if (isKnockedDown())
{ {
if (mUpperBodyState > UpperBodyState::WeaponEquipped) if (mUpperBodyState > UpperBodyState::WeaponEquipped)
{ {
@ -1638,6 +1595,49 @@ bool CharacterController::updateWeaponState()
if (!mCurrentWeapon.empty()) if (!mCurrentWeapon.empty())
mAnimation->disable(mCurrentWeapon); mAnimation->disable(mCurrentWeapon);
} }
if (mUpperBodyState == UpperBodyState::AttackWindUp)
{
mAttackStrength = complete;
if (!getAttackingOrSpell())
{
world->breakInvisibility(mPtr);
float minAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"min attack");
float maxAttackTime = mAnimation->getTextKeyTime(mCurrentWeapon+": "+mAttackType+" "+"max attack");
if (minAttackTime == maxAttackTime)
{
// 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)
// Note: vanilla MW uses a random value for *all* non-player actors, but we probably don't need to go that far.
mAttackStrength = std::min(1.f, 0.1f + Misc::Rng::rollClosedProbability(prng));
}
if(weapclass != ESM::WeaponType::Ranged && weapclass != ESM::WeaponType::Thrown)
{
if (isWerewolf)
{
const MWWorld::ESMStore &store = world->getStore();
const ESM::Sound *sound = store.get<ESM::Sound>().searchRandom("WolfSwing", prng);
if(sound)
sndMgr->playSound3D(mPtr, sound->mId, 1.0f, 1.0f);
}
else
{
playSwishSound(mAttackStrength);
}
}
if (animPlaying)
mAnimation->disable(mCurrentWeapon);
mAnimation->play(mCurrentWeapon, priorityWeapon,
MWRender::Animation::BlendMask_All, false,
weapSpeed, mAttackType+" max attack", mAttackType+" min hit",
1.0f-complete, 0);
complete = 0.f;
mUpperBodyState = UpperBodyState::AttackRelease;
}
} }
mAnimation->setPitchFactor(0.f); mAnimation->setPitchFactor(0.f);