diff options
| author | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-06-30 20:25:53 +0000 |
|---|---|---|
| committer | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-06-30 20:25:53 +0000 |
| commit | 62cdf2b04aa8d0162da8e024d9901ba5743bf5e3 (patch) | |
| tree | 0fee4d7fe539986956cafc8c729d3b68d37d3d7b /src/screen | |
| parent | 55233c4949d7bed70345f6fea44315df151d9ba5 (diff) | |
- hrac moze sucastne chodit aj strielat
- na indexovanie poloziek v list_t sa pouizva index.c ( postaveny na list_t )
- oprava chyby, porgram sa zrutil ak nebolo inicializovane audio
- zexxov patch
git-svn-id: http://opensvn.csie.org/tuxanci_ng@80 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/screen')
| -rw-r--r-- | src/screen/Makefile | 6 | ||||
| -rw-r--r-- | src/screen/screen_browser.c | 396 | ||||
| -rw-r--r-- | src/screen/screen_browser.h | 36 | ||||
| -rw-r--r-- | src/screen/screen_gameType.c | 33 | ||||
| -rw-r--r-- | src/screen/screen_gameType.h | 3 |
5 files changed, 472 insertions, 2 deletions
diff --git a/src/screen/Makefile b/src/screen/Makefile index 41c8ae1..32fb758 100644 --- a/src/screen/Makefile +++ b/src/screen/Makefile @@ -1,9 +1,12 @@ -all: screen_analyze.o screen_credits.o screen_gameType.o screen_choiceArena.o screen_mainMenu.o screen_setting.o screen_table.o screen_world.o +all: screen_analyze.o screen_browser.o screen_credits.o screen_gameType.o screen_choiceArena.o screen_mainMenu.o screen_setting.o screen_table.o screen_world.o screen_analyze.o: screen_analyze.c screen_analyze.h $(CC) $(CFLAGS) -o screen_analyze.o -c screen_analyze.c +screen_browser.o: screen_browser.c screen_browser.h + $(CC) $(CFLAGS) -o screen_browser.o -c screen_browser.c + screen_credits.o: screen_credits.c screen_credits.h $(CC) $(CFLAGS) -o screen_credits.o -c screen_credits.c @@ -22,7 +25,6 @@ screen_table.o: screen_table.c screen_table.h screen_world.o: screen_world.c screen_world.h $(CC) $(CFLAGS) -o screen_world.o -c screen_world.c - clean: rm -rf *.o diff --git a/src/screen/screen_browser.c b/src/screen/screen_browser.c new file mode 100644 index 0000000..602881f --- /dev/null +++ b/src/screen/screen_browser.c @@ -0,0 +1,396 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include "base/main.h" +#include "base/list.h" +#include "base/textFile.h" +#include "base/homeDirector.h" +#include "base/net_multiplayer.h" + +#include "client/language.h" +#include "client/interface.h" +#include "client/screen.h" +#include "client/image.h" + +#ifdef SUPPORT_NET_UNIX_UDP +#include <sys/socket.h> +#include <sys/types.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <unistd.h> +#include <fcntl.h> + +#include "net_unix/udp.h" +#endif + +#ifndef NO_SOUND +#include "audio/music.h" +#endif + +#include "screen/screen_gameType.h" +#include "screen/screen_browser.h" + +#include "widget/widget_image.h" +#include "widget/widget_label.h" +#include "widget/widget_button.h" +#include "widget/widget_select.h" + +#define SERVER_TIMEOUT 200 + +static widget_image_t *image_backgorund; + +static widget_button_t *button_play; +static widget_button_t *button_back; + +static widget_label_t *label_server; + +static widget_select_t *select_server; + +static server_t server_list; + +static int LoadServers (); +static server_t *server_getcurr (); + +void startScreenBrowser() +{ +#ifndef NO_SOUND + playMusic("menu", MUSIC_GROUP_BASE); +#endif + + LoadServers (); +} + +void drawScreenBrowser() +{ + drawWidgetImage(image_backgorund); + + drawWidgetLabel(label_server); + + drawWidgetSelect(select_server); + + drawWidgetButton(button_play); + drawWidgetButton(button_back); +} + +void eventScreenBrowser() +{ + eventWidgetSelect(select_server); + + eventWidgetButton(button_play); + eventWidgetButton(button_back); +} + +void stopScreenBrowser() +{ + unsigned i = 0; + server_t *server; + + listDoEmpty(select_server->list); + + while (1) { + i = 0; + for (server = server_list.next; server != &server_list; server = server->next) { + server->next->prev = server->prev; + server->prev->next = server->next; + + //if (server->version) + // free (server->version); + + //if (server->arena) + //free (server->arena); + + free (server); + + i ++; + break; + } + + if (!i) + return; + } +} + +static void eventWidget(void *p) +{ + widget_button_t *button; + + button = (widget_button_t *)(p); + + if( button == button_play ) + { + server_t *server = server_getcurr (); + + if (!server) + return; + + /* server je offline */ + if (!server->state) + return; +#ifdef SUPPORT_NET_UNIX_UDP + struct sockaddr_in srv; + srv.sin_addr.s_addr = server->ip; +#endif + setSettingGameType (NET_GAME_TYPE_CLIENT); + setSettingIP(inet_ntoa (srv.sin_addr)); + setSettingPort(server->port); + + setScreen("world"); + } + + if( button == button_back ) + { + setScreen("gameType"); + } +} + +server_t *server_getcurr () +{ + unsigned i = 0; + server_t *server; + + for (server = server_list.next; server != &server_list; server = server->next) { + if (i == select_server->select) + return server; + + i ++; + } + + return 0; +} + +int server_getinfo (server_t *server) +{ +#ifdef SUPPORT_NET_UNIX_UDP + struct sockaddr_in srv; + srv.sin_addr.s_addr = server->ip; + + sock_udp_t *sock = connectUdpSocket(inet_ntoa (srv.sin_addr), server->port, PROTO_UDPv4); + + char request[8]; + memcpy (request, "status\n", 7); + + writeUdpSocket(sock, sock, request, 7); + + char *str = (char *) malloc (sizeof (char) * 257); + + // Lets make socket non-blocking + int oldFlag = fcntl (sock->sock, F_GETFL, 0); + if (fcntl (sock->sock, F_SETFL, oldFlag | O_NONBLOCK) == -1) { + return -1; + } +#else + return 0; +#endif + /* 500ms timeout */ + unsigned timeout = SERVER_TIMEOUT; + int ret = 0; + + while (timeout) { + usleep (1); +#ifdef SUPPORT_NET_UNIX_UDP + ret = readUdpSocket(sock, sock, str, 256); +#endif + if (ret > 0) + break; + + timeout --; + } + + /* server not respond */ + if (timeout < 1) { + free (str); + server->state = 0; + return 0; + } + + server->ping = SERVER_TIMEOUT - timeout; + +/* + "version: svnX\n" + "clients: N\n" + "maxclients: M\n" + "uptime: D\n" +*/ + + typedef struct { + char *version; + unsigned char clients; + unsigned char maxclients; + unsigned uptime; + } server_info; + + server_info *info = (server_info *) malloc (sizeof (server_info)); + + if (!info) + return 0; + + unsigned i = 0; + + while (i < ret) { + if (str[i] == '\n') + str[i] = '\0'; + + i ++; + } + + unsigned len = strlen (str); + if (!strncmp (str, "version: ", 9)) { + unsigned ver_len = strlen (str+9); + server->version = (char *) malloc (sizeof (char) * (ver_len + 1)); + + if (!server->version) + return 0; + + memcpy (server->version, str+9, ver_len+1); + } + + if (!strncmp (str+len+1, "clients: ", 9)) + server->clients = atoi (str+len+10); + + len += strlen (str+len+1) + 1; + + if (!strncmp (str+len+1, "maxclients: ", 12)) + server->maxclients = atoi (str+len+13); + + len += strlen (str+len+1) + 1; + + if (!strncmp (str+len+1, "uptime: ", 8)) + server->uptime = atoi (str+len+9); + + len += strlen (str+len+1) + 1; + + if (!strncmp (str+len+1, "arena: ", 7)) { + unsigned arena_len = strlen (str+9); + server->arena = (char *) malloc (sizeof (char) * (arena_len + 1)); + + if (!server->arena) + return 0; + + memcpy (server->arena, str+len+8, arena_len+1); + } + + free (str); + + server->state = 1; + + return 1; +} + +static int LoadServers () +// Get server list +{ + int s; + char buf[1025]; + + /* TODO: dodelat TCP makro */ +#ifdef SUPPORT_NET_UNIX_UDP + struct sockaddr_in server; + + server.sin_family = AF_INET; + server.sin_port = htons (MASTER_PORT); + server.sin_addr.s_addr = inet_addr (MASTER_SERVER); + + if ((s = socket (AF_INET, SOCK_STREAM, 0)) < 0) { + close (s); + return 0; + } + + if (connect (s, (struct sockaddr *) &server, sizeof (server)) == -1) + return 0; + + /* send request for server list */ + send (s, "l", 1, 0); + + /* receive server list if exist */ + int len = recv (s, buf, 1024, 0); + + close (s); +#else + return -1; +#endif + + if (len <= 0) + return 0; + + unsigned i = 0; + char list[256]; + + struct sockaddr_in srv; + + typedef struct { + unsigned port; + unsigned ip; + } response_head; + + while (1) { + response_head *header = (response_head *) ((char *) buf + i); + + server_t *ctx; + + // alloc and init context + ctx = (server_t *) malloc (sizeof (server_t)); + + ctx->ip = header->ip; + ctx->port = header->port; + + srv.sin_addr.s_addr = ctx->ip; + + int ret = server_getinfo (ctx); + + if (ret) { + sprintf (list, "%s:%d (%s) - %s - %d/%d - %dms", inet_ntoa (srv.sin_addr), ctx->port, ctx->version, + ctx->arena, ctx->clients, ctx->maxclients, ctx->ping); + } else + sprintf (list, "%s:%d - Offline", inet_ntoa (srv.sin_addr), ctx->port); + + addToWidgetSelect(select_server, list); + + // add into list + ctx->next = &server_list; + ctx->prev = server_list.prev; + ctx->prev->next = ctx; + ctx->next->prev = ctx; + + i += sizeof (response_head) + 1; + + if (buf[i-1] != '\n' || (i+1) > len) + break; + } + + return 1; +} + +void initScreenBrowser() +{ + SDL_Surface *image; + + image = addImageData("screen_main.png", IMAGE_NO_ALPHA, "screen_browser", IMAGE_GROUP_BASE); + image_backgorund = newWidgetImage(0, 0, image); + + button_back = newWidgetButton(getMyText("BACK"), 100, WINDOW_SIZE_Y-100, eventWidget); + button_play = newWidgetButton(getMyText("PLAY"), WINDOW_SIZE_X-200, WINDOW_SIZE_Y-100, eventWidget);; + + label_server = newWidgetLabel("Server list", 50, 145, WIDGET_LABEL_LEFT); + + select_server = newWidgetSelect(label_server->x, label_server->y+40, eventWidget); + + registerScreen( newScreen("browser", startScreenBrowser, eventScreenBrowser, + drawScreenBrowser, stopScreenBrowser) ); + + server_list.next = &server_list; + server_list.prev = &server_list; +} + +void quitScreenBrowser() +{ + destroyWidgetImage(image_backgorund); + + destroyWidgetButton(button_play); + destroyWidgetButton(button_back); + destroyWidgetLabel(label_server); + destroyWidgetSelect(select_server); +} + diff --git a/src/screen/screen_browser.h b/src/screen/screen_browser.h new file mode 100644 index 0000000..a3f88e7 --- /dev/null +++ b/src/screen/screen_browser.h @@ -0,0 +1,36 @@ + +#ifndef SCREEN_BROWSER_H + +#define SCREEN_BROWSER_H + +#define MASTER_SERVER "193.85.244.165" +#define MASTER_PORT 2200 + +typedef struct server_context { + struct server_context *next, *prev; + + unsigned char state; + + unsigned char ping; + + unsigned ip; + unsigned port; + + char *name; + + char *version; + unsigned char clients; + unsigned char maxclients; + unsigned uptime; + char *arena; +} server_t; + + +extern void startScreenBrowser(); +extern void drawScreenBrowser(); +extern void eventScreenBrowser(); +extern void stopScreenBrowser(); +extern void initScreenBrowser(); +extern void quitScreenBrowser(); + +#endif diff --git a/src/screen/screen_gameType.c b/src/screen/screen_gameType.c index 5545fc1..df3d4dc 100644 --- a/src/screen/screen_gameType.c +++ b/src/screen/screen_gameType.c @@ -30,6 +30,7 @@ static widget_image_t *image_backgorund; static widget_button_t *button_back; static widget_button_t *button_play; +static widget_button_t *button_browser; static widget_label_t *label_none; static widget_label_t *label_server; @@ -74,6 +75,9 @@ void drawScreenGameType() drawWidgetButton(button_back); drawWidgetButton(button_play); + + if( check_client->status == TRUE ) + drawWidgetButton(button_browser); } void eventScreenGameType() @@ -87,6 +91,7 @@ void eventScreenGameType() eventWidgetButton(button_back); eventWidgetButton(button_play); + eventWidgetButton(button_browser); } void stopScreenGameType() @@ -141,6 +146,11 @@ static void eventWidget(void *p) setScreen("chiceArena"); } } + + if( button == button_browser ) + { + setScreen("browser"); + } } void initScreenGameType() @@ -152,6 +162,7 @@ void initScreenGameType() button_back = newWidgetButton(getMyText("BACK"), 100, WINDOW_SIZE_Y-100, eventWidget); button_play = newWidgetButton(getMyText("PLAY"), WINDOW_SIZE_X-200, WINDOW_SIZE_Y-100, eventWidget); + button_browser = newWidgetButton(getMyText("BROWSER"), 300, 345, eventWidget); check_none = newWidgetCheck(100, 150, FALSE, eventWidget); check_server = newWidgetCheck(100, 200, FALSE, eventWidget); @@ -184,6 +195,13 @@ void initScreenGameType() drawScreenGameType, stopScreenGameType) ); } +int setSettingGameType(int status) +{ + check_none->status = status; + + return 0; +} + int getSettingGameType() { if( check_none->status == TRUE ) @@ -206,11 +224,25 @@ int getSettingGameType() return -1; } +int setSettingIP(char *address) +{ + strcpy (textfield_ip->text, address); + + return 1; +} + char* getSettingIP() { return textfield_ip->text; } +int setSettingPort(int port) +{ + sprintf (textfield_port->text, "%d", port); + + return 0; +} + int getSettingPort() { return atoi( textfield_port->text ); @@ -248,6 +280,7 @@ void quitScreenGameType() destroyWidgetButton(button_back); destroyWidgetButton(button_play); + destroyWidgetButton(button_browser); destroyWidgetCheck(check_none); destroyWidgetCheck(check_server); diff --git a/src/screen/screen_gameType.h b/src/screen/screen_gameType.h index 93d38ee..02e2338 100644 --- a/src/screen/screen_gameType.h +++ b/src/screen/screen_gameType.h @@ -8,8 +8,11 @@ extern void drawScreenGameType(); extern void eventScreenGameType(); extern void initScreenGameType(); +extern int setSettingGameType(int status); extern int getSettingGameType(); +extern int setSettingIP(char *address); extern char* getSettingIP(); +extern int setSettingPort(int port); extern int getSettingPort(); extern int getSettingProto(); extern void quitScreenGameType(); |