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