diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/game.cpp | 36 | ||||
-rw-r--r-- | src/graphic/graphic.cpp | 39 | ||||
-rw-r--r-- | src/graphic/graphic.h | 2 | ||||
-rw-r--r-- | src/gui/npc.cpp | 8 | ||||
-rw-r--r-- | src/gui/npc.h | 9 | ||||
-rw-r--r-- | src/gui/npc_text.cpp | 75 | ||||
-rw-r--r-- | src/gui/npc_text.h | 78 | ||||
-rw-r--r-- | src/gui/passwordfield.cpp | 2 | ||||
-rw-r--r-- | src/gui/slider.cpp | 1 | ||||
-rw-r--r-- | src/gui/textfield.cpp | 2 | ||||
-rw-r--r-- | src/gui/window.cpp | 27 |
12 files changed, 207 insertions, 73 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 3821f835..2de7cba9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -15,6 +15,7 @@ tmw_SOURCES = sound/sound.cpp \ gui/inventory.cpp \ gui/login.cpp \ gui/npc.cpp \ + gui/npc_text.cpp \ gui/ok_dialog.cpp \ gui/passwordfield.cpp \ gui/progressbar.cpp \ diff --git a/src/game.cpp b/src/game.cpp index eb2a99a5..73439947 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -155,7 +155,6 @@ void do_init() { } player_node->weapon = char_info->weapon; add_node(player_node); - show_npc_dialog = 0; remove("./docs/packet.list"); } @@ -260,17 +259,16 @@ void do_input() { } if (mouse_b & 2) { - //if(show_npc_dialog==0) { - int npc_x = mouse_x/32+camera_x; - int npc_y = mouse_y/32+camera_y; + // Make contact with NPC + int npc_x = mouse_x / 32 + camera_x; + int npc_y = mouse_y / 32 + camera_y; int id = find_npc(npc_x, npc_y); - if(id!=0) { + if (id != 0) { WFIFOW(0) = net_w_value(0x0090); WFIFOL(2) = net_l_value(id); WFIFOB(6) = 0; WFIFOSET(7); } - //} } } @@ -538,19 +536,17 @@ void do_parse() { break; // NPC dialog case 0x00b4: - if(!strstr(npc_text, RFIFOP(8))) { - strcat(npc_text, RFIFOP(8)); - strcat(npc_text, "\n"); - show_npc_dialog = 1; - } - break; - // Get the items - 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)); - } - break; + npcTextDialog->addText(RFIFOP(8)); + npcListDialog->setVisible(false); + npcTextDialog->setVisible(true); + break; + // Get the items + 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)); + } + break; // Can I use the item? case 0x00a8: // index RFIFOW(2) @@ -562,7 +558,7 @@ void do_parse() { case 0x0091: memset(map_path, '\0', 480); append_filename(map_path, "./data/map/", RFIFOP(2), 480); - if(load_map(map_path)) { + if (load_map(map_path)) { empty(); player_node = new NODE(); player_node->job = 0; diff --git a/src/graphic/graphic.cpp b/src/graphic/graphic.cpp index bba04d52..be20aeb9 100644 --- a/src/graphic/graphic.cpp +++ b/src/graphic/graphic.cpp @@ -29,12 +29,11 @@ BITMAP *buffer, *chat_background; char itemCurrenyQ[10] = "0"; int map_x, map_y, camera_x, camera_y; -DIALOG_PLAYER *npc_player, *skill_player, *sell_player, *skill_list_player, *npc_list_player; +DIALOG_PLAYER *skill_player, *skill_list_player; char npc_text[1000] = ""; char statsString2[255] = "n/a"; char skill_points[10] = ""; Chat chatlog("./docs/chatlog.txt", 20); -int show_npc_dialog = 0; bool show_skill_dialog = false; bool show_skill_list_dialog = false; char npc_button[10] = "Close"; @@ -47,6 +46,7 @@ SellDialog *sellDialog; BuySellDialog *buySellDialog; InventoryWindow *inventoryWindow; NpcListDialog *npcListDialog; +NpcTextDialog *npcTextDialog; void ChatListener::action(const std::string& eventId) { @@ -81,14 +81,6 @@ void BuySellListener::action(const std::string& eventId) buySellDialog->setVisible(false); } -DIALOG npc_dialog[] = { - /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ - { tmw_dialog_proc, 300, 200, 260, 150, 0, 0, 0, 0, 0, 0, (char *)"NPC", NULL, NULL }, - { tmw_button_proc, 508, 326, 50, 20, 255, 0, 'c', D_EXIT, 0, 0, (char *)npc_button, NULL, NULL }, - { tmw_textbox_proc, 304, 224, 252, 100, 0, 0, 0, 0, 0, 0, npc_text, NULL, NULL }, - { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL } -}; - DIALOG skill_list_dialog[] = { /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ { tmw_dialog_proc, 300, 200, 260, 200, 0, 0, 0, 0, 0, 0, (char *)"Stats", NULL, NULL }, @@ -121,9 +113,9 @@ int get_x_offset(NODE *node) { int offset = 0; char direction = get_direction(node->coordinates); if (node->action == WALK) { - if (direction!=NORTH && direction!=SOUTH) { + if (direction != NORTH && direction != SOUTH) { offset = node->frame + 1; - if (offset==5)offset = 0; + if (offset == 5)offset = 0; offset *= 8; if (direction == WEST || direction == NW || direction == SW) { offset = -offset; @@ -192,16 +184,17 @@ GraphicEngine::GraphicEngine() { inventoryWindow->setVisible(false); inventoryWindow->setPosition(100, 100); + npcTextDialog = new NpcTextDialog(guiTop); + npcTextDialog->setVisible(false); + npcListDialog = new NpcListDialog(guiTop); npcListDialog->setVisible(false); - npc_player = init_dialog(npc_dialog, -1); - position_dialog(npc_dialog, 300, 200); skill_player = init_dialog(skill_dialog, -1); skill_list_player = init_dialog(skill_list_dialog, -1); buffer = create_bitmap(SCREEN_W, SCREEN_H); - if(!buffer) { + if (!buffer) { error("Not enough memory to create buffer"); } @@ -214,7 +207,6 @@ GraphicEngine::GraphicEngine() { npcset = new Spriteset("./data/graphic/npcset.dat"); playerset = new Spriteset("./data/graphic/playerset.dat"); monsterset = new Spriteset("./data/graphic/monsterset.dat"); - } GraphicEngine::~GraphicEngine() { @@ -222,10 +214,11 @@ GraphicEngine::~GraphicEngine() { delete buyDialog; delete sellDialog; delete buySellDialog; + delete npcListDialog; + delete npcTextDialog; //delete tileset; - shutdown_dialog(npc_player); shutdown_dialog(skill_player); } @@ -455,18 +448,6 @@ void GraphicEngine::refresh() { chatlog.chat_draw(buffer, 8, font); - switch (show_npc_dialog) { - case 1: - dialog_message(npc_dialog, MSG_DRAW, 0, 0); - if (!(show_npc_dialog = gui_update(npc_player))) { - strcpy(npc_text, ""); - WFIFOW(0) = net_w_value(0x00b9); - WFIFOL(2) = net_l_value(current_npc); - WFIFOSET(6); - } - break; - } - if (show_skill_dialog) { update_skill_dialog(); if (gui_update(skill_player) == 0) { diff --git a/src/graphic/graphic.h b/src/graphic/graphic.h index 564a380e..05b92acb 100644 --- a/src/graphic/graphic.h +++ b/src/graphic/graphic.h @@ -27,6 +27,7 @@ #include "../being.h" #include "../gui/buy.h" #include "../gui/npc.h" +#include "../gui/npc_text.h" #include "../gui/sell.h" #include "../gui/buysell.h" #include "../gui/chat.h" @@ -60,6 +61,7 @@ extern SellDialog *sellDialog; extern BuySellDialog *buySellDialog; extern InventoryWindow *inventoryWindow; extern NpcListDialog *npcListDialog; +extern NpcTextDialog *npcTextDialog; // The action listener for the chat field class ChatListener : public gcn::ActionListener { diff --git a/src/gui/npc.cpp b/src/gui/npc.cpp index d206010e..80d55c73 100644 --- a/src/gui/npc.cpp +++ b/src/gui/npc.cpp @@ -54,6 +54,14 @@ NpcListDialog::NpcListDialog(gcn::Container *parent): setLocationRelativeTo(getParent()); } +NpcListDialog::~NpcListDialog() +{ + delete okButton; + delete cancelButton; + delete itemList; + delete scrollArea; +} + int NpcListDialog::getNumberOfElements() { return items.size(); diff --git a/src/gui/npc.h b/src/gui/npc.h index acc91173..d0810201 100644 --- a/src/gui/npc.h +++ b/src/gui/npc.h @@ -21,8 +21,8 @@ * $Id$ */ -#ifndef _NPC_H -#define _NPC_H +#ifndef _TMW_NPC_H +#define _TMW_NPC_H #include <guichan.hpp> #include <vector> @@ -46,6 +46,11 @@ class NpcListDialog : public Window, public gcn::ActionListener, NpcListDialog(gcn::Container *parent); /** + * Destructor. + */ + ~NpcListDialog(); + + /** * Called when receiving actions from the widgets. */ void action(const std::string& eventId); diff --git a/src/gui/npc_text.cpp b/src/gui/npc_text.cpp new file mode 100644 index 00000000..38c29688 --- /dev/null +++ b/src/gui/npc_text.cpp @@ -0,0 +1,75 @@ +/* + * 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 "npc_text.h" +#include "scrollarea.h" +#include "button.h" +#include "../game.h" + +NpcTextDialog::NpcTextDialog(gcn::Container *parent): + Window(parent, "NPC") +{ + textBox = new gcn::TextBox(); + textBox->setEditable(false); + scrollArea = new ScrollArea(textBox); + okButton = new Button("OK"); + + setSize(260, 175); + scrollArea->setDimension(gcn::Rectangle(5, 5, 250, 130)); + okButton->setPosition(260 - 10 - okButton->getWidth(), 145); + + okButton->setEventId("ok"); + okButton->addActionListener(this); + + add(scrollArea); + add(okButton); + + setLocationRelativeTo(getParent()); +} + +NpcTextDialog::~NpcTextDialog() +{ + delete okButton; + delete textBox; + delete scrollArea; +} + +void NpcTextDialog::setText(const char *text) +{ + textBox->setText(std::string(text)); +} + +void NpcTextDialog::addText(const char *text) +{ + textBox->setText( + textBox->getText() + std::string(text) + std::string("\n")); +} + +void NpcTextDialog::action(const std::string& eventId) +{ + WFIFOW(0) = net_w_value(0x00b9); + WFIFOL(2) = net_l_value(current_npc); + WFIFOSET(6); + setText(""); + setVisible(false); +} diff --git a/src/gui/npc_text.h b/src/gui/npc_text.h new file mode 100644 index 00000000..6bb7d943 --- /dev/null +++ b/src/gui/npc_text.h @@ -0,0 +1,78 @@ +/* + * 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_NPC_TEXT_H +#define _TMW_NPC_TEXT_H + +#include <guichan.hpp> +#include <vector> +#include <string> +#include "window.h" + +/** + * The npc text dialog. + * + * \ingroup GUI + */ +class NpcTextDialog : public Window, public gcn::ActionListener +{ + public: + /** + * Constructor. + * + * @see Window::Window + */ + NpcTextDialog(gcn::Container *parent); + + /** + * Destructor. + */ + ~NpcTextDialog(); + + /** + * Called when receiving actions from the widgets. + */ + void action(const std::string& eventId); + + /** + * Sets the text shows in the dialog. + * + * @param string The new text. + */ + void setText(const char *string); + + /** + * Adds the text to the text shows in the dialog. Also adds a newline + * to the end. + * + * @param string The text to add. + */ + void addText(const char *string); + + private: + gcn::Button *okButton; + gcn::TextBox *textBox; + gcn::ScrollArea *scrollArea; +}; + +#endif diff --git a/src/gui/passwordfield.cpp b/src/gui/passwordfield.cpp index ee849c45..aa5c3141 100644 --- a/src/gui/passwordfield.cpp +++ b/src/gui/passwordfield.cpp @@ -32,7 +32,7 @@ PasswordField::PasswordField(const std::string& text): void PasswordField::draw(gcn::Graphics *graphics) { - int x, y, w, h, col; + int x, y, w, h; getAbsolutePosition(x, y); w = getWidth(); h = getHeight(); diff --git a/src/gui/slider.cpp b/src/gui/slider.cpp index 612d2e2e..11254f09 100644 --- a/src/gui/slider.cpp +++ b/src/gui/slider.cpp @@ -65,7 +65,6 @@ void Slider::draw(gcn::Graphics *graphics) void Slider::drawMarker(gcn::Graphics *graphics) { - int w = getWidth(); int h = getHeight(); int x, y; getAbsolutePosition(x, y); diff --git a/src/gui/textfield.cpp b/src/gui/textfield.cpp index 3479355d..4022ca2d 100644 --- a/src/gui/textfield.cpp +++ b/src/gui/textfield.cpp @@ -33,7 +33,7 @@ TextField::TextField(const std::string& text): void TextField::draw(gcn::Graphics *graphics) { - int x, y, w, h, col; + int x, y, w, h; getAbsolutePosition(x, y); w = getWidth(); h = getHeight(); diff --git a/src/gui/window.cpp b/src/gui/window.cpp index 4d386071..632ad303 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -172,9 +172,6 @@ void Window::add(Widget *w, int x, int y) void Window::mousePress(int mx, int my, int button) { - int x = this->getDimension().x; - int y = this->getDimension().y; - mouseDown = true; mousePX = mx; @@ -199,24 +196,16 @@ void Window::mouseMotion(int mx, int my) y = y - (mousePY - my); // Keep guichan window inside window - if (x < 0) - x = 0; - if (y < 0) - y = 0; - if (x + winWidth > 799) - x = 799 - winWidth; - if (y + winHeight > 599) - y = 599 - winHeight; + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x + winWidth > 799) x = 799 - winWidth; + if (y + winHeight > 599) y = 599 - winHeight; // Snap window to edges - if (x < snapSize) - x = 0; - if (y < snapSize) - y = 0; - if (x + winWidth + snapSize > 799) - x = 799 - winWidth; - if (y + winHeight + snapSize > 599) - y = 599 - winHeight; + if (x < snapSize) x = 0; + if (y < snapSize) y = 0; + if (x + winWidth + snapSize > 799) x = 799 - winWidth; + if (y + winHeight + snapSize > 599) y = 599 - winHeight; this->setPosition(x, y); } |