From e6036e13b92a46310cc9a387f73422dfb88f541d Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Sat, 25 Jul 2020 15:54:49 +0400 Subject: [PATCH] Use more C++11 loops in game mechanics code --- apps/openmw/mwmechanics/aiavoiddoor.cpp | 15 +++-- apps/openmw/mwmechanics/aifollow.cpp | 4 +- apps/openmw/mwmechanics/aisequence.cpp | 46 ++++++------- apps/openmw/mwmechanics/aiwander.cpp | 6 +- apps/openmw/mwmechanics/autocalcspell.cpp | 82 ++++++++++------------- apps/openmw/mwmechanics/character.cpp | 6 +- apps/openmw/mwmechanics/levelledlist.hpp | 18 ++--- apps/openmw/mwmechanics/objects.cpp | 21 +++--- apps/openmw/mwmechanics/obstacle.cpp | 6 +- 9 files changed, 94 insertions(+), 110 deletions(-) diff --git a/apps/openmw/mwmechanics/aiavoiddoor.cpp b/apps/openmw/mwmechanics/aiavoiddoor.cpp index 47f72efcec..ce25537564 100644 --- a/apps/openmw/mwmechanics/aiavoiddoor.cpp +++ b/apps/openmw/mwmechanics/aiavoiddoor.cpp @@ -60,13 +60,14 @@ bool MWMechanics::AiAvoidDoor::execute (const MWWorld::Ptr& actor, CharacterCont // Make all nearby actors also avoid the door std::vector actors; MWBase::Environment::get().getMechanicsManager()->getActorsInRange(pos.asVec3(),100,actors); - for(std::vector::iterator it = actors.begin(); it != actors.end(); ++it) { - if(*it != getPlayer()) { //Not the player - MWMechanics::AiSequence& seq = it->getClass().getCreatureStats(*it).getAiSequence(); - if(seq.getTypeId() != MWMechanics::AiPackageTypeId::AvoidDoor) { //Only add it once - seq.stack(MWMechanics::AiAvoidDoor(mDoorPtr),*it); - } - } + for(auto& actor : actors) + { + if (actor == getPlayer()) + continue; + + MWMechanics::AiSequence& seq = actor.getClass().getCreatureStats(actor).getAiSequence(); + if (seq.getTypeId() != MWMechanics::AiPackageTypeId::AvoidDoor) + seq.stack(MWMechanics::AiAvoidDoor(mDoorPtr), actor); } return false; diff --git a/apps/openmw/mwmechanics/aifollow.cpp b/apps/openmw/mwmechanics/aifollow.cpp index a9e43b3c3e..b3c308d75f 100644 --- a/apps/openmw/mwmechanics/aifollow.cpp +++ b/apps/openmw/mwmechanics/aifollow.cpp @@ -124,9 +124,9 @@ bool AiFollow::execute (const MWWorld::Ptr& actor, CharacterController& characte followDistance = 313; short i = 0; followers.sort(); - for (std::list::iterator it = followers.begin(); it != followers.end(); ++it) + for (int followIndex : followers) { - if (*it == mFollowIndex) + if (followIndex == mFollowIndex) followDistance += 130 * i; ++i; } diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index f747b16f29..57d32898cc 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -406,36 +406,36 @@ void AiSequence::fill(const ESM::AIPackageList &list) if (!list.mList.empty() && list.mList.begin() != (list.mList.end()-1)) mRepeat = true; - for (std::vector::const_iterator it = list.mList.begin(); it != list.mList.end(); ++it) + for (const auto& esmPackage : list.mList) { std::unique_ptr package; - if (it->mType == ESM::AI_Wander) + if (esmPackage.mType == ESM::AI_Wander) { - ESM::AIWander data = it->mWander; + ESM::AIWander data = esmPackage.mWander; std::vector idles; idles.reserve(8); for (int i=0; i<8; ++i) idles.push_back(data.mIdle[i]); package = std::make_unique(data.mDistance, data.mDuration, data.mTimeOfDay, idles, data.mShouldRepeat != 0); } - else if (it->mType == ESM::AI_Escort) + else if (esmPackage.mType == ESM::AI_Escort) { - ESM::AITarget data = it->mTarget; + ESM::AITarget data = esmPackage.mTarget; package = std::make_unique(data.mId.toString(), data.mDuration, data.mX, data.mY, data.mZ); } - else if (it->mType == ESM::AI_Travel) + else if (esmPackage.mType == ESM::AI_Travel) { - ESM::AITravel data = it->mTravel; + ESM::AITravel data = esmPackage.mTravel; package = std::make_unique(data.mX, data.mY, data.mZ); } - else if (it->mType == ESM::AI_Activate) + else if (esmPackage.mType == ESM::AI_Activate) { - ESM::AIActivate data = it->mActivate; + ESM::AIActivate data = esmPackage.mActivate; package = std::make_unique(data.mName.toString()); } - else //if (it->mType == ESM::AI_Follow) + else //if (esmPackage.mType == ESM::AI_Follow) { - ESM::AITarget data = it->mTarget; + ESM::AITarget data = esmPackage.mTarget; package = std::make_unique(data.mId.toString(), data.mDuration, data.mX, data.mY, data.mZ); } mPackages.push_back(std::move(package)); @@ -457,10 +457,9 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence) // If there is more than one non-combat, non-pursue package in the list, enable repeating. int count = 0; - for (std::vector::const_iterator it = sequence.mPackages.begin(); - it != sequence.mPackages.end(); ++it) + for (auto& container : sequence.mPackages) { - if (isActualAiPackage(static_cast(it->mType))) + if (isActualAiPackage(static_cast(container.mType))) count++; } @@ -468,20 +467,19 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence) mRepeat = true; // Load packages - for (std::vector::const_iterator it = sequence.mPackages.begin(); - it != sequence.mPackages.end(); ++it) + for (auto& container : sequence.mPackages) { std::unique_ptr package; - switch (it->mType) + switch (container.mType) { case ESM::AiSequence::Ai_Wander: { - package.reset(new AiWander(static_cast(it->mPackage))); + package.reset(new AiWander(static_cast(container.mPackage))); break; } case ESM::AiSequence::Ai_Travel: { - const auto source = static_cast(it->mPackage); + const auto source = static_cast(container.mPackage); if (source->mHidden) package.reset(new AiInternalTravel(source)); else @@ -490,27 +488,27 @@ void AiSequence::readState(const ESM::AiSequence::AiSequence &sequence) } case ESM::AiSequence::Ai_Escort: { - package.reset(new AiEscort(static_cast(it->mPackage))); + package.reset(new AiEscort(static_cast(container.mPackage))); break; } case ESM::AiSequence::Ai_Follow: { - package.reset(new AiFollow(static_cast(it->mPackage))); + package.reset(new AiFollow(static_cast(container.mPackage))); break; } case ESM::AiSequence::Ai_Activate: { - package.reset(new AiActivate(static_cast(it->mPackage))); + package.reset(new AiActivate(static_cast(container.mPackage))); break; } case ESM::AiSequence::Ai_Combat: { - package.reset(new AiCombat(static_cast(it->mPackage))); + package.reset(new AiCombat(static_cast(container.mPackage))); break; } case ESM::AiSequence::Ai_Pursue: { - package.reset(new AiPursue(static_cast(it->mPackage))); + package.reset(new AiPursue(static_cast(container.mPackage))); break; } default: diff --git a/apps/openmw/mwmechanics/aiwander.cpp b/apps/openmw/mwmechanics/aiwander.cpp index 11c50dc096..9e179edebc 100644 --- a/apps/openmw/mwmechanics/aiwander.cpp +++ b/apps/openmw/mwmechanics/aiwander.cpp @@ -809,11 +809,11 @@ namespace MWMechanics void AiWander::AddNonPathGridAllowedPoints(osg::Vec3f npcPos, const ESM::Pathgrid * pathGrid, int pointIndex, AiWanderStorage& storage) { storage.mAllowedNodes.push_back(PathFinder::makePathgridPoint(npcPos)); - for (std::vector::const_iterator it = pathGrid->mEdges.begin(); it != pathGrid->mEdges.end(); ++it) + for (auto& edge : pathGrid->mEdges) { - if (it->mV0 == pointIndex) + if (edge.mV0 == pointIndex) { - AddPointBetweenPathGridPoints(pathGrid->mPoints[it->mV0], pathGrid->mPoints[it->mV1], storage); + AddPointBetweenPathGridPoints(pathGrid->mPoints[edge.mV0], pathGrid->mPoints[edge.mV1], storage); } } } diff --git a/apps/openmw/mwmechanics/autocalcspell.cpp b/apps/openmw/mwmechanics/autocalcspell.cpp index 9cee1aa318..662cfe473b 100644 --- a/apps/openmw/mwmechanics/autocalcspell.cpp +++ b/apps/openmw/mwmechanics/autocalcspell.cpp @@ -61,38 +61,36 @@ namespace MWMechanics // Note: the algorithm heavily depends on the traversal order of the spells. For vanilla-compatible results the // Store must preserve the record ordering as it was in the content files. - for (MWWorld::Store::iterator iter = spells.begin(); iter != spells.end(); ++iter) + for (const ESM::Spell& spell : spells) { - const ESM::Spell* spell = &*iter; - - if (spell->mData.mType != ESM::Spell::ST_Spell) + if (spell.mData.mType != ESM::Spell::ST_Spell) continue; - if (!(spell->mData.mFlags & ESM::Spell::F_Autocalc)) + if (!(spell.mData.mFlags & ESM::Spell::F_Autocalc)) continue; static const int iAutoSpellTimesCanCast = gmst.find("iAutoSpellTimesCanCast")->mValue.getInteger(); - if (baseMagicka < iAutoSpellTimesCanCast * spell->mData.mCost) + if (baseMagicka < iAutoSpellTimesCanCast * spell.mData.mCost) continue; - if (race && race->mPowers.exists(spell->mId)) + if (race && race->mPowers.exists(spell.mId)) continue; - if (!attrSkillCheck(spell, actorSkills, actorAttributes)) + if (!attrSkillCheck(&spell, actorSkills, actorAttributes)) continue; int school; float skillTerm; - calcWeakestSchool(spell, actorSkills, school, skillTerm); + calcWeakestSchool(&spell, actorSkills, school, skillTerm); assert(school >= 0 && school < 6); SchoolCaps& cap = schoolCaps[school]; - if (cap.mReachedLimit && spell->mData.mCost <= cap.mMinCost) + if (cap.mReachedLimit && spell.mData.mCost <= cap.mMinCost) continue; static const float fAutoSpellChance = gmst.find("fAutoSpellChance")->mValue.getFloat(); - if (calcAutoCastChance(spell, actorSkills, actorAttributes, school) < fAutoSpellChance) + if (calcAutoCastChance(&spell, actorSkills, actorAttributes, school) < fAutoSpellChance) continue; - selectedSpells.push_back(spell->mId); + selectedSpells.push_back(spell.mId); if (cap.mReachedLimit) { @@ -101,9 +99,9 @@ namespace MWMechanics selectedSpells.erase(found); cap.mMinCost = std::numeric_limits::max(); - for (std::vector::iterator weakIt = selectedSpells.begin(); weakIt != selectedSpells.end(); ++weakIt) + for (const std::string& testSpellName : selectedSpells) { - const ESM::Spell* testSpell = spells.find(*weakIt); + const ESM::Spell* testSpell = spells.find(testSpellName); //int testSchool; //float dummySkillTerm; @@ -130,10 +128,10 @@ namespace MWMechanics if (cap.mCount == cap.mLimit) cap.mReachedLimit = true; - if (spell->mData.mCost < cap.mMinCost) + if (spell.mData.mCost < cap.mMinCost) { - cap.mWeakestSpell = spell->mId; - cap.mMinCost = spell->mData.mCost; + cap.mWeakestSpell = spell.mId; + cap.mMinCost = spell.mData.mCost; } } } @@ -154,32 +152,28 @@ namespace MWMechanics std::vector selectedSpells; - - const MWWorld::Store &spells = - esmStore.get(); - for (MWWorld::Store::iterator iter = spells.begin(); iter != spells.end(); ++iter) + const MWWorld::Store &spells = esmStore.get(); + for (const ESM::Spell& spell : spells) { - const ESM::Spell* spell = &*iter; - - if (spell->mData.mType != ESM::Spell::ST_Spell) + if (spell.mData.mType != ESM::Spell::ST_Spell) continue; - if (!(spell->mData.mFlags & ESM::Spell::F_PCStart)) + if (!(spell.mData.mFlags & ESM::Spell::F_PCStart)) continue; - if (reachedLimit && spell->mData.mCost <= minCost) + if (reachedLimit && spell.mData.mCost <= minCost) continue; - if (race && std::find(race->mPowers.mList.begin(), race->mPowers.mList.end(), spell->mId) != race->mPowers.mList.end()) + if (race && std::find(race->mPowers.mList.begin(), race->mPowers.mList.end(), spell.mId) != race->mPowers.mList.end()) continue; - if (baseMagicka < spell->mData.mCost) + if (baseMagicka < spell.mData.mCost) continue; static const float fAutoPCSpellChance = esmStore.get().find("fAutoPCSpellChance")->mValue.getFloat(); - if (calcAutoCastChance(spell, actorSkills, actorAttributes, -1) < fAutoPCSpellChance) + if (calcAutoCastChance(&spell, actorSkills, actorAttributes, -1) < fAutoPCSpellChance) continue; - if (!attrSkillCheck(spell, actorSkills, actorAttributes)) + if (!attrSkillCheck(&spell, actorSkills, actorAttributes)) continue; - selectedSpells.push_back(spell->mId); + selectedSpells.push_back(spell.mId); if (reachedLimit) { @@ -188,9 +182,9 @@ namespace MWMechanics selectedSpells.erase(it); minCost = std::numeric_limits::max(); - for (std::vector::iterator weakIt = selectedSpells.begin(); weakIt != selectedSpells.end(); ++weakIt) + for (const std::string& testSpellName : selectedSpells) { - const ESM::Spell* testSpell = esmStore.get().find(*weakIt); + const ESM::Spell* testSpell = esmStore.get().find(testSpellName); if (testSpell->mData.mCost < minCost) { minCost = testSpell->mData.mCost; @@ -200,9 +194,9 @@ namespace MWMechanics } else { - if (spell->mData.mCost < minCost) + if (spell.mData.mCost < minCost) { - weakestSpell = spell; + weakestSpell = &spell; minCost = weakestSpell->mData.mCost; } static const unsigned int iAutoPCSpellMax = esmStore.get().find("iAutoPCSpellMax")->mValue.getInteger(); @@ -216,23 +210,22 @@ namespace MWMechanics bool attrSkillCheck (const ESM::Spell* spell, const int* actorSkills, const int* actorAttributes) { - const std::vector& effects = spell->mEffects.mList; - for (std::vector::const_iterator effectIt = effects.begin(); effectIt != effects.end(); ++effectIt) + for (const auto& spellEffect : spell->mEffects.mList) { - const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(effectIt->mEffectID); + const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(spellEffect.mEffectID); static const int iAutoSpellAttSkillMin = MWBase::Environment::get().getWorld()->getStore().get().find("iAutoSpellAttSkillMin")->mValue.getInteger(); if ((magicEffect->mData.mFlags & ESM::MagicEffect::TargetSkill)) { - assert (effectIt->mSkill >= 0 && effectIt->mSkill < ESM::Skill::Length); - if (actorSkills[effectIt->mSkill] < iAutoSpellAttSkillMin) + assert (spellEffect.mSkill >= 0 && spellEffect.mSkill < ESM::Skill::Length); + if (actorSkills[spellEffect.mSkill] < iAutoSpellAttSkillMin) return false; } if ((magicEffect->mData.mFlags & ESM::MagicEffect::TargetAttribute)) { - assert (effectIt->mAttribute >= 0 && effectIt->mAttribute < ESM::Attribute::Length); - if (actorAttributes[effectIt->mAttribute] < iAutoSpellAttSkillMin) + assert (spellEffect.mAttribute >= 0 && spellEffect.mAttribute < ESM::Attribute::Length); + if (actorAttributes[spellEffect.mAttribute] < iAutoSpellAttSkillMin) return false; } } @@ -244,11 +237,8 @@ namespace MWMechanics { // Morrowind for some reason uses a formula slightly different from magicka cost calculation float minChance = std::numeric_limits::max(); - - const ESM::EffectList& effects = spell->mEffects; - for (std::vector::const_iterator it = effects.mList.begin(); it != effects.mList.end(); ++it) + for (const ESM::ENAMstruct& effect : spell->mEffects.mList) { - const ESM::ENAMstruct& effect = *it; const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(effect.mEffectID); int minMagn = 1; diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index aed6388955..c8e81aa491 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -2653,11 +2653,11 @@ void CharacterController::updateContinuousVfx() std::vector effects; mAnimation->getLoopingEffects(effects); - for (std::vector::iterator it = effects.begin(); it != effects.end(); ++it) + for (int effectId : effects) { if (mPtr.getClass().getCreatureStats(mPtr).isDeathAnimationFinished() - || mPtr.getClass().getCreatureStats(mPtr).getMagicEffects().get(MWMechanics::EffectKey(*it)).getMagnitude() <= 0) - mAnimation->removeEffect(*it); + || mPtr.getClass().getCreatureStats(mPtr).getMagicEffects().get(MWMechanics::EffectKey(effectId)).getMagnitude() <= 0) + mAnimation->removeEffect(effectId); } } diff --git a/apps/openmw/mwmechanics/levelledlist.hpp b/apps/openmw/mwmechanics/levelledlist.hpp index 697e2eda81..f716f068db 100644 --- a/apps/openmw/mwmechanics/levelledlist.hpp +++ b/apps/openmw/mwmechanics/levelledlist.hpp @@ -31,10 +31,10 @@ namespace MWMechanics std::vector candidates; int highestLevel = 0; - for (std::vector::const_iterator it = items.begin(); it != items.end(); ++it) + for (const auto& levelledItem : items) { - if (it->mLevel > highestLevel && it->mLevel <= playerLevel) - highestLevel = it->mLevel; + if (levelledItem.mLevel > highestLevel && levelledItem.mLevel <= playerLevel) + highestLevel = levelledItem.mLevel; } // For levelled creatures, the flags are swapped. This file format just makes so much sense. @@ -43,14 +43,14 @@ namespace MWMechanics allLevels = levItem->mFlags & ESM::CreatureLevList::AllLevels; std::pair highest = std::make_pair(-1, ""); - for (std::vector::const_iterator it = items.begin(); it != items.end(); ++it) + for (const auto& levelledItem : items) { - if (playerLevel >= it->mLevel - && (allLevels || it->mLevel == highestLevel)) + if (playerLevel >= levelledItem.mLevel + && (allLevels || levelledItem.mLevel == highestLevel)) { - candidates.push_back(it->mId); - if (it->mLevel >= highest.first) - highest = std::make_pair(it->mLevel, it->mId); + candidates.push_back(levelledItem.mId); + if (levelledItem.mLevel >= highest.first) + highest = std::make_pair(levelledItem.mLevel, levelledItem.mId); } } if (candidates.empty()) diff --git a/apps/openmw/mwmechanics/objects.cpp b/apps/openmw/mwmechanics/objects.cpp index 9e05509f1c..5b18fc2c30 100644 --- a/apps/openmw/mwmechanics/objects.cpp +++ b/apps/openmw/mwmechanics/objects.cpp @@ -19,11 +19,10 @@ Objects::Objects() Objects::~Objects() { - PtrControllerMap::iterator it(mObjects.begin()); - for (; it != mObjects.end();++it) + for(auto& object : mObjects) { - delete it->second; - it->second = nullptr; + delete object.second; + object.second = nullptr; } } @@ -77,8 +76,8 @@ void Objects::update(float duration, bool paused) { if(!paused) { - for(PtrControllerMap::iterator iter(mObjects.begin());iter != mObjects.end();++iter) - iter->second->update(duration); + for(auto& object : mObjects) + object.second->update(duration); } else { @@ -87,15 +86,15 @@ void Objects::update(float duration, bool paused) if(mode != MWGui::GM_Container) return; - for(PtrControllerMap::iterator iter(mObjects.begin());iter != mObjects.end();++iter) + for(auto& object : mObjects) { - if (iter->first.getTypeName() != typeid(ESM::Container).name()) + if (object.first.getTypeName() != typeid(ESM::Container).name()) continue; - if (iter->second->isAnimPlaying("containeropen")) + if (object.second->isAnimPlaying("containeropen")) { - iter->second->update(duration); - MWBase::Environment::get().getWorld()->updateAnimatedCollisionShape(iter->first); + object.second->update(duration); + MWBase::Environment::get().getWorld()->updateAnimatedCollisionShape(object.first); } } } diff --git a/apps/openmw/mwmechanics/obstacle.cpp b/apps/openmw/mwmechanics/obstacle.cpp index e30a2947fd..715dfecd24 100644 --- a/apps/openmw/mwmechanics/obstacle.cpp +++ b/apps/openmw/mwmechanics/obstacle.cpp @@ -36,17 +36,13 @@ namespace MWMechanics // Check all the doors in this cell const MWWorld::CellRefList& doors = cell->getReadOnlyDoors(); - const MWWorld::CellRefList::List& refList = doors.mList; - MWWorld::CellRefList::List::const_iterator it = refList.begin(); osg::Vec3f pos(actor.getRefData().getPosition().asVec3()); pos.z() = 0; osg::Vec3f actorDir = (actor.getRefData().getBaseNode()->getAttitude() * osg::Vec3f(0,1,0)); - for (; it != refList.end(); ++it) + for (const auto& ref : doors.mList) { - const MWWorld::LiveCellRef& ref = *it; - osg::Vec3f doorPos(ref.mData.getPosition().asVec3()); // FIXME: cast