// 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 RYAI_SHEETS_H #define RYAI_SHEETS_H // Nel Misc #include "nel/misc/types_nl.h" #include "nel/misc/smart_ptr.h" #include "nel/misc/sheet_id.h" ///Nel Georges #include "nel/georges/u_form.h" #include "nel/georges/u_form_elm.h" #include "ai_share/ai_types.h" #include "game_share/fame.h" #include "game_share/visual_slot_manager.h" #include "ai_script_comp.h" #include "game_share/people_pd.h" /** * Singleton containing database on information for actors * \author Sadge * \author Nevrax France * \date 2002 */ namespace AISHEETS { enum TFightCfg { FIGHTCFG_MELEE=0, FIGHTCFG_RANGE, FIGHTCFG_NUKE, FIGHTCFG_HEAL, FIGHTCFG_MAX }; ////////////////////////////////////////////////////////////////////////////// // CAIAction // ////////////////////////////////////////////////////////////////////////////// class IAIAction : public NLMISC::CRefCount //, public NLMISC::CDbgRefCount { public: virtual ~IAIAction() { } public: virtual NLMISC::CSheetId SheetId() const = 0; virtual bool SelfAction() const = 0; }; typedef NLMISC::CSmartPtr IAIActionPtr; typedef NLMISC::CSmartPtr IAIActionCPtr; class CAIAction : public IAIAction { public: CAIAction(); virtual NLMISC::CSheetId SheetId() const { return _SheetId; } virtual bool SelfAction() const { return _SelfAction; } public: void readGeorges(NLMISC::CSmartPtr const& form, NLMISC::CSheetId const& sheetId); void serial(NLMISC::IStream& s); void removed() { } static uint getVersion(); virtual std::vector getMultiLineInfoString() const; private: NLMISC::CSheetId _SheetId; bool _SelfAction; }; typedef NLMISC::CSmartPtr CAIActionPtr; typedef NLMISC::CSmartPtr CAIActionCPtr; ////////////////////////////////////////////////////////////////////////////// // CActionList // ////////////////////////////////////////////////////////////////////////////// class CActionList : public NLMISC::CDbgRefCount { public: virtual ~CActionList() { } NLMISC::CSheetId _SheetId; std::vector _Actions; bool _HasNormalAction; bool _HasSelfAction; void computeAbilities(); void readGeorges(NLMISC::CSmartPtr const& form, NLMISC::CSheetId const& sheetId); void serial(NLMISC::IStream& s); void removed() { } static uint getVersion(); void addAction(NLMISC::CSheetId const& sheetId, std::string const& actionName); virtual std::vector getMultiLineInfoString() const; }; ////////////////////////////////////////////////////////////////////////////// // CGroupProperties // ////////////////////////////////////////////////////////////////////////////// class CGroupProperties { public: CGroupProperties(); virtual ~CGroupProperties() { } virtual void setAssist(bool assist) { _Assist = assist; } bool assist() const { return _Assist; } virtual void setAttack(bool attack) { _Attack = attack; } bool attack() const { return _Attack; } private: bool _Assist; bool _Attack; }; typedef std::vector TGroupPropertiesLine; ////////////////////////////////////////////////////////////////////////////// // CDefaultGroupProperties // ////////////////////////////////////////////////////////////////////////////// class CDefaultGroupProperties : public CGroupProperties { public: virtual ~CDefaultGroupProperties() { } // avoid modification. virtual void setAssist(bool assist) { } virtual void setAttack(bool attack) { } }; ////////////////////////////////////////////////////////////////////////////// // ICreature // ////////////////////////////////////////////////////////////////////////////// class ICreature : public NLMISC::CRefCount { public: typedef std::vector > TScriptCompList; public: virtual ~ICreature() { } public: virtual NLMISC::CSheetId const& SheetId() const = 0; virtual uint32 Level() const = 0; // Level of the creature // colors from sheet virtual uint8 ColorHead() const = 0; virtual uint8 ColorArms() const = 0; virtual uint8 ColorHands() const = 0; virtual uint8 ColorBody() const = 0; virtual uint8 ColorLegs() const = 0; virtual uint8 ColorFeets() const = 0; virtual float Radius() const = 0; // pacs primitive 's radius virtual float Height() const = 0; // pacs primitive 's height virtual float Width() const = 0; // pacs primitive 's width virtual float Length() const = 0; // pacs primitive 's length virtual float BoundingRadius() const = 0; // fighting radius // the entity is a bot object and cannot be traversed. virtual bool NotTraversable() const = 0; // the entity is a fauna, even is used as npc, it keep it's fauna name virtual bool ForceDisplayCreatureName() const = 0; virtual float BonusAggroHungry() const = 0; virtual float BonusAggroVeryHungry() const = 0; virtual float AssistDist() const = 0; virtual float AggroRadiusNotHungry() const = 0; virtual float AggroRadiusHungry() const = 0; virtual float AggroRadiusHunting() const = 0; virtual float AggroReturnDistCheck() const = 0; virtual float AggroRadiusD1() const = 0; // large radius, for first hit place virtual float AggroRadiusD2() const = 0; // small radius, for last hit place virtual float AggroPrimaryGroupDist() const = 0; virtual float AggroPrimaryGroupCoef() const = 0; virtual float AggroSecondaryGroupDist() const = 0; virtual float AggroSecondaryGroupCoef() const = 0; virtual float AggroPropagationRadius() const = 0; virtual AITYPES::TFaunaType FaunaType() const = 0; virtual float Scale() const = 0; // 3d scale. virtual float DistToFront() const = 0; virtual float DistToBack() const = 0; virtual float DistToSide() const = 0; virtual float DistModulator() const = 0; // = 0.5f; // (0) - (1) - (n). virtual float TargetModulator() const = 0; // = 1.f; // (0) - (1). virtual float ScoreModulator() const = 0; // = 0.01f; // (0) - (-1). virtual float FearModulator() const = 0; // = 0.01f; // (0) - (1). virtual float LifeLevelModulator() const = 0; // = 0.5f; // (0) - (1). virtual float CourageModulator() const = 0; // = 2.f; // (-n) - (0) - (+n) virtual float GroupCohesionModulator() const = 0; virtual float GroupDispersion() const = 0; // 0.f 1.f virtual uint32 XPLevel() const = 0; virtual uint32 NbPlayers() const = 0; virtual uint32 EnergyValue() const = 0; virtual bool CanTurn() const = 0; virtual NLMISC::CDbgPtr const& FightConfig(TFightCfg fightCfg) const = 0; virtual NLMISC::CSheetId const& LeftItem() const = 0; virtual NLMISC::CSheetId const& RightItem() const = 0; virtual uint32 MinFightDist() const = 0; virtual uint32 FactionIndex() const = 0; virtual sint32 FameForGuardAttack() const = 0; virtual std::string const& AssistGroupIndexStr() const = 0; virtual std::string const& AttackGroupIndexStr() const = 0; virtual std::string const& GroupIndexStr() const = 0; virtual uint32 GroupPropertiesIndex() const = 0; /// the creature sheet can specify a multiplier that modulate the dynmaic groupe size virtual uint32 DynamicGroupCountMultiplier() const = 0; virtual std::string const& BotName() const = 0; virtual TScriptCompList const& ScriptCompList() const = 0; virtual TScriptCompList const& UpdateScriptList() const = 0; virtual TScriptCompList const& DeathScriptList() const = 0; virtual TScriptCompList const& BirthScriptList() const = 0; // Character Race virtual EGSPD::CPeople::TPeople Race() const = 0; virtual CGroupProperties const& getPropertiesCst(uint32 groupIndex) const = 0; virtual std::vector getMultiLineInfoString() const = 0; static sint32 InvalidFameForGuardAttack; }; typedef NLMISC::CSmartPtr ICreaturePtr; typedef NLMISC::CSmartPtr ICreatureCPtr; ////////////////////////////////////////////////////////////////////////////// // CCreatureProxy // ////////////////////////////////////////////////////////////////////////////// class CCreatureProxy : public ICreature { protected: AISHEETS::ICreatureCPtr _Sheet; public: CCreatureProxy(AISHEETS::ICreatureCPtr const& sheet) : _Sheet(sheet) { } virtual void setSheet(AISHEETS::ICreatureCPtr const& sheet) { _Sheet = sheet; } virtual bool isValid() const { return _Sheet!=NULL; } public: virtual NLMISC::CSheetId const& SheetId() const { if (_Sheet) return _Sheet->SheetId(); else return NLMISC::CSheetId::Unknown; } virtual uint32 Level() const { return _Sheet->Level(); } virtual uint8 ColorHead() const { return _Sheet->ColorHead(); } virtual uint8 ColorArms() const { return _Sheet->ColorArms(); } virtual uint8 ColorHands() const { return _Sheet->ColorHands(); } virtual uint8 ColorBody() const { return _Sheet->ColorBody(); } virtual uint8 ColorLegs() const { return _Sheet->ColorLegs(); } virtual uint8 ColorFeets() const { return _Sheet->ColorFeets(); } virtual float Radius() const { return _Sheet->Radius(); } virtual float Height() const { return _Sheet->Height(); } virtual float Width() const { return _Sheet->Width(); } virtual float Length() const { return _Sheet->Length(); } virtual float BoundingRadius() const { return _Sheet->BoundingRadius(); } virtual bool NotTraversable() const { return _Sheet->NotTraversable(); } virtual bool ForceDisplayCreatureName() const { return _Sheet->ForceDisplayCreatureName(); } virtual float BonusAggroHungry() const { return _Sheet->BonusAggroHungry(); } virtual float BonusAggroVeryHungry() const { return _Sheet->BonusAggroVeryHungry(); } virtual float AssistDist() const { return _Sheet->AssistDist(); } virtual float AggroRadiusNotHungry() const { return _Sheet->AggroRadiusNotHungry(); } virtual float AggroRadiusHungry() const { return _Sheet->AggroRadiusHungry(); } virtual float AggroRadiusHunting() const { return _Sheet->AggroRadiusHunting(); } virtual float AggroReturnDistCheck() const { return _Sheet->AggroReturnDistCheck(); } virtual float AggroRadiusD1() const { return _Sheet->AggroRadiusD1(); } virtual float AggroRadiusD2() const { return _Sheet->AggroRadiusD2(); } virtual float AggroPrimaryGroupDist() const { return _Sheet->AggroPrimaryGroupDist(); } virtual float AggroPrimaryGroupCoef() const { return _Sheet->AggroPrimaryGroupCoef(); } virtual float AggroSecondaryGroupDist() const { return _Sheet->AggroSecondaryGroupDist(); } virtual float AggroSecondaryGroupCoef() const { return _Sheet->AggroSecondaryGroupCoef(); } virtual float AggroPropagationRadius() const { return _Sheet->AggroPropagationRadius(); } virtual AITYPES::TFaunaType FaunaType() const { return _Sheet->FaunaType(); } virtual float Scale() const { return _Sheet->Scale(); } virtual float DistToFront() const { return _Sheet->DistToFront(); } virtual float DistToBack() const { return _Sheet->DistToBack(); } virtual float DistToSide() const { return _Sheet->DistToSide(); } virtual float DistModulator() const { return _Sheet->DistModulator(); } virtual float TargetModulator() const { return _Sheet->TargetModulator(); } virtual float ScoreModulator() const { return _Sheet->ScoreModulator(); } virtual float FearModulator() const { return _Sheet->FearModulator(); } virtual float LifeLevelModulator() const { return _Sheet->LifeLevelModulator(); } virtual float CourageModulator() const { return _Sheet->CourageModulator(); } virtual float GroupCohesionModulator() const { return _Sheet->GroupCohesionModulator(); } virtual float GroupDispersion() const { return _Sheet->GroupDispersion(); } virtual uint32 XPLevel() const { return _Sheet->XPLevel(); } virtual uint32 NbPlayers() const { return _Sheet->NbPlayers(); } virtual uint32 EnergyValue() const { return _Sheet->EnergyValue(); } virtual bool CanTurn() const { return _Sheet->CanTurn(); } virtual NLMISC::CDbgPtr const& FightConfig(TFightCfg fightCfg) const { return _Sheet->FightConfig(fightCfg); } virtual NLMISC::CSheetId const& LeftItem() const { return _Sheet->LeftItem(); } virtual NLMISC::CSheetId const& RightItem() const { return _Sheet->RightItem(); } virtual uint32 MinFightDist() const { return _Sheet->MinFightDist(); } virtual uint32 FactionIndex() const { return _Sheet->FactionIndex(); } virtual sint32 FameForGuardAttack() const { return _Sheet->FameForGuardAttack(); } virtual std::string const& AssistGroupIndexStr() const { return _Sheet->AssistGroupIndexStr(); } virtual std::string const& AttackGroupIndexStr() const { return _Sheet->AttackGroupIndexStr(); } virtual std::string const& GroupIndexStr() const { return _Sheet->GroupIndexStr(); } virtual uint32 GroupPropertiesIndex() const { return _Sheet->GroupPropertiesIndex(); } virtual uint32 DynamicGroupCountMultiplier() const { return _Sheet->DynamicGroupCountMultiplier(); } virtual std::string const& BotName() const { return _Sheet->BotName(); } virtual TScriptCompList const& ScriptCompList() const { return _Sheet->ScriptCompList(); } virtual TScriptCompList const& UpdateScriptList() const { return _Sheet->UpdateScriptList(); } virtual TScriptCompList const& DeathScriptList() const { return _Sheet->DeathScriptList(); } virtual TScriptCompList const& BirthScriptList() const { return _Sheet->BirthScriptList(); } virtual EGSPD::CPeople::TPeople Race() const { return _Sheet->Race(); } virtual CGroupProperties const& getPropertiesCst(uint32 groupIndex) const { return _Sheet->getPropertiesCst(groupIndex); } virtual std::vector getMultiLineInfoString() const { return _Sheet->getMultiLineInfoString(); } }; ////////////////////////////////////////////////////////////////////////////// // CCreature // ////////////////////////////////////////////////////////////////////////////// class CCreature : public ICreature { public: CCreature(); private: NLMISC::CSheetId _SheetId; uint32 _Level; // colors from sheet uint8 _ColorHead; uint8 _ColorArms; uint8 _ColorHands; uint8 _ColorBody; uint8 _ColorLegs; uint8 _ColorFeets; float _Radius; float _Height; float _Width; float _Length; float _BoundingRadius; // the entity is a bot object and cannot be traversed. bool _NotTraversable; // the entity is a fauna, even is used as npc, it keep it's fauna name bool _ForceDisplayCreatureName; float _BonusAggroHungry; float _BonusAggroVeryHungry; float _AssistDist; float _AggroRadiusNotHungry; float _AggroRadiusHungry; float _AggroRadiusHunting; float _AggroReturnDistCheck; float _AggroRadiusD1; float _AggroRadiusD2; float _AggroPrimaryGroupDist; float _AggroPrimaryGroupCoef; float _AggroSecondaryGroupDist; float _AggroSecondaryGroupCoef; float _AggroPropagationRadius; AITYPES::TFaunaType _FaunaType; float _Scale; float _DistToFront; float _DistToBack; float _DistToSide; float _DistModulator; float _TargetModulator; float _ScoreModulator; float _FearModulator; float _LifeLevelModulator; float _CourageModulator; float _GroupCohesionModulator; float _GroupDispersion; uint32 _XPLevel; uint32 _NbPlayers; uint32 _EnergyValue; bool _CanTurn; NLMISC::CDbgPtr _FightConfig[FIGHTCFG_MAX]; NLMISC::CSheetId _LeftItem; NLMISC::CSheetId _RightItem; uint32 _MinFightDist; uint32 _FactionIndex; sint32 _FameForGuardAttack; std::string _AssistGroupIndexStr; std::string _AttackGroupIndexStr; std::string _GroupIndexStr; uint32 _GroupPropertiesIndex; /// the creature sheet can specify a multiplier that modulate the dynmaic groupe size uint32 _DynamicGroupCountMultiplier; std::string _BotName; TScriptCompList _ScriptCompList; TScriptCompList _UpdateScriptList; TScriptCompList _DeathScriptList; TScriptCompList _BirthScriptList; // Character Race EGSPD::CPeople::TPeople _Race; public: ///@name ICreature implementation //@{ virtual NLMISC::CSheetId const& SheetId() const { return _SheetId; } virtual uint32 Level() const { return _Level; } // colors from sheet virtual uint8 ColorHead() const { return _ColorHead; } virtual uint8 ColorArms() const { return _ColorArms; } virtual uint8 ColorHands() const { return _ColorHands; } virtual uint8 ColorBody() const { return _ColorBody; } virtual uint8 ColorLegs() const { return _ColorLegs; } virtual uint8 ColorFeets() const { return _ColorFeets; } virtual float Radius() const { return _Radius; } virtual float Height() const { return _Height; } virtual float Width() const { return _Width; } virtual float Length() const { return _Length; } virtual float BoundingRadius() const { return _BoundingRadius; } // the entity is a bot object and cannot be traversed. virtual bool NotTraversable() const { return _NotTraversable; } // the entity is a fauna, even is used as npc, it keep it's fauna name virtual bool ForceDisplayCreatureName() const { return _ForceDisplayCreatureName; } virtual float BonusAggroHungry() const { return _BonusAggroHungry; } virtual float BonusAggroVeryHungry() const { return _BonusAggroVeryHungry; } virtual float AssistDist() const { return _AssistDist; } virtual float AggroRadiusNotHungry() const { return _AggroRadiusNotHungry; } virtual float AggroRadiusHungry() const { return _AggroRadiusHungry; } virtual float AggroRadiusHunting() const { return _AggroRadiusHunting; } virtual float AggroReturnDistCheck() const { return _AggroReturnDistCheck; } virtual float AggroRadiusD1() const { return _AggroRadiusD1; } virtual float AggroRadiusD2() const { return _AggroRadiusD2; } virtual float AggroPrimaryGroupDist() const { return _AggroPrimaryGroupDist; } virtual float AggroPrimaryGroupCoef() const { return _AggroPrimaryGroupCoef; } virtual float AggroSecondaryGroupDist() const { return _AggroSecondaryGroupDist; } virtual float AggroSecondaryGroupCoef() const { return _AggroSecondaryGroupCoef; } virtual float AggroPropagationRadius() const { return _AggroPropagationRadius; } virtual AITYPES::TFaunaType FaunaType() const { return _FaunaType; } virtual float Scale() const { return _Scale; } virtual float DistToFront() const { return _DistToFront; } virtual float DistToBack() const { return _DistToBack; } virtual float DistToSide() const { return _DistToSide; } virtual float DistModulator() const { return _DistModulator; } virtual float TargetModulator() const { return _TargetModulator; } virtual float ScoreModulator() const { return _ScoreModulator; } virtual float FearModulator() const { return _FearModulator; } virtual float LifeLevelModulator() const { return _LifeLevelModulator; } virtual float CourageModulator() const { return _CourageModulator; } virtual float GroupCohesionModulator() const { return _GroupCohesionModulator; } virtual float GroupDispersion() const { return _GroupDispersion; } virtual uint32 XPLevel() const { return _XPLevel; } virtual uint32 NbPlayers() const { return _NbPlayers; } virtual uint32 EnergyValue() const { return _EnergyValue; } virtual bool CanTurn() const { return _CanTurn; } virtual NLMISC::CDbgPtr const& FightConfig(TFightCfg fightCfg) const { return _FightConfig[fightCfg]; } virtual NLMISC::CSheetId const& LeftItem() const { return _LeftItem; } virtual NLMISC::CSheetId const& RightItem() const { return _RightItem; } virtual uint32 MinFightDist() const { return _MinFightDist; } virtual uint32 FactionIndex() const { return _FactionIndex; } virtual sint32 FameForGuardAttack() const { return _FameForGuardAttack; } virtual std::string const& AssistGroupIndexStr() const { return _AssistGroupIndexStr; } virtual std::string const& AttackGroupIndexStr() const { return _AttackGroupIndexStr; } virtual std::string const& GroupIndexStr() const { return _GroupIndexStr; } virtual uint32 GroupPropertiesIndex() const { return _GroupPropertiesIndex; } /// the creature sheet can specify a multiplier that modulate the dynmaic groupe size virtual uint32 DynamicGroupCountMultiplier() const { return _DynamicGroupCountMultiplier; } virtual std::string const& BotName() const { return _BotName; } virtual TScriptCompList const& ScriptCompList() const { return _ScriptCompList; } virtual TScriptCompList const& UpdateScriptList() const { return _UpdateScriptList; } virtual TScriptCompList const& DeathScriptList() const { return _DeathScriptList; } virtual TScriptCompList const& BirthScriptList() const { return _BirthScriptList; } virtual EGSPD::CPeople::TPeople Race() const { return _Race; } virtual CGroupProperties const& getPropertiesCst(uint32 groupIndex) const; virtual std::vector getMultiLineInfoString() const; //@} public: void readGeorges(NLMISC::CSmartPtr const& form, NLMISC::CSheetId const& sheetId); void serial(NLMISC::IStream& s); uint32 minFightDist() const { return MinFightDist(); } void calcFightAndVisualValues(std::string* left = NULL, std::string* right = NULL); void parseFightConfig(NLGEORGES::UForm const* form, std::string const& fightConfigString, uint32 actionListIndex, NLMISC::CDbgPtr& fightConfig); void readFightConfig(NLMISC::IStream& s, NLMISC::CDbgPtr& fightConfig); void saveFightConfig(NLMISC::IStream& s, NLMISC::CDbgPtr& fightConfig); bool mustAssist(CCreature const& creature) const; void setAssisGroupIndexs(); void setAttackGroupIndexs(); void addActionConfig(std::string const& sheetIdName, NLMISC::CDbgPtr& actionConfigList); bool addActionConfig(NLMISC::CSheetId const& sheetId, NLMISC::CDbgPtr& actionConfigList); void removed() { } void registerScriptComp(CFightScriptComp* scriptComp); TGroupPropertiesLine _GroupPropertiesTbl; private: CGroupProperties& getProperties(uint32 groupIndex); public: static uint getVersion(); template static void getVarListFromParents(NLGEORGES::UForm const* form, std::set& varList, std::string const& varName); static void getGroupStr(std::vector& groupIndexStrList, std::string const& groupIndexStr); }; typedef NLMISC::CSmartPtr CCreaturePtr; typedef NLMISC::CSmartPtr CCreatureCPtr; ////////////////////////////////////////////////////////////////////////////// // CRaceStats // ////////////////////////////////////////////////////////////////////////////// class IRaceStats : public NLMISC::CRefCount { public: virtual ~IRaceStats() {} virtual NLMISC::CSheetId SheetId() const = 0; virtual std::string Race() const = 0; }; typedef NLMISC::CSmartPtr IRaceStatsPtr; typedef NLMISC::CSmartPtr IRaceStatsCPtr; class CRaceStats : public IRaceStats { public: virtual NLMISC::CSheetId SheetId() const { return _SheetId; } virtual std::string Race() const { return _Race; } public: void readGeorges(NLMISC::CSmartPtr const& form, NLMISC::CSheetId const& sheetId); void serial(NLMISC::IStream& s); void removed() { } private: NLMISC::CSheetId _SheetId; std::string _Race; public: static uint getVersion(); }; typedef NLMISC::CSmartPtr CRaceStatsPtr; typedef NLMISC::CSmartPtr CRaceStatsCPtr; ////////////////////////////////////////////////////////////////////////////// // CSheets // ////////////////////////////////////////////////////////////////////////////// class CSheets { private: static CSheets* _Instance; public: static CSheets* getInstance(); static void destroyInstance(); public: // load the creature data from the george files void init(); void packSheets(const std::string &writeFilesDirectoryName); // display the creature data for all known creature types void display(NLMISC::CSmartPtr stringWriter, uint infoSelect = 0); // void release(); // get a data record from the database ICreatureCPtr lookup (NLMISC::CSheetId const& id); CActionList const* lookupActionList(NLMISC::CSheetId const& id); IAIActionCPtr lookupAction (NLMISC::CSheetId const& id); IRaceStatsCPtr lookupRaceStats (NLMISC::CSheetId const& id); uint32 getGroupPropertiesIndex(const std::string &groupIndexName); uint32 playerGroupIndex() { return _PlayerGroupIndex; } private: friend class CCreature; private: // prohibit cnstructor as this is a singleton CSheets(); private: CDefaultGroupProperties _DefaultGroupProp; std::map _Sheets; std::map _ActionListSheets; std::map _ActionSheets; std::map _RaceStatsSheets; std::map _NameToGroupIndex; uint32 _PlayerGroupIndex; bool _Initialised; }; } /****************************************************************************/ /* Inline methods */ /****************************************************************************/ ////////////////////////////////////////////////////////////////////////////// // CCreature // ////////////////////////////////////////////////////////////////////////////// template void AISHEETS::CCreature::getVarListFromParents(NLGEORGES::UForm const* form, std::set& varList, std::string const& varName) { uint32 nbParents = form->getNumParent (); while (nbParents>0) { --nbParents; NLGEORGES::UForm const* parentForm = form->getParentForm(nbParents); if (parentForm) { getVarListFromParents(parentForm, varList, varName); } NLGEORGES::UFormElm const& item = form->getRootNode(); T temp; if (item.getValueByName(temp, varName.c_str())) { varList.insert (temp); } } } #endif