summaryrefslogtreecommitdiff
path: root/src/gui/char_server.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2004-12-12 19:58:11 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2004-12-12 19:58:11 +0000
commit75b19e771c527e8444aae70543b2b617dae2e892 (patch)
tree7414fdd8d4a9bb9da3a79cd29a833c22f4380284 /src/gui/char_server.cpp
parent812e679c9befbfe98cc311723b8296df0384515e (diff)
downloadmana-75b19e771c527e8444aae70543b2b617dae2e892.tar.gz
mana-75b19e771c527e8444aae70543b2b617dae2e892.tar.bz2
mana-75b19e771c527e8444aae70543b2b617dae2e892.tar.xz
mana-75b19e771c527e8444aae70543b2b617dae2e892.zip
Ported server list dialog over to Guichan.
Diffstat (limited to 'src/gui/char_server.cpp')
-rw-r--r--src/gui/char_server.cpp255
1 files changed, 153 insertions, 102 deletions
diff --git a/src/gui/char_server.cpp b/src/gui/char_server.cpp
index 7217abd8..c84fc167 100644
--- a/src/gui/char_server.cpp
+++ b/src/gui/char_server.cpp
@@ -25,118 +25,169 @@
#include "../graphic/graphic.h"
char server[30];
+int showServerList = 1;
-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;
+ServerListModel *serverListModel;
+gcn::ListBox *serverList;
+
+
+void ServerSelectListener::action(const std::string& eventId) {
+ printf("%s\n", eventId.c_str());
+ if (eventId == "ok") {
+ server_char_server(serverList->getSelected());
+ }
+ else if (eventId == "cancel") {
+ }
+ showServerList = 0;
+}
+
+
+int ServerListModel::getNumberOfElements() {
+ return n_server;
+}
+
+std::string ServerListModel::getElementAt(int i) {
+ static char buffer[30];
+ sprintf(buffer, "%s (%i)", server_info[i].name,
+ server_info[i].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);
- blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600);
- 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();
- }
+ // Create dialog
+ gcn::Container *dialog;
+ gcn::Button *okButton;
+ gcn::Button *cancelButton;
+ gcn::ScrollArea *scrollArea;
+
+ serverListModel = new ServerListModel();
+ dialog = new gcn::Container();
+ serverList = new gcn::ListBox(serverListModel);
+ scrollArea = new gcn::ScrollArea(serverList);
+ okButton = new gcn::Button("OK");
+ cancelButton = new gcn::Button("Cancel");
+
+ dialog->setDimension(gcn::Rectangle(300, 200, 200, 100));
+ scrollArea->setDimension(gcn::Rectangle(4, 4, 192, 55));
+ okButton->setPosition(120, 70);
+ cancelButton->setPosition(146, 70);
+
+ serverList->setEventId("ok");
+ okButton->setEventId("ok");
+ cancelButton->setEventId("cancel");
+
+ ServerSelectListener *actionListener = new ServerSelectListener();
+ serverList->addActionListener(actionListener);
+ okButton->addActionListener(actionListener);
+ cancelButton->addActionListener(actionListener);
+
+ dialog->add(scrollArea);
+ dialog->add(okButton);
+ dialog->add(cancelButton);
+
+ guiTop->add(dialog);
+
+ state = LOGIN;
+
+ if (n_server == 0) {
+ // Disable Ok button
+ //okButton->char_server_dialog[2].flags |= D_DISABLED;
+ } else {
+ // Select first server
+ serverList->setSelected(1);
+ }
+
+ showServerList = 1;
+ while (showServerList) {
+ clear_bitmap(buffer);
+ blit((BITMAP *)graphic[LOGIN_BMP].dat, buffer, 0, 0, 0, 0, 800, 600);
+ gui_update(NULL);
+ blit(buffer, screen, 0, 0, 0, 0, 800, 600);
+ }
+
+ delete dialog;
+ delete serverList;
+ delete serverListModel;
+ delete scrollArea;
+ delete okButton;
+ delete cancelButton;
+ delete actionListener;
}
-void server_char_server() {
- int ret;
- state = LOGIN;
+void server_char_server(int serverIndex) {
+ 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);
+ ret = open_session(iptostring(server_info[serverIndex].address),
+ server_info[serverIndex].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 = (PLAYER_INFO *)malloc(sizeof(PLAYER_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].gp = RFIFOL(24+106*i+8);
- char_info[i].job_xp = RFIFOL(24+106*i+12);
- char_info[i].job_lv = RFIFOL(24+106*i+16);
- 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);
- char_info[i].hair_style = RFIFOW(24+106*i+54);
- char_info[i].hair_color = RFIFOW(24+106*i+70);
- char_info[i].weapon = RFIFOW(24+106*i+56);
- }
- state = CHAR_SELECT;
-
- log("CharServer", "Player: %s (Packet ID: %x, Length: %d",
- char_info->name, RFIFOW(0), 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");
+ if(RFIFOW(0)==0x006b) {
+ while(in_size<RFIFOW(2))flush();
+ n_character = (RFIFOW(2)-24)/106;
+ char_info = (PLAYER_INFO *)malloc(sizeof(PLAYER_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].gp = RFIFOL(24+106*i+8);
+ char_info[i].job_xp = RFIFOL(24+106*i+12);
+ char_info[i].job_lv = RFIFOL(24+106*i+16);
+ 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);
+ char_info[i].hair_style = RFIFOW(24+106*i+54);
+ char_info[i].hair_color = RFIFOW(24+106*i+70);
+ char_info[i].weapon = RFIFOW(24+106*i+56);
+ }
+ state = CHAR_SELECT;
+
+ log("CharServer", "Player: %s (Packet ID: %x, Length: %d",
+ char_info->name, RFIFOW(0), 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;
- default:
- ok("Error", "Rejected from server");
- break;
- }
- RFIFOSKIP(3);
- close_session();
- } else ok("Error", "Unknown error");
- // Todo: add other packets
+ }
+ RFIFOSKIP(3);
+ close_session();
+ } else ok("Error", "Unknown error");
+ // Todo: add other packets
}