X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=27247acdb95fa296aba71e4163274e7de770ef31;hp=134cf74aeadfee1f092b95fb9496cb1adc9b2b09;hb=823bddb0d9cc63ddda17a2cd20266aa3b82bde38;hpb=33df7a5ca87e883c2b718171fd7d05c22fc0353f diff --git a/src/init.c b/src/init.c index 134cf74a..27247acd 100644 --- a/src/init.c +++ b/src/init.c @@ -1,17 +1,22 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1995-98 Artsoft Entertainment * +* Holger Schemel * +* Oststrasse 11a * +* 33604 Bielefeld * +* phone: ++49 +521 290471 * +* email: aeglos@valinor.owl.de * *----------------------------------------------------------* * init.c * ***********************************************************/ +#include +#include +#include +#include +#include + #include "init.h" #include "misc.h" #include "sound.h" @@ -19,9 +24,8 @@ #include "tools.h" #include "files.h" #include "joystick.h" -#include "gfxloader.h" - -#include +#include "gfxload.h" +#include "gifload.h" #ifdef DEBUG /* @@ -43,6 +47,7 @@ struct IconFileInfo static int sound_process_id = 0; +static void InitServer(void); static void InitLevelAndPlayerInfo(void); static void InitDisplay(int, char **); static void InitSound(void); @@ -54,6 +59,13 @@ static void InitElementProperties(void); void OpenAll(int argc, char *argv[]) { + + + /* TEST TEST TEST */ + InitServer(); + /* TEST TEST TEST */ + + InitLevelAndPlayerInfo(); InitCounter(); @@ -77,8 +89,145 @@ void OpenAll(int argc, char *argv[]) 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); +} + +void startserver() +{ + 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); + + fprintf(stderr, "Can't start server '%s'.\n", +#ifdef XTRISPATH + XTRISPATH "/xtserv"); +#else + "xtserv"); +#endif + + _exit(1); + + case -1: + fatal("fork() failed"); + + default: + return; + } +} + +void connect2server(char *host, int port) +{ + 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"); + } +} + +void InitServer() +{ + if (server_port == 0) + server_port = DEFAULTPORT; + + connect2server(server_host, server_port); +} + +/* TEST STUFF -------------------------------------------------------------- */ + + + void InitLevelAndPlayerInfo() { + local_player = &stored_player[0]; + if (!LoadLevelInfo()) /* global level info */ CloseAll(); @@ -93,6 +242,7 @@ void InitSound() if (sound_status==SOUND_OFF) return; +#ifndef MSDOS if (access(sound_device_name,W_OK)<0) { fprintf(stderr,"%s: cannot access sound device - no sounds\n",progname); @@ -114,9 +264,16 @@ void InitSound() sound_loops_allowed = TRUE; sound_loops_on = TRUE; #endif +#else + sound_loops_allowed = TRUE; + sound_loops_on = TRUE; +#endif for(i=0;ivisual; + XFree((void *)vinfo); + } + + /* got appropriate visual? */ + if (depth < 8) + { + printf("Sorry, displays with less than 8 bits per pixel not supported.\n"); + exit(-1); + } + else if ((depth ==8 && visual->class != PseudoColor) || + (depth > 8 && visual->class != TrueColor && + visual->class != DirectColor)) + { + printf("Sorry, cannot get appropriate visual.\n"); + exit(-1); + } } void InitWindow(int argc, char *argv[]) @@ -226,18 +419,39 @@ void InitWindow(int argc, char *argv[]) char *window_name = WINDOWTITLE_STRING; char *icon_name = WINDOWTITLE_STRING; long window_event_mask; + Atom proto_atom = None, delete_atom = None; + int screen_width, screen_height; + int win_xpos = WIN_XPOS, win_ypos = WIN_YPOS; + unsigned long pen_fg = WhitePixel(display,screen); + unsigned long pen_bg = BlackPixel(display,screen); + +#ifndef MSDOS static struct IconFileInfo icon_pic = { "rocks_icon.xbm", "rocks_iconmask.xbm" }; +#endif + + screen_width = XDisplayWidth(display, screen); + screen_height = XDisplayHeight(display, screen); width = WIN_XSIZE; height = WIN_YSIZE; + win_xpos = (screen_width - width) / 2; + win_ypos = (screen_height - height) / 2; + window = XCreateSimpleWindow(display, RootWindow(display, screen), - WIN_XPOS, WIN_YPOS, width, height, border_width, - pen_fg, pen_bg); + win_xpos, win_ypos, width, height, border_width, + pen_fg, pen_bg); + +#ifndef MSDOS + proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE); + delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE); + if ((proto_atom != None) && (delete_atom != None)) + XChangeProperty(display, window, proto_atom, XA_ATOM, 32, + PropModePrepend, (unsigned char *) &delete_atom, 1); sprintf(icon_filename,"%s/%s",GFX_PATH,icon_pic.picture_filename); XReadBitmapFile(display,window,icon_filename, @@ -261,9 +475,16 @@ void InitWindow(int argc, char *argv[]) exit(-1); } - size_hints.flags = PSize | PMinSize | PMaxSize; size_hints.width = size_hints.min_width = size_hints.max_width = width; size_hints.height = size_hints.min_height = size_hints.max_height = height; + size_hints.flags = PSize | PMinSize | PMaxSize; + + if (win_xpos || win_ypos) + { + size_hints.x = win_xpos; + size_hints.y = win_ypos; + size_hints.flags |= PPosition; + } if (!XStringListToTextProperty(&window_name, 1, &windowName)) { @@ -300,6 +521,7 @@ void InitWindow(int argc, char *argv[]) ButtonPressMask | ButtonReleaseMask | ButtonMotionMask | KeyPressMask | KeyReleaseMask; XSelectInput(display, window, window_event_mask); +#endif /* create GC for drawing with window depth */ gc_values.graphics_exposures = False; @@ -323,8 +545,21 @@ void DrawInitText(char *text, int ypos, int color) void InitGfx() { int i,j; + GC copy_clipmask_gc; XGCValues clip_gc_values; unsigned long clip_gc_valuemask; + +#ifdef MSDOS + static struct PictureFileInfo pic[NUM_PICTURES] = + { + { "Screen", TRUE }, + { "Door", TRUE }, + { "Heroes", TRUE }, + { "Toons", TRUE }, + { "Font", FALSE }, + { "Font2", FALSE } + }; +#else static struct PictureFileInfo pic[NUM_PICTURES] = { { "RocksScreen", TRUE }, @@ -334,6 +569,47 @@ void InitGfx() { "RocksFont", FALSE }, { "RocksFont2", FALSE } }; +#endif + + static struct + { + int start; + int count; + } + tile_needs_clipping[] = + { + { GFX_SPIELER1_UP, 4 }, + { GFX_SPIELER1_DOWN, 4 }, + { GFX_SPIELER1_LEFT, 4 }, + { GFX_SPIELER1_RIGHT, 4 }, + { GFX_SPIELER1_PUSH_LEFT, 4 }, + { GFX_SPIELER1_PUSH_RIGHT, 4 }, + { GFX_SPIELER2_UP, 4 }, + { GFX_SPIELER2_DOWN, 4 }, + { GFX_SPIELER2_LEFT, 4 }, + { GFX_SPIELER2_RIGHT, 4 }, + { GFX_SPIELER2_PUSH_LEFT, 4 }, + { GFX_SPIELER2_PUSH_RIGHT, 4 }, + { GFX_SPIELER3_UP, 4 }, + { GFX_SPIELER3_DOWN, 4 }, + { GFX_SPIELER3_LEFT, 4 }, + { GFX_SPIELER3_RIGHT, 4 }, + { GFX_SPIELER3_PUSH_LEFT, 4 }, + { GFX_SPIELER3_PUSH_RIGHT, 4 }, + { GFX_SPIELER4_UP, 4 }, + { GFX_SPIELER4_DOWN, 4 }, + { GFX_SPIELER4_LEFT, 4 }, + { GFX_SPIELER4_RIGHT, 4 }, + { GFX_SPIELER4_PUSH_LEFT, 4 }, + { GFX_SPIELER4_PUSH_RIGHT, 4 }, + { GFX_GEBLUBBER, 4 }, + { GFX_DYNAMIT, 7 }, + { GFX_DYNABOMB, 4 }, + { GFX_SOKOBAN_OBJEKT, 1 }, + { GFX_FUNKELN_BLAU, 3 }, + { GFX_FUNKELN_WEISS, 3 }, + { -1, 0 } + }; #ifdef DEBUG_TIMING long count1, count2; @@ -343,15 +619,19 @@ void InitGfx() LoadGfx(PIX_SMALLFONT,&pic[PIX_SMALLFONT]); DrawInitText(WINDOWTITLE_STRING,20,FC_YELLOW); DrawInitText(COPYRIGHT_STRING,50,FC_RED); +#ifdef MSDOS + DrawInitText("MSDOS version done by Guido Schulz",210,FC_BLUE); + rest(200); +#endif MSDOS DrawInitText("Loading graphics:",120,FC_GREEN); - for(i=0;i=0; i++) + { + for(j=0; j= GFX_START_ROCKSSCREEN && + graphic <= GFX_END_ROCKSSCREEN) + { + src_pixmap = clipmask[PIX_BACK]; + graphic -= GFX_START_ROCKSSCREEN; + src_x = SX + (graphic % GFX_PER_LINE) * TILEX; + src_y = SY + (graphic / GFX_PER_LINE) * TILEY; + } + else if (graphic >= GFX_START_ROCKSHEROES && + graphic <= GFX_END_ROCKSHEROES) + { + src_pixmap = clipmask[PIX_HEROES]; + graphic -= GFX_START_ROCKSHEROES; + src_x = (graphic % HEROES_PER_LINE) * TILEX; + src_y = (graphic / HEROES_PER_LINE) * TILEY; + } + else if (graphic >= GFX_START_ROCKSFONT && + graphic <= GFX_END_ROCKSFONT) + { + src_pixmap = clipmask[PIX_BIGFONT]; + graphic -= GFX_START_ROCKSFONT; + src_x = (graphic % FONT_CHARS_PER_LINE) * TILEX; + src_y = (graphic / FONT_CHARS_PER_LINE) * TILEY + + FC_SPECIAL1 * FONT_LINES_PER_FONT * TILEY; + } + else + break; + + tile_clipmask[tile] = XCreatePixmap(display, window, TILEX,TILEY, 1); + + XCopyArea(display,src_pixmap,tile_clipmask[tile],copy_clipmask_gc, + src_x,src_y, TILEX,TILEY, 0,0); + } + } + if (!pix[PIX_DB_BACK] || !pix[PIX_DB_DOOR]) { fprintf(stderr, "%s: cannot create additional Pixmaps!\n",progname); @@ -377,11 +716,8 @@ void InitGfx() if (clipmask[i]) { clip_gc_values.graphics_exposures = False; - clip_gc_values.foreground = pen_fg; - clip_gc_values.background = pen_bg; clip_gc_values.clip_mask = clipmask[i]; - clip_gc_valuemask = - GCGraphicsExposures | GCForeground | GCBackground | GCClipMask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; clip_gc[i] = XCreateGC(display,window,clip_gc_valuemask,&clip_gc_values); } } @@ -417,9 +753,8 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) char *picture_ext = ".xpm"; char *picturemask_ext = "Mask.xbm"; #else - int gif_err, ilbm_err; + int gif_err; char *picture_ext = ".gif"; - char *picturemask_ext = "Mask.ilbm"; #endif #ifdef DEBUG_TIMING @@ -433,6 +768,10 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) DrawInitText(basefilename,150,FC_YELLOW); sprintf(filename,"%s/%s",GFX_PATH,basefilename); +#ifdef MSDOS + rest(100); +#endif MSDOS + #ifdef DEBUG_TIMING count1 = Counter(); #endif @@ -443,6 +782,7 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) xpm_att[pos].closeness = 20000; xpm_err = XpmReadFileToPixmap(display,window,filename, &pix[pos],&shapemask,&xpm_att[pos]); + switch(xpm_err) { case XpmOpenFailed: @@ -465,9 +805,16 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) break; } +#ifdef DEBUG_TIMING + count2 = Counter(); + printf("XPM LOADING %s IN %.2f SECONDS\n", + filename,(float)(count2-count1)/1000.0); +#endif + #else - gif_err = Read_GIF_to_Pixmap(display,filename,&pix[pos]); + gif_err = Read_GIF_to_Pixmaps(display, window, filename, + &pix[pos], &clipmask[pos]); switch(gif_err) { @@ -497,18 +844,18 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) break; } -#endif - #ifdef DEBUG_TIMING count2 = Counter(); - printf("LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/100.0); + printf("GIF LOADING %s IN %.2f SECONDS\n", + filename,(float)(count2-count1)/1000.0); +#endif + #endif if (!pix[pos]) { - fprintf(stderr, "%s: cannot read graphics file '%s'.\n", - progname,filename); + fprintf(stderr, "%s: cannot get graphics for '%s'.\n", + progname, pic->picture_filename); CloseAll(); exit(-1); } @@ -517,6 +864,9 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) /* zugehörige Maske laden (wenn vorhanden) */ if (pic->picture_with_mask) { + +#ifdef XPM_INCLUDE_FILE + sprintf(basefilename,"%s%s",pic->picture_filename,picturemask_ext); DrawInitText(basefilename,150,FC_YELLOW); sprintf(filename,"%s/%s",GFX_PATH,basefilename); @@ -525,10 +875,9 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) count1 = Counter(); #endif -#ifdef XPM_INCLUDE_FILE - xbm_err = XReadBitmapFile(display,window,filename, &width,&height,&clipmask[pos],&hot_x,&hot_y); + switch(xbm_err) { case BitmapSuccess: @@ -552,46 +901,18 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) break; } -#else - - ilbm_err = Read_ILBM_to_Bitmap(display,filename,&clipmask[pos]); - - switch(ilbm_err) - { - case ILBM_Success: - break; - case ILBM_OpenFailed: - fprintf(stderr,"Cannot open ILBM file '%s' !\n",filename); - CloseAll(); - exit(-1); - case ILBM_ReadFailed: - fprintf(stderr,"Cannot read ILBM file '%s' !\n",filename); - CloseAll(); - exit(-1); - case ILBM_FileInvalid: - fprintf(stderr,"Invalid ILBM file '%s'!\n",filename); - CloseAll(); - exit(-1); - case ILBM_NoMemory: - fprintf(stderr,"Not enough memory for ILBM file '%s'!\n",filename); - CloseAll(); - exit(1); - default: - break; - } - -#endif - #ifdef DEBUG_TIMING count2 = Counter(); - printf("LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/100.0); + printf("XBM LOADING %s IN %.2f SECONDS\n", + filename,(float)(count2-count1)/1000.0); +#endif + #endif if (!clipmask[pos]) { - fprintf(stderr, "%s: cannot read graphics file '%s'.\n", - progname,filename); + fprintf(stderr, "%s: cannot get clipmask for '%s'.\n", + progname, pic->picture_filename); CloseAll(); exit(-1); } @@ -1040,6 +1361,16 @@ void InitElementProperties() }; static int ep_pushable_num = sizeof(ep_pushable)/sizeof(int); + static int ep_player[] = + { + EL_SPIELFIGUR, + EL_SPIELER1, + EL_SPIELER2, + EL_SPIELER3, + EL_SPIELER4 + }; + static int ep_player_num = sizeof(ep_player)/sizeof(int); + static long ep_bit[] = { EP_BIT_AMOEBALIVE, @@ -1065,7 +1396,8 @@ void InitElementProperties() EP_BIT_INACTIVE, EP_BIT_EXPLOSIVE, EP_BIT_MAMPF3, - EP_BIT_PUSHABLE + EP_BIT_PUSHABLE, + EP_BIT_PLAYER }; static int *ep_array[] = { @@ -1092,7 +1424,8 @@ void InitElementProperties() ep_inactive, ep_explosive, ep_mampf3, - ep_pushable + ep_pushable, + ep_player }; static int *ep_num[] = { @@ -1119,7 +1452,8 @@ void InitElementProperties() &ep_inactive_num, &ep_explosive_num, &ep_mampf3_num, - &ep_pushable_num + &ep_pushable_num, + &ep_player_num }; static int num_properties = sizeof(ep_num)/sizeof(int *); @@ -1166,8 +1500,12 @@ void CloseAll() if (gc) XFreeGC(display, gc); + if (display) + { + XAutoRepeatOn(display); XCloseDisplay(display); + } exit(0); }