From 448fe8430f5f0ae81101fe86d664f98be1a92201 Mon Sep 17 00:00:00 2001 From: Eugenio Favalli Date: Fri, 11 Feb 2005 17:21:55 +0000 Subject: Working on equipment --- The Mana World.dev | 22 +++++++++++++++++++++- src/game.cpp | 33 +++++++++++++++++++++++++-------- src/graphic/graphic.cpp | 9 +++++++-- src/graphic/graphic.h | 2 ++ src/gui/inventory.cpp | 22 ++++++++++++++++++---- src/gui/inventory.h | 6 ++++-- src/gui/itemcontainer.cpp | 8 +++++++- src/gui/itemcontainer.h | 5 ++++- 8 files changed, 88 insertions(+), 19 deletions(-) diff --git a/The Mana World.dev b/The Mana World.dev index 00f75a91..cdc61185 100644 --- a/The Mana World.dev +++ b/The Mana World.dev @@ -1,7 +1,7 @@ [Project] FileName=The Mana World.dev Name=tmw -UnitCount=98 +UnitCount=100 Type=0 Ver=1 ObjFiles= @@ -1036,3 +1036,23 @@ Priority=1000 OverrideBuildCmd=0 BuildCmd= +[Unit99] +FileName=src\gui\equipment.h +CompileCpp=1 +Folder=gui +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit100] +FileName=src\gui\equipment.cpp +CompileCpp=1 +Folder=gui +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/src/game.cpp b/src/game.cpp index 1191ba28..e4ec2d45 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -220,6 +220,10 @@ void do_input() setupWindow->setVisible(true); used = true; } + else if (keysym.sym == SDLK_e) { + equipmentWindow->setVisible(!equipmentWindow->isVisible()); + used = true; + } } if (event.key.keysym.sym == SDLK_ESCAPE) @@ -408,11 +412,11 @@ void do_parse() { } fclose(file); */ -#ifdef DEBUG +//#ifdef DEBUG FILE *file = fopen("./docs/packet.list", "a"); fprintf(file, "%x\n", RFIFOW(0)); fclose(file); -#endif +//#endif // Parse packet based on their id switch(id) { // Received speech @@ -589,7 +593,14 @@ void do_parse() { case 0x01ee: for (int loop = 0; loop < (RFIFOW(2) - 4) / 18; loop++) { inventoryWindow->addItem(RFIFOW(4 + loop * 18), - RFIFOW(4 + loop * 18 + 2), RFIFOW(4 + loop * 18 + 6)); + RFIFOW(4 + loop * 18 + 2), RFIFOW(4 + loop * 18 + 6), false); + } + break; + // Get the equipments + case 0x00a4: + for (int loop = 0; loop < (RFIFOW(2) - 4) / 20; loop++) { + inventoryWindow->addItem(RFIFOW(4 + loop * 20), + RFIFOW(4 + loop * 20 + 2), 1, true); } break; // Can I use the item? @@ -874,7 +885,7 @@ void do_parse() { if (RFIFOB(22) > 0) chatBox->chat_log("Unable to pick up item", BY_SERVER); else - inventoryWindow->addItem(RFIFOW(2), RFIFOW(6), RFIFOW(4)); + inventoryWindow->addItem(RFIFOW(2), RFIFOW(6), RFIFOW(4), false); break; // Decrease quantity of an item in inventory case 0x00af: @@ -956,11 +967,17 @@ void do_parse() { being->hair_style = RFIFOB(7); } break; - case 0x00a4: - for (int i = 0; i < (RFIFOW(2) - 4) / 20; i++) - inventoryWindow->addItem(RFIFOW(4 + 20 * i), RFIFOW(6 + 20 * i), 1); + // Answer to equip items + case 0x00aa: + if (RFIFOB(6) == 0) + chatBox->chat_log("Unable to equip.", BY_SERVER); + break; + // Equipment related + case 0x01d7: + char content[40]; + sprintf(content, "%i %i", RFIFOW(7), RFIFOW(9)); + chatBox->chat_log(content, BY_SERVER); break; - // Manage non implemented packets default: //printf("%x\n",id); diff --git a/src/graphic/graphic.cpp b/src/graphic/graphic.cpp index 65775c75..bff5a29b 100644 --- a/src/graphic/graphic.cpp +++ b/src/graphic/graphic.cpp @@ -26,6 +26,7 @@ #include "../gui/textfield.h" #include "../gui/status.h" #include "../gui/minimap.h" +#include "../gui/equipment.h" #include "../main.h" #include "../being.h" @@ -55,6 +56,7 @@ SkillDialog *skillDialog; StatsWindow *statsWindow; Setup* setupWindow; Minimap *minimap; +EquipmentWindow *equipmentWindow; void ChatListener::action(const std::string& eventId) { @@ -269,9 +271,10 @@ Engine::Engine() setupWindow = new Setup(); setupWindow->setVisible(false); - // Create minimap - minimap = new Minimap(); + + equipmentWindow = new EquipmentWindow(); + equipmentWindow->setVisible(true); // Give focus to the chat input chatInput->requestFocus(); @@ -310,6 +313,8 @@ Engine::~Engine() delete skillDialog; delete statsWindow; delete setupWindow; + delete minimap; + delete equipmentWindow; delete tileset; delete monsterset; diff --git a/src/graphic/graphic.h b/src/graphic/graphic.h index 8b4a2bde..0bae4327 100644 --- a/src/graphic/graphic.h +++ b/src/graphic/graphic.h @@ -42,6 +42,7 @@ class Graphics; #include "../gui/stats.h" #include "../gui/skill.h" #include "../gui/setup.h" +#include "../gui/equipment.h" #include "../resources/resourcemanager.h" #include "spriteset.h" #include @@ -69,6 +70,7 @@ extern NpcTextDialog *npcTextDialog; extern SkillDialog *skillDialog; extern StatsWindow *statsWindow; extern Setup *setupWindow; +extern EquipmentWindow *equipmentWindow; char get_x_offset(char, char); char get_y_offset(char, char); diff --git a/src/gui/inventory.cpp b/src/gui/inventory.cpp index 259f728d..db5dfb54 100644 --- a/src/gui/inventory.cpp +++ b/src/gui/inventory.cpp @@ -67,10 +67,10 @@ void InventoryWindow::draw(gcn::Graphics *graphics) } -int InventoryWindow::addItem(int index, int id, int quantity) { +int InventoryWindow::addItem(int index, int id, int quantity, bool equipment) { /*items[index].id = id; items[index].quantity += quantity;*/ - items->addItem(index, id, quantity); + items->addItem(index, id, quantity, equipment); return 0; } @@ -116,13 +116,27 @@ int InventoryWindow::dropItem(int index, int quantity) { 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::action(const std::string &eventId) { //if(selectedItem >= 0 && selectedItem <= INVENTORY_SIZE) { if (items->getIndex() != -1) { if (eventId == "use") { - useItem(items->getIndex(), items->getId()); - } else if (eventId == "drop") { + if(items->isEquipment(items->getIndex())) { + equipItem(items->getIndex()); + } + else { + useItem(items->getIndex(), items->getId()); + } + } + else if (eventId == "drop") { dropItem(items->getIndex(), items->getQuantity()); // Temp: drop all the items, you should choose quantity instead } diff --git a/src/gui/inventory.h b/src/gui/inventory.h index e48d5477..178c8019 100644 --- a/src/gui/inventory.h +++ b/src/gui/inventory.h @@ -56,12 +56,14 @@ class InventoryWindow : public Window, gcn::ActionListener { /** * Add an item the inventory. */ - int addItem(int index, int id, int quantity); + int addItem(int index, int id, int quantity, bool equipment); /** * Remove a item from the inventory. */ int removeItem(int id); + + void equipItem(int index); /** * Change quantity of an item. @@ -83,7 +85,7 @@ class InventoryWindow : public Window, gcn::ActionListener { private: gcn::Button *useButton, *dropButton; int useItem(int index, int id); - int dropItem(int index, int amunt); + int dropItem(int index, int quantity); }; diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index 123270c2..0bd236e2 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -37,6 +37,7 @@ ItemContainer::ItemContainer() for (int i = 0; i < INVENTORY_SIZE; i++) { items[i].id = -1; items[i].quantity = 0; + items[i].equipment = false; } } @@ -113,10 +114,11 @@ int ItemContainer::getQuantity(int index) return items[index].quantity; } -void ItemContainer::addItem(int index, int id, int quantity) +void ItemContainer::addItem(int index, int id, int quantity, bool equipment) { items[index].id = id; items[index].quantity += quantity; + items[index].equipment = equipment; } void ItemContainer::removeItem(int id) @@ -155,3 +157,7 @@ void ItemContainer::_mouseInputMessage(const gcn::MouseInput &mouseInput) } } +bool ItemContainer::isEquipment(int index) +{ + return items[index].equipment; +} diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h index 5774feb6..69e59149 100644 --- a/src/gui/itemcontainer.h +++ b/src/gui/itemcontainer.h @@ -34,6 +34,7 @@ struct ITEM_HOLDER { // the holder of a item int id; // the id of the item int quantity; // number of items + bool equipment; }; /** @@ -101,7 +102,7 @@ class ItemContainer : public gcn::Widget /** * Adds a new item. */ - void addItem(int index, int id, int quantity); + void addItem(int index, int id, int quantity, bool equipment); /** * Remove a item from the inventory. @@ -119,6 +120,8 @@ class ItemContainer : public gcn::Widget void increaseQuantity(int index, int quantity); void _mouseInputMessage(const gcn::MouseInput &mouseInput); + + bool isEquipment(int index); }; #endif -- cgit v1.2.3-70-g09d2