rnd-20030104-1-src
[rocksndiamonds.git] / src / main.c
index 8d927cb1c28759eb725737a7f759adf47c1d33a6..46277b95ad0dccae43801e9992d668be4fe2de28 100644 (file)
@@ -1,68 +1,40 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-*  (c) 1995-98 Artsoft Entertainment                       *
-*              Holger Schemel                              *
-*              Oststrasse 11a                              *
-*              33604 Bielefeld                             *
-*              phone: ++49 +521 290471                     *
-*              email: aeglos@valinor.owl.de                *
+* (c) 1995-2002 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  main.c                                                  *
+* main.c                                                   *
 ***********************************************************/
 
+#include "libgame/libgame.h"
+
 #include "main.h"
 #include "init.h"
 #include "game.h"
 #include "events.h"
-#include "sound.h"
-#include "joystick.h"
-#include "misc.h"
 
-#if defined(PLATFORM_MSDOS)
-#include <fcntl.h>
+GC             tile_clip_gc;
+#if 0
+Bitmap        *pix[NUM_BITMAPS];
 #endif
-
-Display        *display;
-Visual        *visual;
-int            screen;
-DrawWindow     window = None;
-GC             gc, clip_gc[NUM_BITMAPS], tile_clip_gc;
-Bitmap         pix[NUM_BITMAPS];
-Bitmap         pix_masked[NUM_BITMAPS], tile_masked[NUM_TILES];
-Pixmap         clipmask[NUM_BITMAPS], tile_clipmask[NUM_TILES];
-
-DrawBuffer     drawto, drawto_field, backbuffer, fieldbuffer;
-Colormap       cmap;
-
-char          *sound_device_name = AUDIO_DEVICE;
-
-int            joystick_device = 0;
-char          *joystick_device_name[MAX_PLAYERS] =
-{
-  DEV_JOYSTICK_0,
-  DEV_JOYSTICK_1,
-  DEV_JOYSTICK_2,
-  DEV_JOYSTICK_3
-};
-
-char          *program_name = NULL;
+Bitmap        *bitmap_db_field, *bitmap_db_door;
+Pixmap         tile_clipmask[NUM_TILES];
+DrawBuffer     *fieldbuffer;
+DrawBuffer     *drawto_field;
 
 int            game_status = MAINMENU;
 boolean                level_editor_test_game = FALSE;
 boolean                network_playing = FALSE;
-int            button_status = MB_NOT_PRESSED;
-boolean                motion_status = FALSE;
+
 int            key_joystick_mapping = 0;
-int            global_joystick_status = JOYSTICK_STATUS;
-int            joystick_status = JOYSTICK_STATUS;
-boolean                fullscreen_available = FULLSCREEN_STATUS;
-boolean                fullscreen_enabled = FALSE;
 
 boolean                redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int            redraw_x1 = 0, redraw_y1 = 0;
-int            redraw_mask;
-int            redraw_tiles;
 
 short          Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -73,20 +45,21 @@ short               Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short          GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 boolean                Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short          AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
+short          ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 unsigned long  Elementeigenschaften1[MAX_ELEMENTS];
 unsigned long  Elementeigenschaften2[MAX_ELEMENTS];
 
-int            level_nr;
 int            lev_fieldx,lev_fieldy, scroll_x,scroll_y;
 
 int            FX = SX, FY = SY, ScrollStepSize;
 int            ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
 int            ScreenGfxPos = 0;
-int            BorderElement = EL_BETON;
+int            BorderElement = EL_STEELWALL;
 int            GameFrameDelay = GAME_FRAME_DELAY;
 int            FfwdFrameDelay = FFWD_FRAME_DELAY;
 int            BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
@@ -94,876 +67,635 @@ int               SBX_Left, SBX_Right;
 int            SBY_Upper, SBY_Lower;
 int            ZX,ZY, ExitX,ExitY;
 int            AllPlayersGone;
-int            FrameCounter, TimeFrames, TimePlayed, TimeLeft;
+
+int            TimeFrames, TimePlayed, TimeLeft;
 
 boolean                network_player_action_received = FALSE;
 
-struct LevelDirInfo    *leveldir_first = NULL, *leveldir_current = NULL;
 struct LevelInfo       level;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
-struct SampleInfo      Sound[NUM_SOUNDS];
 struct TapeInfo                tape;
-struct OptionInfo      options;
 struct SetupInfo       setup;
 struct GameInfo                game;
-struct AudioSystemInfo audio;
 struct GlobalInfo      global;
 
-/* data needed for playing sounds */
+/* filenames of sound effects */
 char *sound_name[NUM_SOUNDS] =
 {
-  "alchemy",
-  "amoebe",
-  "antigrav",
-  "autsch",
-  "blurb",
-  "bong",
-  "buing",
-  "chase",
-  "czardasz",
-  "deng",
-  "fuel",
-  "gong",
-  "halloffame",
-  "holz",
-  "hui",
-  "kabumm",
-  "kink",
-  "klapper",
-  "kling",
-  "klopf",
-  "klumpf",
-  "knack",
-  "knurk",
-  "krach",
-  "lachen",
-  "laser",
-  "miep",
-  "network",
-  "njam",
-  "oeffnen",
-  "pling",
-  "pong",
-  "pusch",
-  "quiek",
-  "quirk",
-  "rhythmloop",
-  "roaaar",
-  "roehr",
-  "rumms",
-  "schlopp",
-  "schlurf",
-  "schrff",
-  "schwirr",
-  "sirr",
-  "slurp",
-  "sproing",
-  "twilight",
-  "tyger",
-  "voyager",
-  "warnton",
-  "whoosh",
-  "zisch",
-  "base",
-  "infotron",
-  "zonkdown",
-  "zonkpush",
-  "bug",
-  "boom",
-  "booom",
-  "exit",
-  "empty",
-  "gate"
+  "amoebe.wav",
+  "antigrav.wav",
+  "autsch.wav",
+  "blurb.wav",
+  "bong.wav",
+  "buing.wav",
+  "deng.wav",
+  "fuel.wav",
+  "gong.wav",
+  "halloffame.wav",
+  "holz.wav",
+  "hui.wav",
+  "kabumm.wav",
+  "kink.wav",
+  "klapper.wav",
+  "kling.wav",
+  "klopf.wav",
+  "klumpf.wav",
+  "knack.wav",
+  "knurk.wav",
+  "krach.wav",
+  "lachen.wav",
+  "laser.wav",
+  "miep.wav",
+  "njam.wav",
+  "oeffnen.wav",
+  "pling.wav",
+  "pong.wav",
+  "pusch.wav",
+  "quiek.wav",
+  "quirk.wav",
+  "rhythmloop.wav",
+  "roaaar.wav",
+  "roehr.wav",
+  "rumms.wav",
+  "schlopp.wav",
+  "schlurf.wav",
+  "schrff.wav",
+  "schwirr.wav",
+  "sirr.wav",
+  "slurp.wav",
+  "sproing.wav",
+  "warnton.wav",
+  "whoosh.wav",
+  "zisch.wav",
+  "base.wav",
+  "infotron.wav",
+  "zonkdown.wav",
+  "zonkpush.wav",
+  "bug.wav",
+  "boom.wav",
+  "booom.wav",
+  "exit.wav",
+  "empty.wav",
+  "gate.wav"
 };
 
