summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt4
-rw-r--r--src/Makefile.am4
-rw-r--r--src/game.cpp11
-rw-r--r--src/gui/npcintegerdialog.cpp125
-rw-r--r--src/gui/npcintegerdialog.h82
-rw-r--r--src/gui/npcstringdialog.cpp77
-rw-r--r--src/gui/npcstringdialog.h78
-rw-r--r--src/net/npchandler.cpp22
-rw-r--r--src/net/protocol.h5
-rw-r--r--src/npc.cpp18
-rw-r--r--src/npc.h2
11 files changed, 426 insertions, 2 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 43e5cb95..6bb1a2f3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -120,8 +120,12 @@ SET(SRCS
gui/minimap.h
gui/ministatus.cpp
gui/ministatus.h
+ gui/npcintegerdialog.cpp
+ gui/npcintegerdialog.h
gui/npclistdialog.cpp
gui/npclistdialog.h
+ gui/npcstringdialog.cpp
+ gui/npcstringdialog.h
gui/npc_text.cpp
gui/npc_text.h
gui/ok_dialog.cpp
diff --git a/src/Makefile.am b/src/Makefile.am
index 9a3fa3b9..2bb11268 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -76,8 +76,12 @@ aethyra_SOURCES = gui/widgets/dropdown.cpp \
gui/minimap.h \
gui/ministatus.cpp \
gui/ministatus.h \
+ gui/npcintegerdialog.cpp \
+ gui/npcintegerdialog.h \
gui/npclistdialog.cpp \
gui/npclistdialog.h \
+ gui/npcstringdialog.cpp \
+ gui/npcstringdialog.h \
gui/npc_text.cpp \
gui/npc_text.h \
gui/ok_dialog.cpp \
diff --git a/src/game.cpp b/src/game.cpp
index 7791d641..ec5bc267 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -60,7 +60,9 @@
#include "gui/menuwindow.h"
#include "gui/minimap.h"
#include "gui/ministatus.h"
+#include "gui/npcintegerdialog.h"
#include "gui/npclistdialog.h"
+#include "gui/npcstringdialog.h"
#include "gui/npc_text.h"
#include "gui/ok_dialog.h"
#include "gui/sdlinput.h"
@@ -118,8 +120,10 @@ SellDialog *sellDialog;
BuySellDialog *buySellDialog;
InventoryWindow *inventoryWindow;
EmoteWindow *emoteWindow;
+NpcIntegerDialog *npcIntegerDialog;
NpcListDialog *npcListDialog;
NpcTextDialog *npcTextDialog;
+NpcStringDialog *npcStringDialog;
SkillDialog *skillDialog;
Setup* setupWindow;
Minimap *minimap;
@@ -203,7 +207,9 @@ void createGuiWindows(Network *network)
inventoryWindow = new InventoryWindow();
emoteWindow = new EmoteWindow();
npcTextDialog = new NpcTextDialog();
+ npcIntegerDialog = new NpcIntegerDialog();
npcListDialog = new NpcListDialog();
+ npcStringDialog = new NpcStringDialog();
skillDialog = new SkillDialog();
setupWindow = new Setup();
minimap = new Minimap();
@@ -251,8 +257,10 @@ void destroyGuiWindows()
delete buySellDialog;
delete inventoryWindow;
delete emoteWindow;
+ delete npcIntegerDialog;
delete npcListDialog;
delete npcTextDialog;
+ delete npcStringDialog;
delete skillDialog;
delete setupWindow;
delete minimap;
@@ -648,7 +656,8 @@ void Game::handleInput()
default:
break;
}
- if (keyboard.isEnabled() && !chatWindow->isInputFocused())
+ if (keyboard.isEnabled() && !chatWindow->isInputFocused()
+ && !npcStringDialog->isInputFocused())
{
const int tKey = keyboard.getKeyIndex(event.key.keysym.sym);
// Do not activate shortcuts if tradewindow is visible
diff --git a/src/gui/npcintegerdialog.cpp b/src/gui/npcintegerdialog.cpp
new file mode 100644
index 00000000..f5b6ac5b
--- /dev/null
+++ b/src/gui/npcintegerdialog.cpp
@@ -0,0 +1,125 @@
+/*
+ * 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
+ */
+
+#include "npcintegerdialog.h"
+
+#include <limits>
+#include <sstream>
+
+#include "button.h"
+#include "textfield.h"
+
+#include "../npc.h"
+
+#include "../utils/gettext.h"
+#include "../utils/tostring.h"
+
+#include "widgets/layout.h"
+
+NpcIntegerDialog::NpcIntegerDialog():
+ Window(_("NPC Number Request"))
+{
+ mDecButton = new Button("-", "decvalue", this);
+ mIncButton = new Button("+", "incvalue", this);
+ mValueField = new TextField();
+ okButton = new Button(_("OK"), "ok", this);
+ cancelButton = new Button(_("Cancel"), "cancel", this);
+
+ mDecButton->setSize(20, 20);
+ mIncButton->setSize(20, 20);
+
+ place(0, 0, mDecButton);
+ place(1, 0, mValueField, 3);
+ place(4, 0, mIncButton);
+ place(2, 1, okButton);
+ place(3, 1, cancelButton, 2);
+ reflowLayout(175, 0);
+
+ setLocationRelativeTo(getParent());
+
+ mValueField->setActionEventId("valuefield");
+ mValueField->addKeyListener(this);
+}
+
+void NpcIntegerDialog::prepDialog(const int min, const int def, const int max)
+{
+ mMin = min;
+ mMax = max;
+ mDefault = def;
+ mValue = def;
+
+ mValueField->setText(toString(mValue));
+}
+
+int NpcIntegerDialog::getValue()
+{
+ return mValue;
+}
+
+void NpcIntegerDialog::action(const gcn::ActionEvent &event)
+{
+ int finish = 0;
+
+ if (event.getId() == "ok")
+ {
+ finish = 1;
+ }
+ else if (event.getId() == "cancel")
+ {
+ finish = 1;
+ mValue = mDefault;
+ }
+ else if (event.getId() == "decvalue" && mValue < mMin)
+ {
+ mValue--;
+ }
+ else if (event.getId() == "incvalue" && mValue > mMax)
+ {
+ mValue++;
+ }
+
+ mValueField->setText(toString(mValue));
+
+ if (finish)
+ {
+ setVisible(false);
+ current_npc->integerInput(mValue);
+ current_npc = 0;
+ }
+}
+
+void NpcIntegerDialog::keyPressed(gcn::KeyEvent &event)
+{
+ std::stringstream tempValue(mValueField->getText());
+ int value;
+ tempValue >> value;
+ if (value < mMin)
+ {
+ value = mMin;
+ }
+ if (value > mMax)
+ {
+ value = mMax;
+ }
+
+ mValue = value;
+ mValueField->setText(toString(value));
+}
diff --git a/src/gui/npcintegerdialog.h b/src/gui/npcintegerdialog.h
new file mode 100644
index 00000000..a45d57c4
--- /dev/null
+++ b/src/gui/npcintegerdialog.h
@@ -0,0 +1,82 @@
+/*
+ * 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
+ */
+
+#ifndef _TMW_GUI_NPCINTEGERDIALOG_H
+#define _TMW_GUI_NPCINTEGERDIALOG_H
+
+#include <iosfwd>
+#include <vector>
+
+#include <guichan/actionlistener.hpp>
+#include <guichan/keylistener.hpp>
+
+#include "window.h"
+
+#include "../guichanfwd.h"
+
+/**
+ * The npc integer input dialog.
+ *
+ * \ingroup Interface
+ */
+class NpcIntegerDialog : public Window, public gcn::ActionListener,
+ public gcn::KeyListener
+{
+ public:
+ /**
+ * Constructor.
+ *
+ * @see Window::Window
+ */
+ NpcIntegerDialog();
+
+ /**
+ * Called when receiving actions from the widgets.
+ */
+ void action(const gcn::ActionEvent &event);
+
+ /** Called when key is pressed */
+ void keyPressed(gcn::KeyEvent &event);
+
+ /**
+ * Returns the current value.
+ */
+ int getValue();
+
+ /**
+ * Prepares the NPC dialog.
+ *
+ * @param min The minimum value to allow
+ * @param def The default value
+ * @param max The maximum value to allow
+ */
+ void prepDialog(const int min, const int def, const int max);
+
+ private:
+ int mMin, mMax, mDefault, mValue;
+ gcn::Button *mDecButton;
+ gcn::Button *mIncButton;
+ gcn::TextField *mValueField;
+ gcn::Button *okButton;
+ gcn::Button *cancelButton;
+};
+
+#endif // _TMW_GUI_NPCINTEGERDIALOG_H
diff --git a/src/gui/npcstringdialog.cpp b/src/gui/npcstringdialog.cpp
new file mode 100644
index 00000000..6bca961c
--- /dev/null
+++ b/src/gui/npcstringdialog.cpp
@@ -0,0 +1,77 @@
+/*
+ * 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
+ */
+
+#include "npcstringdialog.h"
+
+#include <limits>
+#include <sstream>
+
+#include "button.h"
+#include "textfield.h"
+
+#include "../npc.h"
+
+#include "../utils/gettext.h"
+#include "../utils/tostring.h"
+
+#include "widgets/layout.h"
+
+NpcStringDialog::NpcStringDialog():
+ Window(_("NPC Text Request"))
+{
+ mValueField = new TextField("The Mana World"); // Just a sizing value :)
+ okButton = new Button(_("OK"), "ok", this);
+ cancelButton = new Button(_("Cancel"), "cancel", this);
+
+ place(0, 0, mValueField, 3);
+ place(1, 1, okButton);
+ place(2, 1, cancelButton);
+ reflowLayout(175, 0);
+
+ setLocationRelativeTo(getParent());
+}
+
+std::string NpcStringDialog::getValue()
+{
+ return mValueField->getText();
+}
+
+void NpcStringDialog::setValue(const std::string &value)
+{
+ mValueField->setText(value);
+}
+
+void NpcStringDialog::action(const gcn::ActionEvent &event)
+{
+ if (event.getId() == "cancel")
+ {
+ mValueField->setText("");
+ }
+
+ setVisible(false);
+ current_npc->stringInput(mValueField->getText());
+ current_npc = 0;
+}
+
+bool NpcStringDialog::isInputFocused()
+{
+ return mValueField->isFocused();
+}
diff --git a/src/gui/npcstringdialog.h b/src/gui/npcstringdialog.h
new file mode 100644
index 00000000..22054994
--- /dev/null
+++ b/src/gui/npcstringdialog.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
+ */
+
+#ifndef _TMW_GUI_NPCSTRINGDIALOG_H
+#define _TMW_GUI_NPCSTRINGDIALOG_H
+
+#include <iosfwd>
+#include <vector>
+
+#include <guichan/actionlistener.hpp>
+#include <guichan/keylistener.hpp>
+
+#include "window.h"
+
+#include "../guichanfwd.h"
+
+/**
+ * The npc integer input dialog.
+ *
+ * \ingroup Interface
+ */
+class NpcStringDialog : public Window, public gcn::ActionListener
+{
+ public:
+ /**
+ * Constructor.
+ *
+ * @see Window::Window
+ */
+ NpcStringDialog();
+
+ /**
+ * Called when receiving actions from the widgets.
+ */
+ void action(const gcn::ActionEvent &event);
+
+ /**
+ * Returns the current value.
+ */
+ std::string getValue();
+
+ /**
+ * Chnages the current value.
+ *
+ * @param value The new value
+ */
+ void setValue(const std::string &value);
+
+ /**
+ * Checks whether NpcStringDialog is Focused or not.
+ */
+ bool isInputFocused();
+
+ private:
+ gcn::TextField *mValueField;
+ gcn::Button *okButton;
+ gcn::Button *cancelButton;
+};
+
+#endif // _TMW_GUI_NPCSTRINGDIALOG_H
diff --git a/src/net/npchandler.cpp b/src/net/npchandler.cpp
index 4f3c4354..c597e31c 100644
--- a/src/net/npchandler.cpp
+++ b/src/net/npchandler.cpp
@@ -28,10 +28,14 @@
#include "../npc.h"
#include "../gui/npc_text.h"
+#include "../gui/npcintegerdialog.h"
#include "../gui/npclistdialog.h"
+#include "../gui/npcstringdialog.h"
+extern NpcIntegerDialog *npcIntegerDialog;
extern NpcListDialog *npcListDialog;
extern NpcTextDialog *npcTextDialog;
+extern NpcStringDialog *npcStringDialog;
NPCHandler::NPCHandler()
{
@@ -40,6 +44,8 @@ NPCHandler::NPCHandler()
SMSG_NPC_MESSAGE,
SMSG_NPC_NEXT,
SMSG_NPC_CLOSE,
+ SMSG_NPC_INT_INPUT,
+ SMSG_NPC_STR_INPUT,
0
};
handledMessages = _messages;
@@ -79,5 +85,21 @@ void NPCHandler::handleMessage(MessageIn *msg)
case SMSG_NPC_NEXT:
// Next button in NPC dialog, currently unused
break;
+
+ case SMSG_NPC_INT_INPUT:
+ // Request for an integer
+ id = msg->readInt32();
+ current_npc = dynamic_cast<NPC*>(beingManager->findBeing(id));
+ npcIntegerDialog->prepDialog(0, 0, 2147483647);
+ npcIntegerDialog->setVisible(true);
+ break;
+
+ case SMSG_NPC_STR_INPUT:
+ // Request for a string
+ id = msg->readInt32();
+ current_npc = dynamic_cast<NPC*>(beingManager->findBeing(id));
+ npcStringDialog->setValue("");
+ npcStringDialog->setVisible(true);
+ break;
}
}
diff --git a/src/net/protocol.h b/src/net/protocol.h
index 783283ba..0538abf4 100644
--- a/src/net/protocol.h
+++ b/src/net/protocol.h
@@ -79,7 +79,8 @@
#define SMSG_NPC_SELL 0x00c7
#define SMSG_NPC_BUY_RESPONSE 0x00ca
#define SMSG_NPC_SELL_RESPONSE 0x00cb
-
+#define SMSG_NPC_INT_INPUT 0x0142 /**< Integer input */
+#define SMSG_NPC_STR_INPUT 0x01d4 /**< String input */
#define SMSG_PLAYER_CHAT 0x008e /**< Player talks */
#define SMSG_WHISPER 0x0097 /**< Whisper Recieved */
#define SMSG_WHISPER_RESPONSE 0x0098
@@ -128,6 +129,8 @@
#define CMSG_NPC_LIST_CHOICE 0x00b8
#define CMSG_NPC_NEXT_REQUEST 0x00b9
#define CMSG_NPC_SELL_REQUEST 0x00c9
+#define CMSG_NPC_INT_RESPONSE 0x0143
+#define CMSG_NPC_STR_RESPONSE 0x01d5
#define CMSG_SKILL_LEVELUP_REQUEST 0x0112
#define CMSG_STAT_UPDATE_REQUEST 0x00bb
#define CMSG_TRADE_ITEM_ADD_REQUEST 0x00e8
diff --git a/src/npc.cpp b/src/npc.cpp
index a9aa216c..ae5ca476 100644
--- a/src/npc.cpp
+++ b/src/npc.cpp
@@ -134,6 +134,24 @@ void NPC::dialogChoice(char choice)
outMsg.writeInt8(choice);
}
+void NPC::integerInput(int value)
+{
+ MessageOut outMsg(mNetwork);
+ outMsg.writeInt16(CMSG_NPC_INT_RESPONSE);
+ outMsg.writeInt32(mId);
+ outMsg.writeInt32(value);
+}
+
+void NPC::stringInput(const std::string &value)
+{
+ MessageOut outMsg(mNetwork);
+ outMsg.writeInt16(CMSG_NPC_STR_RESPONSE);
+ outMsg.writeInt16(value.length() + 8);
+ outMsg.writeInt32(mId);
+ outMsg.writeString(value, value.length());
+ outMsg.writeInt8(0); // Just to be safe
+}
+
/*
* TODO Unify the buy() and sell() methods, without sacrificing readability of
* the code calling the method. buy(bool buySell) would be bad...
diff --git a/src/npc.h b/src/npc.h
index af1dfc66..1cb9a90f 100644
--- a/src/npc.h
+++ b/src/npc.h
@@ -44,6 +44,8 @@ class NPC : public Player
void talk();
void nextDialog();
void dialogChoice(char choice);
+ void integerInput(int value);
+ void stringInput(const std::string &value);
void buy();
void sell();