summaryrefslogtreecommitdiff
path: root/src/flooritem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/flooritem.cpp')
-rw-r--r--src/flooritem.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/flooritem.cpp b/src/flooritem.cpp
new file mode 100644
index 000000000..b669bece3
--- /dev/null
+++ b/src/flooritem.cpp
@@ -0,0 +1,133 @@
+/*
+ * The Mana Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ *
+ * This file is part of The Mana 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 "flooritem.h"
+
+#include "client.h"
+#include "graphics.h"
+#include "item.h"
+#include "map.h"
+#include "configuration.h"
+
+#include "gui/gui.h"
+#include "gui/truetypefont.h"
+
+#include "net/net.h"
+
+#include "resources/itemdb.h"
+#include "resources/iteminfo.h"
+
+FloorItem::FloorItem(int id,
+ int itemId,
+ int x,
+ int y,
+ Map *map,
+ int amount):
+ ActorSprite(id),
+ mItemId(itemId),
+ mX(x),
+ mY(y),
+ mMap(map),
+// mAlpha(1.0f),
+ mAmount(amount),
+ mPickupCount(0)
+{
+ mDropTime = cur_time;
+
+ setMap(map);
+ if (map)
+ {
+ // TODO: Eventually, we probably should fix all sprite offsets so that
+ // these translations aren't necessary anymore. The sprites know
+ // best where their base point should be.
+ mPos.x = static_cast<float>(x * map->getTileWidth() + 16);
+ mPos.y = static_cast<float>(y * map->getTileHeight() +
+ ((Net::getNetworkType() == ServerInfo::MANASERV) ? 15 : 32));
+ }
+ else
+ {
+ mPos.x = 0;
+ mPos.y = 0;
+ }
+
+ setupSpriteDisplay(ItemDB::get(itemId).getDisplay());
+}
+
+const ItemInfo &FloorItem::getInfo() const
+{
+ return ItemDB::get(mItemId);
+}
+
+bool FloorItem::draw(Graphics *graphics, int offsetX, int offsetY) const
+{
+ if (!mMap)
+ return false;
+
+ const int dx = 32;
+ const int dy = 32;
+
+ const int x = mX * mMap->getTileWidth() + offsetX;
+ const int y = mY * mMap->getTileHeight() + offsetY;
+ gcn::Font *font = 0;
+ const bool highl = config.getBoolValue("floorItemsHighlight");
+
+ if (highl)
+ {
+ int curTime = cur_time;
+ font = gui->getFont();
+ if (mDropTime < curTime)
+ {
+ if (curTime > mDropTime + 28 && curTime < mDropTime + 50)
+ {
+ graphics->setColor(gcn::Color(80, 200, 20, 200));
+ graphics->fillRectangle(gcn::Rectangle(
+ x, y, dx, dy));
+ }
+ else if (curTime > mDropTime + 19
+ && curTime < mDropTime + 28)
+ {
+ graphics->setColor(gcn::Color(200, 80, 20,
+ 80 + 10 * (curTime - mDropTime - 18)));
+ graphics->fillRectangle(gcn::Rectangle(
+ x, y, dx, dy));
+ }
+ else if (curTime > mDropTime && curTime < mDropTime + 20)
+ {
+ graphics->setColor(gcn::Color(20, 20, 255,
+ 7 * (curTime - mDropTime)));
+ graphics->fillRectangle(gcn::Rectangle(
+ x, y, dx, dy));
+ }
+ }
+ }
+
+ const bool res = ActorSprite::draw(graphics, offsetX, offsetY);
+
+ if (highl)
+ {
+ if (font && mAmount > 1)
+ {
+ graphics->setColor(gcn::Color(255, 255, 255, 100));
+ font->drawString(graphics, toString(mAmount), x, y);
+ }
+ }
+ return res;
+}