-/* background music */
-int background_loop[] =
+/* this is used to reduce memory usage of the different animation types */
+int graphics_action_mapping[] =
 {
-  SND_ALCHEMY,
-  SND_CHASE,
-  SND_NETWORK,
-  SND_CZARDASZ,
-  SND_TYGER,
-  SND_VOYAGER,
-  SND_TWILIGHT
+  0,           /* GFX_ACTION_DEFAULT           (0)  */
+  0,           /* GFX_ACTION_WAITING           (1)  */
+
+  1,           /* GFX_ACTION_FALLING           (2)  */
+  2,           /* GFX_ACTION_MOVING            (3)  */
+  3,           /* GFX_ACTION_DIGGING           (4)  */
+  4,           /* GFX_ACTION_SNAPPING          (5)  */
+  5,           /* GFX_ACTION_COLLECTING        (6)  */
+  6,           /* GFX_ACTION_PUSHING           (7)  */
+
+  7,           /* GFX_ACTION_PASSING           (8)  */
+  7,           /* GFX_ACTION_IMPACT            (9)  */
+  7,           /* GFX_ACTION_CRACKING          (10) */
+  7,           /* GFX_ACTION_BREAKING          (11) */
+  7,           /* GFX_ACTION_ACTIVATING        (12) */
+  7,           /* GFX_ACTION_OPENING           (13) */
+  7,           /* GFX_ACTION_CLOSING           (14) */
+  7,           /* GFX_ACTION_EATING            (15) */
+  7,           /* GFX_ACTION_ATTACKING         (16) */
+  7,           /* GFX_ACTION_GROWING           (17) */
+  7,           /* GFX_ACTION_SHRINKING         (18) */
+  7            /* GFX_ACTION_OTHER             (19) */
 };
-int num_bg_loops = sizeof(background_loop)/sizeof(int);
 
