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