diff options
author | Blue <bluesansdouze@gmail.com> | 2009-05-18 01:19:32 +0200 |
---|---|---|
committer | Blue <bluesansdouze@gmail.com> | 2009-05-18 01:19:32 +0200 |
commit | 7b76f0e8c4c489254d7519e2916b951601423801 (patch) | |
tree | e4430176f02eeec32ebb56b42933b6416e7895df /src | |
parent | 22685431a23b05d66af28abda488d0891b1c0a34 (diff) | |
parent | aaec4d115cd0048bbc4bed3d8b1d33492b2a51fa (diff) | |
download | mana-client-7b76f0e8c4c489254d7519e2916b951601423801.tar.gz mana-client-7b76f0e8c4c489254d7519e2916b951601423801.tar.bz2 mana-client-7b76f0e8c4c489254d7519e2916b951601423801.tar.xz mana-client-7b76f0e8c4c489254d7519e2916b951601423801.zip |
Merge branch 'master' of git@gitorious.org:tmw/mainline
Diffstat (limited to 'src')
37 files changed, 605 insertions, 91 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08110c43..a295f249 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -167,6 +167,8 @@ SET(SRCS gui/npcpostdialog.h gui/okdialog.cpp gui/okdialog.h + gui/outfitwindow.cpp + gui/outfitwindow.h gui/palette.cpp gui/palette.h gui/partywindow.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 47d27ede..a474c963 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -116,6 +116,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ gui/npcpostdialog.h \ gui/okdialog.cpp \ gui/okdialog.h \ + gui/outfitwindow.cpp \ + gui/outfitwindow.h \ gui/palette.cpp \ gui/palette.h \ gui/partywindow.cpp \ diff --git a/src/being.cpp b/src/being.cpp index 2b31e9ec..37cb6987 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -448,7 +448,7 @@ void Being::takeDamage(Being *attacker, int amount, AttackType type) // Show damage number particleEngine->addTextSplashEffect(damage, - mPx + 16, mPy + 16, + mPx, mPy - 16, color, font, true); if (amount > 0) diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp index 462cb3b9..f2fafed4 100644 --- a/src/commandhandler.cpp +++ b/src/commandhandler.cpp @@ -279,9 +279,9 @@ void CommandHandler::handleWhere(const std::string &args, ChatTab *tab) { std::ostringstream where; where << map_path << ", coordinates: " - << (player_node->getPixelX() / 32) << ", " - << ((player_node->getPixelY() / 32) - 1); // Not real sure why we remove 1, - // but it makes it in sync with @where + << ((player_node->getPixelX() - 16) / 32) << ", " + << ((player_node->getPixelY() - 32) / 32); + tab->chatLog(where.str(), BY_SERVER); } diff --git a/src/game.cpp b/src/game.cpp index 59c57607..98985e74 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -57,6 +57,7 @@ #include "gui/ministatus.h" #include "gui/npcdialog.h" #include "gui/okdialog.h" +#include "gui/outfitwindow.h" #include "gui/sdlinput.h" #include "gui/sell.h" #include "gui/setup.h" @@ -138,6 +139,7 @@ HelpWindow *helpWindow; DebugWindow *debugWindow; ShortcutWindow *itemShortcutWindow; ShortcutWindow *emoteShortcutWindow; +OutfitWindow *outfitWindow; BeingManager *beingManager = NULL; FloorItemManager *floorItemManager = NULL; @@ -232,6 +234,7 @@ static void createGuiWindows() new ItemShortcutContainer); emoteShortcutWindow = new ShortcutWindow("EmoteShortcut", new EmoteShortcutContainer); + outfitWindow = new OutfitWindow(); localChatTab = new ChatTab(_("General")); @@ -277,6 +280,7 @@ static void destroyGuiWindows() delete itemShortcutWindow; delete emoteShortcutWindow; delete storageWindow; + delete outfitWindow; } Game::Game(): @@ -606,6 +610,65 @@ void Game::handleInput() } } + if (event.key.keysym.mod & KMOD_RCTRL && !chatWindow->isInputFocused()) + { + switch (event.key.keysym.sym) + { + case SDLK_1: + outfitWindow->wearOutfit(0); + used = true; + break; + + case SDLK_2: + outfitWindow->wearOutfit(1); + used = true; + break; + + case SDLK_3: + outfitWindow->wearOutfit(2); + used = true; + break; + + case SDLK_4: + outfitWindow->wearOutfit(3); + used = true; + break; + + case SDLK_5: + outfitWindow->wearOutfit(4); + used = true; + break; + + case SDLK_6: + outfitWindow->wearOutfit(5); + used = true; + break; + + case SDLK_7: + outfitWindow->wearOutfit(6); + used = true; + break; + + case SDLK_8: + outfitWindow->wearOutfit(7); + used = true; + break; + + case SDLK_9: + outfitWindow->wearOutfit(8); + used = true; + break; + + case SDLK_0: + outfitWindow->wearOutfit(9); + used = true; + break; + + default: + break; + } + } + const int tKey = keyboard.getKeyIndex(event.key.keysym.sym); switch (tKey) { @@ -782,6 +845,9 @@ void Game::handleInput() case KeyboardConfig::KEY_WINDOW_EMOTE_SHORTCUT: requestedWindow = emoteShortcutWindow; break; + case KeyboardConfig::KEY_WINDOW_OUTFIT: + requestedWindow = outfitWindow; + break; case KeyboardConfig::KEY_SCREENSHOT: // Screenshot (picture, hence the p) saveScreenshot(); diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index d6cd3a84..c44ae9e7 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -79,6 +79,7 @@ InventoryWindow::InventoryWindow(int invSize): mUseButton = new Button(longestUseString, "use", this); mDropButton = new Button(_("Drop"), "drop", this); mSplitButton = new Button(_("Split"), "split", this); + mOutfitButton = new Button(_("Outfits"), "outfit", this); mItems = new ItemContainer(player_node->getInventory()); mItems->addSelectionListener(this); @@ -103,6 +104,7 @@ InventoryWindow::InventoryWindow(int invSize): place(0, 2, mUseButton); place(1, 2, mDropButton); place(2, 2, mSplitButton); + place(6, 2, mOutfitButton); Layout &layout = getLayout(); layout.setRowHeight(1, Layout::AUTO_SET); @@ -156,6 +158,16 @@ void InventoryWindow::logic() void InventoryWindow::action(const gcn::ActionEvent &event) { + if (event.getId() == "outfit") + { + extern Window *outfitWindow; + outfitWindow->setVisible(!outfitWindow->isVisible()); + if (outfitWindow->isVisible()) + { + outfitWindow->requestMoveToTop(); + } + } + Item *item = mItems->getSelectedItem(); if (!item) @@ -163,7 +175,7 @@ void InventoryWindow::action(const gcn::ActionEvent &event) if (event.getId() == "use") { - if (item->isEquipment()) + if (item->isEquipment()) { if (item->isEquipped()) Net::getInventoryHandler()->unequipItem(item); @@ -258,10 +270,10 @@ void InventoryWindow::updateButtons() mDropButton->setEnabled(false); return; } - + mUseButton->setEnabled(true); mDropButton->setEnabled(true); - + if (selectedItem->isEquipment()) { if (selectedItem->isEquipped()) diff --git a/src/gui/inventorywindow.h b/src/gui/inventorywindow.h index 6e34666d..fbda5ac7 100644 --- a/src/gui/inventorywindow.h +++ b/src/gui/inventorywindow.h @@ -109,6 +109,7 @@ class InventoryWindow : public Window, gcn::Button *mUseButton; gcn::Button *mDropButton; gcn::Button *mSplitButton; + gcn::Button *mOutfitButton; gcn::Label *mWeightLabel; gcn::Label *mSlotsLabel; diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index 54aa818b..d8ae6e20 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -23,6 +23,7 @@ #include "gui/chat.h" #include "gui/itempopup.h" +#include "gui/outfitwindow.h" #include "gui/palette.h" #include "gui/sdlinput.h" #include "gui/viewport.h" @@ -162,6 +163,7 @@ void ItemContainer::selectNone() { setSelectedIndex(-1); mSelectionStatus = SEL_NONE; + outfitWindow->setItemSelected(-1); } void ItemContainer::setSelectedIndex(int newIndex) @@ -260,6 +262,8 @@ void ItemContainer::mousePressed(gcn::MouseEvent &event) mSelectionStatus = SEL_SELECTING; itemShortcut->setItemSelected(item->getId()); + if (item->isEquipment()) + outfitWindow->setItemSelected(item->getId()); } else { diff --git a/src/gui/outfitwindow.cpp b/src/gui/outfitwindow.cpp new file mode 100644 index 00000000..53950299 --- /dev/null +++ b/src/gui/outfitwindow.cpp @@ -0,0 +1,301 @@ +/* + * The Mana World + * Copyright (C) 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "outfitwindow.h" + +#include "configuration.h" +#include "localplayer.h" +#include "graphics.h" +#include "inventory.h" +#include "equipment.h" +#include "item.h" + +#include "gui/widgets/button.h" +#include "gui/widgets/checkbox.h" +#include "gui/widgets/label.h" +#include "gui/widgets/layout.h" + +#include "net/inventoryhandler.h" +#include "net/net.h" + +#include "resources/image.h" + +#include "utils/gettext.h" +#include "utils/stringutils.h" + +#include <vector> + +OutfitWindow::OutfitWindow(): + Window(_("Outfits")), + mBoxWidth(33), + mBoxHeight(33), + mGridWidth(3), + mGridHeight(3), + mItemClicked(false), + mItemMoved(NULL), + mItemSelected(-1), + mCurrentOutfit(0) +{ + setWindowName("Outfits"); + setCloseButton(true); + setDefaultSize(250, 250, 118, 180); //160 + + mPreviousButton = new Button("<", "previous", this); + mNextButton = new Button(">", "next", this); + mCurrentLabel = new Label("Outfit: 1"); + mCurrentLabel->setAlignment(gcn::Graphics::CENTER); + mUnequipCheck = new CheckBox(_("Unequip first"), + config.getValue("OutfitUnequip", true)); + + place(0, 3, mPreviousButton, 1); + place(1, 3, mCurrentLabel, 2); + place(3, 3, mNextButton, 1); + place(0, 4, mUnequipCheck, 4); + + Layout &layout = getLayout(); + layout.setRowHeight(0, Layout::AUTO_SET); + layout.setColWidth(4, Layout::CENTER); + + loadWindowState(); + + load(); +} + +OutfitWindow::~OutfitWindow() +{ + save(); +} + +void OutfitWindow::load() +{ + memset(mItems, -1, sizeof(mItems)); + for (int o = 0; o < 10; o++) + { + std::string outfit = config.getValue("Outfit" + toString(o), "-1"); + std::string buf; + std::stringstream ss(outfit); + + std::vector<int> tokens; + + while (ss >> buf) { + tokens.push_back(atoi(buf.c_str())); + } + + for (int i = 0; i < (int)tokens.size(); i++) + { + mItems[o][i] = tokens[i]; + } + } +} + +void OutfitWindow::save() +{ + std::string outfitStr; + for (int o = 0; o < 10; o++) + { + for (int i = 0; i < 9; i++) + { + outfitStr += mItems[o][i] ? toString(mItems[o][i]) : toString(-1); + if (i <8) outfitStr += " "; + } + config.setValue("Outfit" + toString(o), outfitStr); + outfitStr = ""; + } + config.setValue("OutfitUnequip", mUnequipCheck->isSelected()); +} + +void OutfitWindow::action(const gcn::ActionEvent &event) +{ + if (event.getId() == "next") + { + if (mCurrentOutfit < 9) { + mCurrentOutfit++; + } else { + mCurrentOutfit = 0; + } + } + else if (event.getId() == "previous") + { + if (mCurrentOutfit > 0) { + mCurrentOutfit--; + } else { + mCurrentOutfit = 9; + } + } + mCurrentLabel->setCaption("Outfit: " + toString(mCurrentOutfit + 1)); +} + +void OutfitWindow::wearOutfit(int outfit) +{ + Item *item; + if (mUnequipCheck->isSelected()) + { + for (int i = 0; i < 11; i++) + { + //non vis is 3,4,7 + if (i != 3 && i != 4 && i != 7) + { + if (!(item = player_node->getInventory()->getItem(player_node + ->mEquipment.get()->getEquipment(i)))) + continue; + Net::getInventoryHandler()->unequipItem(item); + } + } + } + + for (int i = 0; i < 9; i++) + { + item = player_node->getInventory()->findItem(mItems[outfit][i]); + if (item && item->getQuantity()) + { + if (item->isEquipment()) { + Net::getInventoryHandler()->equipItem(item); + } + } + } +} + +void OutfitWindow::draw(gcn::Graphics *graphics) +{ + Window::draw(graphics); + Graphics *g = static_cast<Graphics*>(graphics); + + for (int i = 0; i < 9; i++) + { + const int itemX = 10 + (i % mGridWidth) * mBoxWidth; + const int itemY = 25 + (i / mGridWidth) * mBoxHeight; + + graphics->setColor(gcn::Color(0, 0, 0, 64)); + graphics->drawRectangle(gcn::Rectangle(itemX, itemY, 32, 32)); + graphics->setColor(gcn::Color(255, 255, 255, 32)); + graphics->fillRectangle(gcn::Rectangle(itemX, itemY, 32, 32)); + + if (mItems[mCurrentOutfit][i] < 0) + continue; + + Item *item = + player_node->getInventory()->findItem(mItems[mCurrentOutfit][i]); + if (item) { + // Draw item icon. + Image* image = item->getImage(); + if (image) { + g->drawImage(image, itemX, itemY); + } + } + } + if (mItemMoved) + { + // Draw the item image being dragged by the cursor. + Image* image = mItemMoved->getImage(); + if (image) + { + const int tPosX = mCursorPosX - (image->getWidth() / 2); + const int tPosY = mCursorPosY - (image->getHeight() / 2); + + g->drawImage(image, tPosX, tPosY); + } + } +} + + +void OutfitWindow::mouseDragged(gcn::MouseEvent &event) +{ + Window::mouseDragged(event); + if (event.getButton() == gcn::MouseEvent::LEFT) { + if (!mItemMoved && mItemClicked) { + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + return; + } + const int itemId = mItems[mCurrentOutfit][index]; + if (itemId < 0) + return; + Item *item = player_node->getInventory()->findItem(itemId); + if (item) + { + mItemMoved = item; + mItems[mCurrentOutfit][index] = -1; + } + } + if (mItemMoved) { + mCursorPosX = event.getX(); + mCursorPosY = event.getY(); + } + } +} + +void OutfitWindow::mousePressed(gcn::MouseEvent &event) +{ + Window::mousePressed(event); + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + return; + } + + // Stores the selected item if there is one. + if (isItemSelected()) { + mItems[mCurrentOutfit][index] = mItemSelected; + mItemSelected = -1; + } + else if (mItems[mCurrentOutfit][index]) { + mItemClicked = true; + } +} + +void OutfitWindow::mouseReleased(gcn::MouseEvent &event) +{ + Window::mouseReleased(event); + if (event.getButton() == gcn::MouseEvent::LEFT) + { + if (isItemSelected()) + { + mItemSelected = -1; + } + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + mItemMoved = NULL; + return; + } + if (mItemMoved) { + mItems[mCurrentOutfit][index] = mItemMoved->getId(); + mItemMoved = NULL; + } + if (mItemClicked) { + mItemClicked = false; + } + } +} + +int OutfitWindow::getIndexFromGrid(int pointX, int pointY) const +{ + const gcn::Rectangle tRect = gcn::Rectangle( + 10, 25, 10 + mGridWidth * mBoxWidth, 25 + mGridHeight * mBoxHeight); + if (!tRect.isPointInRect(pointX, pointY)) { + return -1; + } + const int index = (((pointY - 25) / mBoxHeight) * mGridWidth) + + (pointX - 10) / mBoxWidth; + if (index >= 9) + { + return -1; + } + return index; +} diff --git a/src/gui/outfitwindow.h b/src/gui/outfitwindow.h new file mode 100644 index 00000000..3e70815c --- /dev/null +++ b/src/gui/outfitwindow.h @@ -0,0 +1,92 @@ +/* + * The Mana World + * Copyright (C) 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef OUTFITWINDOW_H +#define OUTFITWINDOW_H + +#include "gui/widgets/window.h" + +#include <guichan/actionlistener.hpp> + +class Button; +class CheckBox; +class Item; +class Label; + +class OutfitWindow : public Window, gcn::ActionListener +{ + public: + /** + * Constructor. + */ + OutfitWindow(); + + /** + * Destructor. + */ + ~OutfitWindow(); + + void action(const gcn::ActionEvent &event); + + void draw(gcn::Graphics *graphics); + + void mousePressed(gcn::MouseEvent &event); + + void mouseDragged(gcn::MouseEvent &event); + + void mouseReleased(gcn::MouseEvent &event); + + void load(); + + void setItemSelected(int itemId) + { mItemSelected = itemId; } + + bool isItemSelected() + { return mItemSelected > -1; } + + void wearOutfit(int outfit); + + private: + Button *mPreviousButton; + Button *mNextButton; + Label *mCurrentLabel; + CheckBox *mUnequipCheck; + + int getIndexFromGrid(int pointX, int pointY) const; + + int mBoxWidth; + int mBoxHeight; + int mCursorPosX, mCursorPosY; + int mGridWidth, mGridHeight; + bool mItemClicked; + Item *mItemMoved; + + void save(); + + int mItems[10][9]; + int mItemSelected; + + int mCurrentOutfit; +}; + +extern OutfitWindow *outfitWindow; + +#endif diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp index 996073bd..68e5a371 100644 --- a/src/gui/partywindow.cpp +++ b/src/gui/partywindow.cpp @@ -54,8 +54,8 @@ PartyWindow::PartyWindow() : setSaveVisible(true); setCloseButton(true); setMinWidth(120); - setMinHeight(200); - setDefaultSize(590, 200, 150, 200); + setMinHeight(55); + setDefaultSize(590, 200, 150, 60); loadWindowState(); } @@ -92,9 +92,10 @@ PartyMember *PartyWindow::findOrCreateMember(int id) { member = new PartyMember; mMembers[id] = member; - add(member->avatar, 0, (mMembers.size() - 1) * 14); } + buildLayout(); + return member; } @@ -148,6 +149,8 @@ void PartyWindow::removeMember(int id) void PartyWindow::removeMember(const std::string &name) { removeMember(findMember(name)); + + buildLayout(); } void PartyWindow::updateOnlne(int id, bool online) @@ -225,3 +228,19 @@ void PartyWindow::clearMembers() delete_all(mMembers); mMembers.clear(); } + +void PartyWindow::buildLayout() +{ + clearLayout(); + int lastPos = 0; + + PartyList::iterator it; + PartyMember *member; + + for (it = mMembers.begin(); it != mMembers.end(); it++) + { + member = (*it).second; + add(member->avatar, 0, lastPos); + lastPos += member->avatar->getHeight() + 2; + } +} diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h index 8cea500f..19e611ed 100644 --- a/src/gui/partywindow.h +++ b/src/gui/partywindow.h @@ -125,6 +125,8 @@ class PartyWindow : public Window, gcn::ActionListener */ PartyMember *findOrCreateMember(int id); + void buildLayout(); + typedef std::map<int, PartyMember*> PartyList; PartyList mMembers; std::string mPartyInviter; diff --git a/src/gui/serverselectdialog.cpp b/src/gui/serverselectdialog.cpp index ccdf2bb6..f492ebc7 100644 --- a/src/gui/serverselectdialog.cpp +++ b/src/gui/serverselectdialog.cpp @@ -55,7 +55,7 @@ class ServerListModel : public gcn::ListModel } }; -ServerSelectDialog::ServerSelectDialog(LoginData *loginData, int nextState): +ServerSelectDialog::ServerSelectDialog(LoginData *loginData, State nextState): Window(_("Select Server")), mLoginData(loginData), mNextState(nextState) diff --git a/src/gui/serverselectdialog.h b/src/gui/serverselectdialog.h index b80ad286..fd1484af 100644 --- a/src/gui/serverselectdialog.h +++ b/src/gui/serverselectdialog.h @@ -24,6 +24,8 @@ #include "gui/widgets/window.h" +#include "main.h" + #include <guichan/actionlistener.hpp> #include <guichan/listmodel.hpp> @@ -42,7 +44,7 @@ class ServerSelectDialog : public Window, public gcn::ActionListener { * * @see Window::Window */ - ServerSelectDialog(LoginData *loginData, int nextState); + ServerSelectDialog(LoginData *loginData, State nextState); /** * Destructor. @@ -59,7 +61,7 @@ class ServerSelectDialog : public Window, public gcn::ActionListener { ServerListModel *mServerListModel; gcn::ListBox *mServerList; gcn::Button *mOkButton; - int mNextState; + State mNextState; }; #endif diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index a1765f24..aebcf61b 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -46,6 +46,7 @@ extern Window *inventoryWindow; extern Window *npcTextDialog; extern Window *npcStringDialog; extern Window *skillDialog; +extern Window *partyWindow; extern Window *minimap; extern Window *equipmentWindow; extern Window *tradeWindow; @@ -64,7 +65,7 @@ Setup::Setup(): Window(_("Setup")) { setCloseButton(true); - int width = 340; + int width = 380; int height = 360; setContentSize(width, height); @@ -104,7 +105,7 @@ Setup::Setup(): add(panel); Label *version = new Label(FULL_VERSION); - version->setPosition(5, height - version->getHeight() - 5); + version->setPosition(9, height - version->getHeight() - 9); add(version); center(); @@ -145,6 +146,7 @@ void Setup::action(const gcn::ActionEvent &event) #endif inventoryWindow->resetToDefaultSize(); skillDialog->resetToDefaultSize(); + partyWindow->resetToDefaultSize(); minimap->resetToDefaultSize(); equipmentWindow->resetToDefaultSize(); tradeWindow->resetToDefaultSize(); diff --git a/src/gui/setup_audio.cpp b/src/gui/setup_audio.cpp index 9417ad68..9da74c2e 100644 --- a/src/gui/setup_audio.cpp +++ b/src/gui/setup_audio.cpp @@ -72,7 +72,7 @@ Setup_Audio::Setup_Audio(): place(0, 2, mMusicSlider); place(1, 2, musicLabel); - setDimension(gcn::Rectangle(0, 0, 325, 280)); + setDimension(gcn::Rectangle(0, 0, 365, 280)); } void Setup_Audio::apply() diff --git a/src/gui/setup_colors.cpp b/src/gui/setup_colors.cpp index a0be62cd..efa03ba4 100644 --- a/src/gui/setup_colors.cpp +++ b/src/gui/setup_colors.cpp @@ -176,7 +176,7 @@ Setup_Colors::Setup_Colors() : mGradTypeText->setCaption(""); - setDimension(gcn::Rectangle(0, 0, 325, 280)); + setDimension(gcn::Rectangle(0, 0, 365, 280)); } Setup_Colors::~Setup_Colors() diff --git a/src/gui/setup_joystick.cpp b/src/gui/setup_joystick.cpp index 08a80bf7..f050e334 100644 --- a/src/gui/setup_joystick.cpp +++ b/src/gui/setup_joystick.cpp @@ -55,7 +55,7 @@ Setup_Joystick::Setup_Joystick(): place = h.getPlacer(0, 1); place(0, 0, mCalibrateButton); - setDimension(gcn::Rectangle(0, 0, 325, 75)); + setDimension(gcn::Rectangle(0, 0, 365, 75)); } void Setup_Joystick::action(const gcn::ActionEvent &event) diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp index 0c15a1ee..938c1c4e 100644 --- a/src/gui/setup_keyboard.cpp +++ b/src/gui/setup_keyboard.cpp @@ -98,7 +98,7 @@ Setup_Keyboard::Setup_Keyboard(): place(0, 6, mMakeDefaultButton); place(3, 6, mAssignKeyButton); - setDimension(gcn::Rectangle(0, 0, 325, 280)); + setDimension(gcn::Rectangle(0, 0, 365, 280)); } Setup_Keyboard::~Setup_Keyboard() diff --git a/src/gui/setup_players.cpp b/src/gui/setup_players.cpp index f0d88a30..6372d318 100644 --- a/src/gui/setup_players.cpp +++ b/src/gui/setup_players.cpp @@ -283,15 +283,15 @@ Setup_Players::Setup_Players(): place(0, 0, mPlayerTitleTable, 4); place(0, 1, mPlayerScrollArea, 4, 4).setPadding(2); place(0, 5, mDeleteButton); - place(0, 6, mWhisperTabCheckBox); place(2, 5, ignore_action_label); place(2, 6, mIgnoreActionChoicesBox, 2).setPadding(2); place(2, 7, mDefaultTrading); place(2, 8, mDefaultWhisper); + place(0, 9, mWhisperTabCheckBox, 4).setPadding(4); player_relations.addListener(this); - setDimension(gcn::Rectangle(0, 0, 325, 280)); + setDimension(gcn::Rectangle(0, 0, 365, 280)); } Setup_Players::~Setup_Players() diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp index 1c4043f7..a9c892b2 100644 --- a/src/gui/setup_video.cpp +++ b/src/gui/setup_video.cpp @@ -299,13 +299,13 @@ Setup_Video::Setup_Video(): place(1, 3, mParticleEffectsCheckBox, 3); - place(1, 4, mPickupNotifyLabel, 3); + place(1, 4, mPickupNotifyLabel, 4); place(1, 5, mPickupChatCheckBox, 1); place(2, 5, mPickupParticleCheckBox, 2); place(0, 6, fontSizeLabel, 3); - place(1, 6, mFontSizeDropDown, 3); + place(1, 6, mFontSizeDropDown, 2); place(0, 7, mAlphaSlider); place(1, 7, alphaLabel, 3); @@ -326,7 +326,7 @@ Setup_Video::Setup_Video(): place(1, 11, particleDetailLabel); place(2, 11, mParticleDetailField, 3).setPadding(2); - setDimension(gcn::Rectangle(0, 0, 325, 300)); + setDimension(gcn::Rectangle(0, 0, 365, 300)); } void Setup_Video::apply() diff --git a/src/gui/textrenderer.h b/src/gui/textrenderer.h index 712c1312..c8ff5833 100644 --- a/src/gui/textrenderer.h +++ b/src/gui/textrenderer.h @@ -50,7 +50,7 @@ class TextRenderer if (shadow) { graphics->setColor(guiPalette->getColor(Palette::SHADOW, - alpha / 2)); + alpha / 2)); if (outline) { graphics->drawText(text, x + 2, y + 2, align); diff --git a/src/gui/truetypefont.cpp b/src/gui/truetypefont.cpp index 62a27651..e07adc9f 100644 --- a/src/gui/truetypefont.cpp +++ b/src/gui/truetypefont.cpp @@ -19,12 +19,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <guichan/exception.hpp> +#include "gui/truetypefont.h" -#include "truetypefont.h" +#include "graphics.h" +#include "resources/image.h" -#include "../graphics.h" -#include "../resources/image.h" +#include <guichan/exception.hpp> #define CACHE_SIZE 256 diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index f92a81b8..2c3f4007 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -195,7 +195,7 @@ void Viewport::draw(gcn::Graphics *gcnGraphics) mMap->drawCollision(graphics, (int) mPixelViewX, (int) mPixelViewY); -#if 0 +#if EATHENA_SUPPORT drawDebugPath(graphics); #endif } @@ -265,8 +265,8 @@ void Viewport::drawDebugPath(Graphics *graphics) const Vector &playerPos = player_node->getPosition(); Path debugPath = mMap->findPath( - (int) playerPos.x / 32, - (int) playerPos.y / 32, + (int) (playerPos.x - 16) / 32, + (int) (playerPos.y - 32) / 32, mouseTileX, mouseTileY, 0xFF); drawPath(graphics, debugPath); diff --git a/src/gui/widgets/avatar.cpp b/src/gui/widgets/avatar.cpp index 0bbdc468..16c77233 100644 --- a/src/gui/widgets/avatar.cpp +++ b/src/gui/widgets/avatar.cpp @@ -42,7 +42,6 @@ Avatar::Avatar(): mMaxHp(0) { setOpaque(false); - setSize(250, 12); if (avatarCount == 0) { @@ -54,12 +53,17 @@ Avatar::Avatar(): avatarStatusOffline->incRef(); avatarStatusOnline->incRef(); - mStatus = new Icon(avatarStatusOffline); - mStatus->setSize(12, 12); - add(mStatus, 1, 0); mLabel = new Label; mLabel->adjustSize(); + + mStatus = new Icon(avatarStatusOffline); + mStatus->setSize(12, 12); + + add(mStatus, 1, (mLabel->getHeight() - 12) / 2); add(mLabel, 16, 0); + + setSize(250, mLabel->getHeight()); + } Avatar::~Avatar() diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index 491e6396..e838aab6 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -140,15 +140,15 @@ void DropDown::draw(gcn::Graphics* graphics) const int alpha = (int) (mAlpha * 255.0f); gcn::Color faceColor = getBaseColor(); faceColor.a = alpha; - const gcn::Color* highlightColor = &guiPalette->getColor(Palette::HIGHLIGHT, - alpha); + const gcn::Color *highlightColor = + &guiPalette->getColor(Palette::HIGHLIGHT, alpha); gcn::Color shadowColor = faceColor - 0x303030; shadowColor.a = alpha; if (mListBox->getListModel() && mListBox->getSelected() >= 0) { graphics->setFont(getFont()); - graphics->setColor(guiPalette->getColor(Palette::TEXT, alpha)); + graphics->setColor(guiPalette->getColor(Palette::TEXT)); graphics->drawText(mListBox->getListModel()->getElementAt(mListBox->getSelected()), 1, 0); } diff --git a/src/gui/windowmenu.cpp b/src/gui/windowmenu.cpp index 5e33a4ed..8964f072 100644 --- a/src/gui/windowmenu.cpp +++ b/src/gui/windowmenu.cpp @@ -48,7 +48,6 @@ extern Window *guildWindow; extern Window *magicDialog; #endif - WindowMenu::WindowMenu(): mEmotePopup(0) { diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp index b5db3de5..ca6804f4 100644 --- a/src/keyboardconfig.cpp +++ b/src/keyboardconfig.cpp @@ -80,6 +80,7 @@ static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = { {"keyWindowDebug", SDLK_F10, _("Debug Window")}, {"keyWindowParty", SDLK_F11, _("Party Window")}, {"keyWindowEmoteBar", SDLK_F12, _("Emote Shortcut Window")}, + {"keyWindowOutfit", SDLK_o, _("Outfits Window")}, {"keyEmoteShortcut1", SDLK_1, strprintf(_("Emote Shortcut %d"), 1)}, {"keyEmoteShortcut2", SDLK_2, strprintf(_("Emote Shortcut %d"), 2)}, {"keyEmoteShortcut3", SDLK_3, strprintf(_("Emote Shortcut %d"), 3)}, diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h index 68a5efa6..b6a07f16 100644 --- a/src/keyboardconfig.h +++ b/src/keyboardconfig.h @@ -191,6 +191,7 @@ class KeyboardConfig KEY_WINDOW_DEBUG, KEY_WINDOW_PARTY, KEY_WINDOW_EMOTE_SHORTCUT, + KEY_WINDOW_OUTFIT, KEY_EMOTE_1, KEY_EMOTE_2, KEY_EMOTE_3, diff --git a/src/localplayer.cpp b/src/localplayer.cpp index c1423190..e9bc30f2 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -727,10 +727,10 @@ void LocalPlayer::stopAttack() { if (mTarget) { - setAction(STAND); - mLastTarget = -1; + if (mAction == ATTACK) + setAction(STAND); + setTarget(NULL); } - setTarget(NULL); mLastTarget = -1; } @@ -812,8 +812,8 @@ void LocalPlayer::setXp(int xp) // Show XP number particleEngine->addTextRiseFadeOutEffect( text, - getPixelX() + 16, - getPixelY() - 16, + getPixelX(), + getPixelY() - 48, &guiPalette->getColor(Palette::EXP_INFO), gui->getInfoParticleFont(), true); } @@ -829,8 +829,8 @@ void LocalPlayer::pickedUp(const std::string &item) // Show pickup notification particleEngine->addTextRiseFadeOutEffect( item, - getPixelX() + 16, - getPixelY() - 16, + getPixelX(), + getPixelY() - 48, &guiPalette->getColor(Palette::PICKUP_INFO), gui->getInfoParticleFont(), true); } @@ -946,7 +946,8 @@ void LocalPlayer::initTargetCursor() true, TC_LARGE); } -void LocalPlayer::loadTargetCursor(std::string filename, int width, int height, +void LocalPlayer::loadTargetCursor(const std::string &filename, + int width, int height, bool outRange, TargetCursorSize size) { assert(size > -1); diff --git a/src/localplayer.h b/src/localplayer.h index add5c049..4a85dd75 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -490,7 +490,8 @@ class LocalPlayer : public Player /** * Helper function for loading target cursors */ - void loadTargetCursor(std::string filename, int width, int height, + void loadTargetCursor(const std::string &filename, + int width, int height, bool outRange, Being::TargetCursorSize size); /** Images of the target cursor. */ diff --git a/src/main.cpp b/src/main.cpp index 2d5899f0..fb061818 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -159,8 +159,9 @@ extern Net::Connection *accountServerConnection; #endif Graphics *graphics; +Game *game = 0; -unsigned char state; +State state = STATE_NULL; std::string errorMessage; Sound sound; @@ -214,6 +215,7 @@ struct Options std::string configPath; std::string updateHost; std::string dataPath; + std::string homeDir; std::string serverName; short serverPort; @@ -302,11 +304,16 @@ static void setUpdatesDir() * Initializes the home directory. On UNIX and FreeBSD, ~/.tmw is used. On * Windows and other systems we use the current working directory. */ -static void initHomeDir() +static void initHomeDir(const Options &options) { - homeDir = std::string(PHYSFS_getUserDir()) + - "/." + - branding.getValue("appShort", "tmw"); + homeDir = options.homeDir; + + if (homeDir.empty()) + { + homeDir = std::string(PHYSFS_getUserDir()) + + "/." + + branding.getValue("appShort", "tmw"); + } #if defined WIN32 if (!CreateDirectory(homeDir.c_str(), 0) && GetLastError() != ERROR_ALREADY_EXISTS) @@ -659,7 +666,7 @@ static void parseOptions(int argc, char *argv[], Options &options) options.printVersion = true; break; case 'S': - homeDir = optarg; + options.homeDir = optarg; break; case 'O': options.noOpenGL = true; @@ -734,7 +741,6 @@ static void accountLogin(Network *network, LoginData *loginData) logger->log("Username is %s", loginData->username.c_str()); #ifdef EATHENA_SUPPORT network->connect(loginData->hostname, loginData->port); - // network->registerHandler(&loginHandler); #endif #ifdef TMWSERV_SUPPORT @@ -774,7 +780,6 @@ static void charLogin(Network *network, LoginData *loginData) { logger->log("Trying to connect to char server..."); network->connect(loginData->hostname, loginData->port); - // network->registerHandler(&charServerHandler); Net::getCharHandler()->setCharInfo(&charInfo); // Send login infos @@ -895,7 +900,7 @@ int main(int argc, char *argv[]) // Load branding information branding.init("data/branding.xml"); - initHomeDir(); + initHomeDir(options); // Configure logger logger = new Logger; @@ -912,7 +917,6 @@ int main(int argc, char *argv[]) // Needs to be created in main, as the updater uses it guiPalette = new Palette; - Game *game = NULL; Window *currentDialog = NULL; #ifdef TMWSERV_SUPPORT QuitDialog* quitDialog = NULL; @@ -971,7 +975,7 @@ int main(int argc, char *argv[]) desktop->setSize(screenWidth, screenHeight); - unsigned int oldstate = !state; // We start with a status change. + State oldstate = STATE_EXIT; // We start with a status change SDL_Event event; @@ -1292,6 +1296,7 @@ int main(int argc, char *argv[]) game = new Game; game->logic(); delete game; + game = 0; state = STATE_EXIT; @@ -1424,9 +1429,9 @@ int main(int argc, char *argv[]) } else { - int nextState = STATE_UPDATE; + State nextState = STATE_UPDATE; currentDialog = new ServerSelectDialog(&loginData, - nextState); + nextState); positionDialog(currentDialog, screenWidth, screenHeight); if (options.chooseDefault) @@ -1469,9 +1474,9 @@ int main(int argc, char *argv[]) desktop = NULL; logger->log("State: GAME"); - game = new Game; game->logic(); delete game; + game = 0; state = STATE_EXIT; break; @@ -1505,7 +1510,6 @@ int main(int argc, char *argv[]) currentDialog->addActionListener(&errorListener); currentDialog = NULL; // OkDialog deletes itself network->disconnect(); - network->clearHandlers(); break; case STATE_CONNECTING: @@ -78,7 +78,7 @@ /* * Client different States */ -enum { +enum State { STATE_EXIT, STATE_LOADDATA, STATE_LOGIN, @@ -107,15 +107,16 @@ enum { STATE_LOGOUT_ATTEMPT, STATE_CONNECT_GAME, STATE_WAIT, - STATE_FORCE_QUIT + STATE_FORCE_QUIT, #else STATE_ACCOUNT, STATE_CHAR_CONNECT, STATE_CHAR_SERVER, STATE_CHAR_NEW, STATE_CHAR_DEL, - STATE_CONNECTING + STATE_CONNECTING, #endif + STATE_NULL }; /* length definitions for several char[]s in order @@ -135,7 +136,7 @@ const short maxSlot = 2; extern std::string token; extern char n_server, n_character; -extern unsigned char state; +extern State state; extern std::string errorMessage; #endif diff --git a/src/net/ea/maphandler.cpp b/src/net/ea/maphandler.cpp index 76b3c480..c7ff0ec7 100644 --- a/src/net/ea/maphandler.cpp +++ b/src/net/ea/maphandler.cpp @@ -27,6 +27,7 @@ #include "net/messagein.h" #include "net/messageout.h" +#include "game.h" #include "localplayer.h" #include "log.h" #include "main.h" @@ -37,6 +38,7 @@ #include "utils/stringutils.h" Net::MapHandler *mapHandler; +extern Game *game; namespace EAthena { @@ -65,6 +67,7 @@ void MapHandler::handleMessage(MessageIn &msg) logger->log("Protocol: Player start position: (%d, %d), Direction: %d", player_node->mX, player_node->mY, direction); state = STATE_GAME; + game = new Game; break; case SMSG_SERVER_PING: diff --git a/src/resources/colordb.cpp b/src/resources/colordb.cpp index af498297..e5377aa6 100644 --- a/src/resources/colordb.cpp +++ b/src/resources/colordb.cpp @@ -27,9 +27,6 @@ #include <libxml/tree.h> -#define HAIR_COLOR_FILE "colors.xml" -#define TMW_COLOR_FILE "hair.xml" - namespace { ColorDB::Colors mColors; @@ -42,23 +39,23 @@ void ColorDB::load() if (mLoaded) return; - XML::Document *doc = new XML::Document(HAIR_COLOR_FILE); + XML::Document *doc = new XML::Document("hair.xml"); xmlNodePtr root = doc->rootNode(); - bool TMWHair = false; + bool hairXml = true; if (!root || !xmlStrEqual(root->name, BAD_CAST "colors")) { - logger->log("Trying TMW's color file, %s.", TMW_COLOR_FILE); + logger->log("Trying to fall back on colors.xml"); - TMWHair = true; + hairXml = false; delete doc; - - doc = new XML::Document(TMW_COLOR_FILE); + doc = new XML::Document("colors.xml"); root = doc->rootNode(); + if (!root || !xmlStrEqual(root->name, BAD_CAST "colors")) { - logger->log("ColorDB: Failed"); + logger->log("ColorDB: Failed to find any color files."); mColors[0] = mFail; mLoaded = true; @@ -78,8 +75,8 @@ void ColorDB::load() logger->log("ColorDB: Redefinition of dye ID %d", id); } - TMWHair ? mColors[id] = XML::getProperty(node, "value", "#FFFFFF") : - mColors[id] = XML::getProperty(node, "dye", "#FFFFFF"); + mColors[id] = hairXml ? XML::getProperty(node, "value", "#FFFFFF") : + XML::getProperty(node, "dye", "#FFFFFF"); } } diff --git a/src/textparticle.cpp b/src/textparticle.cpp index 04b7abe1..da176087 100644 --- a/src/textparticle.cpp +++ b/src/textparticle.cpp @@ -26,7 +26,7 @@ #include "gui/textrenderer.h" TextParticle::TextParticle(Map *map, const std::string &text, - const gcn::Color* color, + const gcn::Color *color, gcn::Font *font, bool outline): Particle(map), mText(text), @@ -47,18 +47,15 @@ void TextParticle::draw(Graphics *graphics, int offsetX, int offsetY) const float alpha = mAlpha * 255.0f; if (mLifetimeLeft > -1 && mLifetimeLeft < mFadeOut) - { - alpha *= mLifetimeLeft; - alpha /= mFadeOut; - } + alpha = alpha * mLifetimeLeft / mFadeOut; if (mLifetimePast < mFadeIn) - { - alpha *= mLifetimePast; - alpha /= mFadeIn; - } + alpha = alpha * mLifetimePast / mFadeIn; + + gcn::Color color = *mColor; + color.a = (int) alpha; TextRenderer::renderText(graphics, mText, screenX, screenY, gcn::Graphics::CENTER, - *mColor, mTextFont, mOutline, false, (int) alpha); + color, mTextFont, mOutline, false, (int) alpha); } diff --git a/src/textparticle.h b/src/textparticle.h index 8b7d3e01..a87137ea 100644 --- a/src/textparticle.h +++ b/src/textparticle.h @@ -47,7 +47,7 @@ class TextParticle : public Particle private: std::string mText; /**< Text of the particle. */ gcn::Font *mTextFont; /**< Font used for drawing the text. */ - const gcn::Color* mColor; /**< Color used for drawing the text. */ + const gcn::Color *mColor; /**< Color used for drawing the text. */ bool mOutline; /**< Make the text better readable */ }; |