-char *element_info[] =
+struct FileInfo *image_files;
+struct FileInfo *sound_files;
+
+struct ElementInfo element_info[MAX_ELEMENTS] =
 {
-  "empty space",                               /* 0 */
-  "sand",
-  "normal wall",
-  "round wall",
-  "rock",
-  "key",
-  "emerald",
-  "closed exit",
-  "player",
-  "bug",
-  "spaceship",                                 /* 10 */
-  "yam yam",
-  "robot",
-  "steel wall",
-  "diamond",
-  "dead amoeba",
-  "empty quicksand",
-  "quicksand with rock",
-  "amoeba drop",
-  "bomb",
-  "magic wall",                                        /* 20 */
-  "speed ball",
-  "acid pool",
-  "dropping amoeba",
-  "normal amoeba",
-  "nut with emerald",
-  "life wall",
-  "biomaze",
-  "burning dynamite",
-  "unknown",
-  "magic wheel",                               /* 30 */
-  "running wire",
-  "red key",
-  "yellow key",
-  "green key",
-  "blue key",
-  "red door",
-  "yellow door",
-  "green door",
-  "blue door",
-  "gray door (opened by red key)",             /* 40 */
-  "gray door (opened by yellow key)",
-  "gray door (opened by green key)",
-  "gray door (opened by blue key)",
-  "dynamite",
-  "pac man",
-  "invisible normal wall",
-  "light bulb (dark)",
-  "ligh bulb (glowing)",
-  "wall with emerald",
-  "wall with diamond",                         /* 50 */
-  "amoeba with content",
-  "amoeba (BD style)",
-  "time orb (full)",
-  "time orb (empty)",
-  "growing wall",
-  "diamond (BD style)",
-  "yellow emerald",
-  "wall with BD style diamond",
-  "wall with yellow emerald",
-  "dark yam yam",                              /* 60 */
-  "magic wall (BD style)",
-  "invisible steel wall",
-  "-",
-  "increases number of bombs",
-  "increases explosion size",
-  "increases power of explosion",
-  "sokoban object",
-  "sokoban empty field",
-  "sokoban field with object",
-  "butterfly (starts moving right)",           /* 70 */
-  "butterfly (starts moving up)",
-  "butterfly (starts moving left)",
-  "butterfly (starts moving down)",
-  "firefly (starts moving right)",
-  "firefly (starts moving up)",
-  "firefly (starts moving left)",
-  "firefly (starts moving down)",
-  "butterfly",
-  "firefly",
-  "yellow player",                             /* 80 */
-  "red player",
-  "green player",
-  "blue player",
-  "bug (starts moving right)",
-  "bug (starts moving up)",
-  "bug (starts moving left)",
-  "bug (starts moving down)",
-  "spaceship (starts moving right)",
-  "spaceship (starts moving up)",
-  "spaceship (starts moving left)",            /* 90 */
-  "spaceship (starts moving down)",
-  "pac man (starts moving right)",
-  "pac man (starts moving up)",
-  "pac man (starts moving left)",
-  "pac man (starts moving down)",
-  "red emerald",
-  "violet emerald",
-  "wall with red emerald",
-  "wall with violet emerald",
-  "unknown",                                   /* 100 */
-  "unknown",
-  "unknown",
-  "unknown",
-  "unknown",
-  "normal wall (BD style)",
-  "rock (BD style)",
-  "open exit",
-  "unknown",
-  "amoeba",
-  "mole",                                      /* 110 */
-  "penguin",
-  "satellite",
-  "arrow left",
-  "arrow right",
-  "arrow up",
-  "arrow down",
-  "pig",
-  "fire breathing dragon",
-  "unknown",
-  "letter ' '",                                        /* 120 */
-  "letter '!'",
-  "letter '\"'",
-  "letter '#'",
-  "letter '$'",
-  "letter '%'",
-  "letter '&'",
-  "letter '''",
-  "letter '('",
-  "letter ')'",
-  "letter '*'",                                        /* 130 */
-  "letter '+'",
-  "letter ','",
-  "letter '-'",
-  "letter '.'",
-  "letter '/'",
-  "letter '0'",
-  "letter '1'",
-  "letter '2'",
-  "letter '3'",
-  "letter '4'",                                        /* 140 */
-  "letter '5'",
-  "letter '6'",
-  "letter '7'",
-  "letter '8'",
-  "letter '9'",
-  "letter ':'",
-  "letter ';'",
-  "letter '<'",
-  "letter '='",
-  "letter '>'",                                        /* 150 */
-  "letter '?'",
-  "letter '@'",
-  "letter 'A'",
-  "letter 'B'",
-  "letter 'C'",
-  "letter 'D'",
-  "letter 'E'",
-  "letter 'F'",
-  "letter 'G'",
-  "letter 'H'",                                        /* 160 */
-  "letter 'I'",
-  "letter 'J'",
-  "letter 'K'",
-  "letter 'L'",
-  "letter 'M'",
-  "letter 'N'",
-  "letter 'O'",
-  "letter 'P'",
-  "letter 'Q'",
-  "letter 'R'",                                        /* 170 */
-  "letter 'S'",
-  "letter 'T'",
-  "letter 'U'",
-  "letter 'V'",
-  "letter 'W'",
-  "letter 'X'",
-  "letter 'Y'",
-  "letter 'Z'",
-  "letter 'Ä'",
-  "letter 'Ö'",                                        /* 180 */
-  "letter 'Ü'",
-  "letter '^'",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",                                 /* 190 */
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "letter ''",
-  "growing wall (horizontal)",                 /* 200 */
-  "growing wall (vertical)",
-  "growing wall (all directions)",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "unused",
-  "empty space",                               /* 210 */
-  "zonk",
-  "base",
-  "murphy",
-  "infotron",
-  "chip (single)",
-  "hardware",
-  "exit",
-  "orange disk",
-  "port (leading right)",
-  "port (leading down)",                       /* 220 */
-  "port (leading left)",
-  "port (leading up)",
-  "port (leading right)",
-  "port (leading down)",
-  "port (leading left)",
-  "port (leading up)",
-  "snik snak",
-  "yellow disk",
-  "terminal",
-  "red disk",                                  /* 230 */
-  "port (vertical)",
-  "port (horizontal)",
-  "port (all directions)",
-  "electron",
-  "buggy base",
-  "chip (left half)",
-  "chip (right half)",
-  "hardware",
-  "hardware",
-  "hardware",                                  /* 240 */
-  "hardware",
-  "hardware",
-  "hardware",
-  "hardware",
-  "hardware",
-  "hardware",
-  "hardware",
-  "chip (upper half)",
-  "chip (lower half)",
-  "unknown",                                   /* 250 */
-  "unknown",
-  "unknown",
-  "unknown",
-  "unknown",
-  "unknown",
+  { "empty_space",             "empty space"                   },      /* 0 */
+  { "sand",                    "sand"                          },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "round wall"                    },
+  { "rock",                    "rock"                          },
+  { "key",                     "key"                           },
+  { "emerald",                 "emerald"                       },
+  { "exit",                    "closed exit"                   },
+  { "player",                  "player"                        },
+  { "bug",                     "bug"                           },
+  { "spaceship",               "spaceship"                     },     /* 10 */
+  { "yamyam",                  "yam yam"                       },
+  { "robot",                   "robot"                         },
+  { "wall",                    "steel wall"                    },
+  { "diamond",                 "diamond"                       },
+  { "amoeba",                  "dead amoeba"                   },
+  { "quicksand",               "empty quicksand"               },
+  { "quicksand",               "quicksand with rock"           },
+  { "amoeba",                  "amoeba drop"                   },
+  { "bomb",                    "bomb"                          },
+  { "magic_wall",              "magic wall"                    },     /* 20 */
+  { "speed_pill",              "speed pill"                    },
+  { "acid",                    "acid"                          },
+  { "amoeba",                  "dropping amoeba"               },
+  { "amoeba",                  "normal amoeba"                 },
+  { "nut",                     "nut with emerald"              },
+  { "gameoflife",              "Conway's wall of life"         },
+  { "biomaze",                 "biomaze"                       },
+  { "dynamite",                        "burning dynamite"              },
+  { "wall",                    "wall"                          },
+  { "robot_wheel",             "magic wheel"                   },     /* 30 */
+  { "robot_wheel",             "magic wheel (running)"         },
+  { "key",                     "red key"                       },
+  { "key",                     "yellow key"                    },
+  { "key",                     "green key"                     },
+  { "key",                     "blue key"                      },
+  { "gate",                    "red door"                      },
+  { "gate",                    "yellow door"                   },
+  { "gate",                    "green door"                    },
+  { "gate",                    "blue door"                     },
+  { "gate",                    "gray door (opened by red key)" },     /* 40 */
+  { "gate",                    "gray door (opened by yellow key)"},
+  { "gate",                    "gray door (opened by green key)"},
+  { "gate",                    "gray door (opened by blue key)"},
+  { "dynamite",                        "dynamite"                      },
+  { "pacman",                  "pac man"                       },
+  { "wall",                    "invisible normal wall"         },
+  { "lamp",                    "lamp (off)"                    },
+  { "lamp",                    "lamp (on)"                     },
+  { "wall",                    "wall with emerald"             },
+  { "wall",                    "wall with diamond"             },     /* 50 */
+  { "amoeba",                  "amoeba with content"           },
+  { "bd_amoeba",               "amoeba (BD style)"             },
+  { "time_orb_full",           "time orb (full)"               },
+  { "time_orb_empty",          "time orb (empty)"              },
+  { "wall",                    "growing wall"                  },
+  { "bd_diamond",              "diamond (BD style)"            },
+  { "emerald",                 "yellow emerald"                },
+  { "wall",                    "wall with BD style diamond"    },
+  { "wall",                    "wall with yellow emerald"      },
+  { "dark_yamyam",             "dark yam yam"                  },     /* 60 */
+  { "bd_magic_wall",           "magic wall (BD style)"         },
+  { "wall",                    "invisible steel wall"          },
+
+  { NULL,                      "(not used)"                    },
+
+  { "dynabomb_nr",             "increases number of bombs"     },
+  { "dynabomb_sz",             "increases explosion size"      },
+  { "dynabomb_xl",             "increases power of explosion"  },
+  { "sokoban_object",          "sokoban object"                },
+  { "sokoban_field",           "sokoban empty field"           },
+  { "sokoban_field",           "sokoban field with object"     },
+  { "bd_butterfly",            "butterfly (starts moving right)"},    /* 70 */
+  { "bd_butterfly",            "butterfly (starts moving up)"  },
+  { "bd_butterfly",            "butterfly (starts moving left)"},
+  { "bd_butterfly",            "butterfly (starts moving down)"},
+  { "bd_firefly",              "firefly (starts moving right)" },
+  { "bd_firefly",              "firefly (starts moving up)"    },
+  { "bd_firefly",              "firefly (starts moving left)"  },
+  { "bd_firefly",              "firefly (starts moving down)"  },
+  { "bd_butterfly",            "butterfly"                     },
+  { "bd_firefly",              "firefly"                       },
+  { "player",                  "yellow player"                 },     /* 80 */
+  { "player",                  "red player"                    },
+  { "player",                  "green player"                  },
+  { "player",                  "blue player"                   },
+  { "bug",                     "bug (starts moving right)"     },
+  { "bug",                     "bug (starts moving up)"        },
+  { "bug",                     "bug (starts moving left)"      },
+  { "bug",                     "bug (starts moving down)"      },
+  { "spaceship",               "spaceship (starts moving right)"},
+  { "spaceship",               "spaceship (starts moving up)"  },
+  { "spaceship",               "spaceship (starts moving left)"},     /* 90 */
+  { "spaceship",               "spaceship (starts moving down)"},
+  { "pacman",                  "pac man (starts moving right)" },
+  { "pacman",                  "pac man (starts moving up)"    },
+  { "pacman",                  "pac man (starts moving left)"  },
+  { "pacman",                  "pac man (starts moving down)"  },
+  { "emerald",                 "red emerald"                   },
+  { "emerald",                 "purple emerald"                },
+  { "wall",                    "wall with red emerald"         },
+  { "wall",                    "wall with purple emerald"      },
+  { "wall",                    "acid pool (top left)"          },    /* 100 */
+  { "wall",                    "acid pool (top right)"         },
+  { "wall",                    "acid pool (bottom left)"       },
+  { "wall",                    "acid pool (bottom)"            },
+  { "wall",                    "acid pool (bottom right)"      },
+  { "wall",                    "normal wall (BD style)"        },
+  { "bd_rock",                 "rock (BD style)"               },
+  { "exit",                    "open exit"                     },
+  { NULL,                      "black orb bomb"                },
+  { "amoeba",                  "amoeba"                        },
+  { "mole",                    "mole"                          },    /* 110 */
+  { "penguin",                 "penguin"                       },
+  { "satellite",               "satellite"                     },
+  { NULL,                      "arrow left"                    },
+  { NULL,                      "arrow right"                   },
+  { NULL,                      "arrow up"                      },
+  { NULL,                      "arrow down"                    },
+  { "pig",                     "pig"                           },
+  { "dragon",                  "fire breathing dragon"         },
+  { "key",                     "red key (EM style)"            },
+  { NULL,                      "letter ' '"                    },    /* 120 */
+  { NULL,                      "letter '!'"                    },
+  { NULL,                      "letter '\"'"                   },
+  { NULL,                      "letter '#'"                    },
+  { NULL,                      "letter '$'"                    },
+  { NULL,                      "letter '%'"                    },
+  { NULL,                      "letter '&'"                    },
+  { NULL,                      "letter '''"                    },
+  { NULL,                      "letter '('"                    },
+  { NULL,                      "letter ')'"                    },
+  { NULL,                      "letter '*'"                    },    /* 130 */
+  { NULL,                      "letter '+'"                    },
+  { NULL,                      "letter ','"                    },
+  { NULL,                      "letter '-'"                    },
+  { NULL,                      "letter '.'"                    },
+  { NULL,                      "letter '/'"                    },
+  { NULL,                      "letter '0'"                    },
+  { NULL,                      "letter '1'"                    },
+  { NULL,                      "letter '2'"                    },
+  { NULL,                      "letter '3'"                    },
+  { NULL,                      "letter '4'"                    },    /* 140 */
+  { NULL,                      "letter '5'"                    },
+  { NULL,                      "letter '6'"                    },
+  { NULL,                      "letter '7'"                    },
+  { NULL,                      "letter '8'"                    },
+  { NULL,                      "letter '9'"                    },
+  { NULL,                      "letter ':'"                    },
+  { NULL,                      "letter ';'"                    },
+  { NULL,                      "letter '<'"                    },
+  { NULL,                      "letter '='"                    },
+  { NULL,                      "letter '>'"                    },    /* 150 */
+  { NULL,                      "letter '?'"                    },
+  { NULL,                      "letter '@'"                    },
+  { NULL,                      "letter 'A'"                    },
+  { NULL,                      "letter 'B'"                    },
+  { NULL,                      "letter 'C'"                    },
+  { NULL,                      "letter 'D'"                    },
+  { NULL,                      "letter 'E'"                    },
+  { NULL,                      "letter 'F'"                    },
+  { NULL,                      "letter 'G'"                    },
+  { NULL,                      "letter 'H'"                    },    /* 160 */
+  { NULL,                      "letter 'I'"                    },
+  { NULL,                      "letter 'J'"                    },
+  { NULL,                      "letter 'K'"                    },
+  { NULL,                      "letter 'L'"                    },
+  { NULL,                      "letter 'M'"                    },
+  { NULL,                      "letter 'N'"                    },
+  { NULL,                      "letter 'O'"                    },
+  { NULL,                      "letter 'P'"                    },
+  { NULL,                      "letter 'Q'"                    },
+  { NULL,                      "letter 'R'"                    },    /* 170 */
+  { NULL,                      "letter 'S'"                    },
+  { NULL,                      "letter 'T'"                    },
+  { NULL,                      "letter 'U'"                    },
+  { NULL,                      "letter 'V'"                    },
+  { NULL,                      "letter 'W'"                    },
+  { NULL,                      "letter 'X'"                    },
+  { NULL,                      "letter 'Y'"                    },
+  { NULL,                      "letter 'Z'"                    },
+  { NULL,                      "letter 'Ä'"                    },
+  { NULL,                      "letter 'Ö'"                    },    /* 180 */
+  { NULL,                      "letter 'Ü'"                    },
+  { NULL,                      "letter '^'"                    },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },    /* 190 */
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { NULL,                      "letter ''"                     },
+  { "wall",                    "growing wall (horizontal)"     },    /* 200 */
+  { "wall",                    "growing wall (vertical)"       },
+  { "wall",                    "growing wall (all directions)" },
+  { "gate",                    "red door (EM style)"           },
+  { "gate",                    "yellow door (EM style)"        },
+  { "gate",                    "green door (EM style)"         },
+  { "gate",                    "blue door (EM style)"          },
+  { "key",                     "yellow key (EM style)"         },
+  { "key",                     "green key (EM style)"          },
+  { "key",                     "blue key (EM style)"           },
+  { "empty_space",             "empty space"                   },    /* 210 */
+  { "sp_zonk",                 "zonk"                          },
+  { "sp_base",                 "base"                          },
+  { "player",                  "murphy"                        },
+  { "sp_infotron",             "infotron"                      },
+  { "wall",                    "chip (single)"                 },
+  { "wall",                    "hardware"                      },
+  { "sp_exit",                 "exit"                          },
+  { "sp_disk_orange",          "orange disk"                   },
+  { "sp_port",                 "port (leading right)"          },
+  { "sp_port",                 "port (leading down)"           },    /* 220 */
+  { "sp_port",                 "port (leading left)"           },
+  { "sp_port",                 "port (leading up)"             },
+  { "sp_port",                 "port (leading right)"          },
+  { "sp_port",                 "port (leading down)"           },
+  { "sp_port",                 "port (leading left)"           },
+  { "sp_port",                 "port (leading up)"             },
+  { "sp_sniksnak",             "snik snak"                     },
+  { "sp_disk_yellow",          "yellow disk"                   },
+  { "sp_terminal",             "terminal"                      },
+  { "sp_disk_red",             "red disk"                      },    /* 230 */
+  { "sp_port",                 "port (vertical)"               },
+  { "sp_port",                 "port (horizontal)"             },
+  { "sp_port",                 "port (all directions)"         },
+  { "sp_electron",             "electron"                      },
+  { "sp_buggy_base",           "buggy base"                    },
+  { "wall",                    "chip (left half)"              },
+  { "wall",                    "chip (right half)"             },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },    /* 240 */
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "hardware"                      },
+  { "wall",                    "chip (upper half)"             },
+  { "wall",                    "chip (lower half)"             },
+  { "gate",                    "gray door (EM style, red key)" },    /* 250 */
+  { "gate",                    "gray door (EM style, yellow key)"},
+  { "gate",                    "gray door (EM style, green key)"},
+  { "gate",                    "gray door (EM style, blue key)"},
+
+  { NULL,                      "(not used)"                    },
+  { NULL,                      "(not used)"                    },
 
   /* 256 */
 
