]> jfr.im git - irc/gameservirc.git/blob - gameserv-2.0/libgameservgldl/src/GameLayer/GameObjects/ItemGO.cpp
Changed Range to be a template class so it can be used with unsigned & signed ints...
[irc/gameservirc.git] / gameserv-2.0 / libgameservgldl / src / GameLayer / GameObjects / ItemGO.cpp
1 #include <GameServ/GameLayer/GameObjects/ItemGO.h>
2 using GameServ::GameLayer::GameObjects::ItemGO;
3 #include <GameServ/GameLayer/GameObjects/PlayerGO.h>
4 using GameServ::GameLayer::GameObjects::PlayerGO;
5
6 #include <GameServ/Types.h>
7 using GameServ::Types::ItemTypes;
8 using GameServ::Types::Modifiers;
9 using GameServ::Types::Range;
10 using GameServ::Types::ObjectTypes;
11
12 #include <GameServ/GameServException.h>
13 using GameServ::Exceptions::GameServException;
14
15 #include <string>
16 using std::string;
17 #include <map>
18 using std::map;
19
20 #include <boost/smart_ptr/shared_ptr.hpp>
21 using boost::shared_ptr;
22 using boost::shared_static_cast;
23
24 #include <boost/algorithm/string.hpp>
25 #include <boost/format.hpp>
26 using boost::str;
27 using boost::format;
28
29 ItemGO::ItemGO() : GameObject(), mName(""), mPrice(0), mUses(1)
30 {
31 }
32
33 ItemGO::~ItemGO()
34 {
35 }
36
37 string ItemGO::Name(void) const
38 {
39 return mName;
40 }
41
42 void ItemGO::Name(const string &value)
43 {
44 mName = value;
45 }
46
47 unsigned long int ItemGO::Price(void) const
48 {
49 return mPrice;
50 }
51
52 void ItemGO::Price(const unsigned long int &price)
53 {
54 mPrice = price;
55 }
56
57 int ItemGO::Uses(void) const
58 {
59 return mUses;
60 }
61
62 void ItemGO::Uses(const int &value)
63 {
64 mUses = value;
65 }
66
67 void ItemGO::Use(shared_ptr<GameObject> spObject)
68 {
69 map<Modifiers::Modifier, Range<int> >::const_iterator iter;
70 for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++)
71 {
72 ApplyModifier(spObject, iter->first, iter->second);
73 }
74 }
75
76 void ItemGO::Undo(shared_ptr<GameObject> spObject)
77 {
78 map<Modifiers::Modifier, Range<int> >::const_iterator iter;
79 for (iter = mModifiers.begin(); iter != mModifiers.end(); iter++)
80 {
81 UndoModifier(spObject, iter->first, iter->second);
82 }
83 }
84
85 void ItemGO::ApplyModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r)
86 {
87 if (spObject->ObjectType() != ObjectTypes::Player)
88 {
89 throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") %
90 Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__);
91 }
92
93 shared_ptr<PlayerGO> spPlayer = shared_static_cast<PlayerGO>(spObject);
94
95 switch (modifier)
96 {
97 case Modifiers::strength:
98 spPlayer->Strength(spPlayer->Strength() + r.Random());
99 break;
100 case Modifiers::defense:
101 spPlayer->Defense(spPlayer->Defense() + r.Random());
102 break;
103 case Modifiers::health:
104 spPlayer->Health(spPlayer->Health() + r.Random());
105 break;
106 case Modifiers::maxhealth:
107 spPlayer->MaxHealth(spPlayer->MaxHealth() + r.Random());
108 break;
109 case Modifiers::gold:
110 spPlayer->Gold(spPlayer->Gold() + r.Random());
111 break;
112 case Modifiers::bank:
113 spPlayer->Bank(spPlayer->Bank() + r.Random());
114 break;
115 case Modifiers::forestfights:
116 spPlayer->ForestFights(spPlayer->ForestFights() + r.Random());
117 break;
118 case Modifiers::playerfights:
119 spPlayer->PlayerFights(spPlayer->PlayerFights() + r.Random());
120 break;
121 default:
122 throw GameServException(str(format("Invalid modifier %1%") % modifier), __FILE__, __LINE__);
123 }
124 }
125
126 void ItemGO::UndoModifier(shared_ptr<GameObject> spObject, const Modifiers::Modifier &modifier, Range<int> r)
127 {
128 if (spObject->ObjectType() != ObjectTypes::Player)
129 {
130 throw GameServException(str(format("Item %1%:%2% used on an unsupported object type: %3%") %
131 Id() % Name() % ObjectTypes::GetName(spObject->ObjectType())), __FILE__, __LINE__);
132 }
133
134 shared_ptr<PlayerGO> spPlayer = shared_static_cast<PlayerGO>(spObject);
135
136 switch (modifier)
137 {
138 case Modifiers::strength:
139 spPlayer->Strength(spPlayer->Strength() - r.LastRandom());
140 break;
141 case Modifiers::defense:
142 spPlayer->Defense(spPlayer->Defense() - r.LastRandom());
143 break;
144 case Modifiers::health:
145 spPlayer->Health(spPlayer->Health() - r.LastRandom());
146 break;
147 case Modifiers::maxhealth:
148 spPlayer->MaxHealth(spPlayer->MaxHealth() - r.LastRandom());
149 break;
150 case Modifiers::gold:
151 spPlayer->Gold(spPlayer->Gold() - r.LastRandom());
152 break;
153 case Modifiers::bank:
154 spPlayer->Bank(spPlayer->Bank() - r.LastRandom());
155 break;
156 case Modifiers::forestfights:
157 spPlayer->ForestFights(spPlayer->ForestFights() - r.LastRandom());
158 break;
159 case Modifiers::playerfights:
160 spPlayer->PlayerFights(spPlayer->PlayerFights() - r.LastRandom());
161 break;
162 default:
163 throw GameServException(str(format("Invalid modifier %1%") % modifier), __FILE__, __LINE__);
164 }
165 }
166
167 map<Modifiers::Modifier, Range<int> > ItemGO::Modifiers(void) const
168 {
169 return mModifiers;
170 }
171
172 void ItemGO::Modifiers(const map<Modifiers::Modifier, Range<int> > &modifiers)
173 {
174 mModifiers.clear();
175 mModifiers.insert(modifiers.begin(), modifiers.end());
176 }
177
178 ObjectTypes::ObjectType ItemGO::ObjectType(void) const
179 {
180 return ObjectTypes::Item;
181 }
182
183
184
185