+ XFillRectangle(display,pix[PIX_DB_DOOR],gc,
+ 0,0, 3*DXSIZE,DYSIZE+VYSIZE);
+
+ for(i=0; i<MAX_BUF_XSIZE; i++)
+ for(j=0; j<MAX_BUF_YSIZE; j++)
+ redraw[i][j] = 0;
+ redraw_tiles = 0;
+ redraw_mask = REDRAW_ALL;
+}
+
+void LoadGfx(int pos, struct PictureFileInfo *pic)
+{
+ char basefilename[256];
+ char filename[256];
+
+#ifdef XPM_INCLUDE_FILE
+ int xpm_err, xbm_err;
+ unsigned int width,height;
+ int hot_x,hot_y;
+ Pixmap shapemask;
+ char *picture_ext = ".xpm";
+ char *picturemask_ext = "Mask.xbm";
+#else
+ int gif_err;
+ char *picture_ext = ".gif";
+#endif
+
+#ifdef DEBUG_TIMING
+ long count1, count2;
+#endif
+
+ /* Grafik laden */
+ if (pic->picture_filename)
+ {
+ sprintf(basefilename,"%s%s",pic->picture_filename,picture_ext);
+ DrawInitText(basefilename,150,FC_YELLOW);
+ sprintf(filename,"%s/%s",GFX_PATH,basefilename);
+
+#ifdef MSDOS
+ rest(100);
+#endif MSDOS
+
+#ifdef DEBUG_TIMING
+ count1 = Counter();
+#endif
+
+#ifdef XPM_INCLUDE_FILE
+
+ 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:
+ Error(ERR_EXIT, "cannot open XPM file '%s'", filename);
+ case XpmFileInvalid:
+ Error(ERR_EXIT, "invalid XPM file '%s'", filename);
+ case XpmNoMemory:
+ Error(ERR_EXIT, "not enough memory for XPM file '%s'", filename);
+ case XpmColorFailed:
+ 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);
+#endif
+
+#else
+
+ gif_err = Read_GIF_to_Pixmaps(display, window, filename,
+ &pix[pos], &clipmask[pos]);
+
+ switch(gif_err)
+ {
+ case GIF_Success:
+ break;
+ case GIF_OpenFailed:
+ Error(ERR_EXIT, "cannot open GIF file '%s'", filename);
+ case GIF_ReadFailed:
+ Error(ERR_EXIT, "cannot read GIF file '%s'", filename);
+ case GIF_FileInvalid:
+ Error(ERR_EXIT, "invalid GIF file '%s'", filename);
+ case GIF_NoMemory:
+ Error(ERR_EXIT, "not enough memory for GIF file '%s'", filename);
+ case GIF_ColorFailed:
+ Error(ERR_EXIT, "cannot get colors for GIF file '%s'", filename);
+ default:
+ break;
+ }
+
+#ifdef DEBUG_TIMING
+ count2 = Counter();
+ printf("GIF LOADING %s IN %.2f SECONDS\n",
+ filename,(float)(count2-count1)/1000.0);
+#endif
+
+#endif
+
+ if (!pix[pos])
+ Error(ERR_EXIT, "cannot get graphics for '%s'", pic->picture_filename);
+ }
+
+ /* 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);
+
+#ifdef DEBUG_TIMING
+ count1 = Counter();
+#endif
+
+ xbm_err = XReadBitmapFile(display,window,filename,
+ &width,&height,&clipmask[pos],&hot_x,&hot_y);
+
+ switch(xbm_err)
+ {
+ case BitmapSuccess:
+ break;
+ case BitmapOpenFailed:
+ Error(ERR_EXIT, "cannot open XBM file '%s'", filename);
+ case BitmapFileInvalid:
+ Error(ERR_EXIT, "invalid XBM file '%s'", filename);
+ case BitmapNoMemory:
+ 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);
+#endif
+
+#endif
+
+ if (!clipmask[pos])
+ Error(ERR_EXIT, "cannot get clipmask for '%s'", pic->picture_filename);
+ }
+}
+
+void InitElementProperties()
+{
+ int i,j;
+
+ static int ep_amoebalive[] =
+ {
+ EL_AMOEBE_NASS,
+ EL_AMOEBE_NORM,
+ EL_AMOEBE_VOLL,
+ EL_AMOEBE_BD
+ };
+ static int ep_amoebalive_num = sizeof(ep_amoebalive)/sizeof(int);
+
+ static int ep_amoeboid[] =
+ {
+ EL_AMOEBE_TOT,
+ EL_AMOEBE_NASS,
+ EL_AMOEBE_NORM,
+ EL_AMOEBE_VOLL,
+ EL_AMOEBE_BD
+ };
+ static int ep_amoeboid_num = sizeof(ep_amoeboid)/sizeof(int);
+
+ static int ep_schluessel[] =
+ {
+ EL_SCHLUESSEL1,
+ EL_SCHLUESSEL2,
+ EL_SCHLUESSEL3,
+ EL_SCHLUESSEL4
+ };
+ static int ep_schluessel_num = sizeof(ep_schluessel)/sizeof(int);
+
+ static int ep_pforte[] =
+ {
+ EL_PFORTE1,
+ EL_PFORTE2,
+ EL_PFORTE3,
+ EL_PFORTE4,
+ EL_PFORTE1X,
+ EL_PFORTE2X,
+ EL_PFORTE3X,
+ EL_PFORTE4X
+ };
+ static int ep_pforte_num = sizeof(ep_pforte)/sizeof(int);
+
+ static int ep_solid[] =
+ {
+ EL_BETON,
+ EL_MAUERWERK,
+ EL_MAUER_LEBT,
+ EL_MAUER_X,
+ EL_MAUER_Y,
+ EL_MAUER_XY,
+ EL_FELSBODEN,
+ EL_AUSGANG_ZU,
+ EL_AUSGANG_ACT,
+ EL_AUSGANG_AUF,
+ EL_AMOEBE_TOT,
+ EL_AMOEBE_NASS,
+ EL_AMOEBE_NORM,
+ EL_AMOEBE_VOLL,
+ EL_AMOEBE_BD,
+ EL_MORAST_VOLL,
+ EL_MORAST_LEER,
+ EL_SIEB_VOLL,
+ EL_SIEB_LEER,
+ EL_SIEB_TOT,
+ EL_SIEB2_VOLL,
+ EL_SIEB2_LEER,
+ EL_SIEB2_TOT,
+ EL_LIFE,
+ EL_LIFE_ASYNC,
+ EL_BADEWANNE1,
+ EL_BADEWANNE2,
+ EL_BADEWANNE3,
+ EL_BADEWANNE4,
+ EL_BADEWANNE5
+ };
+ static int ep_solid_num = sizeof(ep_solid)/sizeof(int);
+
+ static int ep_massiv[] =
+ {
+ EL_BETON,
+ EL_SALZSAEURE,
+ EL_BADEWANNE1,
+ EL_BADEWANNE2,
+ EL_BADEWANNE3,
+ EL_BADEWANNE4,
+ EL_BADEWANNE5,
+ EL_PFORTE1,
+ EL_PFORTE2,
+ EL_PFORTE3,
+ EL_PFORTE4,
+ EL_PFORTE1X,
+ EL_PFORTE2X,
+ EL_PFORTE3X,
+ EL_PFORTE4X
+ };
+ static int ep_massiv_num = sizeof(ep_massiv)/sizeof(int);
+
+ static int ep_slippery[] =
+ {
+ EL_FELSBODEN,
+ EL_FELSBROCKEN,
+ EL_EDELSTEIN,
+ EL_EDELSTEIN_BD,
+ EL_EDELSTEIN_GELB,
+ EL_EDELSTEIN_ROT,
+ EL_EDELSTEIN_LILA,
+ EL_DIAMANT,
+ EL_BOMBE,
+ EL_KOKOSNUSS,
+ EL_ABLENK_EIN,
+ EL_ABLENK_AUS,
+ EL_ZEIT_VOLL,
+ EL_ZEIT_LEER,
+ EL_BIRNE_EIN,
+ EL_BIRNE_AUS,
+ EL_BADEWANNE1,
+ EL_BADEWANNE2,
+ EL_SONDE
+ };
+ static int ep_slippery_num = sizeof(ep_slippery)/sizeof(int);
+
+ static int ep_enemy[] =
+ {
+ EL_KAEFER,
+ EL_FLIEGER,
+ EL_BUTTERFLY,
+ EL_FIREFLY,
+ EL_MAMPFER,
+ EL_MAMPFER2,
+ EL_ROBOT,
+ EL_PACMAN
+ };
+ static int ep_enemy_num = sizeof(ep_enemy)/sizeof(int);
+
+ static int ep_mauer[] =
+ {
+ EL_BETON,
+ EL_PFORTE1,
+ EL_PFORTE2,
+ EL_PFORTE3,
+ EL_PFORTE4,
+ EL_PFORTE1X,
+ EL_PFORTE2X,
+ EL_PFORTE3X,
+ EL_PFORTE4X,
+ EL_AUSGANG_ZU,
+ EL_AUSGANG_ACT,
+ EL_AUSGANG_AUF,
+ 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);
+
+ static int ep_can_fall[] =
+ {
+ EL_FELSBROCKEN,
+ EL_EDELSTEIN,
+ EL_EDELSTEIN_BD,
+ EL_EDELSTEIN_GELB,
+ EL_EDELSTEIN_ROT,
+ EL_EDELSTEIN_LILA,
+ EL_DIAMANT,
+ EL_BOMBE,
+ EL_KOKOSNUSS,
+ EL_TROPFEN,
+ EL_MORAST_VOLL,
+ EL_SIEB_VOLL,
+ EL_SIEB2_VOLL,
+ EL_ZEIT_VOLL,
+ EL_ZEIT_LEER
+ };
+ static int ep_can_fall_num = sizeof(ep_can_fall)/sizeof(int);
+
+ static int ep_can_smash[] =
+ {
+ EL_FELSBROCKEN,
+ EL_EDELSTEIN,
+ EL_EDELSTEIN_BD,
+ EL_EDELSTEIN_GELB,
+ EL_EDELSTEIN_ROT,
+ EL_EDELSTEIN_LILA,
+ EL_DIAMANT,
+ EL_SCHLUESSEL1,
+ EL_SCHLUESSEL2,
+ EL_SCHLUESSEL3,
+ EL_SCHLUESSEL4,
+ EL_BOMBE,
+ EL_KOKOSNUSS,
+ EL_TROPFEN,
+ EL_ZEIT_VOLL,
+ EL_ZEIT_LEER
+ };
+ static int ep_can_smash_num = sizeof(ep_can_smash)/sizeof(int);
+
+ static int ep_can_change[] =
+ {
+ EL_FELSBROCKEN,
+ EL_EDELSTEIN,
+ EL_EDELSTEIN_BD,
+ EL_EDELSTEIN_GELB,
+ EL_EDELSTEIN_ROT,
+ EL_EDELSTEIN_LILA,
+ EL_DIAMANT
+ };
+ static int ep_can_change_num = sizeof(ep_can_change)/sizeof(int);
+
+ static int ep_can_move[] =
+ {
+ EL_KAEFER,
+ EL_FLIEGER,
+ EL_BUTTERFLY,
+ EL_FIREFLY,
+ EL_MAMPFER,
+ EL_MAMPFER2,
+ EL_ROBOT,
+ EL_PACMAN,
+ EL_MAULWURF,
+ EL_PINGUIN,
+ EL_SCHWEIN,
+ EL_DRACHE,
+ EL_SONDE
+ };
+ static int ep_can_move_num = sizeof(ep_can_move)/sizeof(int);
+
+ static int ep_could_move[] =
+ {
+ EL_KAEFER_R,
+ EL_KAEFER_O,
+ EL_KAEFER_L,
+ EL_KAEFER_U,
+ EL_FLIEGER_R,
+ EL_FLIEGER_O,
+ EL_FLIEGER_L,
+ EL_FLIEGER_U,
+ EL_BUTTERFLY_R,
+ EL_BUTTERFLY_O,
+ EL_BUTTERFLY_L,
+ EL_BUTTERFLY_U,
+ EL_FIREFLY_R,
+ EL_FIREFLY_O,
+ EL_FIREFLY_L,
+ EL_FIREFLY_U,
+ EL_PACMAN_R,
+ EL_PACMAN_O,
+ EL_PACMAN_L,
+ EL_PACMAN_U
+ };
+ static int ep_could_move_num = sizeof(ep_could_move)/sizeof(int);