X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=0a0c7580c460bd184622b944a91fb6e14d09b052;hb=2fe0fbc2a34fd4b50081f1829931dea3ca2c4c1c;hp=27247acdb95fa296aba71e4163274e7de770ef31;hpb=823bddb0d9cc63ddda17a2cd20266aa3b82bde38;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 27247acd..0a0c7580 100644 --- a/src/init.c +++ b/src/init.c @@ -12,10 +12,6 @@ ***********************************************************/ #include -#include -#include -#include -#include #include "init.h" #include "misc.h" @@ -26,6 +22,7 @@ #include "joystick.h" #include "gfxload.h" #include "gifload.h" +#include "network.h" #ifdef DEBUG /* @@ -47,11 +44,11 @@ struct IconFileInfo static int sound_process_id = 0; -static void InitServer(void); static void InitLevelAndPlayerInfo(void); -static void InitDisplay(int, char **); +static void InitNetworkServer(void); +static void InitDisplay(void); static void InitSound(void); -static void InitSoundProcess(void); +static void InitSoundServer(void); static void InitWindow(int, char **); static void InitGfx(void); static void LoadGfx(int, struct PictureFileInfo *); @@ -59,25 +56,18 @@ static void InitElementProperties(void); void OpenAll(int argc, char *argv[]) { - - - /* TEST TEST TEST */ - InitServer(); - /* TEST TEST TEST */ - - InitLevelAndPlayerInfo(); InitCounter(); InitSound(); - InitSoundProcess(); + InitSoundServer(); InitJoystick(); InitRND(NEW_RANDOMIZE); - signal(SIGINT, CloseAll); - signal(SIGTERM, CloseAll); + signal(SIGINT, CloseAllAndExit); + signal(SIGTERM, CloseAllAndExit); - InitDisplay(argc, argv); + InitDisplay(); InitWindow(argc, argv); XMapWindow(display, window); @@ -87,152 +77,40 @@ void OpenAll(int argc, char *argv[]) InitElementProperties(); DrawMainMenu(); -} - - - -/* TEST STUFF -------------------------------------------------------------- */ - -int norestart = 0; -int nospeedup = 0; - -/* server stuff */ - -#define DEFAULTPORT 19503 -#define BUFLEN 4096 -int sfd; -unsigned char realbuf[512], readbuf[BUFLEN], writbuf[BUFLEN]; -unsigned char *buf = realbuf + 4; -int nread = 0, nwrite = 0; - -void fatal(char *s) -{ - fprintf(stderr, "%s.\n", s); - exit(1); -} - -void u_sleep(int i) -{ - struct timeval tm; - tm.tv_sec = i / 1000000; - tm.tv_usec = i % 1000000; - select(0, NULL, NULL, NULL, &tm); + InitNetworkServer(); } -void startserver() +void InitLevelAndPlayerInfo() { - char *options[2]; - int n = 0; - - options[0] = options[1] = NULL; - if (norestart) - options[n++] = "-norestart"; - if (nospeedup) - options[n++] = "-nospeedup"; - - switch (fork()) - { - case 0: - execlp( -#ifdef XTRISPATH - XTRISPATH "/rnd_server", -#else - "rnd_server", -#endif - "rnd_server", "-once", "-v", options[0], options[1], NULL); + local_player = &stored_player[0]; - fprintf(stderr, "Can't start server '%s'.\n", -#ifdef XTRISPATH - XTRISPATH "/xtserv"); -#else - "xtserv"); -#endif + if (!LoadLevelInfo()) /* global level info */ + Error(ERR_EXIT, NULL); - _exit(1); - - case -1: - fatal("fork() failed"); - - default: - return; - } + LoadPlayerInfo(PLAYER_SETUP); /* global setup info */ + LoadPlayerInfo(PLAYER_LEVEL); /* level specific info */ } -void connect2server(char *host, int port) +void InitNetworkServer() { - struct hostent *hp; - struct sockaddr_in s; - struct protoent *tcpproto; - int on = 1, i; - - if (host) - { - if ((s.sin_addr.s_addr = inet_addr(host)) == -1) - { - hp = gethostbyname(host); - if (!hp) - fatal("Host not found"); - s.sin_addr = *(struct in_addr *)(hp->h_addr_list[0]); - } - } - else - s.sin_addr.s_addr = inet_addr("127.0.0.1"); - - s.sin_port = htons(port); - s.sin_family = AF_INET; - sfd = socket(PF_INET, SOCK_STREAM, 0); - if (sfd < 0) - fatal("Out of file descriptors"); - if ((tcpproto = getprotobyname("tcp")) != NULL) - setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int)); - - if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) < 0) - { - if (!host) - { - printf("No xtris server on localhost - starting up one ...\n"); - startserver(); - for (i=0; i<6; i++) - { - u_sleep(500000); - close(sfd); - sfd = socket(PF_INET, SOCK_STREAM, 0); - if (sfd < 0) - fatal("Out of file descriptors"); - setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int)); - if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) >= 0) - break; - } - if (i==6) - fatal("Can't connect to server"); - } - else - fatal("Can't connect to server"); - } -} + int nr_wanted; -void InitServer() -{ - if (server_port == 0) - server_port = DEFAULTPORT; + standalone = FALSE; - connect2server(server_host, server_port); -} - -/* TEST STUFF -------------------------------------------------------------- */ + if (standalone) + return; + nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); + if (!ConnectToServer(server_host, server_port)) + Error(ERR_EXIT, "cannot connect to multiplayer server"); -void InitLevelAndPlayerInfo() -{ - local_player = &stored_player[0]; + SendToServer_Nickname(local_player->alias_name); + SendToServer_ProtocolVersion(); - if (!LoadLevelInfo()) /* global level info */ - CloseAll(); - - LoadPlayerInfo(PLAYER_SETUP); /* global setup info */ - LoadPlayerInfo(PLAYER_LEVEL); /* level specific info */ + if (nr_wanted) + SendToServer_NrWanted(nr_wanted); } void InitSound() @@ -245,15 +123,15 @@ void InitSound() #ifndef MSDOS if (access(sound_device_name,W_OK)<0) { - fprintf(stderr,"%s: cannot access sound device - no sounds\n",progname); - sound_status=SOUND_OFF; + Error(ERR_RETURN, "cannot access sound device - no sounds"); + sound_status = SOUND_OFF; return; } if ((sound_device=open(sound_device_name,O_WRONLY))<0) { - fprintf(stderr,"%s: cannot open sound device - no sounds\n",progname); - sound_status=SOUND_OFF; + Error(ERR_RETURN, "cannot open sound device - no sounds"); + sound_status = SOUND_OFF; return; } @@ -283,7 +161,7 @@ void InitSound() } } -void InitSoundProcess() +void InitSoundServer() { if (sound_status==SOUND_OFF) return; @@ -291,14 +169,14 @@ void InitSoundProcess() #ifndef MSDOS if (pipe(sound_pipe)<0) { - fprintf(stderr,"%s: cannot create pipe - no sounds\n",progname); + Error(ERR_RETURN, "cannot create pipe - no sounds"); sound_status=SOUND_OFF; return; } if ((sound_process_id=fork())<0) { - fprintf(stderr,"%s: cannot create child process - no sounds\n",progname); + Error(ERR_RETURN, "cannot create child process - no sounds"); sound_status=SOUND_OFF; return; } @@ -320,16 +198,16 @@ void InitJoystick() #ifndef MSDOS if (access(joystick_device_name[joystick_nr],R_OK)<0) { - fprintf(stderr,"%s: cannot access joystick device '%s'\n", - progname,joystick_device_name[joystick_nr]); + Error(ERR_RETURN, "cannot access joystick device '%s'", + joystick_device_name[joystick_nr]); joystick_status = JOYSTICK_OFF; return; } if ((joystick_device=open(joystick_device_name[joystick_nr],O_RDONLY))<0) { - fprintf(stderr,"%s: cannot open joystick device '%s'\n", - progname,joystick_device_name[joystick_nr]); + Error(ERR_RETURN, "cannot open joystick device '%s'", + joystick_device_name[joystick_nr]); joystick_status = JOYSTICK_OFF; return; } @@ -341,37 +219,16 @@ void InitJoystick() #endif } -void InitDisplay(int argc, char *argv[]) +void InitDisplay() { - char *display_name = NULL; XVisualInfo vinfo_template, *vinfo; int num_visuals; unsigned int depth; - int i; - - /* get X server to connect to, if given as an argument */ - for (i=1;ipicture_filename); - CloseAll(); - exit(-1); - } + Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename); } /* zugehörige Maske laden (wenn vorhanden) */ @@ -883,19 +698,11 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) case BitmapSuccess: break; case BitmapOpenFailed: - fprintf(stderr,"Bitmap file open failed on '%s' !\n",filename); - CloseAll(); - exit(-1); - break; + Error(ERR_EXIT, "cannot open XBM file '%s'", filename); case BitmapFileInvalid: - fprintf(stderr,"Bitmap file invalid: '%s' !\n",filename); - CloseAll(); - exit(-1); - break; + Error(ERR_EXIT, "invalid XBM file '%s'", filename); case BitmapNoMemory: - fprintf(stderr,"No memory for file '%s' !\n",filename); - CloseAll(); - exit(-1); + Error(ERR_EXIT, "not enough memory for XBM file '%s'", filename); break; default: break; @@ -910,12 +717,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) #endif if (!clipmask[pos]) - { - fprintf(stderr, "%s: cannot get clipmask for '%s'.\n", - progname, pic->picture_filename); - CloseAll(); - exit(-1); - } + Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename); } } @@ -969,6 +771,9 @@ void InitElementProperties() EL_BETON, EL_MAUERWERK, EL_MAUER_LEBT, + EL_MAUER_X, + EL_MAUER_Y, + EL_MAUER_XY, EL_FELSBODEN, EL_AUSGANG_ZU, EL_AUSGANG_ACT, @@ -1070,6 +875,9 @@ void InitElementProperties() EL_MAUERWERK, EL_FELSBODEN, EL_MAUER_LEBT, + EL_MAUER_X, + EL_MAUER_Y, + EL_MAUER_XY, EL_MAUERND }; static int ep_mauer_num = sizeof(ep_mauer)/sizeof(int); @@ -1467,7 +1275,7 @@ void InitElementProperties() Elementeigenschaften[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE); } -void CloseAll() +void CloseAllAndExit(int exit_value) { int i; @@ -1507,5 +1315,5 @@ void CloseAll() XCloseDisplay(display); } - exit(0); + exit(exit_value); }