diff --git a/apps/openmw/mwmechanics/aicombat.cpp b/apps/openmw/mwmechanics/aicombat.cpp index ce66b045a..aa6bcdef0 100644 --- a/apps/openmw/mwmechanics/aicombat.cpp +++ b/apps/openmw/mwmechanics/aicombat.cpp @@ -23,7 +23,7 @@ namespace { //chooses an attack depending on probability to avoid uniformity - ESM::Weapon::AttackType chooseBestAttack(const ESM::Weapon* weapon, MWMechanics::Movement &movement); + std::string chooseBestAttack(const ESM::Weapon* weapon); osg::Vec3f AimDirToMovingTarget(const MWWorld::Ptr& actor, const MWWorld::Ptr& target, const osg::Vec3f& vLastTargetPos, float duration, int weapType, float strength); @@ -630,7 +630,7 @@ namespace MWMechanics characterController.setAttackingOrSpell(true); if (!distantCombat) - chooseBestAttack(weapon, mMovement); + characterController.setAIAttackType(chooseBestAttack(weapon)); mStrength = Misc::Rng::rollClosedProbability(); @@ -678,32 +678,11 @@ namespace MWMechanics namespace { -ESM::Weapon::AttackType chooseBestAttack(const ESM::Weapon* weapon, MWMechanics::Movement &movement) +std::string chooseBestAttack(const ESM::Weapon* weapon) { - ESM::Weapon::AttackType attackType; + std::string attackType; - if (weapon == NULL) - { - //hand-to-hand deal equal damage for each type - float roll = Misc::Rng::rollClosedProbability(); - if(roll <= 0.333f) //side punch - { - movement.mPosition[0] = (Misc::Rng::rollClosedProbability() < 0.5f) ? 1.0f : -1.0f; - movement.mPosition[1] = 0; - attackType = ESM::Weapon::AT_Slash; - } - else if(roll <= 0.666f) //forward punch - { - movement.mPosition[1] = 1; - attackType = ESM::Weapon::AT_Thrust; - } - else - { - movement.mPosition[1] = movement.mPosition[0] = 0; - attackType = ESM::Weapon::AT_Chop; - } - } - else + if (weapon != NULL) { //the more damage attackType deals the more probability it has int slash = (weapon->mData.mSlash[0] + weapon->mData.mSlash[1])/2; @@ -712,21 +691,11 @@ ESM::Weapon::AttackType chooseBestAttack(const ESM::Weapon* weapon, MWMechanics: float roll = Misc::Rng::rollClosedProbability() * (slash + chop + thrust); if(roll <= slash) - { - movement.mPosition[0] = (Misc::Rng::rollClosedProbability() < 0.5f) ? 1.0f : -1.0f; - movement.mPosition[1] = 0; - attackType = ESM::Weapon::AT_Slash; - } + attackType = "slash"; else if(roll <= (slash + thrust)) - { - movement.mPosition[1] = 1; - attackType = ESM::Weapon::AT_Thrust; - } + attackType = "thrust"; else - { - movement.mPosition[1] = movement.mPosition[0] = 0; - attackType = ESM::Weapon::AT_Chop; - } + attackType = "chop"; } return attackType; diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 38fec4e4f..93f553f19 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1208,7 +1208,6 @@ bool CharacterController::updateWeaponState() if(mUpperBodyState == UpperCharState_WeapEquiped && (mHitState == CharState_None || mHitState == CharState_Block)) { MWBase::Environment::get().getWorld()->breakInvisibility(mPtr); - mAttackType.clear(); if(mWeaponType == WeapType_Spell) { // Unset casting flag, otherwise pressing the mouse button down would @@ -1309,14 +1308,17 @@ bool CharacterController::updateWeaponState() { if (isWeapon) { - if(mPtr == getPlayer() && - Settings::Manager::getBool("best attack", "Game")) + if(mPtr == getPlayer()) { - MWWorld::ContainerStoreIterator weapon = mPtr.getClass().getInventoryStore(mPtr).getSlot(MWWorld::InventoryStore::Slot_CarriedRight); - mAttackType = getBestAttack(weapon->get()->mBase); + if (Settings::Manager::getBool("best attack", "Game")) + { + MWWorld::ContainerStoreIterator weapon = mPtr.getClass().getInventoryStore(mPtr).getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + mAttackType = getBestAttack(weapon->get()->mBase); + } + else + setAttackTypeBasedOnMovement(); } - else - setAttackTypeBasedOnMovement(); + // else if (mPtr != getPlayer()) use mAttackType already set by AiCombat } else setAttackTypeRandomly(); @@ -2227,6 +2229,11 @@ void CharacterController::setAttackingOrSpell(bool attackingOrSpell) mAttackingOrSpell = attackingOrSpell; } +void CharacterController::setAIAttackType(std::string attackType) +{ + mAttackType = attackType; +} + bool CharacterController::readyToPrepareAttack() const { return (mHitState == CharState_None || mHitState == CharState_Block) diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index 4661d6983..deaf63539 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -269,6 +269,7 @@ public: bool isSneaking() const; void setAttackingOrSpell(bool attackingOrSpell); + void setAIAttackType(std::string attackType); // set and used by AiCombat bool readyToPrepareAttack() const; bool readyToStartAttack() const;