mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-27 03:35:27 +00:00
Issue #219: moved over the second batch of functions (boolean and one integer I forgot last time)
This commit is contained in:
parent
91afef140b
commit
e68bb3481e
@ -289,8 +289,6 @@ namespace MWDialogue
|
|||||||
bool DialogueManager::isMatching (const MWWorld::Ptr& actor,
|
bool DialogueManager::isMatching (const MWWorld::Ptr& actor,
|
||||||
const ESM::DialInfo::SelectStruct& select) const
|
const ESM::DialInfo::SelectStruct& select) const
|
||||||
{
|
{
|
||||||
bool isCreature = (actor.getTypeName() != typeid(ESM::NPC).name());
|
|
||||||
|
|
||||||
char type = select.mSelectRule[1];
|
char type = select.mSelectRule[1];
|
||||||
|
|
||||||
if (type!='0')
|
if (type!='0')
|
||||||
@ -345,86 +343,6 @@ namespace MWDialogue
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
case '6': // dead
|
|
||||||
|
|
||||||
return selectCompare<int,int> (comp,
|
|
||||||
MWBase::Environment::get().getMechanicsManager()->countDeaths (toLower (name)), select.mI);
|
|
||||||
|
|
||||||
case '7':// not ID
|
|
||||||
if(select.mType==ESM::VT_String ||select.mType==ESM::VT_Int)//bug in morrowind here? it's not a short, it's a string
|
|
||||||
{
|
|
||||||
int isID = int(toLower(name)==toLower(MWWorld::Class::get (actor).getId (actor)));
|
|
||||||
if (selectCompare<int,int>(comp,!isID,select.mI)) return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error (
|
|
||||||
"unsupported variable type in dialogue info select");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case '8':// not faction
|
|
||||||
if (isCreature)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(select.mType==ESM::VT_Int)
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::NPC>* npc = actor.get<ESM::NPC>();
|
|
||||||
int isFaction = int(toLower(npc->mBase->mFaction) == toLower(name));
|
|
||||||
if(selectCompare<int,int>(comp,!isFaction,select.mI))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error (
|
|
||||||
"unsupported variable type in dialogue info select");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case '9':// not class
|
|
||||||
if (isCreature)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(select.mType==ESM::VT_Int)
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::NPC>* npc = actor.get<ESM::NPC>();
|
|
||||||
int isClass = int(toLower(npc->mBase->mClass) == toLower(name));
|
|
||||||
if(selectCompare<int,int>(comp,!isClass,select.mI))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error (
|
|
||||||
"unsupported variable type in dialogue info select");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case 'A'://not Race
|
|
||||||
if (isCreature)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(select.mType==ESM::VT_Int)
|
|
||||||
{
|
|
||||||
MWWorld::LiveCellRef<ESM::NPC>* npc = actor.get<ESM::NPC>();
|
|
||||||
int isRace = int(toLower(npc->mBase->mRace) == toLower(name));
|
|
||||||
if(selectCompare<int,int>(comp,!isRace,select.mI))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error (
|
|
||||||
"unsupported variable type in dialogue info select");
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case 'B'://not Cell
|
|
||||||
if(select.mType==ESM::VT_Int)
|
|
||||||
{
|
|
||||||
int isCell = int(toLower(actor.getCell()->mCell->mName) == toLower(name));
|
|
||||||
if(selectCompare<int,int>(comp,!isCell,select.mI))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw std::runtime_error (
|
|
||||||
"unsupported variable type in dialogue info select");
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case 'C'://not local
|
case 'C'://not local
|
||||||
if (select.mType==ESM::VT_Short || select.mType==ESM::VT_Int ||
|
if (select.mType==ESM::VT_Short || select.mType==ESM::VT_Int ||
|
||||||
select.mType==ESM::VT_Long)
|
select.mType==ESM::VT_Long)
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/journal.hpp"
|
#include "../mwbase/journal.hpp"
|
||||||
|
#include "../mwbase/mechanicsmanager.hpp"
|
||||||
|
|
||||||
#include "../mwworld/class.hpp"
|
#include "../mwworld/class.hpp"
|
||||||
#include "../mwworld/player.hpp"
|
#include "../mwworld/player.hpp"
|
||||||
@ -125,6 +126,9 @@ bool MWDialogue::Filter::testSelectStructs (const ESM::DialInfo& info) const
|
|||||||
|
|
||||||
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
|
bool MWDialogue::Filter::testSelectStruct (const SelectWrapper& select) const
|
||||||
{
|
{
|
||||||
|
if (select.isNpcOnly() && mActor.getTypeName()!=typeid (ESM::NPC).name())
|
||||||
|
return select.isInverted();
|
||||||
|
|
||||||
switch (select.getType())
|
switch (select.getType())
|
||||||
{
|
{
|
||||||
case SelectWrapper::Type_None: return true;
|
case SelectWrapper::Type_None: return true;
|
||||||
@ -170,6 +174,10 @@ int MWDialogue::Filter::getSelectStructInteger (const SelectWrapper& select) con
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case SelectWrapper::Function_Dead:
|
||||||
|
|
||||||
|
return MWBase::Environment::get().getMechanicsManager()->countDeaths (select.getName());
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
throw std::runtime_error ("unknown integer select function");
|
throw std::runtime_error ("unknown integer select function");
|
||||||
@ -180,6 +188,26 @@ bool MWDialogue::Filter::getSelectStructBoolean (const SelectWrapper& select) co
|
|||||||
{
|
{
|
||||||
switch (select.getFunction())
|
switch (select.getFunction())
|
||||||
{
|
{
|
||||||
|
case SelectWrapper::Function_Id:
|
||||||
|
|
||||||
|
return select.getName()==toLower (MWWorld::Class::get (mActor).getId (mActor));
|
||||||
|
|
||||||
|
case SelectWrapper::Function_Faction:
|
||||||
|
|
||||||
|
return toLower (mActor.get<ESM::NPC>()->mBase->mFaction)==select.getName();
|
||||||
|
|
||||||
|
case SelectWrapper::Function_Class:
|
||||||
|
|
||||||
|
return toLower (mActor.get<ESM::NPC>()->mBase->mClass)==select.getName();
|
||||||
|
|
||||||
|
case SelectWrapper::Function_Race:
|
||||||
|
|
||||||
|
return toLower (mActor.get<ESM::NPC>()->mBase->mRace)==select.getName();
|
||||||
|
|
||||||
|
case SelectWrapper::Function_Cell:
|
||||||
|
|
||||||
|
return toLower (mActor.getCell()->mCell->mName)==select.getName();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
throw std::runtime_error ("unknown boolean select function");
|
throw std::runtime_error ("unknown boolean select function");
|
||||||
|
@ -62,6 +62,12 @@ MWDialogue::SelectWrapper::Function MWDialogue::SelectWrapper::getFunction() con
|
|||||||
{
|
{
|
||||||
case '4': return Function_Journal;
|
case '4': return Function_Journal;
|
||||||
case '5': return Function_Item;
|
case '5': return Function_Item;
|
||||||
|
case '6': return Function_Dead;
|
||||||
|
case '7': return Function_Id;
|
||||||
|
case '8': return Function_Faction;
|
||||||
|
case '9': return Function_Class;
|
||||||
|
case 'A': return Function_Race;
|
||||||
|
case 'B': return Function_Cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Function_None;
|
return Function_None;
|
||||||
@ -71,7 +77,7 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
|
|||||||
{
|
{
|
||||||
static const Function integerFunctions[] =
|
static const Function integerFunctions[] =
|
||||||
{
|
{
|
||||||
Function_Journal, Function_Item,
|
Function_Journal, Function_Item, Function_Dead,
|
||||||
Function_None // end marker
|
Function_None // end marker
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -82,14 +88,12 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
|
|||||||
|
|
||||||
static const Function booleanFunctions[] =
|
static const Function booleanFunctions[] =
|
||||||
{
|
{
|
||||||
|
Function_Id, Function_Faction, Function_Class, Function_Race, Function_Cell,
|
||||||
Function_None // end marker
|
Function_None // end marker
|
||||||
};
|
};
|
||||||
|
|
||||||
Function function = getFunction();
|
Function function = getFunction();
|
||||||
|
|
||||||
if (function==Function_None)
|
|
||||||
return Type_None;
|
|
||||||
|
|
||||||
for (int i=0; integerFunctions[i]!=Function_None; ++i)
|
for (int i=0; integerFunctions[i]!=Function_None; ++i)
|
||||||
if (integerFunctions[i]==function)
|
if (integerFunctions[i]==function)
|
||||||
return Type_Integer;
|
return Type_Integer;
|
||||||
@ -102,29 +106,46 @@ MWDialogue::SelectWrapper::Type MWDialogue::SelectWrapper::getType() const
|
|||||||
if (booleanFunctions[i]==function)
|
if (booleanFunctions[i]==function)
|
||||||
return Type_Boolean;
|
return Type_Boolean;
|
||||||
|
|
||||||
throw std::runtime_error ("failed to determine type of select function");
|
return Type_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MWDialogue::SelectWrapper::IsInverted() const
|
bool MWDialogue::SelectWrapper::isInverted() const
|
||||||
{
|
{
|
||||||
char type = mSelect.mSelectRule[1];
|
char type = mSelect.mSelectRule[1];
|
||||||
|
|
||||||
return type=='7' || type=='8' || type=='9' || type=='A' || type=='B' || type=='C';
|
return type=='7' || type=='8' || type=='9' || type=='A' || type=='B' || type=='C';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MWDialogue::SelectWrapper::isNpcOnly() const
|
||||||
|
{
|
||||||
|
static const Function functions[] =
|
||||||
|
{
|
||||||
|
Function_Faction, SelectWrapper::Function_Class, SelectWrapper::Function_Race,
|
||||||
|
Function_None // end marker
|
||||||
|
};
|
||||||
|
|
||||||
|
Function function = getFunction();
|
||||||
|
|
||||||
|
for (int i=0; functions[i]!=Function_None; ++i)
|
||||||
|
if (functions[i]==function)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool MWDialogue::SelectWrapper::selectCompare (int value) const
|
bool MWDialogue::SelectWrapper::selectCompare (int value) const
|
||||||
{
|
{
|
||||||
return selectCompareImp (mSelect, value)!=IsInverted(); // logic XOR
|
return selectCompareImp (mSelect, value)!=isInverted(); // logic XOR
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MWDialogue::SelectWrapper::selectCompare (float value) const
|
bool MWDialogue::SelectWrapper::selectCompare (float value) const
|
||||||
{
|
{
|
||||||
return selectCompareImp (mSelect, value)!=IsInverted(); // logic XOR
|
return selectCompareImp (mSelect, value)!=isInverted(); // logic XOR
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MWDialogue::SelectWrapper::selectCompare (bool value) const
|
bool MWDialogue::SelectWrapper::selectCompare (bool value) const
|
||||||
{
|
{
|
||||||
return selectCompareImp (mSelect, static_cast<int> (value))!=IsInverted(); // logic XOR
|
return selectCompareImp (mSelect, static_cast<int> (value))!=isInverted(); // logic XOR
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MWDialogue::SelectWrapper::getName() const
|
std::string MWDialogue::SelectWrapper::getName() const
|
||||||
|
@ -15,7 +15,13 @@ namespace MWDialogue
|
|||||||
{
|
{
|
||||||
Function_None,
|
Function_None,
|
||||||
Function_Journal,
|
Function_Journal,
|
||||||
Function_Item
|
Function_Item,
|
||||||
|
Function_Dead,
|
||||||
|
Function_Id,
|
||||||
|
Function_Faction,
|
||||||
|
Function_Class,
|
||||||
|
Function_Race,
|
||||||
|
Function_Cell
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Type
|
enum Type
|
||||||
@ -34,7 +40,10 @@ namespace MWDialogue
|
|||||||
|
|
||||||
Type getType() const;
|
Type getType() const;
|
||||||
|
|
||||||
bool IsInverted() const;
|
bool isInverted() const;
|
||||||
|
|
||||||
|
bool isNpcOnly() const;
|
||||||
|
///< \attention Do not call any of the select functions for this select struct!
|
||||||
|
|
||||||
bool selectCompare (int value) const;
|
bool selectCompare (int value) const;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user