-  "pearl",                                     /* (256) */
-  "crystal",
-  "wall with pearl",
-  "wall with crystal",
-  "white door",                                        /* 260 */
-  "gray door (opened by white key)",
-  "white key",
-  "shield (passive)",
-  "extra time",
-  "switch gate (open)",
-  "switch gate (closed)",
-  "switch for switch gate",
-  "switch for switch gate",
-  "-",
-  "-",                                         /* 270 */
-  "red conveyor belt (left)",
-  "red conveyor belt (middle)",
-  "red conveyor belt (right)",
-  "switch for red conveyor belt (left)",
-  "switch for red conveyor belt (middle)",
-  "switch for red conveyor belt (right)",
-  "yellow conveyor belt (left)",
-  "yellow conveyor belt (middle)",
-  "yellow conveyor belt (right)",
-  "switch for yellow conveyor belt (left)",    /* 280 */
-  "switch for yellow conveyor belt (middle)",
-  "switch for yellow conveyor belt (right)",
-  "green conveyor belt (left)",
-  "green conveyor belt (middle)",
-  "green conveyor belt (right)",
-  "switch for green conveyor belt (left)",
-  "switch for green conveyor belt (middle)",
-  "switch for green conveyor belt (right)",
-  "blue conveyor belt (left)",
-  "blue conveyor belt (middle)",               /* 290 */
-  "blue conveyor belt (right)",
-  "switch for blue conveyor belt (left)",
-  "switch for blue conveyor belt (middle)",
-  "switch for blue conveyor belt (right)",
-  "land mine",
-  "mail envelope",
-  "light switch (off)",
-  "light switch (on)",
-  "sign (exclamation)",
-  "sign (radio activity)",                     /* 300 */
-  "sign (stop)",
-  "sign (wheel chair)",
-  "sign (parking)",
-  "sign (one way)",
-  "sign (heart)",
-  "sign (triangle)",
-  "sign (round)",
-  "sign (exit)",
-  "sign (yin yang)",
-  "sign (other)",                              /* 310 */
-  "mole (starts moving left)",
-  "mole (starts moving right)",
-  "mole (starts moving up)",
-  "mole (starts moving down)",
-  "steel wall (slanted)",
-  "invisible sand",
-  "dx unknown 15",
-  "dx unknown 42",
-  "-",
-  "-",                                         /* 320 */
-  "shield (active, kills enemies)",
-  "time gate (open)",
-  "time gate (closed)",
-  "switch for time gate",
-  "switch for time gate",
-  "balloon",
-  "send balloon to the left",
-  "send balloon to the right",
-  "send balloon up",
-  "send balloon down",                         /* 330 */
-  "send balloon in any direction",
-  "steel wall",
-  "steel wall",
-  "steel wall",
-  "steel wall",
-  "normal wall",
-  "normal wall",
-  "normal wall",
-  "normal wall",
-  "normal wall",                               /* 340 */
-  "normal wall",
-  "normal wall",
-  "normal wall",
-  "tube (all directions)",
-  "tube (vertical)",
-  "tube (horizontal)",
-  "tube (vertical & left)",
-  "tube (vertical & right)",
-  "tube (horizontal & up)",
-  "tube (horizontal & down)",                  /* 350 */
-  "tube (left & up)",
-  "tube (left & down)",
-  "tube (right & up)",
-  "tube (right & down)",
-  "spring",
-  "trap",
-  "stable bomb (DX style)",
-  "-"
+  { "pearl",                   "pearl"                         },  /* (256) */
+  { "crystal",                 "crystal"                       },
+  { "wall",                    "wall with pearl"               },
+  { "wall",                    "wall with crystal"             },
+  { "gate",                    "white door"                    },    /* 260 */
+  { "gate",                    "gray door (opened by white key)"},
+  { "key",                     "white key"                     },
+  { "shield_normal",           "shield (normal)"               },
+  { "extra_time",              "extra time"                    },
+  { "switchgate",              "switch gate (open)"            },
+  { "switchgate",              "switch gate (closed)"          },
+  { "switchgate_switch",       "switch for switch gate"        },
+  { "switchgate_switch",       "switch for switch gate"        },
+  { NULL,                      "-"                             },
+  { NULL,                      "-"                             },    /* 270 */
+  { "conveyor_belt",           "red conveyor belt (left)"      },
+  { "conveyor_belt",           "red conveyor belt (middle)"    },
+  { "conveyor_belt",           "red conveyor belt (right)"     },
+  { "conveyor_belt_switch",    "switch for red conveyor belt (left)"},
+  { "conveyor_belt_switch",    "switch for red conveyor belt (middle)"},
+  { "conveyor_belt_switch",    "switch for red conveyor belt (right)"},
+  { "conveyor_belt",           "yellow conveyor belt (left)"   },
+  { "conveyor_belt",           "yellow conveyor belt (middle)" },
+  { "conveyor_belt",           "yellow conveyor belt (right)"  },
+  { "conveyor_belt_switch",    "switch for yellow conveyor belt (left)"},
+  { "conveyor_belt_switch",    "switch for yellow conveyor belt (middle)"},
+  { "conveyor_belt_switch",    "switch for yellow conveyor belt (right)"},
+  { "conveyor_belt",           "green conveyor belt (left)"    },
+  { "conveyor_belt",           "green conveyor belt (middle)"  },
+  { "conveyor_belt",           "green conveyor belt (right)"   },
+  { "conveyor_belt_switch",    "switch for green conveyor belt (left)"},
+  { "conveyor_belt_switch",    "switch for green conveyor belt (middle)"},
+  { "conveyor_belt_switch",    "switch for green conveyor belt (right)"},
+  { "conveyor_belt",           "blue conveyor belt (left)"     },
+  { "conveyor_belt",           "blue conveyor belt (middle)"   },
+  { "conveyor_belt",           "blue conveyor belt (right)"    },
+  { "conveyor_belt_switch",    "switch for blue conveyor belt (left)"},
+  { "conveyor_belt_switch",    "switch for blue conveyor belt (middle)"},
+  { "conveyor_belt_switch",    "switch for blue conveyor belt (right)"},
+  { "sand",                    "land mine"                     },
+  { "envelope",                        "mail envelope"                 },
+  { "light_switch",            "light switch (off)"            },
+  { "light_switch",            "light switch (on)"             },
+  { "wall",                    "sign (exclamation)"            },
+  { "wall",                    "sign (radio activity)"         },    /* 300 */
+  { "wall",                    "sign (stop)"                   },
+  { "wall",                    "sign (wheel chair)"            },
+  { "wall",                    "sign (parking)"                },
+  { "wall",                    "sign (one way)"                },
+  { "wall",                    "sign (heart)"                  },
+  { "wall",                    "sign (triangle)"               },
+  { "wall",                    "sign (round)"                  },
+  { "wall",                    "sign (exit)"                   },
+  { "wall",                    "sign (yin yang)"               },
+  { "wall",                    "sign (other)"                  },    /* 310 */
+  { "mole",                    "mole (starts moving left)"     },
+  { "mole",                    "mole (starts moving right)"    },
+  { "mole",                    "mole (starts moving up)"       },
+  { "mole",                    "mole (starts moving down)"     },
+  { "wall",                    "steel wall (slanted)"          },
+  { "sand",                    "invisible sand"                },
+
+  { NULL,                      "dx unknown element 15"         },
+  { NULL,                      "dx unknown element 42"         },
+
+  { NULL,                      "(not used)"                    },
+  { NULL,                      "(not used)"                    },    /* 320 */
+
+  { "shield_deadly",           "shield (deadly, kills enemies)"},
+  { "timegate",                        "time gate (open)"              },
+  { "timegate",                        "time gate (closed)"            },
+  { "timegate_switch",         "switch for time gate"          },
+  { "timegate_switch",         "switch for time gate"          },
+  { "balloon",                 "balloon"                       },
+  { "balloon_switch",          "send balloon to the left"      },
+  { "balloon_switch",          "send balloon to the right"     },
+  { "balloon_switch",          "send balloon up"               },
+  { "balloon_switch",          "send balloon down"             },    /* 330 */
+  { "balloon_switch",          "send balloon in any direction" },
+  { "wall",                    "steel wall"                    },
+  { "wall",                    "steel wall"                    },
+  { "wall",                    "steel wall"                    },
+  { "wall",                    "steel wall"                    },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },    /* 340 */
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },
+  { "wall",                    "normal wall"                   },
+  { "tube",                    "tube (all directions)"         },
+  { "tube",                    "tube (vertical)"               },
+  { "tube",                    "tube (horizontal)"             },
+  { "tube",                    "tube (vertical & left)"        },
+  { "tube",                    "tube (vertical & right)"       },
+  { "tube",                    "tube (horizontal & up)"        },
+  { "tube",                    "tube (horizontal & down)"      },    /* 350 */
+  { "tube",                    "tube (left & up)"              },
+  { "tube",                    "tube (left & down)"            },
+  { "tube",                    "tube (right & up)"             },
+  { "tube",                    "tube (right & down)"           },
+  { "spring",                  "spring"                        },
+  { "trap",                    "trap"                          },
+  { "dx_bomb",                 "stable bomb (DX style)"        },
+  { NULL,                      "-"                             },
+  { NULL,                      "-"                             },
+  { "custom",                  "custom element 0"              },
+  { "custom",                  "custom element 1"              },
+  { "custom",                  "custom element 2"              },
+  { "custom",                  "custom element 3"              },
+  { "custom",                  "custom element 4"              },
+  { "custom",                  "custom element 5"              },
+  { "custom",                  "custom element 6"              },
+  { "custom",                  "custom element 7"              },
+  { "custom",                  "custom element 8"              },
+  { "custom",                  "custom element 9"              },
+  { "custom",                  "custom element 10"             },
+  { "custom",                  "custom element 11"             },
+  { "custom",                  "custom element 12"             },
+  { "custom",                  "custom element 13"             },
+  { "custom",                  "custom element 14"             },
+  { "custom",                  "custom element 15"             },
+  { "custom",                  "custom element 16"             },
+  { "custom",                  "custom element 17"             },
+  { "custom",                  "custom element 18"             },
+  { "custom",                  "custom element 19"             },
+  { "custom",                  "custom element 20"             },
+  { "custom",                  "custom element 21"             },
+  { "custom",                  "custom element 22"             },
+  { "custom",                  "custom element 23"             },
+  { "custom",                  "custom element 24"             },
+  { "custom",                  "custom element 25"             },
+  { "custom",                  "custom element 26"             },
+  { "custom",                  "custom element 27"             },
+  { "custom",                  "custom element 28"             },
+  { "custom",                  "custom element 29"             },
+  { "custom",                  "custom element 30"             },
+  { "custom",                  "custom element 31"             },
+  { "custom",                  "custom element 32"             },
+  { "custom",                  "custom element 33"             },
+  { "custom",                  "custom element 34"             },
+  { "custom",                  "custom element 35"             },
+  { "custom",                  "custom element 36"             },
+  { "custom",                  "custom element 37"             },
+  { "custom",                  "custom element 38"             },
+  { "custom",                  "custom element 39"             },
+  { "custom",                  "custom element 40"             },
+  { "custom",                  "custom element 41"             },
+  { "custom",                  "custom element 42"             },
+  { "custom",                  "custom element 43"             },
+  { "custom",                  "custom element 44"             },
+  { "custom",                  "custom element 45"             },
+  { "custom",                  "custom element 46"             },
+  { "custom",                  "custom element 47"             },
+  { "custom",                  "custom element 48"             },
+  { "custom",                  "custom element 49"             },
+  { "custom",                  "custom element 50"             },
+  { "custom",                  "custom element 51"             },
+  { "custom",                  "custom element 52"             },
+  { "custom",                  "custom element 53"             },
+  { "custom",                  "custom element 54"             },
+  { "custom",                  "custom element 55"             },
+  { "custom",                  "custom element 56"             },
+  { "custom",                  "custom element 57"             },
+  { "custom",                  "custom element 58"             },
+  { "custom",                  "custom element 59"             },
+  { "custom",                  "custom element 60"             },
+  { "custom",                  "custom element 61"             },
+  { "custom",                  "custom element 62"             },
+  { "custom",                  "custom element 63"             },
+  { "custom",                  "custom element 64"             },
+  { "custom",                  "custom element 65"             },
+  { "custom",                  "custom element 66"             },
+  { "custom",                  "custom element 67"             },
+  { "custom",                  "custom element 68"             },
+  { "custom",                  "custom element 69"             },
+  { "custom",                  "custom element 70"             },
+  { "custom",                  "custom element 71"             },
+  { "custom",                  "custom element 72"             },
+  { "custom",                  "custom element 73"             },
+  { "custom",                  "custom element 74"             },
+  { "custom",                  "custom element 75"             },
+  { "custom",                  "custom element 76"             },
+  { "custom",                  "custom element 77"             },
+  { "custom",                  "custom element 78"             },
+  { "custom",                  "custom element 79"             },
+  { "custom",                  "custom element 80"             },
+  { "custom",                  "custom element 81"             },
+  { "custom",                  "custom element 82"             },
+  { "custom",                  "custom element 83"             },
+  { "custom",                  "custom element 84"             },
+  { "custom",                  "custom element 85"             },
+  { "custom",                  "custom element 86"             },
+  { "custom",                  "custom element 87"             },
+  { "custom",                  "custom element 88"             },
+  { "custom",                  "custom element 89"             },
+  { "custom",                  "custom element 90"             },
+  { "custom",                  "custom element 91"             },
+  { "custom",                  "custom element 92"             },
+  { "custom",                  "custom element 93"             },
+  { "custom",                  "custom element 94"             },
+  { "custom",                  "custom element 95"             },
+  { "custom",                  "custom element 96"             },
+  { "custom",                  "custom element 97"             },
+  { "custom",                  "custom element 98"             },
+  { "custom",                  "custom element 99"             },
+  { "custom",                  "custom element 100"            },
+  { "custom",                  "custom element 101"            },
+  { "custom",                  "custom element 102"            },
+  { "custom",                  "custom element 103"            },
+  { "custom",                  "custom element 104"            },
+  { "custom",                  "custom element 105"            },
+  { "custom",                  "custom element 106"            },
+  { "custom",                  "custom element 107"            },
+  { "custom",                  "custom element 108"            },
+  { "custom",                  "custom element 109"            },
+  { "custom",                  "custom element 110"            },
+  { "custom",                  "custom element 111"            },
+  { "custom",                  "custom element 112"            },
+  { "custom",                  "custom element 113"            },
+  { "custom",                  "custom element 114"            },
+  { "custom",                  "custom element 115"            },
+  { "custom",                  "custom element 116"            },
+  { "custom",                  "custom element 117"            },
+  { "custom",                  "custom element 118"            },
+  { "custom",                  "custom element 119"            },
+  { "custom",                  "custom element 120"            },
+  { "custom",                  "custom element 121"            },
+  { "custom",                  "custom element 122"            },
+  { "custom",                  "custom element 123"            },
+  { "custom",                  "custom element 124"            },
+  { "custom",                  "custom element 125"            },
+  { "custom",                  "custom element 126"            },
+  { "custom",                  "custom element 127"            },
+
+  { NULL,                      "-"                             }
 
   /*
   "-------------------------------",
   */
 };
