summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/game.cpp36
-rw-r--r--src/graphic/graphic.cpp39
-rw-r--r--src/graphic/graphic.h2
-rw-r--r--src/gui/npc.cpp8
-rw-r--r--src/gui/npc.h9
-rw-r--r--src/gui/npc_text.cpp75
-rw-r--r--src/gui/npc_text.h78
-rw-r--r--src/gui/passwordfield.cpp2
-rw-r--r--src/gui/slider.cpp1
-rw-r--r--src/gui/textfield.cpp2
-rw-r--r--src/gui/window.cpp27
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);
}