diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index aedac4a37..a29274ca7 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -302,11 +302,11 @@ namespace MWClass Misc::StringUtils::toLower(faction); if(ref->mBase->mNpdtType != ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS) { - data->mNpcStats.getFactionRanks()[faction] = (int)ref->mBase->mNpdt52.mRank; + data->mNpcStats.setFactionRank(faction, (int)ref->mBase->mNpdt52.mRank); } else { - data->mNpcStats.getFactionRanks()[faction] = (int)ref->mBase->mNpdt12.mRank; + data->mNpcStats.setFactionRank(faction, (int)ref->mBase->mNpdt12.mRank); } } diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index 2888a6e08..629d99cc2 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -68,7 +68,7 @@ bool MWDialogue::Filter::testActor (const ESM::DialInfo& info) const return false; MWMechanics::NpcStats& stats = mActor.getClass().getNpcStats (mActor); - std::map::iterator iter = stats.getFactionRanks().find ( Misc::StringUtils::lowerCase (info.mFaction)); + std::map::const_iterator iter = stats.getFactionRanks().find ( Misc::StringUtils::lowerCase (info.mFaction)); if (iter==stats.getFactionRanks().end()) return false; @@ -112,7 +112,7 @@ bool MWDialogue::Filter::testPlayer (const ESM::DialInfo& info) const if (!info.mPcFaction.empty()) { MWMechanics::NpcStats& stats = player.getClass().getNpcStats (player); - std::map::iterator iter = stats.getFactionRanks().find (Misc::StringUtils::lowerCase (info.mPcFaction)); + std::map::const_iterator iter = stats.getFactionRanks().find (Misc::StringUtils::lowerCase (info.mPcFaction)); if(iter==stats.getFactionRanks().end()) return false; @@ -379,7 +379,7 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con if (mActor.getClass().getNpcStats (mActor).getFactionRanks().empty()) return 0; - std::pair faction = + const std::pair faction = *mActor.getClass().getNpcStats (mActor).getFactionRanks().begin(); int rank = getFactionRank (player, faction.first); diff --git a/apps/openmw/mwmechanics/npcstats.cpp b/apps/openmw/mwmechanics/npcstats.cpp index 370c47b1f..13fc14318 100644 --- a/apps/openmw/mwmechanics/npcstats.cpp +++ b/apps/openmw/mwmechanics/npcstats.cpp @@ -69,9 +69,41 @@ const std::map& MWMechanics::NpcStats::getFactionRanks() const return mFactionRank; } -std::map& MWMechanics::NpcStats::getFactionRanks() +void MWMechanics::NpcStats::raiseRank(const std::string &faction) { - return mFactionRank; + const std::string lower = Misc::StringUtils::lowerCase(faction); + std::map::iterator it = mFactionRank.find(lower); + if (it != mFactionRank.end()) + { + // Does the next rank exist? + const ESM::Faction* faction = MWBase::Environment::get().getWorld()->getStore().get().find(lower); + if (it->second+1 < 10 && !faction->mRanks[it->second+1].empty()) + it->second += 1; + } +} + +void MWMechanics::NpcStats::lowerRank(const std::string &faction) +{ + const std::string lower = Misc::StringUtils::lowerCase(faction); + std::map::iterator it = mFactionRank.find(lower); + if (it != mFactionRank.end()) + { + it->second = std::max(0, it->second-1); + } +} + +void MWMechanics::NpcStats::setFactionRank(const std::string &faction, int rank) +{ + const std::string lower = Misc::StringUtils::lowerCase(faction); + mFactionRank[lower] = rank; +} + +void MWMechanics::NpcStats::joinFaction(const std::string& faction) +{ + const std::string lower = Misc::StringUtils::lowerCase(faction); + std::map::iterator it = mFactionRank.find(lower); + if (it == mFactionRank.end()) + mFactionRank[lower] = 0; } bool MWMechanics::NpcStats::getExpelled(const std::string& factionID) const diff --git a/apps/openmw/mwmechanics/npcstats.hpp b/apps/openmw/mwmechanics/npcstats.hpp index 4ea5d4578..ee897033b 100644 --- a/apps/openmw/mwmechanics/npcstats.hpp +++ b/apps/openmw/mwmechanics/npcstats.hpp @@ -70,7 +70,15 @@ namespace MWMechanics SkillValue& getSkill (int index); const std::map& getFactionRanks() const; - std::map& getFactionRanks(); + /// Increase the rank in this faction by 1, if such a rank exists. + void raiseRank(const std::string& faction); + /// Lower the rank in this faction by 1, if such a rank exists. + void lowerRank(const std::string& faction); + /// Join this faction, setting the initial rank to 0. + void joinFaction(const std::string& faction); + /// Warning: this function performs no check whether the rank exists, + /// and should be used in initial actor setup only. + void setFactionRank(const std::string& faction, int rank); const std::set& getExpelled() const { return mExpelled; } bool getExpelled(const std::string& factionID) const; diff --git a/apps/openmw/mwscript/interpretercontext.cpp b/apps/openmw/mwscript/interpretercontext.cpp index 21fee5f57..c43a010b4 100644 --- a/apps/openmw/mwscript/interpretercontext.cpp +++ b/apps/openmw/mwscript/interpretercontext.cpp @@ -310,7 +310,7 @@ namespace MWScript std::string InterpreterContext::getNPCRank() const { - std::map ranks = getReferenceImp().getClass().getNpcStats (getReferenceImp()).getFactionRanks(); + const std::map& ranks = getReferenceImp().getClass().getNpcStats (getReferenceImp()).getFactionRanks(); std::map::const_iterator it = ranks.begin(); MWBase::World *world = MWBase::Environment::get().getWorld(); @@ -348,7 +348,7 @@ namespace MWScript std::string factionId = getReferenceImp().getClass().getNpcStats (getReferenceImp()).getFactionRanks().begin()->first; - std::map ranks = player.getClass().getNpcStats (player).getFactionRanks(); + const std::map& ranks = player.getClass().getNpcStats (player).getFactionRanks(); std::map::const_iterator it = ranks.find(factionId); int rank = -1; if (it != ranks.end()) @@ -375,7 +375,7 @@ namespace MWScript std::string factionId = getReferenceImp().getClass().getNpcStats (getReferenceImp()).getFactionRanks().begin()->first; - std::map ranks = player.getClass().getNpcStats (player).getFactionRanks(); + const std::map& ranks = player.getClass().getNpcStats (player).getFactionRanks(); std::map::const_iterator it = ranks.find(factionId); int rank = -1; if (it != ranks.end()) diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index c012cb12e..91f6d2abe 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -548,10 +548,7 @@ namespace MWScript if(factionID != "") { MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr(); - if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) == player.getClass().getNpcStats(player).getFactionRanks().end()) - { - player.getClass().getNpcStats(player).getFactionRanks()[factionID] = 0; - } + player.getClass().getNpcStats(player).joinFaction(factionID); } } }; @@ -585,13 +582,11 @@ namespace MWScript MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr(); if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) == player.getClass().getNpcStats(player).getFactionRanks().end()) { - player.getClass().getNpcStats(player).getFactionRanks()[factionID] = 0; + player.getClass().getNpcStats(player).joinFaction(factionID); } else { - player.getClass().getNpcStats(player).getFactionRanks()[factionID] = - std::min(player.getClass().getNpcStats(player).getFactionRanks()[factionID] +1, - 9); + player.getClass().getNpcStats(player).raiseRank(factionID); } } } @@ -624,11 +619,7 @@ namespace MWScript if(factionID != "") { MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayerPtr(); - if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) != player.getClass().getNpcStats(player).getFactionRanks().end()) - { - player.getClass().getNpcStats(player).getFactionRanks()[factionID] = - std::max(0, player.getClass().getNpcStats(player).getFactionRanks()[factionID]-1); - } + player.getClass().getNpcStats(player).lowerRank(factionID); } } }; @@ -668,7 +659,7 @@ namespace MWScript { if(player.getClass().getNpcStats(player).getFactionRanks().find(factionID) != player.getClass().getNpcStats(player).getFactionRanks().end()) { - runtime.push(player.getClass().getNpcStats(player).getFactionRanks()[factionID]); + runtime.push(player.getClass().getNpcStats(player).getFactionRanks().at(factionID)); } else { @@ -1036,8 +1027,7 @@ namespace MWScript if (ptr == player) return; - std::map& ranks = ptr.getClass().getNpcStats(ptr).getFactionRanks (); - ranks[factionID] = std::min(9, ranks[factionID]+1); + ptr.getClass().getNpcStats(ptr).raiseRank(factionID); } }; @@ -1063,8 +1053,7 @@ namespace MWScript if (ptr == player) return; - std::map& ranks = ptr.getClass().getNpcStats(ptr).getFactionRanks (); - ranks[factionID] = std::max(0, ranks[factionID]-1); + ptr.getClass().getNpcStats(ptr).lowerRank(factionID); } };