1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-19 20:53:50 +00:00

Issue #219: added function decoding and moved same faction function from DialogueManager to Filter

This commit is contained in:
Marc Zinnschlag 2012-11-10 09:35:50 +01:00
parent 4994a253da
commit a752536cea
6 changed files with 41 additions and 21 deletions

View file

@ -97,8 +97,6 @@ namespace MWDialogue
bool DialogueManager::functionFilter(const MWWorld::Ptr& actor, const ESM::DialInfo& info,bool choice)
{
bool isCreature = (actor.getTypeName() != typeid(ESM::NPC).name());
for (std::vector<ESM::DialInfo::SelectStruct>::const_iterator iter (info.mSelects.begin());
iter != info.mSelects.end(); ++iter)
{
@ -131,23 +129,6 @@ namespace MWDialogue
if(!selectCompare<int,int>(comp,0,select.mI)) return false;
break;
case 46://Same faction
{
if (isCreature)
return false;
MWMechanics::NpcStats PCstats = MWWorld::Class::get(MWBase::Environment::get().getWorld()->getPlayer().getPlayer()).getNpcStats(MWBase::Environment::get().getWorld()->getPlayer().getPlayer());
MWMechanics::NpcStats NPCstats = MWWorld::Class::get(actor).getNpcStats(actor);
int sameFaction = 0;
if(!NPCstats.getFactionRanks().empty())
{
std::string NPCFaction = NPCstats.getFactionRanks().begin()->first;
if(PCstats.getFactionRanks().find(toLower(NPCFaction)) != PCstats.getFactionRanks().end()) sameFaction = 1;
}
if(!selectCompare<int,int>(comp,sameFaction,select.mI)) return false;
}
break;
case 48://Detected
if(!selectCompare<int,int>(comp,1,select.mI)) return false;
break;

View file

@ -250,6 +250,14 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
return toLower (mActor.getCell()->mCell->mName)==select.getName();
case SelectWrapper::Function_SameFaction:
{
MWWorld::Ptr player = MWBase::Environment::get().getWorld()->getPlayer().getPlayer();
return MWWorld::Class::get (mActor).getNpcStats (mActor).isSameFaction (
MWWorld::Class::get (player).getNpcStats (player));
}
default:
throw std::runtime_error ("unknown boolean select function");

View file

@ -5,6 +5,7 @@
#include <stdexcept>
#include <algorithm>
#include <sstream>
namespace
{
@ -52,6 +53,15 @@ namespace
}
}
MWDialogue::SelectWrapper::Function MWDialogue::SelectWrapper::decodeFunction() const
{
int index = 0;
std::istringstream (mSelect.mSelectRule.substr(2,2)) >> index;
return static_cast<Function> (index);
}
MWDialogue::SelectWrapper::SelectWrapper (const ESM::DialInfo::SelectStruct& select) : mSelect (select) {}
MWDialogue::SelectWrapper::Function MWDialogue::SelectWrapper::getFunction() const
@ -60,6 +70,7 @@ MWDialogue::SelectWrapper::Function MWDialogue::SelectWrapper::getFunction() con
switch (type)
{
case '1': return decodeFunction();
case '2': return Function_Global;
case '3': return Function_Local;
case '4': return Function_Journal;
@ -93,6 +104,7 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
static const Function booleanFunctions[] =
{
Function_Id, Function_Faction, Function_Class, Function_Race, Function_Cell,
Function_SameFaction,
Function_None // end marker
};
@ -125,6 +137,7 @@ bool MWDialogue::SelectWrapper::isNpcOnly() const
static const Function functions[] =
{
Function_Faction, SelectWrapper::Function_Class, SelectWrapper::Function_Race,
Function_SameFaction,
Function_None // end marker
};

View file

@ -13,7 +13,7 @@ namespace MWDialogue
enum Function
{
Function_None,
Function_None = 0,
Function_Journal,
Function_Item,
Function_Dead,
@ -23,7 +23,8 @@ namespace MWDialogue
Function_Race,
Function_Cell,
Function_Local,
Function_Global
Function_Global,
Function_SameFaction
};
enum Type
@ -33,6 +34,10 @@ namespace MWDialogue
Type_Numeric,
Type_Boolean
};
private:
Function decodeFunction() const;
public:

View file

@ -86,6 +86,16 @@ const std::map<std::string, int>& MWMechanics::NpcStats::getFactionRanks() const
return mFactionRank;
}
bool MWMechanics::NpcStats::isSameFaction (const NpcStats& npcStats) const
{
for (std::map<std::string, int>::const_iterator iter (mFactionRank.begin()); iter!=mFactionRank.end();
++iter)
if (npcStats.mFactionRank.find (iter->first)!=npcStats.mFactionRank.end())
return true;
return false;
}
float MWMechanics::NpcStats::getSkillGain (int skillIndex, const ESM::Class& class_, int usageType,
int level) const
{

View file

@ -76,6 +76,9 @@ namespace MWMechanics
std::map<std::string, int>& getFactionRanks();
bool isSameFaction (const NpcStats& npcStats) const;
///< Do *this and \a npcStats share a faction?
const std::map<std::string, int>& getFactionRanks() const;
float getSkillGain (int skillIndex, const ESM::Class& class_, int usageType = -1,