-int num_element_info = sizeof(element_info)/sizeof(char *);
-
-
-
-/* +-----------------------------------------------------------------------+ */
-/* | SDL TEST STUFF                                                        | */
-/* +-----------------------------------------------------------------------+ */
-
-#if defined(TARGET_SDL)
-
-SDL_Surface *sdl_screen, *sdl_image_tmp, *sdl_image, *sdl_image_masked;
-SDL_Surface *sdl_image2_tmp, *sdl_image2, *sdl_image2_masked;
-
-void TEST_SDL_BLIT_RECT(int x, int y)
-{
-  SDL_Rect rect_src, rect_dst;
-
-  SDLCopyArea(pix_masked[PIX_HEROES], window,
-             8 * TILEX, 8 * TILEY, TILEX, TILEY, x, y);
-  return;
-
-  rect_src.x = 8 * TILEX;
-  rect_src.y = 8 * TILEY;
-  rect_src.w = TILEX;
-  rect_src.h = TILEY;
-
-  rect_dst.x = x;
-  rect_dst.y = y;
-  rect_dst.w = TILEX;
-  rect_dst.h = TILEY;
-
-  SDL_BlitSurface(sdl_image2_masked, &rect_src, sdl_screen, &rect_dst);
-  SDL_UpdateRect(sdl_screen, x, y, TILEX, TILEY);
-}
-
-void TEST_SDL_INIT_DISPLAY()
-{
-  SDL_Rect rect_src, rect_dst;
-
-  if (SDL_Init(SDL_INIT_VIDEO) < 0)
-  {
-    fprintf(stderr, "SDL_Init() failed: %s\n", SDL_GetError());
-    exit(1);
-  }
-
-  /* automatically cleanup SDL stuff after exit() */
-  atexit(SDL_Quit);
-
-  if ((sdl_screen = SDL_SetVideoMode(WIN_XSIZE, WIN_YSIZE, 16, SDL_HWSURFACE))
-      == NULL)
-  {
-    fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError());
-    exit(1);
-  }
-
-  SDL_WM_SetCaption(WINDOW_TITLE_STRING, WINDOW_TITLE_STRING);
-
-  if ((sdl_image_tmp = IMG_Load("graphics/RocksScreen.pcx")) == NULL)
-  {
-    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
-    exit(1);
-  }
-
-  sdl_image = SDL_DisplayFormat(sdl_image_tmp);
-
-  SDL_SetColorKey(sdl_image_tmp, SDL_SRCCOLORKEY,
-                 SDL_MapRGB(sdl_image_tmp->format, 0x00, 0x00, 0x00));
-  sdl_image_masked = SDL_DisplayFormat(sdl_image_tmp);
-
-  SDL_FreeSurface(sdl_image_tmp);
-
-  if ((sdl_image2_tmp = IMG_Load("graphics/RocksHeroes.pcx")) == NULL)
-  {
-    fprintf(stderr, "IMG_Load() failed: %s\n", SDL_GetError());
-    exit(1);
-  }
-
-  sdl_image2 = SDL_DisplayFormat(sdl_image2_tmp);
-  SDL_FreeSurface(sdl_image2_tmp);
-
-  sdl_image2_masked = SDL_DisplayFormat(sdl_image2);
-  SDL_SetColorKey(sdl_image2_masked, SDL_SRCCOLORKEY,
-                 SDL_MapRGB(sdl_image2_masked->format, 0x00, 0x00, 0x00));
 
