]> jfr.im git - irc/gameservirc.git/blame - gameserv/item.cpp
updated the TODO
[irc/gameservirc.git] / gameserv / item.cpp
CommitLineData
8ad9f659 1#include "item.h"
37ed80a9 2#include "player.h"
7f56a68b 3#include "extern.h"
8ad9f659 4
37ed80a9 5item::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
b6bf4226 14item::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)
8ad9f659 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;
b6bf4226 27 id = identifier;
8ad9f659 28}
29
b6bf4226 30item::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)
8ad9f659 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;
b6bf4226 43 id = identifier;
8ad9f659 44}
45
46item::~item()
47{
b6bf4226 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
58void item::setType(type t)
59{
60 mytype = t;
8ad9f659 61}
62
26b17386 63bool item::operator<(const item &right) const
64{
1ee4a31b 65 return id < right.id;
26b17386 66}
67
68bool item::operator>(const item &right) const
69{
1ee4a31b 70 return id > right.id;
26b17386 71}
72
73bool item::operator==(const item &right) const
74{
1ee4a31b 75 return id == right.id;
26b17386 76}
77
78bool item::operator!=(const item &right) const
79{
1ee4a31b 80 return id != right.id;
26b17386 81}
82
7f56a68b 83item &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}
b6bf4226 97weapon::~weapon()
98{
99}
100
7f56a68b 101bool weapon::setData(char *datastr)
102{
103 try
104 {
105 char *temp;
e0056fa6 106 temp = strtok(datastr, "~"); // Type
7f56a68b 107
108 mytype = WEAPON;
109 // Grab the item's id
110 temp = strtok(NULL, "~");
7f56a68b 111 id = stringtoint(temp);
112
113 // Grab the item's name
114 temp = strtok(NULL, "~");
7f56a68b 115 myname = temp;
116
117 // Grab the item's price
118 temp = strtok(NULL, "~");
7f56a68b 119 myprice = stringtoint(temp);
120
121 // Grab the item's uses
122 temp = strtok(NULL, "~");
7f56a68b 123 myuses = stringtoint(temp);
124
125 // Grab the item's modifiers
126 for (int x = 0; x < 4; x++)
127 {
128 temp = strtok(NULL, "~");
7f56a68b 129 mymodifiers[x] = stringtoint(temp);
130 }
42c1eadd 131 // If we got here, we're successful
7f56a68b 132 return true;
133 }
134 catch (char *str)
135 {
cd973e97 136 log("Exception setting weapon data: %s", str);
7f56a68b 137 return false;
138 }
139}
140
8ad9f659 141bool 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 {
1781f48a 148 if (p->getWeapon())
149 {
150 p->getWeapon()->undo(p);
151 }
8ad9f659 152 p->strength += mymodifiers[0];
153 p->defense += mymodifiers[1];
154 p->maxhp += mymodifiers[2];
1781f48a 155 p->setWeapon(*this);
8ad9f659 156 }
157
8ad9f659 158 return true;
159}
160
161void weapon::undo(Player *p)
162{
163 p->strength -= mymodifiers[0];
164 p->defense -= mymodifiers[1];
165 p->maxhp -= mymodifiers[2];
166}
167
b6bf4226 168armor::~armor()
169{
170}
171
37ed80a9 172void armor::undo(Player *p)
173{
174 p->strength -= mymodifiers[0];
175 p->defense -= mymodifiers[1];
176 p->maxhp -= mymodifiers[2];
177}
178
7f56a68b 179bool armor::setData(char *datastr)
b6bf4226 180{
cd973e97 181 try
7f56a68b 182 {
42c1eadd 183 char *temp;
e0056fa6 184 strtok(datastr, "~"); // Type
185
42c1eadd 186 mytype = ARMOR;
cd973e97 187
188 // Grab the item's id
42c1eadd 189 temp = strtok(NULL, "~");
cd973e97 190 id = stringtoint(temp);
e0056fa6 191
cd973e97 192 // Grab the item's name
42c1eadd 193 temp = strtok(NULL, "~");
cd973e97 194 myname = temp;
195
196 // Grab the item's price
42c1eadd 197 temp = strtok(NULL, "~");
cd973e97 198 myprice = stringtoint(temp);
199
200 // Grab the item's uses
42c1eadd 201 temp = strtok(NULL, "~");
cd973e97 202 myuses = stringtoint(temp);
203
204 // Grab the item's modifiers
42c1eadd 205 for (int x = 0; x < 4; x++)
cd973e97 206 {
42c1eadd 207 temp = strtok(NULL, "~");
cd973e97 208 mymodifiers[x] = stringtoint(temp);
209 }
42c1eadd 210 // If we got here, we were successful
211 return true;
cd973e97 212 }
213 catch(char *str)
214 {
215 log("Exception setting armor data: %s", str);
216 return false;
7f56a68b 217 }
218
b6bf4226 219}
220
37ed80a9 221bool 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 {
1781f48a 228 if (p->getArmor())
229 {
230 p->getArmor()->undo(p);
231 }
37ed80a9 232 p->strength += mymodifiers[0];
233 p->defense += mymodifiers[1];
234 p->maxhp += mymodifiers[2];
1781f48a 235 p->setArmor(*this);
37ed80a9 236 }
237
37ed80a9 238 return true;
239}
240
cd973e97 241potion::~potion()
242{
243}
244
8ad9f659 245bool 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 {
8a5cec4f 253
e0056fa6 254 p->strength += myranges[0].random();
8a5cec4f 255 if (p->strength > 32000 || p->strength < 0)
256 {
257 p->strength = 32000;
258 }
259
e0056fa6 260 p->defense += myranges[1].random();
8a5cec4f 261 if (p->defense > 32000 || p->defense < 0)
262 {
263 p->defense = 32000;
264 }
265
e0056fa6 266 p->maxhp += myranges[2].random();
8a5cec4f 267 if (p->maxhp > 32000 || p->maxhp < 0)
268 {
269 p->maxhp = 32000;
270 }
271
e0056fa6 272 p->hp += myranges[3].random();
8a5cec4f 273 if (p->hp > p->maxhp || p->hp < 0) // You can no longer go higher than your maxhp
274 p->hp = p->maxhp;
275
e0056fa6 276 p->forest_fights += myranges[4].random();
8a5cec4f 277 if (p->forest_fights > 32000 || p->forest_fights < 0)
278 {
279 p->forest_fights = 32000;
280 }
281
e0056fa6 282 p->player_fights += myranges[5].random();
8a5cec4f 283 if (p->player_fights > 32000 || p->player_fights < 0)
284 {
285 p->player_fights = 32000;
286 }
287
288
e0056fa6 289 p->gold += myranges[6].random();
8a5cec4f 290 if (p->gold > 2000000000 || p->gold < 0)
291 {
292 p->gold = 2000000000;
293 }
8ad9f659 294
8a5cec4f 295 p->bank += myranges[7].random();
296 if (p->bank > 2000000000 || p->bank < 0)
297 {
298 p->bank = 2000000000;
299 }
8ad9f659 300 }
301 return true;
302}
37ed80a9 303
304void potion::undo(Player *p)
305{
306 return;
307}
b6bf4226 308
7f56a68b 309bool potion::setData(char *datastr)
b6bf4226 310{
cd973e97 311 try
7f56a68b 312 {
cd973e97 313 char *temp;
e0056fa6 314
315 temp = strtok(datastr, "~"); // Type
316
8a5cec4f 317 mytype = POTION;
cd973e97 318
319 // Grab the item's id
42c1eadd 320 temp = strtok(NULL, "~");
cd973e97 321 id = stringtoint(temp);
322
323 // Grab the item's name
42c1eadd 324 temp = strtok(NULL, "~");
cd973e97 325 myname = temp;
326
327 // Grab the item's price
42c1eadd 328 temp = strtok(NULL, "~");
cd973e97 329 myprice = stringtoint(temp);
330
331 // Grab the item's uses
42c1eadd 332 temp = strtok(NULL, "~");
cd973e97 333 myuses = stringtoint(temp);
334
335 // Grab the item's modifiers
e0056fa6 336 for (int x = 0; x < 8; x++)
cd973e97 337 {
42c1eadd 338 temp = strtok(NULL, "~");
e0056fa6 339 myranges[x].low = stringtoint(temp);
340 temp = strtok(NULL, "~");
341 myranges[x].high = stringtoint(temp);
cd973e97 342 }
343 }
344 catch(char *str)
345 {
346 log("Exception setting potion data: %s", str);
347 return false;
7f56a68b 348 }
7f56a68b 349 // If we got here, we were successful
b6bf4226 350 return true;
351}
e696687e 352
353
354itemContainer::itemContainer()
355{
356 myuses = 0;
357 myitem = NULL;
358}
359
42c1eadd 360itemContainer::itemContainer(item *i){
e696687e 361 myuses = i->uses();
362 myitem = i;
363}
364itemContainer::itemContainer(const itemContainer &right)
365{
366 myuses = right.myuses;
367 myitem = right.myitem;
368}
369itemContainer::~itemContainer()
370{
371 myuses = 0;
372 myitem = NULL;
373}
374
8a5cec4f 375void itemContainer::use(Player *p)
376{
377 myitem->use(p);
378 --myuses;
379}
380
e696687e 381itemContainer &itemContainer::operator--()
382{
383 --myuses;
384 return *this;
385}
386
387itemContainer itemContainer::operator--(int)
388{
389 itemContainer oldValue = *this;
390
391 operator--();
392
393 return oldValue;
394}
395
396itemContainer &itemContainer::operator++()
397{
398 ++myuses;
399
400 return *this;
401}
402
403itemContainer itemContainer::operator++(int)
404{
405 itemContainer oldValue = *this;
406
407 operator++();
408
409 return oldValue;
410}
411
412void itemContainer::setItem(item *i)
413{
414 myitem = i;
415}
416
417bool itemContainer::operator<(const itemContainer &right) const
418{
419 return (*myitem < *right.myitem);
420}
421
422bool itemContainer::operator>(const itemContainer &right) const
423{
424 return (*myitem > *right.myitem);
425}
426
427bool itemContainer::operator==(const itemContainer &right) const
428{
429 return (*myitem == *right.myitem);
430}
431
432bool itemContainer::operator!=(const itemContainer &right) const
433{
1ee4a31b 434 return (*myitem != *right.myitem);
e696687e 435}
e0056fa6 436
437void itemContainer::setUses(int uses)
438{
439 myuses = uses;
440}
d1927afc 441
442tavernItem::tavernItem()
443{
444 myItem = NULL;
445 myLevel = 1;
446}
447
448tavernItem::tavernItem(item *i, int l)
449{
450 setItem(i);
451 setLevel(l);
452}
453
454void tavernItem::setItem(item *i)
455{
456 myItem = i;
457}
458
459void tavernItem::setLevel(int l)
460{
461 myLevel = l;
462}
463
464bool tavernItem::visible(Player *p)
465{
466 return (p != NULL && p->level >= myLevel);
467}