X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=726f78560b8f25eae13d3a5cd26c8c0337879221;hb=1256664ceac31f448a0139edd3bd0dc8fa5a8697;hp=c9fc72c86fa0bb0201664034196178ac7b6cfcff;hpb=b7d31643c9c84104fb3ebef778e545928610ff65;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index c9fc72c8..726f7856 100644 --- a/src/init.c +++ b/src/init.c @@ -19,7 +19,8 @@ #include "tools.h" #include "files.h" #include "joystick.h" -#include "gfxloader.h" +#include "gfxload.h" +#include "gifload.h" #include @@ -93,6 +94,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 +116,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 +271,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 +327,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 +373,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 +397,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 +421,28 @@ void InitGfx() { "RocksFont", FALSE }, { "RocksFont2", FALSE } }; +#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; @@ -343,15 +452,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]) { @@ -374,16 +556,15 @@ 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); } } - drawto = drawto_field = backbuffer = pix[PIX_DB_BACK]; + drawto = backbuffer = pix[PIX_DB_BACK]; + fieldbuffer = pix[PIX_DB_FIELD]; + SetDrawtoField(DRAW_BACKBUFFER); XCopyArea(display,pix[PIX_BACK],backbuffer,gc, 0,0, WIN_XSIZE,WIN_YSIZE, 0,0); @@ -392,11 +573,11 @@ void InitGfx() XFillRectangle(display,pix[PIX_DB_DOOR],gc, 0,0, 3*DXSIZE,DYSIZE+VYSIZE); - for(i=0;ipicture_filename); CloseAll(); exit(-1); } @@ -512,6 +704,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); @@ -520,10 +715,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: @@ -547,46 +741,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); } @@ -1161,8 +1327,12 @@ void CloseAll() if (gc) XFreeGC(display, gc); + if (display) + { + XAutoRepeatOn(display); XCloseDisplay(display); + } exit(0); }