#include "gfCCollectionListenerComponent.h"
#include <fsAppCore/src/fsCEntity.h>
#include <fsAppCore/src/fsCProfileManager.h>
#include <fsAppCore/src/fsCAppMessageDispatcher.h>
#include <fsCore/src/fsCVariableTable.h>
#include <fsCore/src/fsCResourceName.h>
#include <gfHogCore/src/gfCHogUserSavedData.h>
#include <gfComponents/components/gfICollectableComponent.h>
#include <gfAchievements/src/gfCAchievementManager.h>
const fsCUniqueId gfCCollectionListenerComponent::mTypeId("gfCCollectionListenerComponent");
void gfCCollectionListenerComponent::listenersRegisterDo()
{
fsIMessageListener::listenersRegisterDo();
fsCAppMessageDispatcher::instanceGet()->listenerRegister(gfICollectableComponent::mCollectionEndMsg, this);
fsCVariableTable config;
config.load(fsCResourceName("collectionTypes.txt", fsCResourceName::eRES_LOCATION_ASSETS));
fsS32 i = 1;
fsStr tag = config.strGetWithDefault("tag" + fsStr(i), "");
while (!tag.emptyGet())
{
sRule rule;
rule.mTag = tag;
rule.mAchievementKey = config.strGetWithDefault(tag + ".achievementKey", "");
rule.mStat = config.strGetWithDefault(tag + ".stat", "");
mRules.push_back(rule);
tag = config.strGetWithDefault("tag" + fsStr(++i), "");
}
}
void gfCCollectionListenerComponent::listenersDeregisterDo()
{
fsIMessageListener::listenersDeregisterDo();
fsCAppMessageDispatcher::instanceGet()->listenerDeregister(gfICollectableComponent::mCollectionEndMsg, this);
}
fsBool gfCCollectionListenerComponent::messageProcessDo(const fsCUniqueId& pMessageType,
const fsIMessageDispatcher::sMessageParameters& pParam)
{
if (gfICollectableComponent::mCollectionEndMsg == pMessageType)
{
const gfICollectableComponent::sEntityCollectedParam& msgParams = static_cast<const
gfICollectableComponent::sEntityCollectedParam&>(pParam);
for (const sRule& rule : mRules)
{
if (msgParams.mEnt->tagExists(rule.mTag))
{<--- Consider using std::find_if algorithm instead of a raw loop.
if (!rule.mAchievementKey.emptyGet())
{
fsStr name = msgParams.mEnt->nameGet();
name.erase(name.rfind("."));
gfCAchievementManager::instanceGet()->achievementUnlock(
rule.mAchievementKey, name, msgParams.mEnt->posGet());
}
if (!rule.mStat.emptyGet())
{
fsCProfileManager::instanceGet()->userSavedDataGet()->s32Inc(rule.mStat);
}
break;
}
}
return false;
}
return false;
}
fsIComponent* gfCCollectionListenerComponent::create(fsCEntity* pParent)
{
return new gfCCollectionListenerComponent(pParent);
}
gfCCollectionListenerComponent::gfCCollectionListenerComponent(fsCEntity* const pParent) :
fsIMessageListenerComponent(pParent)
{
}
gfCCollectionListenerComponent::~gfCCollectionListenerComponent()
{
}