X-Git-Url: https://jfr.im/git/irc/gameservirc.git/blobdiff_plain/37ed80a99c033d815fcef9a7d1c8b48ef334220d..fbb87959e7ab36dfb676c456f9ae28b8b5d945ec:/gameserv/item.cpp?ds=sidebyside diff --git a/gameserv/item.cpp b/gameserv/item.cpp index d236201..e5b67bc 100644 --- a/gameserv/item.cpp +++ b/gameserv/item.cpp @@ -1,5 +1,6 @@ #include "item.h" #include "player.h" +#include "extern.h" item::item() { @@ -10,7 +11,7 @@ item::item() mymodifiers[x] = 0; } -item::item(const char *name, long int p, int uses, int m1, int m2, int m3, int m4, int m5, int m6, int m7, int m8) +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) { myname = name; // string = char* myprice = p; @@ -23,9 +24,10 @@ item::item(const char *name, long int p, int uses, int m1, int m2, int m3, int m mymodifiers[5] = m6; mymodifiers[6] = m7; mymodifiers[7] = m8; + id = identifier; } -item::item(string name, long int p, int uses, int m1, int m2, int m3, int m4, int m5, int m6, int m7, int m8) +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) { myname = name; // string = char* myprice = p; @@ -38,30 +40,102 @@ item::item(string name, long int p, int uses, int m1, int m2, int m3, int m4, in mymodifiers[5] = m6; mymodifiers[6] = m7; mymodifiers[7] = m8; + id = identifier; } item::~item() { + for (int x = 0; x < 8; x++) + { + mymodifiers[x] = 0; + } + + myuses = 0; + myname = ""; + myprice = 0; +} + +void item::setType(type t) +{ + mytype = t; } bool item::operator<(const item &right) const { - return myname < right.myname; + return id < right.id; } bool item::operator>(const item &right) const { - return myname > right.myname; + return id > right.id; } bool item::operator==(const item &right) const { - return myname == right.myname; + return id == right.id; } bool item::operator!=(const item &right) const { - return myname != right.myname; + return id != right.id; +} + +item &item::operator=(const item &right) +{ + myname = right.myname; + myprice = right.myprice; + myuses = right.myuses; + id = right.id; + mytype = right.mytype; + + for (int x = 0; x < 8; x++) + { + mymodifiers[x] = right.mymodifiers[x]; + } + return *this; // enables cascading x=y=z; +} +weapon::~weapon() +{ +} + +bool weapon::setData(char *datastr) +{ + try + { + char *temp; + temp = strtok(datastr, "~"); // Type + + mytype = WEAPON; + // Grab the item's id + temp = strtok(NULL, "~"); + id = stringtoint(temp); + + // Grab the item's name + temp = strtok(NULL, "~"); + myname = temp; + + // Grab the item's price + temp = strtok(NULL, "~"); + myprice = stringtoint(temp); + + // Grab the item's uses + temp = strtok(NULL, "~"); + myuses = stringtoint(temp); + + // Grab the item's modifiers + for (int x = 0; x < 4; x++) + { + temp = strtok(NULL, "~"); + mymodifiers[x] = stringtoint(temp); + } + // If we got here, we're successful + return true; + } + catch (char *str) + { + log("Exception setting weapon data: %s", str); + return false; + } } bool weapon::use(Player *p) @@ -71,30 +145,77 @@ bool weapon::use(Player *p) return false; else { - p->strength += mymodifiers[0]; - p->defense += mymodifiers[1]; - p->maxhp += mymodifiers[2]; + if (p->getWeapon()) + { + p->getWeapon()->undo(p); + } + p->addStrength(mymodifiers[0]); + p->addDefense(mymodifiers[1]); + p->addMaxHP(mymodifiers[2]); + p->setWeapon(*this); } - if (myuses > 0) - { - myuses--; - } return true; } void weapon::undo(Player *p) { - p->strength -= mymodifiers[0]; - p->defense -= mymodifiers[1]; - p->maxhp -= mymodifiers[2]; + p->subtractStrength(mymodifiers[0]); + p->subtractDefense(mymodifiers[1]); + p->subtractMaxHP(mymodifiers[2]); +} + +armor::~armor() +{ } void armor::undo(Player *p) { - p->strength -= mymodifiers[0]; - p->defense -= mymodifiers[1]; - p->maxhp -= mymodifiers[2]; + p->subtractStrength(mymodifiers[0]); + p->subtractDefense(mymodifiers[1]); + p->subtractMaxHP(mymodifiers[2]); +} + +bool armor::setData(char *datastr) +{ + try + { + char *temp; + strtok(datastr, "~"); // Type + + mytype = ARMOR; + + // Grab the item's id + temp = strtok(NULL, "~"); + id = stringtoint(temp); + + // Grab the item's name + temp = strtok(NULL, "~"); + myname = temp; + + // Grab the item's price + temp = strtok(NULL, "~"); + myprice = stringtoint(temp); + + // Grab the item's uses + temp = strtok(NULL, "~"); + myuses = stringtoint(temp); + + // Grab the item's modifiers + for (int x = 0; x < 4; x++) + { + temp = strtok(NULL, "~"); + mymodifiers[x] = stringtoint(temp); + } + // If we got here, we were successful + return true; + } + catch(char *str) + { + log("Exception setting armor data: %s", str); + return false; + } + } bool armor::use(Player *p) @@ -104,44 +225,205 @@ bool armor::use(Player *p) return false; else { - p->strength += mymodifiers[0]; - p->defense += mymodifiers[1]; - p->maxhp += mymodifiers[2]; + if (p->getArmor()) + { + p->getArmor()->undo(p); + } + p->addStrength(mymodifiers[0]); + p->addDefense(mymodifiers[1]); + p->addMaxHP(mymodifiers[2]); + p->setArmor(*this); } - if (myuses > 0) - { - myuses--; - } return true; } +potion::~potion() +{ +} + bool potion::use(Player *p) { // 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) - + if (myuses == 0) return false; else { - p->strength += mymodifiers[0]; - p->defense += mymodifiers[1]; - p->maxhp += mymodifiers[2]; - p->hp += mymodifiers[3]; - p->forest_fights += mymodifiers[4]; - p->player_fights += mymodifiers[5]; - p->gold += mymodifiers[6]; - p->bank += mymodifiers[7]; + + p->addStrength(myranges[0].random()); + p->addDefense(myranges[1].random()); + p->addMaxHP(myranges[2].random()); + p->addHP(myranges[3].random()); + p->addForestFights(myranges[4].random()); + p->addPlayerFights(myranges[5].random()); + p->addGold(myranges[6].random()); + p->addBank(myranges[7].random()); } + return true; +} + +void potion::undo(Player *p) +{ + return; +} - if (myuses > 0) +bool potion::setData(char *datastr) +{ + try { - myuses--; + char *temp; + + temp = strtok(datastr, "~"); // Type + + mytype = POTION; + + // Grab the item's id + temp = strtok(NULL, "~"); + id = stringtoint(temp); + + // Grab the item's name + temp = strtok(NULL, "~"); + myname = temp; + + // Grab the item's price + temp = strtok(NULL, "~"); + myprice = stringtoint(temp); + + // Grab the item's uses + temp = strtok(NULL, "~"); + myuses = stringtoint(temp); + + // Grab the item's modifiers + for (int x = 0; x < 8; x++) + { + temp = strtok(NULL, "~"); + myranges[x].low = stringtoint(temp); + temp = strtok(NULL, "~"); + myranges[x].high = stringtoint(temp); + } + } + catch(char *str) + { + log("Exception setting potion data: %s", str); + return false; } + // If we got here, we were successful return true; } -void potion::undo(Player *p) + +itemContainer::itemContainer() { - return; + myuses = 0; + myitem = NULL; +} + +itemContainer::itemContainer(item *i){ + myuses = i->uses(); + myitem = i; +} +itemContainer::itemContainer(const itemContainer &right) +{ + myuses = right.myuses; + myitem = right.myitem; +} +itemContainer::~itemContainer() +{ + myuses = 0; + myitem = NULL; +} + +void itemContainer::use(Player *p) +{ + myitem->use(p); + --myuses; +} + +itemContainer &itemContainer::operator--() +{ + --myuses; + return *this; +} + +itemContainer itemContainer::operator--(int) +{ + itemContainer oldValue = *this; + + operator--(); + + return oldValue; +} + +itemContainer &itemContainer::operator++() +{ + ++myuses; + + return *this; +} + +itemContainer itemContainer::operator++(int) +{ + itemContainer oldValue = *this; + + operator++(); + + return oldValue; +} + +void itemContainer::setItem(item *i) +{ + myitem = i; +} + +bool itemContainer::operator<(const itemContainer &right) const +{ + return (*myitem < *right.myitem); +} + +bool itemContainer::operator>(const itemContainer &right) const +{ + return (*myitem > *right.myitem); +} + +bool itemContainer::operator==(const itemContainer &right) const +{ + return (*myitem == *right.myitem); +} + +bool itemContainer::operator!=(const itemContainer &right) const +{ + return (*myitem != *right.myitem); +} + +void itemContainer::setUses(int uses) +{ + myuses = uses; +} + +tavernItem::tavernItem() +{ + myItem = NULL; + myLevel = 1; +} + +tavernItem::tavernItem(item *i, int l) +{ + setItem(i); + setLevel(l); +} + +void tavernItem::setItem(item *i) +{ + myItem = i; +} + +void tavernItem::setLevel(int l) +{ + myLevel = l; +} + +bool tavernItem::visible(Player *p) +{ + return (p != NULL && p->getLevel() >= myLevel); }