diff options
Diffstat (limited to 'src/gui/minimap.cpp')
-rw-r--r-- | src/gui/minimap.cpp | 120 |
1 files changed, 97 insertions, 23 deletions
diff --git a/src/gui/minimap.cpp b/src/gui/minimap.cpp index f7749755..4347c9cc 100644 --- a/src/gui/minimap.cpp +++ b/src/gui/minimap.cpp @@ -1,28 +1,31 @@ /* * The Mana World - * Copyright 2004-2005 The Mana World Development Team + * Copyright (C) 2004-2005 The Mana World Development Team * * This file is part of The Mana World. * - * The Mana World is free software; you can redistribute it and/or modify + * 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. * - * The Mana World is distributed in the hope that it will be useful, + * 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 The Mana World; if not, write to the Free Software + * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <guichan/font.hpp> + #include "minimap.h" #include "../being.h" #include "../beingmanager.h" +#include "../configuration.h" #include "../graphics.h" #include "../localplayer.h" @@ -30,22 +33,27 @@ #include "../utils/gettext.h" +bool Minimap::mShow = true; + Minimap::Minimap(): Window(_("MiniMap")), - mMapImage(NULL) + mMapImage(NULL), + mProportion(0.5) { setWindowName("MiniMap"); + mShow = config.getValue(getWindowName() + "Show", true); setDefaultSize(5, 25, 100, 100); + setResizable(true); + loadWindowState(); - // LEEOR: The Window class needs to modified to accept - // setAlignment calls. - setAlignment(gcn::Graphics::CENTER); } Minimap::~Minimap() { if (mMapImage) mMapImage->decRef(); + + config.setValue(getWindowName() + "Show", mShow); } void Minimap::setMapImage(Image *img) @@ -55,30 +63,94 @@ void Minimap::setMapImage(Image *img) mMapImage = img; - if (mMapImage) { - mMapImage->setAlpha(0.7); - setContentSize(mMapImage->getWidth(), mMapImage->getHeight()); + if (mMapImage) + { + const int offsetX = 2 * getPadding(); + const int offsetY = getTitleBarHeight() + getPadding(); + const int titleWidth = getFont()->getWidth(getCaption()) + 15; + const int mapWidth = mMapImage->getWidth() < 100 ? + mMapImage->getWidth() + offsetX : 100; + const int mapHeight = mMapImage->getHeight() < 100 ? + mMapImage->getHeight() + offsetY : 100; + + setMinWidth(mapWidth > titleWidth ? mapWidth : titleWidth); + setMinHeight(mapHeight); + setMaxWidth(mMapImage->getWidth() > titleWidth ? + mMapImage->getWidth() + offsetX : titleWidth); + setMaxHeight(mMapImage->getHeight() + offsetY); + + // Make sure the window is within the minimum and maximum boundaries + // TODO: Shouldn't this be happening automatically within the Window + // class? + if (getMinWidth() > getWidth()) + setWidth(getMinWidth()); + else if (getMaxWidth() < getWidth()) + setWidth(getMaxWidth()); + if (getMinHeight() > getHeight()) + setHeight(getMinHeight()); + else if (getMaxHeight() < getHeight()) + setHeight(getMaxHeight()); + + setContentSize(getWidth() - offsetX, getHeight() - offsetY); + setDefaultSize(getX(), getY(), getWidth(), getHeight()); + resetToDefaultSize(); + + setVisible(mShow); } + else + { + setVisible(false); + } +} + +void Minimap::toggle() +{ + mShow = !mShow; } void Minimap::draw(gcn::Graphics *graphics) { + setVisible(mShow); + Window::draw(graphics); + if (!mShow) + return; + const gcn::Rectangle a = getChildrenArea(); - int mapOriginX = a.x; - int mapOriginY = a.y; + graphics->pushClipArea(a); + + int mapOriginX = 0; + int mapOriginY = 0; if (mMapImage) { if (mMapImage->getWidth() > a.width || mMapImage->getHeight() > a.height) { - const Vector &pos = player_node->getPosition(); - mapOriginX += (a.width - (int) (pos.x / 32)) / 2; - mapOriginY += (a.height - (int) (pos.y / 32)) / 2; +#ifdef TMWSERV_SUPPORT + const Vector &p = player_node->getPosition(); + mapOriginX = (int) (((a.width) / 2) - (int) (p.x * mProportion) / 32); + mapOriginY = (int) (((a.height) / 2) - (int) (p.y * mProportion) / 32); +#else + mapOriginX = (int) (((a.width) / 2) - (player_node->mX * mProportion)); + mapOriginY = (int) (((a.height) / 2) - (player_node->mY * mProportion)); +#endif + + const int minOriginX = a.width - mMapImage->getWidth(); + const int minOriginY = a.height - mMapImage->getHeight(); + + if (mapOriginX < minOriginX) + mapOriginX = minOriginX; + if (mapOriginY < minOriginY) + mapOriginY = minOriginY; + if (mapOriginX > 0) + mapOriginX = 0; + if (mapOriginY > 0) + mapOriginY = 0; } + static_cast<Graphics*>(graphics)-> drawImage(mMapImage, mapOriginX, mapOriginY); } @@ -102,24 +174,26 @@ void Minimap::draw(gcn::Graphics *graphics) graphics->setColor(gcn::Color(61, 52, 209)); break; - case Being::NPC: - graphics->setColor(gcn::Color(255, 255, 0)); - break; - case Being::MONSTER: graphics->setColor(gcn::Color(209, 52, 61)); break; + case Being::NPC: + graphics->setColor(gcn::Color(255, 255, 0)); + break; + default: continue; } - const int offset = (dotSize - 1) / 2; + const int offset = (int) ((dotSize - 1) * mProportion); const Vector &pos = being->getPosition(); graphics->fillRectangle(gcn::Rectangle( - (int) pos.x / 64 + mapOriginX - offset, - (int) pos.x / 64 + mapOriginY - offset, + (int) (pos.x * mProportion) / 32 + mapOriginX - offset, + (int) (pos.x * mProportion) / 32 + mapOriginY - offset, dotSize, dotSize)); } + + graphics->popClipArea(); } |