// 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_EVENT_REACTION_CONTAINER_H
#define RYAI_EVENT_REACTION_CONTAINER_H
#include "event_manager.h"
class CPersistentStateInstance;
class CStateMachine
#ifdef NL_DEBUG
: public NLMISC::IDbgPtrData
#endif
{
public:
CStateMachine() { }
virtual ~CStateMachine()
{
clearEventContainerContent ();
}
virtual std::vector getMultiLineInfoString() const;
CAIEvent EventPositionalStateTimeout;
CAIEvent EventPunctualStateTimeout;
CAIEvent EventStartOfState;
CAIEvent EventEndOfState;
CAIEvent EventUserTimer[4];
CAIEvent EventUserEvent[10];
CAIEvent EventEscortAway;
CAIEvent EventEscortBack;
CAIEvent EventVariableChanged;
CAIEvent EventVariableChangedTab[4];
CAIEvent EventPlayerTargetNpc;
CAIEvent EventPlayerFollowNpc;
CAIEvent EventBotBeginFight;
CAIEvent EventBotTargetKilled;
CAIEvent EventGroupBeginFight;
CAIEvent EventGroupEndFight;
CAIEvent EventLastBotDespawned;
CAIEvent EventFirstBotSpawned;
CAIEvent EventEGSUp;
CAIEvent EventPlayerEnterTriggerZone;
CAIEvent EventPlayerLeaveTriggerZone;
virtual void registerEvents()
{
addEvent("punctual_state_timeout", EventPunctualStateTimeout );
addEvent("start_of_state", EventStartOfState );
addEvent("end_of_state", EventEndOfState );
addEvent("state_timeout", EventPositionalStateTimeout );
addEvent("timer_t0_triggered", EventUserTimer[0] );
addEvent("timer_t1_triggered", EventUserTimer[1] );
addEvent("timer_t2_triggered", EventUserTimer[2] );
addEvent("timer_t3_triggered", EventUserTimer[3] );
addEvent("user_event_0", EventUserEvent[0] );
addEvent("user_event_1", EventUserEvent[1] );
addEvent("user_event_2", EventUserEvent[2] );
addEvent("user_event_3", EventUserEvent[3] );
addEvent("user_event_4", EventUserEvent[4] );
addEvent("user_event_5", EventUserEvent[5] );
addEvent("user_event_6", EventUserEvent[6] );
addEvent("user_event_7", EventUserEvent[7] );
addEvent("user_event_8", EventUserEvent[8] );
addEvent("user_event_9", EventUserEvent[9] );
addEvent("escort_away", EventEscortAway );
addEvent("escort_back", EventEscortBack );
addEvent("variable_changed", EventVariableChanged );
addEvent("variable_v0_changed", EventVariableChangedTab[0] );
addEvent("variable_v1_changed", EventVariableChangedTab[1] );
addEvent("variable_v2_changed", EventVariableChangedTab[2] );
addEvent("variable_v3_changed", EventVariableChangedTab[3] );
addEvent("player_target_npc", EventPlayerTargetNpc );
addEvent("player_follow_npc", EventPlayerFollowNpc );
addEvent("bot_begin_fight", EventBotBeginFight );
addEvent("bot_target_killed", EventBotTargetKilled );
addEvent("group_under_attack", EventGroupBeginFight );
addEvent("group_attack_end", EventGroupEndFight );
addEvent("group_despawned", EventLastBotDespawned );
addEvent("group_spawned", EventFirstBotSpawned );
addEvent("egs_up", EventEGSUp );
addEvent("player_arrived_trigger_zone", EventPlayerEnterTriggerZone);
addEvent("player_left_trigger_zone", EventPlayerLeaveTriggerZone);
}
void addEvent(std::string const& name, CAIEvent& event)
{
_eventNameMap[name] = &event;
#ifdef NL_DEBUG
_eventNameMap[name].setData(this);
#endif
event.setName(name);
}
void delEvent(std::string const& name)
{
_eventNameMap.erase(name);
}
void clearEventContainerContent()
{
std::map >::iterator it=_eventNameMap.begin(), itEnd=_eventNameMap.end();
while (it!=itEnd)
{
it->second->removeAllReaction();
++it;
}
_eventReactions.clear();
_eventNameMap.clear();
}
std::map > const& GetEventManagerMap() const
{
return _eventNameMap;
}
//--------------------------------------------------------------------------
// CAIMgr METHOD Encapsulating user event trigger system
//--------------------------------------------------------------------------
CAIEvent* getEventManager(std::string const& name)
{
std::map >::const_iterator it = GetEventManagerMap().find(name);
if (it!=GetEventManagerMap().end())
return it->second;
return NULL;
}
std::string const& getEventManagerName(CAIEvent const* evtMgr)
{
static std::string const unknown("UNKNOWN MANAGER");
typedef std::map > TTmpCont;
FOREACH(it, TTmpCont, _eventNameMap)
{
if (it->second!=evtMgr)
continue;
return it->first;
}
return unknown;
}
virtual std::string getIndexString()
{
return std::string("0");
}
inline CAliasCont& eventReactions() { return _eventReactions; }
CAliasCont& states() { return _states; }
CAliasCont const& cstStates() const { return _states; }
protected:
CAliasCont _states;
CAliasCont _eventReactions;
std::map > _eventNameMap;
};
#endif