From 4d157cb19a0cd7dddb28d0e2bd13490b6535878c Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Tue, 23 Jul 2013 06:13:08 -0700 Subject: [PATCH] Handle marksmen weapon attack sequences --- apps/openmw/mwmechanics/character.cpp | 56 +++++++++++++++++---------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index d7cb7cf6c3..067bbc074e 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -413,20 +413,24 @@ bool CharacterController::updateNpcState() if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) { - if(mUpperBodyState == UpperCharState_WeapEquiped && mWeaponType != WeapType_Crossbow && - mWeaponType != WeapType_BowAndArrow && mWeaponType != WeapType_ThowWeapon && - mWeaponType != WeapType_PickProbe) + if(mUpperBodyState == UpperCharState_WeapEquiped && mWeaponType != WeapType_PickProbe) { - int attackType = cls.getCreatureStats(mPtr).getAttackType(); - if(isWeapon && Settings::Manager::getBool("best attack", "Game")) - attackType = getBestAttack(weapon->get()->mBase); - - if (attackType == MWMechanics::CreatureStats::AT_Chop) - mAttackType = "chop"; - else if (attackType == MWMechanics::CreatureStats::AT_Slash) - mAttackType = "slash"; + if(mWeaponType == WeapType_Crossbow || mWeaponType == WeapType_BowAndArrow || + mWeaponType == WeapType_ThowWeapon) + mAttackType = "shoot"; else - mAttackType = "thrust"; + { + int attackType = cls.getCreatureStats(mPtr).getAttackType(); + if(isWeapon && Settings::Manager::getBool("best attack", "Game")) + attackType = getBestAttack(weapon->get()->mBase); + + if (attackType == MWMechanics::CreatureStats::AT_Chop) + mAttackType = "chop"; + else if (attackType == MWMechanics::CreatureStats::AT_Slash) + mAttackType = "slash"; + else + mAttackType = "thrust"; + } mAnimation->play(mCurrentWeapon, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, @@ -467,19 +471,31 @@ bool CharacterController::updateNpcState() else if(mUpperBodyState == UpperCharState_MaxAttackToMinHit) { mAnimation->disable(mCurrentWeapon); - mAnimation->play(mCurrentWeapon, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed, mAttackType+" min hit", mAttackType+" hit", - 0.0f, 0); + if(mAttackType == "shoot") + mAnimation->play(mCurrentWeapon, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed, mAttackType+" min hit", mAttackType+" follow start", + 0.0f, 0); + else + mAnimation->play(mCurrentWeapon, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed, mAttackType+" min hit", mAttackType+" hit", + 0.0f, 0); mUpperBodyState = UpperCharState_MinHitToHit; } else if(mUpperBodyState == UpperCharState_MinHitToHit) { mAnimation->disable(mCurrentWeapon); - mAnimation->play(mCurrentWeapon, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, - weapSpeed, mAttackType+" large follow start", mAttackType+" large follow stop", - 0.0f, 0); + if(mAttackType == "shoot") + mAnimation->play(mCurrentWeapon, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + weapSpeed, mAttackType+" follow start", mAttackType+" follow stop", + 0.0f, 0); + else + mAnimation->play(mCurrentWeapon, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + weapSpeed, mAttackType+" large follow start", mAttackType+" large follow stop", + 0.0f, 0); mUpperBodyState = UpperCharState_FollowStartToFollowStop; } }