#include #include #include #include #include #include #include "main.h" #include "list.h" #include "tux.h" #include "wall.h" #include "teleport.h" #include "pipe.h" #include "myTimer.h" #include "arena.h" #include "item.h" #include "shot.h" #include "arenaFile.h" #include "proto.h" #include "publicServer.h" #include "net_multiplayer.h" static int arenaId; static arena_t *arena; static bool_t isSignalEnd; static int my_argc; static char **my_argv; arena_t* getWorldArena() { return arena; } void countRoundInc() { } int initPublicServer() { initArenaFile(); initTux(); initItem(); initShot(); initTimer(); arenaId = getArenaIdFormNetName( getParamElse("--arena", "FAGN") ); arena = getArena(arenaId); addNewItem(arena->listItem, NULL); isSignalEnd = FALSE; if( initNetMuliplayer(NET_GAME_TYPE_SERVER, NULL, atoi( getParamElse("--port", "2200") ) ) < 0 ) { printf("Nemozem inicalizovat sietovy socket !\n"); return -1; } setServerMaxClients( atoi( getParamElse("--maxclients", "100") )); return 0; } int getChoiceArenaId() { return arenaId; } int conflictSpace(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2) { return (x1listTux, x, y, w, h) )return 0; if ( isConflictWithListWall(arena->listWall, x, y, w, h) )return 0; if ( isConflictWithListShot(arena->listShot, x, y, w, h) )return 0; if ( isConflictWithListItem(arena->listItem, x, y, w, h) )return 0; if ( isConflictWithListTeleport(arena->listTeleport, x, y, w, h) )return 0; if ( isConflictWithListPipe(arena->listPipe, x, y, w, h) )return 0; return 1; } void findFreeSpace(int *x, int *y, int w, int h) { int z_x; int z_y; assert( x != NULL ); assert( y != NULL ); do{ z_x = random() % WINDOW_SIZE_X; z_y = random() % (WINDOW_SIZE_Y-200); }while( isFreeSpace(z_x, z_y ,w ,h) == 0 ); *x = z_x; *y = z_y; } void eventPublicServer() { static my_time_t lastActive = 0; my_time_t interval; int i; eventNetMultiplayer(); if( isSignalEnd == TRUE ) { quitPublicServer(); } if( lastActive == 0 ) { lastActive = getMyTime(); } interval = getMyTime() - lastActive; if( interval < 50 ) { return; } /* printf("interval = %d\n", interval); */ lastActive = getMyTime(); eventConflictTuxWithTeleport(arena->listTux, arena->listTeleport); eventConflictTuxWithShot(arena->listTux, arena->listShot); for( i = 0 ; i < 4 ; i++) { eventMoveListShot(arena->listShot); eventConflictShotWithWall(arena->listWall, arena->listShot); eventConflictShotWithTeleport(arena->listTeleport, arena->listShot); eventConflictShotWithPipe(arena->listPipe, arena->listShot); eventConflictShotWithItem(arena->listItem, arena->listShot); } eventListItem(arena->listItem); eventListTux(arena->listTux); eventTimer(); } void my_handler_quit(int n) { printf("my_handler_quit\n"); isSignalEnd = TRUE; } void quitPublicServer() { printf("quit public server\n"); quitNetMultiplayer(); destroyArena(arena); quitArenaFile(); quitTimer(); exit(0); } char* getParam(char *s) { int i; for( i = 0 ; i < my_argc - 1 ; i++ ) { if( strcmp(s, my_argv[i]) == 0 ) { return my_argv[i+1]; } } return NULL; } char* getParamElse(char *s1, char *s2) { char *ret; ret = getParam(s1); if( ret == NULL) { return s2; } return ret; } bool_t isParamFlag(char *s) { int i; for( i = 0 ; i < my_argc ; i++ ) { if( strcmp(s, my_argv[i]) == 0 ) { return TRUE; } } return FALSE; } char *getString(int n) { char str[STR_NUM_SIZE]; sprintf(str, "%d", n); return strdup(str); } int main(int argc, char *argv[]) { srand( (unsigned) time(NULL) ); my_argc = argc; my_argv = argv; signal(SIGPIPE, SIG_IGN); signal(SIGINT, my_handler_quit); signal(SIGTERM, my_handler_quit); signal(SIGQUIT, my_handler_quit); if( initPublicServer() < 0 ) { quitPublicServer(); return -1; } while(1) { eventPublicServer(); } return 0; }