summaryrefslogtreecommitdiff
path: root/src/gui/char_server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/char_server.cpp')
-rw-r--r--src/gui/char_server.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp
new file mode 100644
index 00000000..36ef5d53
--- /dev/null
+++ b/src/gui/char_server.cpp
@@ -0,0 +1,141 @@
+/**
+
+ 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 "char_server.h"
+#include "../Graphic/graphic.h"
+
+char server[30];
+
+DIALOG char_server_dialog[] = {
+ /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */
+ { tmw_dialog_proc, 300, 240, 200, 104, 0, -1, 0, 0, 0, 0, (char*)"Server select", NULL, NULL },
+ { tmw_list_proc, 304, 262, 192, 55, 0, 0, 0, 0, 0, 0, (char*)server_list, NULL, NULL },
+ { tmw_button_proc, 398, 322, 44, 18, 0, -1, 'o', D_EXIT, -1, 0, (char*)"&Ok", NULL, NULL },
+ { tmw_button_proc, 446, 322, 44, 18, 0, -1, 'c', D_EXIT, -1, 0, (char*)"&Cancel", NULL, NULL },
+ { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL },
+};
+
+/** Helper function to create server list */
+char *server_list(int index, int *size) {
+ static char buffer[30];
+ if (index < 0) {
+ *size = n_server;
+ return NULL;
+ }
+ sprintf(buffer, "%s (%i)", server_info[index].name, server_info[index].online_users);
+ return buffer;
+}
+
+void char_server() {
+ state = LOGIN;
+ centre_dialog(char_server_dialog);
+ DIALOG_PLAYER *player = init_dialog(char_server_dialog, -1);
+ if(!player)ok("Error", "Unable to initialize login dialog");
+ int gui_exit = 1;
+ if(n_server==0)char_server_dialog[2].flags |= D_DISABLED;
+ while ((!key[KEY_ESC])&&(gui_exit)&&(!key[KEY_ENTER])) {
+ clear_bitmap(buffer);
+ if(stretch_mode!=0)blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 80, 60, 640, 480);
+ else blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, -120, -90, 640, 480);
+ gui_exit = gui_update(player);
+ blit(buffer, screen, 0, 0, 0, 0, 800, 600);
+ }
+ gui_exit = shutdown_dialog(player);
+ if((gui_exit==2)||(key[KEY_ENTER])) {
+ server_char_server();
+ }
+}
+
+void server_char_server() {
+ int ret;
+ state = LOGIN;
+
+ // Connect to char server
+ ret = open_session(iptostring(server_info[char_server_dialog[1].d1].address), server_info[char_server_dialog[1].d1].port);
+ if(ret==SOCKET_ERROR) {
+ ok("Error", "Unable to connect to char server");
+ return;
+ }
+
+ // Send login infos
+ WFIFOW(0) = net_w_value(0x0065);
+ WFIFOL(2) = net_l_value(account_ID);
+ WFIFOL(6) = net_l_value(session_ID1);
+ WFIFOL(10) = net_l_value(session_ID2);
+ WFIFOW(14) = 0;
+ WFIFOB(16) = net_b_value(sex);
+ WFIFOSET(17);
+
+ while((in_size<4)||(out_size>0))flush();
+ RFIFOSKIP(4);
+
+ while(in_size<3)flush();
+
+ if(RFIFOW(0)==0x006b) {
+ while(in_size<RFIFOW(2))flush();
+ n_character = (RFIFOW(2)-24)/106;
+ char_info = (CHAR_SEL_INFO *)malloc(sizeof(CHAR_SEL_INFO)*n_character);
+ for(int i=0;i<n_character;i++) {
+ char_info[i].id = RFIFOL(24+106*i);
+ strcpy(char_info[i].name, RFIFOP(24+106*i+74));
+ char_info[i].hp = RFIFOW(24+106*i+42);
+ char_info[i].max_hp = RFIFOW(24+106*i+44);
+ char_info[i].xp = RFIFOL(24+106*i+4);
+ char_info[i].zeny = RFIFOL(24+106*i+8);
+ char_info[i].job_xp = RFIFOL(24+106*i+16);
+ char_info[i].job_lv = RFIFOL(24+106*i+24);
+ char_info[i].sp = RFIFOW(24+106*i+46);
+ char_info[i].max_sp = RFIFOW(24+106*i+48);
+ char_info[i].lv = RFIFOW(24+106*i+58);
+ char_info[i].STR = RFIFOB(24+106*i+98);
+ char_info[i].AGI = RFIFOB(24+106*i+99);
+ char_info[i].VIT = RFIFOB(24+106*i+100);
+ char_info[i].INT = RFIFOB(24+106*i+101);
+ char_info[i].DEX = RFIFOB(24+106*i+102);
+ char_info[i].LUK = RFIFOB(24+106*i+103);
+ }
+ state = CHAR_SELECT;
+
+ log("Player", "name", char_info->name);
+ log_hex("Char_Server_Packet", "Packet_ID", RFIFOW(0));
+ log_int("Char_Server_Packet", "Packet_length", RFIFOW(2));
+
+
+ RFIFOSKIP(RFIFOW(2));
+ } else if(RFIFOW(0)==0x006c) {
+ switch(RFIFOB(2)) {
+ case 0:
+ ok("Error", "Access denied");
+ break;
+ case 1:
+ ok("Error", "Cannot use this ID");
+ break;
+ default:
+ ok("Error", "Rejected from server");
+ break;
+ }
+ RFIFOSKIP(3);
+ close_session();
+ } else ok("Error", "Unknown error");
+ // Todo: add other packets
+}