]> jfr.im git - irc/gameservirc.git/blob - gameserv/item.cpp
Added the asio framework to start developing a GameServ server
[irc/gameservirc.git] / gameserv / item.cpp
1 #include "item.h"
2 #include "player.h"
3 #include "extern.h"
4
5 item::item()
6 {
7 myname = "New Item";
8 myprice = 0;
9 myuses = 0;
10 for (int x = 0; x < 8; x++)
11 mymodifiers[x] = 0;
12 }
13
14 item::item(const char *name, long int p, int uses, long int identifier, int m1, int m2, int m3, int m4, int m5, int m6, int m7, int m8)
15 {
16 myname = name; // string = char*
17 myprice = p;
18 myuses = uses;
19 mymodifiers[0] = m1;
20 mymodifiers[1] = m2;
21 mymodifiers[2] = m3;
22 mymodifiers[3] = m4;
23 mymodifiers[4] = m5;
24 mymodifiers[5] = m6;
25 mymodifiers[6] = m7;
26 mymodifiers[7] = m8;
27 id = identifier;
28 }
29
30 item::item(string name, long int p, int uses, long int identifier, int m1, int m2, int m3, int m4, int m5, int m6, int m7, int m8)
31 {
32 myname = name; // string = char*
33 myprice = p;
34 myuses = uses;
35 mymodifiers[0] = m1;
36 mymodifiers[1] = m2;
37 mymodifiers[2] = m3;
38 mymodifiers[3] = m4;
39 mymodifiers[4] = m5;
40 mymodifiers[5] = m6;
41 mymodifiers[6] = m7;
42 mymodifiers[7] = m8;
43 id = identifier;
44 }
45
46 item::~item()
47 {
48 for (int x = 0; x < 8; x++)
49 {
50 mymodifiers[x] = 0;
51 }
52
53 myuses = 0;
54 myname = "";
55 myprice = 0;
56 }
57
58 void item::setType(type t)
59 {
60 mytype = t;
61 }
62
63 bool item::operator<(const item &right) const
64 {
65 return id < right.id;
66 }
67
68 bool item::operator>(const item &right) const
69 {
70 return id > right.id;
71 }
72
73 bool item::operator==(const item &right) const
74 {
75 return id == right.id;
76 }
77
78 bool item::operator!=(const item &right) const
79 {
80 return id != right.id;
81 }
82
83 item &item::operator=(const item &right)
84 {
85 myname = right.myname;
86 myprice = right.myprice;
87 myuses = right.myuses;
88 id = right.id;
89 mytype = right.mytype;
90
91 for (int x = 0; x < 8; x++)
92 {
93 mymodifiers[x] = right.mymodifiers[x];
94 }
95 return *this; // enables cascading x=y=z;
96 }
97 weapon::~weapon()
98 {
99 }
100
101 bool weapon::setData(char *datastr)
102 {
103 try
104 {
105 char *temp;
106 temp = strtok(datastr, "~"); // Type
107
108 mytype = WEAPON;
109 // Grab the item's id
110 temp = strtok(NULL, "~");
111 id = stringtoint(temp);
112
113 // Grab the item's name
114 temp = strtok(NULL, "~");
115 myname = temp;
116
117 // Grab the item's price
118 temp = strtok(NULL, "~");
119 myprice = stringtoint(temp);
120
121 // Grab the item's uses
122 temp = strtok(NULL, "~");
123 myuses = stringtoint(temp);
124
125 // Grab the item's modifiers
126 for (int x = 0; x < 4; x++)
127 {
128 temp = strtok(NULL, "~");
129 mymodifiers[x] = stringtoint(temp);
130 }
131 // If we got here, we're successful
132 return true;
133 }
134 catch (char *str)
135 {
136 log("Exception setting weapon data: %s", str);
137 return false;
138 }
139 }
140
141 bool weapon::use(Player *p)
142 {
143 // weapon(char *name, int p=0, int uses = -1, int strength=0, int defense=0, int maxhp=0)
144 if (myuses == 0)
145 return false;
146 else
147 {
148 if (p->getWeapon())
149 {
150 p->getWeapon()->undo(p);
151 }
152 p->addStrength(mymodifiers[0]);
153 p->addDefense(mymodifiers[1]);
154 p->addMaxHP(mymodifiers[2]);
155 p->setWeapon(*this);
156 }
157
158 return true;
159 }
160
161 void weapon::undo(Player *p)
162 {
163 p->subtractStrength(mymodifiers[0]);
164 p->subtractDefense(mymodifiers[1]);
165 p->subtractMaxHP(mymodifiers[2]);
166 }
167
168 armor::~armor()
169 {
170 }
171
172 void armor::undo(Player *p)
173 {
174 p->subtractStrength(mymodifiers[0]);
175 p->subtractDefense(mymodifiers[1]);
176 p->subtractMaxHP(mymodifiers[2]);
177 }
178
179 bool armor::setData(char *datastr)
180 {
181 try
182 {
183 char *temp;
184 strtok(datastr, "~"); // Type
185
186 mytype = ARMOR;
187
188 // Grab the item's id
189 temp = strtok(NULL, "~");
190 id = stringtoint(temp);
191
192 // Grab the item's name
193 temp = strtok(NULL, "~");
194 myname = temp;
195
196 // Grab the item's price
197 temp = strtok(NULL, "~");
198 myprice = stringtoint(temp);
199
200 // Grab the item's uses
201 temp = strtok(NULL, "~");
202 myuses = stringtoint(temp);
203
204 // Grab the item's modifiers
205 for (int x = 0; x < 4; x++)
206 {
207 temp = strtok(NULL, "~");
208 mymodifiers[x] = stringtoint(temp);
209 }
210 // If we got here, we were successful
211 return true;
212 }
213 catch(char *str)
214 {
215 log("Exception setting armor data: %s", str);
216 return false;
217 }
218
219 }
220
221 bool armor::use(Player *p)
222 {
223 // weapon(char *name, int p=0, int uses = -1, int strength=0, int defense=0, int maxhp=0)
224 if (myuses == 0)
225 return false;
226 else
227 {
228 if (p->getArmor())
229 {
230 p->getArmor()->undo(p);
231 }
232 p->addStrength(mymodifiers[0]);
233 p->addDefense(mymodifiers[1]);
234 p->addMaxHP(mymodifiers[2]);
235 p->setArmor(*this);
236 }
237
238 return true;
239 }
240
241 potion::~potion()
242 {
243 }
244
245 bool potion::use(Player *p)
246 {
247 // potion(char *name, int p=0, int uses = 1, int strength=0, int defense=0, int maxhp=0, int hp=0, int forest_fights=0, int player_fights=0, int gold=0, int bank=0)
248
249 if (myuses == 0)
250 return false;
251 else
252 {
253 p->addStrength(myranges[0].random());
254 p->addDefense(myranges[1].random());
255 p->addMaxHP(myranges[2].random());
256 p->addHP(myranges[3].random());
257 p->addForestFights(myranges[4].random());
258 p->addPlayerFights(myranges[5].random());
259 p->addGold(myranges[6].random());
260 p->addBank(myranges[7].random());
261 }
262 return true;
263 }
264
265 void potion::undo(Player *p)
266 {
267 return;
268 }
269
270 bool potion::setData(char *datastr)
271 {
272 try
273 {
274 char *temp;
275
276 temp = strtok(datastr, "~"); // Type
277
278 mytype = POTION;
279
280 // Grab the item's id
281 temp = strtok(NULL, "~");
282 id = stringtoint(temp);
283
284 // Grab the item's name
285 temp = strtok(NULL, "~");
286 myname = temp;
287
288 // Grab the item's price
289 temp = strtok(NULL, "~");
290 myprice = stringtoint(temp);
291
292 // Grab the item's uses
293 temp = strtok(NULL, "~");
294 myuses = stringtoint(temp);
295
296 // Grab the item's modifiers
297 for (int x = 0; x < 8; x++)
298 {
299 temp = strtok(NULL, "~");
300 myranges[x].low = stringtoint(temp);
301 temp = strtok(NULL, "~");
302 myranges[x].high = stringtoint(temp);
303 }
304 }
305 catch(char *str)
306 {
307 log("Exception setting potion data: %s", str);
308 return false;
309 }
310 // If we got here, we were successful
311 return true;
312 }
313
314
315 itemContainer::itemContainer()
316 {
317 myuses = 0;
318 myitem = NULL;
319 }
320
321 itemContainer::itemContainer(item *i){
322 myuses = i->uses();
323 myitem = i;
324 }
325 itemContainer::itemContainer(const itemContainer &right)
326 {
327 myuses = right.myuses;
328 myitem = right.myitem;
329 }
330 itemContainer::~itemContainer()
331 {
332 myuses = 0;
333 myitem = NULL;
334 }
335
336 void itemContainer::use(Player *p)
337 {
338 myitem->use(p);
339 if (myuses > 0)
340 --myuses;
341 }
342
343 itemContainer &itemContainer::operator--()
344 {
345 --myuses;
346 return *this;
347 }
348
349 itemContainer itemContainer::operator--(int)
350 {
351 itemContainer oldValue = *this;
352
353 operator--();
354
355 return oldValue;
356 }
357
358 itemContainer &itemContainer::operator++()
359 {
360 ++myuses;
361
362 return *this;
363 }
364
365 itemContainer itemContainer::operator++(int)
366 {
367 itemContainer oldValue = *this;
368
369 operator++();
370
371 return oldValue;
372 }
373
374 void itemContainer::setItem(item *i)
375 {
376 myitem = i;
377 }
378
379 bool itemContainer::operator<(const itemContainer &right) const
380 {
381 return (*myitem < *right.myitem);
382 }
383
384 bool itemContainer::operator>(const itemContainer &right) const
385 {
386 return (*myitem > *right.myitem);
387 }
388
389 bool itemContainer::operator==(const itemContainer &right) const
390 {
391 return (*myitem == *right.myitem);
392 }
393
394 bool itemContainer::operator!=(const itemContainer &right) const
395 {
396 return (*myitem != *right.myitem);
397 }
398
399 void itemContainer::setUses(int uses)
400 {
401 myuses = uses;
402 }
403
404 tavernItem::tavernItem()
405 {
406 myItem = NULL;
407 myLevel = 1;
408 }
409
410 tavernItem::tavernItem(item *i, int l)
411 {
412 setItem(i);
413 setLevel(l);
414 }
415
416 void tavernItem::setItem(item *i)
417 {
418 myItem = i;
419 }
420
421 void tavernItem::setLevel(int l)
422 {
423 myLevel = l;
424 }
425
426 bool tavernItem::visible(Player *p)
427 {
428 return (p != NULL && p->getLevel() >= myLevel);
429 }