diff options
Diffstat (limited to 'src/being/flooritem.cpp')
-rw-r--r-- | src/being/flooritem.cpp | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/being/flooritem.cpp b/src/being/flooritem.cpp new file mode 100644 index 000000000..5a6c00005 --- /dev/null +++ b/src/being/flooritem.cpp @@ -0,0 +1,199 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "being/flooritem.h" + +#include "configuration.h" + +#include "render/graphics.h" + +#include "gui/gui.h" +#include "gui/userpalette.h" + +#include "gui/fonts/font.h" + +#include "resources/iteminfo.h" + +#include "resources/item/item.h" + +#include "resources/map/map.h" + +#include "net/serverfeatures.h" + +#include "debug.h" + +extern volatile int cur_time; + +FloorItem::FloorItem(const BeingId id, + const int itemId, + const int x, const int y, + const int itemType, + const int amount, + const int refine, + const ItemColor color, + const Identified identified, + const Damaged damaged, + const int *const cards) : + ActorSprite(id), + mCards(), + mItemId(itemId), + mX(x), + mY(y), + mDropTime(cur_time), + mAmount(amount), + mRefine(refine), + mHeightPosDiff(0), + mItemType(itemType), + mPickupCount(0), + mCursor(Cursor::CURSOR_PICKUP), + mColor(color), + mIdentified(identified), + mDamaged(damaged), + mShowMsg(true), + mHighlight(config.getBoolValue("floorItemsHighlight")) +{ + setCards(cards, maxCards); +} + +void FloorItem::postInit(Map *const map, int subX, int subY) +{ + setMap(map); + const ItemInfo &info = ItemDB::get(mItemId); + if (map) + { + const int max = info.getMaxFloorOffset(); + if (subX > max) + subX = max; + else if (subX < -max) + subX = -max; + if (subY > max) + subY = max; + else if (subY < -max) + subY = -max; + mHeightPosDiff = map->getHeightOffset(mX, mY) * 16; + mPos.x = static_cast<float>(mX * map->getTileWidth() + + subX + mapTileSize / 2 - 8); + mPos.y = static_cast<float>(mY * map->getTileHeight() + + subY + mapTileSize - 8 - mHeightPosDiff); + mYDiff = 31 - mHeightPosDiff; + } + else + { + mPos.x = 0; + mPos.y = 0; + mYDiff = 31; + } + + mCursor = info.getPickupCursor(); + setupSpriteDisplay(info.getDisplay(), + ForceDisplay_true, + 1, + info.getDyeIconColorsString(mColor)); +} + +void FloorItem::setCards(const int *const cards, + int sz) +{ + if (sz < 0 || !cards) + return; + if (sz > maxCards) + sz = maxCards; + for (int f = 0; f < sz; f ++) + mCards[f] = cards[f]; +} + +const ItemInfo &FloorItem::getInfo() const +{ + return ItemDB::get(mItemId); +} + +std::string FloorItem::getName() const +{ + const ItemInfo &info = ItemDB::get(mItemId); + if (serverFeatures->haveItemColors()) + return info.getName(mColor); + else + return info.getName(); +} + +void FloorItem::draw(Graphics *const graphics, + const int offsetX, const int offsetY) const +{ + if (!mMap) + return; + + BLOCK_START("FloorItem::draw") + const int x = mX * mMap->getTileWidth() + offsetX; + const int y = mY * mMap->getTileHeight() + offsetY - mHeightPosDiff; + Font *font = nullptr; + + if (mHighlight) + { + const int curTime = cur_time; + font = gui->getFont(); + if (mDropTime < curTime) + { + const int dx = mapTileSize; + const int dy = mapTileSize; + + if (curTime > mDropTime + 28 && curTime < mDropTime + 50) + { + graphics->setColor(Color(80, 200, 20, 200)); + graphics->fillRectangle(Rect( + x, y, dx, dy)); + } + else if (curTime > mDropTime + 19 + && curTime < mDropTime + 28) + { + graphics->setColor(Color(200, 80, 20, + 80 + 10 * (curTime - mDropTime - 18))); + graphics->fillRectangle(Rect( + x, y, dx, dy)); + } + else if (curTime > mDropTime && curTime < mDropTime + 20) + { + graphics->setColor(Color(20, 20, 255, + 7 * (curTime - mDropTime))); + graphics->fillRectangle(Rect(x, y, dx, dy)); + } + } + } + + const int px = getActorX() + offsetX; + const int py = getActorY() + offsetY; + ActorSprite::draw1(graphics, px, py); + CompoundSprite::draw(graphics, px, py); + + if (mHighlight) + { + if (font && mAmount > 1) + { + const Color &color = userPalette->getColor( + UserColorId::FLOOR_ITEM_TEXT); + font->drawString(graphics, + color, color, + toString(mAmount), + x, y); + } + } + BLOCK_END("FloorItem::draw") +} |