From 1b57518ca97c670174f89c5af28659b6ad0c3d42 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 27 Feb 2011 03:36:52 +0200 Subject: Implement receiving item color from server. --- src/gui/trade.cpp | 13 +++++++------ src/gui/trade.h | 7 ++++--- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'src/gui') diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp index f7b16d6ae..be4891103 100644 --- a/src/gui/trade.cpp +++ b/src/gui/trade.cpp @@ -151,21 +151,22 @@ void TradeWindow::setMoney(int amount) mMoneyLabel->adjustSize(); } -void TradeWindow::addItem(int id, bool own, int quantity, int refine) +void TradeWindow::addItem(int id, bool own, int quantity, + int refine, unsigned char color) { if (own) - mMyInventory->addItem(id, quantity, refine); + mMyInventory->addItem(id, quantity, refine, color); else - mPartnerInventory->addItem(id, quantity, refine); + mPartnerInventory->addItem(id, quantity, refine, color); } void TradeWindow::addItem(int id, bool own, int quantity, - int refine, bool equipment) + int refine, unsigned char color, bool equipment) { if (own) - mMyInventory->addItem(id, quantity, refine, equipment); + mMyInventory->addItem(id, quantity, refine, color, equipment); else - mPartnerInventory->addItem(id, quantity, refine, equipment); + mPartnerInventory->addItem(id, quantity, refine, color, equipment); } void TradeWindow::changeQuantity(int index, bool own, int quantity) diff --git a/src/gui/trade.h b/src/gui/trade.h index c316e2354..fcaa2f6ac 100644 --- a/src/gui/trade.h +++ b/src/gui/trade.h @@ -63,7 +63,8 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener /** * Add an item to the trade window. */ - void addItem(int id, bool own, int quantity, int refine); + void addItem(int id, bool own, int quantity, + int refine, unsigned char color); /** * Reset both item containers @@ -73,8 +74,8 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener /** * Add an item to the trade window. */ - void addItem(int id, bool own, int quantity, - int refine, bool equipment); + void addItem(int id, bool own, int quantity, int refine, + unsigned char color, bool equipment); /** * Change quantity of an item. -- cgit v1.2.3-70-g09d2 From df5c7ae83a80db63ab90142df9e3a93f5ee630d0 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sun, 27 Feb 2011 18:08:34 +0200 Subject: First part of implimintation item colors. --- src/actorsprite.cpp | 9 +++++++-- src/actorsprite.h | 3 ++- src/actorspritemanager.cpp | 6 +++--- src/actorspritemanager.h | 3 ++- src/being.cpp | 16 +++++++++------- src/being.h | 3 ++- src/flooritem.cpp | 9 ++++++--- src/flooritem.h | 4 +++- src/gui/outfitwindow.cpp | 3 ++- src/inventory.cpp | 2 +- src/item.cpp | 13 ++++++++----- src/item.h | 2 +- src/net/manaserv/beinghandler.cpp | 2 +- src/net/manaserv/buysellhandler.cpp | 2 +- src/net/manaserv/itemhandler.cpp | 2 +- src/net/tmwa/beinghandler.cpp | 29 ++++++++++++++++------------- src/net/tmwa/charserverhandler.cpp | 2 +- src/net/tmwa/inventoryhandler.cpp | 20 +++++++++++++++----- src/net/tmwa/itemhandler.cpp | 6 +++--- src/resources/iteminfo.cpp | 28 ++++++++++++++++++++++++++++ src/resources/iteminfo.h | 4 ++++ src/utils/stringutils.cpp | 10 ++++++++++ src/utils/stringutils.h | 2 ++ 23 files changed, 128 insertions(+), 52 deletions(-) (limited to 'src/gui') diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp index fc648741c..4188ff224 100644 --- a/src/actorsprite.cpp +++ b/src/actorsprite.cpp @@ -301,7 +301,8 @@ void ActorSprite::handleStatusEffect(StatusEffect *effect, int effectId) } void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, - bool forceDisplay, int imageType) + bool forceDisplay, int imageType, + std::string color) { clear(); @@ -310,7 +311,9 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, for (it = display.sprites.begin(), it_end = display.sprites.end(); it != it_end; ++it) { - std::string file = "graphics/sprites/" + (*it)->sprite; + std::string file = "graphics/sprites/" + + combineDye((*it)->sprite, color); + int variant = (*it)->variant; addSprite(AnimatedSprite::load(file, variant)); } @@ -336,6 +339,8 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, imagePath = "graphics/items/" + display.floor; break; } + imagePath = combineDye(imagePath, color); + Image *img = resman->getImage(imagePath); if (!img) diff --git a/src/actorsprite.h b/src/actorsprite.h index 00b694e26..7ec5cc391 100644 --- a/src/actorsprite.h +++ b/src/actorsprite.h @@ -211,7 +211,8 @@ protected: virtual void handleStatusEffect(StatusEffect *effect, int effectId); void setupSpriteDisplay(const SpriteDisplay &display, - bool forceDisplay = true, int imageType = 0); + bool forceDisplay = true, int imageType = 0, + std::string color = ""); int mId; Uint16 mStunMode; /**< Stun mode; zero if not stunned */ diff --git a/src/actorspritemanager.cpp b/src/actorspritemanager.cpp index 0c5cfe04d..03ed09835 100644 --- a/src/actorspritemanager.cpp +++ b/src/actorspritemanager.cpp @@ -190,10 +190,10 @@ Being *ActorSpriteManager::createBeing(int id, ActorSprite::Type type, return being; } -FloorItem *ActorSpriteManager::createItem(int id, int itemId, - int x, int y, int amount) +FloorItem *ActorSpriteManager::createItem(int id, int itemId, int x, int y, + int amount, unsigned char color) { - FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap, amount); + FloorItem *floorItem = new FloorItem(id, itemId, x, y, mMap, amount, color); mActors.insert(floorItem); return floorItem; diff --git a/src/actorspritemanager.h b/src/actorspritemanager.h index 3af157f17..c7deba867 100644 --- a/src/actorspritemanager.h +++ b/src/actorspritemanager.h @@ -68,7 +68,8 @@ class ActorSpriteManager: public ConfigListener /** * Create a FloorItem and add it to the list of ActorSprites. */ - FloorItem *createItem(int id, int itemId, int x, int y, int amount); + FloorItem *createItem(int id, int itemId, int x, int y, + int amount, unsigned char color); /** * Destroys the given ActorSprite at the end of diff --git a/src/being.cpp b/src/being.cpp index 7265aa337..2f2e69d16 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -1483,8 +1483,8 @@ void Being::updateColors() } } -void Being::setSprite(unsigned int slot, int id, const std::string &color, - bool isWeapon, bool isTempSprite) +void Being::setSprite(unsigned int slot, int id, std::string color, + unsigned char colorId, bool isWeapon, bool isTempSprite) { if (slot >= Net::getCharHandler()->maxSprite()) return; @@ -1508,13 +1508,15 @@ void Being::setSprite(unsigned int slot, int id, const std::string &color, } else { - std::string filename = ItemDB::get(id).getSprite(mGender); + ItemInfo info = ItemDB::get(id); + std::string filename = info.getSprite(mGender); AnimatedSprite *equipmentSprite = NULL; if (!filename.empty()) { - if (!color.empty()) - filename += "|" + color; + if (color.empty()) + color = info.getDyeColorsString(colorId); + filename = combineDye(filename, color); equipmentSprite = AnimatedSprite::load( paths.getStringValue("sprites") + filename); @@ -1931,7 +1933,7 @@ void Being::recalcSpritesOrder() if (repIt->second != 1) { setSprite(removeSprite, repIt->second, - mSpriteColors[removeSprite], false, true); + mSpriteColors[removeSprite], 1, false, true); } } } @@ -2066,7 +2068,7 @@ void Being::recalcSpritesOrder() if (!id) continue; - setSprite(slot, id, mSpriteColors[slot], false, true); + setSprite(slot, id, mSpriteColors[slot], 1, false, true); } // logger->log("slot %d = %d", slot, mSpriteRemap[slot]); } diff --git a/src/being.h b/src/being.h index 49127629f..1d5ca7c19 100644 --- a/src/being.h +++ b/src/being.h @@ -333,7 +333,8 @@ class Being : public ActorSprite, public ConfigListener * Sets visible equipments for this being. */ void setSprite(unsigned int slot, int id, - const std::string &color = "", bool isWeapon = false, + std::string color = "", + unsigned char colorId = 1, bool isWeapon = false, bool isTempSprite = false); void setSpriteID(unsigned int slot, int id); diff --git a/src/flooritem.cpp b/src/flooritem.cpp index 619be25ea..700d9ed25 100644 --- a/src/flooritem.cpp +++ b/src/flooritem.cpp @@ -41,7 +41,8 @@ FloorItem::FloorItem(int id, int x, int y, Map *map, - int amount): + int amount, + unsigned char color): ActorSprite(id), mItemId(itemId), mX(x), @@ -49,7 +50,8 @@ FloorItem::FloorItem(int id, mMap(map), // mAlpha(1.0f), mAmount(amount), - mPickupCount(0) + mPickupCount(0), + mColor(color) { mDropTime = cur_time; @@ -69,7 +71,8 @@ FloorItem::FloorItem(int id, mPos.y = 0; } - setupSpriteDisplay(ItemDB::get(itemId).getDisplay(), true, 1); + ItemInfo info = ItemDB::get(itemId); + setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeString(mColor)); } const ItemInfo &FloorItem::getInfo() const diff --git a/src/flooritem.h b/src/flooritem.h index deff05bc8..f1d19b89f 100644 --- a/src/flooritem.h +++ b/src/flooritem.h @@ -48,7 +48,8 @@ class FloorItem : public ActorSprite int x, int y, Map *map, - int amount); + int amount, + unsigned char color); Type getType() const { return FLOOR_ITEM; } @@ -88,6 +89,7 @@ class FloorItem : public ActorSprite int mDropTime; int mAmount; unsigned mPickupCount; + unsigned char mColor; }; #endif diff --git a/src/gui/outfitwindow.cpp b/src/gui/outfitwindow.cpp index 2796e13c8..ea2b7980c 100644 --- a/src/gui/outfitwindow.cpp +++ b/src/gui/outfitwindow.cpp @@ -292,7 +292,8 @@ void OutfitWindow::draw(gcn::Graphics *graphics) } if (!foundItem) { - Image *image = Item::getImage(mItems[mCurrentOutfit][i]); + //+++ need use colors in outfits + Image *image = Item::getImage(mItems[mCurrentOutfit][i], 1); if (image) g->drawImage(image, itemX, itemY); } diff --git a/src/inventory.cpp b/src/inventory.cpp index 4544c09be..705ae9329 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -100,7 +100,7 @@ void Inventory::setItem(int index, int id, int quantity, if (!mItems[index] && id > 0) { - Item *item = new Item(id, quantity, refine, equipment); + Item *item = new Item(id, quantity, refine, color, equipment); item->setInvIndex(index); mItems[index] = item; mUsed++; diff --git a/src/item.cpp b/src/item.cpp index c3c9b9c18..02f775834 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -75,8 +75,9 @@ void Item::setId(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = paths.getStringValue("itemIcons") + display.image; - mImage = resman->getImage(imagePath); - mDrawImage = resman->getImage(imagePath); + std::string dye = combineDye(imagePath, info.getDyeString(color)); + mImage = resman->getImage(dye); + mDrawImage = resman->getImage(dye); if (!mImage) { @@ -98,12 +99,14 @@ bool Item::isHaveTag(int tagId) return mTags[tagId] > 0; } -Image *Item::getImage(int id) +Image *Item::getImage(int id, unsigned char color) { ResourceManager *resman = ResourceManager::getInstance(); - SpriteDisplay display = ItemDB::get(id).getDisplay(); + ItemInfo info = ItemDB::get(id); + SpriteDisplay display = info.getDisplay(); std::string imagePath = "graphics/items/" + display.image; - Image *image = resman->getImage(imagePath); + Image *image; + image = resman->getImage(combineDye(imagePath, info.getDyeString(color))); if (!image) image = Theme::getImageFromTheme("unknown-item.png"); diff --git a/src/item.h b/src/item.h index cb58f6f9f..ae2cc9dfb 100644 --- a/src/item.h +++ b/src/item.h @@ -154,7 +154,7 @@ class Item const ItemInfo &getInfo() const { return ItemDB::get(mId); } - static Image *getImage(int id); + static Image *getImage(int id, unsigned char color); bool isHaveTag(int tagId); diff --git a/src/net/manaserv/beinghandler.cpp b/src/net/manaserv/beinghandler.cpp index f5fa7d26c..8ba2e5967 100644 --- a/src/net/manaserv/beinghandler.cpp +++ b/src/net/manaserv/beinghandler.cpp @@ -155,7 +155,7 @@ static void handleLooks(Being *being, Net::MessageIn &msg) { if (!(mask & (1 << i))) continue; int id = msg.readInt16(); - being->setSprite(slots[i], id, "", (slots[i] == SPRITE_WEAPON)); + being->setSprite(slots[i], id, "", 1, (slots[i] == SPRITE_WEAPON)); } } diff --git a/src/net/manaserv/buysellhandler.cpp b/src/net/manaserv/buysellhandler.cpp index 7334fe928..07737e20b 100644 --- a/src/net/manaserv/buysellhandler.cpp +++ b/src/net/manaserv/buysellhandler.cpp @@ -96,7 +96,7 @@ void BuySellHandler::handleMessage(Net::MessageIn &msg) int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); - dialog->addItem(new Item(itemId, amount, false), value); + dialog->addItem(new Item(itemId, amount, 1, false), value); } break; } diff --git a/src/net/manaserv/itemhandler.cpp b/src/net/manaserv/itemhandler.cpp index ce1d0965a..0afd12d21 100644 --- a/src/net/manaserv/itemhandler.cpp +++ b/src/net/manaserv/itemhandler.cpp @@ -68,7 +68,7 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) actorSpriteManager->createItem(id, itemId, x / map->getTileWidth(), y / map->getTileHeight(), - 0); + 0, 1); } else { diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index b6589e260..15792cf3a 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -620,15 +620,18 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) int type = msg.readInt8(); int id = 0; int id2 = 0; + std::string color; if (msg.getId() == SMSG_BEING_CHANGE_LOOKS) { id = msg.readInt8(); + id2 = 1; // default color } else { // SMSG_BEING_CHANGE_LOOKS2 id = msg.readInt16(); id2 = msg.readInt16(); + color = ""; } if (dstBeing->getType() == Being::PLAYER) @@ -646,21 +649,21 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) dstBeing->setSpriteID(SPRITE_HAIR, id *-1); break; case 2: // Weapon ID in id, Shield ID in id2 - dstBeing->setSprite(SPRITE_WEAPON, id, "", true); + dstBeing->setSprite(SPRITE_WEAPON, id, "", 1, true); if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHIELD); break; case 3: // Change lower headgear for eAthena, pants for us - dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, id); + dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_BOTTOMCLOTHES); break; case 4: // Change upper headgear for eAthena, hat for us - dstBeing->setSprite(SPRITE_HAT, id); + dstBeing->setSprite(SPRITE_HAT, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_HAT); break; case 5: // Change middle headgear for eathena, armor for us - dstBeing->setSprite(SPRITE_TOPCLOTHES, id); + dstBeing->setSprite(SPRITE_TOPCLOTHES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_TOPCLOTHES); break; case 6: // eAthena LOOK_HAIR_COLOR @@ -668,35 +671,35 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) break; case 8: // eAthena LOOK_SHIELD if (!config.getBoolValue("hideShield")) - dstBeing->setSprite(SPRITE_SHIELD, id); + dstBeing->setSprite(SPRITE_SHIELD, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHIELD); break; case 9: // eAthena LOOK_SHOES - dstBeing->setSprite(SPRITE_SHOE, id); + dstBeing->setSprite(SPRITE_SHOE, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_SHOE); break; case 10: // LOOK_GLOVES - dstBeing->setSprite(SPRITE_GLOVES, id); + dstBeing->setSprite(SPRITE_GLOVES, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_GLOVES); break; case 11: // LOOK_CAPE - dstBeing->setSprite(SPRITE_CAPE, id); + dstBeing->setSprite(SPRITE_CAPE, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_CAPE); break; case 12: - dstBeing->setSprite(SPRITE_MISC1, id); + dstBeing->setSprite(SPRITE_MISC1, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_MISC1); break; case 13: - dstBeing->setSprite(SPRITE_MISC2, id); + dstBeing->setSprite(SPRITE_MISC2, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_MISC2); break; case 14: - dstBeing->setSprite(SPRITE_EVOL1, id); + dstBeing->setSprite(SPRITE_EVOL1, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_EVOL1); break; case 15: - dstBeing->setSprite(SPRITE_EVOL2, id); + dstBeing->setSprite(SPRITE_EVOL2, id, color, id2); player_node->imitateOutfit(dstBeing, SPRITE_EVOL2); break; default: @@ -890,7 +893,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) ? GENDER_FEMALE : GENDER_MALE); // Set these after the gender, as the sprites may be gender-specific - dstBeing->setSprite(SPRITE_WEAPON, weapon, "", true); + dstBeing->setSprite(SPRITE_WEAPON, weapon, "", 1, true); if (!config.getBoolValue("hideShield")) dstBeing->setSprite(SPRITE_SHIELD, shield); //dstBeing->setSprite(SPRITE_SHOE, shoes); diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 5e2efbdd5..ec61b4be2 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -273,7 +273,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, tempPlayer->setSubtype(msg.readInt16()); // class (used for race) int hairStyle = msg.readInt16(); Uint16 weapon = msg.readInt16(); - tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", true); + tempPlayer->setSprite(SPRITE_WEAPON, weapon, "", 1, true); character->data.mAttributes[LEVEL] = msg.readInt16(); diff --git a/src/net/tmwa/inventoryhandler.cpp b/src/net/tmwa/inventoryhandler.cpp index 340f0c4b2..fc32c3ec3 100644 --- a/src/net/tmwa/inventoryhandler.cpp +++ b/src/net/tmwa/inventoryhandler.cpp @@ -217,7 +217,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) if (inventory) { inventory->setItem(index, itemId, amount, - 0, isEquipment); + 0, identified, isEquipment); } } else @@ -300,7 +300,7 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) amount += inventory->getItem(index)->getQuantity(); inventory->setItem(index, itemId, amount, refine, - equipType != 0); + identified, equipType != 0); } } } break; @@ -458,19 +458,29 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) { index = msg.readInt16() - INVENTORY_OFFSET; itemId = msg.readInt16(); - msg.readInt8(); // type - msg.readInt8(); // identify flag + if (itemId == 1172) + logger->log("step1"); + int itemType = msg.readInt8(); // type + identified = msg.readInt8(); // identify flag msg.readInt16(); // equip type equipType = msg.readInt16(); msg.readInt8(); // attribute refine = msg.readInt8(); msg.skip(8); // card + if (itemId == 1172) + logger->log("step2"); if (inventory) - inventory->setItem(index, itemId, 1, refine, true); + inventory->setItem(index, itemId, 1, refine, identified, true); if (equipType) mEquips.setEquipment(getSlot(equipType), index); + + if (debugInventory) + { + logger->log("Index: %d, ID: %d, Type: %d, Identified: %d", + index, itemId, itemType, identified); + } } break; diff --git a/src/net/tmwa/itemhandler.cpp b/src/net/tmwa/itemhandler.cpp index 5840d99b2..897ed1fb5 100644 --- a/src/net/tmwa/itemhandler.cpp +++ b/src/net/tmwa/itemhandler.cpp @@ -52,7 +52,7 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) { int id = msg.readInt32(); int itemId = msg.readInt16(); - msg.readInt8(); // identify flag + unsigned char identify = msg.readInt8(); // identify flag int x = msg.readInt16(); int y = msg.readInt16(); // msg.skip(4); // amount,subX,subY / subX,subY,amount @@ -64,12 +64,12 @@ void ItemHandler::handleMessage(Net::MessageIn &msg) if (msg.getId() == SMSG_ITEM_VISIBLE) { actorSpriteManager->createItem(id, itemId, - x, y, amount1); + x, y, amount1, identify); } else { actorSpriteManager->createItem(id, itemId, - x, y, amount2); + x, y, amount2, identify); } } } diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 255a9a7b3..49aadc23d 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -81,3 +81,31 @@ std::map &ItemInfo::addReplaceSprite(int sprite) } return it->second; } + +std::string ItemInfo::getDyeString(int color) const +{ + if (mId == 1172) + { + if (color == 1) + return "W:#115511,22aa22,99dd99;R:#547000,a5dc00,d1ff46"; + if (color == 0) + return "W:#547000,a5dc00,d1ff46;R:#115511,22aa22,99dd99"; + if (color == 3) + return "W:#ffffff,000000,000000;R:#333333,333333,333333"; + } + return ""; +} + +std::string ItemInfo::getDyeColorsString(int color) const +{ + if (mId == 1172) + { + if (color == 1) + return "#115511,22aa22,99dd99;#547000,a5dc00,d1ff46"; + if (color == 0) + return "#547000,a5dc00,d1ff46;#115511,22aa22,99dd99"; + if (color == 3) + return "#ffffff,000000,000000;#333333,333333,333333"; + } + return ""; +} \ No newline at end of file diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 5ea537fae..3b72c7830 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -231,6 +231,10 @@ class ItemInfo std::map > getSpriteToItemReplaceMap() const { return mSpriteToItemReplaceMap; } + std::string getDyeString(int color) const; + + std::string getDyeColorsString(int color) const; + protected: SpriteDisplay mDisplay; /**< Display info (like icon) */ std::string mName; diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index d914efe30..835f9ce00 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -387,3 +387,13 @@ std::list splitToIntList(const std::string &text, char separator) return tokens; } + +std::string combineDye(std::string file, std::string dye) +{ + if (dye.empty()) + return file; + size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + return file.substr(0, pos) + "|" + dye; + return file + "|" + dye; +} diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index ab16bb64b..52b47e6a2 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -170,4 +170,6 @@ std::set splitToIntSet(const std::string &text, char separator); std::list splitToIntList(const std::string &text, char separator); +std::string combineDye(std::string file, std::string dye); + #endif // UTILS_STRINGUTILS_H -- cgit v1.2.3-70-g09d2 From 22f79fd0d623c8e11994905534f53da267e22935 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 3 Mar 2011 01:25:21 +0200 Subject: Dehardcode item colors. Now reading all from configs. --- src/actorsprite.cpp | 4 +-- src/flooritem.cpp | 2 +- src/gui/charcreatedialog.cpp | 8 ++--- src/item.cpp | 4 +-- src/net/manaserv/beinghandler.cpp | 4 +-- src/net/manaserv/charhandler.cpp | 2 +- src/net/tmwa/beinghandler.cpp | 6 ++-- src/net/tmwa/charserverhandler.cpp | 2 +- src/resources/colordb.cpp | 74 ++++++++++++++++++++++++++++++++------ src/resources/colordb.h | 32 +++++++++++++++-- src/resources/itemdb.cpp | 2 ++ src/resources/iteminfo.cpp | 36 +++++++++---------- src/resources/iteminfo.h | 12 ++++++- src/utils/stringutils.cpp | 41 +++++++++++++++++++++ src/utils/stringutils.h | 5 +++ 15 files changed, 186 insertions(+), 48 deletions(-) (limited to 'src/gui') diff --git a/src/actorsprite.cpp b/src/actorsprite.cpp index 4188ff224..686c871e7 100644 --- a/src/actorsprite.cpp +++ b/src/actorsprite.cpp @@ -312,7 +312,7 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, it != it_end; ++it) { std::string file = "graphics/sprites/" - + combineDye((*it)->sprite, color); + + combineDye2((*it)->sprite, color); int variant = (*it)->variant; addSprite(AnimatedSprite::load(file, variant)); @@ -339,7 +339,7 @@ void ActorSprite::setupSpriteDisplay(const SpriteDisplay &display, imagePath = "graphics/items/" + display.floor; break; } - imagePath = combineDye(imagePath, color); + imagePath = combineDye2(imagePath, color); Image *img = resman->getImage(imagePath); diff --git a/src/flooritem.cpp b/src/flooritem.cpp index 700d9ed25..740daf387 100644 --- a/src/flooritem.cpp +++ b/src/flooritem.cpp @@ -72,7 +72,7 @@ FloorItem::FloorItem(int id, } ItemInfo info = ItemDB::get(itemId); - setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeString(mColor)); + setupSpriteDisplay(info.getDisplay(), true, 1, info.getDyeColorsString(mColor)); } const ItemInfo &FloorItem::getInfo() const diff --git a/src/gui/charcreatedialog.cpp b/src/gui/charcreatedialog.cpp index dff591dd9..ae4401572 100644 --- a/src/gui/charcreatedialog.cpp +++ b/src/gui/charcreatedialog.cpp @@ -58,7 +58,7 @@ CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot): mPlayer = new Being(0, ActorSprite::PLAYER, 0, NULL); mPlayer->setGender(GENDER_MALE); - int numberOfHairColors = ColorDB::size(); + int numberOfHairColors = ColorDB::getHairSize(); mHairStyle = rand() % mPlayer->getNumOfHairstyles(); mHairColor = rand() % numberOfHairColors; @@ -364,10 +364,10 @@ void CharCreateDialog::updateHair() if (mHairStyle < 0) mHairStyle += Being::getNumOfHairstyles(); - mHairColor %= ColorDB::size(); + mHairColor %= ColorDB::getHairSize(); if (mHairColor < 0) - mHairColor += ColorDB::size(); + mHairColor += ColorDB::getHairSize(); mPlayer->setSprite(Net::getCharHandler()->hairSprite(), - mHairStyle * -1, ColorDB::get(mHairColor)); + mHairStyle * -1, ColorDB::getHairColor(mHairColor)); } diff --git a/src/item.cpp b/src/item.cpp index 02f775834..ed0685a9d 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -75,7 +75,7 @@ void Item::setId(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = paths.getStringValue("itemIcons") + display.image; - std::string dye = combineDye(imagePath, info.getDyeString(color)); + std::string dye = combineDye2(imagePath, info.getDyeColorsString(color)); mImage = resman->getImage(dye); mDrawImage = resman->getImage(dye); @@ -106,7 +106,7 @@ Image *Item::getImage(int id, unsigned char color) SpriteDisplay display = info.getDisplay(); std::string imagePath = "graphics/items/" + display.image; Image *image; - image = resman->getImage(combineDye(imagePath, info.getDyeString(color))); + image = resman->getImage(combineDye2(imagePath, info.getDyeColorsString(color))); if (!image) image = Theme::getImageFromTheme("unknown-item.png"); diff --git a/src/net/manaserv/beinghandler.cpp b/src/net/manaserv/beinghandler.cpp index 8ba2e5967..b726bc52e 100644 --- a/src/net/manaserv/beinghandler.cpp +++ b/src/net/manaserv/beinghandler.cpp @@ -185,7 +185,7 @@ void BeingHandler::handleBeingEnterMessage(Net::MessageIn &msg) being->setName(name); } int hs = msg.readInt8(), hc = msg.readInt8(); - being->setSprite(SPRITE_HAIR, hs * -1, ColorDB::get(hc)); + being->setSprite(SPRITE_HAIR, hs * -1, ColorDB::getHairColor(hc)); being->setGender(msg.readInt8() == GENDER_MALE ? GENDER_MALE : GENDER_FEMALE); handleLooks(being, msg); @@ -350,7 +350,7 @@ void BeingHandler::handleBeingLooksChangeMessage(Net::MessageIn &msg) { int style = msg.readInt16(); int color = msg.readInt16(); - being->setSprite(SPRITE_HAIR, style * -1, ColorDB::get(color)); + being->setSprite(SPRITE_HAIR, style * -1, ColorDB::getHairColor(color)); } } diff --git a/src/net/manaserv/charhandler.cpp b/src/net/manaserv/charhandler.cpp index 20dda5b70..163aad988 100644 --- a/src/net/manaserv/charhandler.cpp +++ b/src/net/manaserv/charhandler.cpp @@ -377,7 +377,7 @@ void CharHandler::updateCharacters() player->setName(info.name); player->setGender(info.gender); player->setSprite(SPRITE_HAIR, info.hairStyle * -1, - ColorDB::get(info.hairColor)); + ColorDB::getHairColor(info.hairColor)); character->data.mAttributes[LEVEL] = info.level; character->data.mAttributes[CHAR_POINTS] = info.characterPoints; character->data.mAttributes[CORR_POINTS] = info.correctionPoints; diff --git a/src/net/tmwa/beinghandler.cpp b/src/net/tmwa/beinghandler.cpp index 0548a2715..b1c173df6 100644 --- a/src/net/tmwa/beinghandler.cpp +++ b/src/net/tmwa/beinghandler.cpp @@ -290,7 +290,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) ? GENDER_FEMALE : GENDER_MALE); // Set these after the gender, as the sprites may be gender-specific dstBeing->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(hairColor)); + ColorDB::getHairColor(hairColor)); dstBeing->setSprite(SPRITE_BOTTOMCLOTHES, headBottom); dstBeing->setSprite(SPRITE_TOPCLOTHES, headMid); dstBeing->setSprite(SPRITE_HAT, headTop); @@ -671,7 +671,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) player_node->imitateOutfit(dstBeing, SPRITE_TOPCLOTHES); break; case 6: // eAthena LOOK_HAIR_COLOR - dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::get(id)); + dstBeing->setSpriteColor(SPRITE_HAIR, ColorDB::getHairColor(id)); break; case 8: // eAthena LOOK_SHIELD if (!config.getBoolValue("hideShield")) @@ -927,7 +927,7 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) //dstBeing->setSprite(SPRITE_MISC1, misc1); //dstBeing->setSprite(SPRITE_MISC2, misc2); dstBeing->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(hairColor)); + ColorDB::getHairColor(hairColor)); player_node->imitateOutfit(dstBeing); diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 35cca6f07..daf531f04 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -309,7 +309,7 @@ void CharServerHandler::readPlayerData(Net::MessageIn &msg, int topClothes = msg.readInt16(); tempPlayer->setSprite(SPRITE_HAIR, hairStyle * -1, - ColorDB::get(msg.readInt16())); + ColorDB::getHairColor(msg.readInt16())); int misc2 = msg.readInt16(); tempPlayer->setName(msg.readString(24)); diff --git a/src/resources/colordb.cpp b/src/resources/colordb.cpp index c35cec95e..79622e8ed 100644 --- a/src/resources/colordb.cpp +++ b/src/resources/colordb.cpp @@ -28,9 +28,10 @@ namespace { - ColorDB::Colors mColors; + ColorDB::Colors mHairColors; bool mLoaded = false; std::string mFail = "#ffffff"; + ColorDB::ColorLists mColorLists; } void ColorDB::load() @@ -38,6 +39,12 @@ void ColorDB::load() if (mLoaded) unload(); + loadHair(); + loadColorLists(); +} + +void ColorDB::loadHair() +{ XML::Document *doc = new XML::Document("hair.xml"); xmlNodePtr root = doc->rootNode(); bool hairXml = true; @@ -55,7 +62,7 @@ void ColorDB::load() if (!root || !xmlStrEqual(root->name, BAD_CAST "colors")) { logger->log1("ColorDB: Failed to find any color files."); - mColors[0] = mFail; + mHairColors[0] = mFail; mLoaded = true; delete doc; @@ -69,10 +76,10 @@ void ColorDB::load() { int id = XML::getProperty(node, "id", 0); - if (mColors.find(id) != mColors.end()) + if (mHairColors.find(id) != mHairColors.end()) logger->log("ColorDB: Redefinition of dye ID %d", id); - mColors[id] = hairXml ? + mHairColors[id] = hairXml ? XML::getProperty(node, "value", "#FFFFFF") : XML::getProperty(node, "dye", "#FFFFFF"); } @@ -83,22 +90,59 @@ void ColorDB::load() mLoaded = true; } +void ColorDB::loadColorLists() +{ + XML::Document *doc = new XML::Document("itemcolors.xml"); + xmlNodePtr root = doc->rootNode(); + if (!root) + return; + + for_each_xml_child_node(node, root) + { + if (xmlStrEqual(node->name, BAD_CAST "list")) + { + std::string name = XML::getProperty(node, "name", ""); + if (name.empty()) + continue; + + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + colors = it->second; + + for_each_xml_child_node(colorNode, node) + { + if (xmlStrEqual(colorNode->name, BAD_CAST "color")) + { + ItemColor c(XML::getProperty(colorNode, "id", -1), + XML::getProperty(colorNode, "name", ""), + XML::getProperty(colorNode, "value", "")); + if (c.id > -1) + colors[c.id] = c; + } + } + mColorLists[name] = colors; + } + } +} + void ColorDB::unload() { logger->log1("Unloading color database..."); - mColors.clear(); + mHairColors.clear(); mLoaded = false; } -std::string &ColorDB::get(int id) +std::string &ColorDB::getHairColor(int id) { if (!mLoaded) load(); - ColorIterator i = mColors.find(id); + ColorIterator i = mHairColors.find(id); - if (i == mColors.end()) + if (i == mHairColors.end()) { logger->log("ColorDB: Error, unknown dye ID# %d", id); return mFail; @@ -109,7 +153,17 @@ std::string &ColorDB::get(int id) } } -int ColorDB::size() +int ColorDB::getHairSize() { - return static_cast(mColors.size()); + return static_cast(mHairColors.size()); +} + +std::map *ColorDB::getColorsList(std::string name) +{ + std::map colors; + ColorListsIterator it = mColorLists.find(name); + + if (it != mColorLists.end()) + return &it->second; + return 0; } diff --git a/src/resources/colordb.h b/src/resources/colordb.h index 72d34afe8..fb0da0036 100644 --- a/src/resources/colordb.h +++ b/src/resources/colordb.h @@ -29,23 +29,51 @@ */ namespace ColorDB { + class ItemColor + { + public: + ItemColor() + { } + ItemColor(int id, std::string name, std::string color) + { + this->id = id; + this->name = name; + this->color = color; + } + + int id; + std::string name; + std::string color; + }; + /** * Loads the color data from colors.xml. */ void load(); + /** + * Loads the color data from colors.xml. + */ + void loadHair(); + + void loadColorLists(); + /** * Clear the color data */ void unload(); - std::string &get(int id); + std::string &getHairColor(int id); + + int getHairSize(); - int size(); + std::map *getColorsList(std::string name); // Color DB typedef std::map Colors; typedef Colors::iterator ColorIterator; + typedef std::map > ColorLists; + typedef ColorLists::iterator ColorListsIterator; } #endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 418bfb848..d515495de 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -207,6 +207,7 @@ void ItemDB::load() std::string drawBefore = XML::getProperty(node, "drawBefore", ""); std::string drawAfter = XML::getProperty(node, "drawAfter", ""); std::string removeSprite = XML::getProperty(node, "removeSprite", ""); + std::string colors = XML::getProperty(node, "colors", ""); std::string tags[3]; tags[0] = XML::getProperty(node, "tag", @@ -266,6 +267,7 @@ void ItemDB::load() itemInfo->setDrawBefore(parseSpriteName(drawBefore)); itemInfo->setDrawAfter(parseSpriteName(drawAfter)); itemInfo->setDrawPriority(drawPriority); + itemInfo->setColorsList(colors); std::string effect; for (int i = 0; i < int(sizeof(fields) / sizeof(fields[0])); ++i) diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 49aadc23d..990c78f45 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -82,30 +82,28 @@ std::map &ItemInfo::addReplaceSprite(int sprite) return it->second; } -std::string ItemInfo::getDyeString(int color) const +void ItemInfo::setColorsList(std::string name) { - if (mId == 1172) + if (name.empty()) { - if (color == 1) - return "W:#115511,22aa22,99dd99;R:#547000,a5dc00,d1ff46"; - if (color == 0) - return "W:#547000,a5dc00,d1ff46;R:#115511,22aa22,99dd99"; - if (color == 3) - return "W:#ffffff,000000,000000;R:#333333,333333,333333"; + mColors = 0; + mColorList = ""; + } + else + { + mColors = ColorDB::getColorsList(name); + mColorList = name; } - return ""; } std::string ItemInfo::getDyeColorsString(int color) const { - if (mId == 1172) - { - if (color == 1) - return "#115511,22aa22,99dd99;#547000,a5dc00,d1ff46"; - if (color == 0) - return "#547000,a5dc00,d1ff46;#115511,22aa22,99dd99"; - if (color == 3) - return "#ffffff,000000,000000;#333333,333333,333333"; - } - return ""; + if (!mColors || mColorList.empty()) + return ""; + + std::map ::iterator it = mColors->find(color); + if (it == mColors->end()) + return ""; + + return it->second.color; } \ No newline at end of file diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 3b72c7830..297c1b036 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -25,6 +25,7 @@ #include "being.h" +#include "resources/colordb.h" #include "resources/spritedef.h" #include @@ -111,7 +112,9 @@ class ItemInfo mDrawPriority(0), mIsRemoveSprites(false), mAttackAction(SpriteAction::INVALID), - mAttackRange(0) + mAttackRange(0), + mColors(0), + mColorList("") { } @@ -235,6 +238,11 @@ class ItemInfo std::string getDyeColorsString(int color) const; + void setColorsList(std::string name); + + bool isHaveColors() + { return !mColorList.empty(); } + protected: SpriteDisplay mDisplay; /**< Display info (like icon) */ std::string mName; @@ -269,6 +277,8 @@ class ItemInfo /** Stores the names of sounds to be played at certain event. */ std::map < EquipmentSoundEvent, std::vector > mSounds; std::map mTags; + std::map *mColors; + std::string mColorList; }; #endif diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index 835f9ce00..63924eb78 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -388,6 +388,19 @@ std::list splitToIntList(const std::string &text, char separator) return tokens; } + +std::list splitToStringList(const std::string &text, + char separator) +{ + std::list tokens; + std::stringstream ss(text); + std::string item; + while(std::getline(ss, item, separator)) + tokens.push_back(item); + + return tokens; +} + std::string combineDye(std::string file, std::string dye) { if (dye.empty()) @@ -397,3 +410,31 @@ std::string combineDye(std::string file, std::string dye) return file.substr(0, pos) + "|" + dye; return file + "|" + dye; } + +std::string combineDye2(std::string file, std::string dye) +{ + if (dye.empty()) + return file; + + size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + { + std::string dye1 = file.substr(pos + 1); + std::string str = ""; + file = file.substr(0, pos); + std::list list1 = splitToStringList(dye1, ';'); + std::list list2 = splitToStringList(dye, ';'); + std::list::iterator it1, it1_end = list1.end(); + std::list::iterator it2, it2_end = list2.end(); + for (it1 = list1.begin(), it2 = list2.begin(); + it1 != it1_end && it2 != it2_end; ++it1, ++it2) + { + str += (*it1) + ":" + (*it2) + ";"; + } + return file + "|" + str; + } + else + { + return file; + } +} diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index 52b47e6a2..02c25eddb 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -170,6 +170,11 @@ std::set splitToIntSet(const std::string &text, char separator); std::list splitToIntList(const std::string &text, char separator); +std::list splitToStringList(const std::string &text, + char separator); + std::string combineDye(std::string file, std::string dye); +std::string combineDye2(std::string file, std::string dye); + #endif // UTILS_STRINGUTILS_H -- cgit v1.2.3-70-g09d2