00001 #ifndef ITEM_HH_ 00002 # define ITEM_HH_ 00003 00004 # include <string> 00005 # include <map> 00006 # include <iostream> 00007 00008 # include "objects_fwd.hh" 00009 00010 # define UNKNOWN_ITEM (-1) 00011 00012 namespace objects 00013 { 00014 class ItemFactory 00015 { 00016 public: 00017 ItemFactory(); 00018 ~ItemFactory(); 00019 00020 static ItemFactory &get_instance(); 00021 const Item &get(int id); 00022 00023 protected: 00024 std::map<int, Item *> _item_map; 00025 00026 void register_item(Item &i); 00027 }; 00028 00029 class Item 00030 { 00031 public: 00032 Item(); 00033 00034 static const Item &get(int id); 00035 virtual void accept(ItemVisitor &iv) = 0; 00036 virtual void print(std::ostream &os) = 0; 00037 00038 virtual int get_id() const = 0; 00039 virtual const std::string &get_name() = 0; 00040 00041 virtual bool heals_hp() const; 00042 virtual bool heals_mp() const; 00043 00044 bool operator ==(const Item &i) const; 00045 }; 00046 00047 template<int ITEM_ID> 00048 class ItemID : public Item 00049 { 00050 public: 00051 ItemID(); 00052 00053 static const int id = ITEM_ID; 00054 void accept(ItemVisitor &iv); 00055 void print(std::ostream &os); 00056 static const ItemID<ITEM_ID> &get_instance(); 00057 00058 int get_id() const; 00059 const std::string &get_name(); 00060 }; 00061 00062 class HealingItem : public Item 00063 { 00064 protected: 00065 HealingItem(); 00066 00067 public: 00068 virtual bool heals_hp() const; 00069 virtual bool heals_mp() const; 00070 virtual int get_hp_healing() const; 00071 virtual int get_mp_healing() const; 00072 00073 virtual int get_price() const; 00074 00075 double get_hp_healing_cost() const; 00076 double get_mp_healing_cost() const; 00077 }; 00078 00079 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00080 class HealingItemID : public HealingItem 00081 { 00082 public: 00083 HealingItemID(); 00084 00085 static const int id = ITEM_ID; 00086 void accept(ItemVisitor &iv); 00087 void print(std::ostream &os); 00088 00089 int get_id() const; 00090 const std::string &get_name(); 00091 static const HealingItemID<ITEM_ID, HP_HEALING, 00092 MP_HEALING, PRICE> &get_instance(); 00093 00094 int get_hp_healing() const; 00095 int get_mp_healing() const; 00096 int get_price() const; 00097 }; 00098 00099 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00100 class PercentageHealingItemID : public HealingItem 00101 { 00102 public: 00103 PercentageHealingItemID(); 00104 00105 static const int id = ITEM_ID; 00106 void accept(ItemVisitor &iv); 00107 void print(std::ostream &os); 00108 static const PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, 00109 MP_PERCENTAGE_HEALING, PRICE> &get_instance(); 00110 00111 int get_id() const; 00112 const std::string &get_name(); 00113 00114 int get_hp_healing() const; 00115 int get_mp_healing() const; 00116 int get_price() const; 00117 }; 00118 00119 std::ostream &operator <<(std::ostream &os, const Item &i); 00120 } 00121 00122 # include "item.hxx" 00123 00124 #endif