/* base/faction.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_FACTION_H__ #define __INCLUDED_BASE_FACTION_H__ #include #include "math/color.h" #include "core/entity.h" #include "core/info.h" #include "core/reputation.h" namespace game { class Faction : public core::Info { public: Faction(); virtual ~Faction(); /* --- inspectors ------------------------------------------------- */ inline const math::Color & color() const { return faction_color; } inline const math::Color & color_second() const { return faction_color_second; } /** * @brief faction reputation * */ inline const core::Reputation & reputation() const { return faction_reputation; } /** * @brief faction reputation * */ inline core::Reputation & reputation() { return faction_reputation; } /** * @brief player reputation with a specific faction * */ inline const float reputation(const core::Info *faction) const { if (faction == this) { return 100.0f; } else { return faction_reputation.reputation(faction); } } /* --- actors ----------------------------------------------------- */ /** * @brief apply faction colors to an entity */ void apply(core::Entity *entity) const; /* --- mutators --------------------------------------------------- */ inline void set_color(const math::Color &color) { faction_color.assign(color); } inline void set_color_second(const math::Color &color_second) { faction_color_second.assign(color_second); } /** * @brief adjust player reputation for a kill of a member of this faction */ void apply_kill(core::Player *player) const; /** * @brief adjust player reputation for buying from/selling to this faction */ void apply_sale(core::Player *player, const float amount) const; virtual void print() const; /* --- static ----------------------------------------------------- */ /** * @brief initialize Faction infotype and read factions.init */ static bool init(); /** * @brief cleanup routines */ static void done(); /** * @brief list available factions */ static void list(); /** * @brief returns a pointer to the faction with the given label, returns 0 if not found. * */ static Faction *find(const std::string & label); /** * @brief apply default reputation * */ static void apply_default(core::Reputation & reputation); /** * @brief faction info type * */ static inline const core::InfoType *infotype() { return faction_infotype; } /** * @brief default faction * This faction represents the default player reputation. * No ships should be a member of this faction, not even player ships. * */ static inline const Faction *default_faction() { return faction_default; } private: /* --- attributes ------------------------------------------------- */ math::Color faction_color; math::Color faction_color_second; core::Reputation faction_reputation; /* --- static ----------------------------------------------------- */ static core::InfoType *faction_infotype; static Faction *faction_default; }; } // namespace game #endif // __INCLUDED_BASE_FACTION_H__