1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
#include "ResponseEffectTypes.h"
#include "ieclass.h"
#include "iregistry.h"
#include "gamelib.h"
#include "string/predicate.h"
/** greebo: The visitor class that stores all the relevant eclassptrs
* into the given target map if the prefix matches.
*/
class ResponseEffectLoader :
public EntityClassVisitor
{
// The target map to populate
ResponseEffectTypeMap& _map;
// The entityDef prefix (e.g. "effect_")
std::string _prefix;
public:
/** greebo: Pass the target map where all the eclassptrs
* should be stored into.
*/
ResponseEffectLoader(ResponseEffectTypeMap& map) :
_map(map)
{
_prefix = game::current::getValue<std::string>(GKEY_RESPONSE_EFFECT_PREFIX);
}
void visit(const IEntityClassPtr& eclass)
{
if (string::starts_with(eclass->getDeclName(), _prefix))
{
// We have a match, store the eclassptr
_map[eclass->getDeclName()] = eclass;
}
}
};
ResponseEffectTypes::ResponseEffectTypes()
{
// Load the possible effect types
ResponseEffectLoader loader(_effectTypes);
GlobalEntityClassManager().forEachEntityClass(loader);
}
std::shared_ptr<ResponseEffectTypes>& ResponseEffectTypes::InstancePtr()
{
static std::shared_ptr<ResponseEffectTypes> _instance;
return _instance;
}
// Static accessor
ResponseEffectTypes& ResponseEffectTypes::Instance()
{
if (!InstancePtr())
{
InstancePtr().reset(new ResponseEffectTypes);
}
return *InstancePtr();
}
void ResponseEffectTypes::Clear()
{
InstancePtr().reset();
}
IEntityClassPtr ResponseEffectTypes::getEClassForName(const std::string& name)
{
// Try to lookup the given name in the map
ResponseEffectTypeMap::iterator found = _effectTypes.find(name);
// Return an empty pointer if no effect type is matching
return (found != _effectTypes.end()) ? found->second : IEntityClassPtr();
}
ResponseEffectTypeMap& ResponseEffectTypes::getMap()
{
return _effectTypes;
}
std::string ResponseEffectTypes::getFirstEffectName()
{
ResponseEffectTypeMap::iterator found = _effectTypes.begin();
// Return the first name or nothing, if we didn't find anything
return (found != _effectTypes.end()) ? found->first : "";
}
|