khanat-opennel-code/code/ryzom/server/src/ai_share/ai_event.h

357 lines
9.7 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// 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 <http://www.gnu.org/licenses/>.
#ifndef RY_AI_EVENT_H
#define RY_AI_EVENT_H
#include <string>
#include "nel/misc/stream.h"
#include "nel/misc/entity_id.h"
//------------------------------MESSAGES DESCRIPTION---------------------------------
// STUN
// CEntityId CreatureId
// STUN_END
// CEntityId CreatureId
// AGGRO
// CEntityId CreatureId
// CEntityId EntityId
// sint32 Modifier
// SURVIE
// CEntityId CreatureId
// CEntityId EntityId
// sint32 Modifier
// FEAR
// CEntityId CreatureId
// CEntityId EntityId
// FEAR_END
// CEntityId CreatureId
// CEntityId EntityId
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
// class CAIEventType
//-----------------------------------------------------------------------------------
// this class encapsulates the class id for classes derived from IAIEvent
// for now class names are limitted to 8 characters - if need be this can be
// extended at a later date but will require services to synchronise event id
// tables at startup
class CAIEventType
{
public:
CAIEventType()
{ _val = (uint64)0;}
CAIEventType(const CAIEventType &other)
{
*this=other;
}
CAIEventType(const char *typeName)
{
// copy text from input string to _val variable
uint i;
for (i=0;i<8 && typeName[i];++i)
((char *)&_val)[i]=typeName[i];
// if type name is longer than 8 characters it won't fit in an int64!
nlassert(typeName[i]==0);
// pad out _val variable with 0s
while(i<8)
((char *)&_val)[i++]=0;
}
CAIEventType(const std::string &typeName)
{
*this=CAIEventType(typeName.c_str());
}
const CAIEventType &operator=(const CAIEventType &other)
{
_val=other._val;
}
bool operator==(const CAIEventType &other) const
{
return _val==other._val;
}
bool operator!=(const CAIEventType &other) const
{
return _val!=other._val;
}
bool operator<=(const CAIEventType &other) const
{
return _val<=other._val;
}
bool operator>=(const CAIEventType &other) const
{
return _val>=other._val;
}
bool operator<(const CAIEventType &other) const
{
return _val<other._val;
}
bool operator>(const CAIEventType &other) const
{
return _val>other._val;
}
void serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{
f.serial(_val);
}
std::string toString() const
{
return NLMISC::toString("%8.8s",&_val);
}
private:
uint64 _val;
};
//-----------------------------------------------------------------------------------
// base class IAIEvent
//-----------------------------------------------------------------------------------
// This is the base class for classes of event sent from the game dev services to
// the AI. Note that the serial has a special syntax to allow for skipping of
// unrecognised events.
class IAIEvent
{
NL_INSTANCE_COUNTER_DECL(IAIEvent);
public:
virtual ~IAIEvent() {}
// this is the name of the class
// for now it is limited to 8 letters - wil be extended at a later date if need be
virtual const CAIEventType &type() const = 0;
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream) = 0;
};
/**
* CAIStunEvent : event STUN
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIStunEvent: public IAIEvent
{
NL_INSTANCE_COUNTER_DECL(CAIStunEvent);
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("STUN"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the stunned creature id
NLMISC::CEntityId CreatureId;
};
/**
* CAIStunEndEvent : event STUN_END
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIStunEndEvent: public IAIEvent
{
NL_INSTANCE_COUNTER_DECL(CAIStunEndEvent);
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("STUN_END"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the waked creature id
NLMISC::CEntityId CreatureId;
};
/**
* CAIAggroEvent : event AGGRO
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIAggroEvent: public IAIEvent
{
public:
CAIAggroEvent() : AggroModifier(0)
{}
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("AGGRO"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the creature Id
NLMISC::CEntityId CreatureId;
/// the entity Id affected by the aggro
NLMISC::CEntityId EntityId;
/// aggro modifier
sint32 AggroModifier;
};
/**
* CAISurvivalInstinctEvent : event SURVIE
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAISurvivalInstinctEvent: public IAIEvent
{
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("SURVIE"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the affected creature id
NLMISC::CEntityId CreatureId;
/// the entity for which the creature survival instinct is modified
NLMISC::CEntityId EntityId;
/// the modifier
sint32 Modifier;
};
/**
* CAIFearEvent : event FEAR
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIFearEvent: public IAIEvent
{
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("FEAR"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the creature id
NLMISC::CEntityId CreatureId;
/// the entity feared by the creature
NLMISC::CEntityId EntityId;
};
/**
* CAIFearEndEvent : event FEAR_END
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIFearEndEvent: public IAIEvent
{
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("FEAR_END"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the creature id
NLMISC::CEntityId CreatureId;
/// the entity no longer feared by the creature
NLMISC::CEntityId EntityId;
};
/**
* CAIHungerEvent : event HUNGER
* \author Fleury David
* \author Nevrax France
* \date 2003
*/
class CAIHungerEvent: public IAIEvent
{
public:
// this is the name of the class
// for now it is limited to 8 letters - will be extended at a later date if need be
virtual const CAIEventType &type() const { static CAIEventType type("HUNGER"); return type; }
// serial()
// note serial should serialise: <Type> <uint16 sizeof(EventClass)> <event_parameters>
// the 'read' version of the serial should test the <sizeof> to ensure version robustness
virtual void serial(NLMISC::IStream &f) throw(NLMISC::EStream);
public:
/// the affected creature id
NLMISC::CEntityId CreatureId;
/// the modifier
sint32 Modifier;
};
#endif