summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorblue112 <bluesansdouze@gmail.com>2009-04-21 15:31:21 +0200
committerJared Adams <jaxad0127@gmail.com>2009-04-21 08:35:52 -0600
commitfa96d81b86914adb3d8608f8ab4f734d3286fcd4 (patch)
tree422d35e88df76f05f40b5308fa842ce8a0ceeb3b
parent18bb2946b4acfe8d3ac9184a453898718488e556 (diff)
downloadmana-client-fa96d81b86914adb3d8608f8ab4f734d3286fcd4.tar.gz
mana-client-fa96d81b86914adb3d8608f8ab4f734d3286fcd4.tar.bz2
mana-client-fa96d81b86914adb3d8608f8ab4f734d3286fcd4.tar.xz
mana-client-fa96d81b86914adb3d8608f8ab4f734d3286fcd4.zip
Trade system
Handler & GUI modification, to make the three steps systems working. Protocol changes for the same reason Player.cpp changes because it uses the cancel method which signature has changed
-rw-r--r--src/gui/trade.cpp63
-rw-r--r--src/gui/trade.h8
-rw-r--r--src/net/tmwserv/gameserver/player.cpp2
-rw-r--r--src/net/tmwserv/protocol.h15
-rw-r--r--src/net/tmwserv/tradehandler.cpp16
5 files changed, 73 insertions, 31 deletions
diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp
index c67b0b7b..7ed41387 100644
--- a/src/gui/trade.cpp
+++ b/src/gui/trade.cpp
@@ -44,20 +44,22 @@
#include "utils/stringutils.h"
#include "utils/strprintf.h"
+
#include <sstream>
#include <guichan/font.hpp>
-#define CAPTION_PROPOSE _("Propose trade")
-#define CAPTION_WAIT _("Waiting")
-#define CAPTION_ACCEPT _("Confirm trade")
+#define CAPTION_PROPOSE _("!Propose trade")
+#define CAPTION_CONFIRMED _("Confirmed. Waiting...")
+#define CAPTION_ACCEPT _("!Agree trade")
+#define CAPTION_ACCEPTED _("Agreed. Waiting...")
TradeWindow::TradeWindow():
Window(_("Trade: You")),
mMyInventory(new Inventory(INVENTORY_SIZE)),
mPartnerInventory(new Inventory(INVENTORY_SIZE)),
mStatus(PROPOSING)
-{
+{
setWindowName("Trade");
setResizable(true);
setCloseButton(true);
@@ -69,12 +71,13 @@ TradeWindow::TradeWindow():
getFont()->getWidth(_("Trade")) ?
_("OK") : _("Trade");
- Button *addButton = new Button(_("Add"), "add", this);
+ mAddButton = new Button(_("Add"), "add", this);
mOkButton = new Button("", "", this); // Will be filled in later
int width = std::max(mOkButton->getFont()->getWidth(CAPTION_PROPOSE),
- mOkButton->getFont()->getWidth(CAPTION_WAIT));
+ mOkButton->getFont()->getWidth(CAPTION_CONFIRMED));
width = std::max(width, mOkButton->getFont()->getWidth(CAPTION_ACCEPT));
+ width = std::max(width, mOkButton->getFont()->getWidth(CAPTION_ACCEPTED));
mOkButton->setWidth(8 + width);
@@ -92,10 +95,10 @@ TradeWindow::TradeWindow():
mMoneyLabel = new Label(strprintf(_("You get %s."), ""));
gcn::Label *mMoneyLabel2 = new Label(_("You give:"));
-
+
mMoneyField = new TextField;
mMoneyField->setWidth(40);
- Button *moneyChange = new Button(_("Change"), "money", this);
+ mMoneyChangeButton = new Button(_("Change"), "money", this);
place(1, 0, mMoneyLabel);
place(0, 1, myScroll).setPadding(3);
@@ -104,9 +107,9 @@ TradeWindow::TradeWindow():
place = getPlacer(0, 0);
place(0, 0, mMoneyLabel2);
place(1, 0, mMoneyField);
- place(2, 0, moneyChange).setHAlign(LayoutCell::LEFT);
+ place(2, 0, mMoneyChangeButton).setHAlign(LayoutCell::LEFT);
place = getPlacer(0, 2);
- place(0, 0, addButton);
+ place(0, 0, mAddButton);
place(1, 0, mOkButton);
Layout &layout = getLayout();
layout.extend(0, 2, 2, 1);
@@ -129,13 +132,13 @@ void TradeWindow::setMoney(int amount)
mMoneyLabel->setCaption(strprintf(_("You get %s."),
Units::formatCurrency(amount).c_str()));
mMoneyLabel->adjustSize();
- setStatus(PREPARING);
+ //setStatus(PREPARING);
}
void TradeWindow::addItem(int id, bool own, int quantity)
{
(own ? mMyInventory : mPartnerInventory)->addItem(id, quantity);
- setStatus(PREPARING);
+ //setStatus(PREPARING);
}
void TradeWindow::addItem(int id, bool own, int quantity, bool equipment)
@@ -172,9 +175,11 @@ void TradeWindow::reset()
mPartnerInventory->clear();
mOkOther = false;
mOkMe = false;
- mMoneyLabel->setCaption(strprintf(_("You get %s."), ""));
+ mMoneyLabel->setCaption(strprintf(_("You get %s."), "0GP"));
mMoneyField->setEnabled(true);
mMoneyField->setText("");
+ mAddButton->setEnabled(true);
+ mMoneyChangeButton->setEnabled(true);
setStatus(PREPARING);
}
@@ -186,7 +191,11 @@ void TradeWindow::receivedOk(bool own)
mOkOther = true;
if (mOkMe && mOkOther)
+ {
+ mOkMe = false;
+ mOkOther = false;
setStatus(ACCEPTING);
+ }
}
void TradeWindow::tradeItem(Item *item, int quantity)
@@ -221,18 +230,22 @@ void TradeWindow::setStatus(Status s)
mOkButton->setActionEventId("ok");
break;
case PROPOSING:
- mOkButton->setCaption(CAPTION_WAIT);
+ mOkButton->setCaption(CAPTION_CONFIRMED);
mOkButton->setActionEventId("");
break;
case ACCEPTING:
mOkButton->setCaption(CAPTION_ACCEPT);
mOkButton->setActionEventId("trade");
break;
+ case ACCEPTED:
+ mOkButton->setCaption(CAPTION_ACCEPTED);
+ mOkButton->setActionEventId("");
+ break;
default:
break;
}
- mOkButton->setEnabled(s != PROPOSING);
+ mOkButton->setEnabled((s != PROPOSING && s != ACCEPTED));
}
void TradeWindow::action(const gcn::ActionEvent &event)
@@ -241,6 +254,9 @@ void TradeWindow::action(const gcn::ActionEvent &event)
if (event.getId() == "add")
{
+ if(mStatus != PREPARING)
+ return;
+
if (!inventoryWindow->isVisible())
return;
@@ -281,19 +297,32 @@ void TradeWindow::action(const gcn::ActionEvent &event)
else if (event.getId() == "ok")
{
mMoneyField->setEnabled(false);
+ mAddButton->setEnabled(false);
+ mMoneyChangeButton->setEnabled(false);
+ receivedOk(true);
+ setStatus(PROPOSING);
Net::getTradeHandler()->confirm();
}
else if (event.getId() == "trade")
{
+ receivedOk(true);
+ setStatus(ACCEPTED);
Net::getTradeHandler()->finish();
- setStatus(PROPOSING);
}
else if (event.getId() == "money")
{
+ if(mStatus != PREPARING)
+ return;
+
int v = atoi(mMoneyField->getText().c_str());
+ int curMoney = player_node->getMoney();
+ if(v > curMoney)
+ {
+ localChatTab->chatLog(_("You don't have enough money"), BY_SERVER);
+ v = curMoney;
+ }
Net::getTradeHandler()->setMoney(v);
mMoneyField->setText(strprintf("%d", v));
- setStatus(PREPARING);
}
}
diff --git a/src/gui/trade.h b/src/gui/trade.h
index 2260dcc1..3c292496 100644
--- a/src/gui/trade.h
+++ b/src/gui/trade.h
@@ -114,9 +114,10 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener
private:
enum Status
{
- PREPARING, /**< Players are adding items. */
- PROPOSING, /**< Local player is proposing a trade. */
- ACCEPTING /**< Distant player is proposing a trade. */
+ PREPARING, /**< Players are adding items. (1) */
+ PROPOSING, /**< Local player has confirmed the trade. (1) */
+ ACCEPTING, /**< Accepting the trade. (2) */
+ ACCEPTED /**< Local player has accepted the trade. */
};
/**
@@ -134,6 +135,7 @@ class TradeWindow : public Window, gcn::ActionListener, gcn::SelectionListener
gcn::Label *mMoneyLabel;
gcn::Button *mAddButton;
gcn::Button *mOkButton;
+ gcn::Button *mMoneyChangeButton;
gcn::TextField *mMoneyField;
Status mStatus;
diff --git a/src/net/tmwserv/gameserver/player.cpp b/src/net/tmwserv/gameserver/player.cpp
index a3e1458c..3f05c954 100644
--- a/src/net/tmwserv/gameserver/player.cpp
+++ b/src/net/tmwserv/gameserver/player.cpp
@@ -81,7 +81,7 @@ void Net::GameServer::Player::requestTrade(int id)
void Net::GameServer::Player::acceptTrade(bool accept)
{
- MessageOut msg(accept ? PGMSG_TRADE_ACCEPT : PGMSG_TRADE_CANCEL);
+ MessageOut msg(accept ? PGMSG_TRADE_REQUEST : PGMSG_TRADE_CANCEL);
Net::GameServer::connection->send(msg);
}
diff --git a/src/net/tmwserv/protocol.h b/src/net/tmwserv/protocol.h
index 7eb0b931..57926611 100644
--- a/src/net/tmwserv/protocol.h
+++ b/src/net/tmwserv/protocol.h
@@ -129,12 +129,15 @@ enum {
GPMSG_TRADE_COMPLETE = 0x02C3, // -
PGMSG_TRADE_CANCEL = 0x02C4, // -
GPMSG_TRADE_CANCEL = 0x02C5, // -
- PGMSG_TRADE_ACCEPT = 0x02C6, // -
- GPMSG_TRADE_ACCEPT = 0x02C7, // -
- PGMSG_TRADE_ADD_ITEM = 0x02C8, // B slot, B amount
- GPMSG_TRADE_ADD_ITEM = 0x02C9, // W item id, B amount
- PGMSG_TRADE_SET_MONEY = 0x02CA, // L amount
- GPMSG_TRADE_SET_MONEY = 0x02CB, // L amount
+ PGMSG_TRADE_AGREED = 0x02C6, // -
+ GPMSG_TRADE_AGREED = 0x02C7, // -
+ PGMSG_TRADE_CONFIRM = 0x02C8, // -
+ GPMSG_TRADE_CONFIRM = 0x02C9, // -
+ PGMSG_TRADE_ADD_ITEM = 0x02CA, // B slot, B amount
+ GPMSG_TRADE_ADD_ITEM = 0x02CB, // W item id, B amount
+ PGMSG_TRADE_SET_MONEY = 0x02CC, // L amount
+ GPMSG_TRADE_SET_MONEY = 0x02CD, // L amount
+ GPMSG_TRADE_BOTH_CONFIRM = 0x02CE, // -
PGMSG_USE_ITEM = 0x0300, // B slot
GPMSG_USE_RESPONSE = 0x0301, // B error
GPMSG_BEINGS_DAMAGE = 0x0310, // { W being id, W amount }*
diff --git a/src/net/tmwserv/tradehandler.cpp b/src/net/tmwserv/tradehandler.cpp
index 2b10bac1..ae190c96 100644
--- a/src/net/tmwserv/tradehandler.cpp
+++ b/src/net/tmwserv/tradehandler.cpp
@@ -71,13 +71,16 @@ TradeHandler::TradeHandler():
GPMSG_TRADE_CANCEL,
GPMSG_TRADE_START,
GPMSG_TRADE_COMPLETE,
- GPMSG_TRADE_ACCEPT,
+ GPMSG_TRADE_AGREED,
+ GPMSG_TRADE_BOTH_CONFIRM,
+ GPMSG_TRADE_CONFIRM,
GPMSG_TRADE_ADD_ITEM,
GPMSG_TRADE_SET_MONEY,
0
};
handledMessages = _messages;
tradeHandler = this;
+
}
void TradeHandler::setAcceptTradeRequests(bool acceptTradeRequests)
@@ -127,10 +130,14 @@ void TradeHandler::handleMessage(MessageIn &msg)
tradeWindow->setVisible(true);
break;
- case GPMSG_TRADE_ACCEPT:
+ case GPMSG_TRADE_BOTH_CONFIRM:
tradeWindow->receivedOk(false);
break;
+ case GPMSG_TRADE_AGREED:
+ tradeWindow->receivedOk(false);
+ break;
+
case GPMSG_TRADE_CANCEL:
localChatTab->chatLog("Trade canceled.", BY_SERVER);
tradeWindow->setVisible(false);
@@ -187,12 +194,13 @@ void TradeHandler::setMoney(int amount)
void TradeHandler::confirm()
{
- // TODO
+ MessageOut msg(PGMSG_TRADE_CONFIRM);
+ Net::GameServer::connection->send(msg);
}
void TradeHandler::finish()
{
- MessageOut msg(PGMSG_TRADE_ACCEPT);
+ MessageOut msg(PGMSG_TRADE_AGREED);
Net::GameServer::connection->send(msg);
}