summaryrefslogtreecommitdiff
path: root/src/being/flooritem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/being/flooritem.cpp')
-rw-r--r--src/being/flooritem.cpp199
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")
+}