// 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_STATE_H #define RYAI_STATE_H #include "state_profil.h" #include "state_chat.h" #include "keyword_owner.h" #include "event_reaction.h" #include "profile_in_state.h" #include "ai_share/ai_vector.h" #include "ai_place_xyr.h" class CStateMachine; class CAIState : public NLMISC::CDbgRefCount, public CKeyWordOwner, public CAliasChild, public NLMISC::CRefCount, public CProfileInState { public: // ctor & dtor ------------------------------------------------------ CAIState(const CStateMachine *container,CAIAliasDescriptionNode *aliasTree) : CKeyWordOwner(), CAliasChild(const_cast(container),aliasTree) {} CAIState(CStateMachine const* container, uint32 alias, std::string const& name) : CKeyWordOwner() , CAliasChild(const_cast(container), alias, name) {} virtual ~CAIState() {} std::string getIndexString () const; virtual bool isPositional () const =0; // Profile property accessors -------------------------------------- const CAliasCont& profiles() const { return _Profiles; } const CAliasCont& chats() const { return _Chats; } IAliasCont* getAliasCont (AITYPES::TAIType type); CAliasTreeOwner* createChild (IAliasCont *cont, CAIAliasDescriptionNode *aliasTree); void updateDependencies (const CAIAliasDescriptionNode &aliasTree, CAliasTreeOwner *aliasTreeOwner); protected: CAliasCont _Profiles; CAliasCont _Chats; }; class CAIStatePunctual: public CAIState { public: virtual bool isPositional () const { return false; } CAIStatePunctual(const CStateMachine *container,CAIAliasDescriptionNode *aliasTree) : CAIState(container,aliasTree) {} private: }; class CShape :public CPlaceRandomPos { public: CShape(bool acceptInvalidPos=false) : _GeometryType(NONE) , _AcceptInvalidPos(acceptInvalidPos) {} virtual ~CShape() {} typedef RYAI_MAP_CRUNCH::CWorldPosition TPosition; // methods for managing geometry bool setPath(AITYPES::TVerticalPos verticalPos, const std::vector &points); bool setPatat(AITYPES::TVerticalPos verticalPos, const std::vector &points); // dumb little geometry type reporting accessors bool hasPath () const { return _GeometryType==PATH && hasPoints(); } bool hasPatat () const { return _GeometryType==PATAT && hasPoints(); } bool hasPoints () const { return _Geometry.size()!=0; } // accessors for path & patat geometry - whichever of the 2 exists uint32 numPoints() { return (uint32)_Geometry.size(); } const TPosition *point(uint32 idx) { return idx<_Geometry.size()? &_Geometry[idx]: NULL; } const std::vector &getGeometry() const { return _Geometry; } bool contains (const CAIVector &pos) const; bool calcRandomPos(CAIPos &pos) const; protected: private: enum { NONE, PATH, PATAT } _GeometryType; std::vector _Geometry; /// bouding box info CAIVector _VMin, _VMax; bool _AcceptInvalidPos; }; class CAIStatePositional :public NLMISC::CDbgRefCount ,public NLMISC::CDbgRefCount ,public CAIState { public: CAIStatePositional (const CStateMachine *container,CAIAliasDescriptionNode *aliasTree) : CAIState(container,aliasTree) { } CAIStatePositional(CStateMachine const* container, uint32 alias, std::string const& name) : CAIState(container, alias, name) { } virtual bool isPositional () const { return true; } const std::vector &getGeometry() const { return _Shape.getGeometry(); } bool contains (const CAIVector &pos) const { return _Shape.contains(pos); } CShape &shape() { return _Shape; } const CShape &shape() const { return _Shape; } private: CShape _Shape; }; #endif