// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "family_profile.h"
#include "continent.h"
#include "ai_place_xyr.h"
#include "ai_grp_fauna.h"
#include "ai_grp_npc.h"
#include "ai_mgr_fauna.h"
#include "ai_mgr_npc.h"
#include "group_profile.h"
#include "family_behavior.h"
// #include "family_profile_tribe.h"
#include "continent_inline.h"
//extern bool LogOutpostDebug;
extern NLMISC::CVariable LogOutpostDebug;
#include "dyn_grp_inline.h"
using namespace std;
using namespace NLMISC;
using namespace AITYPES;
CGroupNpc *IFamilyProfile::createNpcGroup(const CNpcZone *const zone, const CGroupDesc *const groupDesc)
{
CGroupNpc *grp=_FamilyBehavior->createNpcGroup(zone, groupDesc);
if (grp)
setDefaultProfile(zone, grp);
return grp;
}
class CFamilyProfileKitin : public IFamilyProfile
{
public:
CFamilyProfileKitin (const IFamilyProfile::CtorParam &ctorParam)
:IFamilyProfile(ctorParam)
{
}
virtual ~CFamilyProfileKitin()
{
}
void spawnGroup()
{
H_AUTO(FamilySpawnKitin)
const CGroupDesc *gd = _FamilyBehavior->grpFamily()->getProportionalGroupDesc(_FamilyBehavior, CPropertySet(), CPropertySet());
if (!gd)
return;
CGrpFauna *grp = gd->createFaunaGroup(_FamilyBehavior);
if (!grp)
return;
// nldebug("DYN: Grp '%p' spawned for fauna", grp);
grp->getSpawnObj()->spawnBotOfGroup();
}
/// The main update for the profile. Called aprox every 10 s (100 ticks)
void update()
{
}
};
class CFamilyProfileFauna : public IFamilyProfile
{
public:
CFamilyProfileFauna (const IFamilyProfile::CtorParam &ctorParam)
:IFamilyProfile(ctorParam)
{
}
virtual ~CFamilyProfileFauna()
{
}
void spawnGroup()
{
H_AUTO(FamilySpawnFauna)
const CGroupDesc *const gd = _FamilyBehavior->grpFamily()->getProportionalGroupDesc(_FamilyBehavior, CPropertySet(), CPropertySet());
if (!gd)
return;
CGrpFauna *const grp = gd->createFaunaGroup(_FamilyBehavior);
if (!grp)
return;
// nldebug("DYN: Grp '%p' spawned for fauna", grp);
grp->getSpawnObj()->spawnBotOfGroup();
}
/// The main update for the profile. Called aprox every 10 s (100 ticks)
void update()
{
}
};
class CFamilyProfileNpc : public IFamilyProfile
{
public:
CFamilyProfileNpc(const IFamilyProfile::CtorParam &ctorParam)
:IFamilyProfile(ctorParam)
{
}
virtual ~CFamilyProfileNpc()
{
}
void spawnGroup()
{
H_AUTO(FamilySpawnNpc)
AITYPES::CPropertySet flags;
_FamilyBehavior->getNpcFlags(flags);
const CNpcZone *spawn = _FamilyBehavior->getOwner()->lookupNpcZone(flags, _FamilyBehavior->grpFamily()->getSubstitutionId());
if (!spawn)
return;
const CGroupDesc *const gd = _FamilyBehavior->grpFamily()->getProportionalGroupDesc(_FamilyBehavior, CPropertySet(), CPropertySet());
if (!gd)
return;
const CGroupNpc *const grp=createNpcGroup(spawn, gd);
if (!grp)
return;
grp->getSpawnObj()->spawnBotOfGroup();
}
/// The main update for the profile. Called aprox every 10 s (100 ticks)
void update()
{
}
};
CAiFactory _singleProfileFauna;
IAiFactory *_ProfileFauna=&_singleProfileFauna;
CAiFactory _singleProfileKitin;
IAiFactory *_ProfileKitin=&_singleProfileKitin;
CAiFactory _singleProfileNpc;
IAiFactory *_ProfileNpc=&_singleProfileNpc;
extern IAiFactory *_ProfileTribe; // in another cpp.
CFamilyProfileFactory::CFamilyProfileFactory()
{
registerFactory(CStringMapper::map("groupFamilyProfileFauna"), _ProfileFauna);
registerFactory(CStringMapper::map("groupFamilyProfileKitin"), _ProfileKitin);
registerFactory(CStringMapper::map("groupFamilyProfileTribe"), _ProfileTribe);
registerFactory(CStringMapper::map("groupFamilyProfileNpc"), _ProfileNpc);
}
CFamilyProfileFactory::~CFamilyProfileFactory()
{
}
CAiFactoryContainer &CFamilyProfileFactory::instance()
{
if (!_Instance)
{
_Instance = new CFamilyProfileFactory();
}
return *_Instance;
}
IFamilyProfile* CFamilyProfileFactory::createFamilyProfile(const TStringId &keyWord, const IFamilyProfile::CtorParam& ctorParam)
{
breakable
{
IAiFactory *const familyProfile=instance().getFactory(keyWord);
if (!familyProfile)
break;
IFamilyProfile *const profile=familyProfile->createObject(ctorParam);
if (!profile)
break;
return profile;
}
nlwarning("DYN: createProfile no profile available for %s", NLMISC::CStringMapper::unmap(keyWord).c_str());
return NULL;
}
NL_ISO_TEMPLATE_SPEC CAiFactoryContainer *CAiFactoryContainer::_Instance = NULL;
IFamilyProfile* IFamilyProfile::createFamilyProfile(const TStringId &profileName, const IFamilyProfile::CtorParam& ctorParam)
{
return CFamilyProfileFactory::createFamilyProfile(profileName, ctorParam);
}