00001 #ifndef SKILL_HH_ 00002 # define SKILL_HH_ 00003 00004 # include <map> 00005 # include <string> 00006 00007 # include "objects_fwd.hh" 00008 00009 # define UNKNOWN_SKILL (-1) 00010 00011 namespace objects 00012 { 00013 class SkillFactory 00014 { 00015 public: 00016 typedef std::map<int, Skill *> SkillMap; 00017 typedef std::map<int, const Skill *> ConstSkillMap; 00018 00019 public: 00020 SkillFactory(); 00021 ~SkillFactory(); 00022 00023 static SkillFactory &get_instance(); 00024 const Skill &get(int id); 00025 void get_class_skills(ConstSkillMap &sm, int class_id) const; 00026 00027 protected: 00028 SkillMap _skill_map; 00029 00030 void register_skill(Skill &s); 00031 }; 00032 00033 class Skill 00034 { 00035 public: 00036 Skill(); 00037 00038 static const Skill &get(int id); 00039 virtual void accept(SkillVisitor &iv) = 0; 00040 00041 virtual bool is_support() const; 00042 virtual bool is_attack() const; 00043 virtual int get_class() const; 00044 00045 virtual int get_id() const = 0; 00046 virtual const std::string &get_name() = 0; 00047 }; 00048 00049 class SupportSkill : public Skill 00050 { 00051 public: 00052 SupportSkill(); 00053 virtual ~SupportSkill(); 00054 00055 bool is_support() const; 00056 virtual int get_status_flag() const = 0; 00057 00058 virtual int get_id() const = 0; 00059 virtual const std::string &get_name() = 0; 00060 }; 00061 00062 class AttackSkill : public Skill 00063 { 00064 public: 00065 AttackSkill(); 00066 virtual ~AttackSkill(); 00067 00068 virtual bool is_attack() const; 00069 virtual bool is_targetable() const = 0; 00070 virtual bool is_multiple() const = 0; 00071 00072 virtual int get_id() const = 0; 00073 virtual const std::string &get_name() = 0; 00074 }; 00075 00076 template<int SKILL_ID, int CLASS_ID> 00077 class SkillID : public Skill 00078 { 00079 public: 00080 SkillID(); 00081 00082 static const int id = SKILL_ID; 00083 int get_id() const; 00084 void accept(SkillVisitor &sv); 00085 const std::string &get_name(); 00086 00087 int get_class() const; 00088 }; 00089 00090 template<int SKILL_ID, int CLASS_ID, int STATUS_FLAG> 00091 class SupportSkillID : public SupportSkill 00092 { 00093 public: 00094 SupportSkillID(); 00095 00096 static const int id = SKILL_ID; 00097 int get_id() const; 00098 void accept(SkillVisitor &sv); 00099 const std::string &get_name(); 00100 00101 int get_class() const; 00102 int get_status_flag() const; 00103 }; 00104 00105 template<int SKILL_ID, int CLASS_ID, bool TARGETABLE, bool MULTIPLE> 00106 class AttackSkillID : public AttackSkill 00107 { 00108 public: 00109 AttackSkillID(); 00110 00111 static const int id = SKILL_ID; 00112 int get_id() const; 00113 void accept(SkillVisitor &sv); 00114 const std::string &get_name(); 00115 00116 int get_class() const; 00117 bool is_targetable() const; 00118 bool is_multiple() const; 00119 }; 00120 } 00121 00122 # include "skill.hxx" 00123 00124 #endif