summaryrefslogtreecommitdiff
path: root/src/gui/connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/connection.cpp')
-rw-r--r--src/gui/connection.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/gui/connection.cpp b/src/gui/connection.cpp
new file mode 100644
index 00000000..0e885598
--- /dev/null
+++ b/src/gui/connection.cpp
@@ -0,0 +1,152 @@
+/*
+ * 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 "connection.h"
+
+#include <guichan/widgets/label.hpp>
+
+#include "button.h"
+#include "progressbar.h"
+
+#include "../game.h"
+#include "../graphics.h"
+#include "../log.h"
+#include "../main.h"
+
+#include "../net/messagein.h"
+#include "../net/messageout.h"
+#include "../net/network.h"
+#include "../net/protocol.h"
+
+ConnectionDialog::ConnectionDialog():
+ Window("Info"), mProgress(0), mStatus(NET_CONNECTING)
+{
+ setContentSize(200, 100);
+ mCancelButton = new Button("Cancel");
+ mCancelButton->setPosition(5, 100 - 5 - mCancelButton->getHeight());
+ mCancelButton->setEventId("cancel");
+ mCancelButton->addActionListener(this);
+ mProgressBar = new ProgressBar(0.0, 5, mCancelButton->getY() - 25,
+ 200 - 10, 20, 128, 128, 128);
+ mLabel = new gcn::Label("Connecting...");
+ mLabel->setPosition(5, mProgressBar->getY() - 25);
+
+ add(mLabel);
+ add(mCancelButton);
+ add(mProgressBar);
+ setLocationRelativeTo(getParent());
+
+ const char *host = iptostring(map_address);
+ openConnection(host, map_port);
+}
+
+ConnectionDialog::~ConnectionDialog()
+{
+}
+
+void ConnectionDialog::logic()
+{
+ mProgress += 0.005f;
+ if (mProgress > 1.0f)
+ {
+ mProgress = 0.0f;
+ }
+ mProgressBar->setProgress(mProgress);
+ Window::logic();
+
+ switch (mStatus)
+ {
+ case NET_CONNECTING:
+ mStatus = pollConnection();
+ break;
+ case NET_ERROR:
+ logger->log("Connection::Unable to connect");
+ errorMessage = "Unable to connect to map server";
+ state = ERROR_STATE;
+ closeConnection();
+ break;
+ case NET_CONNECTED:
+ mapLogin();
+ state = GAME_STATE;
+ break;
+ }
+}
+
+void ConnectionDialog::action(const std::string& eventId)
+{
+ if (eventId == "cancel")
+ {
+ state = EXIT_STATE;
+ }
+}
+
+void ConnectionDialog::mapLogin()
+{
+ // Send login infos
+ MessageOut outMsg;
+ outMsg.writeShort(0x0072);
+ outMsg.writeLong(account_ID);
+ outMsg.writeLong(char_ID);
+ outMsg.writeLong(session_ID1);
+ outMsg.writeLong(session_ID2);
+ outMsg.writeByte(sex);
+
+ // Skip a mysterious 4 bytes
+ while ((in_size < 4)|| (out_size > 0)) flush();
+ skip(4);
+
+ MessageIn msg = get_next_message();
+
+ if (msg.getId() == SMSG_LOGIN_SUCCESS)
+ {
+ unsigned char direction;
+ msg.readLong(); // server tick
+ msg.readCoordinates(startX, startY, direction);
+ msg.skip(2); // unknown
+ logger->log("Protocol: Player start position: (%d, %d), Direction: %d",
+ startX, startY, direction);
+ }
+ else if (msg.getId() == 0x0081)
+ {
+ logger->log("Warning: Map server D/C");
+ }
+ else
+ {
+ logger->error("Unknown packet: map_start");
+ }
+
+ skip(msg.getLength());
+
+ // Send "map loaded"
+ // TODO: be able to reuse the same msg
+ MessageOut newMsg;
+ newMsg.writeShort(0x007d);
+}
+
+void connectionInputHandler(SDL_KeyboardEvent *keyEvent)
+{
+ if (keyEvent->keysym.sym == SDLK_ESCAPE)
+ {
+ state = EXIT_STATE;
+ }
+}