-  rect_src.x = 0;
-  rect_src.y = 0;
-  rect_src.w = sdl_image->w;
-  rect_src.h = sdl_image->h;
-
-  rect_dst.x = 0;
-  rect_dst.y = 0;
-  rect_dst.w = sdl_image->w;
-  rect_dst.h = sdl_image->h;
-                                           
-  SDL_BlitSurface(sdl_image, &rect_src, sdl_screen, &rect_dst);
-
-  /*
-  SDL_UpdateRect(sdl_screen, 0, 0, WIN_XSIZE, WIN_YSIZE);
-  */
-  /*
-  SDL_UpdateRect(sdl_screen, 0, 0, 0, 0);
-  */
-  SDL_Flip(sdl_screen);
-
-  /*
-  SDL_Delay(5000);
-  */
-}
-
-void TEST_SDL_EVENT_LOOP()
-{
-  int quit_loop = 0;
-
-  SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
-
-  /*
-  while (!quit_loop && SDL_WaitEvent(&event) >=0)
-  */
-
-  while (!quit_loop)
-  {
-    SDL_Event event;
-
-    if (SDL_PollEvent(&event))
-    {
-      /* hier werden die Ereignisse behandelt */
-      switch(event.type)
-      {
-        case SDL_QUIT:
-       {
-         quit_loop = 1;
-         break;
-       }
-
-        case SDL_MOUSEBUTTONDOWN:
-       {
-         int x = event.button.x;
-         int y = event.button.y;
-
-         SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
-
-         TEST_SDL_BLIT_RECT(x, y);
-
-         printf("SDL_MOUSEBUTTONDOWN(%d, %d)\n", x, y);
-         break;
-       }
-
-        case SDL_MOUSEBUTTONUP:
-       {
-         int x = event.button.x;
-         int y = event.button.y;
-
-         SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
-
-         printf("SDL_MOUSEBUTTONUP(%d, %d)\n", x, y);
-         break;
-       }
-
-        case SDL_MOUSEMOTION:
-       {
-         int x = event.motion.x;
-         int y = event.motion.y;
-
-         TEST_SDL_BLIT_RECT(x, y);
-
-         printf("SDL_MOUSEMOTION(%d, %d)\n", x, y);
-         break;
-       }
-
-        default:
-         break;
-      }
-    }
-
-    if (!SDL_PollEvent(NULL))  /* delay only if no pending events */
-    {
-      printf("waiting...\n");
-      Delay(100);
-    }
-  }
-
-  SDL_FreeSurface(sdl_image);
-  SDL_Quit();
-}
-
-#define SCREEN_WIDTH   640
-#define SCREEN_HEIGHT  480
-
-void WatchJoysticks()
-{
-       SDL_Surface *screen;
-       const char *name;
-       int i, done;
-       SDL_Event event;
-       int x, y, draw;
-       SDL_Rect axis_area[2];
-       int joystick_nr = 0;
-       SDL_Joystick *joystick = Get_SDL_Joystick(joystick_nr);
-
-       /* Set a video mode to display joystick axis position */
-       screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 16, 0);
-       if ( screen == NULL ) {
-               fprintf(stderr, "Couldn't set video mode: %s\n",SDL_GetError());
-               return;
-       }
-
-       /* Print info about the joysticks we are watching */
-       for (i=0; i<2; i++)
-       {
-         joystick = Get_SDL_Joystick(i);
-
-         name = SDL_JoystickName(i);
-         printf("Watching joystick %d: (%s)\n", i,
-                name ? name : "Unknown Joystick");
-         printf("Joystick has %d axes, %d hats, %d balls, and %d buttons\n",
-                SDL_JoystickNumAxes(joystick),
-                SDL_JoystickNumHats(joystick),
-                SDL_JoystickNumBalls(joystick),
-                SDL_JoystickNumButtons(joystick));
-       }
-
-       /* Initialize drawing rectangles */
-       memset(axis_area, 0, (sizeof axis_area));
-       draw = 0;
-
-       /* Loop, getting joystick events! */
-       done = 0;
-       while ( ! done ) {
-               while ( SDL_PollEvent(&event) ) {
-                       switch (event.type) {
-                           case SDL_JOYAXISMOTION:
-                             joystick_nr = event.jaxis.which;
-                               printf("Joystick %d axis %d value: %d\n",
-                                      event.jaxis.which,
-                                      event.jaxis.axis,
-                                      event.jaxis.value);
-                               break;
-                           case SDL_JOYHATMOTION:
-                             joystick_nr = event.jaxis.which;
-                               printf("Joystick %d hat %d value:",
-                                      event.jhat.which,
-                                      event.jhat.hat);
-                               if ( event.jhat.value == SDL_HAT_CENTERED )
-                                       printf(" centered");
-                               if ( event.jhat.value & SDL_HAT_UP )
-                                       printf(" up");
-                               if ( event.jhat.value & SDL_HAT_RIGHT )
-                                       printf(" right");
-                               if ( event.jhat.value & SDL_HAT_DOWN )
-                                       printf(" down");
-                               if ( event.jhat.value & SDL_HAT_LEFT )
-                                       printf(" left");
-                               printf("\n");
-                               break;
-                           case SDL_JOYBALLMOTION:
-                             joystick_nr = event.jaxis.which;
-                               printf("Joystick %d ball %d delta: (%d,%d)\n",
-                                      event.jball.which,
-                                      event.jball.ball,
-                                      event.jball.xrel,
-                                      event.jball.yrel);
-                               break;
-                           case SDL_JOYBUTTONDOWN:
-                             joystick_nr = event.jaxis.which;
-                               printf("Joystick %d button %d down\n",
-                                      event.jbutton.which,
-                                      event.jbutton.button);
-                               break;
-                           case SDL_JOYBUTTONUP:
-                             joystick_nr = event.jaxis.which;
-                               printf("Joystick %d button %d up\n",
-                                      event.jbutton.which,
-                                      event.jbutton.button);
-                               break;
-                           case SDL_KEYDOWN:
-                               if ( event.key.keysym.sym != SDLK_ESCAPE ) {
-                                       break;
-                               }
-                               /* Fall through to signal quit */
-                           case SDL_QUIT:
-                               done = 1;
-                               break;
-                           default:
-                               break;
-                       }
-               }
-
-               joystick = Get_SDL_Joystick(joystick_nr);               
-
-               /* Update visual joystick state */
-               for ( i=0; i<SDL_JoystickNumButtons(joystick); ++i ) {
-                       SDL_Rect area;
-
-                       area.x = i*34;
-                       area.y = SCREEN_HEIGHT-34;
-                       area.w = 32;
-                       area.h = 32;
-                       if (SDL_JoystickGetButton(joystick, i) == SDL_PRESSED) {
-                               SDL_FillRect(screen, &area, 0xFFFF);
-                       } else {
-                               SDL_FillRect(screen, &area, 0x0000);
-                       }
-                       SDL_UpdateRects(screen, 1, &area);
-               }
-
-               /* Erase previous axes */
-               SDL_FillRect(screen, &axis_area[draw], 0x0000);
-
-               /* Draw the X/Y axis */
-               draw = !draw;
-               x = (((int)SDL_JoystickGetAxis(joystick, 0))+32768);
-               x *= SCREEN_WIDTH;
-               x /= 65535;
-               if ( x < 0 ) {
-                       x = 0;
-               } else
-               if ( x > (SCREEN_WIDTH-16) ) {
-                       x = SCREEN_WIDTH-16;
-               }
-               y = (((int)SDL_JoystickGetAxis(joystick, 1))+32768);
-               y *= SCREEN_HEIGHT;
-               y /= 65535;
-               if ( y < 0 ) {
-                       y = 0;
-               } else
-               if ( y > (SCREEN_HEIGHT-16) ) {
-                       y = SCREEN_HEIGHT-16;
-               }
-               axis_area[draw].x = (Sint16)x;
-               axis_area[draw].y = (Sint16)y;
-               axis_area[draw].w = 16;
-               axis_area[draw].h = 16;
-               SDL_FillRect(screen, &axis_area[draw], 0xFFFF);
-
-               SDL_UpdateRects(screen, 2, axis_area);
-       }
-}
-
-void TEST_SDL_JOYSTICK()
-{
-  const char *name;
-  int i;
-
-  /* Initialize SDL (Note: video is required to start event loop) */
-  if ( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) < 0 )
-  {
-    fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
-    exit(1);
-  }
-
-  /* Print information about the joysticks */
-  printf("There are %d joysticks attached\n", SDL_NumJoysticks());
-  for ( i=0; i<SDL_NumJoysticks(); ++i )
-  {
-    name = SDL_JoystickName(i);
-    printf("Joystick %d: %s\n",i,name ? name : "Unknown Joystick");
-  }
-
-  for (i=0; i<2; i++)
-  {
-    if (!Open_SDL_Joystick(i))
-      printf("Couldn't open joystick %d: %s\n", i, SDL_GetError());
-  }
-
-  WatchJoysticks();
-
-  for (i=0; i<2; i++)
-    Close_SDL_Joystick(i);
-
-  SDL_QuitSubSystem(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
-}
-
-#endif /* TARGET_SDL */
-
-/* +-----------------------------------------------------------------------+ */
-/* | SDL TEST STUFF                                                        | */
-/* +-----------------------------------------------------------------------+ */
+struct GraphicInfo graphic_info[MAX_GRAPHICS];
+struct NewGraphicInfo new_graphic_info[NUM_IMAGE_FILES];
 
 
+/* ========================================================================= */
+/* main()                                                                    */
+/* ========================================================================= */
 
 int main(int argc, char *argv[])
 {
-  program_name = (strrchr(argv[0],'/') ? strrchr(argv[0],'/') + 1 : argv[0]);
-
-#if defined(PLATFORM_MSDOS)
-  _fmode = O_BINARY;
-#endif
+  InitCommandName(argv[0]);
+  InitExitFunction(CloseAllAndExit);
+  InitPlatformDependantStuff();
 
-#if 1
   GetOptions(argv);
-  OpenAll(argc,argv);
-#endif
-
-#if 0
-#ifdef TARGET_SDL
-  /*
-  TEST_SDL_BLIT_RECT((WIN_XSIZE - TILEX)/2, (WIN_YSIZE - TILEY)/2);
-  TEST_SDL_EVENT_LOOP();
-  */
-  TEST_SDL_JOYSTICK();
-  exit(0);
-#endif
-#endif
+  OpenAll();
 
   EventLoop();
   CloseAllAndExit(0);
-  exit(0);     /* to keep compilers happy */
+
+  return 0;    /* to keep compilers happy */
 }