X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=9092f382813787b83c942fd1d9403c5ea5ff6b77;hb=34b9fd6b89ffe8fa0637840118b43e4d36bb1798;hp=ebaeb4b180d987ae4245da094c3be32691344a2a;hpb=e4566563844c4bcfc472159c9ae870941099708c;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index ebaeb4b1..9092f382 100644 --- a/src/init.c +++ b/src/init.c @@ -25,9 +25,9 @@ #include #ifdef DEBUG - +/* #define DEBUG_TIMING - +*/ #endif struct PictureFileInfo @@ -80,6 +80,8 @@ void OpenAll(int argc, char *argv[]) void InitLevelAndPlayerInfo() { + local_player = &stored_player[0]; + if (!LoadLevelInfo()) /* global level info */ CloseAll(); @@ -228,8 +230,6 @@ void InitDisplay(int argc, char *argv[]) visual = DefaultVisual(display, screen); depth = DefaultDepth(display, screen); cmap = DefaultColormap(display, screen); - pen_fg = WhitePixel(display,screen); - pen_bg = BlackPixel(display,screen); /* look for good enough visual */ vinfo_template.screen = screen; @@ -276,6 +276,8 @@ void InitWindow(int argc, char *argv[]) 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 = @@ -373,8 +375,8 @@ 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; gc_values.foreground = pen_bg; @@ -397,8 +399,10 @@ 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] = { @@ -421,6 +425,27 @@ void InitGfx() }; #endif + static struct + { + int start; + int count; + } + tile_needs_clipping[] = + { + { GFX_SPIELER_UP, 4 }, + { GFX_SPIELER_DOWN, 4 }, + { GFX_SPIELER_LEFT, 4 }, + { GFX_SPIELER_RIGHT, 4 }, + { GFX_SPIELER_PUSH_LEFT, 4 }, + { GFX_SPIELER_PUSH_RIGHT, 4 }, + { GFX_GEBLUBBER, 4 }, + { GFX_DYNAMIT, 7 }, + { GFX_DYNABOMB, 4 }, + { GFX_SOKOBAN_OBJEKT, 1 }, + { GFX_MASK_SPARKLING, 3 }, + { -1, 0 } + }; + #ifdef DEBUG_TIMING long count1, count2; count1 = Counter(); @@ -435,13 +460,13 @@ void InitGfx() #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); @@ -467,11 +558,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); } } @@ -504,16 +592,11 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) unsigned int width,height; int hot_x,hot_y; Pixmap shapemask; -#ifdef MSDOS - char *picture_ext = ".gif"; -#else char *picture_ext = ".xpm"; -#endif 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 @@ -523,38 +606,13 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) /* Grafik laden */ if (pic->picture_filename) { - - - - - - sprintf(basefilename,"%s%s",pic->picture_filename,".gif"); + sprintf(basefilename,"%s%s",pic->picture_filename,picture_ext); DrawInitText(basefilename,150,FC_YELLOW); sprintf(filename,"%s/%s",GFX_PATH,basefilename); -#ifdef DEBUG_TIMING - count1 = Counter(); -#endif - - Read_GIF_to_Pixmaps(display, window, filename); - -#ifdef DEBUG_TIMING - count2 = Counter(); - printf("GIF LOADING %s IN %.2f SECONDS\n", - filename,(float)(count2-count1)/100.0); -#endif - - - - - - - sprintf(basefilename,"%s%s",pic->picture_filename,picture_ext); - DrawInitText(basefilename,150,FC_YELLOW); #ifdef MSDOS rest(100); #endif MSDOS - sprintf(filename,"%s/%s",GFX_PATH,basefilename); #ifdef DEBUG_TIMING count1 = Counter(); @@ -563,18 +621,9 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) #ifdef XPM_INCLUDE_FILE xpm_att[pos].valuemask = XpmCloseness; - xpm_att[pos].closeness = 65535; - - /* xpm_att[pos].closeness = 20000; - */ - -#if 0 xpm_err = XpmReadFileToPixmap(display,window,filename, &pix[pos],&shapemask,&xpm_att[pos]); -#else - xpm_err = XpmSuccess; -#endif switch(xpm_err) { @@ -598,9 +647,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) { @@ -630,57 +686,40 @@ void LoadGfx(int pos, struct PictureFileInfo *pic) break; } -#endif - #ifdef DEBUG_TIMING count2 = Counter(); - /* - printf("XPM 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 0 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); } -#endif - } /* zugehörige Maske laden (wenn vorhanden) */ if (pic->picture_with_mask) { -#ifdef MSDOS - xbm_err = BitmapSuccess; - clipmask[pos] = DUMMY_MASK; - goto msdos_jmp; -#else + +#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); -#endif #ifdef DEBUG_TIMING count1 = Counter(); #endif -#ifdef XPM_INCLUDE_FILE - -#if 0 xbm_err = XReadBitmapFile(display,window,filename, &width,&height,&clipmask[pos],&hot_x,&hot_y); -#else - xbm_err = BitmapSuccess; -#endif -#ifdef MSDOS -msdos_jmp: -#endif switch(xbm_err) { case BitmapSuccess: @@ -704,58 +743,22 @@ msdos_jmp: 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 0 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); } -#endif - } - - pix[pos] = test_pix[test_picture_count-1]; - clipmask[pos] = test_clipmask[test_picture_count-1]; } void InitElementProperties() @@ -1326,8 +1329,12 @@ void CloseAll() if (gc) XFreeGC(display, gc); + if (display) + { + XAutoRepeatOn(display); XCloseDisplay(display); + } exit(0); }