X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=bc72b99a2787ca8f660bfafabbb38ca8baf9b712;hp=2f6bb8ed971a97e28b695647c0863c89eb75f9d5;hb=50c422d96b6da2c0412b6bd3763e9d1a029a6014;hpb=b2a0ff1ddd4430110b331129469dabb8ea7b6ba7 diff --git a/src/init.c b/src/init.c index 2f6bb8ed..bc72b99a 100644 --- a/src/init.c +++ b/src/init.c @@ -11,19 +11,7 @@ * init.c * ***********************************************************/ -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "init.h" #include "misc.h" @@ -32,19 +20,15 @@ #include "tools.h" #include "files.h" #include "joystick.h" -#include "gfxload.h" -#include "gifload.h" - -#ifdef DEBUG -/* -#define DEBUG_TIMING -*/ -#endif +#include "image.h" +#include "pcx.h" +#include "network.h" +#include "netserv.h" struct PictureFileInfo { char *picture_filename; - BOOL picture_with_mask; + boolean picture_with_mask; }; struct IconFileInfo @@ -55,11 +39,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 *); @@ -67,25 +51,26 @@ static void InitElementProperties(void); void OpenAll(int argc, char *argv[]) { + if (options.serveronly) + { + NetworkServer(options.server_port, options.serveronly); - - /* TEST TEST TEST */ - InitServer(); - /* TEST TEST TEST */ - + /* never reached */ + exit(0); + } InitLevelAndPlayerInfo(); InitCounter(); InitSound(); - InitSoundProcess(); - InitJoystick(); + InitSoundServer(); + InitJoysticks(); 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); @@ -95,377 +80,231 @@ void OpenAll(int argc, char *argv[]) InitElementProperties(); DrawMainMenu(); -} - - -/* TEST STUFF -------------------------------------------------------------- */ - -int norestart = 0; -int nospeedup = 0; - -#define DEFAULTPORT 19503 - -#define PROT_VERS_1 1 -#define PROT_VERS_2 0 -#define PROT_VERS_3 1 - -#define OP_NICK 1 -#define OP_PLAY 2 -#define OP_FALL 3 -#define OP_DRAW 4 -#define OP_LOST 5 -#define OP_GONE 6 -#define OP_CLEAR 7 -#define OP_NEW 8 -#define OP_LINES 9 -#define OP_GROW 10 -#define OP_MODE 11 -#define OP_LEVEL 12 -#define OP_BOT 13 -#define OP_KILL 14 -#define OP_PAUSE 15 -#define OP_CONT 16 -#define OP_VERSION 17 -#define OP_BADVERS 18 -#define OP_MSG 19 -#define OP_YOUARE 20 -#define OP_LINESTO 21 -#define OP_WON 22 -#define OP_ZERO 23 - -/* server stuff */ - -#define BUFLEN 4096 - -int sfd; -unsigned char realbuf[512], readbuf[BUFLEN], writbuf[BUFLEN]; -unsigned char *buf = realbuf + 4; -int nread = 0, nwrite = 0; - -void sysmsg(char *s) -{ - printf("** %s\n", s); - fflush(stdout); + InitNetworkServer(); } -void fatal(char *s) -{ - fprintf(stderr, "%s.\n", s); - exit(1); -} - -void u_sleep(int i) +void InitLevelAndPlayerInfo() { - struct timeval tm; - tm.tv_sec = i / 1000000; - tm.tv_usec = i % 1000000; - select(0, NULL, NULL, NULL, &tm); -} + int i; -void flushbuf() -{ - if (nwrite) - { - write(sfd, writbuf, nwrite); - nwrite = 0; - } -} + /* choose default local player */ + local_player = &stored_player[0]; -void sendbuf(int len) -{ - if (!standalone) + for (i=0; i= BUFLEN) - fatal("Internal error: send buffer overflow"); - memcpy(writbuf + nwrite, realbuf, 4 + len); - nwrite += 4 + len; + stored_player[i].joystick_fd = -1; /* joystick device closed */ + stored_player[i].connected = FALSE; } -} - -void startserver() -{ - char *options[2]; - int n = 0; - options[0] = options[1] = NULL; - if (norestart) - options[n++] = "-norestart"; - if (nospeedup) - options[n++] = "-nospeedup"; + local_player->connected = TRUE; - switch (fork()) - { - case 0: - execlp( -#ifdef XTRISPATH - XTRISPATH "/rnd_server", -#else - "rnd_server", -#endif - "rnd_server", "-once", "-v", options[0], options[1], NULL); - - fprintf(stderr, "Can't start server '%s'.\n", -#ifdef XTRISPATH - XTRISPATH "/rnd_server" -#else - "rnd_server" -#endif - ); - - _exit(1); - - case -1: - fatal("fork() failed"); - - default: - return; - } + LoadLevelInfo(); /* global level info */ + LoadSetup(); /* global setup info */ + LoadLevelSetup(); /* info about last played level */ } -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 rocksndiamonds 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"); - } -} - -static void send_nickname(char *nickname) -{ - static char msgbuf[300]; - - buf[1] = OP_NICK; - memcpy(&buf[2], nickname, strlen(nickname)); - sendbuf(2 + strlen(nickname)); - sprintf(msgbuf, "you set your nick to %s", nickname); - sysmsg(msgbuf); -} - -void InitServer() -{ - if (server_port == 0) - server_port = DEFAULTPORT; - - standalone = FALSE; - - if (!standalone) - connect2server(server_host, server_port); - - send_nickname("dummyplayer"); - - buf[1] = OP_VERSION; - buf[2] = PROT_VERS_1; - buf[3] = PROT_VERS_2; - buf[4] = PROT_VERS_3; - sendbuf(5); -} +#ifndef MSDOS + int nr_wanted; +#endif -/* TEST STUFF -------------------------------------------------------------- */ + if (!options.network) + return; +#ifndef MSDOS + nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); + if (!ConnectToServer(options.server_host, options.server_port)) + Error(ERR_EXIT, "cannot connect to network game server"); -void InitLevelAndPlayerInfo() -{ - local_player = &stored_player[0]; + SendToServer_PlayerName(setup.player_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); +#endif } void InitSound() { int i; - if (sound_status==SOUND_OFF) + if (sound_status == SOUND_OFF) return; #ifndef MSDOS - if (access(sound_device_name,W_OK)<0) + 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_WARN, "cannot access sound device - no sounds"); + sound_status = SOUND_OFF; return; } - if ((sound_device=open(sound_device_name,O_WRONLY))<0) + 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_WARN, "cannot open sound device - no sounds"); + sound_status = SOUND_OFF; return; } close(sound_device); - sound_status=SOUND_AVAILABLE; + sound_status = SOUND_AVAILABLE; #ifdef VOXWARE sound_loops_allowed = TRUE; - sound_loops_on = TRUE; + + /* + setup.sound_loops_on = TRUE; + */ + #endif -#else +#else /* MSDOS */ sound_loops_allowed = TRUE; - sound_loops_on = TRUE; -#endif - for(i=0;i= num_joysticks) + joystick_nr = -1; + + /* misuse joystick file descriptor variable to store joystick number */ + stored_player[i].joystick_fd = joystick_nr; + } #endif } -void InitDisplay(int argc, char *argv[]) +void InitDisplay() { - char *display_name = NULL; +#ifndef MSDOS XVisualInfo vinfo_template, *vinfo; int num_visuals; +#endif unsigned int depth; - int i; - - /* get X server to connect to, if given as an argument */ - for (i=1;ipicture_filename) { - sprintf(basefilename,"%s%s",pic->picture_filename,picture_ext); - DrawInitText(basefilename,150,FC_YELLOW); - sprintf(filename,"%s/%s",GFX_PATH,basefilename); + sprintf(basefilename, "%s%s", pic->picture_filename, picture_ext); + DrawInitText(basefilename, 150, FC_YELLOW); + sprintf(filename, "%s/%s/%s", + options.base_directory, GRAPHICS_DIRECTORY, basefilename); #ifdef MSDOS rest(100); -#endif MSDOS +#endif /* MSDOS */ -#ifdef DEBUG_TIMING - count1 = Counter(); +#if DEBUG_TIMING + debug_print_timestamp(1, NULL); /* initialize timestamp function */ #endif -#ifdef XPM_INCLUDE_FILE +#ifdef USE_XPM_LIBRARY xpm_att[pos].valuemask = XpmCloseness; xpm_att[pos].closeness = 20000; xpm_err = XpmReadFileToPixmap(display,window,filename, &pix[pos],&shapemask,&xpm_att[pos]); - switch(xpm_err) { case XpmOpenFailed: - fprintf(stderr,"Cannot open Xpm file '%s' !\n",filename); - CloseAll(); - exit(-1); + Error(ERR_EXIT, "cannot open XPM file '%s'", filename); case XpmFileInvalid: - fprintf(stderr,"Invalid Xpm file '%s'!\n",filename); - CloseAll(); - exit(-1); + Error(ERR_EXIT, "invalid XPM file '%s'", filename); case XpmNoMemory: - fprintf(stderr,"Not enough memory for Xpm file '%s'!\n",filename); - CloseAll(); - exit(1); + Error(ERR_EXIT, "not enough memory for XPM file '%s'", filename); case XpmColorFailed: - fprintf(stderr,"Can't get colors for Xpm file '%s'!\n",filename); - CloseAll(); - exit(-1); + Error(ERR_EXIT, "cannot get colors for XPM file '%s'", filename); default: break; } -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("XPM LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/1000.0); +#if DEBUG_TIMING + printf("LOADING XPM FILE %s:", filename); + debug_print_timestamp(1, ""); #endif -#else - - gif_err = Read_GIF_to_Pixmaps(display, window, filename, - &pix[pos], &clipmask[pos]); +#else /* !USE_XPM_LIBRARY */ - switch(gif_err) + pcx_err = Read_PCX_to_Pixmap(display, window, gc, filename, + &pix[pos], &clipmask[pos]); + switch(pcx_err) { - case GIF_Success: + case PCX_Success: break; - case GIF_OpenFailed: - fprintf(stderr,"Cannot open GIF file '%s' !\n",filename); - CloseAll(); - exit(-1); - case GIF_ReadFailed: - fprintf(stderr,"Cannot read GIF file '%s' !\n",filename); - CloseAll(); - exit(-1); - case GIF_FileInvalid: - fprintf(stderr,"Invalid GIF file '%s'!\n",filename); - CloseAll(); - exit(-1); - case GIF_NoMemory: - fprintf(stderr,"Not enough memory for GIF file '%s'!\n",filename); - CloseAll(); - exit(1); - case GIF_ColorFailed: - fprintf(stderr,"Can't get colors for GIF file '%s'!\n",filename); - CloseAll(); - exit(-1); + case PCX_OpenFailed: + Error(ERR_EXIT, "cannot open PCX file '%s'", filename); + case PCX_ReadFailed: + Error(ERR_EXIT, "cannot read PCX file '%s'", filename); + case PCX_FileInvalid: + Error(ERR_EXIT, "invalid PCX file '%s'", filename); + case PCX_NoMemory: + Error(ERR_EXIT, "not enough memory for PCX file '%s'", filename); + case PCX_ColorFailed: + Error(ERR_EXIT, "cannot get colors for PCX file '%s'", filename); default: break; } -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("GIF LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/1000.0); +#if DEBUG_TIMING + printf("SUMMARY LOADING PCX FILE %s:", filename); + debug_print_timestamp(1, ""); #endif -#endif +#endif /* !USE_XPM_LIBRARY */ if (!pix[pos]) - { - fprintf(stderr, "%s: cannot get graphics for '%s'.\n", - progname, pic->picture_filename); - CloseAll(); - exit(-1); - } + Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename); } /* zugehörige Maske laden (wenn vorhanden) */ if (pic->picture_with_mask) { +#ifdef USE_XPM_LIBRARY -#ifdef XPM_INCLUDE_FILE + sprintf(basefilename, "%s%s", pic->picture_filename, picturemask_ext); + DrawInitText(basefilename, 150, FC_YELLOW); + sprintf(filename, "%s/%s/%s", + options.base_directory, GRAPHICS_DIRECTORY, basefilename); - sprintf(basefilename,"%s%s",pic->picture_filename,picturemask_ext); - DrawInitText(basefilename,150,FC_YELLOW); - sprintf(filename,"%s/%s",GFX_PATH,basefilename); - -#ifdef DEBUG_TIMING - count1 = Counter(); +#if DEBUG_TIMING + debug_print_timestamp(1, NULL); /* initialize timestamp function */ #endif xbm_err = XReadBitmapFile(display,window,filename, &width,&height,&clipmask[pos],&hot_x,&hot_y); - switch(xbm_err) { 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; } -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("XBM LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/1000.0); +#if DEBUG_TIMING + printf("LOADING XBM FILE %s:", filename); + debug_print_timestamp(1, ""); #endif -#endif +#endif /* USE_XPM_LIBRARY */ 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); } } @@ -1058,6 +835,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, @@ -1159,6 +939,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); @@ -1546,17 +1329,17 @@ void InitElementProperties() }; static int num_properties = sizeof(ep_num)/sizeof(int *); - for(i=0;i