From 3947f44aa361fbf40279d21d7bda7ce683c85514 Mon Sep 17 00:00:00 2001 From: gus Date: Sat, 13 Jul 2013 22:24:52 +0100 Subject: [PATCH 01/12] Porting old work --- apps/openmw/mwinput/inputmanagerimp.cpp | 6 +++- apps/openmw/mwmechanics/character.cpp | 42 ++++++++++++++++++++++- apps/openmw/mwmechanics/character.hpp | 16 +++++++++ apps/openmw/mwmechanics/creaturestats.cpp | 24 ++++++++++++- apps/openmw/mwmechanics/creaturestats.hpp | 10 ++++++ apps/openmw/mwrender/animation.cpp | 7 ++++ 6 files changed, 102 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index f19f634589..d46508157a 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -20,6 +20,7 @@ #include "../mwbase/windowmanager.hpp" #include "../mwbase/soundmanager.hpp" #include "../mwgui/bookwindow.hpp" +#include "../mwmechanics/creaturestats.hpp" using namespace ICS; @@ -498,6 +499,8 @@ namespace MWInput MyGUI::InputManager::getInstance().injectKeyRelease(MyGUI::KeyCode::Enum(kc)); + MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(false); + return true; } @@ -509,7 +512,6 @@ namespace MWInput return true; // MyGUI has no use for these events MyGUI::InputManager::getInstance().injectMousePress(mMouseX, mMouseY, sdlButtonToMyGUI(id)); - if (MyGUI::InputManager::getInstance ().getMouseFocusWidget () != 0) { MyGUI::Button* b = MyGUI::InputManager::getInstance ().getMouseFocusWidget ()->castType(false); @@ -519,6 +521,8 @@ namespace MWInput } } + MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(true); + return true; } diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index d3dbb93256..4b95999bfa 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -175,6 +175,7 @@ CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Anim : mPtr(ptr) , mAnimation(anim) , mCharState(state) + , mUpperBodyState(UpperCharState_Nothing) , mWeaponType(WeapType_None) , mSkipAnim(false) , mSecondsOfRunning(0) @@ -237,6 +238,26 @@ void CharacterController::update(float duration, Movement &movement) } else if(!cls.getCreatureStats(mPtr).isDead()) { + std::list> lastKeys = cls.getCreatureStats(mPtr).getLastAnimKey(); + for(std::list>::iterator it = cls.getCreatureStats(mPtr).getLastAnimKey().begin(); + it!=cls.getCreatureStats(mPtr).getLastAnimKey().end();) + { + std::cout << "NE"; + std::pair lastKey = *it; + if(!lastKey.first.empty()) + { + std::cout << lastKey.first << " " << lastKey.second << " "; + //const std::string &evt = key->second; + size_t off = lastKey.second.size()+2; + size_t len = lastKey.first.size() - off; + + if(lastKey.first.compare(off, len, "equip stop") == 0) mUpperBodyState = UpperCharState_WeapEquiped; + if(lastKey.first.compare(off, len, "unequip stop") == 0) mUpperBodyState = UpperCharState_Nothing; + if(lastKey.first.compare(off, len, "chop large follow stop") == 0){ mUpperBodyState = UpperCharState_WeapEquiped;std::cout << "FINISHED";} + } + it = cls.getCreatureStats(mPtr).getLastAnimKey().erase(it); + } + MWBase::World *world = MWBase::Environment::get().getWorld(); bool onground = world->isOnGround(mPtr); @@ -333,7 +354,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimQueue.pop_front(); mAnimation->play(mAnimQueue.front().first, Priority_Default, - MWRender::Animation::Group_All, false, + MWRender::Animation::Group_All, true, "start", "stop", 0.0f, mAnimQueue.front().second); } } @@ -424,6 +445,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, true, "unequip start", "unequip stop", 0.0f, 0); + mUpperBodyState = UpperCharState_UnEquipingWeap; } else { @@ -432,6 +454,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, true, "equip start", "equip stop", 0.0f, 0); + mUpperBodyState = UpperCharState_EquipingWeap; } mWeaponType = weaptype; @@ -450,6 +473,23 @@ void CharacterController::update(float duration, Movement &movement) } } + if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) + { + if(mUpperBodyState == UpperCharState_WeapEquiped) + { + std::string weapgroup; + getWeaponGroup(mWeaponType, weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + "chop start", "chop large follow stop", 0.0f, 0); + mUpperBodyState = UpperCharState_ChopReadyingMouseHold; + } + } + else if(mUpperBodyState == UpperCharState_ChopReadyingMouseHold) + { + mUpperBodyState = UpperCharState_ChopReadying; + } + MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name()) { diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index cf5d6e8231..ab01038b8c 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -92,6 +92,21 @@ enum WeaponType { WeapType_Spell }; +enum UpperBodyCharacterState { + UpperCharState_Nothing, + UpperCharState_EquipingWeap, + UpperCharState_UnEquipingWeap, + UpperCharState_WeapEquiped, + UpperCharState_Slashing, + UpperCharState_ChopReadying, + UpperCharState_ChopReadyingMouseHold, //when you keep your mouse clicked to ready your weapon + UpperCharState_ChopReadyWaiting, //when your weapon is ready and you keep mouse hold + UpperCharState_Choping, + UpperCharState_Thrusting, + UpperCharState_EquipingSpell, + UpperCharState_UnEquipingSpell +}; + class CharacterController { MWWorld::Ptr mPtr; @@ -101,6 +116,7 @@ class CharacterController AnimationQueue mAnimQueue; CharacterState mCharState; + UpperBodyCharacterState mUpperBodyState; WeaponType mWeaponType; bool mSkipAnim; diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 19d2080211..f4f208bcfc 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -12,7 +12,8 @@ namespace MWMechanics CreatureStats::CreatureStats() : mLevel (0), mLevelHealthBonus(0.f), mDead (false), mDied (false), mFriendlyHits (0), mTalkedTo (false), mAlarmed (false), - mAttacked (false), mHostile (false) + mAttacked (false), mHostile (false), + mAttackingOrSpell(false) { for (int i=0; i<4; ++i) mAiSettings[i] = 0; @@ -90,6 +91,16 @@ namespace MWMechanics return mMagicEffects; } + const bool &CreatureStats::getAttackingOrSpell() const + { + return mAttackingOrSpell; + } + + std::list> &CreatureStats::getLastAnimKey() + { + return mLastAnimKeys; + } + int CreatureStats::getLevel() const { return mLevel; @@ -191,6 +202,17 @@ namespace MWMechanics mMagicEffects = effects; } + void CreatureStats::setAttackingOrSpell(const bool &attackingOrSpell) + { + mAttackingOrSpell = attackingOrSpell; + } + + /*void CreatureStats::setLastAnimKey(std::string key,std::string animGroup) + { + mLastAnimKey = key; + mLastAnimGroup = animGroup; + }*/ + void CreatureStats::setAiSetting (int index, int value) { assert (index>=0 && index<4); diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index 63de13d0d4..7bb1dc4391 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -34,6 +34,8 @@ namespace MWMechanics bool mAlarmed; bool mAttacked; bool mHostile; + bool mAttackingOrSpell;//for the player, this is true if the left mouse button is pressed, false if not. + std::list> mLastAnimKeys; public: CreatureStats(); @@ -54,6 +56,10 @@ namespace MWMechanics const MagicEffects & getMagicEffects() const; + const bool & getAttackingOrSpell() const; + + std::list> & getLastAnimKey(); + int getLevel() const; int getAiSetting (int index) const; @@ -83,6 +89,10 @@ namespace MWMechanics void setMagicEffects(const MagicEffects &effects); + void setAttackingOrSpell(const bool &attackingOrSpell); + + //void addLastAnimKey(std::string key,std::string animGroup); + void setLevel(int level); void setAiSetting (int index, int value); diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 853ffc3752..db9736eb90 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -15,6 +15,11 @@ #include "../mwmechanics/character.hpp" + +//TODO: remove that and create a class interface +#include "../mwmechanics/creaturestats.hpp" +#include "../mwworld/class.hpp" + namespace MWRender { @@ -475,6 +480,8 @@ bool Animation::handleTextKey(AnimState &state, const std::string &groupname, co return true; } + MWWorld::Class::get(mPtr).getCreatureStats(mPtr).getLastAnimKey().push_back(std::pair(key->second,groupname)); + if(evt.compare(off, len, "equip attach") == 0) { showWeapons(true); From 076f98cbba263a572e10995192814ad3e7a37c80 Mon Sep 17 00:00:00 2001 From: gus Date: Mon, 15 Jul 2013 16:37:25 +0100 Subject: [PATCH 02/12] change way animations keys are handled (thanks KittyCat!) --- apps/openmw/mwmechanics/character.cpp | 15 +++++++++++++-- apps/openmw/mwmechanics/creaturestats.cpp | 11 ----------- apps/openmw/mwmechanics/creaturestats.hpp | 5 ----- apps/openmw/mwrender/animation.cpp | 7 ------- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 4b95999bfa..35f2ae207b 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -238,7 +238,7 @@ void CharacterController::update(float duration, Movement &movement) } else if(!cls.getCreatureStats(mPtr).isDead()) { - std::list> lastKeys = cls.getCreatureStats(mPtr).getLastAnimKey(); + /*std::list> lastKeys = cls.getCreatureStats(mPtr).getLastAnimKey(); for(std::list>::iterator it = cls.getCreatureStats(mPtr).getLastAnimKey().begin(); it!=cls.getCreatureStats(mPtr).getLastAnimKey().end();) { @@ -256,7 +256,7 @@ void CharacterController::update(float duration, Movement &movement) if(lastKey.first.compare(off, len, "chop large follow stop") == 0){ mUpperBodyState = UpperCharState_WeapEquiped;std::cout << "FINISHED";} } it = cls.getCreatureStats(mPtr).getLastAnimKey().erase(it); - } + }*/ MWBase::World *world = MWBase::Environment::get().getWorld(); @@ -478,6 +478,7 @@ void CharacterController::update(float duration, Movement &movement) if(mUpperBodyState == UpperCharState_WeapEquiped) { std::string weapgroup; + std::cout << "attaquing"; getWeaponGroup(mWeaponType, weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, true, @@ -490,6 +491,16 @@ void CharacterController::update(float duration, Movement &movement) mUpperBodyState = UpperCharState_ChopReadying; } + std::string weapgroup; + getWeaponGroup(mWeaponType, weapgroup); + std::string start; + std::string stop; + float complete; + bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&start,&stop); + if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; + if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; + if(mUpperBodyState == UpperCharState_ChopReadying && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; + MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name()) { diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index f4f208bcfc..8b4da03d2a 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -96,11 +96,6 @@ namespace MWMechanics return mAttackingOrSpell; } - std::list> &CreatureStats::getLastAnimKey() - { - return mLastAnimKeys; - } - int CreatureStats::getLevel() const { return mLevel; @@ -207,12 +202,6 @@ namespace MWMechanics mAttackingOrSpell = attackingOrSpell; } - /*void CreatureStats::setLastAnimKey(std::string key,std::string animGroup) - { - mLastAnimKey = key; - mLastAnimGroup = animGroup; - }*/ - void CreatureStats::setAiSetting (int index, int value) { assert (index>=0 && index<4); diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index 7bb1dc4391..7423e76b2b 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -35,7 +35,6 @@ namespace MWMechanics bool mAttacked; bool mHostile; bool mAttackingOrSpell;//for the player, this is true if the left mouse button is pressed, false if not. - std::list> mLastAnimKeys; public: CreatureStats(); @@ -58,8 +57,6 @@ namespace MWMechanics const bool & getAttackingOrSpell() const; - std::list> & getLastAnimKey(); - int getLevel() const; int getAiSetting (int index) const; @@ -91,8 +88,6 @@ namespace MWMechanics void setAttackingOrSpell(const bool &attackingOrSpell); - //void addLastAnimKey(std::string key,std::string animGroup); - void setLevel(int level); void setAiSetting (int index, int value); diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index db9736eb90..853ffc3752 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -15,11 +15,6 @@ #include "../mwmechanics/character.hpp" - -//TODO: remove that and create a class interface -#include "../mwmechanics/creaturestats.hpp" -#include "../mwworld/class.hpp" - namespace MWRender { @@ -480,8 +475,6 @@ bool Animation::handleTextKey(AnimState &state, const std::string &groupname, co return true; } - MWWorld::Class::get(mPtr).getCreatureStats(mPtr).getLastAnimKey().push_back(std::pair(key->second,groupname)); - if(evt.compare(off, len, "equip attach") == 0) { showWeapons(true); From f7b711aabe4ce7022f28c691bf253bcce2d61c07 Mon Sep 17 00:00:00 2001 From: gus Date: Mon, 15 Jul 2013 16:37:32 +0100 Subject: [PATCH 03/12] bugfix --- apps/openmw/mwinput/inputmanagerimp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index d46508157a..739176a8e2 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -499,8 +499,6 @@ namespace MWInput MyGUI::InputManager::getInstance().injectKeyRelease(MyGUI::KeyCode::Enum(kc)); - MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(false); - return true; } @@ -532,6 +530,8 @@ namespace MWInput MyGUI::InputManager::getInstance().injectMouseRelease(mMouseX, mMouseY, sdlButtonToMyGUI(id)); + MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(false); + return true; } From f7f23ac5d8f3e6c6f541d5f56b66abc9977f4742 Mon Sep 17 00:00:00 2001 From: gus Date: Mon, 15 Jul 2013 17:18:16 +0100 Subject: [PATCH 04/12] improvement of the chop animation. Still some jittering. --- apps/openmw/mwmechanics/character.cpp | 50 +++++++++++++++++++++++---- apps/openmw/mwmechanics/character.hpp | 12 +++++-- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 35f2ae207b..9bc914ce34 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -478,17 +478,30 @@ void CharacterController::update(float duration, Movement &movement) if(mUpperBodyState == UpperCharState_WeapEquiped) { std::string weapgroup; - std::cout << "attaquing"; getWeaponGroup(mWeaponType, weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, true, - "chop start", "chop large follow stop", 0.0f, 0); - mUpperBodyState = UpperCharState_ChopReadyingMouseHold; + "chop start", "chop min attack", 0.0f, 0); + mUpperBodyState = UpperCharState_ChopStartToMinAttack; } } - else if(mUpperBodyState == UpperCharState_ChopReadyingMouseHold) + else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) { - mUpperBodyState = UpperCharState_ChopReadying; + std::string weapgroup; + getWeaponGroup(mWeaponType, weapgroup); + std::string start; + std::string stop; + float complete; + //mAnimation-> + if(mAnimation->getInfo(weapgroup,&complete,&start,&stop)) + { + std::cout << "BLABLABLA"; + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + "chop max attack", "chop min hit", 1-complete, 0); + } + mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; } std::string weapgroup; @@ -499,7 +512,32 @@ void CharacterController::update(float duration, Movement &movement) bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&start,&stop); if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; - if(mUpperBodyState == UpperCharState_ChopReadying && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; + if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && !animPlaying) + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + "chop min attack", "chop max attack",0, 0); + std::cout << "changing 1"; + mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; + } + if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && !animPlaying) + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + "chop min hit", "chop hit",0, 0); + mUpperBodyState = UpperCharState_ChopMinHitToHit; + } + if(mUpperBodyState == UpperCharState_ChopMinHitToHit && !animPlaying) + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, true, + "chop large follow start", "chop large follow stop",0, 0); + mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; + } + if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && !animPlaying) + { + mUpperBodyState = UpperCharState_WeapEquiped; + } MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name()) diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index ab01038b8c..72768d7e77 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -98,9 +98,15 @@ enum UpperBodyCharacterState { UpperCharState_UnEquipingWeap, UpperCharState_WeapEquiped, UpperCharState_Slashing, - UpperCharState_ChopReadying, - UpperCharState_ChopReadyingMouseHold, //when you keep your mouse clicked to ready your weapon - UpperCharState_ChopReadyWaiting, //when your weapon is ready and you keep mouse hold + UpperCharState_ChopStartToMinAttack, + UpperCharState_ChopMinAttackToMaxAttack, + UpperCharState_ChopMaxAttackToMinHit, + UpperCharState_ChopMinHitToHit, + UpperCharState_ChopLargeFollowStartToLargeFollowStop, + UpperCharState_ChopMediumFollowStartToMediumFollowStop, + UpperCharState_ChopSmallFollowStartToSmallFollowStop, + //UpperCharState_ChopReadyingMouseHold, //when you keep your mouse clicked to ready your weapon + //UpperCharState_ChopReadyWaiting, //when your weapon is ready and you keep mouse hold UpperCharState_Choping, UpperCharState_Thrusting, UpperCharState_EquipingSpell, From f6e3445414cdab707064a529b803902bb831b79d Mon Sep 17 00:00:00 2001 From: gus Date: Tue, 16 Jul 2013 09:50:59 +0100 Subject: [PATCH 05/12] Jittering gone + bugfix: chop animation works! TODO: fix this unequip stuff --- apps/openmw/mwmechanics/character.cpp | 67 ++++++++++++++++----------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 9bc914ce34..567201952c 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -477,16 +477,18 @@ void CharacterController::update(float duration, Movement &movement) { if(mUpperBodyState == UpperCharState_WeapEquiped) { + std::cout << "ATTaquiomg \n"; std::string weapgroup; getWeaponGroup(mWeaponType, weapgroup); mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, + MWRender::Animation::Group_UpperBody, false, "chop start", "chop min attack", 0.0f, 0); mUpperBodyState = UpperCharState_ChopStartToMinAttack; } } else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) { + std::cout << "OMG \n"; std::string weapgroup; getWeaponGroup(mWeaponType, weapgroup); std::string start; @@ -498,9 +500,15 @@ void CharacterController::update(float duration, Movement &movement) std::cout << "BLABLABLA"; mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, + MWRender::Animation::Group_UpperBody, false, "chop max attack", "chop min hit", 1-complete, 0); } + else + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + "chop max attack", "chop min hit", 0, 0); + } mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; } @@ -510,33 +518,40 @@ void CharacterController::update(float duration, Movement &movement) std::string stop; float complete; bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&start,&stop); + std::cout << "update"; + if(animPlaying) std::cout << "playing\n"; if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; - if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && !animPlaying) + if(animPlaying) { - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, - "chop min attack", "chop max attack",0, 0); - std::cout << "changing 1"; - mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; - } - if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && !animPlaying) - { - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, - "chop min hit", "chop hit",0, 0); - mUpperBodyState = UpperCharState_ChopMinHitToHit; - } - if(mUpperBodyState == UpperCharState_ChopMinHitToHit && !animPlaying) - { - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, true, - "chop large follow start", "chop large follow stop",0, 0); - mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; - } - if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && !animPlaying) - { - mUpperBodyState = UpperCharState_WeapEquiped; + if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + "chop min attack", "chop max attack",0, 0); + mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; + } + else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + "chop min hit", "chop hit",0, 0); + mUpperBodyState = UpperCharState_ChopMinHitToHit; + } + else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + "chop large follow start", "chop large follow stop",0, 0); + mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; + } + else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) + { + mUpperBodyState = UpperCharState_WeapEquiped; + } } MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); From 8fc6e736498b8340fc4b48fd2db5c07ddce24014 Mon Sep 17 00:00:00 2001 From: gus Date: Tue, 16 Jul 2013 11:51:18 +0100 Subject: [PATCH 06/12] post-merge fix --- apps/openmw/mwmechanics/character.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index d8e32be487..60dc3ffedc 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -549,8 +549,9 @@ void CharacterController::update(float duration, Movement &movement) std::string start; std::string stop; float complete; + float speedMult; //mAnimation-> - if(mAnimation->getInfo(weapgroup,&complete,&start,&stop)) + if(mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop)) { std::cout << "BLABLABLA"; mAnimation->disable(weapgroup); @@ -572,9 +573,8 @@ void CharacterController::update(float duration, Movement &movement) std::string start; std::string stop; float complete; - bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&start,&stop); - std::cout << "update"; - if(animPlaying) std::cout << "playing\n"; + float speedMult; + bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop); if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; if(animPlaying) @@ -584,7 +584,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - "chop min attack", "chop max attack",0, 0); + 1.0f,"chop min attack", "chop max attack",0, 0); mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; } else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) @@ -592,7 +592,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - "chop min hit", "chop hit",0, 0); + 1.0f,"chop min hit", "chop hit",0, 0); mUpperBodyState = UpperCharState_ChopMinHitToHit; } else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) @@ -600,7 +600,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - "chop large follow start", "chop large follow stop",0, 0); + 1.0f,"chop large follow start", "chop large follow stop",0, 0); mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; } else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) From 20341ae8b7a03fe418585af663a5f1e5f1d8127a Mon Sep 17 00:00:00 2001 From: gus Date: Tue, 16 Jul 2013 14:10:14 +0100 Subject: [PATCH 07/12] simplification + taking into account weapon speed. Seems too fast, but i'm not sure --- apps/openmw/mwmechanics/character.cpp | 76 ++++++++++++--------------- 1 file changed, 33 insertions(+), 43 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 60dc3ffedc..eca71e15e7 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -528,53 +528,43 @@ void CharacterController::update(float duration, Movement &movement) } } - if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) - { - if(mUpperBodyState == UpperCharState_WeapEquiped) - { - std::cout << "ATTaquiomg \n"; - std::string weapgroup; - getWeaponGroup(mWeaponType, weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop start", "chop min attack", 0.0f, 0); - mUpperBodyState = UpperCharState_ChopStartToMinAttack; - } - } - else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) - { - std::cout << "OMG \n"; - std::string weapgroup; - getWeaponGroup(mWeaponType, weapgroup); - std::string start; - std::string stop; - float complete; - float speedMult; - //mAnimation-> - if(mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop)) - { - std::cout << "BLABLABLA"; - mAnimation->disable(weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop max attack", "chop min hit", 1-complete, 0); - } - else - { - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop max attack", "chop min hit", 0, 0); - } - mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; - } - std::string weapgroup; getWeaponGroup(mWeaponType, weapgroup); + float weapSpeed = 1; + if(weapon != inv.end()) {weapSpeed = weapon->get()->mBase->mData.mSpeed;std::cout << "setspeed "<< weapSpeed<< "\n";} std::string start; std::string stop; float complete; float speedMult; bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop); + if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) + { + if(mUpperBodyState == UpperCharState_WeapEquiped) + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop start", "chop min attack", 0.0f, 0); + mUpperBodyState = UpperCharState_ChopStartToMinAttack; + } + } + else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) + { + if(animPlaying) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop max attack", "chop min hit", 1-complete, 0); + } + else + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop max attack", "chop min hit", 0, 0); + } + mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; + } + if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; if(animPlaying) @@ -584,7 +574,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop min attack", "chop max attack",0, 0); + weapSpeed,"chop min attack", "chop max attack",0, 0); mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; } else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) @@ -592,7 +582,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop min hit", "chop hit",0, 0); + weapSpeed,"chop min hit", "chop hit",0, 0); mUpperBodyState = UpperCharState_ChopMinHitToHit; } else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) @@ -600,7 +590,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - 1.0f,"chop large follow start", "chop large follow stop",0, 0); + weapSpeed,"chop large follow start", "chop large follow stop",0, 0); mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; } else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) From 701ff948878bb2c9d5742040a2fea2d15d3a8dcd Mon Sep 17 00:00:00 2001 From: gus Date: Tue, 16 Jul 2013 14:46:44 +0100 Subject: [PATCH 08/12] bugfix for lockpick --- apps/openmw/mwmechanics/character.cpp | 125 +++++++++++++------------- 1 file changed, 64 insertions(+), 61 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index eca71e15e7..90236b2b4b 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -528,74 +528,77 @@ void CharacterController::update(float duration, Movement &movement) } } - std::string weapgroup; - getWeaponGroup(mWeaponType, weapgroup); - float weapSpeed = 1; - if(weapon != inv.end()) {weapSpeed = weapon->get()->mBase->mData.mSpeed;std::cout << "setspeed "<< weapSpeed<< "\n";} - std::string start; - std::string stop; - float complete; - float speedMult; - bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop); - if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) + if(weaptype != WeapType_PickProbe) { - if(mUpperBodyState == UpperCharState_WeapEquiped) + std::string weapgroup; + getWeaponGroup(mWeaponType, weapgroup); + float weapSpeed = 1; + if(weapon != inv.end()) weapSpeed = weapon->get()->mBase->mData.mSpeed; + std::string start; + std::string stop; + float complete; + float speedMult; + bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop); + if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) { - mAnimation->play(weapgroup, Priority_Weapon, + if(mUpperBodyState == UpperCharState_WeapEquiped) + { + mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, weapSpeed,"chop start", "chop min attack", 0.0f, 0); - mUpperBodyState = UpperCharState_ChopStartToMinAttack; + mUpperBodyState = UpperCharState_ChopStartToMinAttack; + } } - } - else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) - { + else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) + { + if(animPlaying) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop max attack", "chop min hit", 1-complete, 0); + } + else + { + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop max attack", "chop min hit", 0, 0); + } + mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; + } + + if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; + if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; if(animPlaying) { - mAnimation->disable(weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop max attack", "chop min hit", 1-complete, 0); - } - else - { - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop max attack", "chop min hit", 0, 0); - } - mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; - } - - if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; - if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; - if(animPlaying) - { - if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && complete == 1) - { - mAnimation->disable(weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop min attack", "chop max attack",0, 0); - mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; - } - else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) - { - mAnimation->disable(weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop min hit", "chop hit",0, 0); - mUpperBodyState = UpperCharState_ChopMinHitToHit; - } - else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) - { - mAnimation->disable(weapgroup); - mAnimation->play(weapgroup, Priority_Weapon, - MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop large follow start", "chop large follow stop",0, 0); - mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; - } - else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) - { - mUpperBodyState = UpperCharState_WeapEquiped; + if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop min attack", "chop max attack",0, 0); + mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; + } + else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop min hit", "chop hit",0, 0); + mUpperBodyState = UpperCharState_ChopMinHitToHit; + } + else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) + { + mAnimation->disable(weapgroup); + mAnimation->play(weapgroup, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + weapSpeed,"chop large follow start", "chop large follow stop",0, 0); + mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; + } + else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) + { + mUpperBodyState = UpperCharState_WeapEquiped; + } } } From 66e3eacace2d118ed1ec0709a25ef631e183ce31 Mon Sep 17 00:00:00 2001 From: gus Date: Tue, 16 Jul 2013 15:14:34 +0100 Subject: [PATCH 09/12] fix bows --- apps/openmw/mwmechanics/character.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 90236b2b4b..f4c975c41f 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -528,7 +528,8 @@ void CharacterController::update(float duration, Movement &movement) } } - if(weaptype != WeapType_PickProbe) + if(weaptype != WeapType_PickProbe && weaptype != WeapType_BowAndArrow + && weaptype != WeapType_Crossbow && weaptype != WeapType_ThowWeapon) { std::string weapgroup; getWeaponGroup(mWeaponType, weapgroup); From 9536b5050b9161863c40c417c02aa52708091f12 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 16 Jul 2013 16:25:41 +0200 Subject: [PATCH 10/12] Fixes weapon input to use A_Use instead of hardcoding to mouse button --- apps/openmw/mwinput/inputmanagerimp.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index b9f1a67d49..fd2359f5ce 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -161,6 +161,12 @@ namespace MWInput resetIdleTime (); int action = channel->getNumber(); + + if (action == A_Use) + { + MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(currentValue); + } + if (currentValue == 1) { // trigger action activated @@ -522,8 +528,6 @@ namespace MWInput } } - MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(true); - return true; } @@ -533,8 +537,6 @@ namespace MWInput MyGUI::InputManager::getInstance().injectMouseRelease(mMouseX, mMouseY, sdlButtonToMyGUI(id)); - MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(false); - return true; } From 91e95e1404ea33a83b311eddb54ebfb2ce10e195 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 16 Jul 2013 23:32:41 +0200 Subject: [PATCH 11/12] Use the correct slash, chop or thrust animation --- apps/openmw/mwgui/settingswindow.cpp | 5 +++ apps/openmw/mwgui/settingswindow.hpp | 1 + apps/openmw/mwinput/inputmanagerimp.cpp | 14 ++++++++ apps/openmw/mwmechanics/character.cpp | 41 +++++++++++++++++++---- apps/openmw/mwmechanics/character.hpp | 2 ++ apps/openmw/mwmechanics/creaturestats.hpp | 11 ++++++ apps/openmw/mwrender/animation.cpp | 2 +- files/mygui/openmw_settings_window.layout | 6 ++++ files/settings-default.cfg | 4 +++ 9 files changed, 79 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp index 97bccd01fb..8443aaf30c 100644 --- a/apps/openmw/mwgui/settingswindow.cpp +++ b/apps/openmw/mwgui/settingswindow.cpp @@ -91,6 +91,7 @@ namespace MWGui WindowBase("openmw_settings_window.layout") { getWidget(mOkButton, "OkButton"); + getWidget(mBestAttackButton, "BestAttackButton"); getWidget(mSubtitlesButton, "SubtitlesButton"); getWidget(mCrosshairButton, "CrosshairButton"); getWidget(mResolutionList, "ResolutionList"); @@ -131,6 +132,7 @@ namespace MWGui mSubtitlesButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onButtonToggled); mCrosshairButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onButtonToggled); + mBestAttackButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onButtonToggled); mInvertYButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onButtonToggled); mOkButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onOkButtonClicked); mShadersButton->eventMouseButtonClick += MyGUI::newDelegate(this, &SettingsWindow::onShadersToggled); @@ -200,6 +202,7 @@ namespace MWGui mSubtitlesButton->setCaptionWithReplacing(Settings::Manager::getBool("subtitles", "GUI") ? "#{sOn}" : "#{sOff}"); mCrosshairButton->setCaptionWithReplacing(Settings::Manager::getBool("crosshair", "HUD") ? "#{sOn}" : "#{sOff}"); + mBestAttackButton->setCaptionWithReplacing(Settings::Manager::getBool("best attack", "Game") ? "#{sOn}" : "#{sOff}"); float fovVal = (Settings::Manager::getFloat("field of view", "General")-sFovMin)/(sFovMax-sFovMin); mFOVSlider->setScrollPosition(fovVal * (mFOVSlider->getScrollRange()-1)); @@ -407,6 +410,8 @@ namespace MWGui Settings::Manager::setBool("crosshair", "HUD", newState); else if (_sender == mSubtitlesButton) Settings::Manager::setBool("subtitles", "GUI", newState); + else if (_sender == mBestAttackButton) + Settings::Manager::setBool("best attack", "Game", newState); apply(); } diff --git a/apps/openmw/mwgui/settingswindow.hpp b/apps/openmw/mwgui/settingswindow.hpp index 20e9907d95..42ed5bf6d9 100644 --- a/apps/openmw/mwgui/settingswindow.hpp +++ b/apps/openmw/mwgui/settingswindow.hpp @@ -32,6 +32,7 @@ namespace MWGui MyGUI::ScrollBar* mToolTipDelaySlider; MyGUI::Button* mSubtitlesButton; MyGUI::Button* mCrosshairButton; + MyGUI::Button* mBestAttackButton; // graphics MyGUI::ListBox* mResolutionList; diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp index fd2359f5ce..90acbae6a1 100644 --- a/apps/openmw/mwinput/inputmanagerimp.cpp +++ b/apps/openmw/mwinput/inputmanagerimp.cpp @@ -165,6 +165,20 @@ namespace MWInput if (action == A_Use) { MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackingOrSpell(currentValue); + if (currentValue == 1) + { + int type = MWMechanics::CreatureStats::AT_Chop; + bool forward = (mInputBinder->getChannel(A_MoveForward)->getValue() > 0 + || mInputBinder->getChannel(A_MoveBackward)->getValue() > 0); + bool side = (mInputBinder->getChannel(A_MoveLeft)->getValue() > 0 + || mInputBinder->getChannel(A_MoveRight)->getValue() > 0); + if (side && !forward) + type = MWMechanics::CreatureStats::AT_Slash; + if (forward && !side) + type = MWMechanics::CreatureStats::AT_Thrust; + + MWWorld::Class::get(mPlayer.getPlayer()).getCreatureStats(mPlayer.getPlayer()).setAttackType(type); + } } if (currentValue == 1) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index f4c975c41f..04b3797577 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -35,6 +35,23 @@ #include "../mwworld/class.hpp" #include "../mwworld/inventorystore.hpp" +namespace +{ + +int getBestAttack (const ESM::Weapon* weapon) +{ + int slash = (weapon->mData.mSlash[0] + weapon->mData.mSlash[1])/2; + int chop = (weapon->mData.mChop[0] + weapon->mData.mChop[1])/2; + int thrust = (weapon->mData.mThrust[0] + weapon->mData.mThrust[1])/2; + if (slash >= chop && slash >= thrust) + return MWMechanics::CreatureStats::AT_Slash; + else if (chop >= slash && chop >= thrust) + return MWMechanics::CreatureStats::AT_Chop; + else + return MWMechanics::CreatureStats::AT_Thrust; +} + +} namespace MWMechanics { @@ -540,13 +557,25 @@ void CharacterController::update(float duration, Movement &movement) float complete; float speedMult; bool animPlaying = mAnimation->getInfo(weapgroup,&complete,&speedMult,&start,&stop); + if(cls.getCreatureStats(mPtr).getAttackingOrSpell()) { if(mUpperBodyState == UpperCharState_WeapEquiped) { + int attackType = cls.getCreatureStats(mPtr).getAttackType(); + if (Settings::Manager::getBool("best attack", "Game") && weapon != inv.end()) + 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(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop start", "chop min attack", 0.0f, 0); + weapSpeed, mAttackType+" start", mAttackType+" min attack", 0.0f, 0); mUpperBodyState = UpperCharState_ChopStartToMinAttack; } } @@ -557,13 +586,13 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop max attack", "chop min hit", 1-complete, 0); + weapSpeed, mAttackType+" max attack", mAttackType+" min hit", 1-complete, 0); } else { mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop max attack", "chop min hit", 0, 0); + weapSpeed, mAttackType+" max attack", mAttackType+" min hit", 0, 0); } mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; } @@ -577,7 +606,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop min attack", "chop max attack",0, 0); + weapSpeed, mAttackType+" min attack", mAttackType+" max attack",0, 0); mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; } else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) @@ -585,7 +614,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop min hit", "chop hit",0, 0); + weapSpeed, mAttackType+" min hit", mAttackType+" hit",0, 0); mUpperBodyState = UpperCharState_ChopMinHitToHit; } else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) @@ -593,7 +622,7 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, - weapSpeed,"chop large follow start", "chop large follow stop",0, 0); + weapSpeed, mAttackType+" large follow start", mAttackType+" large follow stop",0, 0); mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; } else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index 08dc67f7b9..d760f89577 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -146,6 +146,8 @@ class CharacterController float mSecondsOfSwimming; float mSecondsOfRunning; + std::string mAttackType; // slash, chop or thrust + void refreshCurrentAnims(CharacterState idle, CharacterState movement, bool force=false); static void getWeaponGroup(WeaponType weaptype, std::string &group); diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index 7423e76b2b..2d979b9b22 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -36,6 +36,8 @@ namespace MWMechanics bool mHostile; bool mAttackingOrSpell;//for the player, this is true if the left mouse button is pressed, false if not. + int mAttackType; + public: CreatureStats(); @@ -88,6 +90,15 @@ namespace MWMechanics void setAttackingOrSpell(const bool &attackingOrSpell); + enum AttackType + { + AT_Slash, + AT_Thrust, + AT_Chop + }; + void setAttackType(int attackType) { mAttackType = attackType; } + int getAttackType() { return mAttackType; } + void setLevel(int level); void setAiSetting (int index, int value); diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 147e7c90ed..3ced108b38 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -654,7 +654,7 @@ void Animation::resetActiveGroups() return; const Ogre::SharedPtr &animsrc = state->second.mSource; - const NifOgre::TextKeyMap &keys = animsrc->mTextKeys; + //const NifOgre::TextKeyMap &keys = animsrc->mTextKeys; const std::vector >&ctrls = animsrc->mControllers[0]; for(size_t i = 0;i < ctrls.size();i++) { diff --git a/files/mygui/openmw_settings_window.layout b/files/mygui/openmw_settings_window.layout index ab91aed788..a54f3086e9 100644 --- a/files/mygui/openmw_settings_window.layout +++ b/files/mygui/openmw_settings_window.layout @@ -44,6 +44,12 @@ + + + + + + diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 613f124323..ac56604d11 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -163,3 +163,7 @@ ui sensitivity = 1.0 camera y multiplier = 1.0 ui y multiplier = 1.0 + +[Game] +# Always use the most powerful attack when striking with a weapon (chop, slash or thrust) +best attack = false From dfe912dcab8ee8a3683bbef0e28211e497243a30 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 16 Jul 2013 23:38:55 +0200 Subject: [PATCH 12/12] Enum renaming --- apps/openmw/mwmechanics/character.cpp | 20 ++++++++++---------- apps/openmw/mwmechanics/character.hpp | 19 +++++++------------ 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 04b3797577..9b8eecb9e4 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -576,10 +576,10 @@ void CharacterController::update(float duration, Movement &movement) mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, weapSpeed, mAttackType+" start", mAttackType+" min attack", 0.0f, 0); - mUpperBodyState = UpperCharState_ChopStartToMinAttack; + mUpperBodyState = UpperCharState_StartToMinAttack; } } - else if(mUpperBodyState == UpperCharState_ChopMinAttackToMaxAttack) + else if(mUpperBodyState == UpperCharState_MinAttackToMaxAttack) { if(animPlaying) { @@ -594,38 +594,38 @@ void CharacterController::update(float duration, Movement &movement) MWRender::Animation::Group_UpperBody, false, weapSpeed, mAttackType+" max attack", mAttackType+" min hit", 0, 0); } - mUpperBodyState = UpperCharState_ChopMaxAttackToMinHit; + mUpperBodyState = UpperCharState_MaxAttackToMinHit; } if(mUpperBodyState == UpperCharState_EquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_WeapEquiped; if(mUpperBodyState == UpperCharState_UnEquipingWeap && !animPlaying) mUpperBodyState = UpperCharState_Nothing; if(animPlaying) { - if(mUpperBodyState == UpperCharState_ChopStartToMinAttack && complete == 1) + if(mUpperBodyState == UpperCharState_StartToMinAttack && complete == 1) { mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, weapSpeed, mAttackType+" min attack", mAttackType+" max attack",0, 0); - mUpperBodyState = UpperCharState_ChopMinAttackToMaxAttack; + mUpperBodyState = UpperCharState_MinAttackToMaxAttack; } - else if(mUpperBodyState == UpperCharState_ChopMaxAttackToMinHit && complete == 1) + else if(mUpperBodyState == UpperCharState_MaxAttackToMinHit && complete == 1) { mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, weapSpeed, mAttackType+" min hit", mAttackType+" hit",0, 0); - mUpperBodyState = UpperCharState_ChopMinHitToHit; + mUpperBodyState = UpperCharState_MinHitToHit; } - else if(mUpperBodyState == UpperCharState_ChopMinHitToHit && complete == 1) + else if(mUpperBodyState == UpperCharState_MinHitToHit && complete == 1) { mAnimation->disable(weapgroup); mAnimation->play(weapgroup, Priority_Weapon, MWRender::Animation::Group_UpperBody, false, weapSpeed, mAttackType+" large follow start", mAttackType+" large follow stop",0, 0); - mUpperBodyState = UpperCharState_ChopLargeFollowStartToLargeFollowStop; + mUpperBodyState = UpperCharState_LargeFollowStartToLargeFollowStop; } - else if(mUpperBodyState == UpperCharState_ChopLargeFollowStartToLargeFollowStop && complete == 1) + else if(mUpperBodyState == UpperCharState_LargeFollowStartToLargeFollowStop && complete == 1) { mUpperBodyState = UpperCharState_WeapEquiped; } diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index d760f89577..1369566248 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -100,18 +100,13 @@ enum UpperBodyCharacterState { UpperCharState_EquipingWeap, UpperCharState_UnEquipingWeap, UpperCharState_WeapEquiped, - UpperCharState_Slashing, - UpperCharState_ChopStartToMinAttack, - UpperCharState_ChopMinAttackToMaxAttack, - UpperCharState_ChopMaxAttackToMinHit, - UpperCharState_ChopMinHitToHit, - UpperCharState_ChopLargeFollowStartToLargeFollowStop, - UpperCharState_ChopMediumFollowStartToMediumFollowStop, - UpperCharState_ChopSmallFollowStartToSmallFollowStop, - //UpperCharState_ChopReadyingMouseHold, //when you keep your mouse clicked to ready your weapon - //UpperCharState_ChopReadyWaiting, //when your weapon is ready and you keep mouse hold - UpperCharState_Choping, - UpperCharState_Thrusting, + UpperCharState_StartToMinAttack, + UpperCharState_MinAttackToMaxAttack, + UpperCharState_MaxAttackToMinHit, + UpperCharState_MinHitToHit, + UpperCharState_LargeFollowStartToLargeFollowStop, + UpperCharState_MediumFollowStartToMediumFollowStop, + UpperCharState_SmallFollowStartToSmallFollowStop, UpperCharState_EquipingSpell, UpperCharState_UnEquipingSpell };