From ca03f5a83dbd379d21c20ed4e69ec6836395b694 Mon Sep 17 00:00:00 2001 From: Jan-Fabian Humann Date: Mon, 4 Apr 2005 22:35:58 +0000 Subject: starting to do the trade window, i know it's not functionable and contains a lot of bugs but ill continue tomorrow. --- src/Makefile.am | 4 +- src/engine.cpp | 11 ++- src/engine.h | 3 +- src/game.cpp | 9 ++- src/gui/itemcontainer.cpp | 13 +++- src/gui/itemcontainer.h | 7 +- src/gui/trade.cpp | 183 ++++++++++++++++++++++++++++++++++++++++++++++ src/gui/trade.h | 89 ++++++++++++++++++++++ 8 files changed, 311 insertions(+), 8 deletions(-) create mode 100644 src/gui/trade.cpp create mode 100644 src/gui/trade.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 1080accd..ef915046 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -71,7 +71,9 @@ tmw_SOURCES = graphic/spriteset.cpp \ gui/textbox.h \ gui/textfield.cpp \ gui/textfield.h \ - gui/window.cpp \ + gui/trade.cpp \ + gui/trade.h \ + gui/window.cpp \ gui/window.h \ gui/windowcontainer.cpp \ gui/windowcontainer.h \ diff --git a/src/engine.cpp b/src/engine.cpp index e120e026..40aea669 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -29,6 +29,7 @@ #include "gui/chargedialog.h" #include "gui/itemcontainer.h" #include "gui/item_amount.h" +#include "gui/trade.h" #include "main.h" #include "being.h" #include "floor_item.h" @@ -60,6 +61,7 @@ Setup* setupWindow; Minimap *minimap; EquipmentWindow *equipmentWindow; ChargeDialog *chargeDialog; +TradeWindow *tradeWindow; char hairtable[16][4][2] = { // S(x,y) W(x,y) N(x,y) E(x,y) @@ -154,7 +156,7 @@ Engine::Engine() minimap = new Minimap(); equipmentWindow = new EquipmentWindow(); chargeDialog = new ChargeDialog(); - + tradeWindow = new TradeWindow(); // Initialize window posisitons chatWindow->setPosition(0, screen->h - chatWindow->getHeight()); statusWindow->setPosition(screen->w - statusWindow->getWidth() - 5, 5); @@ -169,7 +171,9 @@ Engine::Engine() chargeDialog->setPosition( screen->w - 5 - chargeDialog->getWidth(), screen->h - chargeDialog->getHeight() - 15); - + tradeWindow->setPosition(screen->w - statusWindow->getWidth() - + tradeWindow->getWidth() - 10, + chatWindow->getHeight() + 15); // Set initial window visibility chatWindow->setVisible(true); statusWindow->setVisible(true); @@ -186,7 +190,7 @@ Engine::Engine() setupWindow->setVisible(false); equipmentWindow->setVisible(false); chargeDialog->setVisible(false); - + tradeWindow->setVisible(false); // Do not focus any text field gui->focusNone(); @@ -233,6 +237,7 @@ Engine::~Engine() delete equipmentWindow; delete newSkillWindow; delete itemAmountWindow; + delete tradeWindow; // Delete sprite sets delete monsterset; diff --git a/src/engine.h b/src/engine.h index 72ecf4b7..48909f60 100644 --- a/src/engine.h +++ b/src/engine.h @@ -42,6 +42,7 @@ #include "gui/equipment.h" #include "gui/chargedialog.h" #include "gui/item_amount.h" +#include "gui/trade.h" #include "resources/resourcemanager.h" #include "map.h" #include "graphic/spriteset.h" @@ -69,7 +70,7 @@ extern StatsWindow *statsWindow; extern Setup *setupWindow; extern EquipmentWindow *equipmentWindow; extern ChargeDialog* chargeDialog; - +extern TradeWindow *tradeWindow; char get_x_offset(char, char); char get_y_offset(char, char); diff --git a/src/game.cpp b/src/game.cpp index b145190a..4b5bcf24 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -287,6 +287,12 @@ void do_input() state = EXIT; } + // Debug + if (keysym.sym == SDLK_t) + { + tradeWindow->setVisible(true); + } + if (keysym.sym == SDLK_g) { // Get the item code @@ -779,8 +785,9 @@ void do_parse() { case 0x01ee: // Reset all items to not load them twice on map change inventoryWindow->items->resetItems(); + for (int loop = 0; loop < (RFIFOW(2) - 4) / 18; loop++) { - inventoryWindow->addItem(RFIFOW(4 + loop * 18), + inventoryWindow->addItem(RFIFOW(4 + loop * 18), RFIFOW(4 + loop * 18 + 2), RFIFOW(4 + loop * 18 + 6), false); // Trick because arrows are not considered equipment diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index d76fc3d9..aa60d322 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -54,7 +54,7 @@ void ItemContainer::draw(gcn::Graphics* graphics) getAbsolutePosition(x, y); w = getWidth(); h = getHeight(); - + graphics->setColor(gcn::Color(0, 0, 0)); graphics->drawRectangle(gcn::Rectangle(0, 0, w, h)); if(items[selectedItem].quantity <= 0) @@ -135,6 +135,17 @@ void ItemContainer::addItem(int index, int id, int quantity, bool equipment) items[index].equipment = equipment; } +int ItemContainer::getFreeSlot() +{ + for (int i = 0; i < INVENTORY_SIZE; i++) { + printf("i %d id %d\n", i, items[i].id); + if (items[i].id == -1) { + return i; + } + } + return -1; +} + void ItemContainer::resetItems() { for (int i = 0; i < INVENTORY_SIZE; i++) { diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h index cbf08cf1..0857ac9f 100644 --- a/src/gui/itemcontainer.h +++ b/src/gui/itemcontainer.h @@ -103,11 +103,16 @@ class ItemContainer : public gcn::Widget */ int getQuantity(int index); + /** + * Returns id of next free slot or -1 i all occupied. + */ + int getFreeSlot(); + /** * Adds a new item. */ void addItem(int index, int id, int quantity, bool equipment); - + /** * Reset all item slots. */ diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp new file mode 100644 index 00000000..43bbd79d --- /dev/null +++ b/src/gui/trade.cpp @@ -0,0 +1,183 @@ +/* + * 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 "../graphics.h" +#include "trade.h" +#include "../resources/resourcemanager.h" +#include "../resources/image.h" +#include "button.h" +#include "../being.h" +#include "../engine.h" +#include + +TradeWindow::TradeWindow(): + Window("Trade: You") +{ + setContentSize(322, 130); + addButton = new Button("Add"); + addButton->setPosition(2, 105); + + addButton->setEventId("add"); + addButton->addActionListener(this); + + add(addButton); + + nameLabel = new gcn::Label("Other one"); + nameLabel->setPosition(2, 45); + + my_items = new ItemContainer(); + trade_items = new ItemContainer(); + + my_items->setSize(318, 40); + trade_items->setSize(318,40); + + my_items->setPosition(2, 2); + trade_items->setPosition(2, 60); + + add(nameLabel); + add(my_items); + add(trade_items); +} + +TradeWindow::~TradeWindow() +{ + delete addButton; + delete nameLabel; +} + +void TradeWindow::draw(gcn::Graphics *graphics) +{ + // Draw window graphics + Window::draw(graphics); +} + + +int TradeWindow::addItem(int index, int id, bool own, int quantity, + bool equipment) { + my_items->addItem(index, id, quantity, equipment); + return 0; +} + +int TradeWindow::removeItem(int id, bool own) { + my_items->removeItem(id); + return 0; +} + +int TradeWindow::changeQuantity(int index, bool own, int quantity) { + //items[index].quantity = quantity; + my_items->changeQuantity(index, quantity); + return 0; +} + +int TradeWindow::increaseQuantity(int index, bool own, int quantity) { + //items[index].quantity += quantity; + my_items->increaseQuantity(index, quantity); + return 0; +} + +/*int TradeWindow::useItem(int index, int id) { + WFIFOW(0) = net_w_value(0x00a7); + WFIFOW(2) = net_w_value(index); + WFIFOL(4) = net_l_value(id); + // Note: id is dest of item, usually player_node->account_ID ?? + WFIFOSET(8); + while ((out_size > 0)) flush(); + return 0; +} */ + +/*int InventoryWindow::dropItem(int index, int quantity) { + // TODO: Fix wrong coordinates of drops, serverside? + WFIFOW(0) = net_w_value(0x00a2); + WFIFOW(2) = net_w_value(index); + WFIFOW(4) = net_w_value(quantity); + WFIFOSET(6); + while ((out_size > 0)) flush(); + return 0; +}*/ + +/*void InventoryWindow::equipItem(int index) { + WFIFOW(0) = net_w_value(0x00a9); + WFIFOW(2) = net_w_value(index); + WFIFOW(4) = net_w_value(0); + WFIFOSET(6); + while ((out_size > 0)) flush(); +}*/ + +/*void InventoryWindow::unequipItem(int index) { + WFIFOW(0) = net_w_value(0x00ab); + WFIFOW(2) = net_w_value(index); + WFIFOSET(4); + while ((out_size > 0)) flush(); +}*/ + +void TradeWindow::action(const std::string &eventId) +{ + + if (eventId == "add") { + if (inventoryWindow->items->getIndex() >= 0 && + inventoryWindow->items->getIndex() <= INVENTORY_SIZE) { + if (inventoryWindow->items->isEquipment( + inventoryWindow->items->getIndex())) { + if (inventoryWindow->items->isEquipped( + inventoryWindow->items->getIndex())) { + inventoryWindow->unequipItem( + inventoryWindow->items->getIndex()); + } + } + int i = tradeWindow->my_items->getFreeSlot(); + printf("%d\n", i); + if (i >= 0) { + printf("successfull\n"); + + addItem(i, inventoryWindow->items->getId(), true, inventoryWindow->items->getQuantity(), inventoryWindow->items->isEquipment(inventoryWindow->items->getIndex())); + inventoryWindow->changeQuantity(inventoryWindow->items->getIndex(), 0); + + } else { + printf("not successfull\n"); + } + + + } + } + //if(selectedItem >= 0 && selectedItem <= INVENTORY_SIZE) { + + //if (my_items->getIndex() != -1) { + /* if (eventId == "use") { + if(items->isEquipment(items->getIndex())) { + if(items->isEquipped(items->getIndex())) { + unequipItem(items->getIndex()); + } + else { + equipItem(items->getIndex()); + } + } + else { + useItem(items->getIndex(), items->getId()); + } + } + else*/ /*if (eventId == "drop") { + itemAmountWindow->resetAmount(); + itemAmountWindow->setVisible(true); + } */ + //} +} diff --git a/src/gui/trade.h b/src/gui/trade.h new file mode 100644 index 00000000..3b863e64 --- /dev/null +++ b/src/gui/trade.h @@ -0,0 +1,89 @@ +/* + * 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_TRADE_H +#define _TMW_TRADE_H + +#include "../log.h" +#include "../net/network.h" +#include "../graphic/spriteset.h" +#include "itemcontainer.h" +#include "gui.h" +#include "window.h" + +/** + * Trade dialog. + * + * \ingroup GUI + */ +class TradeWindow : public Window, gcn::ActionListener { + public: + /** + * Constructor. + */ + TradeWindow(); + + /** + * Destructor. + */ + ~TradeWindow(); + + /** + * Draws the trade window. + */ + void draw(gcn::Graphics *graphics); + + /** + * Add an item the trade window. + */ + int addItem(int index, int id, bool own, int quantity, bool equipment); + + /** + * Remove a item from the trade window. + */ + int removeItem(int id, bool own); + + /** + * Change quantity of an item. + */ + int changeQuantity(int index, bool own, int quantity); + + /** + * Increase quantity of an item. + */ + int increaseQuantity(int index, bool own, int quantity); + + /** + * Called when receiving actions from the widgets. + */ + void action(const std::string& eventId); + + ItemContainer *my_items; + ItemContainer *trade_items; + + private: + gcn::Label *nameLabel; + gcn::Button *addButton; +}; + +#endif -- cgit v1.2.3-70-g09d2