mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-13 21:40:11 +00:00
added test for global variables
This commit is contained in:
parent
fbe11956a6
commit
11bc131417
@ -1,6 +1,10 @@
|
|||||||
|
|
||||||
#include "dialoguemanager.hpp"
|
#include "dialoguemanager.hpp"
|
||||||
|
|
||||||
|
#include <cctype>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
#include <components/esm/loaddial.hpp>
|
#include <components/esm/loaddial.hpp>
|
||||||
|
|
||||||
#include <components/esm_store/store.hpp>
|
#include <components/esm_store/store.hpp>
|
||||||
@ -14,6 +18,16 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
|
std::string toLower (const std::string& name)
|
||||||
|
{
|
||||||
|
std::string lowerCase;
|
||||||
|
|
||||||
|
std::transform (name.begin(), name.end(), std::back_inserter (lowerCase),
|
||||||
|
(int(*)(int)) std::tolower);
|
||||||
|
|
||||||
|
return lowerCase;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
template<typename T1, typename T2>
|
||||||
bool selectCompare (char comp, T1 value1, T2 value2)
|
bool selectCompare (char comp, T1 value1, T2 value2)
|
||||||
{
|
{
|
||||||
@ -64,6 +78,36 @@ namespace
|
|||||||
|
|
||||||
return selectCompare (comp, locals.mFloats.at (i), value);
|
return selectCompare (comp, locals.mFloats.at (i), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
bool checkGlobal (char comp, const std::string& name, T value, MWWorld::World& world)
|
||||||
|
{
|
||||||
|
switch (world.getGlobalVariableType (name))
|
||||||
|
{
|
||||||
|
case 's':
|
||||||
|
|
||||||
|
return selectCompare (comp, value, world.getGlobalVariable (name).mShort);
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
|
||||||
|
return selectCompare (comp, value, world.getGlobalVariable (name).mLong);
|
||||||
|
|
||||||
|
case 'f':
|
||||||
|
|
||||||
|
return selectCompare (comp, value, world.getGlobalVariable (name).mFloat);
|
||||||
|
|
||||||
|
case ' ':
|
||||||
|
|
||||||
|
world.getGlobalVariable (name); // trigger exception
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
throw std::runtime_error ("unsupported gobal variable type");
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWDialogue
|
namespace MWDialogue
|
||||||
@ -78,7 +122,7 @@ namespace MWDialogue
|
|||||||
char comp = select.selectRule[4];
|
char comp = select.selectRule[4];
|
||||||
std::string name = select.selectRule.substr (5);
|
std::string name = select.selectRule.substr (5);
|
||||||
|
|
||||||
// TODO types 1, 2, 4, 5, 6, 7, 8, 9, A, B, C
|
// TODO types 4, 5, 6, 7, 8, 9, A, B, C
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
@ -86,18 +130,37 @@ namespace MWDialogue
|
|||||||
|
|
||||||
return false; // TODO implement functions
|
return false; // TODO implement functions
|
||||||
|
|
||||||
|
case '2': // global
|
||||||
|
|
||||||
|
if (select.type==ESM::VT_Short || select.type==ESM::VT_Int ||
|
||||||
|
select.type==ESM::VT_Long)
|
||||||
|
{
|
||||||
|
if (!checkGlobal (comp, toLower (name), select.i, *mEnvironment.mWorld))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (select.type==ESM::VT_Float)
|
||||||
|
{
|
||||||
|
if (!checkGlobal (comp, toLower (name), select.f, *mEnvironment.mWorld))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw std::runtime_error (
|
||||||
|
"unsupported variable type in dialogue info select");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
case '3': // local
|
case '3': // local
|
||||||
|
|
||||||
if (select.type==ESM::VT_Short || select.type==ESM::VT_Int ||
|
if (select.type==ESM::VT_Short || select.type==ESM::VT_Int ||
|
||||||
select.type==ESM::VT_Long)
|
select.type==ESM::VT_Long)
|
||||||
{
|
{
|
||||||
if (!checkLocal (comp, name, select.i, actor,
|
if (!checkLocal (comp, toLower (name), select.i, actor,
|
||||||
mEnvironment.mWorld->getStore()))
|
mEnvironment.mWorld->getStore()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (select.type==ESM::VT_Float)
|
else if (select.type==ESM::VT_Float)
|
||||||
{
|
{
|
||||||
if (!checkLocal (comp, name, select.f, actor,
|
if (!checkLocal (comp, toLower (name), select.f, actor,
|
||||||
mEnvironment.mWorld->getStore()))
|
mEnvironment.mWorld->getStore()))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -120,7 +183,7 @@ namespace MWDialogue
|
|||||||
{
|
{
|
||||||
// actor id
|
// actor id
|
||||||
if (!info.actor.empty())
|
if (!info.actor.empty())
|
||||||
if (info.actor!=MWWorld::Class::get (actor).getId (actor))
|
if (toLower (info.actor)!=MWWorld::Class::get (actor).getId (actor))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!info.race.empty())
|
if (!info.race.empty())
|
||||||
@ -130,7 +193,7 @@ namespace MWDialogue
|
|||||||
if (!cellRef)
|
if (!cellRef)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (info.race!=cellRef->base->race)
|
if (toLower (info.race)!=toLower (cellRef->base->race))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,6 +248,7 @@ namespace MWDialogue
|
|||||||
|
|
||||||
if (!iter->resultScript.empty())
|
if (!iter->resultScript.empty())
|
||||||
{
|
{
|
||||||
|
std::cout << "script: " << iter->resultScript << std::endl;
|
||||||
// TODO execute script
|
// TODO execute script
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user