00001 #ifndef ITEM_HXX_ 00002 # define ITEM_HXX_ 00003 00004 # include <cassert> 00005 00006 # include "item.hh" 00007 # include "item_name.hh" 00008 # include "cronous-env.hh" 00009 00010 namespace objects 00011 { 00012 inline bool 00013 Item::heals_hp() const 00014 { 00015 return false; 00016 } 00017 00018 inline bool 00019 Item::heals_mp() const 00020 { 00021 return false; 00022 } 00023 00024 inline bool 00025 Item::operator ==(const Item &i) const 00026 { 00027 return this == &Item::get(i.get_id()); 00028 } 00029 00030 template<int ITEM_ID> 00031 ItemID<ITEM_ID>::ItemID() 00032 : Item() 00033 { 00034 } 00035 00036 template<int ITEM_ID> 00037 const std::string & 00038 ItemID<ITEM_ID>::get_name() 00039 { 00040 ItemName in; 00041 in(*this); 00042 return in.result(); 00043 } 00044 00045 template<int ITEM_ID> 00046 int 00047 ItemID<ITEM_ID>::get_id() const 00048 { 00049 return ItemID<ITEM_ID>::id; 00050 } 00051 00052 template<int ITEM_ID> 00053 void 00054 ItemID<ITEM_ID>::accept(ItemVisitor &iv) 00055 { 00056 iv(*this); 00057 } 00058 00059 template<int ITEM_ID> 00060 void 00061 ItemID<ITEM_ID>::print(std::ostream &os) 00062 { 00063 os << get_name(); 00064 } 00065 00066 template<int ITEM_ID> 00067 const ItemID<ITEM_ID> & 00068 ItemID<ITEM_ID>::get_instance() 00069 { 00070 assert(dynamic_cast<const ItemID<ITEM_ID> *>(&Item::get(id)) != NULL); 00071 return dynamic_cast<const ItemID<ITEM_ID> &>(Item::get(id)); 00072 } 00073 00074 inline std::ostream & 00075 operator <<(std::ostream &os, const Item &i) 00076 { 00077 (const_cast<Item &>(i)).print(os); 00078 return os; 00079 } 00080 00081 inline int HealingItem::get_hp_healing() const 00082 { 00083 return 0; 00084 } 00085 00086 inline int HealingItem::get_mp_healing() const 00087 { 00088 return 0; 00089 } 00090 00091 inline bool HealingItem::heals_hp() const 00092 { 00093 return get_hp_healing() > 0; 00094 } 00095 00096 inline bool HealingItem::heals_mp() const 00097 { 00098 return get_mp_healing() > 0; 00099 } 00100 00101 inline int HealingItem::get_price() const 00102 { 00103 return INT_MAX; 00104 } 00105 00106 inline double HealingItem::get_hp_healing_cost() const 00107 { 00108 return ((double)get_price() / (double)get_hp_healing()); 00109 } 00110 00111 inline double HealingItem::get_mp_healing_cost() const 00112 { 00113 return ((double)get_price() / (double)get_mp_healing()); 00114 } 00115 00116 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00117 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::HealingItemID() : 00118 HealingItem() 00119 { 00120 } 00121 00122 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00123 const std::string & 00124 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::get_name() 00125 { 00126 ItemName in; 00127 in(*this); 00128 return in.result(); 00129 } 00130 00131 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00132 inline int 00133 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::get_id() const 00134 { 00135 return HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::id; 00136 } 00137 00138 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00139 void 00140 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::accept(ItemVisitor &iv) 00141 { 00142 iv(*this); 00143 } 00144 00145 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00146 void 00147 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::print(std::ostream &os) 00148 { 00149 os << get_name(); 00150 } 00151 00152 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00153 const HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE> & 00154 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::get_instance() 00155 { 00156 assert((dynamic_cast<const HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE> *>(&Item::get(id))) != NULL); 00157 return dynamic_cast<const HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE> &>(Item::get(id)); 00158 } 00159 00160 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00161 inline int 00162 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::get_hp_healing() const 00163 { 00164 return HP_HEALING; 00165 } 00166 00167 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00168 inline int 00169 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>::get_mp_healing() const 00170 { 00171 return MP_HEALING; 00172 } 00173 00174 template<int ITEM_ID, int HP_HEALING, int MP_HEALING, int PRICE> 00175 inline int 00176 HealingItemID<ITEM_ID, HP_HEALING, MP_HEALING, PRICE>:: 00177 get_price() const 00178 { 00179 return PRICE; 00180 } 00181 00182 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00183 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00184 PercentageHealingItemID() : HealingItem() 00185 { 00186 } 00187 00188 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00189 void 00190 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00191 accept(ItemVisitor &iv) 00192 { 00193 iv(*this); 00194 } 00195 00196 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00197 void 00198 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00199 print(std::ostream &os) 00200 { 00201 os << get_name(); 00202 } 00203 00204 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00205 const PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, 00206 MP_PERCENTAGE_HEALING, PRICE> & 00207 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00208 get_instance() 00209 { 00210 assert((dynamic_cast<const PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, 00211 MP_PERCENTAGE_HEALING, PRICE> *>(&Item::get(id))) != NULL); 00212 return dynamic_cast<const PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, 00213 MP_PERCENTAGE_HEALING, PRICE> &>(Item::get(id)); 00214 } 00215 00216 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00217 inline int 00218 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00219 get_id() const 00220 { 00221 return 00222 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00223 id; 00224 } 00225 00226 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00227 inline const std::string & 00228 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00229 get_name() 00230 { 00231 ItemName in; 00232 in(*this); 00233 return in.result(); 00234 } 00235 00236 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00237 inline int 00238 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00239 get_hp_healing() const 00240 { 00241 return environment::CronousEnv::get_instance().get_hp_max() 00242 * HP_PERCENTAGE_HEALING / 100; 00243 } 00244 00245 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00246 inline int 00247 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00248 get_mp_healing() const 00249 { 00250 return environment::CronousEnv::get_instance().get_mp_max() 00251 * MP_PERCENTAGE_HEALING / 100; 00252 } 00253 00254 template<int ITEM_ID, int HP_PERCENTAGE_HEALING, int MP_PERCENTAGE_HEALING, int PRICE> 00255 inline int 00256 PercentageHealingItemID<ITEM_ID, HP_PERCENTAGE_HEALING, MP_PERCENTAGE_HEALING, PRICE>:: 00257 get_price() const 00258 { 00259 return PRICE; 00260 } 00261 } 00262 00263 #endif