rnd-20020824-2-src
[rocksndiamonds.git] / src / init.c
1 /***********************************************************
2 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
3 *----------------------------------------------------------*
4 * (c) 1995-2002 Artsoft Entertainment                      *
5 *               Holger Schemel                             *
6 *               Detmolder Strasse 189                      *
7 *               33604 Bielefeld                            *
8 *               Germany                                    *
9 *               e-mail: info@artsoft.org                   *
10 *----------------------------------------------------------*
11 * init.c                                                   *
12 ***********************************************************/
13
14 #include "libgame/libgame.h"
15
16 #include "init.h"
17 #include "events.h"
18 #include "screens.h"
19 #include "editor.h"
20 #include "game.h"
21 #include "tape.h"
22 #include "tools.h"
23 #include "files.h"
24 #include "network.h"
25 #include "netserv.h"
26 #include "cartoons.h"
27 #include "config.h"
28
29 static char *image_filename[NUM_PICTURES] =
30 {
31   "RocksScreen.pcx",
32   "RocksDoor.pcx",
33   "RocksHeroes.pcx",
34   "RocksToons.pcx",
35   "RocksSP.pcx",
36   "RocksDC.pcx",
37   "RocksMore.pcx",
38   "RocksFont.pcx",
39   "RocksFont2.pcx",
40   "RocksFont3.pcx"
41 }; 
42
43 static void InitSetup(void);
44 static void InitPlayerInfo(void);
45 static void InitLevelInfo(void);
46 static void InitArtworkInfo(void);
47 static void InitLevelArtworkInfo(void);
48 static void InitNetworkServer(void);
49 static void InitMixer(void);
50 static void InitSound(void);
51 static void InitGfx(void);
52 static void InitGfxBackground(void);
53 static void InitGadgets(void);
54 static void InitElementProperties(void);
55 static void Execute_Debug_Command(char *);
56
57 void OpenAll(void)
58 {
59   if (options.debug_command)
60   {
61     Execute_Debug_Command(options.debug_command);
62
63     exit(0);
64   }
65
66   if (options.serveronly)
67   {
68 #if defined(PLATFORM_UNIX)
69     NetworkServer(options.server_port, options.serveronly);
70 #else
71     Error(ERR_WARN, "networking only supported in Unix version");
72 #endif
73     exit(0);    /* never reached */
74   }
75
76   InitProgramInfo(UNIX_USERDATA_DIRECTORY,
77                   PROGRAM_TITLE_STRING, getWindowTitleString(),
78                   ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME,
79                   MSDOS_POINTER_FILENAME,
80                   COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL);
81
82   InitSetup();
83   InitPlayerInfo();
84   InitArtworkInfo();            /* needed before loading gfx, sound & music */
85
86   InitCounter();
87   InitMixer();
88   InitJoysticks();
89   InitRND(NEW_RANDOMIZE);
90
91   InitVideoDisplay();
92   InitVideoBuffer(&backbuffer, &window, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH,
93                   setup.fullscreen);
94
95   InitEventFilter(FilterMouseMotionEvents);
96
97   InitGfx();
98   InitElementProperties();      /* initializes IS_CHAR() for el2gfx() */
99
100   InitLevelInfo();
101   InitLevelArtworkInfo();
102   InitGadgets();                /* needs to know number of level series */
103   InitSound();                  /* needs to know current level directory */
104
105   InitGfxBackground();
106   InitToons();
107
108   DrawMainMenu();
109
110   InitNetworkServer();
111 }
112
113 void InitSetup()
114 {
115   LoadSetup();                                  /* global setup info */
116 }
117
118 void InitPlayerInfo()
119 {
120   int i;
121
122   /* choose default local player */
123   local_player = &stored_player[0];
124
125   for (i=0; i<MAX_PLAYERS; i++)
126     stored_player[i].connected = FALSE;
127
128   local_player->connected = TRUE;
129 }
130
131 void InitLevelInfo()
132 {
133   LoadLevelInfo();                              /* global level info */
134   LoadLevelSetup_LastSeries();                  /* last played series info */
135   LoadLevelSetup_SeriesInfo();                  /* last played level info */
136 }
137
138 void InitArtworkInfo()
139 {
140   LoadArtworkInfo();
141 }
142
143 void InitLevelArtworkInfo()
144 {
145   LoadLevelArtworkInfo();
146 }
147
148 void InitNetworkServer()
149 {
150 #if defined(PLATFORM_UNIX)
151   int nr_wanted;
152 #endif
153
154   if (!options.network)
155     return;
156
157 #if defined(PLATFORM_UNIX)
158   nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED);
159
160   if (!ConnectToServer(options.server_host, options.server_port))
161     Error(ERR_EXIT, "cannot connect to network game server");
162
163   SendToServer_PlayerName(setup.player_name);
164   SendToServer_ProtocolVersion();
165
166   if (nr_wanted)
167     SendToServer_NrWanted(nr_wanted);
168 #endif
169 }
170
171 static void InitMixer()
172 {
173   OpenAudio();
174   InitSoundList(sound_effects, NUM_SOUND_EFFECTS);
175
176   StartMixer();
177 }
178
179 static void InitSound()
180 {
181   /* load custom sounds and music */
182   InitReloadSounds(artwork.snd_current->identifier);
183   InitReloadMusic(artwork.mus_current->identifier);
184
185   /* initialize sound effect lookup table for element actions */
186   InitGameSound();
187 }
188
189 static void InitTileClipmasks()
190 {
191 #if defined(TARGET_X11)
192   XGCValues clip_gc_values;
193   unsigned long clip_gc_valuemask;
194
195 #if defined(TARGET_X11_NATIVE)
196   GC copy_clipmask_gc;
197
198   static struct
199   {
200     int start;
201     int count;
202   }
203   tile_needs_clipping[] =
204   {
205     { GFX_SPIELER1_UP, 4 },
206     { GFX_SPIELER1_DOWN, 4 },
207     { GFX_SPIELER1_LEFT, 4 },
208     { GFX_SPIELER1_RIGHT, 4 },
209     { GFX_SPIELER1_PUSH_LEFT, 4 },
210     { GFX_SPIELER1_PUSH_RIGHT, 4 },
211     { GFX_SPIELER2_UP, 4 },
212     { GFX_SPIELER2_DOWN, 4 },
213     { GFX_SPIELER2_LEFT, 4 },
214     { GFX_SPIELER2_RIGHT, 4 },
215     { GFX_SPIELER2_PUSH_LEFT, 4 },
216     { GFX_SPIELER2_PUSH_RIGHT, 4 },
217     { GFX_SPIELER3_UP, 4 },
218     { GFX_SPIELER3_DOWN, 4 },
219     { GFX_SPIELER3_LEFT, 4 },
220     { GFX_SPIELER3_RIGHT, 4 },
221     { GFX_SPIELER3_PUSH_LEFT, 4 },
222     { GFX_SPIELER3_PUSH_RIGHT, 4 },
223     { GFX_SPIELER4_UP, 4 },
224     { GFX_SPIELER4_DOWN, 4 },
225     { GFX_SPIELER4_LEFT, 4 },
226     { GFX_SPIELER4_RIGHT, 4 },
227     { GFX_SPIELER4_PUSH_LEFT, 4 },
228     { GFX_SPIELER4_PUSH_RIGHT, 4 },
229     { GFX_SP_MURPHY, 1 },
230     { GFX_MURPHY_GO_LEFT, 3 },
231     { GFX_MURPHY_GO_RIGHT, 3 },
232     { GFX_MURPHY_SNAP_UP, 1 },
233     { GFX_MURPHY_SNAP_DOWN, 1 },
234     { GFX_MURPHY_SNAP_RIGHT, 1 },
235     { GFX_MURPHY_SNAP_LEFT, 1 },
236     { GFX_MURPHY_PUSH_RIGHT, 1 },
237     { GFX_MURPHY_PUSH_LEFT, 1 },
238     { GFX_GEBLUBBER, 4 },
239     { GFX_DYNAMIT, 7 },
240     { GFX_DYNABOMB, 4 },
241     { GFX_EXPLOSION, 8 },
242     { GFX_SOKOBAN_OBJEKT, 1 },
243     { GFX_FUNKELN_BLAU, 3 },
244     { GFX_FUNKELN_WEISS, 3 },
245     { GFX2_SHIELD_PASSIVE, 3 },
246     { GFX2_SHIELD_ACTIVE, 3 },
247     { -1, 0 }
248   };
249 #endif /* TARGET_X11_NATIVE */
250 #endif /* TARGET_X11 */
251
252   int i;
253
254   /* initialize pixmap array for special X11 tile clipping to Pixmap 'None' */
255   for(i=0; i<NUM_TILES; i++)
256     tile_clipmask[i] = None;
257
258 #if defined(TARGET_X11)
259   /* This stuff is needed because X11 (XSetClipOrigin(), to be precise) is
260      often very slow when preparing a masked XCopyArea() for big Pixmaps.
261      To prevent this, create small (tile-sized) mask Pixmaps which will then
262      be set much faster with XSetClipOrigin() and speed things up a lot. */
263
264   clip_gc_values.graphics_exposures = False;
265   clip_gc_valuemask = GCGraphicsExposures;
266   tile_clip_gc =
267     XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values);
268
269   for(i=0; i<NUM_BITMAPS; i++)
270   {
271     if (pix[i]->clip_mask)
272     {
273       clip_gc_values.graphics_exposures = False;
274       clip_gc_values.clip_mask = pix[i]->clip_mask;
275       clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
276       pix[i]->stored_clip_gc = XCreateGC(display, window->drawable,
277                                          clip_gc_valuemask, &clip_gc_values);
278     }
279   }
280
281 #if defined(TARGET_X11_NATIVE)
282
283   /* create graphic context structures needed for clipping */
284   clip_gc_values.graphics_exposures = False;
285   clip_gc_valuemask = GCGraphicsExposures;
286   copy_clipmask_gc =
287     XCreateGC(display, pix[PIX_BACK]->clip_mask,
288               clip_gc_valuemask, &clip_gc_values);
289
290   /* create only those clipping Pixmaps we really need */
291   for(i=0; tile_needs_clipping[i].start>=0; i++)
292   {
293     int j;
294
295     for(j=0; j<tile_needs_clipping[i].count; j++)
296     {
297       int tile = tile_needs_clipping[i].start + j;
298       int graphic = tile;
299       int src_x, src_y;
300       int pixmap_nr;
301       Pixmap src_pixmap;
302
303       getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y);
304       src_pixmap = pix[pixmap_nr]->clip_mask;
305
306       tile_clipmask[tile] = XCreatePixmap(display, window->drawable,
307                                           TILEX, TILEY, 1);
308
309       XCopyArea(display, src_pixmap, tile_clipmask[tile], copy_clipmask_gc,
310                 src_x, src_y, TILEX, TILEY, 0, 0);
311     }
312   }
313
314   XFreeGC(display, copy_clipmask_gc);
315
316 #endif /* TARGET_X11_NATIVE */
317 #endif /* TARGET_X11 */
318 }
319
320 void FreeTileClipmasks()
321 {
322 #if defined(TARGET_X11)
323   int i;
324
325   for(i=0; i<NUM_TILES; i++)
326   {
327     if (tile_clipmask[i] != None)
328     {
329       XFreePixmap(display, tile_clipmask[i]);
330       tile_clipmask[i] = None;
331     }
332   }
333
334   if (tile_clip_gc)
335     XFreeGC(display, tile_clip_gc);
336   tile_clip_gc = None;
337
338   for(i=0; i<NUM_BITMAPS; i++)
339   {
340     if (pix[i] != NULL && pix[i]->stored_clip_gc)
341     {
342       XFreeGC(display, pix[i]->stored_clip_gc);
343       pix[i]->stored_clip_gc = None;
344     }
345   }
346 #endif /* TARGET_X11 */
347 }
348
349 void InitGfx()
350 {
351   int i;
352
353   /* initialize some global variables */
354   global.frames_per_second = 0;
355   global.fps_slowdown = FALSE;
356   global.fps_slowdown_factor = 1;
357
358   /* initialize screen properties */
359   InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
360                    REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
361   InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
362   InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
363   InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
364
365   /* create additional image buffers for double-buffering */
366   pix[PIX_DB_DOOR] = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
367   pix[PIX_DB_FIELD] = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
368
369   pix[PIX_SMALLFONT] = LoadCustomImage(image_filename[PIX_SMALLFONT]);
370
371   InitFontInfo(NULL, NULL, pix[PIX_SMALLFONT]);
372
373   DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
374   DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
375
376   DrawInitText("Loading graphics:", 120, FC_GREEN);
377
378   for(i=0; i<NUM_PICTURES; i++)
379   {
380     if (i != PIX_SMALLFONT)
381     {
382       DrawInitText(image_filename[i], 150, FC_YELLOW);
383
384       pix[i] = LoadCustomImage(image_filename[i]);
385     }
386   }
387
388   InitFontInfo(pix[PIX_BIGFONT], pix[PIX_MEDIUMFONT], pix[PIX_SMALLFONT]);
389
390   InitTileClipmasks();
391 }
392
393 void InitGfxBackground()
394 {
395   int x, y;
396
397   drawto = backbuffer;
398   fieldbuffer = pix[PIX_DB_FIELD];
399   SetDrawtoField(DRAW_BACKBUFFER);
400
401   BlitBitmap(pix[PIX_BACK], backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
402   ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
403   ClearRectangle(pix[PIX_DB_DOOR], 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE);
404
405   for(x=0; x<MAX_BUF_XSIZE; x++)
406     for(y=0; y<MAX_BUF_YSIZE; y++)
407       redraw[x][y] = 0;
408   redraw_tiles = 0;
409   redraw_mask = REDRAW_ALL;
410 }
411
412 void ReloadCustomArtwork()
413 {
414   static char *leveldir_current_identifier = NULL;
415   static boolean last_override_level_graphics = FALSE;
416   static boolean last_override_level_sounds = FALSE;
417   static boolean last_override_level_music = FALSE;
418
419   /* identifier for new artwork; default: artwork configured in setup */
420   char *gfx_new_identifier = artwork.gfx_current->identifier;
421   char *snd_new_identifier = artwork.snd_current->identifier;
422   char *mus_new_identifier = artwork.mus_current->identifier;
423
424 #if 0
425   printf("graphics --> '%s' ('%s')\n",
426          artwork.gfx_current_identifier, artwork.gfx_current->filename);
427   printf("sounds   --> '%s' ('%s')\n",
428          artwork.snd_current_identifier, artwork.snd_current->filename);
429   printf("music    --> '%s' ('%s')\n",
430          artwork.mus_current_identifier, artwork.mus_current->filename);
431 #endif
432
433   /* leveldir_current may be invalid (level group, parent link) */
434   if (!validLevelSeries(leveldir_current))
435     return;
436
437 #if 0
438   printf("--> '%s'\n", artwork.gfx_current_identifier);
439 #endif
440
441   /* when a new level series was selected, check if there was a change
442      in custom artwork stored in level series directory */
443   if (leveldir_current_identifier != leveldir_current->identifier)
444   {
445     char *identifier_old = leveldir_current_identifier;
446     char *identifier_new = leveldir_current->identifier;
447
448     if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old) !=
449         getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new))
450       gfx_new_identifier = identifier_new;
451     if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_old) !=
452         getTreeInfoFromIdentifier(artwork.snd_first, identifier_new))
453       snd_new_identifier = identifier_new;
454     if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) !=
455         getTreeInfoFromIdentifier(artwork.mus_first, identifier_new))
456       artwork.mus_current_identifier = NULL;
457
458     leveldir_current_identifier = leveldir_current->identifier;
459   }
460
461   /* custom level artwork configured in level series configuration file
462      always overrides custom level artwork stored in level series directory
463      and (level independant) custom artwork configured in setup menue
464      (the path entry is needed to send it to the sound child process) */
465   if (leveldir_current->graphics_set != NULL)
466   {
467     if (leveldir_current->graphics_path)
468       free(leveldir_current->graphics_path);
469     leveldir_current->graphics_path = NULL;
470     leveldir_current->graphics_path =
471       getStringCopy(getLevelArtworkDir(artwork.gfx_first));
472     gfx_new_identifier = leveldir_current->graphics_set;
473   }
474   if (leveldir_current->sounds_set != NULL)
475   {
476     if (leveldir_current->sounds_path)
477       free(leveldir_current->sounds_path);
478     leveldir_current->sounds_path = NULL;
479     leveldir_current->sounds_path =
480       getStringCopy(getLevelArtworkDir(artwork.snd_first));
481     snd_new_identifier = leveldir_current->sounds_set;
482   }
483   if (leveldir_current->music_set != NULL)
484   {
485     if (leveldir_current->music_path)
486       free(leveldir_current->music_path);
487     leveldir_current->music_path = NULL;
488     leveldir_current->music_path =
489       getStringCopy(getLevelArtworkDir(artwork.mus_first));
490     mus_new_identifier = leveldir_current->music_set;
491   }
492
493   if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 ||
494       last_override_level_graphics != setup.override_level_graphics)
495   {
496     int i;
497
498     ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE);
499
500     for(i=0; i<NUM_PICTURES; i++)
501     {
502       DrawInitText(image_filename[i], 150, FC_YELLOW);
503       ReloadCustomImage(pix[i], image_filename[i]);
504     }
505
506     FreeTileClipmasks();
507     InitTileClipmasks();
508     InitGfxBackground();
509
510     /* force redraw of (open or closed) door graphics */
511     SetDoorState(DOOR_OPEN_ALL);
512     CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
513
514     artwork.gfx_current_identifier = gfx_new_identifier;
515     last_override_level_graphics = setup.override_level_graphics;
516   }
517
518   if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 ||
519       last_override_level_sounds != setup.override_level_sounds)
520   {
521     InitReloadSounds(snd_new_identifier);
522
523     artwork.snd_current_identifier = snd_new_identifier;
524     last_override_level_sounds = setup.override_level_sounds;
525   }
526
527   if (strcmp(artwork.mus_current_identifier, mus_new_identifier) != 0 ||
528       last_override_level_music != setup.override_level_music)
529   {
530     InitReloadMusic(mus_new_identifier);
531
532     artwork.mus_current_identifier = mus_new_identifier;
533     last_override_level_music = setup.override_level_music;
534   }
535
536 #if 0
537   printf("<-- '%s'\n", artwork.gfx_current_identifier);
538 #endif
539 }
540
541 void InitGadgets()
542 {
543   CreateLevelEditorGadgets();
544   CreateGameButtons();
545   CreateTapeButtons();
546   CreateToolButtons();
547   CreateScreenGadgets();
548 }
549
550 void InitElementProperties()
551 {
552   int i,j;
553
554   static int ep_amoebalive[] =
555   {
556     EL_AMOEBE_NASS,
557     EL_AMOEBE_NORM,
558     EL_AMOEBE_VOLL,
559     EL_AMOEBE_BD
560   };
561   static int ep_amoebalive_num = SIZEOF_ARRAY_INT(ep_amoebalive);
562
563   static int ep_amoeboid[] =
564   {
565     EL_AMOEBE_TOT,
566     EL_AMOEBE_NASS,
567     EL_AMOEBE_NORM,
568     EL_AMOEBE_VOLL,
569     EL_AMOEBE_BD
570   };
571   static int ep_amoeboid_num = SIZEOF_ARRAY_INT(ep_amoeboid);
572
573   static int ep_schluessel[] =
574   {
575     EL_SCHLUESSEL1,
576     EL_SCHLUESSEL2,
577     EL_SCHLUESSEL3,
578     EL_SCHLUESSEL4,
579     EL_EM_KEY_1,
580     EL_EM_KEY_2,
581     EL_EM_KEY_3,
582     EL_EM_KEY_4
583   };
584   static int ep_schluessel_num = SIZEOF_ARRAY_INT(ep_schluessel);
585
586   static int ep_pforte[] =
587   {
588     EL_PFORTE1,
589     EL_PFORTE2,
590     EL_PFORTE3,
591     EL_PFORTE4,
592     EL_PFORTE1X,
593     EL_PFORTE2X,
594     EL_PFORTE3X,
595     EL_PFORTE4X,
596     EL_EM_GATE_1,
597     EL_EM_GATE_2,
598     EL_EM_GATE_3,
599     EL_EM_GATE_4,
600     EL_EM_GATE_1X,
601     EL_EM_GATE_2X,
602     EL_EM_GATE_3X,
603     EL_EM_GATE_4X,
604     EL_SWITCHGATE_OPEN,
605     EL_SWITCHGATE_OPENING,
606     EL_SWITCHGATE_CLOSED,
607     EL_SWITCHGATE_CLOSING,
608     EL_TIMEGATE_OPEN,
609     EL_TIMEGATE_OPENING,
610     EL_TIMEGATE_CLOSED,
611     EL_TIMEGATE_CLOSING,
612     EL_TUBE_CROSS,
613     EL_TUBE_VERTICAL,
614     EL_TUBE_HORIZONTAL,
615     EL_TUBE_VERT_LEFT,
616     EL_TUBE_VERT_RIGHT,
617     EL_TUBE_HORIZ_UP,
618     EL_TUBE_HORIZ_DOWN,
619     EL_TUBE_LEFT_UP,
620     EL_TUBE_LEFT_DOWN,
621     EL_TUBE_RIGHT_UP,
622     EL_TUBE_RIGHT_DOWN
623   };
624   static int ep_pforte_num = SIZEOF_ARRAY_INT(ep_pforte);
625
626   static int ep_solid[] =
627   {
628     EL_BETON,
629     EL_MAUERWERK,
630     EL_MAUER_LEBT,
631     EL_MAUER_X,
632     EL_MAUER_Y,
633     EL_MAUER_XY,
634     EL_BD_WALL,
635     EL_FELSBODEN,
636     EL_AUSGANG_ZU,
637     EL_AUSGANG_ACT,
638     EL_AUSGANG_AUF,
639     EL_AMOEBE_TOT,
640     EL_AMOEBE_NASS,
641     EL_AMOEBE_NORM,
642     EL_AMOEBE_VOLL,
643     EL_AMOEBE_BD,
644     EL_MORAST_VOLL,
645     EL_MORAST_LEER,
646     EL_QUICKSAND_FILLING,
647     EL_QUICKSAND_EMPTYING,
648     EL_MAGIC_WALL_OFF,
649     EL_MAGIC_WALL_EMPTY,
650     EL_MAGIC_WALL_EMPTYING,
651     EL_MAGIC_WALL_FILLING,
652     EL_MAGIC_WALL_FULL,
653     EL_MAGIC_WALL_DEAD,
654     EL_MAGIC_WALL_BD_OFF,
655     EL_MAGIC_WALL_BD_EMPTY,
656     EL_MAGIC_WALL_BD_EMPTYING,
657     EL_MAGIC_WALL_BD_FULL,
658     EL_MAGIC_WALL_BD_FILLING,
659     EL_MAGIC_WALL_BD_DEAD,
660     EL_LIFE,
661     EL_LIFE_ASYNC,
662     EL_BADEWANNE1,
663     EL_BADEWANNE2,
664     EL_BADEWANNE3,
665     EL_BADEWANNE4,
666     EL_BADEWANNE5,
667     EL_SP_CHIP_SINGLE,
668     EL_SP_CHIP_LEFT,
669     EL_SP_CHIP_RIGHT,
670     EL_SP_CHIP_UPPER,
671     EL_SP_CHIP_LOWER,
672     EL_SP_HARD_GRAY,
673     EL_SP_HARD_GREEN,
674     EL_SP_HARD_BLUE,
675     EL_SP_HARD_RED,
676     EL_SP_HARD_YELLOW,
677     EL_SP_HARD_BASE1,
678     EL_SP_HARD_BASE2,
679     EL_SP_HARD_BASE3,
680     EL_SP_HARD_BASE4,
681     EL_SP_HARD_BASE5,
682     EL_SP_HARD_BASE6,
683     EL_SP_TERMINAL,
684     EL_SP_TERMINAL_ACTIVE,
685     EL_SP_EXIT,
686     EL_INVISIBLE_STEEL,
687     EL_BELT1_SWITCH_LEFT,
688     EL_BELT1_SWITCH_MIDDLE,
689     EL_BELT1_SWITCH_RIGHT,
690     EL_BELT2_SWITCH_LEFT,
691     EL_BELT2_SWITCH_MIDDLE,
692     EL_BELT2_SWITCH_RIGHT,
693     EL_BELT3_SWITCH_LEFT,
694     EL_BELT3_SWITCH_MIDDLE,
695     EL_BELT3_SWITCH_RIGHT,
696     EL_BELT4_SWITCH_LEFT,
697     EL_BELT4_SWITCH_MIDDLE,
698     EL_BELT4_SWITCH_RIGHT,
699     EL_SWITCHGATE_SWITCH_1,
700     EL_SWITCHGATE_SWITCH_2,
701     EL_LIGHT_SWITCH_OFF,
702     EL_LIGHT_SWITCH_ON,
703     EL_TIMEGATE_SWITCH_OFF,
704     EL_TIMEGATE_SWITCH_ON,
705     EL_SIGN_EXCLAMATION,
706     EL_SIGN_RADIOACTIVITY,
707     EL_SIGN_STOP,
708     EL_SIGN_WHEELCHAIR,
709     EL_SIGN_PARKING,
710     EL_SIGN_ONEWAY,
711     EL_SIGN_HEART,
712     EL_SIGN_TRIANGLE,
713     EL_SIGN_ROUND,
714     EL_SIGN_EXIT,
715     EL_SIGN_YINYANG,
716     EL_SIGN_OTHER,
717     EL_STEEL_SLANTED,
718     EL_EMC_STEEL_WALL_1,
719     EL_EMC_STEEL_WALL_2,
720     EL_EMC_STEEL_WALL_3,
721     EL_EMC_STEEL_WALL_4,
722     EL_EMC_WALL_1,
723     EL_EMC_WALL_2,
724     EL_EMC_WALL_3,
725     EL_EMC_WALL_4,
726     EL_EMC_WALL_5,
727     EL_EMC_WALL_6,
728     EL_EMC_WALL_7,
729     EL_EMC_WALL_8,
730     EL_CRYSTAL,
731     EL_WALL_PEARL,
732     EL_WALL_CRYSTAL,
733     EL_PFORTE1,
734     EL_PFORTE2,
735     EL_PFORTE3,
736     EL_PFORTE4,
737     EL_PFORTE1X,
738     EL_PFORTE2X,
739     EL_PFORTE3X,
740     EL_PFORTE4X,
741     EL_EM_GATE_1,
742     EL_EM_GATE_2,
743     EL_EM_GATE_3,
744     EL_EM_GATE_4,
745     EL_EM_GATE_1X,
746     EL_EM_GATE_2X,
747     EL_EM_GATE_3X,
748     EL_EM_GATE_4X,
749     EL_SWITCHGATE_OPEN,
750     EL_SWITCHGATE_OPENING,
751     EL_SWITCHGATE_CLOSED,
752     EL_SWITCHGATE_CLOSING,
753     EL_TIMEGATE_OPEN,
754     EL_TIMEGATE_OPENING,
755     EL_TIMEGATE_CLOSED,
756     EL_TIMEGATE_CLOSING,
757     EL_TUBE_CROSS,
758     EL_TUBE_VERTICAL,
759     EL_TUBE_HORIZONTAL,
760     EL_TUBE_VERT_LEFT,
761     EL_TUBE_VERT_RIGHT,
762     EL_TUBE_HORIZ_UP,
763     EL_TUBE_HORIZ_DOWN,
764     EL_TUBE_LEFT_UP,
765     EL_TUBE_LEFT_DOWN,
766     EL_TUBE_RIGHT_UP,
767     EL_TUBE_RIGHT_DOWN
768   };
769   static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid);
770
771   static int ep_massive[] =
772   {
773     EL_BETON,
774     EL_SALZSAEURE,
775     EL_BADEWANNE1,
776     EL_BADEWANNE2,
777     EL_BADEWANNE3,
778     EL_BADEWANNE4,
779     EL_BADEWANNE5,
780     EL_SP_HARD_GRAY,
781     EL_SP_HARD_GREEN,
782     EL_SP_HARD_BLUE,
783     EL_SP_HARD_RED,
784     EL_SP_HARD_YELLOW,
785     EL_SP_HARD_BASE1,
786     EL_SP_HARD_BASE2,
787     EL_SP_HARD_BASE3,
788     EL_SP_HARD_BASE4,
789     EL_SP_HARD_BASE5,
790     EL_SP_HARD_BASE6,
791     EL_INVISIBLE_STEEL,
792     EL_BELT1_SWITCH_LEFT,
793     EL_BELT1_SWITCH_MIDDLE,
794     EL_BELT1_SWITCH_RIGHT,
795     EL_BELT2_SWITCH_LEFT,
796     EL_BELT2_SWITCH_MIDDLE,
797     EL_BELT2_SWITCH_RIGHT,
798     EL_BELT3_SWITCH_LEFT,
799     EL_BELT3_SWITCH_MIDDLE,
800     EL_BELT3_SWITCH_RIGHT,
801     EL_BELT4_SWITCH_LEFT,
802     EL_BELT4_SWITCH_MIDDLE,
803     EL_BELT4_SWITCH_RIGHT,
804     EL_LIGHT_SWITCH_OFF,
805     EL_LIGHT_SWITCH_ON,
806     EL_SIGN_EXCLAMATION,
807     EL_SIGN_RADIOACTIVITY,
808     EL_SIGN_STOP,
809     EL_SIGN_WHEELCHAIR,
810     EL_SIGN_PARKING,
811     EL_SIGN_ONEWAY,
812     EL_SIGN_HEART,
813     EL_SIGN_TRIANGLE,
814     EL_SIGN_ROUND,
815     EL_SIGN_EXIT,
816     EL_SIGN_YINYANG,
817     EL_SIGN_OTHER,
818     EL_STEEL_SLANTED,
819     EL_EMC_STEEL_WALL_1,
820     EL_EMC_STEEL_WALL_2,
821     EL_EMC_STEEL_WALL_3,
822     EL_EMC_STEEL_WALL_4,
823     EL_CRYSTAL,
824     EL_PFORTE1,
825     EL_PFORTE2,
826     EL_PFORTE3,
827     EL_PFORTE4,
828     EL_PFORTE1X,
829     EL_PFORTE2X,
830     EL_PFORTE3X,
831     EL_PFORTE4X,
832     EL_EM_GATE_1,
833     EL_EM_GATE_2,
834     EL_EM_GATE_3,
835     EL_EM_GATE_4,
836     EL_EM_GATE_1X,
837     EL_EM_GATE_2X,
838     EL_EM_GATE_3X,
839     EL_EM_GATE_4X,
840     EL_SWITCHGATE_OPEN,
841     EL_SWITCHGATE_OPENING,
842     EL_SWITCHGATE_CLOSED,
843     EL_SWITCHGATE_CLOSING,
844     EL_TIMEGATE_OPEN,
845     EL_TIMEGATE_OPENING,
846     EL_TIMEGATE_CLOSED,
847     EL_TIMEGATE_CLOSING,
848     EL_TUBE_CROSS,
849     EL_TUBE_VERTICAL,
850     EL_TUBE_HORIZONTAL,
851     EL_TUBE_VERT_LEFT,
852     EL_TUBE_VERT_RIGHT,
853     EL_TUBE_HORIZ_UP,
854     EL_TUBE_HORIZ_DOWN,
855     EL_TUBE_LEFT_UP,
856     EL_TUBE_LEFT_DOWN,
857     EL_TUBE_RIGHT_UP,
858     EL_TUBE_RIGHT_DOWN
859   };
860   static int ep_massive_num = SIZEOF_ARRAY_INT(ep_massive);
861
862   static int ep_slippery[] =
863   {
864     EL_FELSBODEN,
865     EL_BD_WALL,
866     EL_FELSBROCKEN,
867     EL_BD_ROCK,
868     EL_EDELSTEIN,
869     EL_EDELSTEIN_BD,
870     EL_EDELSTEIN_GELB,
871     EL_EDELSTEIN_ROT,
872     EL_EDELSTEIN_LILA,
873     EL_DIAMANT,
874     EL_BOMBE,
875     EL_KOKOSNUSS,
876     EL_ABLENK_EIN,
877     EL_ABLENK_AUS,
878     EL_ZEIT_VOLL,
879     EL_ZEIT_LEER,
880     EL_BIRNE_EIN,
881     EL_BIRNE_AUS,
882     EL_BADEWANNE1,
883     EL_BADEWANNE2,
884     EL_SONDE,
885     EL_SP_ZONK,
886     EL_SP_INFOTRON,
887     EL_SP_CHIP_SINGLE,
888     EL_SP_CHIP_LEFT,
889     EL_SP_CHIP_RIGHT,
890     EL_SP_CHIP_UPPER,
891     EL_SP_CHIP_LOWER,
892     EL_SPEED_PILL,
893     EL_STEEL_SLANTED,
894     EL_PEARL,
895     EL_CRYSTAL
896   };
897   static int ep_slippery_num = SIZEOF_ARRAY_INT(ep_slippery);
898
899   static int ep_enemy[] =
900   {
901     EL_KAEFER,
902     EL_FLIEGER,
903     EL_BUTTERFLY,
904     EL_FIREFLY,
905     EL_MAMPFER,
906     EL_MAMPFER2,
907     EL_ROBOT,
908     EL_PACMAN,
909     EL_SP_SNIKSNAK,
910     EL_SP_ELECTRON
911   };
912   static int ep_enemy_num = SIZEOF_ARRAY_INT(ep_enemy);
913
914   static int ep_mauer[] =
915   {
916     EL_BETON,
917     EL_PFORTE1,
918     EL_PFORTE2,
919     EL_PFORTE3,
920     EL_PFORTE4,
921     EL_PFORTE1X,
922     EL_PFORTE2X,
923     EL_PFORTE3X,
924     EL_PFORTE4X,
925     EL_EM_GATE_1,
926     EL_EM_GATE_2,
927     EL_EM_GATE_3,
928     EL_EM_GATE_4,
929     EL_EM_GATE_1X,
930     EL_EM_GATE_2X,
931     EL_EM_GATE_3X,
932     EL_EM_GATE_4X,
933     EL_AUSGANG_ZU,
934     EL_AUSGANG_ACT,
935     EL_AUSGANG_AUF,
936     EL_MAUERWERK,
937     EL_FELSBODEN,
938     EL_MAUER_LEBT,
939     EL_MAUER_X,
940     EL_MAUER_Y,
941     EL_MAUER_XY,
942     EL_MAUERND,
943     EL_BD_WALL,
944     EL_SP_CHIP_SINGLE,
945     EL_SP_CHIP_LEFT,
946     EL_SP_CHIP_RIGHT,
947     EL_SP_CHIP_UPPER,
948     EL_SP_CHIP_LOWER,
949     EL_SP_HARD_GRAY,
950     EL_SP_HARD_GREEN,
951     EL_SP_HARD_BLUE,
952     EL_SP_HARD_RED,
953     EL_SP_HARD_YELLOW,
954     EL_SP_HARD_BASE1,
955     EL_SP_HARD_BASE2,
956     EL_SP_HARD_BASE3,
957     EL_SP_HARD_BASE4,
958     EL_SP_HARD_BASE5,
959     EL_SP_HARD_BASE6,
960     EL_SP_TERMINAL,
961     EL_SP_TERMINAL_ACTIVE,
962     EL_SP_EXIT,
963     EL_INVISIBLE_STEEL,
964     EL_STEEL_SLANTED,
965     EL_EMC_STEEL_WALL_1,
966     EL_EMC_STEEL_WALL_2,
967     EL_EMC_STEEL_WALL_3,
968     EL_EMC_STEEL_WALL_4,
969     EL_EMC_WALL_1,
970     EL_EMC_WALL_2,
971     EL_EMC_WALL_3,
972     EL_EMC_WALL_4,
973     EL_EMC_WALL_5,
974     EL_EMC_WALL_6,
975     EL_EMC_WALL_7,
976     EL_EMC_WALL_8
977   };
978   static int ep_mauer_num = SIZEOF_ARRAY_INT(ep_mauer);
979
980   static int ep_can_fall[] =
981   {
982     EL_FELSBROCKEN,
983     EL_BD_ROCK,
984     EL_EDELSTEIN,
985     EL_EDELSTEIN_BD,
986     EL_EDELSTEIN_GELB,
987     EL_EDELSTEIN_ROT,
988     EL_EDELSTEIN_LILA,
989     EL_DIAMANT,
990     EL_BOMBE,
991     EL_KOKOSNUSS,
992     EL_TROPFEN,
993     EL_MORAST_VOLL,
994     EL_MAGIC_WALL_FULL,
995     EL_MAGIC_WALL_BD_FULL,
996     EL_ZEIT_VOLL,
997     EL_ZEIT_LEER,
998     EL_SP_ZONK,
999     EL_SP_INFOTRON,
1000     EL_SP_DISK_ORANGE,
1001     EL_PEARL,
1002     EL_CRYSTAL,
1003     EL_SPRING,
1004     EL_DX_SUPABOMB
1005   };
1006   static int ep_can_fall_num = SIZEOF_ARRAY_INT(ep_can_fall);
1007
1008   static int ep_can_smash[] =
1009   {
1010     EL_FELSBROCKEN,
1011     EL_BD_ROCK,
1012     EL_EDELSTEIN,
1013     EL_EDELSTEIN_BD,
1014     EL_EDELSTEIN_GELB,
1015     EL_EDELSTEIN_ROT,
1016     EL_EDELSTEIN_LILA,
1017     EL_DIAMANT,
1018     EL_SCHLUESSEL1,
1019     EL_SCHLUESSEL2,
1020     EL_SCHLUESSEL3,
1021     EL_SCHLUESSEL4,
1022     EL_EM_KEY_1,
1023     EL_EM_KEY_2,
1024     EL_EM_KEY_3,
1025     EL_EM_KEY_4,
1026     EL_BOMBE,
1027     EL_KOKOSNUSS,
1028     EL_TROPFEN,
1029     EL_ZEIT_VOLL,
1030     EL_ZEIT_LEER,
1031     EL_SP_ZONK,
1032     EL_SP_INFOTRON,
1033     EL_SP_DISK_ORANGE,
1034     EL_PEARL,
1035     EL_CRYSTAL,
1036     EL_SPRING,
1037     EL_DX_SUPABOMB
1038   };
1039   static int ep_can_smash_num = SIZEOF_ARRAY_INT(ep_can_smash);
1040
1041   static int ep_can_change[] =
1042   {
1043     EL_FELSBROCKEN,
1044     EL_BD_ROCK,
1045     EL_EDELSTEIN,
1046     EL_EDELSTEIN_BD,
1047     EL_EDELSTEIN_GELB,
1048     EL_EDELSTEIN_ROT,
1049     EL_EDELSTEIN_LILA,
1050     EL_DIAMANT
1051   };
1052   static int ep_can_change_num = SIZEOF_ARRAY_INT(ep_can_change);
1053
1054   static int ep_can_move[] =
1055   {
1056     EL_KAEFER,
1057     EL_FLIEGER,
1058     EL_BUTTERFLY,
1059     EL_FIREFLY,
1060     EL_MAMPFER,
1061     EL_MAMPFER2,
1062     EL_ROBOT,
1063     EL_PACMAN,
1064     EL_MOLE,
1065     EL_PINGUIN,
1066     EL_SCHWEIN,
1067     EL_DRACHE,
1068     EL_SONDE,
1069     EL_SP_SNIKSNAK,
1070     EL_SP_ELECTRON,
1071     EL_BALLOON,
1072     EL_SPRING_MOVING
1073   };
1074   static int ep_can_move_num = SIZEOF_ARRAY_INT(ep_can_move);
1075
1076   static int ep_could_move[] =
1077   {
1078     EL_KAEFER_RIGHT,
1079     EL_KAEFER_UP,
1080     EL_KAEFER_LEFT,
1081     EL_KAEFER_DOWN,
1082     EL_FLIEGER_RIGHT,
1083     EL_FLIEGER_UP,
1084     EL_FLIEGER_LEFT,
1085     EL_FLIEGER_DOWN,
1086     EL_BUTTERFLY_RIGHT,
1087     EL_BUTTERFLY_UP,
1088     EL_BUTTERFLY_LEFT,
1089     EL_BUTTERFLY_DOWN,
1090     EL_FIREFLY_RIGHT,
1091     EL_FIREFLY_UP,
1092     EL_FIREFLY_LEFT,
1093     EL_FIREFLY_DOWN,
1094     EL_PACMAN_RIGHT,
1095     EL_PACMAN_UP,
1096     EL_PACMAN_LEFT,
1097     EL_PACMAN_DOWN
1098   };
1099   static int ep_could_move_num = SIZEOF_ARRAY_INT(ep_could_move);
1100
1101   static int ep_dont_touch[] =
1102   {
1103     EL_KAEFER,
1104     EL_FLIEGER,
1105     EL_BUTTERFLY,
1106     EL_FIREFLY
1107   };
1108   static int ep_dont_touch_num = SIZEOF_ARRAY_INT(ep_dont_touch);
1109
1110   static int ep_dont_go_to[] =
1111   {
1112     EL_KAEFER,
1113     EL_FLIEGER,
1114     EL_BUTTERFLY,
1115     EL_FIREFLY,
1116     EL_MAMPFER,
1117     EL_MAMPFER2,
1118     EL_ROBOT,
1119     EL_PACMAN,
1120     EL_TROPFEN,
1121     EL_SALZSAEURE,
1122     EL_SP_SNIKSNAK,
1123     EL_SP_ELECTRON,
1124     EL_SP_BUG_ACTIVE,
1125     EL_TRAP_ACTIVE,
1126     EL_LANDMINE
1127   };
1128   static int ep_dont_go_to_num = SIZEOF_ARRAY_INT(ep_dont_go_to);
1129
1130   static int ep_mampf2[] =
1131   {
1132     EL_ERDREICH,
1133     EL_KAEFER,
1134     EL_FLIEGER,
1135     EL_BUTTERFLY,
1136     EL_FIREFLY,
1137     EL_MAMPFER,
1138     EL_ROBOT,
1139     EL_PACMAN,
1140     EL_TROPFEN,
1141     EL_AMOEBE_TOT,
1142     EL_AMOEBE_NASS,
1143     EL_AMOEBE_NORM,
1144     EL_AMOEBE_VOLL,
1145     EL_AMOEBE_BD,
1146     EL_EDELSTEIN,
1147     EL_EDELSTEIN_BD,
1148     EL_EDELSTEIN_GELB,
1149     EL_EDELSTEIN_ROT,
1150     EL_EDELSTEIN_LILA,
1151     EL_DIAMANT,
1152     EL_PEARL,
1153     EL_CRYSTAL
1154   };
1155   static int ep_mampf2_num = SIZEOF_ARRAY_INT(ep_mampf2);
1156
1157   static int ep_bd_element[] =
1158   {
1159     EL_LEERRAUM,
1160     EL_ERDREICH,
1161     EL_FELSBODEN,
1162     EL_BD_WALL,
1163     EL_FELSBROCKEN,
1164     EL_BD_ROCK,
1165     EL_EDELSTEIN_BD,
1166     EL_MAGIC_WALL_BD_OFF,
1167     EL_AUSGANG_ZU,
1168     EL_AUSGANG_AUF,
1169     EL_BETON,
1170     EL_SPIELFIGUR,
1171     EL_FIREFLY,
1172     EL_FIREFLY_1,
1173     EL_FIREFLY_2,
1174     EL_FIREFLY_3,
1175     EL_FIREFLY_4,
1176     EL_BUTTERFLY,
1177     EL_BUTTERFLY_1,
1178     EL_BUTTERFLY_2,
1179     EL_BUTTERFLY_3,
1180     EL_BUTTERFLY_4,
1181     EL_AMOEBE_BD,
1182     EL_CHAR_FRAGE
1183   };
1184   static int ep_bd_element_num = SIZEOF_ARRAY_INT(ep_bd_element);
1185
1186   static int ep_sb_element[] =
1187   {
1188     EL_LEERRAUM,
1189     EL_BETON,
1190     EL_SOKOBAN_OBJEKT,
1191     EL_SOKOBAN_FELD_LEER,
1192     EL_SOKOBAN_FELD_VOLL,
1193     EL_SPIELFIGUR,
1194     EL_INVISIBLE_STEEL
1195   };
1196   static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element);
1197
1198   static int ep_gem[] =
1199   {
1200     EL_EDELSTEIN,
1201     EL_EDELSTEIN_BD,
1202     EL_EDELSTEIN_GELB,
1203     EL_EDELSTEIN_ROT,
1204     EL_EDELSTEIN_LILA,
1205     EL_DIAMANT
1206   };
1207   static int ep_gem_num = SIZEOF_ARRAY_INT(ep_gem);
1208
1209   static int ep_inactive[] =
1210   {
1211     EL_LEERRAUM,
1212     EL_ERDREICH,
1213     EL_MAUERWERK,
1214     EL_BD_WALL,
1215     EL_FELSBODEN,
1216     EL_SCHLUESSEL,
1217     EL_BETON,
1218     EL_AMOEBE_TOT,
1219     EL_MORAST_LEER,
1220     EL_BADEWANNE,
1221     EL_ABLENK_AUS,
1222     EL_SCHLUESSEL1,
1223     EL_SCHLUESSEL2,
1224     EL_SCHLUESSEL3,
1225     EL_SCHLUESSEL4,
1226     EL_EM_KEY_1,
1227     EL_EM_KEY_2,
1228     EL_EM_KEY_3,
1229     EL_EM_KEY_4,
1230     EL_PFORTE1,
1231     EL_PFORTE2,
1232     EL_PFORTE3,
1233     EL_PFORTE4,
1234     EL_PFORTE1X,
1235     EL_PFORTE2X,
1236     EL_PFORTE3X,
1237     EL_PFORTE4X,
1238     EL_EM_GATE_1,
1239     EL_EM_GATE_2,
1240     EL_EM_GATE_3,
1241     EL_EM_GATE_4,
1242     EL_EM_GATE_1X,
1243     EL_EM_GATE_2X,
1244     EL_EM_GATE_3X,
1245     EL_EM_GATE_4X,
1246     EL_DYNAMITE_INACTIVE,
1247     EL_UNSICHTBAR,
1248     EL_BIRNE_AUS,
1249     EL_BIRNE_EIN,
1250     EL_ERZ_EDEL,
1251     EL_ERZ_DIAM,
1252     EL_ERZ_EDEL_BD,
1253     EL_ERZ_EDEL_GELB,
1254     EL_DYNABOMB_NR,
1255     EL_DYNABOMB_SZ,
1256     EL_DYNABOMB_XL,
1257     EL_SOKOBAN_OBJEKT,
1258     EL_SOKOBAN_FELD_LEER,
1259     EL_SOKOBAN_FELD_VOLL,
1260     EL_ERZ_EDEL_ROT,
1261     EL_ERZ_EDEL_LILA,
1262     EL_BADEWANNE1,
1263     EL_BADEWANNE2,
1264     EL_BADEWANNE3,
1265     EL_BADEWANNE4,
1266     EL_BADEWANNE5,
1267     EL_MAGIC_WALL_OFF,
1268     EL_MAGIC_WALL_DEAD,
1269     EL_MAGIC_WALL_BD_OFF,
1270     EL_MAGIC_WALL_BD_DEAD,
1271     EL_AMOEBA2DIAM,
1272     EL_BLOCKED,
1273     EL_SP_EMPTY,
1274     EL_SP_BASE,
1275     EL_SP_PORT1_RIGHT,
1276     EL_SP_PORT1_DOWN,
1277     EL_SP_PORT1_LEFT,
1278     EL_SP_PORT1_UP,
1279     EL_SP_PORT2_RIGHT,
1280     EL_SP_PORT2_DOWN,
1281     EL_SP_PORT2_LEFT,
1282     EL_SP_PORT2_UP,
1283     EL_SP_PORT_X,
1284     EL_SP_PORT_Y,
1285     EL_SP_PORT_XY,
1286     EL_SP_DISK_RED,
1287     EL_SP_DISK_YELLOW,
1288     EL_SP_CHIP_SINGLE,
1289     EL_SP_CHIP_LEFT,
1290     EL_SP_CHIP_RIGHT,
1291     EL_SP_CHIP_UPPER,
1292     EL_SP_CHIP_LOWER,
1293     EL_SP_HARD_GRAY,
1294     EL_SP_HARD_GREEN,
1295     EL_SP_HARD_BLUE,
1296     EL_SP_HARD_RED,
1297     EL_SP_HARD_YELLOW,
1298     EL_SP_HARD_BASE1,
1299     EL_SP_HARD_BASE2,
1300     EL_SP_HARD_BASE3,
1301     EL_SP_HARD_BASE4,
1302     EL_SP_HARD_BASE5,
1303     EL_SP_HARD_BASE6,
1304     EL_SP_EXIT,
1305     EL_INVISIBLE_STEEL,
1306     EL_BELT1_SWITCH_LEFT,
1307     EL_BELT1_SWITCH_MIDDLE,
1308     EL_BELT1_SWITCH_RIGHT,
1309     EL_BELT2_SWITCH_LEFT,
1310     EL_BELT2_SWITCH_MIDDLE,
1311     EL_BELT2_SWITCH_RIGHT,
1312     EL_BELT3_SWITCH_LEFT,
1313     EL_BELT3_SWITCH_MIDDLE,
1314     EL_BELT3_SWITCH_RIGHT,
1315     EL_BELT4_SWITCH_LEFT,
1316     EL_BELT4_SWITCH_MIDDLE,
1317     EL_BELT4_SWITCH_RIGHT,
1318     EL_SIGN_EXCLAMATION,
1319     EL_SIGN_RADIOACTIVITY,
1320     EL_SIGN_STOP,
1321     EL_SIGN_WHEELCHAIR,
1322     EL_SIGN_PARKING,
1323     EL_SIGN_ONEWAY,
1324     EL_SIGN_HEART,
1325     EL_SIGN_TRIANGLE,
1326     EL_SIGN_ROUND,
1327     EL_SIGN_EXIT,
1328     EL_SIGN_YINYANG,
1329     EL_SIGN_OTHER,
1330     EL_STEEL_SLANTED,
1331     EL_EMC_STEEL_WALL_1,
1332     EL_EMC_STEEL_WALL_2,
1333     EL_EMC_STEEL_WALL_3,
1334     EL_EMC_STEEL_WALL_4,
1335     EL_EMC_WALL_1,
1336     EL_EMC_WALL_2,
1337     EL_EMC_WALL_3,
1338     EL_EMC_WALL_4,
1339     EL_EMC_WALL_5,
1340     EL_EMC_WALL_6,
1341     EL_EMC_WALL_7,
1342     EL_EMC_WALL_8
1343   };
1344   static int ep_inactive_num = SIZEOF_ARRAY_INT(ep_inactive);
1345
1346   static int ep_explosive[] =
1347   {
1348     EL_BOMBE,
1349     EL_DYNAMITE_ACTIVE,
1350     EL_DYNAMITE_INACTIVE,
1351     EL_DYNABOMB_ACTIVE_1,
1352     EL_DYNABOMB_ACTIVE_2,
1353     EL_DYNABOMB_ACTIVE_3,
1354     EL_DYNABOMB_ACTIVE_4,
1355     EL_DYNABOMB_NR,
1356     EL_DYNABOMB_SZ,
1357     EL_DYNABOMB_XL,
1358     EL_KAEFER,
1359     EL_MOLE,
1360     EL_PINGUIN,
1361     EL_SCHWEIN,
1362     EL_DRACHE,
1363     EL_SONDE,
1364     EL_SP_DISK_RED,
1365     EL_SP_DISK_ORANGE,
1366     EL_SP_DISK_YELLOW,
1367     EL_SP_SNIKSNAK,
1368     EL_SP_ELECTRON,
1369     EL_DX_SUPABOMB
1370   };
1371   static int ep_explosive_num = SIZEOF_ARRAY_INT(ep_explosive);
1372
1373   static int ep_mampf3[] =
1374   {
1375     EL_EDELSTEIN,
1376     EL_EDELSTEIN_BD,
1377     EL_EDELSTEIN_GELB,
1378     EL_EDELSTEIN_ROT,
1379     EL_EDELSTEIN_LILA,
1380     EL_DIAMANT,
1381     EL_PEARL,
1382     EL_CRYSTAL
1383   };
1384   static int ep_mampf3_num = SIZEOF_ARRAY_INT(ep_mampf3);
1385
1386   static int ep_pushable[] =
1387   {
1388     EL_FELSBROCKEN,
1389     EL_BD_ROCK,
1390     EL_BOMBE,
1391     EL_KOKOSNUSS,
1392     EL_ZEIT_LEER,
1393     EL_SOKOBAN_FELD_VOLL,
1394     EL_SOKOBAN_OBJEKT,
1395     EL_SONDE,
1396     EL_SP_ZONK,
1397     EL_SP_DISK_ORANGE,
1398     EL_SP_DISK_YELLOW,
1399     EL_BALLOON,
1400     EL_SPRING,
1401     EL_DX_SUPABOMB
1402   };
1403   static int ep_pushable_num = SIZEOF_ARRAY_INT(ep_pushable);
1404
1405   static int ep_player[] =
1406   {
1407     EL_SPIELFIGUR,
1408     EL_SPIELER1,
1409     EL_SPIELER2,
1410     EL_SPIELER3,
1411     EL_SPIELER4
1412   };
1413   static int ep_player_num = SIZEOF_ARRAY_INT(ep_player);
1414
1415   static int ep_has_content[] =
1416   {
1417     EL_MAMPFER,
1418     EL_AMOEBE_NASS,
1419     EL_AMOEBE_NORM,
1420     EL_AMOEBE_VOLL,
1421     EL_AMOEBE_BD
1422   };
1423   static int ep_has_content_num = SIZEOF_ARRAY_INT(ep_has_content);
1424
1425   static int ep_eatable[] =
1426   {
1427     EL_ERDREICH,
1428     EL_SP_BASE,
1429     EL_SP_BUG,
1430     EL_TRAP_INACTIVE,
1431     EL_SAND_INVISIBLE
1432   };
1433   static int ep_eatable_num = SIZEOF_ARRAY_INT(ep_eatable);
1434
1435   static int ep_sp_element[] =
1436   {
1437     EL_SP_EMPTY,
1438     EL_SP_ZONK,
1439     EL_SP_BASE,
1440     EL_SP_MURPHY,
1441     EL_SP_INFOTRON,
1442     EL_SP_CHIP_SINGLE,
1443     EL_SP_HARD_GRAY,
1444     EL_SP_EXIT,
1445     EL_SP_DISK_ORANGE,
1446     EL_SP_PORT1_RIGHT,
1447     EL_SP_PORT1_DOWN,
1448     EL_SP_PORT1_LEFT,
1449     EL_SP_PORT1_UP,
1450     EL_SP_PORT2_RIGHT,
1451     EL_SP_PORT2_DOWN,
1452     EL_SP_PORT2_LEFT,
1453     EL_SP_PORT2_UP,
1454     EL_SP_SNIKSNAK,
1455     EL_SP_DISK_YELLOW,
1456     EL_SP_TERMINAL,
1457     EL_SP_DISK_RED,
1458     EL_SP_PORT_Y,
1459     EL_SP_PORT_X,
1460     EL_SP_PORT_XY,
1461     EL_SP_ELECTRON,
1462     EL_SP_BUG,
1463     EL_SP_CHIP_LEFT,
1464     EL_SP_CHIP_RIGHT,
1465     EL_SP_HARD_BASE1,
1466     EL_SP_HARD_GREEN,
1467     EL_SP_HARD_BLUE,
1468     EL_SP_HARD_RED,
1469     EL_SP_HARD_YELLOW,
1470     EL_SP_HARD_BASE2,
1471     EL_SP_HARD_BASE3,
1472     EL_SP_HARD_BASE4,
1473     EL_SP_HARD_BASE5,
1474     EL_SP_HARD_BASE6,
1475     EL_SP_CHIP_UPPER,
1476     EL_SP_CHIP_LOWER,
1477     /* additional elements that appeared in newer Supaplex levels */
1478     EL_UNSICHTBAR,
1479     /* more than one murphy in a level results in an inactive clone */
1480     EL_SP_MURPHY_CLONE
1481   };
1482   static int ep_sp_element_num = SIZEOF_ARRAY_INT(ep_sp_element);
1483
1484   static int ep_quick_gate[] =
1485   {
1486     EL_EM_GATE_1,
1487     EL_EM_GATE_2,
1488     EL_EM_GATE_3,
1489     EL_EM_GATE_4,
1490     EL_EM_GATE_1X,
1491     EL_EM_GATE_2X,
1492     EL_EM_GATE_3X,
1493     EL_EM_GATE_4X,
1494     EL_SP_PORT1_LEFT,
1495     EL_SP_PORT2_LEFT,
1496     EL_SP_PORT1_RIGHT,
1497     EL_SP_PORT2_RIGHT,
1498     EL_SP_PORT1_UP,
1499     EL_SP_PORT2_UP,
1500     EL_SP_PORT1_DOWN,
1501     EL_SP_PORT2_DOWN,
1502     EL_SP_PORT_X,
1503     EL_SP_PORT_Y,
1504     EL_SP_PORT_XY,
1505     EL_SWITCHGATE_OPEN,
1506     EL_TIMEGATE_OPEN
1507   };
1508   static int ep_quick_gate_num = SIZEOF_ARRAY_INT(ep_quick_gate);
1509
1510   static int ep_over_player[] =
1511   {
1512     EL_SP_PORT1_LEFT,
1513     EL_SP_PORT2_LEFT,
1514     EL_SP_PORT1_RIGHT,
1515     EL_SP_PORT2_RIGHT,
1516     EL_SP_PORT1_UP,
1517     EL_SP_PORT2_UP,
1518     EL_SP_PORT1_DOWN,
1519     EL_SP_PORT2_DOWN,
1520     EL_SP_PORT_X,
1521     EL_SP_PORT_Y,
1522     EL_SP_PORT_XY,
1523     EL_TUBE_CROSS,
1524     EL_TUBE_VERTICAL,
1525     EL_TUBE_HORIZONTAL,
1526     EL_TUBE_VERT_LEFT,
1527     EL_TUBE_VERT_RIGHT,
1528     EL_TUBE_HORIZ_UP,
1529     EL_TUBE_HORIZ_DOWN,
1530     EL_TUBE_LEFT_UP,
1531     EL_TUBE_LEFT_DOWN,
1532     EL_TUBE_RIGHT_UP,
1533     EL_TUBE_RIGHT_DOWN
1534   };
1535   static int ep_over_player_num = SIZEOF_ARRAY_INT(ep_over_player);
1536
1537   static int ep_active_bomb[] =
1538   {
1539     EL_DYNAMITE_ACTIVE,
1540     EL_DYNABOMB_ACTIVE_1,
1541     EL_DYNABOMB_ACTIVE_2,
1542     EL_DYNABOMB_ACTIVE_3,
1543     EL_DYNABOMB_ACTIVE_4
1544   };
1545   static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb);
1546
1547   static int ep_belt[] =
1548   {
1549     EL_BELT1_LEFT,
1550     EL_BELT1_MIDDLE,
1551     EL_BELT1_RIGHT,
1552     EL_BELT2_LEFT,
1553     EL_BELT2_MIDDLE,
1554     EL_BELT2_RIGHT,
1555     EL_BELT3_LEFT,
1556     EL_BELT3_MIDDLE,
1557     EL_BELT3_RIGHT,
1558     EL_BELT4_LEFT,
1559     EL_BELT4_MIDDLE,
1560     EL_BELT4_RIGHT,
1561   };
1562   static int ep_belt_num = SIZEOF_ARRAY_INT(ep_belt);
1563
1564   static int ep_belt_switch[] =
1565   {
1566     EL_BELT1_SWITCH_LEFT,
1567     EL_BELT1_SWITCH_MIDDLE,
1568     EL_BELT1_SWITCH_RIGHT,
1569     EL_BELT2_SWITCH_LEFT,
1570     EL_BELT2_SWITCH_MIDDLE,
1571     EL_BELT2_SWITCH_RIGHT,
1572     EL_BELT3_SWITCH_LEFT,
1573     EL_BELT3_SWITCH_MIDDLE,
1574     EL_BELT3_SWITCH_RIGHT,
1575     EL_BELT4_SWITCH_LEFT,
1576     EL_BELT4_SWITCH_MIDDLE,
1577     EL_BELT4_SWITCH_RIGHT,
1578   };
1579   static int ep_belt_switch_num = SIZEOF_ARRAY_INT(ep_belt_switch);
1580
1581   static int ep_tube[] =
1582   {
1583     EL_TUBE_CROSS,
1584     EL_TUBE_VERTICAL,
1585     EL_TUBE_HORIZONTAL,
1586     EL_TUBE_VERT_LEFT,
1587     EL_TUBE_VERT_RIGHT,
1588     EL_TUBE_HORIZ_UP,
1589     EL_TUBE_HORIZ_DOWN,
1590     EL_TUBE_LEFT_UP,
1591     EL_TUBE_LEFT_DOWN,
1592     EL_TUBE_RIGHT_UP,
1593     EL_TUBE_RIGHT_DOWN
1594   };
1595   static int ep_tube_num = SIZEOF_ARRAY_INT(ep_tube);
1596
1597   static long ep1_bit[] =
1598   {
1599     EP_BIT_AMOEBALIVE,
1600     EP_BIT_AMOEBOID,
1601     EP_BIT_SCHLUESSEL,
1602     EP_BIT_PFORTE,
1603     EP_BIT_SOLID,
1604     EP_BIT_MASSIVE,
1605     EP_BIT_SLIPPERY,
1606     EP_BIT_ENEMY,
1607     EP_BIT_MAUER,
1608     EP_BIT_CAN_FALL,
1609     EP_BIT_CAN_SMASH,
1610     EP_BIT_CAN_CHANGE,
1611     EP_BIT_CAN_MOVE,
1612     EP_BIT_COULD_MOVE,
1613     EP_BIT_DONT_TOUCH,
1614     EP_BIT_DONT_GO_TO,
1615     EP_BIT_MAMPF2,
1616     EP_BIT_BD_ELEMENT,
1617     EP_BIT_SB_ELEMENT,
1618     EP_BIT_GEM,
1619     EP_BIT_INACTIVE,
1620     EP_BIT_EXPLOSIVE,
1621     EP_BIT_MAMPF3,
1622     EP_BIT_PUSHABLE,
1623     EP_BIT_PLAYER,
1624     EP_BIT_HAS_CONTENT,
1625     EP_BIT_EATABLE,
1626     EP_BIT_SP_ELEMENT,
1627     EP_BIT_QUICK_GATE,
1628     EP_BIT_OVER_PLAYER,
1629     EP_BIT_ACTIVE_BOMB
1630   };
1631   static long ep2_bit[] =
1632   {
1633     EP_BIT_BELT,
1634     EP_BIT_BELT_SWITCH,
1635     EP_BIT_TUBE
1636   };
1637   static int *ep1_array[] =
1638   {
1639     ep_amoebalive,
1640     ep_amoeboid,
1641     ep_schluessel,
1642     ep_pforte,
1643     ep_solid,
1644     ep_massive,
1645     ep_slippery,
1646     ep_enemy,
1647     ep_mauer,
1648     ep_can_fall,
1649     ep_can_smash,
1650     ep_can_change,
1651     ep_can_move,
1652     ep_could_move,
1653     ep_dont_touch,
1654     ep_dont_go_to,
1655     ep_mampf2,
1656     ep_bd_element,
1657     ep_sb_element,
1658     ep_gem,
1659     ep_inactive,
1660     ep_explosive,
1661     ep_mampf3,
1662     ep_pushable,
1663     ep_player,
1664     ep_has_content,
1665     ep_eatable,
1666     ep_sp_element,
1667     ep_quick_gate,
1668     ep_over_player,
1669     ep_active_bomb
1670   };
1671   static int *ep2_array[] =
1672   {
1673     ep_belt,
1674     ep_belt_switch,
1675     ep_tube
1676   };
1677   static int *ep1_num[] =
1678   {
1679     &ep_amoebalive_num,
1680     &ep_amoeboid_num,
1681     &ep_schluessel_num,
1682     &ep_pforte_num,
1683     &ep_solid_num,
1684     &ep_massive_num,
1685     &ep_slippery_num,
1686     &ep_enemy_num,
1687     &ep_mauer_num,
1688     &ep_can_fall_num,
1689     &ep_can_smash_num,
1690     &ep_can_change_num,
1691     &ep_can_move_num,
1692     &ep_could_move_num,
1693     &ep_dont_touch_num,
1694     &ep_dont_go_to_num,
1695     &ep_mampf2_num,
1696     &ep_bd_element_num,
1697     &ep_sb_element_num,
1698     &ep_gem_num,
1699     &ep_inactive_num,
1700     &ep_explosive_num,
1701     &ep_mampf3_num,
1702     &ep_pushable_num,
1703     &ep_player_num,
1704     &ep_has_content_num,
1705     &ep_eatable_num,
1706     &ep_sp_element_num,
1707     &ep_quick_gate_num,
1708     &ep_over_player_num,
1709     &ep_active_bomb_num
1710   };
1711   static int *ep2_num[] =
1712   {
1713     &ep_belt_num,
1714     &ep_belt_switch_num,
1715     &ep_tube_num
1716   };
1717   static int num_properties1 = SIZEOF_ARRAY(ep1_num, int *);
1718   static int num_properties2 = SIZEOF_ARRAY(ep2_num, int *);
1719
1720   for(i=0; i<MAX_ELEMENTS; i++)
1721   {
1722     Elementeigenschaften1[i] = 0;
1723     Elementeigenschaften2[i] = 0;
1724   }
1725
1726   for(i=0; i<num_properties1; i++)
1727     for(j=0; j<*(ep1_num[i]); j++)
1728       Elementeigenschaften1[(ep1_array[i])[j]] |= ep1_bit[i];
1729   for(i=0; i<num_properties2; i++)
1730     for(j=0; j<*(ep2_num[i]); j++)
1731       Elementeigenschaften2[(ep2_array[i])[j]] |= ep2_bit[i];
1732
1733   for(i=EL_CHAR_START; i<=EL_CHAR_END; i++)
1734     Elementeigenschaften1[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE);
1735 }
1736
1737 void Execute_Debug_Command(char *command)
1738 {
1739   if (strcmp(command, "create graphicsinfo.conf") == 0)
1740   {
1741     printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n");
1742     printf("\n");
1743     printf("%s\n", getFormattedSetupEntry("name", "Classic Graphics"));
1744     printf("\n");
1745     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
1746   }
1747   else if (strcmp(command, "create soundsinfo.conf") == 0)
1748   {
1749     int i;
1750
1751     printf("# You can configure additional/alternative sound effects here\n");
1752     printf("# (The sounds below are default and therefore commented out.)\n");
1753     printf("\n");
1754     printf("%s\n", getFormattedSetupEntry("name", "Classic Sounds"));
1755     printf("\n");
1756     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
1757     printf("\n");
1758
1759     for (i=0; i<NUM_SOUND_EFFECTS; i++)
1760       printf("# %s\n",
1761              getFormattedSetupEntry(sound_effects[i].text,
1762                                     sound_effects[i].default_filename));
1763   }
1764   else if (strcmp(command, "create musicinfo.conf") == 0)
1765   {
1766     printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n");
1767     printf("\n");
1768     printf("%s\n", getFormattedSetupEntry("name", "Classic Music"));
1769     printf("\n");
1770     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
1771   }
1772 }
1773
1774 void CloseAllAndExit(int exit_value)
1775 {
1776   int i;
1777
1778   StopSounds();
1779   FreeAllSounds();
1780   FreeAllMusic();
1781   CloseAudio();         /* called after freeing sounds (needed for SDL) */
1782
1783   FreeTileClipmasks();
1784   for(i=0; i<NUM_BITMAPS; i++)
1785     FreeBitmap(pix[i]);
1786
1787   CloseVideoDisplay();
1788   ClosePlatformDependantStuff();
1789
1790   exit(exit_value);
1791 }