/* base/patrol.h This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #ifndef __INCLUDED_BASE_PATROL_H__ #define __INCLUDED_BASE_PATROL_H__ #include "core/entity.h" #include "base/faction.h" #include "base/cargo.h" #include "base/npc.h" #include "base/npctype.h" namespace game { /** * @brief a patrol entity manages a group of NPCs. * A Patrol instance is a server-side entity used to manage * a group of NPC ships. It manages group purpose, group commands * and respawning by giving orders to the member NPCs. * A Patrol can manage any kind of NPC group: * be it a patrol, a trade convoy or a player wing. * */ class Patrol: public core::Entity { public: /* --- WayPoint -------------------------------------------- */ /** * @brief a node in the patrol's travel path * */ class WayPoint { public: WayPoint(); ~WayPoint(); inline core::Entity *target() { return waypoint_target; } inline const std::string & target_label() const { return waypoint_target_label; } inline const bool dock() const { return waypoint_dock; } inline const Cargo *cargo() const { return waypoint_cargo; } void set_target(core::Entity *entity); void set_target_label(const std::string &label); void set_cargo(Cargo *cargo); void set_dock(const bool dock); private: std::string waypoint_target_label; core::Entity *waypoint_target; Cargo *waypoint_cargo; bool waypoint_dock; }; /* --- Patrol ---------------------------------------------- */ typedef std::list WayPoints; typedef std::list NPCTypes; typedef std::list Members; Patrol(); virtual ~Patrol(); inline const NPC::Profile profile() const { return patrol_profile; } inline WayPoint * waypoint() const { if (patrol_waypoint_current == patrol_waypoints.end()) { return 0; } else { return (*patrol_waypoint_current); } } inline NPC *leader() const { return patrol_leader; } inline Faction *faction() const { return patrol_faction; } void set_profile(const NPC::Profile profile); void set_faction(Faction *faction); WayPoint *add_waypoint(); NPCType *add_npctype(); virtual void validate(); virtual void frame(const unsigned long elapsed); void add_member(NPC *npc); void erase_member(NPC *npc); private: void set_leader(); bool route_alive() const; WayPoints patrol_waypoints; WayPoints::iterator patrol_waypoint_current; Members patrol_members; NPCTypes patrol_npctypes; NPC::Profile patrol_profile; NPC *patrol_leader; unsigned long patrol_launch_timeout; Faction *patrol_faction; }; } // namespace game #endif // __INCLUDED_BASE_PATROL_H__