From 13646a651be8f27b7c3180d56087cd8f87d06556 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 19 Jan 2014 13:31:17 +0100 Subject: [PATCH] Issue #777: Handle creatures with weapons in CharacterController. Move attack strength to CreatureStats. --- apps/openmw/mwmechanics/aicombat.cpp | 7 ++++--- apps/openmw/mwmechanics/character.cpp | 19 ++++++++++--------- apps/openmw/mwmechanics/character.hpp | 6 +++--- apps/openmw/mwmechanics/creaturestats.cpp | 12 +++++++++++- apps/openmw/mwmechanics/creaturestats.hpp | 5 +++++ apps/openmw/mwmechanics/npcstats.cpp | 11 ----------- apps/openmw/mwmechanics/npcstats.hpp | 4 ---- apps/openmw/mwrender/creatureanimation.cpp | 4 ++-- 8 files changed, 35 insertions(+), 33 deletions(-) diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index 42b6181434..a0d57e89de 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -42,13 +42,14 @@ namespace MWMechanics actor.getClass().getCreatureStats(actor).setMovementFlag(CreatureStats::Flag_Run, true); - if(actor.getTypeName() == typeid(ESM::NPC).name()) + if (actor.getClass().hasInventoryStore(actor)) { - MWMechanics::DrawState_ state = actor.getClass().getNpcStats(actor).getDrawState(); + MWMechanics::DrawState_ state = actor.getClass().getCreatureStats(actor).getDrawState(); if (state == MWMechanics::DrawState_Spell || state == MWMechanics::DrawState_Nothing) - actor.getClass().getNpcStats(actor).setDrawState(MWMechanics::DrawState_Weapon); + actor.getClass().getCreatureStats(actor).setDrawState(MWMechanics::DrawState_Weapon); //MWWorld::Class::get(actor).getCreatureStats(actor).setAttackingOrSpell(true); } + ESM::Position pos = actor.getRefData().getPosition(); const ESM::Pathgrid *pathgrid = MWBase::Environment::get().getWorld()->getStore().get().search(*actor.getCell()->mCell); diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 6ff9473063..6183b65d3c 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -323,7 +323,7 @@ void CharacterController::getWeaponGroup(WeaponType weaptype, std::string &group } -MWWorld::ContainerStoreIterator CharacterController::getActiveWeapon(NpcStats &stats, MWWorld::InventoryStore &inv, WeaponType *weaptype) +MWWorld::ContainerStoreIterator CharacterController::getActiveWeapon(CreatureStats &stats, MWWorld::InventoryStore &inv, WeaponType *weaptype) { if(stats.getDrawState() == DrawState_Spell) { @@ -434,15 +434,16 @@ CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Anim * handle knockout and death which moves the character down. */ mAnimation->setAccumulation(Ogre::Vector3(1.0f, 1.0f, 0.0f)); - if(mPtr.getTypeName() == typeid(ESM::NPC).name()) + if (cls.hasInventoryStore(mPtr)) { - getActiveWeapon(cls.getNpcStats(mPtr), cls.getInventoryStore(mPtr), &mWeaponType); + getActiveWeapon(cls.getCreatureStats(mPtr), cls.getInventoryStore(mPtr), &mWeaponType); if(mWeaponType != WeapType_None) { getWeaponGroup(mWeaponType, mCurrentWeapon); mUpperBodyState = UpperCharState_WeapEquiped; mAnimation->showWeapons(true); } + mAnimation->showCarriedLeft(mWeaponType != WeapType_Spell && mWeaponType != WeapType_HandToHand); } if(!cls.getCreatureStats(mPtr).isDead()) @@ -517,14 +518,14 @@ bool CharacterController::updateCreatureState() return false; } -bool CharacterController::updateNpcState(bool inwater, bool isrunning) +bool CharacterController::updateWeaponState(bool inwater, bool isrunning) { const MWWorld::Class &cls = MWWorld::Class::get(mPtr); - NpcStats &stats = cls.getNpcStats(mPtr); + CreatureStats &stats = cls.getCreatureStats(mPtr); WeaponType weaptype = WeapType_None; MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); MWWorld::ContainerStoreIterator weapon = getActiveWeapon(stats, inv, &weaptype); - const bool isWerewolf = stats.isWerewolf(); + const bool isWerewolf = cls.isNpc() && cls.getNpcStats(mPtr).isWerewolf(); bool forcestateupdate = false; if(weaptype != mWeaponType && mHitState != CharState_KnockDown) @@ -613,7 +614,7 @@ bool CharacterController::updateNpcState(bool inwater, bool isrunning) { // Unset casting flag, otherwise pressing the mouse button down would // continue casting every frame if there is no animation - mPtr.getClass().getCreatureStats(mPtr).setAttackingOrSpell(false); + stats.setAttackingOrSpell(false); const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); @@ -1128,8 +1129,8 @@ void CharacterController::update(float duration) } } - if(cls.isNpc()) - forcestateupdate = updateNpcState(inwater, isrunning) || forcestateupdate; + if(cls.hasInventoryStore(mPtr)) + forcestateupdate = updateWeaponState(inwater, isrunning) || forcestateupdate; else forcestateupdate = updateCreatureState() || forcestateupdate; diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index d3d4b44355..33e6cae522 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -22,7 +22,7 @@ namespace MWMechanics { class Movement; -class NpcStats; +class CreatureStats; enum Priority { Priority_Default, @@ -170,13 +170,13 @@ class CharacterController static void getWeaponGroup(WeaponType weaptype, std::string &group); - static MWWorld::ContainerStoreIterator getActiveWeapon(NpcStats &stats, + static MWWorld::ContainerStoreIterator getActiveWeapon(CreatureStats &stats, MWWorld::InventoryStore &inv, WeaponType *weaptype); void clearAnimQueue(); - bool updateNpcState(bool inwater, bool isrunning); + bool updateWeaponState(bool inwater, bool isrunning); bool updateCreatureState(); void updateVisibility(); diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 70e4bd989b..62bae8ca89 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -16,7 +16,7 @@ namespace MWMechanics mAttackingOrSpell(false), mAttackType(AT_Chop), mIsWerewolf(false), mFallHeight(0), mRecalcDynamicStats(false), mKnockdown(false), mHitRecovery(false), - mMovementFlags(0), mDrawState (DrawState_Nothing) + mMovementFlags(0), mDrawState (DrawState_Nothing), mAttackStrength(0.f) { for (int i=0; i<4; ++i) mAiSettings[i] = 0; @@ -462,4 +462,14 @@ namespace MWMechanics mDrawState = state; } + float CreatureStats::getAttackStrength() const + { + return mAttackStrength; + } + + void CreatureStats::setAttackStrength(float value) + { + mAttackStrength = value; + } + } diff --git a/apps/openmw/mwmechanics/creaturestats.hpp b/apps/openmw/mwmechanics/creaturestats.hpp index 0981522a52..6893f385ec 100644 --- a/apps/openmw/mwmechanics/creaturestats.hpp +++ b/apps/openmw/mwmechanics/creaturestats.hpp @@ -40,6 +40,7 @@ namespace MWMechanics bool mKnockdown; bool mHitRecovery; unsigned int mMovementFlags; + float mAttackStrength; // Note only some creatures attack with weapons float mFallHeight; @@ -62,6 +63,10 @@ namespace MWMechanics DrawState_ getDrawState() const; void setDrawState(DrawState_ state); + /// When attacking, stores how strong the attack should be (0 = weakest, 1 = strongest) + float getAttackStrength() const; + void setAttackStrength(float value); + bool needToRecalcDynamicStats(); void addToFallHeight(float height); diff --git a/apps/openmw/mwmechanics/npcstats.cpp b/apps/openmw/mwmechanics/npcstats.cpp index d185191683..4fff6eac8a 100644 --- a/apps/openmw/mwmechanics/npcstats.cpp +++ b/apps/openmw/mwmechanics/npcstats.cpp @@ -28,23 +28,12 @@ MWMechanics::NpcStats::NpcStats() , mReputation(0) , mWerewolfKills (0) , mProfit(0) -, mAttackStrength(0.0f) , mTimeToStartDrowning(20.0) , mLastDrowningHit(0) { mSkillIncreases.resize (ESM::Attribute::Length, 0); } -float MWMechanics::NpcStats::getAttackStrength() const -{ - return mAttackStrength; -} - -void MWMechanics::NpcStats::setAttackStrength(float value) -{ - mAttackStrength = value; -} - int MWMechanics::NpcStats::getBaseDisposition() const { return mDisposition; diff --git a/apps/openmw/mwmechanics/npcstats.hpp b/apps/openmw/mwmechanics/npcstats.hpp index bf76b80d6e..8cdeeea5d6 100644 --- a/apps/openmw/mwmechanics/npcstats.hpp +++ b/apps/openmw/mwmechanics/npcstats.hpp @@ -59,10 +59,6 @@ namespace MWMechanics int getProfit() const; void modifyProfit(int diff); - /// When attacking, stores how strong the attack should be (0 = weakest, 1 = strongest) - float getAttackStrength() const; - void setAttackStrength(float value); - int getBaseDisposition() const; void setBaseDisposition(int disposition); diff --git a/apps/openmw/mwrender/creatureanimation.cpp b/apps/openmw/mwrender/creatureanimation.cpp index 2cffd7f0d2..e2aa9a2b83 100644 --- a/apps/openmw/mwrender/creatureanimation.cpp +++ b/apps/openmw/mwrender/creatureanimation.cpp @@ -34,8 +34,8 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr &ptr) CreatureWeaponAnimation::CreatureWeaponAnimation(const MWWorld::Ptr &ptr) : Animation(ptr, ptr.getRefData().getBaseNode()) - , mShowWeapons(true) // TODO: change to false, once charactercontroller handles creature weapons - , mShowCarriedLeft(true) // TODO: change to false, once charactercontroller handles creature weapons + , mShowWeapons(false) + , mShowCarriedLeft(false) { MWWorld::LiveCellRef *ref = mPtr.get();