// 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 .
#ifndef FAMILY_PROFILE_H
#define FAMILY_PROFILE_H
#include "nel/misc/smart_ptr.h"
#include "ai_share/ai_types.h"
#include "server_share/mission_messages.h"
#include "game_share/zc_shard_common.h"
#include "ai_factory.h"
class CFamilyBehavior;
//class IGroup;
class CGroupNpc;
class CNpcZone;
class CGroupFamily;
class IGroupDesc;
template
class CGroupDesc;
/** Interface class for family profile
*/
class IFamilyProfile :
public NLMISC::CDbgRefCount,
public NLMISC::CRefCount
{
protected:
NLMISC::CDbgPtr _FamilyBehavior;
public:
class CtorParam
{
public:
CtorParam(CFamilyBehavior *familyBehavior)
:_familyBehavior(familyBehavior)
{
#ifdef NL_DEBUG
nlassert(familyBehavior);
#endif
}
virtual ~CtorParam()
{}
const CFamilyBehavior *familyBehavior () const
{
return _familyBehavior;
}
protected:
friend class IFamilyProfile;
private:
CFamilyBehavior *_familyBehavior;
};
IFamilyProfile (const CtorParam &ctorParam)
:_FamilyBehavior(ctorParam._familyBehavior)
{
}
virtual ~IFamilyProfile ()
{
}
virtual void setDefaultProfile(const CNpcZone *const zone, CGroupNpc *grp) {}
/// Spawn group.
virtual void spawnGroup() =0;
/// The main update for the profile. Called aprox every 10 s (100 ticks)
virtual void update() =0;
/// Fill a vector of outpost id name assigned to tribe
virtual void fillOutpostNames(std::vector outpostNames) {};
/// Add an outpost for the tribe (nb : the family must be a tribe)
virtual void outpostAdd(NLMISC::TStringId outpostName) {};
/// Remove an from the tribe
virtual void outpostRemove(NLMISC::TStringId outpostName) {};
virtual void outpostEvent(NLMISC::TStringId outpostName, ZCSTATE::TZcState state) {};
virtual void spawnBoss(NLMISC::TStringId outpostName) {};
CGroupNpc *createNpcGroup(const CNpcZone *const zone, const CGroupDesc *const groupDesc);
/** Factory method to create profile instance.
* NB : you are responsible to delete the profile.
*/
static IFamilyProfile* createFamilyProfile(const NLMISC::TStringId &profileNamer, const IFamilyProfile::CtorParam& ctorParam);
};
class CFamilyProfileFactory
: public CAiFactoryContainer // TFamilyTag>
{
public:
CFamilyProfileFactory();
static CAiFactoryContainer &instance();
virtual ~CFamilyProfileFactory();
static IFamilyProfile* createFamilyProfile(const NLMISC::TStringId &keyWord, const IFamilyProfile::CtorParam& ctorParam);
};
#endif // FAMILY_PROFILE_H