summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/buy.cpp4
-rw-r--r--src/gui/char_select.cpp51
-rw-r--r--src/gui/char_select.h11
-rw-r--r--src/gui/confirm_dialog.cpp1
-rw-r--r--src/gui/confirm_dialog.h2
-rw-r--r--src/gui/debugwindow.cpp10
-rw-r--r--src/gui/gui.cpp152
-rw-r--r--src/gui/gui.h38
-rw-r--r--src/gui/inventorywindow.cpp3
-rw-r--r--src/gui/item_amount.cpp3
-rw-r--r--src/gui/login.cpp1
-rw-r--r--src/gui/ok_dialog.cpp1
-rw-r--r--src/gui/ok_dialog.h2
-rw-r--r--src/gui/passwordfield.h4
-rw-r--r--src/gui/playerbox.cpp37
-rw-r--r--src/gui/playerbox.h24
-rw-r--r--src/gui/popupmenu.cpp4
-rw-r--r--src/gui/register.cpp1
-rw-r--r--src/gui/sell.cpp5
-rw-r--r--src/gui/serverdialog.cpp1
-rw-r--r--src/gui/serverdialog.h2
-rw-r--r--src/gui/setup_joystick.cpp2
-rw-r--r--src/gui/shop.cpp6
-rw-r--r--src/gui/textfield.h1
-rw-r--r--src/gui/trade.cpp36
-rw-r--r--src/gui/updatewindow.cpp2
-rw-r--r--src/gui/viewport.cpp392
-rw-r--r--src/gui/viewport.h145
-rw-r--r--src/gui/window.cpp3
-rw-r--r--src/gui/window.h3
-rw-r--r--src/gui/windowcontainer.h3
31 files changed, 671 insertions, 279 deletions
diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp
index b681b683..9fcf752b 100644
--- a/src/gui/buy.cpp
+++ b/src/gui/buy.cpp
@@ -32,7 +32,7 @@
#include "../npc.h"
-#include "../resources/itemmanager.h"
+#include "../resources/itemdb.h"
#include "../utils/tostring.h"
@@ -266,7 +266,7 @@ void BuyDialog::selectionChanged(const SelectionEvent &event)
if (selectedItem > -1)
{
const ItemInfo &info =
- itemDb->getItemInfo(mShopItems->at(selectedItem).id);
+ ItemDB::get(mShopItems->at(selectedItem).id);
mItemDescLabel->setCaption("Description: " + info.getDescription());
mItemEffectLabel->setCaption("Effect: " + info.getEffect());
diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp
index d825db31..3cb42078 100644
--- a/src/gui/char_select.cpp
+++ b/src/gui/char_select.cpp
@@ -83,7 +83,7 @@ CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo):
mNameLabel = new gcn::Label("Name");
mLevelLabel = new gcn::Label("Level");
mMoneyLabel = new gcn::Label("Money");
- mPlayerBox = new PlayerBox(0);
+ mPlayerBox = new PlayerBox();
int w = 195;
int h = 220;
@@ -116,8 +116,9 @@ CharSelectDialog::CharSelectDialog(LockedArray<LocalPlayer*> *charInfo):
add(mLevelLabel);
add(mMoneyLabel);
- mSelectButton->requestFocus();
setLocationRelativeTo(getParent());
+ setVisible(true);
+ mSelectButton->requestFocus();
updatePlayerInfo();
}
@@ -171,7 +172,8 @@ void CharSelectDialog::updatePlayerInfo()
{
LocalPlayer *pi = mCharInfo->getEntry();
- if (pi) {
+ if (pi)
+ {
mNameLabel->setCaption(pi->getName());
mLevelLabel->setCaption("Lvl: " + toString(pi->mLevel));
mMoneyLabel->setCaption("Money: " + toString(pi->mMoney));
@@ -181,22 +183,17 @@ void CharSelectDialog::updatePlayerInfo()
mDelCharButton->setEnabled(true);
mSelectButton->setEnabled(true);
}
- mPlayerBox->mHairStyle = pi->getHairStyle();
- mPlayerBox->mHairColor = pi->getHairColor();
- mPlayerBox->mSex = pi->getSex();
- mPlayerBox->mShowPlayer = true;
- } else {
+ }
+ else {
mNameLabel->setCaption("Name");
mLevelLabel->setCaption("Level");
mMoneyLabel->setCaption("Money");
mNewCharButton->setEnabled(true);
mDelCharButton->setEnabled(false);
mSelectButton->setEnabled(false);
-
- mPlayerBox->mHairStyle = 0;
- mPlayerBox->mHairColor = 0;
- mPlayerBox->mShowPlayer = false;
}
+
+ mPlayerBox->setPlayer(pi);
}
void CharSelectDialog::attemptCharDelete()
@@ -240,6 +237,10 @@ std::string CharSelectDialog::getName()
CharCreateDialog::CharCreateDialog(Window *parent, int slot):
Window("Create Character", true, parent), mSlot(slot)
{
+ mPlayer = new Player(0, 0, NULL);
+ mPlayer->setHairStyle(rand() % NR_HAIR_STYLES + 1);
+ mPlayer->setHairColor(rand() % NR_HAIR_COLORS + 1);
+
mNameField = new TextField("");
mNameLabel = new gcn::Label("Name:");
mNextHairColorButton = new Button(">", "nextcolor", this);
@@ -250,8 +251,7 @@ CharCreateDialog::CharCreateDialog(Window *parent, int slot):
mHairStyleLabel = new gcn::Label("Hair Style:");
mCreateButton = new Button("Create", "create", this);
mCancelButton = new Button("Cancel", "cancel", this);
- mPlayerBox = new PlayerBox(0);
- mPlayerBox->mShowPlayer = true;
+ mPlayerBox = new PlayerBox(mPlayer);
mNameField->setEventId("create");
@@ -290,6 +290,12 @@ CharCreateDialog::CharCreateDialog(Window *parent, int slot):
add(mCancelButton);
setLocationRelativeTo(getParent());
+ setVisible(true);
+}
+
+CharCreateDialog::~CharCreateDialog()
+{
+ delete mPlayer;
}
void CharCreateDialog::action(const std::string &eventId, gcn::Widget *widget)
@@ -299,7 +305,9 @@ void CharCreateDialog::action(const std::string &eventId, gcn::Widget *widget)
// Attempt to create the character
mCreateButton->setEnabled(false);
Net::AccountServer::Account::createCharacter(
- getName(), mPlayerBox->mHairStyle, mPlayerBox->mHairColor,
+ getName(),
+ mPlayer->getHairStyle(),
+ mPlayer->getHairColor(),
0, // gender
10, // STR
10, // AGI
@@ -318,20 +326,19 @@ void CharCreateDialog::action(const std::string &eventId, gcn::Widget *widget)
scheduleDelete();
}
else if (eventId == "nextcolor") {
- mPlayerBox->mHairColor++;
+ mPlayer->setHairColor(mPlayer->getHairColor() % NR_HAIR_COLORS + 1);
}
else if (eventId == "prevcolor") {
- mPlayerBox->mHairColor += NR_HAIR_COLORS - 1;
+ int prevColor = mPlayer->getHairColor() + NR_HAIR_COLORS - 2;
+ mPlayer->setHairColor(prevColor % NR_HAIR_COLORS + 1);
}
else if (eventId == "nextstyle") {
- mPlayerBox->mHairStyle++;
+ mPlayer->setHairStyle(mPlayer->getHairStyle() % NR_HAIR_STYLES + 1);
}
else if (eventId == "prevstyle") {
- mPlayerBox->mHairStyle += NR_HAIR_STYLES - 1;
+ int prevStyle = mPlayer->getHairStyle() + NR_HAIR_STYLES - 2;
+ mPlayer->setHairStyle(prevStyle % NR_HAIR_STYLES + 1);
}
-
- mPlayerBox->mHairColor %= NR_HAIR_COLORS;
- mPlayerBox->mHairStyle %= NR_HAIR_STYLES;
}
std::string CharCreateDialog::getName()
diff --git a/src/gui/char_select.h b/src/gui/char_select.h
index 6d9d1a83..9d2d77da 100644
--- a/src/gui/char_select.h
+++ b/src/gui/char_select.h
@@ -31,6 +31,7 @@
#include <guichan/actionlistener.hpp>
+class Player;
class LocalPlayer;
class PlayerBox;
@@ -48,7 +49,7 @@ class CharSelectDialog : public Window, public gcn::ActionListener
*/
CharSelectDialog(LockedArray<LocalPlayer*> *charInfo);
- void action(const std::string& eventId, gcn::Widget* widget);
+ void action(const std::string &eventId, gcn::Widget *widget);
void updatePlayerInfo();
@@ -103,7 +104,12 @@ class CharCreateDialog : public Window, public gcn::ActionListener
*/
CharCreateDialog(Window *parent, int slot);
- void action(const std::string& eventId, gcn::Widget* widget);
+ /**
+ * Destructor.
+ */
+ ~CharCreateDialog();
+
+ void action(const std::string &eventId, gcn::Widget *widget);
std::string getName();
@@ -119,6 +125,7 @@ class CharCreateDialog : public Window, public gcn::ActionListener
gcn::Button *mCreateButton;
gcn::Button *mCancelButton;
+ Player *mPlayer;
PlayerBox *mPlayerBox;
int mSlot;
diff --git a/src/gui/confirm_dialog.cpp b/src/gui/confirm_dialog.cpp
index ed2f8680..5a70544f 100644
--- a/src/gui/confirm_dialog.cpp
+++ b/src/gui/confirm_dialog.cpp
@@ -61,6 +61,7 @@ ConfirmDialog::ConfirmDialog(const std::string &title, const std::string &msg,
setLocationRelativeTo(getParent());
getParent()->moveToTop(this);
}
+ setVisible(true);
yesButton->requestFocus();
}
diff --git a/src/gui/confirm_dialog.h b/src/gui/confirm_dialog.h
index 1c206b03..771ecc36 100644
--- a/src/gui/confirm_dialog.h
+++ b/src/gui/confirm_dialog.h
@@ -47,7 +47,7 @@ class ConfirmDialog : public Window, public gcn::ActionListener {
/**
* Called when receiving actions from the widgets.
*/
- void action(const std::string& eventId, gcn::Widget* widget);
+ void action(const std::string &eventId, gcn::Widget *widget);
};
#endif
diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp
index d467d4d3..f8a4154e 100644
--- a/src/gui/debugwindow.cpp
+++ b/src/gui/debugwindow.cpp
@@ -72,15 +72,15 @@ DebugWindow::logic()
// Get the current mouse position
int mouseX, mouseY;
SDL_GetMouseState(&mouseX, &mouseY);
- int mouseTileX = mouseX / 32 + camera_x;
- int mouseTileY = mouseY / 32 + camera_y;
+ //int mouseTileX = mouseX / 32 + camera_x;
+ //int mouseTileY = mouseY / 32 + camera_y;
mFPSLabel->setCaption("[" + toString(fps) + " FPS");
mFPSLabel->adjustSize();
- mTileMouseLabel->setCaption("[Mouse: " +
- toString(mouseTileX) + ", " + toString(mouseTileY) + "]");
- mTileMouseLabel->adjustSize();
+ //mTileMouseLabel->setCaption("[Mouse: " +
+ // toString(mouseTileX) + ", " + toString(mouseTileY) + "]");
+ //mTileMouseLabel->adjustSize();
Map *currentMap = engine->getCurrentMap();
if (currentMap != NULL)
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp
index 38b17781..fb7144a1 100644
--- a/src/gui/gui.cpp
+++ b/src/gui/gui.cpp
@@ -35,22 +35,14 @@
#endif
#include "focushandler.h"
-#include "popupmenu.h"
#include "window.h"
#include "windowcontainer.h"
+#include "viewport.h"
-#include "../being.h"
-#include "../beingmanager.h"
#include "../configlistener.h"
#include "../configuration.h"
-#include "../engine.h"
-#include "../flooritemmanager.h"
#include "../graphics.h"
-#include "../localplayer.h"
#include "../log.h"
-#include "../main.h"
-#include "../map.h"
-#include "../npc.h"
#include "../resources/image.h"
#include "../resources/resourcemanager.h"
@@ -61,7 +53,8 @@
// Guichan stuff
Gui *gui;
-gcn::SDLInput *guiInput; // GUI input
+Viewport *viewport; /**< Viewport on the map. */
+gcn::SDLInput *guiInput; /**< GUI input. */
// Fonts used in showing hits
gcn::Font *hitRedFont;
@@ -91,9 +84,9 @@ class GuiConfigListener : public ConfigListener
Gui::Gui(Graphics *graphics):
mHostImageLoader(NULL),
mMouseCursor(NULL),
- mCustomCursor(false),
- mPopupActive(false)
+ mCustomCursor(false)
{
+ logger->log("Initializing GUI...");
// Set graphics
setGraphics(graphics);
@@ -122,7 +115,6 @@ Gui::Gui(Graphics *graphics):
guiTop->setDimension(gcn::Rectangle(0, 0,
graphics->getWidth(), graphics->getHeight()));
guiTop->setOpaque(false);
- guiTop->addMouseListener(this);
Window::setWindowContainer(guiTop);
setTop(guiTop);
@@ -172,13 +164,15 @@ Gui::Gui(Graphics *graphics):
mConfigListener = new GuiConfigListener(this);
config.addListener("customcursor", mConfigListener);
- mPopup = new PopupMenu();
+ // Create the viewport
+ viewport = new Viewport();
+ viewport->setDimension(gcn::Rectangle(0, 0,
+ graphics->getWidth(), graphics->getHeight()));
+ guiTop->add(viewport);
}
Gui::~Gui()
{
- delete mPopup;
-
config.removeListener("customcursor", mConfigListener);
delete mConfigListener;
@@ -193,6 +187,7 @@ Gui::~Gui()
delete mGuiFont;
delete speechFont;
+ delete viewport;
delete mTop;
delete mImageLoader;
delete mHostImageLoader;
@@ -231,113 +226,6 @@ Gui::draw()
}
void
-Gui::mousePress(int mx, int my, int button)
-{
- // Mouse pressed on window container (basically, the map)
-
- // Are we in-game yet?
- if (state != STATE_GAME)
- return;
-
- // Check if we are alive and kickin'
- if (!player_node || player_node->mAction == Being::DEAD)
- return;
-
- // Check if we are busy
- if (current_npc)
- return;
-
- int tilex = (mx + camera_x) / 32;
- int tiley = (my + camera_y) / 32;
-
- // Right click might open a popup
- if (button == gcn::MouseInput::RIGHT)
- {
- Being *being;
- FloorItem *floorItem;
-
- if ((being = beingManager->findBeing(tilex, tiley)) &&
- being->getType() != Being::LOCALPLAYER)
- {
- showPopup(mx, my, being);
- return;
- }
- else if((floorItem = floorItemManager->findByCoordinates(tilex, tiley)))
- {
- showPopup(mx, my, floorItem);
- return;
- }
- }
-
- // If a popup is active, just remove it
- if (mPopupActive)
- {
- mPopup->setVisible(false);
- mPopupActive = false;
- return;
- }
-
- // Left click can cause different actions
- if (button == gcn::MouseInput::LEFT)
- {
- Being *being;
- FloorItem *item;
-
- // Interact with some being
- if ((being = beingManager->findBeing(tilex, tiley)))
- {
- switch (being->getType())
- {
- case Being::NPC:
- dynamic_cast<NPC*>(being)->talk();
- break;
-
- case Being::MONSTER:
- case Being::PLAYER:
- if (being->mAction == Being::MONSTER_DEAD)
- break;
-
- player_node->attack(being, true);
- break;
-
- default:
- break;
- }
- }
- // Pick up some item
- else if ((item = floorItemManager->findByCoordinates(tilex, tiley)))
- {
- player_node->pickUp(item);
- }
- // Just walk around
- else if (engine->getCurrentMap() &&
- engine->getCurrentMap()->getWalk(tilex, tiley))
- {
- // XXX XXX XXX REALLY UGLY!
- Uint8 *keys = SDL_GetKeyState(NULL);
- if (!(keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT]))
- {
- player_node->setDestination(mx + camera_x, my + camera_y);
- player_node->stopAttack();
- }
- }
- }
-
- if (button == gcn::MouseInput::MIDDLE)
- {
- // Find the being nearest to the clicked position
- Being *target = beingManager->findNearestLivingBeing(
- tilex, tiley,
- 20, Being::MONSTER);
-
- if (target)
- {
- player_node->setTarget(target);
- }
- }
-}
-
-void
Gui::setUseCustomCursor(bool customCursor)
{
if (customCursor != mCustomCursor)
@@ -369,21 +257,3 @@ Gui::setUseCustomCursor(bool customCursor)
}
}
}
-
-void Gui::showPopup(int x, int y, Item *item)
-{
- mPopup->showPopup(x, y, item);
- mPopupActive = true;
-}
-
-void Gui::showPopup(int x, int y, FloorItem *floorItem)
-{
- mPopup->showPopup(x, y, floorItem);
- mPopupActive = true;
-}
-
-void Gui::showPopup(int x, int y, Being *being)
-{
- mPopup->showPopup(x, y, being);
- mPopupActive = true;
-}
diff --git a/src/gui/gui.h b/src/gui/gui.h
index c4c47a88..caf27744 100644
--- a/src/gui/gui.h
+++ b/src/gui/gui.h
@@ -25,17 +25,13 @@
#define _TMW_GUI
#include <guichan/gui.hpp>
-#include <guichan/mouselistener.hpp>
#include "../guichanfwd.h"
-class Being;
-class FloorItem;
class GuiConfigListener;
class Graphics;
class Image;
-class Item;
-class PopupMenu;
+class Viewport;
/**
* \defgroup GUI Core GUI related classes (widgets)
@@ -50,7 +46,7 @@ class PopupMenu;
*
* \ingroup GUI
*/
-class Gui : public gcn::Gui, public gcn::MouseListener
+class Gui : public gcn::Gui
{
public:
/**
@@ -77,12 +73,6 @@ class Gui : public gcn::Gui, public gcn::MouseListener
draw();
/**
- * Handles mouse press on map.
- */
- void
- mousePress(int mx, int my, int button);
-
- /**
* Return game font
*/
gcn::Font*
@@ -94,37 +84,17 @@ class Gui : public gcn::Gui, public gcn::MouseListener
void
setUseCustomCursor(bool customCursor);
- /**
- * Shows a popup for an item
- * TODO Find some way to get rid of Item here
- */
- void showPopup(int x, int y, Item *item);
-
- /**
- * Shows a popup for a floor item
- * TODO Find some way to get rid of FloorItem here
- */
- void showPopup(int x, int y, FloorItem *floorItem);
-
- /**
- * Shows a popup for a being
- * TODO Find some way to get rid of Being here
- */
- void showPopup(int x, int y, Being *being);
-
private:
GuiConfigListener *mConfigListener;
gcn::ImageLoader *mHostImageLoader; /**< For loading images in GL */
gcn::ImageLoader *mImageLoader; /**< For loading images */
- gcn::Font *mGuiFont; /**< The global GUI font */
+ gcn::Font *mGuiFont; /**< The global GUI font */
Image *mMouseCursor; /**< Mouse cursor image */
bool mCustomCursor; /**< Show custom cursor */
-
- PopupMenu *mPopup; /**< Popup window */
- bool mPopupActive;
};
extern Gui *gui; /**< The GUI system */
+extern Viewport *viewport; /**< The viewport */
extern gcn::SDLInput *guiInput; /**< GUI input */
/**
diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp
index 452b7c16..7f9ba3b9 100644
--- a/src/gui/inventorywindow.cpp
+++ b/src/gui/inventorywindow.cpp
@@ -34,6 +34,7 @@
#include "item_amount.h"
#include "itemcontainer.h"
#include "scrollarea.h"
+#include "viewport.h"
#include "../item.h"
#include "../localplayer.h"
@@ -169,7 +170,7 @@ void InventoryWindow::mouseClick(int x, int y, int button, int count)
*/
int mx = x + getX();
int my = y + getY();
- gui->showPopup(mx, my, item);
+ viewport->showPopup(mx, my, item);
}
}
diff --git a/src/gui/item_amount.cpp b/src/gui/item_amount.cpp
index 30c899a8..5ebc0213 100644
--- a/src/gui/item_amount.cpp
+++ b/src/gui/item_amount.cpp
@@ -18,7 +18,7 @@
* along with The Mana World; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id $
+ * $Id$
*/
#include "item_amount.h"
@@ -87,6 +87,7 @@ ItemAmountWindow::ItemAmountWindow(int usage, Window *parent, Item *item):
setContentSize(200, 80);
setLocationRelativeTo(getParentWindow());
+ setVisible(true);
}
void ItemAmountWindow::resetAmount()
diff --git a/src/gui/login.cpp b/src/gui/login.cpp
index 1d9b6e1e..b8d4df2b 100644
--- a/src/gui/login.cpp
+++ b/src/gui/login.cpp
@@ -102,6 +102,7 @@ LoginDialog::LoginDialog(LoginData *loginData):
add(mRegisterButton);
setLocationRelativeTo(getParent());
+ setVisible(true);
if (mUserField->getText().empty()) {
mUserField->requestFocus();
diff --git a/src/gui/ok_dialog.cpp b/src/gui/ok_dialog.cpp
index 906fd61f..4f9623d7 100644
--- a/src/gui/ok_dialog.cpp
+++ b/src/gui/ok_dialog.cpp
@@ -51,6 +51,7 @@ OkDialog::OkDialog(const std::string &title, const std::string &msg,
add(okButton);
setLocationRelativeTo(getParent());
+ setVisible(true);
okButton->requestFocus();
}
diff --git a/src/gui/ok_dialog.h b/src/gui/ok_dialog.h
index 06f703cc..8ae08955 100644
--- a/src/gui/ok_dialog.h
+++ b/src/gui/ok_dialog.h
@@ -46,7 +46,7 @@ class OkDialog : public Window, public gcn::ActionListener {
/**
* Called when receiving actions from the widgets.
*/
- void action(const std::string& eventId, gcn::Widget* widget);
+ void action(const std::string &eventId, gcn::Widget *widget);
};
#endif
diff --git a/src/gui/passwordfield.h b/src/gui/passwordfield.h
index 15ca85c9..cae1f92e 100644
--- a/src/gui/passwordfield.h
+++ b/src/gui/passwordfield.h
@@ -21,8 +21,8 @@
* $Id$
*/
-#ifndef __PASSWORDFIELD_H__
-#define __PASSWORDFIELD_H__
+#ifndef _TMW_PASSWORDFIELD_H_
+#define _TMW_PASSWORDFIELD_H_
#include "textfield.h"
diff --git a/src/gui/playerbox.cpp b/src/gui/playerbox.cpp
index 568c3350..5fbe79b7 100644
--- a/src/gui/playerbox.cpp
+++ b/src/gui/playerbox.cpp
@@ -23,7 +23,7 @@
#include "playerbox.h"
-#include "../being.h"
+#include "../player.h"
#include "../graphics.h"
#include "../resources/image.h"
@@ -32,17 +32,11 @@
#include "../utils/dtor.h"
-extern std::vector<Spriteset *> hairset;
-extern Spriteset *playerset[2];
-
int PlayerBox::instances = 0;
ImageRect PlayerBox::background;
-PlayerBox::PlayerBox(unsigned char sex):
- mHairColor(0),
- mHairStyle(0),
- mSex(sex),
- mShowPlayer(false)
+PlayerBox::PlayerBox(const Player *player):
+ mPlayer(player)
{
setBorderSize(2);
@@ -81,29 +75,18 @@ PlayerBox::~PlayerBox()
}
}
-void PlayerBox::draw(gcn::Graphics *graphics)
+void
+PlayerBox::draw(gcn::Graphics *graphics)
{
- if (!mShowPlayer) {
- return;
- }
-
- // Draw character
- dynamic_cast<Graphics*>(graphics)->drawImage(
- playerset[mSex]->get(0), 23, 12);
-
- // Draw his hair
- if (mHairStyle > 0 && mHairColor < NR_HAIR_COLORS &&
- mHairStyle < NR_HAIR_STYLES)
+ if (mPlayer)
{
- int hf = 5 * mHairColor;
- if (hf >= 0 && hf < (int)hairset[mHairStyle]->size()) {
- dynamic_cast<Graphics*>(graphics)->drawImage(
- hairset[mHairStyle - 1]->get(hf), 35, 7);
- }
+ // Draw character
+ mPlayer->draw(dynamic_cast<Graphics*>(graphics), 40, 42);
}
}
-void PlayerBox::drawBorder(gcn::Graphics *graphics)
+void
+PlayerBox::drawBorder(gcn::Graphics *graphics)
{
int w, h, bs;
bs = getBorderSize();
diff --git a/src/gui/playerbox.h b/src/gui/playerbox.h
index ec04eaf6..6bba1b51 100644
--- a/src/gui/playerbox.h
+++ b/src/gui/playerbox.h
@@ -27,10 +27,10 @@
#include <guichan/widgets/scrollarea.hpp>
class ImageRect;
+class Player;
/**
- * A box showing a player. Draws the various hair styles a player can have
- * currently.
+ * A box showing a player character.
*
* \ingroup GUI
*/
@@ -38,9 +38,10 @@ class PlayerBox : public gcn::ScrollArea
{
public:
/**
- * Constructor.
+ * Constructor. Takes the initial player character that this box should
+ * display, which defaults to <code>NULL</code>.
*/
- PlayerBox(unsigned char sex);
+ PlayerBox(const Player *player = NULL);
/**
* Destructor.
@@ -48,6 +49,14 @@ class PlayerBox : public gcn::ScrollArea
~PlayerBox();
/**
+ * Sets a new player character to be displayed by this box. Setting the
+ * player to <code>NULL</code> causes the box not to draw any
+ * character.
+ */
+ void
+ setPlayer(const Player *player) { mPlayer = player; }
+
+ /**
* Draws the scroll area.
*/
void draw(gcn::Graphics *graphics);
@@ -57,12 +66,9 @@ class PlayerBox : public gcn::ScrollArea
*/
void drawBorder(gcn::Graphics *graphics);
- unsigned char mHairColor; /**< The hair color index */
- unsigned char mHairStyle; /**< The hair style index */
- unsigned char mSex; /**< Sex */
- bool mShowPlayer; /**< Wether to show the player or not */
-
private:
+ const Player *mPlayer; /**< The character used for display */
+
static int instances;
static ImageRect background;
};
diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp
index ab81f7d0..c2959e1d 100644
--- a/src/gui/popupmenu.cpp
+++ b/src/gui/popupmenu.cpp
@@ -40,7 +40,7 @@
#include "../npc.h"
#include "../resources/iteminfo.h"
-#include "../resources/itemmanager.h"
+#include "../resources/itemdb.h"
extern std::string tradePartnerName;
@@ -106,7 +106,7 @@ void PopupMenu::showPopup(int x, int y, FloorItem *floorItem)
mBrowserBox->clearRows();
// Floor item can be picked up (single option, candidate for removal)
- std::string name = itemDb->getItemInfo(mFloorItem->getItemId()).getName();
+ std::string name = ItemDB::get(mFloorItem->getItemId()).getName();
mBrowserBox->addRow("@@pickup|Pick Up " + name + "@@");
//browserBox->addRow("@@look|Look To@@");
diff --git a/src/gui/register.cpp b/src/gui/register.cpp
index 7cef62a2..70cd6dc4 100644
--- a/src/gui/register.cpp
+++ b/src/gui/register.cpp
@@ -97,6 +97,7 @@ RegisterDialog::RegisterDialog(LoginData *loginData):
add(mCancelButton);
setLocationRelativeTo(getParent());
+ setVisible(true);
mUserField->requestFocus();
mUserField->setCaretPosition(mUserField->getText().length());
}
diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp
index fd63633c..499bbd05 100644
--- a/src/gui/sell.cpp
+++ b/src/gui/sell.cpp
@@ -37,7 +37,7 @@
#include "../npc.h"
#include "../resources/iteminfo.h"
-#include "../resources/itemmanager.h"
+#include "../resources/itemdb.h"
#include "../utils/tostring.h"
@@ -232,6 +232,7 @@ void SellDialog::action(const std::string &eventId, gcn::Widget *widget)
mMaxItems -= mAmountItems;
mShopItems->getShop()->at(selectedItem).quantity = mMaxItems;
+ mPlayerMoney += (mAmountItems * mShopItems->at(selectedItem).price);
mAmountItems = 0;
mSlider->setValue(0);
mSlider->setEnabled(mMaxItems != 0);
@@ -274,7 +275,7 @@ void SellDialog::selectionChanged(const SelectionEvent &event)
if (selectedItem > -1)
{
const ItemInfo &info =
- itemDb->getItemInfo(mShopItems->at(selectedItem).id);
+ ItemDB::get(mShopItems->at(selectedItem).id);
mItemDescLabel->setCaption("Description: " + info.getDescription());
mItemEffectLabel->setCaption("Effect: " + info.getEffect());
diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp
index 39abd5ed..bd17bff7 100644
--- a/src/gui/serverdialog.cpp
+++ b/src/gui/serverdialog.cpp
@@ -174,6 +174,7 @@ ServerDialog::ServerDialog(LoginData *loginData):
add(mCancelButton);
setLocationRelativeTo(getParent());
+ setVisible(true);
if (mServerNameField->getText().empty()) {
mServerNameField->requestFocus();
diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h
index 5b265c17..d907f340 100644
--- a/src/gui/serverdialog.h
+++ b/src/gui/serverdialog.h
@@ -132,7 +132,7 @@ class ServerDialog : public Window, public gcn::ActionListener
/**
* Called when receiving actions from the widgets.
*/
- void action(const std::string& eventId, gcn::Widget* widget);
+ void action(const std::string &eventId, gcn::Widget *widget);
private:
gcn::TextField *mServerNameField;
diff --git a/src/gui/setup_joystick.cpp b/src/gui/setup_joystick.cpp
index d9212728..685d88cf 100644
--- a/src/gui/setup_joystick.cpp
+++ b/src/gui/setup_joystick.cpp
@@ -42,7 +42,7 @@ Setup_Joystick::Setup_Joystick():
mCalibrateLabel->setPosition(10, 25);
mCalibrateButton->setPosition(10, 30 + mCalibrateLabel->getHeight());
- mOriginalJoystickEnabled = (joystick ? joystick->isEnabled() : false);
+ mOriginalJoystickEnabled = (int)config.getValue("joystickEnabled", 0) != 0;
mJoystickEnabled->setMarked(mOriginalJoystickEnabled);
mJoystickEnabled->setEventId("joystickEnabled");
diff --git a/src/gui/shop.cpp b/src/gui/shop.cpp
index 3f30732a..2d33e8a8 100644
--- a/src/gui/shop.cpp
+++ b/src/gui/shop.cpp
@@ -23,7 +23,7 @@
#include "shop.h"
#include "../utils/tostring.h"
-#include "../resources/itemmanager.h"
+#include "../resources/itemdb.h"
ShopItems::~ShopItems()
{
@@ -44,11 +44,11 @@ void ShopItems::addItem(short id, int price)
{
ITEM_SHOP item_shop;
- item_shop.name = itemDb->getItemInfo(id).getName()
+ item_shop.name = ItemDB::get(id).getName()
+ " " + toString(price) + " GP";
item_shop.price = price;
item_shop.id = id;
- item_shop.image = itemDb->getItemInfo(id).getImage();
+ item_shop.image = ItemDB::get(id).getImage();
mItemsShop.push_back(item_shop);
}
diff --git a/src/gui/textfield.h b/src/gui/textfield.h
index 1ed802d7..4748830c 100644
--- a/src/gui/textfield.h
+++ b/src/gui/textfield.h
@@ -28,7 +28,6 @@
class ImageRect;
-
/**
* A text field.
*
diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp
index 2ac56ae5..82262563 100644
--- a/src/gui/trade.cpp
+++ b/src/gui/trade.cpp
@@ -48,7 +48,7 @@ TradeWindow::TradeWindow():
mPartnerInventory(new Inventory())
{
setWindowName("Trade");
- setDefaultSize(115, 197, 322, 150);
+ setDefaultSize(115, 197, 332, 209);
mAddButton = new Button("Add", "add", this);
mOkButton = new Button("Ok", "ok", this);
@@ -95,33 +95,33 @@ TradeWindow::TradeWindow():
add(mMoneyField);
add(mMoneyLabel);
- mMoneyField->setPosition(8 + 60, getHeight() - 20);
+ gcn::Rectangle area = getChildrenArea();
+ int width = area.width;
+ int height = area.height;
+
+ mMoneyField->setPosition(8 + 60, height - 20);
mMoneyField->setWidth(50);
- mMoneyLabel->setPosition(8 + 60 + 50 + 6, getHeight() - 20);
- mMoneyLabel2->setPosition(8, getHeight() - 20);
+ mMoneyLabel->setPosition(8 + 60 + 50 + 6, height - 20);
+ mMoneyLabel2->setPosition(8, height - 20);
- mCancelButton->setPosition(getWidth() - 54, getHeight() - 49);
- mTradeButton->setPosition(mCancelButton->getX() - 41
- , getHeight() - 49);
- mOkButton->setPosition(mTradeButton->getX() - 24,
- getHeight() - 49);
- mAddButton->setPosition(mOkButton->getX() - 31,
- getHeight() - 49);
+ mCancelButton->setPosition(width - 54, height - 49);
+ mTradeButton->setPosition(mCancelButton->getX() - 41, height - 49);
+ mOkButton->setPosition(mTradeButton->getX() - 24, height - 49);
+ mAddButton->setPosition(mOkButton->getX() - 31, height - 49);
- mMyItemContainer->setSize(getWidth() - 24 - 12 - 1,
- (INVENTORY_SIZE * 24) / (getWidth() / 24) - 1);
- mMyScroll->setSize(getWidth() - 16, (getHeight() - 76) / 2);
+ mMyItemContainer->setSize(width - 24 - 12 - 1,
+ (INVENTORY_SIZE * 24) / (width / 24) - 1);
+ mMyScroll->setSize(width - 16, (height - 76) / 2);
- mPartnerItemContainer->setSize(getWidth() - 24 - 12 - 1,
- (INVENTORY_SIZE * 24) / (getWidth() / 24) - 1);
- mPartnerScroll->setSize(getWidth() - 16, (getHeight() - 76) / 2);
+ mPartnerItemContainer->setSize(width - 24 - 12 - 1,
+ (INVENTORY_SIZE * 24) / (width / 24) - 1);
+ mPartnerScroll->setSize(width - 16, (height - 76) / 2);
mItemNameLabel->setPosition(8,
mPartnerScroll->getY() + mPartnerScroll->getHeight() + 4);
mItemDescriptionLabel->setPosition(8,
mItemNameLabel->getY() + mItemNameLabel->getHeight() + 4);
-
}
TradeWindow::~TradeWindow()
diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp
index c29906a1..73343483 100644
--- a/src/gui/updatewindow.cpp
+++ b/src/gui/updatewindow.cpp
@@ -192,7 +192,7 @@ int UpdaterWindow::updateProgress(void *ptr,
if (progress > 1) progress = 1.0f;
uw->setLabel(
- uw->mCurrentFile + " (" + toString((int)progress * 100) + "%)");
+ uw->mCurrentFile + " (" + toString((int) (progress * 100)) + "%)");
uw->setProgress(progress);
if (state != STATE_UPDATE || uw->mDownloadStatus == UPDATE_ERROR)
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp
new file mode 100644
index 00000000..d0525a2f
--- /dev/null
+++ b/src/gui/viewport.cpp
@@ -0,0 +1,392 @@
+/*
+ * The Mana World
+ * Copyright 2004 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
+ * 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,
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#include "viewport.h"
+
+#include <guichan/sdl/sdlinput.hpp>
+
+#include "gui.h"
+#include "popupmenu.h"
+
+#include "../beingmanager.h"
+#include "../configuration.h"
+#include "../flooritemmanager.h"
+#include "../graphics.h"
+#include "../localplayer.h"
+#include "../map.h"
+#include "../npc.h"
+
+#include "../resources/monsterdb.h"
+
+#include "../utils/tostring.h"
+
+Viewport::Viewport():
+ mMap(0),
+ mViewX(0.0f),
+ mViewY(0.0f),
+ mCameraX(0),
+ mCameraY(0),
+ mShowDebugPath(false),
+ mPopupActive(false)
+{
+ setOpaque(false);
+ addMouseListener(this);
+
+ mScrollLaziness = (int) config.getValue("ScrollLaziness", 32);
+ mScrollRadius = (int) config.getValue("ScrollRadius", 32);
+
+ config.addListener("ScrollLaziness", this);
+ config.addListener("ScrollRadius", this);
+
+ mPopupMenu = new PopupMenu();
+}
+
+Viewport::~Viewport()
+{
+ delete mPopupMenu;
+}
+
+void
+Viewport::setMap(Map *map)
+{
+ mMap = map;
+}
+
+void
+Viewport::draw(gcn::Graphics *gcnGraphics)
+{
+ static int lastTick = tick_time;
+
+ if (!mMap || !player_node)
+ return;
+
+ Graphics *graphics = static_cast<Graphics*>(gcnGraphics);
+
+ // Avoid freaking out when tick_time overflows
+ if (tick_time < lastTick)
+ {
+ lastTick = tick_time;
+ }
+
+ // Calculate viewpoint
+ int midTileX = graphics->getWidth() / 2;
+ int midTileY = graphics->getHeight() / 2;
+
+ int player_x = player_node->mX - midTileX + player_node->getXOffset();
+ int player_y = player_node->mY - midTileY + player_node->getYOffset();
+
+ if (mScrollLaziness < 1)
+ mScrollLaziness = 1; // Avoids division by zero
+
+ // Apply lazy scrolling
+ while (lastTick < tick_time)
+ {
+ if (player_x > mViewX + mScrollRadius)
+ {
+ mViewX += (player_x - mViewX - mScrollRadius) / mScrollLaziness;
+ }
+ if (player_x < mViewX - mScrollRadius)
+ {
+ mViewX += (player_x - mViewX + mScrollRadius) / mScrollLaziness;
+ }
+ if (player_y > mViewY + mScrollRadius)
+ {
+ mViewY += (player_y - mViewY - mScrollRadius) / mScrollLaziness;
+ }
+ if (player_y < mViewY - mScrollRadius)
+ {
+ mViewY += (player_y - mViewY + mScrollRadius) / mScrollLaziness;
+ }
+ lastTick++;
+ }
+
+ // Auto center when player is off screen
+ if ( player_x - mViewX > graphics->getWidth() / 2
+ || mViewX - player_x > graphics->getWidth() / 2
+ || mViewY - player_y > graphics->getHeight() / 2
+ || player_y - mViewY > graphics->getHeight() / 2
+ )
+ {
+ mViewX = player_x;
+ mViewY = player_y;
+ };
+
+ if (mMap) {
+ if (mViewX < 0) {
+ mViewX = 0;
+ }
+ if (mViewY < 0) {
+ mViewY = 0;
+ }
+ if (mViewX > mMap->getWidth() * 32 - midTileX) {
+ mViewX = mMap->getWidth() * 32 - midTileX;
+ }
+ if (mViewY > mMap->getHeight() * 32 - midTileY) {
+ mViewY = mMap->getHeight() * 32 - midTileY;
+ }
+ }
+
+ mCameraX = (int) mViewX;
+ mCameraY = (int) mViewY;
+
+ // Draw tiles and sprites
+ if (mMap)
+ {
+ mMap->draw(graphics, mCameraX, mCameraY, 0);
+ mMap->draw(graphics, mCameraX, mCameraY, 1);
+ mMap->draw(graphics, mCameraX, mCameraY, 2);
+ mMap->drawOverlay(graphics, mViewX, mViewY,
+ (int) config.getValue("OverlayDetail", 2));
+ }
+
+ // Find a path from the player to the mouse, and draw it. This is for debug
+ // purposes.
+ if (mShowDebugPath && mMap)
+ {
+ // Get the current mouse position
+ int mouseX, mouseY;
+ SDL_GetMouseState(&mouseX, &mouseY);
+
+ int mouseTileX = (mouseX + mCameraX) / 32;
+ int mouseTileY = (mouseY + mCameraY) / 32;
+
+ Path debugPath = mMap->findPath(
+ player_node->mX / 32, player_node->mY / 32,
+ mouseTileX, mouseTileY);
+
+ graphics->setColor(gcn::Color(255, 0, 0));
+ for (PathIterator i = debugPath.begin(); i != debugPath.end(); i++)
+ {
+ int squareX = i->x * 32 - mCameraX + 12;
+ int squareY = i->y * 32 - mCameraY + 12;
+
+ graphics->fillRectangle(gcn::Rectangle(squareX, squareY, 8, 8));
+ graphics->drawText(
+ toString(mMap->getMetaTile(i->x, i->y)->Gcost),
+ squareX + 4, squareY + 12, gcn::Graphics::CENTER);
+ }
+ }
+
+ // Draw player nickname, speech, and emotion sprite as needed
+ Beings &beings = beingManager->getAll();
+ for (BeingIterator i = beings.begin(); i != beings.end(); i++)
+ {
+ (*i)->drawSpeech(graphics, -mCameraX, -mCameraY);
+ (*i)->drawName(graphics, -mCameraX, -mCameraY);
+ (*i)->drawEmotion(graphics, -mCameraX, -mCameraY);
+ }
+
+ // Draw target marker if needed
+ Being *target;
+ if ((target = player_node->getTarget()))
+ {
+ graphics->setFont(speechFont);
+ graphics->setColor(gcn::Color(255, 32, 32));
+ int dy = (target->getType() == Being::PLAYER) ? 80 : 42;
+
+ std::string mobName = "";
+
+ if (target->mJob >= 1002)
+ {
+ int mobId = target->mJob - 1002;
+ mobName = MonsterDB::get(mobId).getName();
+
+ graphics->drawText(mobName,
+ target->getPixelX() - mCameraX + 15,
+ target->getPixelY() - mCameraY - dy,
+ gcn::Graphics::CENTER);
+ }
+ }
+
+ // Draw contained widgets
+ WindowContainer::draw(gcnGraphics);
+}
+
+void
+Viewport::logic()
+{
+ WindowContainer::logic();
+
+ if (!mMap || !player_node)
+ return;
+
+ int mouseX, mouseY;
+ Uint8 button = SDL_GetMouseState(&mouseX, &mouseY);
+
+ if (mPlayerFollowMouse && button & SDL_BUTTON(1) &&
+ mWalkTime != player_node->mWalkTime)
+ {
+ player_node->setDestination(mouseX + mCameraX,
+ mouseY + mCameraY);
+ mWalkTime = player_node->mWalkTime;
+ }
+}
+
+void
+Viewport::mousePress(int mx, int my, int button)
+{
+ // Check if we are alive and kickin'
+ if (!mMap || !player_node || player_node->mAction == Being::DEAD)
+ return;
+
+ // Check if we are busy
+ if (current_npc)
+ return;
+
+ mPlayerFollowMouse = false;
+
+ int tilex = (mx + mCameraX) / 32;
+ int tiley = (my + mCameraY) / 32;
+
+ // Right click might open a popup
+ if (button == gcn::MouseInput::RIGHT)
+ {
+ Being *being;
+ FloorItem *floorItem;
+
+ if ((being = beingManager->findBeing(tilex, tiley)) &&
+ being->getType() != Being::LOCALPLAYER)
+ {
+ showPopup(mx, my, being);
+ return;
+ }
+ else if((floorItem = floorItemManager->findByCoordinates(tilex, tiley)))
+ {
+ showPopup(mx, my, floorItem);
+ return;
+ }
+ }
+
+ // If a popup is active, just remove it
+ if (mPopupActive)
+ {
+ mPopupMenu->setVisible(false);
+ mPopupActive = false;
+ return;
+ }
+
+ // Left click can cause different actions
+ if (button == gcn::MouseInput::LEFT)
+ {
+ Being *being;
+ FloorItem *item;
+
+ // Interact with some being
+ if ((being = beingManager->findBeing(tilex, tiley)))
+ {
+ switch (being->getType())
+ {
+ case Being::NPC:
+ dynamic_cast<NPC*>(being)->talk();
+ break;
+
+ case Being::MONSTER:
+ case Being::PLAYER:
+ if (being->mAction == Being::DEAD)
+ break;
+
+ player_node->attack(being, true);
+ break;
+
+ default:
+ break;
+ }
+ }
+ // Pick up some item
+ else if ((item = floorItemManager->findByCoordinates(tilex, tiley)))
+ {
+ player_node->pickUp(item);
+ }
+ // Just walk around
+ else if (mMap->getWalk(tilex, tiley))
+ {
+ // XXX XXX XXX REALLY UGLY!
+ Uint8 *keys = SDL_GetKeyState(NULL);
+ if (!(keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT]))
+ {
+ player_node->setDestination(mx + mCameraX, my + mCameraY);
+ player_node->stopAttack();
+ }
+ mPlayerFollowMouse = true;
+ }
+ }
+
+ if (button == gcn::MouseInput::MIDDLE)
+ {
+ // Find the being nearest to the clicked position
+ Being *target = beingManager->findNearestLivingBeing(
+ tilex, tiley,
+ 20, Being::MONSTER);
+
+ if (target)
+ {
+ player_node->setTarget(target);
+ }
+ }
+}
+
+void
+Viewport::mouseMotion(int mx, int my)
+{
+ if (!mMap || !player_node)
+ return;
+
+ if (mPlayerFollowMouse && mWalkTime == player_node->mWalkTime)
+ {
+ player_node->setDestination(mx + mCameraX, my + mCameraY);
+ }
+}
+
+void
+Viewport::mouseRelease(int mx, int my, int button)
+{
+ mPlayerFollowMouse = false;
+}
+
+void
+Viewport::showPopup(int x, int y, Item *item)
+{
+ mPopupMenu->showPopup(x, y, item);
+ mPopupActive = true;
+}
+
+void
+Viewport::showPopup(int x, int y, FloorItem *floorItem)
+{
+ mPopupMenu->showPopup(x, y, floorItem);
+ mPopupActive = true;
+}
+
+void
+Viewport::showPopup(int x, int y, Being *being)
+{
+ mPopupMenu->showPopup(x, y, being);
+ mPopupActive = true;
+}
+
+void
+Viewport::optionChanged(const std::string &name)
+{
+ mScrollLaziness = (int) config.getValue("ScrollLaziness", 32);
+ mScrollRadius = (int) config.getValue("ScrollRadius", 32);
+}
diff --git a/src/gui/viewport.h b/src/gui/viewport.h
new file mode 100644
index 00000000..df78b1da
--- /dev/null
+++ b/src/gui/viewport.h
@@ -0,0 +1,145 @@
+/*
+ * The Mana World
+ * Copyright 2004 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
+ * 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,
+ * 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
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id$
+ */
+
+#ifndef _TMW_VIEWPORT_H_
+#define _TMW_VIEWPORT_H_
+
+#include <guichan/mouselistener.hpp>
+
+#include "windowcontainer.h"
+
+#include "../configlistener.h"
+
+class Map;
+class Being;
+class FloorItem;
+class Item;
+class PopupMenu;
+
+/**
+ * The viewport on the map. Displays the current map and handles mouse input
+ * and the popup menu.
+ *
+ * TODO: This class is planned to be extended to allow floating widgets on top
+ * of it such as NPC messages, which are positioned using map pixel
+ * coordinates.
+ */
+class Viewport : public WindowContainer, public gcn::MouseListener,
+ public ConfigListener
+{
+ public:
+ /**
+ * Constructor.
+ */
+ Viewport();
+
+ /**
+ * Destructor.
+ */
+ ~Viewport();
+
+ /**
+ * Sets the map displayed by the viewport.
+ */
+ void
+ setMap(Map *map);
+
+ /**
+ * Draws the viewport.
+ */
+ void
+ draw(gcn::Graphics *graphics);
+
+ /**
+ * Implements player to keep following mouse.
+ */
+ void
+ logic();
+
+ /**
+ * Toggles whether the path debug graphics are shown
+ */
+ void toggleDebugPath() { mShowDebugPath = !mShowDebugPath; }
+
+ /**
+ * Handles mouse press on map.
+ */
+ void
+ mousePress(int mx, int my, int button);
+
+ /**
+ * Handles mouse move on map
+ */
+ void
+ mouseMotion(int mx, int my);
+
+ /**
+ * Handles mouse button release on map.
+ */
+ void
+ mouseRelease(int mx, int my, int button);
+
+ /**
+ * Shows a popup for an item.
+ * TODO Find some way to get rid of Item here
+ */
+ void showPopup(int x, int y, Item *item);
+
+ /**
+ * A relevant config option changed.
+ */
+ void
+ optionChanged(const std::string &name);
+
+ private:
+ /**
+ * Shows a popup for a floor item.
+ * TODO Find some way to get rid of FloorItem here
+ */
+ void showPopup(int x, int y, FloorItem *floorItem);
+
+ /**
+ * Shows a popup for a being.
+ * TODO Find some way to get rid of Being here
+ */
+ void showPopup(int x, int y, Being *being);
+
+
+ Map *mMap; /**< The current map. */
+
+ int mScrollRadius;
+ int mScrollLaziness;
+ float mViewX; /**< Current viewpoint in pixels. */
+ float mViewY; /**< Current viewpoint in pixels. */
+ int mCameraX;
+ int mCameraY;
+ bool mShowDebugPath; /**< Show a path from player to pointer. */
+
+ bool mPlayerFollowMouse;
+ int mWalkTime;
+
+ PopupMenu *mPopupMenu; /**< Popup menu. */
+ bool mPopupActive;
+};
+
+#endif
diff --git a/src/gui/window.cpp b/src/gui/window.cpp
index 13d42c78..1960d6ca 100644
--- a/src/gui/window.cpp
+++ b/src/gui/window.cpp
@@ -113,6 +113,9 @@ Window::Window(const std::string& caption, bool modal, Window *parent):
{
requestModalFocus();
}
+
+ // Windows are invisible by default
+ setVisible(false);
}
Window::~Window()
diff --git a/src/gui/window.h b/src/gui/window.h
index 51c876e3..158035c0 100644
--- a/src/gui/window.h
+++ b/src/gui/window.h
@@ -36,7 +36,8 @@ class WindowContainer;
/**
- * A window. This window can be dragged around and has a title bar.
+ * A window. This window can be dragged around and has a title bar. Windows are
+ * invisible by default.
*
* \ingroup GUI
*/
diff --git a/src/gui/windowcontainer.h b/src/gui/windowcontainer.h
index b860fa3c..df255f84 100644
--- a/src/gui/windowcontainer.h
+++ b/src/gui/windowcontainer.h
@@ -27,7 +27,8 @@
#include <guichan/widgets/container.hpp>
/**
- * A window container. This container makes draggable windows possible.
+ * A window container. This container adds functionality for more convenient
+ * widget (windows in particular) destruction.
*
* \ingroup GUI
*/