Merge branch 'master' into releases 3.0.7
authorHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:44:30 +0000 (10:44 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:44:30 +0000 (10:44 +0200)
31 files changed:
CHANGES
Makefile
src/Makefile
src/conf_e2g.c
src/conf_e2s.c
src/conf_esg.c
src/conf_gfx.c
src/conf_gfx.h
src/conf_snd.c
src/conf_snd.h
src/config.c
src/config.h
src/conftime.h
src/editor.c
src/events.c
src/files.c
src/game.c
src/game.h
src/init.c
src/libgame/Makefile
src/libgame/misc.c
src/libgame/setup.c
src/libgame/setup.h
src/libgame/system.h
src/main.c
src/main.h
src/netserv.c
src/netserv.h
src/network.c
src/screens.c
src/tools.c

diff --git a/CHANGES b/CHANGES
index e8a75019597d01315ac6de8dd9d250790933d2fe..a279c296d633cd5cda62efbf344cbdc1b564f431 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,22 @@
+Release Version 3.0.7 [10 NOV 2003]
+-----------------------------------
+       - fixed incorrectly displayed animation for attacking dragon
+       - fixed bug with not setting initial gravity for each new game
+       - fixed bug with teleportation of player by custom element change
+       - fixed bug with player not getting smashed by rock sometimes
+       - fixed serious bug in code for delayed element pushing
+       - fixed little bug in animation frame selection for pushed elements
+       - fixed bug when pushing element that can move away to the side
+       - fixed tape recording when player is created from CE element change
+       - fixed player animation frame reset for identical animations
+       - unavailable setup options now marked as "n/a" instead of "off"
+       - prevent "extended" changed elements from delay change in same frame
+       - speed-up of reading config file for verbose output
+       - added configuration option for opening and closing Supaplex exit
+       - added configuration option for moving up/down animation for Murphy
+       - added animation for "turning" action (for elements with move delay)
+       - added turning animations for bug, spaceship and sniksnak
+
 Release Version 3.0.6 [06 OCT 2003]
 -----------------------------------
        - fixed bug when initializing font graphic structure
index e0b9bcd9848ac9e039620ca2725494358564f75a..0c0c57f4b21fb887b3efdddc107a18ddf9ae26ef 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,56 +1,62 @@
-#=============================================================================#
-# Makefile for Rocks'n'Diamonds                                               #
-# (c) 1995-2002 Holger Schemel, info@artsoft.org                              #
-#=============================================================================#
+# =============================================================================
+# Rocks'n'Diamonds Makefile
+# -----------------------------------------------------------------------------
+# (c) 1995-2003 Holger Schemel <info@artsoft.org>
+# =============================================================================
 
-#-----------------------------------------------------------------------------#
-# configuration section                                                       #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# configuration
+# -----------------------------------------------------------------------------
 
-# specify command name of your favorite ANSI C compiler
+# command name of your favorite ANSI C compiler
 # (this must be set to "cc" for some systems)
 CC = gcc
 
-# specify command name of GNU make on your system
+# command name of GNU make on your system
 # (this must be set to "gmake" for some systems)
 MAKE = make
 
-# specify path to X11 on your system
+# path to X11 on your system
 X11_PATH = /usr/X11R6
 
-# specify directory for read-only game data (like graphics, sounds, levels)
-# default is '.', so you can play without installing game data somewhere
+# directory for read-only game data (like graphics, sounds, levels)
+# default is '.' to be able to run program without installation
 # RO_GAME_DIR = /usr/games
 
-# specify directory for writable game data (like highscore files)
-# default is '.', so you can play without installing game data somewhere
+# directory for writable game data (like highscore files)
+# default is '.' to be able to run program without installation
 # RW_GAME_DIR = /var/games
 
-# uncomment this if your system has no joystick include file
+# uncomment if system has no joystick include file
 # JOYSTICK = -DNO_JOYSTICK
 
-# choose if you want to allow many global score file entries for one player
-# default is 'MANY_PER_NAME'
-# when installing the game in a multi user environment, choose this
+# choose if more than one global score file entry for one player is allowed
+# (default: MANY_PER_NAME)
+# uncomment to install game in multi-user environment
 # SCORE_ENTRIES = ONE_PER_NAME
-# when installing the game in a single user environment, choose this
+# uncomment to install game in single-user environment (default)
 # SCORE_ENTRIES = MANY_PER_NAME
 
-# specify paths for cross-compiling (only needed for MS-DOS and Win32 build)
+# paths for cross-compiling (only needed for non-native MS-DOS and Win32 build)
 CROSS_PATH_MSDOS=/usr/local/cross-msdos/i386-msdosdjgpp
 CROSS_PATH_WIN32=/usr/local/cross-tools/i386-mingw32msvc
 
-#-----------------------------------------------------------------------------#
-# you should not need to change anything below                                #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# there should be no need to change anything below
+# -----------------------------------------------------------------------------
 
 .EXPORT_ALL_VARIABLES:
 
 SRC_DIR = src
 MAKE_CMD = $(MAKE) -C $(SRC_DIR)
 
-DEFAULT_TARGET = x11
-# DEFAULT_TARGET = sdl
+# DEFAULT_TARGET = x11
+DEFAULT_TARGET = sdl
+
+
+# -----------------------------------------------------------------------------
+# build targets
+# -----------------------------------------------------------------------------
 
 all:
        @$(MAKE_CMD) TARGET=$(DEFAULT_TARGET)
@@ -83,9 +89,9 @@ clean:
        @$(MAKE_CMD) clean
 
 
-#-----------------------------------------------------------------------------#
-# development only stuff                                                      #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
 
 auto-conf:
        @$(MAKE_CMD) auto-conf
@@ -102,6 +108,9 @@ valgrind:
 enginetest:
        ./Scripts/make_enginetest.sh
 
+enginetestcustom:
+       ./Scripts/make_enginetest.sh custom
+
 enginetestfast:
        ./Scripts/make_enginetest.sh fast
 
index 3ca01a688fd62799edd80e95058442624e042d60..61285b02c2878a4bcaafc325f15063b64804edd7 100644 (file)
@@ -1,11 +1,16 @@
-#=============================================================================#
-# Makefile for Rocks'n'Diamonds                                               #
-# (c) 1995-2002 Holger Schemel, info@artsoft.org                              #
-#=============================================================================#
+# =============================================================================
+# Rocks'n'Diamonds Makefile (src)
+# -----------------------------------------------------------------------------
+# (c) 1995-2003 Holger Schemel <info@artsoft.org>
+# =============================================================================
+
+# -----------------------------------------------------------------------------
+# configuration
+# -----------------------------------------------------------------------------
 
 .EXPORT_ALL_VARIABLES:
 
-ifndef PLATFORM                        # platform not specified -- try auto detection
+ifndef PLATFORM                        # no platform specified -- try auto detection
 ifdef COMSPEC
 PLATFORM = msdos
 else
@@ -184,6 +189,10 @@ ICON = $(ICONBASE).o
 endif
 
 
+# -----------------------------------------------------------------------------
+# build targets
+# -----------------------------------------------------------------------------
+
 all: libgame_dir $(PROGNAME)
 
 $(PROGNAME): $(LIBGAME) $(TIMESTAMP_FILE) $(OBJS) $(ICON)
@@ -234,9 +243,9 @@ clean-bin:
 clean: clean-obj clean-ico clean-bin
 
 
-#-----------------------------------------------------------------------------#
-# development only stuff                                                      #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
 
 dist-clean: clean-obj
 
index 72ddb6c7e68dd0d13ea4aca6b579b78dfd76c881..4f989bad88e2d0f399fedaf4f1a54d66185562db 100644 (file)
@@ -141,10 +141,6 @@ element_to_graphic[] =
     EL_BD_BUTTERFLY,                   -1, MV_BIT_DOWN, FALSE,
     IMG_BD_BUTTERFLY_DOWN
   },
-  {
-    EL_BD_BUTTERFLY,                   ACTION_MOVING, -1, FALSE,
-    IMG_BD_BUTTERFLY_MOVING
-  },
   {
     EL_BD_FIREFLY,                     -1, -1, FALSE,
     IMG_BD_FIREFLY
@@ -181,10 +177,6 @@ element_to_graphic[] =
     EL_BD_FIREFLY,                     -1, MV_BIT_DOWN, FALSE,
     IMG_BD_FIREFLY_DOWN
   },
-  {
-    EL_BD_FIREFLY,                     ACTION_MOVING, -1, FALSE,
-    IMG_BD_FIREFLY_MOVING
-  },
   {
     EL_SP_DEFAULT,                     ACTION_EXPLODING, -1, FALSE,
     IMG_SP_DEFAULT_EXPLODING
@@ -317,10 +309,18 @@ element_to_graphic[] =
     EL_SP_EXIT_CLOSED,                 -1, -1, FALSE,
     IMG_SP_EXIT_CLOSED
   },
+  {
+    EL_SP_EXIT_OPENING,                        -1, -1, FALSE,
+    IMG_SP_EXIT_OPENING
+  },
   {
     EL_SP_EXIT_OPEN,                   -1, -1, FALSE,
     IMG_SP_EXIT_OPEN
   },
+  {
+    EL_SP_EXIT_CLOSING,                        -1, -1, FALSE,
+    IMG_SP_EXIT_CLOSING
+  },
   {
     EL_SP_DISK_ORANGE,                 -1, -1, FALSE,
     IMG_SP_DISK_ORANGE
@@ -409,6 +409,38 @@ element_to_graphic[] =
     EL_SP_SNIKSNAK,                    -1, MV_BIT_DOWN, FALSE,
     IMG_SP_SNIKSNAK_DOWN
   },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_LEFT, MV_BIT_UP, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_UP
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_LEFT, MV_BIT_DOWN, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_DOWN
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_RIGHT, MV_BIT_UP, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_UP
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_RIGHT, MV_BIT_DOWN, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_DOWN
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_UP, MV_BIT_LEFT, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_UP_LEFT
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_UP, MV_BIT_RIGHT, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_UP_RIGHT
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_DOWN, MV_BIT_LEFT, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_LEFT
+  },
+  {
+    EL_SP_SNIKSNAK,                    ACTION_TURNING_FROM_DOWN, MV_BIT_RIGHT, FALSE,
+    IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_RIGHT
+  },
   {
     EL_SP_ELECTRON,                    -1, -1, FALSE,
     IMG_SP_ELECTRON
@@ -681,6 +713,38 @@ element_to_graphic[] =
     EL_BUG,                            ACTION_MOVING, MV_BIT_DOWN, FALSE,
     IMG_BUG_MOVING_DOWN
   },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_RIGHT, MV_BIT_UP, FALSE,
+    IMG_BUG_TURNING_FROM_RIGHT_UP
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_UP, MV_BIT_LEFT, FALSE,
+    IMG_BUG_TURNING_FROM_UP_LEFT
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_LEFT, MV_BIT_DOWN, FALSE,
+    IMG_BUG_TURNING_FROM_LEFT_DOWN
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_DOWN, MV_BIT_RIGHT, FALSE,
+    IMG_BUG_TURNING_FROM_DOWN_RIGHT
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_RIGHT, MV_BIT_DOWN, FALSE,
+    IMG_BUG_TURNING_FROM_RIGHT_DOWN
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_UP, MV_BIT_RIGHT, FALSE,
+    IMG_BUG_TURNING_FROM_UP_RIGHT
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_LEFT, MV_BIT_UP, FALSE,
+    IMG_BUG_TURNING_FROM_LEFT_UP
+  },
+  {
+    EL_BUG,                            ACTION_TURNING_FROM_DOWN, MV_BIT_LEFT, FALSE,
+    IMG_BUG_TURNING_FROM_DOWN_LEFT
+  },
   {
     EL_SPACESHIP,                      -1, -1, FALSE,
     IMG_SPACESHIP
@@ -733,6 +797,38 @@ element_to_graphic[] =
     EL_SPACESHIP,                      ACTION_MOVING, MV_BIT_DOWN, FALSE,
     IMG_SPACESHIP_MOVING_DOWN
   },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_RIGHT, MV_BIT_UP, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_RIGHT_UP
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_UP, MV_BIT_LEFT, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_UP_LEFT
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_LEFT, MV_BIT_DOWN, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_LEFT_DOWN
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_DOWN, MV_BIT_RIGHT, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_DOWN_RIGHT
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_RIGHT, MV_BIT_DOWN, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_RIGHT_DOWN
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_UP, MV_BIT_RIGHT, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_UP_RIGHT
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_LEFT, MV_BIT_UP, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_LEFT_UP
+  },
+  {
+    EL_SPACESHIP,                      ACTION_TURNING_FROM_DOWN, MV_BIT_LEFT, FALSE,
+    IMG_SPACESHIP_TURNING_FROM_DOWN_LEFT
+  },
   {
     EL_YAMYAM,                         -1, -1, FALSE,
     IMG_YAMYAM
@@ -1570,20 +1666,20 @@ element_to_graphic[] =
     IMG_PACMAN_DOWN
   },
   {
-    EL_PACMAN,                         ACTION_MOVING, MV_BIT_RIGHT, FALSE,
-    IMG_PACMAN_MOVING_RIGHT
+    EL_PACMAN,                         ACTION_TURNING_FROM_RIGHT, -1, FALSE,
+    IMG_PACMAN_TURNING_FROM_RIGHT
   },
   {
-    EL_PACMAN,                         ACTION_MOVING, MV_BIT_UP, FALSE,
-    IMG_PACMAN_MOVING_UP
+    EL_PACMAN,                         ACTION_TURNING_FROM_UP, -1, FALSE,
+    IMG_PACMAN_TURNING_FROM_UP
   },
   {
-    EL_PACMAN,                         ACTION_MOVING, MV_BIT_LEFT, FALSE,
-    IMG_PACMAN_MOVING_LEFT
+    EL_PACMAN,                         ACTION_TURNING_FROM_LEFT, -1, FALSE,
+    IMG_PACMAN_TURNING_FROM_LEFT
   },
   {
-    EL_PACMAN,                         ACTION_MOVING, MV_BIT_DOWN, FALSE,
-    IMG_PACMAN_MOVING_DOWN
+    EL_PACMAN,                         ACTION_TURNING_FROM_DOWN, -1, FALSE,
+    IMG_PACMAN_TURNING_FROM_DOWN
   },
   {
     EL_LAMP,                           -1, -1, FALSE,
index 03dfbe980887a9966b710fe1bd00c320cfb5316f..de238576bba8f77aad7634571390e9caa4aac055 100644 (file)
@@ -184,6 +184,10 @@ element_to_sound[] =
     EL_SP_EXIT_CLOSED, TRUE,                   ACTION_OPENING,
     SND_CLASS_SP_EXIT_OPENING
   },
+  {
+    EL_SP_EXIT_CLOSED, TRUE,                   ACTION_CLOSING,
+    SND_CLASS_SP_EXIT_CLOSING
+  },
   {
     EL_SP_SNIKSNAK, FALSE,                     ACTION_MOVING,
     SND_SP_SNIKSNAK_MOVING
index 233ea9e9df8ee07850f37c969a660a5703567784..ce5fe3c329a59aefee0f33c181948a8f8fdc3cda 100644 (file)
@@ -39,6 +39,38 @@ element_to_special_graphic[] =
     EL_BD_AMOEBA,                              GFX_SPECIAL_ARG_EDITOR,
     IMG_BD_AMOEBA_EDITOR
   },
+  {
+    EL_BD_BUTTERFLY_RIGHT,                     GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_BUTTERFLY_RIGHT_EDITOR
+  },
+  {
+    EL_BD_BUTTERFLY_UP,                                GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_BUTTERFLY_UP_EDITOR
+  },
+  {
+    EL_BD_BUTTERFLY_LEFT,                      GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_BUTTERFLY_LEFT_EDITOR
+  },
+  {
+    EL_BD_BUTTERFLY_DOWN,                      GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_BUTTERFLY_DOWN_EDITOR
+  },
+  {
+    EL_BD_FIREFLY_RIGHT,                       GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_FIREFLY_RIGHT_EDITOR
+  },
+  {
+    EL_BD_FIREFLY_UP,                          GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_FIREFLY_UP_EDITOR
+  },
+  {
+    EL_BD_FIREFLY_LEFT,                                GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_FIREFLY_LEFT_EDITOR
+  },
+  {
+    EL_BD_FIREFLY_DOWN,                                GFX_SPECIAL_ARG_EDITOR,
+    IMG_BD_FIREFLY_DOWN_EDITOR
+  },
   {
     EL_SP_INFOTRON,                            GFX_SPECIAL_ARG_EDITOR,
     IMG_SP_INFOTRON_EDITOR
index ce9e3f835fd782ca59feed67899a98b967972fa3..1b9fd4ee5ff2fcc296ca78abd0d7197f486d98bd 100644 (file)
@@ -167,27 +167,45 @@ struct ConfigInfo image_config[] =
   { "bd_butterfly.anim_mode",                  "pingpong"              },
   { "bd_butterfly.delay",                      "4"                     },
   { "bd_butterfly.right",                      "RocksElements.pcx"     },
-  { "bd_butterfly.right.xpos",                 "8"                     },
+  { "bd_butterfly.right.xpos",                 "4"                     },
   { "bd_butterfly.right.ypos",                 "12"                    },
-  { "bd_butterfly.right.frames",               "1"                     },
+  { "bd_butterfly.right.frames",               "2"                     },
+  { "bd_butterfly.right.anim_mode",            "pingpong"              },
+  { "bd_butterfly.right.delay",                        "4"                     },
+  { "bd_butterfly.right.EDITOR",               "RocksElements.pcx"     },
+  { "bd_butterfly.right.EDITOR.xpos",          "8"                     },
+  { "bd_butterfly.right.EDITOR.ypos",          "12"                    },
+  { "bd_butterfly.right.EDITOR.frames",                "1"                     },
   { "bd_butterfly.up",                         "RocksElements.pcx"     },
-  { "bd_butterfly.up.xpos",                    "9"                     },
+  { "bd_butterfly.up.xpos",                    "4"                     },
   { "bd_butterfly.up.ypos",                    "12"                    },
-  { "bd_butterfly.up.frames",                  "1"                     },
+  { "bd_butterfly.up.frames",                  "2"                     },
+  { "bd_butterfly.up.anim_mode",               "pingpong"              },
+  { "bd_butterfly.up.delay",                   "4"                     },
+  { "bd_butterfly.up.EDITOR",                  "RocksElements.pcx"     },
+  { "bd_butterfly.up.EDITOR.xpos",             "9"                     },
+  { "bd_butterfly.up.EDITOR.ypos",             "12"                    },
+  { "bd_butterfly.up.EDITOR.frames",           "1"                     },
   { "bd_butterfly.left",                       "RocksElements.pcx"     },
-  { "bd_butterfly.left.xpos",                  "10"                    },
+  { "bd_butterfly.left.xpos",                  "4"                     },
   { "bd_butterfly.left.ypos",                  "12"                    },
-  { "bd_butterfly.left.frames",                        "1"                     },
+  { "bd_butterfly.left.frames",                        "2"                     },
+  { "bd_butterfly.left.anim_mode",             "pingpong"              },
+  { "bd_butterfly.left.delay",                 "4"                     },
+  { "bd_butterfly.left.EDITOR",                        "RocksElements.pcx"     },
+  { "bd_butterfly.left.EDITOR.xpos",           "10"                    },
+  { "bd_butterfly.left.EDITOR.ypos",           "12"                    },
+  { "bd_butterfly.left.EDITOR.frames",         "1"                     },
   { "bd_butterfly.down",                       "RocksElements.pcx"     },
-  { "bd_butterfly.down.xpos",                  "11"                    },
+  { "bd_butterfly.down.xpos",                  "4"                     },
   { "bd_butterfly.down.ypos",                  "12"                    },
-  { "bd_butterfly.down.frames",                        "1"                     },
-  { "bd_butterfly.moving",                     "RocksElements.pcx"     },
-  { "bd_butterfly.moving.xpos",                        "4"                     },
-  { "bd_butterfly.moving.ypos",                        "12"                    },
-  { "bd_butterfly.moving.frames",              "2"                     },
-  { "bd_butterfly.moving.anim_mode",           "pingpong"              },
-  { "bd_butterfly.moving.delay",               "4"                     },
+  { "bd_butterfly.down.frames",                        "2"                     },
+  { "bd_butterfly.down.anim_mode",             "pingpong"              },
+  { "bd_butterfly.down.delay",                 "4"                     },
+  { "bd_butterfly.down.EDITOR",                        "RocksElements.pcx"     },
+  { "bd_butterfly.down.EDITOR.xpos",           "11"                    },
+  { "bd_butterfly.down.EDITOR.ypos",           "12"                    },
+  { "bd_butterfly.down.EDITOR.frames",         "1"                     },
 
   { "bd_firefly",                              "RocksElements.pcx"     },
   { "bd_firefly.xpos",                         "6"                     },
@@ -196,27 +214,45 @@ struct ConfigInfo image_config[] =
   { "bd_firefly.anim_mode",                    "pingpong"              },
   { "bd_firefly.delay",                                "4"                     },
   { "bd_firefly.right",                                "RocksElements.pcx"     },
-  { "bd_firefly.right.xpos",                   "12"                    },
+  { "bd_firefly.right.xpos",                   "6"                     },
   { "bd_firefly.right.ypos",                   "12"                    },
-  { "bd_firefly.right.frames",                 "1"                     },
+  { "bd_firefly.right.frames",                 "2"                     },
+  { "bd_firefly.right.anim_mode",              "pingpong"              },
+  { "bd_firefly.right.delay",                  "4"                     },
+  { "bd_firefly.right.EDITOR",                 "RocksElements.pcx"     },
+  { "bd_firefly.right.EDITOR.xpos",            "12"                    },
+  { "bd_firefly.right.EDITOR.ypos",            "12"                    },
+  { "bd_firefly.right.EDITOR.frames",          "1"                     },
   { "bd_firefly.up",                           "RocksElements.pcx"     },
-  { "bd_firefly.up.xpos",                      "13"                    },
+  { "bd_firefly.up.xpos",                      "6"                     },
   { "bd_firefly.up.ypos",                      "12"                    },
-  { "bd_firefly.up.frames",                    "1"                     },
+  { "bd_firefly.up.frames",                    "2"                     },
+  { "bd_firefly.up.anim_mode",                 "pingpong"              },
+  { "bd_firefly.up.delay",                     "4"                     },
+  { "bd_firefly.up.EDITOR",                    "RocksElements.pcx"     },
+  { "bd_firefly.up.EDITOR.xpos",               "13"                    },
+  { "bd_firefly.up.EDITOR.ypos",               "12"                    },
+  { "bd_firefly.up.EDITOR.frames",             "1"                     },
   { "bd_firefly.left",                         "RocksElements.pcx"     },
-  { "bd_firefly.left.xpos",                    "14"                    },
+  { "bd_firefly.left.xpos",                    "6"                     },
   { "bd_firefly.left.ypos",                    "12"                    },
-  { "bd_firefly.left.frames",                  "1"                     },
+  { "bd_firefly.left.frames",                  "2"                     },
+  { "bd_firefly.left.anim_mode",               "pingpong"              },
+  { "bd_firefly.left.delay",                   "4"                     },
+  { "bd_firefly.left.EDITOR",                  "RocksElements.pcx"     },
+  { "bd_firefly.left.EDITOR.xpos",             "14"                    },
+  { "bd_firefly.left.EDITOR.ypos",             "12"                    },
+  { "bd_firefly.left.EDITOR.frames",           "1"                     },
   { "bd_firefly.down",                         "RocksElements.pcx"     },
-  { "bd_firefly.down.xpos",                    "15"                    },
+  { "bd_firefly.down.xpos",                    "6"                     },
   { "bd_firefly.down.ypos",                    "12"                    },
-  { "bd_firefly.down.frames",                  "1"                     },
-  { "bd_firefly.moving",                       "RocksElements.pcx"     },
-  { "bd_firefly.moving.xpos",                  "6"                     },
-  { "bd_firefly.moving.ypos",                  "12"                    },
-  { "bd_firefly.moving.frames",                        "2"                     },
-  { "bd_firefly.moving.anim_mode",             "pingpong"              },
-  { "bd_firefly.moving.delay",                 "4"                     },
+  { "bd_firefly.down.frames",                  "2"                     },
+  { "bd_firefly.down.anim_mode",               "pingpong"              },
+  { "bd_firefly.down.delay",                   "4"                     },
+  { "bd_firefly.down.EDITOR",                  "RocksElements.pcx"     },
+  { "bd_firefly.down.EDITOR.xpos",             "15"                    },
+  { "bd_firefly.down.EDITOR.ypos",             "12"                    },
+  { "bd_firefly.down.EDITOR.frames",           "1"                     },
 
   /* images for Supaplex style elements and actions */
 
@@ -385,10 +421,18 @@ struct ConfigInfo image_config[] =
   { "sp_exit_closed.xpos",                     "7"                     },
   { "sp_exit_closed.ypos",                     "0"                     },
   { "sp_exit_closed.frames",                   "1"                     },
+  { "sp_exit.opening",                         "RocksSP.pcx"           },
+  { "sp_exit.opening.xpos",                    "7"                     },
+  { "sp_exit.opening.ypos",                    "0"                     },
+  { "sp_exit.opening.frames",                  "1"                     },
   { "sp_exit_open",                            "RocksSP.pcx"           },
   { "sp_exit_open.xpos",                       "7"                     },
   { "sp_exit_open.ypos",                       "0"                     },
   { "sp_exit_open.frames",                     "1"                     },
+  { "sp_exit.closing",                         "RocksSP.pcx"           },
+  { "sp_exit.closing.xpos",                    "7"                     },
+  { "sp_exit.closing.ypos",                    "0"                     },
+  { "sp_exit.closing.frames",                  "1"                     },
 
   { "sp_disk_orange",                          "RocksSP.pcx"           },
   { "sp_disk_orange.xpos",                     "0"                     },
@@ -482,6 +526,38 @@ struct ConfigInfo image_config[] =
   { "sp_sniksnak.down.ypos",                   "9"                     },
   { "sp_sniksnak.down.frames",                 "4"                     },
   { "sp_sniksnak.down.anim_mode",              "pingpong2"             },
+  { "sp_sniksnak.turning_from_left.up",                "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_left.up.xpos",   "12"                    },
+  { "sp_sniksnak.turning_from_left.up.ypos",   "6"                     },
+  { "sp_sniksnak.turning_from_left.up.frames", "1"                     },
+  { "sp_sniksnak.turning_from_left.down",      "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_left.down.xpos", "13"                    },
+  { "sp_sniksnak.turning_from_left.down.ypos", "6"                     },
+  { "sp_sniksnak.turning_from_left.down.frames","1"                    },
+  { "sp_sniksnak.turning_from_right.up",       "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_right.up.xpos",  "15"                    },
+  { "sp_sniksnak.turning_from_right.up.ypos",  "6"                     },
+  { "sp_sniksnak.turning_from_right.up.frames",        "1"                     },
+  { "sp_sniksnak.turning_from_right.down",     "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_right.down.xpos",        "14"                    },
+  { "sp_sniksnak.turning_from_right.down.ypos",        "6"                     },
+  { "sp_sniksnak.turning_from_right.down.frames","1"                   },
+  { "sp_sniksnak.turning_from_up.left",                "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_up.left.xpos",   "12"                    },
+  { "sp_sniksnak.turning_from_up.left.ypos",   "6"                     },
+  { "sp_sniksnak.turning_from_up.left.frames", "1"                     },
+  { "sp_sniksnak.turning_from_up.right",       "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_up.right.xpos",  "15"                    },
+  { "sp_sniksnak.turning_from_up.right.ypos",  "6"                     },
+  { "sp_sniksnak.turning_from_up.right.frames",        "1"                     },
+  { "sp_sniksnak.turning_from_down.left",      "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_down.left.xpos", "13"                    },
+  { "sp_sniksnak.turning_from_down.left.ypos", "6"                     },
+  { "sp_sniksnak.turning_from_down.left.frames","1"                    },
+  { "sp_sniksnak.turning_from_down.right",     "RocksSP.pcx"           },
+  { "sp_sniksnak.turning_from_down.right.xpos",        "14"                    },
+  { "sp_sniksnak.turning_from_down.right.ypos",        "6"                     },
+  { "sp_sniksnak.turning_from_down.right.frames","1"                   },
 
   { "sp_electron",                             "RocksSP.pcx"           },
   { "sp_electron.xpos",                                "8"                     },
@@ -812,6 +888,54 @@ struct ConfigInfo image_config[] =
   { "bug.moving.down.frames",                  "2"                     },
   { "bug.moving.down.delay",                   "4"                     },
   { "bug.moving.down.offset",                  "128"                   },
+  { "bug.turning_from_right.up",               "RocksMore.pcx"         },
+  { "bug.turning_from_right.up.xpos",          "0"                     },
+  { "bug.turning_from_right.up.ypos",          "6"                     },
+  { "bug.turning_from_right.up.frames",                "4"                     },
+  { "bug.turning_from_right.up.delay",         "2"                     },
+  { "bug.turning_from_right.up.anim_mode",     "linear,reverse"        },
+  { "bug.turning_from_up.left",                        "RocksMore.pcx"         },
+  { "bug.turning_from_up.left.xpos",           "12"                    },
+  { "bug.turning_from_up.left.ypos",           "6"                     },
+  { "bug.turning_from_up.left.frames",         "4"                     },
+  { "bug.turning_from_up.left.delay",          "2"                     },
+  { "bug.turning_from_up.left.anim_mode",      "linear,reverse"        },
+  { "bug.turning_from_left.down",              "RocksMore.pcx"         },
+  { "bug.turning_from_left.down.xpos",         "8"                     },
+  { "bug.turning_from_left.down.ypos",         "6"                     },
+  { "bug.turning_from_left.down.frames",       "4"                     },
+  { "bug.turning_from_left.down.delay",                "2"                     },
+  { "bug.turning_from_left.down.anim_mode",    "linear,reverse"        },
+  { "bug.turning_from_down.right",             "RocksMore.pcx"         },
+  { "bug.turning_from_down.right.xpos",                "4"                     },
+  { "bug.turning_from_down.right.ypos",                "6"                     },
+  { "bug.turning_from_down.right.frames",      "4"                     },
+  { "bug.turning_from_down.right.delay",       "2"                     },
+  { "bug.turning_from_down.right.anim_mode",   "linear,reverse"        },
+  { "bug.turning_from_right.down",             "RocksMore.pcx"         },
+  { "bug.turning_from_right.down.xpos",                "5"                     },
+  { "bug.turning_from_right.down.ypos",                "6"                     },
+  { "bug.turning_from_right.down.frames",      "4"                     },
+  { "bug.turning_from_right.down.delay",       "2"                     },
+  { "bug.turning_from_right.down.anim_mode",   "linear"                },
+  { "bug.turning_from_up.right",               "RocksMore.pcx"         },
+  { "bug.turning_from_up.right.xpos",          "1"                     },
+  { "bug.turning_from_up.right.ypos",          "6"                     },
+  { "bug.turning_from_up.right.frames",                "4"                     },
+  { "bug.turning_from_up.right.delay",         "2"                     },
+  { "bug.turning_from_up.right.anim_mode",     "linear"                },
+  { "bug.turning_from_left.up",                        "RocksMore.pcx"         },
+  { "bug.turning_from_left.up.xpos",           "13"                    },
+  { "bug.turning_from_left.up.ypos",           "6"                     },
+  { "bug.turning_from_left.up.frames",         "4"                     },
+  { "bug.turning_from_left.up.delay",          "2"                     },
+  { "bug.turning_from_left.up.anim_mode",      "linear"                },
+  { "bug.turning_from_down.left",              "RocksMore.pcx"         },
+  { "bug.turning_from_down.left.xpos",         "9"                     },
+  { "bug.turning_from_down.left.ypos",         "6"                     },
+  { "bug.turning_from_down.left.frames",       "4"                     },
+  { "bug.turning_from_down.left.delay",                "2"                     },
+  { "bug.turning_from_down.left.anim_mode",    "linear"                },
 
   { "spaceship",                               "RocksElements.pcx"     },
   { "spaceship.xpos",                          "8"                     },
@@ -858,6 +982,54 @@ struct ConfigInfo image_config[] =
   { "spaceship.moving.down.frames",            "2"                     },
   { "spaceship.moving.down.delay",             "4"                     },
   { "spaceship.moving.down.offset",            "128"                   },
+  { "spaceship.turning_from_right.up",         "RocksMore.pcx"         },
+  { "spaceship.turning_from_right.up.xpos",    "0"                     },
+  { "spaceship.turning_from_right.up.ypos",    "5"                     },
+  { "spaceship.turning_from_right.up.frames",  "4"                     },
+  { "spaceship.turning_from_right.up.delay",   "2"                     },
+  { "spaceship.turning_from_right.up.anim_mode","linear,reverse"       },
+  { "spaceship.turning_from_up.left",          "RocksMore.pcx"         },
+  { "spaceship.turning_from_up.left.xpos",     "12"                    },
+  { "spaceship.turning_from_up.left.ypos",     "5"                     },
+  { "spaceship.turning_from_up.left.frames",   "4"                     },
+  { "spaceship.turning_from_up.left.delay",    "2"                     },
+  { "spaceship.turning_from_up.left.anim_mode",        "linear,reverse"        },
+  { "spaceship.turning_from_left.down",                "RocksMore.pcx"         },
+  { "spaceship.turning_from_left.down.xpos",   "8"                     },
+  { "spaceship.turning_from_left.down.ypos",   "5"                     },
+  { "spaceship.turning_from_left.down.frames", "4"                     },
+  { "spaceship.turning_from_left.down.delay",  "2"                     },
+  { "spaceship.turning_from_left.down.anim_mode","linear,reverse"      },
+  { "spaceship.turning_from_down.right",       "RocksMore.pcx"         },
+  { "spaceship.turning_from_down.right.xpos",  "4"                     },
+  { "spaceship.turning_from_down.right.ypos",  "5"                     },
+  { "spaceship.turning_from_down.right.frames",        "4"                     },
+  { "spaceship.turning_from_down.right.delay", "2"                     },
+  { "spaceship.turning_from_down.right.anim_mode","linear,reverse"     },
+  { "spaceship.turning_from_right.down",       "RocksMore.pcx"         },
+  { "spaceship.turning_from_right.down.xpos",  "5"                     },
+  { "spaceship.turning_from_right.down.ypos",  "5"                     },
+  { "spaceship.turning_from_right.down.frames",        "4"                     },
+  { "spaceship.turning_from_right.down.delay", "2"                     },
+  { "spaceship.turning_from_right.down.anim_mode","linear"             },
+  { "spaceship.turning_from_up.right",         "RocksMore.pcx"         },
+  { "spaceship.turning_from_up.right.xpos",    "1"                     },
+  { "spaceship.turning_from_up.right.ypos",    "5"                     },
+  { "spaceship.turning_from_up.right.frames",  "4"                     },
+  { "spaceship.turning_from_up.right.delay",   "2"                     },
+  { "spaceship.turning_from_up.right.anim_mode","linear"               },
+  { "spaceship.turning_from_left.up",          "RocksMore.pcx"         },
+  { "spaceship.turning_from_left.up.xpos",     "13"                    },
+  { "spaceship.turning_from_left.up.ypos",     "5"                     },
+  { "spaceship.turning_from_left.up.frames",   "4"                     },
+  { "spaceship.turning_from_left.up.delay",    "2"                     },
+  { "spaceship.turning_from_left.up.anim_mode",        "linear"                },
+  { "spaceship.turning_from_down.left",                "RocksMore.pcx"         },
+  { "spaceship.turning_from_down.left.xpos",   "9"                     },
+  { "spaceship.turning_from_down.left.ypos",   "5"                     },
+  { "spaceship.turning_from_down.left.frames", "4"                     },
+  { "spaceship.turning_from_down.left.delay",  "2"                     },
+  { "spaceship.turning_from_down.left.anim_mode","linear"              },
 
   { "yamyam",                                  "RocksElements.pcx"     },
   { "yamyam.xpos",                             "0"                     },
@@ -1769,52 +1941,47 @@ struct ConfigInfo image_config[] =
   { "pacman",                                  "RocksElements.pcx"     },
   { "pacman.xpos",                             "8"                     },
   { "pacman.ypos",                             "5"                     },
-  { "pacman.frames",                           "4"                     },
-  { "pacman.delay",                            "8"                     },
+  { "pacman.frames",                           "1"                     },
   { "pacman.right",                            "RocksElements.pcx"     },
   { "pacman.right.xpos",                       "8"                     },
   { "pacman.right.ypos",                       "5"                     },
-  { "pacman.right.frames",                     "1"                     },
+  { "pacman.right.frames",                     "2"                     },
+  { "pacman.right.delay",                      "4"                     },
+  { "pacman.right.offset",                     "128"                   },
   { "pacman.up",                               "RocksElements.pcx"     },
   { "pacman.up.xpos",                          "9"                     },
   { "pacman.up.ypos",                          "5"                     },
-  { "pacman.up.frames",                                "1"                     },
+  { "pacman.up.frames",                                "2"                     },
+  { "pacman.up.delay",                         "4"                     },
+  { "pacman.up.offset",                                "128"                   },
   { "pacman.left",                             "RocksElements.pcx"     },
   { "pacman.left.xpos",                                "10"                    },
   { "pacman.left.ypos",                                "5"                     },
-  { "pacman.left.frames",                      "1"                     },
+  { "pacman.left.frames",                      "2"                     },
+  { "pacman.left.delay",                       "4"                     },
+  { "pacman.left.offset",                      "128"                   },
   { "pacman.down",                             "RocksElements.pcx"     },
   { "pacman.down.xpos",                                "11"                    },
   { "pacman.down.ypos",                                "5"                     },
-  { "pacman.down.frames",                      "1"                     },
-  { "pacman.moving.right",                     "RocksElements.pcx"     },
-  { "pacman.moving.right.xpos",                        "8"                     },
-  { "pacman.moving.right.ypos",                        "5"                     },
-  { "pacman.moving.right.frames",              "2"                     },
-  { "pacman.moving.right.anim_mode",           "reverse"               },
-  { "pacman.moving.right.delay",               "4"                     },
-  { "pacman.moving.right.offset",              "128"                   },
-  { "pacman.moving.up",                                "RocksElements.pcx"     },
-  { "pacman.moving.up.xpos",                   "9"                     },
-  { "pacman.moving.up.ypos",                   "5"                     },
-  { "pacman.moving.up.frames",                 "2"                     },
-  { "pacman.moving.up.anim_mode",              "reverse"               },
-  { "pacman.moving.up.delay",                  "4"                     },
-  { "pacman.moving.up.offset",                 "128"                   },
-  { "pacman.moving.left",                      "RocksElements.pcx"     },
-  { "pacman.moving.left.xpos",                 "10"                    },
-  { "pacman.moving.left.ypos",                 "5"                     },
-  { "pacman.moving.left.frames",               "2"                     },
-  { "pacman.moving.left.anim_mode",            "reverse"               },
-  { "pacman.moving.left.delay",                        "4"                     },
-  { "pacman.moving.left.offset",               "128"                   },
-  { "pacman.moving.down",                      "RocksElements.pcx"     },
-  { "pacman.moving.down.xpos",                 "11"                    },
-  { "pacman.moving.down.ypos",                 "5"                     },
-  { "pacman.moving.down.frames",               "2"                     },
-  { "pacman.moving.down.anim_mode",            "reverse"               },
-  { "pacman.moving.down.delay",                        "4"                     },
-  { "pacman.moving.down.offset",               "128"                   },
+  { "pacman.down.frames",                      "2"                     },
+  { "pacman.down.delay",                       "4"                     },
+  { "pacman.down.offset",                      "128"                   },
+  { "pacman.turning_from_right",               "RocksElements.pcx"     },
+  { "pacman.turning_from_right.xpos",          "12"                    },
+  { "pacman.turning_from_right.ypos",          "5"                     },
+  { "pacman.turning_from_right.frames",                "1"                     },
+  { "pacman.turning_from_up",                  "RocksElements.pcx"     },
+  { "pacman.turning_from_up.xpos",             "13"                    },
+  { "pacman.turning_from_up.ypos",             "5"                     },
+  { "pacman.turning_from_up.frames",           "1"                     },
+  { "pacman.turning_from_left",                        "RocksElements.pcx"     },
+  { "pacman.turning_from_left.xpos",           "14"                    },
+  { "pacman.turning_from_left.ypos",           "5"                     },
+  { "pacman.turning_from_left.frames",         "1"                     },
+  { "pacman.turning_from_down",                        "RocksElements.pcx"     },
+  { "pacman.turning_from_down.xpos",           "15"                    },
+  { "pacman.turning_from_down.ypos",           "5"                     },
+  { "pacman.turning_from_down.frames",         "1"                     },
 
   { "lamp",                                    "RocksElements.pcx"     },
   { "lamp.xpos",                               "0"                     },
@@ -3063,13 +3230,13 @@ struct ConfigInfo image_config[] =
   { "toon_6.direction",                                "left"                  },
   { "toon_6.position",                         "upper"                 },
 
-  { "toon_7",                                  "RocksHeroes.pcx"       },
+  { "toon_7",                                  "RocksMore.pcx"         },
   { "toon_7.xpos",                             "0"                     },
-  { "toon_7.ypos",                             "1"                     },
-  { "toon_7.frames",                           "4"                     },
-  { "toon_7.delay",                            "4"                     },
-  { "toon_7.direction",                                "left"                  },
-  { "toon_7.position",                         "bottom"                },
+  { "toon_7.ypos",                             "6"                     },
+  { "toon_7.frames",                           "16"                    },
+  { "toon_7.delay",                            "2"                     },
+  { "toon_7.direction",                                "down"                  },
+  { "toon_7.position",                         "any"                   },
 
   { "toon_8",                                  "RocksHeroes.pcx"       },
   { "toon_8.xpos",                             "4"                     },
index 166190d79611506396b7765b94931ec4b2794408..5aa17748dfa4cfb74c990ee637c5772951da1584 100644 (file)
 #define IMG_BD_AMOEBA_EDITOR                           18
 #define IMG_BD_BUTTERFLY                               19
 #define IMG_BD_BUTTERFLY_RIGHT                         20
-#define IMG_BD_BUTTERFLY_UP                            21
-#define IMG_BD_BUTTERFLY_LEFT                          22
-#define IMG_BD_BUTTERFLY_DOWN                          23
-#define IMG_BD_BUTTERFLY_MOVING                                24
-#define IMG_BD_FIREFLY                                 25
-#define IMG_BD_FIREFLY_RIGHT                           26
-#define IMG_BD_FIREFLY_UP                              27
-#define IMG_BD_FIREFLY_LEFT                            28
-#define IMG_BD_FIREFLY_DOWN                            29
-#define IMG_BD_FIREFLY_MOVING                          30
-#define IMG_SP_DEFAULT_EXPLODING                       31
-#define IMG_SP_ZONK                                    32
-#define IMG_SP_ZONK_MOVING_LEFT                                33
-#define IMG_SP_ZONK_MOVING_RIGHT                       34
-#define IMG_SP_ZONK_PUSHING_LEFT                       35
-#define IMG_SP_ZONK_PUSHING_RIGHT                      36
-#define IMG_SP_BASE                                    37
-#define IMG_SP_MURPHY                                  38
-#define IMG_SP_MURPHY_MOVING_LEFT                      39
-#define IMG_SP_MURPHY_MOVING_RIGHT                     40
-#define IMG_SP_MURPHY_DIGGING_LEFT                     41
-#define IMG_SP_MURPHY_DIGGING_RIGHT                    42
-#define IMG_SP_MURPHY_COLLECTING_LEFT                  43
-#define IMG_SP_MURPHY_COLLECTING_RIGHT                 44
-#define IMG_SP_MURPHY_PUSHING_LEFT                     45
-#define IMG_SP_MURPHY_PUSHING_RIGHT                    46
-#define IMG_SP_MURPHY_SNAPPING_LEFT                    47
-#define IMG_SP_MURPHY_SNAPPING_RIGHT                   48
-#define IMG_SP_MURPHY_SNAPPING_UP                      49
-#define IMG_SP_MURPHY_SNAPPING_DOWN                    50
-#define IMG_SP_MURPHY_CLONE                            51
-#define IMG_SP_INFOTRON                                        52
-#define IMG_SP_INFOTRON_EDITOR                         53
-#define IMG_SP_CHIP_SINGLE                             54
-#define IMG_SP_CHIP_LEFT                               55
-#define IMG_SP_CHIP_RIGHT                              56
-#define IMG_SP_CHIP_TOP                                        57
-#define IMG_SP_CHIP_BOTTOM                             58
-#define IMG_SP_HARDWARE_GRAY                           59
-#define IMG_SP_HARDWARE_GREEN                          60
-#define IMG_SP_HARDWARE_BLUE                           61
-#define IMG_SP_HARDWARE_RED                            62
-#define IMG_SP_HARDWARE_YELLOW                         63
-#define IMG_SP_EXIT_CLOSED                             64
-#define IMG_SP_EXIT_OPEN                               65
-#define IMG_SP_DISK_ORANGE                             66
-#define IMG_SP_DISK_YELLOW                             67
-#define IMG_SP_DISK_RED                                        68
-#define IMG_SP_DISK_RED_COLLECTING                     69
-#define IMG_SP_DISK_RED_ACTIVE                         70
-#define IMG_SP_PORT_RIGHT                              71
-#define IMG_SP_PORT_DOWN                               72
-#define IMG_SP_PORT_LEFT                               73
-#define IMG_SP_PORT_UP                                 74
-#define IMG_SP_PORT_HORIZONTAL                         75
-#define IMG_SP_PORT_VERTICAL                           76
-#define IMG_SP_PORT_ANY                                        77
-#define IMG_SP_GRAVITY_PORT_RIGHT                      78
-#define IMG_SP_GRAVITY_PORT_DOWN                       79
-#define IMG_SP_GRAVITY_PORT_LEFT                       80
-#define IMG_SP_GRAVITY_PORT_UP                         81
-#define IMG_SP_SNIKSNAK                                        82
-#define IMG_SP_SNIKSNAK_LEFT                           83
-#define IMG_SP_SNIKSNAK_RIGHT                          84
-#define IMG_SP_SNIKSNAK_UP                             85
-#define IMG_SP_SNIKSNAK_DOWN                           86
-#define IMG_SP_ELECTRON                                        87
-#define IMG_SP_ELECTRON_EDITOR                         88
-#define IMG_SP_ELECTRON_EXPLODING                      89
-#define IMG_SP_TERMINAL                                        90
-#define IMG_SP_TERMINAL_EDITOR                         91
-#define IMG_SP_TERMINAL_ACTIVE                         92
-#define IMG_SP_BUGGY_BASE                              93
-#define IMG_SP_BUGGY_BASE_EDITOR                       94
-#define IMG_SP_BUGGY_BASE_ACTIVATING                   95
-#define IMG_SP_BUGGY_BASE_ACTIVE                       96
-#define IMG_SP_HARDWARE_BASE_1                         97
-#define IMG_SP_HARDWARE_BASE_2                         98
-#define IMG_SP_HARDWARE_BASE_3                         99
-#define IMG_SP_HARDWARE_BASE_4                         100
-#define IMG_SP_HARDWARE_BASE_5                         101
-#define IMG_SP_HARDWARE_BASE_6                         102
-#define IMG_SOKOBAN_OBJECT                             103
-#define IMG_SOKOBAN_OBJECT_EDITOR                      104
-#define IMG_SOKOBAN_FIELD_EMPTY                                105
-#define IMG_SOKOBAN_FIELD_FULL                         106
-#define IMG_EMPTY_SPACE                                        107
-#define IMG_SAND                                       108
-#define IMG_SAND_CRUMBLED                              109
-#define IMG_SAND_DIGGING_LEFT                          110
-#define IMG_SAND_DIGGING_RIGHT                         111
-#define IMG_SAND_DIGGING_UP                            112
-#define IMG_SAND_DIGGING_DOWN                          113
-#define IMG_SAND_DIGGING_LEFT_CRUMBLED                 114
-#define IMG_SAND_DIGGING_RIGHT_CRUMBLED                        115
-#define IMG_SAND_DIGGING_UP_CRUMBLED                   116
-#define IMG_SAND_DIGGING_DOWN_CRUMBLED                 117
-#define IMG_WALL                                       118
-#define IMG_WALL_SLIPPERY                              119
-#define IMG_STEELWALL                                  120
-#define IMG_ROCK                                       121
-#define IMG_ROCK_MOVING_LEFT                           122
-#define IMG_ROCK_MOVING_RIGHT                          123
-#define IMG_ROCK_PUSHING_LEFT                          124
-#define IMG_ROCK_PUSHING_RIGHT                         125
-#define IMG_EMERALD                                    126
-#define IMG_EMERALD_MOVING                             127
-#define IMG_EMERALD_FALLING                            128
-#define IMG_EMERALD_COLLECTING                         129
-#define IMG_DIAMOND                                    130
-#define IMG_DIAMOND_MOVING                             131
-#define IMG_DIAMOND_FALLING                            132
-#define IMG_DIAMOND_COLLECTING                         133
-#define IMG_BOMB                                       134
-#define IMG_NUT                                                135
-#define IMG_NUT_BREAKING                               136
-#define IMG_DYNAMITE                                   137
-#define IMG_DYNAMITE_EDITOR                            138
-#define IMG_DYNAMITE_ACTIVE                            139
-#define IMG_DYNAMITE_ACTIVE_EDITOR                     140
-#define IMG_WALL_EMERALD                               141
-#define IMG_WALL_DIAMOND                               142
-#define IMG_BUG                                                143
-#define IMG_BUG_RIGHT                                  144
-#define IMG_BUG_UP                                     145
-#define IMG_BUG_LEFT                                   146
-#define IMG_BUG_DOWN                                   147
-#define IMG_BUG_MOVING_RIGHT                           148
-#define IMG_BUG_MOVING_UP                              149
-#define IMG_BUG_MOVING_LEFT                            150
-#define IMG_BUG_MOVING_DOWN                            151
-#define IMG_SPACESHIP                                  152
-#define IMG_SPACESHIP_RIGHT                            153
-#define IMG_SPACESHIP_UP                               154
-#define IMG_SPACESHIP_LEFT                             155
-#define IMG_SPACESHIP_DOWN                             156
-#define IMG_SPACESHIP_MOVING_RIGHT                     157
-#define IMG_SPACESHIP_MOVING_UP                                158
-#define IMG_SPACESHIP_MOVING_LEFT                      159
-#define IMG_SPACESHIP_MOVING_DOWN                      160
-#define IMG_YAMYAM                                     161
-#define IMG_YAMYAM_MOVING                              162
-#define IMG_ROBOT                                      163
-#define IMG_ROBOT_MOVING                               164
-#define IMG_ROBOT_WHEEL                                        165
-#define IMG_ROBOT_WHEEL_ACTIVE                         166
-#define IMG_MAGIC_WALL                                 167
-#define IMG_MAGIC_WALL_ACTIVE                          168
-#define IMG_MAGIC_WALL_FILLING                         169
-#define IMG_MAGIC_WALL_FULL                            170
-#define IMG_MAGIC_WALL_EMPTYING                                171
-#define IMG_MAGIC_WALL_DEAD                            172
-#define IMG_QUICKSAND_EMPTY                            173
-#define IMG_QUICKSAND_FILLING                          174
-#define IMG_QUICKSAND_FULL                             175
-#define IMG_QUICKSAND_FULL_EDITOR                      176
-#define IMG_QUICKSAND_EMPTYING                         177
-#define IMG_ACID_POOL_TOPLEFT                          178
-#define IMG_ACID_POOL_TOPRIGHT                         179
-#define IMG_ACID_POOL_BOTTOMLEFT                       180
-#define IMG_ACID_POOL_BOTTOM                           181
-#define IMG_ACID_POOL_BOTTOMRIGHT                      182
-#define IMG_ACID                                       183
-#define IMG_ACID_SPLASH_LEFT                           184
-#define IMG_ACID_SPLASH_RIGHT                          185
-#define IMG_AMOEBA_DROP                                        186
-#define IMG_AMOEBA_GROWING                             187
-#define IMG_AMOEBA_SHRINKING                           188
-#define IMG_AMOEBA_WET                                 189
-#define IMG_AMOEBA_WET_EDITOR                          190
-#define IMG_AMOEBA_DROPPING                            191
-#define IMG_AMOEBA_DRY                                 192
-#define IMG_AMOEBA_FULL                                        193
-#define IMG_AMOEBA_FULL_EDITOR                         194
-#define IMG_AMOEBA_DEAD                                        195
-#define IMG_AMOEBA_DEAD_EDITOR                         196
-#define IMG_EM_KEY_1                                   197
-#define IMG_EM_KEY_2                                   198
-#define IMG_EM_KEY_3                                   199
-#define IMG_EM_KEY_4                                   200
-#define IMG_EM_GATE_1                                  201
-#define IMG_EM_GATE_2                                  202
-#define IMG_EM_GATE_3                                  203
-#define IMG_EM_GATE_4                                  204
-#define IMG_EM_GATE_1_GRAY                             205
-#define IMG_EM_GATE_1_GRAY_EDITOR                      206
-#define IMG_EM_GATE_2_GRAY                             207
-#define IMG_EM_GATE_2_GRAY_EDITOR                      208
-#define IMG_EM_GATE_3_GRAY                             209
-#define IMG_EM_GATE_3_GRAY_EDITOR                      210
-#define IMG_EM_GATE_4_GRAY                             211
-#define IMG_EM_GATE_4_GRAY_EDITOR                      212
-#define IMG_EXIT_CLOSED                                        213
-#define IMG_EXIT_OPENING                               214
-#define IMG_EXIT_OPEN                                  215
-#define IMG_EXIT_CLOSING                               216
-#define IMG_BALLOON                                    217
-#define IMG_BALLOON_MOVING                             218
-#define IMG_BALLOON_PUSHING                            219
-#define IMG_BALLOON_SWITCH_LEFT                                220
-#define IMG_BALLOON_SWITCH_RIGHT                       221
-#define IMG_BALLOON_SWITCH_UP                          222
-#define IMG_BALLOON_SWITCH_DOWN                                223
-#define IMG_BALLOON_SWITCH_ANY                         224
-#define IMG_SPRING                                     225
-#define IMG_EMC_STEELWALL_1                            226
-#define IMG_EMC_STEELWALL_2                            227
-#define IMG_EMC_STEELWALL_3                            228
-#define IMG_EMC_STEELWALL_4                            229
-#define IMG_EMC_WALL_1                                 230
-#define IMG_EMC_WALL_2                                 231
-#define IMG_EMC_WALL_3                                 232
-#define IMG_EMC_WALL_4                                 233
-#define IMG_EMC_WALL_5                                 234
-#define IMG_EMC_WALL_6                                 235
-#define IMG_EMC_WALL_7                                 236
-#define IMG_EMC_WALL_8                                 237
-#define IMG_INVISIBLE_STEELWALL                                238
-#define IMG_INVISIBLE_STEELWALL_EDITOR                 239
-#define IMG_INVISIBLE_STEELWALL_ACTIVE                 240
-#define IMG_INVISIBLE_WALL                             241
-#define IMG_INVISIBLE_WALL_EDITOR                      242
-#define IMG_INVISIBLE_WALL_ACTIVE                      243
-#define IMG_INVISIBLE_SAND                             244
-#define IMG_INVISIBLE_SAND_EDITOR                      245
-#define IMG_INVISIBLE_SAND_ACTIVE                      246
-#define IMG_CONVEYOR_BELT_1_MIDDLE                     247
-#define IMG_CONVEYOR_BELT_1_MIDDLE_ACTIVE              248
-#define IMG_CONVEYOR_BELT_1_LEFT                       249
-#define IMG_CONVEYOR_BELT_1_LEFT_ACTIVE                        250
-#define IMG_CONVEYOR_BELT_1_RIGHT                      251
-#define IMG_CONVEYOR_BELT_1_RIGHT_ACTIVE               252
-#define IMG_CONVEYOR_BELT_1_SWITCH_LEFT                        253
-#define IMG_CONVEYOR_BELT_1_SWITCH_MIDDLE              254
-#define IMG_CONVEYOR_BELT_1_SWITCH_RIGHT               255
-#define IMG_CONVEYOR_BELT_2_MIDDLE                     256
-#define IMG_CONVEYOR_BELT_2_MIDDLE_ACTIVE              257
-#define IMG_CONVEYOR_BELT_2_LEFT                       258
-#define IMG_CONVEYOR_BELT_2_LEFT_ACTIVE                        259
-#define IMG_CONVEYOR_BELT_2_RIGHT                      260
-#define IMG_CONVEYOR_BELT_2_RIGHT_ACTIVE               261
-#define IMG_CONVEYOR_BELT_2_SWITCH_LEFT                        262
-#define IMG_CONVEYOR_BELT_2_SWITCH_MIDDLE              263
-#define IMG_CONVEYOR_BELT_2_SWITCH_RIGHT               264
-#define IMG_CONVEYOR_BELT_3_MIDDLE                     265
-#define IMG_CONVEYOR_BELT_3_MIDDLE_ACTIVE              266
-#define IMG_CONVEYOR_BELT_3_LEFT                       267
-#define IMG_CONVEYOR_BELT_3_LEFT_ACTIVE                        268
-#define IMG_CONVEYOR_BELT_3_RIGHT                      269
-#define IMG_CONVEYOR_BELT_3_RIGHT_ACTIVE               270
-#define IMG_CONVEYOR_BELT_3_SWITCH_LEFT                        271
-#define IMG_CONVEYOR_BELT_3_SWITCH_MIDDLE              272
-#define IMG_CONVEYOR_BELT_3_SWITCH_RIGHT               273
-#define IMG_CONVEYOR_BELT_4_MIDDLE                     274
-#define IMG_CONVEYOR_BELT_4_MIDDLE_ACTIVE              275
-#define IMG_CONVEYOR_BELT_4_LEFT                       276
-#define IMG_CONVEYOR_BELT_4_LEFT_ACTIVE                        277
-#define IMG_CONVEYOR_BELT_4_RIGHT                      278
-#define IMG_CONVEYOR_BELT_4_RIGHT_ACTIVE               279
-#define IMG_CONVEYOR_BELT_4_SWITCH_LEFT                        280
-#define IMG_CONVEYOR_BELT_4_SWITCH_MIDDLE              281
-#define IMG_CONVEYOR_BELT_4_SWITCH_RIGHT               282
-#define IMG_SWITCHGATE_SWITCH_UP                       283
-#define IMG_SWITCHGATE_SWITCH_DOWN                     284
-#define IMG_LIGHT_SWITCH                               285
-#define IMG_LIGHT_SWITCH_ACTIVE                                286
-#define IMG_TIMEGATE_SWITCH                            287
-#define IMG_TIMEGATE_SWITCH_ACTIVE                     288
-#define IMG_ENVELOPE_1                                 289
-#define IMG_ENVELOPE_1_COLLECTING                      290
-#define IMG_ENVELOPE_2                                 291
-#define IMG_ENVELOPE_2_COLLECTING                      292
-#define IMG_ENVELOPE_3                                 293
-#define IMG_ENVELOPE_3_COLLECTING                      294
-#define IMG_ENVELOPE_4                                 295
-#define IMG_ENVELOPE_4_COLLECTING                      296
-#define IMG_SIGN_EXCLAMATION                           297
-#define IMG_SIGN_STOP                                  298
-#define IMG_LANDMINE                                   299
-#define IMG_STEELWALL_SLIPPERY                         300
-#define IMG_EXTRA_TIME                                 301
-#define IMG_SHIELD_NORMAL                              302
-#define IMG_SHIELD_NORMAL_ACTIVE                       303
-#define IMG_SHIELD_DEADLY                              304
-#define IMG_SHIELD_DEADLY_ACTIVE                       305
-#define IMG_SWITCHGATE_CLOSED                          306
-#define IMG_SWITCHGATE_OPENING                         307
-#define IMG_SWITCHGATE_OPEN                            308
-#define IMG_SWITCHGATE_CLOSING                         309
-#define IMG_TIMEGATE_CLOSED                            310
-#define IMG_TIMEGATE_OPENING                           311
-#define IMG_TIMEGATE_OPEN                              312
-#define IMG_TIMEGATE_CLOSING                           313
-#define IMG_PEARL                                      314
-#define IMG_PEARL_BREAKING                             315
-#define IMG_CRYSTAL                                    316
-#define IMG_WALL_PEARL                                 317
-#define IMG_WALL_CRYSTAL                               318
-#define IMG_TUBE_RIGHT_DOWN                            319
-#define IMG_TUBE_HORIZONTAL_DOWN                       320
-#define IMG_TUBE_LEFT_DOWN                             321
-#define IMG_TUBE_HORIZONTAL                            322
-#define IMG_TUBE_VERTICAL_RIGHT                                323
-#define IMG_TUBE_ANY                                   324
-#define IMG_TUBE_VERTICAL_LEFT                         325
-#define IMG_TUBE_VERTICAL                              326
-#define IMG_TUBE_RIGHT_UP                              327
-#define IMG_TUBE_HORIZONTAL_UP                         328
-#define IMG_TUBE_LEFT_UP                               329
-#define IMG_TRAP                                       330
-#define IMG_TRAP_ACTIVE                                        331
-#define IMG_DX_SUPABOMB                                        332
-#define IMG_KEY_1                                      333
-#define IMG_KEY_1_EDITOR                               334
-#define IMG_KEY_2                                      335
-#define IMG_KEY_2_EDITOR                               336
-#define IMG_KEY_3                                      337
-#define IMG_KEY_3_EDITOR                               338
-#define IMG_KEY_4                                      339
-#define IMG_KEY_4_EDITOR                               340
-#define IMG_GATE_1                                     341
-#define IMG_GATE_2                                     342
-#define IMG_GATE_3                                     343
-#define IMG_GATE_4                                     344
-#define IMG_GATE_1_GRAY                                        345
-#define IMG_GATE_1_GRAY_EDITOR                         346
-#define IMG_GATE_2_GRAY                                        347
-#define IMG_GATE_2_GRAY_EDITOR                         348
-#define IMG_GATE_3_GRAY                                        349
-#define IMG_GATE_3_GRAY_EDITOR                         350
-#define IMG_GATE_4_GRAY                                        351
-#define IMG_GATE_4_GRAY_EDITOR                         352
-#define IMG_GAME_OF_LIFE                               353
-#define IMG_BIOMAZE                                    354
-#define IMG_PACMAN                                     355
-#define IMG_PACMAN_RIGHT                               356
-#define IMG_PACMAN_UP                                  357
-#define IMG_PACMAN_LEFT                                        358
-#define IMG_PACMAN_DOWN                                        359
-#define IMG_PACMAN_MOVING_RIGHT                                360
-#define IMG_PACMAN_MOVING_UP                           361
-#define IMG_PACMAN_MOVING_LEFT                         362
-#define IMG_PACMAN_MOVING_DOWN                         363
-#define IMG_LAMP                                       364
-#define IMG_LAMP_EDITOR                                        365
-#define IMG_LAMP_ACTIVE                                        366
-#define IMG_TIME_ORB_FULL                              367
-#define IMG_TIME_ORB_EMPTY                             368
-#define IMG_EMERALD_YELLOW                             369
-#define IMG_EMERALD_YELLOW_MOVING                      370
-#define IMG_EMERALD_YELLOW_FALLING                     371
-#define IMG_EMERALD_RED                                        372
-#define IMG_EMERALD_RED_MOVING                         373
-#define IMG_EMERALD_RED_FALLING                                374
-#define IMG_EMERALD_PURPLE                             375
-#define IMG_EMERALD_PURPLE_MOVING                      376
-#define IMG_EMERALD_PURPLE_FALLING                     377
-#define IMG_WALL_EMERALD_YELLOW                                378
-#define IMG_WALL_EMERALD_RED                           379
-#define IMG_WALL_EMERALD_PURPLE                                380
-#define IMG_WALL_BD_DIAMOND                            381
-#define IMG_EXPANDABLE_WALL                            382
-#define IMG_EXPANDABLE_WALL_HORIZONTAL                 383
-#define IMG_EXPANDABLE_WALL_HORIZONTAL_EDITOR          384
-#define IMG_EXPANDABLE_WALL_VERTICAL                   385
-#define IMG_EXPANDABLE_WALL_VERTICAL_EDITOR            386
-#define IMG_EXPANDABLE_WALL_ANY                                387
-#define IMG_EXPANDABLE_WALL_ANY_EDITOR                 388
-#define IMG_EXPANDABLE_WALL_GROWING_LEFT               389
-#define IMG_EXPANDABLE_WALL_GROWING_RIGHT              390
-#define IMG_EXPANDABLE_WALL_GROWING_UP                 391
-#define IMG_EXPANDABLE_WALL_GROWING_DOWN               392
-#define IMG_BLACK_ORB                                  393
-#define IMG_SPEED_PILL                                 394
-#define IMG_DARK_YAMYAM                                        395
-#define IMG_DYNABOMB                                   396
-#define IMG_DYNABOMB_ACTIVE                            397
-#define IMG_DYNABOMB_PLAYER_1                          398
-#define IMG_DYNABOMB_PLAYER_1_ACTIVE                   399
-#define IMG_DYNABOMB_PLAYER_2                          400
-#define IMG_DYNABOMB_PLAYER_2_ACTIVE                   401
-#define IMG_DYNABOMB_PLAYER_3                          402
-#define IMG_DYNABOMB_PLAYER_3_ACTIVE                   403
-#define IMG_DYNABOMB_PLAYER_4                          404
-#define IMG_DYNABOMB_PLAYER_4_ACTIVE                   405
-#define IMG_DYNABOMB_INCREASE_NUMBER                   406
-#define IMG_DYNABOMB_INCREASE_SIZE                     407
-#define IMG_DYNABOMB_INCREASE_POWER                    408
-#define IMG_PIG                                                409
-#define IMG_PIG_DOWN                                   410
-#define IMG_PIG_UP                                     411
-#define IMG_PIG_LEFT                                   412
-#define IMG_PIG_RIGHT                                  413
-#define IMG_PIG_MOVING_DOWN                            414
-#define IMG_PIG_MOVING_UP                              415
-#define IMG_PIG_MOVING_LEFT                            416
-#define IMG_PIG_MOVING_RIGHT                           417
-#define IMG_PIG_DIGGING_DOWN                           418
-#define IMG_PIG_DIGGING_UP                             419
-#define IMG_PIG_DIGGING_LEFT                           420
-#define IMG_PIG_DIGGING_RIGHT                          421
-#define IMG_DRAGON                                     422
-#define IMG_DRAGON_DOWN                                        423
-#define IMG_DRAGON_UP                                  424
-#define IMG_DRAGON_LEFT                                        425
-#define IMG_DRAGON_RIGHT                               426
-#define IMG_DRAGON_MOVING_DOWN                         427
-#define IMG_DRAGON_MOVING_UP                           428
-#define IMG_DRAGON_MOVING_LEFT                         429
-#define IMG_DRAGON_MOVING_RIGHT                                430
-#define IMG_DRAGON_ATTACKING_DOWN                      431
-#define IMG_DRAGON_ATTACKING_UP                                432
-#define IMG_DRAGON_ATTACKING_LEFT                      433
-#define IMG_DRAGON_ATTACKING_RIGHT                     434
-#define IMG_MOLE                                       435
-#define IMG_MOLE_DOWN                                  436
-#define IMG_MOLE_UP                                    437
-#define IMG_MOLE_LEFT                                  438
-#define IMG_MOLE_RIGHT                                 439
-#define IMG_MOLE_MOVING_DOWN                           440
-#define IMG_MOLE_MOVING_UP                             441
-#define IMG_MOLE_MOVING_LEFT                           442
-#define IMG_MOLE_MOVING_RIGHT                          443
-#define IMG_MOLE_DIGGING_DOWN                          444
-#define IMG_MOLE_DIGGING_UP                            445
-#define IMG_MOLE_DIGGING_LEFT                          446
-#define IMG_MOLE_DIGGING_RIGHT                         447
-#define IMG_PENGUIN                                    448
-#define IMG_PENGUIN_EDITOR                             449
-#define IMG_PENGUIN_DOWN                               450
-#define IMG_PENGUIN_UP                                 451
-#define IMG_PENGUIN_LEFT                               452
-#define IMG_PENGUIN_RIGHT                              453
-#define IMG_PENGUIN_MOVING_DOWN                                454
-#define IMG_PENGUIN_MOVING_UP                          455
-#define IMG_PENGUIN_MOVING_LEFT                                456
-#define IMG_PENGUIN_MOVING_RIGHT                       457
-#define IMG_SATELLITE                                  458
-#define IMG_FLAMES_1_LEFT                              459
-#define IMG_FLAMES_2_LEFT                              460
-#define IMG_FLAMES_3_LEFT                              461
-#define IMG_FLAMES_1_RIGHT                             462
-#define IMG_FLAMES_2_RIGHT                             463
-#define IMG_FLAMES_3_RIGHT                             464
-#define IMG_FLAMES_1_UP                                        465
-#define IMG_FLAMES_2_UP                                        466
-#define IMG_FLAMES_3_UP                                        467
-#define IMG_FLAMES_1_DOWN                              468
-#define IMG_FLAMES_2_DOWN                              469
-#define IMG_FLAMES_3_DOWN                              470
-#define IMG_STONEBLOCK                                 471
-#define IMG_PLAYER_1                                   472
-#define IMG_PLAYER_1_EDITOR                            473
-#define IMG_PLAYER_1_DOWN                              474
-#define IMG_PLAYER_1_UP                                        475
-#define IMG_PLAYER_1_LEFT                              476
-#define IMG_PLAYER_1_RIGHT                             477
-#define IMG_PLAYER_1_MOVING_DOWN                       478
-#define IMG_PLAYER_1_MOVING_UP                         479
-#define IMG_PLAYER_1_MOVING_LEFT                       480
-#define IMG_PLAYER_1_MOVING_RIGHT                      481
-#define IMG_PLAYER_1_DIGGING_DOWN                      482
-#define IMG_PLAYER_1_DIGGING_UP                                483
-#define IMG_PLAYER_1_DIGGING_LEFT                      484
-#define IMG_PLAYER_1_DIGGING_RIGHT                     485
-#define IMG_PLAYER_1_COLLECTING_DOWN                   486
-#define IMG_PLAYER_1_COLLECTING_UP                     487
-#define IMG_PLAYER_1_COLLECTING_LEFT                   488
-#define IMG_PLAYER_1_COLLECTING_RIGHT                  489
-#define IMG_PLAYER_1_PUSHING_DOWN                      490
-#define IMG_PLAYER_1_PUSHING_UP                                491
-#define IMG_PLAYER_1_PUSHING_LEFT                      492
-#define IMG_PLAYER_1_PUSHING_RIGHT                     493
-#define IMG_PLAYER_1_SNAPPING_DOWN                     494
-#define IMG_PLAYER_1_SNAPPING_UP                       495
-#define IMG_PLAYER_1_SNAPPING_LEFT                     496
-#define IMG_PLAYER_1_SNAPPING_RIGHT                    497
-#define IMG_PLAYER_2                                   498
-#define IMG_PLAYER_2_EDITOR                            499
-#define IMG_PLAYER_2_DOWN                              500
-#define IMG_PLAYER_2_UP                                        501
-#define IMG_PLAYER_2_LEFT                              502
-#define IMG_PLAYER_2_RIGHT                             503
-#define IMG_PLAYER_2_MOVING_DOWN                       504
-#define IMG_PLAYER_2_MOVING_UP                         505
-#define IMG_PLAYER_2_MOVING_LEFT                       506
-#define IMG_PLAYER_2_MOVING_RIGHT                      507
-#define IMG_PLAYER_2_DIGGING_DOWN                      508
-#define IMG_PLAYER_2_DIGGING_UP                                509
-#define IMG_PLAYER_2_DIGGING_LEFT                      510
-#define IMG_PLAYER_2_DIGGING_RIGHT                     511
-#define IMG_PLAYER_2_COLLECTING_DOWN                   512
-#define IMG_PLAYER_2_COLLECTING_UP                     513
-#define IMG_PLAYER_2_COLLECTING_LEFT                   514
-#define IMG_PLAYER_2_COLLECTING_RIGHT                  515
-#define IMG_PLAYER_2_PUSHING_DOWN                      516
-#define IMG_PLAYER_2_PUSHING_UP                                517
-#define IMG_PLAYER_2_PUSHING_LEFT                      518
-#define IMG_PLAYER_2_PUSHING_RIGHT                     519
-#define IMG_PLAYER_2_SNAPPING_DOWN                     520
-#define IMG_PLAYER_2_SNAPPING_UP                       521
-#define IMG_PLAYER_2_SNAPPING_LEFT                     522
-#define IMG_PLAYER_2_SNAPPING_RIGHT                    523
-#define IMG_PLAYER_3                                   524
-#define IMG_PLAYER_3_EDITOR                            525
-#define IMG_PLAYER_3_DOWN                              526
-#define IMG_PLAYER_3_UP                                        527
-#define IMG_PLAYER_3_LEFT                              528
-#define IMG_PLAYER_3_RIGHT                             529
-#define IMG_PLAYER_3_MOVING_DOWN                       530
-#define IMG_PLAYER_3_MOVING_UP                         531
-#define IMG_PLAYER_3_MOVING_LEFT                       532
-#define IMG_PLAYER_3_MOVING_RIGHT                      533
-#define IMG_PLAYER_3_DIGGING_DOWN                      534
-#define IMG_PLAYER_3_DIGGING_UP                                535
-#define IMG_PLAYER_3_DIGGING_LEFT                      536
-#define IMG_PLAYER_3_DIGGING_RIGHT                     537
-#define IMG_PLAYER_3_COLLECTING_DOWN                   538
-#define IMG_PLAYER_3_COLLECTING_UP                     539
-#define IMG_PLAYER_3_COLLECTING_LEFT                   540
-#define IMG_PLAYER_3_COLLECTING_RIGHT                  541
-#define IMG_PLAYER_3_PUSHING_DOWN                      542
-#define IMG_PLAYER_3_PUSHING_UP                                543
-#define IMG_PLAYER_3_PUSHING_LEFT                      544
-#define IMG_PLAYER_3_PUSHING_RIGHT                     545
-#define IMG_PLAYER_3_SNAPPING_DOWN                     546
-#define IMG_PLAYER_3_SNAPPING_UP                       547
-#define IMG_PLAYER_3_SNAPPING_LEFT                     548
-#define IMG_PLAYER_3_SNAPPING_RIGHT                    549
-#define IMG_PLAYER_4                                   550
-#define IMG_PLAYER_4_EDITOR                            551
-#define IMG_PLAYER_4_DOWN                              552
-#define IMG_PLAYER_4_UP                                        553
-#define IMG_PLAYER_4_LEFT                              554
-#define IMG_PLAYER_4_RIGHT                             555
-#define IMG_PLAYER_4_MOVING_DOWN                       556
-#define IMG_PLAYER_4_MOVING_UP                         557
-#define IMG_PLAYER_4_MOVING_LEFT                       558
-#define IMG_PLAYER_4_MOVING_RIGHT                      559
-#define IMG_PLAYER_4_DIGGING_DOWN                      560
-#define IMG_PLAYER_4_DIGGING_UP                                561
-#define IMG_PLAYER_4_DIGGING_LEFT                      562
-#define IMG_PLAYER_4_DIGGING_RIGHT                     563
-#define IMG_PLAYER_4_COLLECTING_DOWN                   564
-#define IMG_PLAYER_4_COLLECTING_UP                     565
-#define IMG_PLAYER_4_COLLECTING_LEFT                   566
-#define IMG_PLAYER_4_COLLECTING_RIGHT                  567
-#define IMG_PLAYER_4_PUSHING_DOWN                      568
-#define IMG_PLAYER_4_PUSHING_UP                                569
-#define IMG_PLAYER_4_PUSHING_LEFT                      570
-#define IMG_PLAYER_4_PUSHING_RIGHT                     571
-#define IMG_PLAYER_4_SNAPPING_DOWN                     572
-#define IMG_PLAYER_4_SNAPPING_UP                       573
-#define IMG_PLAYER_4_SNAPPING_LEFT                     574
-#define IMG_PLAYER_4_SNAPPING_RIGHT                    575
-#define IMG_DEFAULT_EXPLODING                          576
-#define IMG_TWINKLE_BLUE                               577
-#define IMG_TWINKLE_WHITE                              578
-#define IMG_STEELWALL_TOPLEFT                          579
-#define IMG_STEELWALL_TOPRIGHT                         580
-#define IMG_STEELWALL_BOTTOMLEFT                       581
-#define IMG_STEELWALL_BOTTOMRIGHT                      582
-#define IMG_STEELWALL_HORIZONTAL                       583
-#define IMG_STEELWALL_VERTICAL                         584
-#define IMG_STEELWALL_TOPLEFT_EDITOR                   585
-#define IMG_STEELWALL_TOPRIGHT_EDITOR                  586
-#define IMG_STEELWALL_BOTTOMLEFT_EDITOR                        587
-#define IMG_STEELWALL_BOTTOMRIGHT_EDITOR               588
-#define IMG_STEELWALL_HORIZONTAL_EDITOR                        589
-#define IMG_STEELWALL_VERTICAL_EDITOR                  590
-#define IMG_INVISIBLE_STEELWALL_TOPLEFT                        591
-#define IMG_INVISIBLE_STEELWALL_TOPRIGHT               592
-#define IMG_INVISIBLE_STEELWALL_BOTTOMLEFT             593
-#define IMG_INVISIBLE_STEELWALL_BOTTOMRIGHT            594
-#define IMG_INVISIBLE_STEELWALL_HORIZONTAL             595
-#define IMG_INVISIBLE_STEELWALL_VERTICAL               596
-#define IMG_INVISIBLE_STEELWALL_TOPLEFT_EDITOR         597
-#define IMG_INVISIBLE_STEELWALL_TOPRIGHT_EDITOR                598
-#define IMG_INVISIBLE_STEELWALL_BOTTOMLEFT_EDITOR      599
-#define IMG_INVISIBLE_STEELWALL_BOTTOMRIGHT_EDITOR     600
-#define IMG_INVISIBLE_STEELWALL_HORIZONTAL_EDITOR      601
-#define IMG_INVISIBLE_STEELWALL_VERTICAL_EDITOR                602
-#define IMG_ARROW_LEFT                                 603
-#define IMG_ARROW_RIGHT                                        604
-#define IMG_ARROW_UP                                   605
-#define IMG_ARROW_DOWN                                 606
-#define IMG_CHAR_SPACE                                 607
-#define IMG_CHAR_EXCLAM                                        608
-#define IMG_CHAR_QUOTEDBL                              609
-#define IMG_CHAR_NUMBERSIGN                            610
-#define IMG_CHAR_DOLLAR                                        611
-#define IMG_CHAR_PROCENT                               612
-#define IMG_CHAR_AMPERSAND                             613
-#define IMG_CHAR_APOSTROPHE                            614
-#define IMG_CHAR_PARENLEFT                             615
-#define IMG_CHAR_PARENRIGHT                            616
-#define IMG_CHAR_ASTERISK                              617
-#define IMG_CHAR_PLUS                                  618
-#define IMG_CHAR_COMMA                                 619
-#define IMG_CHAR_MINUS                                 620
-#define IMG_CHAR_PERIOD                                        621
-#define IMG_CHAR_SLASH                                 622
-#define IMG_CHAR_0                                     623
-#define IMG_CHAR_1                                     624
-#define IMG_CHAR_2                                     625
-#define IMG_CHAR_3                                     626
-#define IMG_CHAR_4                                     627
-#define IMG_CHAR_5                                     628
-#define IMG_CHAR_6                                     629
-#define IMG_CHAR_7                                     630
-#define IMG_CHAR_8                                     631
-#define IMG_CHAR_9                                     632
-#define IMG_CHAR_COLON                                 633
-#define IMG_CHAR_SEMICOLON                             634
-#define IMG_CHAR_LESS                                  635
-#define IMG_CHAR_EQUAL                                 636
-#define IMG_CHAR_GREATER                               637
-#define IMG_CHAR_QUESTION                              638
-#define IMG_CHAR_AT                                    639
-#define IMG_CHAR_A                                     640
-#define IMG_CHAR_B                                     641
-#define IMG_CHAR_C                                     642
-#define IMG_CHAR_D                                     643
-#define IMG_CHAR_E                                     644
-#define IMG_CHAR_F                                     645
-#define IMG_CHAR_G                                     646
-#define IMG_CHAR_H                                     647
-#define IMG_CHAR_I                                     648
-#define IMG_CHAR_J                                     649
-#define IMG_CHAR_K                                     650
-#define IMG_CHAR_L                                     651
-#define IMG_CHAR_M                                     652
-#define IMG_CHAR_N                                     653
-#define IMG_CHAR_O                                     654
-#define IMG_CHAR_P                                     655
-#define IMG_CHAR_Q                                     656
-#define IMG_CHAR_R                                     657
-#define IMG_CHAR_S                                     658
-#define IMG_CHAR_T                                     659
-#define IMG_CHAR_U                                     660
-#define IMG_CHAR_V                                     661
-#define IMG_CHAR_W                                     662
-#define IMG_CHAR_X                                     663
-#define IMG_CHAR_Y                                     664
-#define IMG_CHAR_Z                                     665
-#define IMG_CHAR_BRACKETLEFT                           666
-#define IMG_CHAR_BACKSLASH                             667
-#define IMG_CHAR_BRACKETRIGHT                          668
-#define IMG_CHAR_ASCIICIRCUM                           669
-#define IMG_CHAR_UNDERSCORE                            670
-#define IMG_CHAR_COPYRIGHT                             671
-#define IMG_CHAR_AUMLAUT                               672
-#define IMG_CHAR_OUMLAUT                               673
-#define IMG_CHAR_UUMLAUT                               674
-#define IMG_CHAR_DEGREE                                        675
-#define IMG_CHAR_TRADEMARK                             676
-#define IMG_CHAR_CURSOR                                        677
-#define IMG_CUSTOM_1                                   678
-#define IMG_CUSTOM_1_EDITOR                            679
-#define IMG_CUSTOM_2                                   680
-#define IMG_CUSTOM_2_EDITOR                            681
-#define IMG_CUSTOM_3                                   682
-#define IMG_CUSTOM_3_EDITOR                            683
-#define IMG_CUSTOM_4                                   684
-#define IMG_CUSTOM_4_EDITOR                            685
-#define IMG_CUSTOM_5                                   686
-#define IMG_CUSTOM_5_EDITOR                            687
-#define IMG_CUSTOM_6                                   688
-#define IMG_CUSTOM_6_EDITOR                            689
-#define IMG_CUSTOM_7                                   690
-#define IMG_CUSTOM_7_EDITOR                            691
-#define IMG_CUSTOM_8                                   692
-#define IMG_CUSTOM_8_EDITOR                            693
-#define IMG_CUSTOM_9                                   694
-#define IMG_CUSTOM_9_EDITOR                            695
-#define IMG_CUSTOM_10                                  696
-#define IMG_CUSTOM_10_EDITOR                           697
-#define IMG_CUSTOM_11                                  698
-#define IMG_CUSTOM_11_EDITOR                           699
-#define IMG_CUSTOM_12                                  700
-#define IMG_CUSTOM_12_EDITOR                           701
-#define IMG_CUSTOM_13                                  702
-#define IMG_CUSTOM_13_EDITOR                           703
-#define IMG_CUSTOM_14                                  704
-#define IMG_CUSTOM_14_EDITOR                           705
-#define IMG_CUSTOM_15                                  706
-#define IMG_CUSTOM_15_EDITOR                           707
-#define IMG_CUSTOM_16                                  708
-#define IMG_CUSTOM_16_EDITOR                           709
-#define IMG_CUSTOM_17                                  710
-#define IMG_CUSTOM_17_EDITOR                           711
-#define IMG_CUSTOM_18                                  712
-#define IMG_CUSTOM_18_EDITOR                           713
-#define IMG_CUSTOM_19                                  714
-#define IMG_CUSTOM_19_EDITOR                           715
-#define IMG_CUSTOM_20                                  716
-#define IMG_CUSTOM_20_EDITOR                           717
-#define IMG_CUSTOM_21                                  718
-#define IMG_CUSTOM_21_EDITOR                           719
-#define IMG_CUSTOM_22                                  720
-#define IMG_CUSTOM_22_EDITOR                           721
-#define IMG_CUSTOM_23                                  722
-#define IMG_CUSTOM_23_EDITOR                           723
-#define IMG_CUSTOM_24                                  724
-#define IMG_CUSTOM_24_EDITOR                           725
-#define IMG_CUSTOM_25                                  726
-#define IMG_CUSTOM_25_EDITOR                           727
-#define IMG_CUSTOM_26                                  728
-#define IMG_CUSTOM_26_EDITOR                           729
-#define IMG_CUSTOM_27                                  730
-#define IMG_CUSTOM_27_EDITOR                           731
-#define IMG_CUSTOM_28                                  732
-#define IMG_CUSTOM_28_EDITOR                           733
-#define IMG_CUSTOM_29                                  734
-#define IMG_CUSTOM_29_EDITOR                           735
-#define IMG_CUSTOM_30                                  736
-#define IMG_CUSTOM_30_EDITOR                           737
-#define IMG_CUSTOM_31                                  738
-#define IMG_CUSTOM_31_EDITOR                           739
-#define IMG_CUSTOM_32                                  740
-#define IMG_CUSTOM_32_EDITOR                           741
-#define IMG_CUSTOM_33                                  742
-#define IMG_CUSTOM_33_EDITOR                           743
-#define IMG_CUSTOM_34                                  744
-#define IMG_CUSTOM_34_EDITOR                           745
-#define IMG_CUSTOM_35                                  746
-#define IMG_CUSTOM_35_EDITOR                           747
-#define IMG_CUSTOM_36                                  748
-#define IMG_CUSTOM_36_EDITOR                           749
-#define IMG_CUSTOM_37                                  750
-#define IMG_CUSTOM_37_EDITOR                           751
-#define IMG_CUSTOM_38                                  752
-#define IMG_CUSTOM_38_EDITOR                           753
-#define IMG_CUSTOM_39                                  754
-#define IMG_CUSTOM_39_EDITOR                           755
-#define IMG_CUSTOM_40                                  756
-#define IMG_CUSTOM_40_EDITOR                           757
-#define IMG_CUSTOM_41                                  758
-#define IMG_CUSTOM_41_EDITOR                           759
-#define IMG_CUSTOM_42                                  760
-#define IMG_CUSTOM_42_EDITOR                           761
-#define IMG_CUSTOM_43                                  762
-#define IMG_CUSTOM_43_EDITOR                           763
-#define IMG_CUSTOM_44                                  764
-#define IMG_CUSTOM_44_EDITOR                           765
-#define IMG_CUSTOM_45                                  766
-#define IMG_CUSTOM_45_EDITOR                           767
-#define IMG_CUSTOM_46                                  768
-#define IMG_CUSTOM_46_EDITOR                           769
-#define IMG_CUSTOM_47                                  770
-#define IMG_CUSTOM_47_EDITOR                           771
-#define IMG_CUSTOM_48                                  772
-#define IMG_CUSTOM_48_EDITOR                           773
-#define IMG_CUSTOM_49                                  774
-#define IMG_CUSTOM_49_EDITOR                           775
-#define IMG_CUSTOM_50                                  776
-#define IMG_CUSTOM_50_EDITOR                           777
-#define IMG_CUSTOM_51                                  778
-#define IMG_CUSTOM_51_EDITOR                           779
-#define IMG_CUSTOM_52                                  780
-#define IMG_CUSTOM_52_EDITOR                           781
-#define IMG_CUSTOM_53                                  782
-#define IMG_CUSTOM_53_EDITOR                           783
-#define IMG_CUSTOM_54                                  784
-#define IMG_CUSTOM_54_EDITOR                           785
-#define IMG_CUSTOM_55                                  786
-#define IMG_CUSTOM_55_EDITOR                           787
-#define IMG_CUSTOM_56                                  788
-#define IMG_CUSTOM_56_EDITOR                           789
-#define IMG_CUSTOM_57                                  790
-#define IMG_CUSTOM_57_EDITOR                           791
-#define IMG_CUSTOM_58                                  792
-#define IMG_CUSTOM_58_EDITOR                           793
-#define IMG_CUSTOM_59                                  794
-#define IMG_CUSTOM_59_EDITOR                           795
-#define IMG_CUSTOM_60                                  796
-#define IMG_CUSTOM_60_EDITOR                           797
-#define IMG_CUSTOM_61                                  798
-#define IMG_CUSTOM_61_EDITOR                           799
-#define IMG_CUSTOM_62                                  800
-#define IMG_CUSTOM_62_EDITOR                           801
-#define IMG_CUSTOM_63                                  802
-#define IMG_CUSTOM_63_EDITOR                           803
-#define IMG_CUSTOM_64                                  804
-#define IMG_CUSTOM_64_EDITOR                           805
-#define IMG_CUSTOM_65                                  806
-#define IMG_CUSTOM_65_EDITOR                           807
-#define IMG_CUSTOM_66                                  808
-#define IMG_CUSTOM_66_EDITOR                           809
-#define IMG_CUSTOM_67                                  810
-#define IMG_CUSTOM_67_EDITOR                           811
-#define IMG_CUSTOM_68                                  812
-#define IMG_CUSTOM_68_EDITOR                           813
-#define IMG_CUSTOM_69                                  814
-#define IMG_CUSTOM_69_EDITOR                           815
-#define IMG_CUSTOM_70                                  816
-#define IMG_CUSTOM_70_EDITOR                           817
-#define IMG_CUSTOM_71                                  818
-#define IMG_CUSTOM_71_EDITOR                           819
-#define IMG_CUSTOM_72                                  820
-#define IMG_CUSTOM_72_EDITOR                           821
-#define IMG_CUSTOM_73                                  822
-#define IMG_CUSTOM_73_EDITOR                           823
-#define IMG_CUSTOM_74                                  824
-#define IMG_CUSTOM_74_EDITOR                           825
-#define IMG_CUSTOM_75                                  826
-#define IMG_CUSTOM_75_EDITOR                           827
-#define IMG_CUSTOM_76                                  828
-#define IMG_CUSTOM_76_EDITOR                           829
-#define IMG_CUSTOM_77                                  830
-#define IMG_CUSTOM_77_EDITOR                           831
-#define IMG_CUSTOM_78                                  832
-#define IMG_CUSTOM_78_EDITOR                           833
-#define IMG_CUSTOM_79                                  834
-#define IMG_CUSTOM_79_EDITOR                           835
-#define IMG_CUSTOM_80                                  836
-#define IMG_CUSTOM_80_EDITOR                           837
-#define IMG_CUSTOM_81                                  838
-#define IMG_CUSTOM_81_EDITOR                           839
-#define IMG_CUSTOM_82                                  840
-#define IMG_CUSTOM_82_EDITOR                           841
-#define IMG_CUSTOM_83                                  842
-#define IMG_CUSTOM_83_EDITOR                           843
-#define IMG_CUSTOM_84                                  844
-#define IMG_CUSTOM_84_EDITOR                           845
-#define IMG_CUSTOM_85                                  846
-#define IMG_CUSTOM_85_EDITOR                           847
-#define IMG_CUSTOM_86                                  848
-#define IMG_CUSTOM_86_EDITOR                           849
-#define IMG_CUSTOM_87                                  850
-#define IMG_CUSTOM_87_EDITOR                           851
-#define IMG_CUSTOM_88                                  852
-#define IMG_CUSTOM_88_EDITOR                           853
-#define IMG_CUSTOM_89                                  854
-#define IMG_CUSTOM_89_EDITOR                           855
-#define IMG_CUSTOM_90                                  856
-#define IMG_CUSTOM_90_EDITOR                           857
-#define IMG_CUSTOM_91                                  858
-#define IMG_CUSTOM_91_EDITOR                           859
-#define IMG_CUSTOM_92                                  860
-#define IMG_CUSTOM_92_EDITOR                           861
-#define IMG_CUSTOM_93                                  862
-#define IMG_CUSTOM_93_EDITOR                           863
-#define IMG_CUSTOM_94                                  864
-#define IMG_CUSTOM_94_EDITOR                           865
-#define IMG_CUSTOM_95                                  866
-#define IMG_CUSTOM_95_EDITOR                           867
-#define IMG_CUSTOM_96                                  868
-#define IMG_CUSTOM_96_EDITOR                           869
-#define IMG_CUSTOM_97                                  870
-#define IMG_CUSTOM_97_EDITOR                           871
-#define IMG_CUSTOM_98                                  872
-#define IMG_CUSTOM_98_EDITOR                           873
-#define IMG_CUSTOM_99                                  874
-#define IMG_CUSTOM_99_EDITOR                           875
-#define IMG_CUSTOM_100                                 876
-#define IMG_CUSTOM_100_EDITOR                          877
-#define IMG_CUSTOM_101                                 878
-#define IMG_CUSTOM_101_EDITOR                          879
-#define IMG_CUSTOM_102                                 880
-#define IMG_CUSTOM_102_EDITOR                          881
-#define IMG_CUSTOM_103                                 882
-#define IMG_CUSTOM_103_EDITOR                          883
-#define IMG_CUSTOM_104                                 884
-#define IMG_CUSTOM_104_EDITOR                          885
-#define IMG_CUSTOM_105                                 886
-#define IMG_CUSTOM_105_EDITOR                          887
-#define IMG_CUSTOM_106                                 888
-#define IMG_CUSTOM_106_EDITOR                          889
-#define IMG_CUSTOM_107                                 890
-#define IMG_CUSTOM_107_EDITOR                          891
-#define IMG_CUSTOM_108                                 892
-#define IMG_CUSTOM_108_EDITOR                          893
-#define IMG_CUSTOM_109                                 894
-#define IMG_CUSTOM_109_EDITOR                          895
-#define IMG_CUSTOM_110                                 896
-#define IMG_CUSTOM_110_EDITOR                          897
-#define IMG_CUSTOM_111                                 898
-#define IMG_CUSTOM_111_EDITOR                          899
-#define IMG_CUSTOM_112                                 900
-#define IMG_CUSTOM_112_EDITOR                          901
-#define IMG_CUSTOM_113                                 902
-#define IMG_CUSTOM_113_EDITOR                          903
-#define IMG_CUSTOM_114                                 904
-#define IMG_CUSTOM_114_EDITOR                          905
-#define IMG_CUSTOM_115                                 906
-#define IMG_CUSTOM_115_EDITOR                          907
-#define IMG_CUSTOM_116                                 908
-#define IMG_CUSTOM_116_EDITOR                          909
-#define IMG_CUSTOM_117                                 910
-#define IMG_CUSTOM_117_EDITOR                          911
-#define IMG_CUSTOM_118                                 912
-#define IMG_CUSTOM_118_EDITOR                          913
-#define IMG_CUSTOM_119                                 914
-#define IMG_CUSTOM_119_EDITOR                          915
-#define IMG_CUSTOM_120                                 916
-#define IMG_CUSTOM_120_EDITOR                          917
-#define IMG_CUSTOM_121                                 918
-#define IMG_CUSTOM_121_EDITOR                          919
-#define IMG_CUSTOM_122                                 920
-#define IMG_CUSTOM_122_EDITOR                          921
-#define IMG_CUSTOM_123                                 922
-#define IMG_CUSTOM_123_EDITOR                          923
-#define IMG_CUSTOM_124                                 924
-#define IMG_CUSTOM_124_EDITOR                          925
-#define IMG_CUSTOM_125                                 926
-#define IMG_CUSTOM_125_EDITOR                          927
-#define IMG_CUSTOM_126                                 928
-#define IMG_CUSTOM_126_EDITOR                          929
-#define IMG_CUSTOM_127                                 930
-#define IMG_CUSTOM_127_EDITOR                          931
-#define IMG_CUSTOM_128                                 932
-#define IMG_CUSTOM_128_EDITOR                          933
-#define IMG_CUSTOM_129                                 934
-#define IMG_CUSTOM_129_EDITOR                          935
-#define IMG_CUSTOM_130                                 936
-#define IMG_CUSTOM_130_EDITOR                          937
-#define IMG_CUSTOM_131                                 938
-#define IMG_CUSTOM_131_EDITOR                          939
-#define IMG_CUSTOM_132                                 940
-#define IMG_CUSTOM_132_EDITOR                          941
-#define IMG_CUSTOM_133                                 942
-#define IMG_CUSTOM_133_EDITOR                          943
-#define IMG_CUSTOM_134                                 944
-#define IMG_CUSTOM_134_EDITOR                          945
-#define IMG_CUSTOM_135                                 946
-#define IMG_CUSTOM_135_EDITOR                          947
-#define IMG_CUSTOM_136                                 948
-#define IMG_CUSTOM_136_EDITOR                          949
-#define IMG_CUSTOM_137                                 950
-#define IMG_CUSTOM_137_EDITOR                          951
-#define IMG_CUSTOM_138                                 952
-#define IMG_CUSTOM_138_EDITOR                          953
-#define IMG_CUSTOM_139                                 954
-#define IMG_CUSTOM_139_EDITOR                          955
-#define IMG_CUSTOM_140                                 956
-#define IMG_CUSTOM_140_EDITOR                          957
-#define IMG_CUSTOM_141                                 958
-#define IMG_CUSTOM_141_EDITOR                          959
-#define IMG_CUSTOM_142                                 960
-#define IMG_CUSTOM_142_EDITOR                          961
-#define IMG_CUSTOM_143                                 962
-#define IMG_CUSTOM_143_EDITOR                          963
-#define IMG_CUSTOM_144                                 964
-#define IMG_CUSTOM_144_EDITOR                          965
-#define IMG_CUSTOM_145                                 966
-#define IMG_CUSTOM_145_EDITOR                          967
-#define IMG_CUSTOM_146                                 968
-#define IMG_CUSTOM_146_EDITOR                          969
-#define IMG_CUSTOM_147                                 970
-#define IMG_CUSTOM_147_EDITOR                          971
-#define IMG_CUSTOM_148                                 972
-#define IMG_CUSTOM_148_EDITOR                          973
-#define IMG_CUSTOM_149                                 974
-#define IMG_CUSTOM_149_EDITOR                          975
-#define IMG_CUSTOM_150                                 976
-#define IMG_CUSTOM_150_EDITOR                          977
-#define IMG_CUSTOM_151                                 978
-#define IMG_CUSTOM_151_EDITOR                          979
-#define IMG_CUSTOM_152                                 980
-#define IMG_CUSTOM_152_EDITOR                          981
-#define IMG_CUSTOM_153                                 982
-#define IMG_CUSTOM_153_EDITOR                          983
-#define IMG_CUSTOM_154                                 984
-#define IMG_CUSTOM_154_EDITOR                          985
-#define IMG_CUSTOM_155                                 986
-#define IMG_CUSTOM_155_EDITOR                          987
-#define IMG_CUSTOM_156                                 988
-#define IMG_CUSTOM_156_EDITOR                          989
-#define IMG_CUSTOM_157                                 990
-#define IMG_CUSTOM_157_EDITOR                          991
-#define IMG_CUSTOM_158                                 992
-#define IMG_CUSTOM_158_EDITOR                          993
-#define IMG_CUSTOM_159                                 994
-#define IMG_CUSTOM_159_EDITOR                          995
-#define IMG_CUSTOM_160                                 996
-#define IMG_CUSTOM_160_EDITOR                          997
-#define IMG_CUSTOM_161                                 998
-#define IMG_CUSTOM_161_EDITOR                          999
-#define IMG_CUSTOM_162                                 1000
-#define IMG_CUSTOM_162_EDITOR                          1001
-#define IMG_CUSTOM_163                                 1002
-#define IMG_CUSTOM_163_EDITOR                          1003
-#define IMG_CUSTOM_164                                 1004
-#define IMG_CUSTOM_164_EDITOR                          1005
-#define IMG_CUSTOM_165                                 1006
-#define IMG_CUSTOM_165_EDITOR                          1007
-#define IMG_CUSTOM_166                                 1008
-#define IMG_CUSTOM_166_EDITOR                          1009
-#define IMG_CUSTOM_167                                 1010
-#define IMG_CUSTOM_167_EDITOR                          1011
-#define IMG_CUSTOM_168                                 1012
-#define IMG_CUSTOM_168_EDITOR                          1013
-#define IMG_CUSTOM_169                                 1014
-#define IMG_CUSTOM_169_EDITOR                          1015
-#define IMG_CUSTOM_170                                 1016
-#define IMG_CUSTOM_170_EDITOR                          1017
-#define IMG_CUSTOM_171                                 1018
-#define IMG_CUSTOM_171_EDITOR                          1019
-#define IMG_CUSTOM_172                                 1020
-#define IMG_CUSTOM_172_EDITOR                          1021
-#define IMG_CUSTOM_173                                 1022
-#define IMG_CUSTOM_173_EDITOR                          1023
-#define IMG_CUSTOM_174                                 1024
-#define IMG_CUSTOM_174_EDITOR                          1025
-#define IMG_CUSTOM_175                                 1026
-#define IMG_CUSTOM_175_EDITOR                          1027
-#define IMG_CUSTOM_176                                 1028
-#define IMG_CUSTOM_176_EDITOR                          1029
-#define IMG_CUSTOM_177                                 1030
-#define IMG_CUSTOM_177_EDITOR                          1031
-#define IMG_CUSTOM_178                                 1032
-#define IMG_CUSTOM_178_EDITOR                          1033
-#define IMG_CUSTOM_179                                 1034
-#define IMG_CUSTOM_179_EDITOR                          1035
-#define IMG_CUSTOM_180                                 1036
-#define IMG_CUSTOM_180_EDITOR                          1037
-#define IMG_CUSTOM_181                                 1038
-#define IMG_CUSTOM_181_EDITOR                          1039
-#define IMG_CUSTOM_182                                 1040
-#define IMG_CUSTOM_182_EDITOR                          1041
-#define IMG_CUSTOM_183                                 1042
-#define IMG_CUSTOM_183_EDITOR                          1043
-#define IMG_CUSTOM_184                                 1044
-#define IMG_CUSTOM_184_EDITOR                          1045
-#define IMG_CUSTOM_185                                 1046
-#define IMG_CUSTOM_185_EDITOR                          1047
-#define IMG_CUSTOM_186                                 1048
-#define IMG_CUSTOM_186_EDITOR                          1049
-#define IMG_CUSTOM_187                                 1050
-#define IMG_CUSTOM_187_EDITOR                          1051
-#define IMG_CUSTOM_188                                 1052
-#define IMG_CUSTOM_188_EDITOR                          1053
-#define IMG_CUSTOM_189                                 1054
-#define IMG_CUSTOM_189_EDITOR                          1055
-#define IMG_CUSTOM_190                                 1056
-#define IMG_CUSTOM_190_EDITOR                          1057
-#define IMG_CUSTOM_191                                 1058
-#define IMG_CUSTOM_191_EDITOR                          1059
-#define IMG_CUSTOM_192                                 1060
-#define IMG_CUSTOM_192_EDITOR                          1061
-#define IMG_CUSTOM_193                                 1062
-#define IMG_CUSTOM_193_EDITOR                          1063
-#define IMG_CUSTOM_194                                 1064
-#define IMG_CUSTOM_194_EDITOR                          1065
-#define IMG_CUSTOM_195                                 1066
-#define IMG_CUSTOM_195_EDITOR                          1067
-#define IMG_CUSTOM_196                                 1068
-#define IMG_CUSTOM_196_EDITOR                          1069
-#define IMG_CUSTOM_197                                 1070
-#define IMG_CUSTOM_197_EDITOR                          1071
-#define IMG_CUSTOM_198                                 1072
-#define IMG_CUSTOM_198_EDITOR                          1073
-#define IMG_CUSTOM_199                                 1074
-#define IMG_CUSTOM_199_EDITOR                          1075
-#define IMG_CUSTOM_200                                 1076
-#define IMG_CUSTOM_200_EDITOR                          1077
-#define IMG_CUSTOM_201                                 1078
-#define IMG_CUSTOM_201_EDITOR                          1079
-#define IMG_CUSTOM_202                                 1080
-#define IMG_CUSTOM_202_EDITOR                          1081
-#define IMG_CUSTOM_203                                 1082
-#define IMG_CUSTOM_203_EDITOR                          1083
-#define IMG_CUSTOM_204                                 1084
-#define IMG_CUSTOM_204_EDITOR                          1085
-#define IMG_CUSTOM_205                                 1086
-#define IMG_CUSTOM_205_EDITOR                          1087
-#define IMG_CUSTOM_206                                 1088
-#define IMG_CUSTOM_206_EDITOR                          1089
-#define IMG_CUSTOM_207                                 1090
-#define IMG_CUSTOM_207_EDITOR                          1091
-#define IMG_CUSTOM_208                                 1092
-#define IMG_CUSTOM_208_EDITOR                          1093
-#define IMG_CUSTOM_209                                 1094
-#define IMG_CUSTOM_209_EDITOR                          1095
-#define IMG_CUSTOM_210                                 1096
-#define IMG_CUSTOM_210_EDITOR                          1097
-#define IMG_CUSTOM_211                                 1098
-#define IMG_CUSTOM_211_EDITOR                          1099
-#define IMG_CUSTOM_212                                 1100
-#define IMG_CUSTOM_212_EDITOR                          1101
-#define IMG_CUSTOM_213                                 1102
-#define IMG_CUSTOM_213_EDITOR                          1103
-#define IMG_CUSTOM_214                                 1104
-#define IMG_CUSTOM_214_EDITOR                          1105
-#define IMG_CUSTOM_215                                 1106
-#define IMG_CUSTOM_215_EDITOR                          1107
-#define IMG_CUSTOM_216                                 1108
-#define IMG_CUSTOM_216_EDITOR                          1109
-#define IMG_CUSTOM_217                                 1110
-#define IMG_CUSTOM_217_EDITOR                          1111
-#define IMG_CUSTOM_218                                 1112
-#define IMG_CUSTOM_218_EDITOR                          1113
-#define IMG_CUSTOM_219                                 1114
-#define IMG_CUSTOM_219_EDITOR                          1115
-#define IMG_CUSTOM_220                                 1116
-#define IMG_CUSTOM_220_EDITOR                          1117
-#define IMG_CUSTOM_221                                 1118
-#define IMG_CUSTOM_221_EDITOR                          1119
-#define IMG_CUSTOM_222                                 1120
-#define IMG_CUSTOM_222_EDITOR                          1121
-#define IMG_CUSTOM_223                                 1122
-#define IMG_CUSTOM_223_EDITOR                          1123
-#define IMG_CUSTOM_224                                 1124
-#define IMG_CUSTOM_224_EDITOR                          1125
-#define IMG_CUSTOM_225                                 1126
-#define IMG_CUSTOM_225_EDITOR                          1127
-#define IMG_CUSTOM_226                                 1128
-#define IMG_CUSTOM_226_EDITOR                          1129
-#define IMG_CUSTOM_227                                 1130
-#define IMG_CUSTOM_227_EDITOR                          1131
-#define IMG_CUSTOM_228                                 1132
-#define IMG_CUSTOM_228_EDITOR                          1133
-#define IMG_CUSTOM_229                                 1134
-#define IMG_CUSTOM_229_EDITOR                          1135
-#define IMG_CUSTOM_230                                 1136
-#define IMG_CUSTOM_230_EDITOR                          1137
-#define IMG_CUSTOM_231                                 1138
-#define IMG_CUSTOM_231_EDITOR                          1139
-#define IMG_CUSTOM_232                                 1140
-#define IMG_CUSTOM_232_EDITOR                          1141
-#define IMG_CUSTOM_233                                 1142
-#define IMG_CUSTOM_233_EDITOR                          1143
-#define IMG_CUSTOM_234                                 1144
-#define IMG_CUSTOM_234_EDITOR                          1145
-#define IMG_CUSTOM_235                                 1146
-#define IMG_CUSTOM_235_EDITOR                          1147
-#define IMG_CUSTOM_236                                 1148
-#define IMG_CUSTOM_236_EDITOR                          1149
-#define IMG_CUSTOM_237                                 1150
-#define IMG_CUSTOM_237_EDITOR                          1151
-#define IMG_CUSTOM_238                                 1152
-#define IMG_CUSTOM_238_EDITOR                          1153
-#define IMG_CUSTOM_239                                 1154
-#define IMG_CUSTOM_239_EDITOR                          1155
-#define IMG_CUSTOM_240                                 1156
-#define IMG_CUSTOM_240_EDITOR                          1157
-#define IMG_CUSTOM_241                                 1158
-#define IMG_CUSTOM_241_EDITOR                          1159
-#define IMG_CUSTOM_242                                 1160
-#define IMG_CUSTOM_242_EDITOR                          1161
-#define IMG_CUSTOM_243                                 1162
-#define IMG_CUSTOM_243_EDITOR                          1163
-#define IMG_CUSTOM_244                                 1164
-#define IMG_CUSTOM_244_EDITOR                          1165
-#define IMG_CUSTOM_245                                 1166
-#define IMG_CUSTOM_245_EDITOR                          1167
-#define IMG_CUSTOM_246                                 1168
-#define IMG_CUSTOM_246_EDITOR                          1169
-#define IMG_CUSTOM_247                                 1170
-#define IMG_CUSTOM_247_EDITOR                          1171
-#define IMG_CUSTOM_248                                 1172
-#define IMG_CUSTOM_248_EDITOR                          1173
-#define IMG_CUSTOM_249                                 1174
-#define IMG_CUSTOM_249_EDITOR                          1175
-#define IMG_CUSTOM_250                                 1176
-#define IMG_CUSTOM_250_EDITOR                          1177
-#define IMG_CUSTOM_251                                 1178
-#define IMG_CUSTOM_251_EDITOR                          1179
-#define IMG_CUSTOM_252                                 1180
-#define IMG_CUSTOM_252_EDITOR                          1181
-#define IMG_CUSTOM_253                                 1182
-#define IMG_CUSTOM_253_EDITOR                          1183
-#define IMG_CUSTOM_254                                 1184
-#define IMG_CUSTOM_254_EDITOR                          1185
-#define IMG_CUSTOM_255                                 1186
-#define IMG_CUSTOM_255_EDITOR                          1187
-#define IMG_CUSTOM_256                                 1188
-#define IMG_CUSTOM_256_EDITOR                          1189
-#define IMG_TOON_1                                     1190
-#define IMG_TOON_2                                     1191
-#define IMG_TOON_3                                     1192
-#define IMG_TOON_4                                     1193
-#define IMG_TOON_5                                     1194
-#define IMG_TOON_6                                     1195
-#define IMG_TOON_7                                     1196
-#define IMG_TOON_8                                     1197
-#define IMG_TOON_9                                     1198
-#define IMG_TOON_10                                    1199
-#define IMG_TOON_11                                    1200
-#define IMG_TOON_12                                    1201
-#define IMG_TOON_13                                    1202
-#define IMG_TOON_14                                    1203
-#define IMG_TOON_15                                    1204
-#define IMG_TOON_16                                    1205
-#define IMG_TOON_17                                    1206
-#define IMG_TOON_18                                    1207
-#define IMG_TOON_19                                    1208
-#define IMG_TOON_20                                    1209
-#define IMG_MENU_CALIBRATE_RED                         1210
-#define IMG_MENU_CALIBRATE_BLUE                                1211
-#define IMG_MENU_CALIBRATE_YELLOW                      1212
-#define IMG_MENU_BUTTON                                        1213
-#define IMG_MENU_BUTTON_ACTIVE                         1214
-#define IMG_MENU_BUTTON_LEFT                           1215
-#define IMG_MENU_BUTTON_RIGHT                          1216
-#define IMG_MENU_BUTTON_UP                             1217
-#define IMG_MENU_BUTTON_DOWN                           1218
-#define IMG_MENU_BUTTON_LEFT_ACTIVE                    1219
-#define IMG_MENU_BUTTON_RIGHT_ACTIVE                   1220
-#define IMG_MENU_BUTTON_UP_ACTIVE                      1221
-#define IMG_MENU_BUTTON_DOWN_ACTIVE                    1222
-#define IMG_MENU_SCROLLBAR                             1223
-#define IMG_MENU_SCROLLBAR_ACTIVE                      1224
-#define IMG_FONT_INITIAL_1                             1225
-#define IMG_FONT_INITIAL_2                             1226
-#define IMG_FONT_INITIAL_3                             1227
-#define IMG_FONT_INITIAL_4                             1228
-#define IMG_FONT_TITLE_1                               1229
-#define IMG_FONT_TITLE_1_LEVELS                                1230
-#define IMG_FONT_TITLE_2                               1231
-#define IMG_FONT_MENU_1                                        1232
-#define IMG_FONT_MENU_2                                        1233
-#define IMG_FONT_TEXT_1                                        1234
-#define IMG_FONT_TEXT_1_LEVELS                         1235
-#define IMG_FONT_TEXT_1_PREVIEW                                1236
-#define IMG_FONT_TEXT_1_SCORES                         1237
-#define IMG_FONT_TEXT_1_ACTIVE_SCORES                  1238
-#define IMG_FONT_TEXT_2                                        1239
-#define IMG_FONT_TEXT_2_LEVELS                         1240
-#define IMG_FONT_TEXT_2_PREVIEW                                1241
-#define IMG_FONT_TEXT_2_SCORES                         1242
-#define IMG_FONT_TEXT_2_ACTIVE_SCORES                  1243
-#define IMG_FONT_TEXT_3                                        1244
-#define IMG_FONT_TEXT_3_LEVELS                         1245
-#define IMG_FONT_TEXT_3_PREVIEW                                1246
-#define IMG_FONT_TEXT_3_SCORES                         1247
-#define IMG_FONT_TEXT_3_ACTIVE_SCORES                  1248
-#define IMG_FONT_TEXT_4                                        1249
-#define IMG_FONT_TEXT_4_LEVELS                         1250
-#define IMG_FONT_TEXT_4_SCORES                         1251
-#define IMG_FONT_TEXT_4_ACTIVE_SCORES                  1252
-#define IMG_FONT_ENVELOPE_1                            1253
-#define IMG_FONT_ENVELOPE_2                            1254
-#define IMG_FONT_ENVELOPE_3                            1255
-#define IMG_FONT_ENVELOPE_4                            1256
-#define IMG_FONT_INPUT_1                               1257
-#define IMG_FONT_INPUT_1_MAIN                          1258
-#define IMG_FONT_INPUT_1_ACTIVE                                1259
-#define IMG_FONT_INPUT_1_ACTIVE_MAIN                   1260
-#define IMG_FONT_INPUT_1_ACTIVE_SETUP                  1261
-#define IMG_FONT_INPUT_2                               1262
-#define IMG_FONT_INPUT_2_ACTIVE                                1263
-#define IMG_FONT_OPTION_OFF                            1264
-#define IMG_FONT_OPTION_ON                             1265
-#define IMG_FONT_VALUE_1                               1266
-#define IMG_FONT_VALUE_2                               1267
-#define IMG_FONT_VALUE_OLD                             1268
-#define IMG_FONT_LEVEL_NUMBER                          1269
-#define IMG_FONT_TAPE_RECORDER                         1270
-#define IMG_FONT_GAME_INFO                             1271
-#define IMG_GLOBAL_BORDER                              1272
-#define IMG_GLOBAL_DOOR                                        1273
-#define IMG_EDITOR_ELEMENT_BORDER                      1274
-#define IMG_EDITOR_ELEMENT_BORDER_INPUT                        1275
-#define IMG_BACKGROUND_ENVELOPE_1                      1276
-#define IMG_BACKGROUND_ENVELOPE_2                      1277
-#define IMG_BACKGROUND_ENVELOPE_3                      1278
-#define IMG_BACKGROUND_ENVELOPE_4                      1279
-#define IMG_BACKGROUND                                 1280
-#define IMG_BACKGROUND_MAIN                            1281
-#define IMG_BACKGROUND_LEVELS                          1282
-#define IMG_BACKGROUND_SCORES                          1283
-#define IMG_BACKGROUND_EDITOR                          1284
-#define IMG_BACKGROUND_INFO                            1285
-#define IMG_BACKGROUND_SETUP                           1286
-#define IMG_BACKGROUND_DOOR                            1287
+#define IMG_BD_BUTTERFLY_RIGHT_EDITOR                  21
+#define IMG_BD_BUTTERFLY_UP                            22
+#define IMG_BD_BUTTERFLY_UP_EDITOR                     23
+#define IMG_BD_BUTTERFLY_LEFT                          24
+#define IMG_BD_BUTTERFLY_LEFT_EDITOR                   25
+#define IMG_BD_BUTTERFLY_DOWN                          26
+#define IMG_BD_BUTTERFLY_DOWN_EDITOR                   27
+#define IMG_BD_FIREFLY                                 28
+#define IMG_BD_FIREFLY_RIGHT                           29
+#define IMG_BD_FIREFLY_RIGHT_EDITOR                    30
+#define IMG_BD_FIREFLY_UP                              31
+#define IMG_BD_FIREFLY_UP_EDITOR                       32
+#define IMG_BD_FIREFLY_LEFT                            33
+#define IMG_BD_FIREFLY_LEFT_EDITOR                     34
+#define IMG_BD_FIREFLY_DOWN                            35
+#define IMG_BD_FIREFLY_DOWN_EDITOR                     36
+#define IMG_SP_DEFAULT_EXPLODING                       37
+#define IMG_SP_ZONK                                    38
+#define IMG_SP_ZONK_MOVING_LEFT                                39
+#define IMG_SP_ZONK_MOVING_RIGHT                       40
+#define IMG_SP_ZONK_PUSHING_LEFT                       41
+#define IMG_SP_ZONK_PUSHING_RIGHT                      42
+#define IMG_SP_BASE                                    43
+#define IMG_SP_MURPHY                                  44
+#define IMG_SP_MURPHY_MOVING_LEFT                      45
+#define IMG_SP_MURPHY_MOVING_RIGHT                     46
+#define IMG_SP_MURPHY_DIGGING_LEFT                     47
+#define IMG_SP_MURPHY_DIGGING_RIGHT                    48
+#define IMG_SP_MURPHY_COLLECTING_LEFT                  49
+#define IMG_SP_MURPHY_COLLECTING_RIGHT                 50
+#define IMG_SP_MURPHY_PUSHING_LEFT                     51
+#define IMG_SP_MURPHY_PUSHING_RIGHT                    52
+#define IMG_SP_MURPHY_SNAPPING_LEFT                    53
+#define IMG_SP_MURPHY_SNAPPING_RIGHT                   54
+#define IMG_SP_MURPHY_SNAPPING_UP                      55
+#define IMG_SP_MURPHY_SNAPPING_DOWN                    56
+#define IMG_SP_MURPHY_CLONE                            57
+#define IMG_SP_INFOTRON                                        58
+#define IMG_SP_INFOTRON_EDITOR                         59
+#define IMG_SP_CHIP_SINGLE                             60
+#define IMG_SP_CHIP_LEFT                               61
+#define IMG_SP_CHIP_RIGHT                              62
+#define IMG_SP_CHIP_TOP                                        63
+#define IMG_SP_CHIP_BOTTOM                             64
+#define IMG_SP_HARDWARE_GRAY                           65
+#define IMG_SP_HARDWARE_GREEN                          66
+#define IMG_SP_HARDWARE_BLUE                           67
+#define IMG_SP_HARDWARE_RED                            68
+#define IMG_SP_HARDWARE_YELLOW                         69
+#define IMG_SP_EXIT_CLOSED                             70
+#define IMG_SP_EXIT_OPENING                            71
+#define IMG_SP_EXIT_OPEN                               72
+#define IMG_SP_EXIT_CLOSING                            73
+#define IMG_SP_DISK_ORANGE                             74
+#define IMG_SP_DISK_YELLOW                             75
+#define IMG_SP_DISK_RED                                        76
+#define IMG_SP_DISK_RED_COLLECTING                     77
+#define IMG_SP_DISK_RED_ACTIVE                         78
+#define IMG_SP_PORT_RIGHT                              79
+#define IMG_SP_PORT_DOWN                               80
+#define IMG_SP_PORT_LEFT                               81
+#define IMG_SP_PORT_UP                                 82
+#define IMG_SP_PORT_HORIZONTAL                         83
+#define IMG_SP_PORT_VERTICAL                           84
+#define IMG_SP_PORT_ANY                                        85
+#define IMG_SP_GRAVITY_PORT_RIGHT                      86
+#define IMG_SP_GRAVITY_PORT_DOWN                       87
+#define IMG_SP_GRAVITY_PORT_LEFT                       88
+#define IMG_SP_GRAVITY_PORT_UP                         89
+#define IMG_SP_SNIKSNAK                                        90
+#define IMG_SP_SNIKSNAK_LEFT                           91
+#define IMG_SP_SNIKSNAK_RIGHT                          92
+#define IMG_SP_SNIKSNAK_UP                             93
+#define IMG_SP_SNIKSNAK_DOWN                           94
+#define IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_UP           95
+#define IMG_SP_SNIKSNAK_TURNING_FROM_LEFT_DOWN         96
+#define IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_UP          97
+#define IMG_SP_SNIKSNAK_TURNING_FROM_RIGHT_DOWN                98
+#define IMG_SP_SNIKSNAK_TURNING_FROM_UP_LEFT           99
+#define IMG_SP_SNIKSNAK_TURNING_FROM_UP_RIGHT          100
+#define IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_LEFT         101
+#define IMG_SP_SNIKSNAK_TURNING_FROM_DOWN_RIGHT                102
+#define IMG_SP_ELECTRON                                        103
+#define IMG_SP_ELECTRON_EDITOR                         104
+#define IMG_SP_ELECTRON_EXPLODING                      105
+#define IMG_SP_TERMINAL                                        106
+#define IMG_SP_TERMINAL_EDITOR                         107
+#define IMG_SP_TERMINAL_ACTIVE                         108
+#define IMG_SP_BUGGY_BASE                              109
+#define IMG_SP_BUGGY_BASE_EDITOR                       110
+#define IMG_SP_BUGGY_BASE_ACTIVATING                   111
+#define IMG_SP_BUGGY_BASE_ACTIVE                       112
+#define IMG_SP_HARDWARE_BASE_1                         113
+#define IMG_SP_HARDWARE_BASE_2                         114
+#define IMG_SP_HARDWARE_BASE_3                         115
+#define IMG_SP_HARDWARE_BASE_4                         116
+#define IMG_SP_HARDWARE_BASE_5                         117
+#define IMG_SP_HARDWARE_BASE_6                         118
+#define IMG_SOKOBAN_OBJECT                             119
+#define IMG_SOKOBAN_OBJECT_EDITOR                      120
+#define IMG_SOKOBAN_FIELD_EMPTY                                121
+#define IMG_SOKOBAN_FIELD_FULL                         122
+#define IMG_EMPTY_SPACE                                        123
+#define IMG_SAND                                       124
+#define IMG_SAND_CRUMBLED                              125
+#define IMG_SAND_DIGGING_LEFT                          126
+#define IMG_SAND_DIGGING_RIGHT                         127
+#define IMG_SAND_DIGGING_UP                            128
+#define IMG_SAND_DIGGING_DOWN                          129
+#define IMG_SAND_DIGGING_LEFT_CRUMBLED                 130
+#define IMG_SAND_DIGGING_RIGHT_CRUMBLED                        131
+#define IMG_SAND_DIGGING_UP_CRUMBLED                   132
+#define IMG_SAND_DIGGING_DOWN_CRUMBLED                 133
+#define IMG_WALL                                       134
+#define IMG_WALL_SLIPPERY                              135
+#define IMG_STEELWALL                                  136
+#define IMG_ROCK                                       137
+#define IMG_ROCK_MOVING_LEFT                           138
+#define IMG_ROCK_MOVING_RIGHT                          139
+#define IMG_ROCK_PUSHING_LEFT                          140
+#define IMG_ROCK_PUSHING_RIGHT                         141
+#define IMG_EMERALD                                    142
+#define IMG_EMERALD_MOVING                             143
+#define IMG_EMERALD_FALLING                            144
+#define IMG_EMERALD_COLLECTING                         145
+#define IMG_DIAMOND                                    146
+#define IMG_DIAMOND_MOVING                             147
+#define IMG_DIAMOND_FALLING                            148
+#define IMG_DIAMOND_COLLECTING                         149
+#define IMG_BOMB                                       150
+#define IMG_NUT                                                151
+#define IMG_NUT_BREAKING                               152
+#define IMG_DYNAMITE                                   153
+#define IMG_DYNAMITE_EDITOR                            154
+#define IMG_DYNAMITE_ACTIVE                            155
+#define IMG_DYNAMITE_ACTIVE_EDITOR                     156
+#define IMG_WALL_EMERALD                               157
+#define IMG_WALL_DIAMOND                               158
+#define IMG_BUG                                                159
+#define IMG_BUG_RIGHT                                  160
+#define IMG_BUG_UP                                     161
+#define IMG_BUG_LEFT                                   162
+#define IMG_BUG_DOWN                                   163
+#define IMG_BUG_MOVING_RIGHT                           164
+#define IMG_BUG_MOVING_UP                              165
+#define IMG_BUG_MOVING_LEFT                            166
+#define IMG_BUG_MOVING_DOWN                            167
+#define IMG_BUG_TURNING_FROM_RIGHT_UP                  168
+#define IMG_BUG_TURNING_FROM_UP_LEFT                   169
+#define IMG_BUG_TURNING_FROM_LEFT_DOWN                 170
+#define IMG_BUG_TURNING_FROM_DOWN_RIGHT                        171
+#define IMG_BUG_TURNING_FROM_RIGHT_DOWN                        172
+#define IMG_BUG_TURNING_FROM_UP_RIGHT                  173
+#define IMG_BUG_TURNING_FROM_LEFT_UP                   174
+#define IMG_BUG_TURNING_FROM_DOWN_LEFT                 175
+#define IMG_SPACESHIP                                  176
+#define IMG_SPACESHIP_RIGHT                            177
+#define IMG_SPACESHIP_UP                               178
+#define IMG_SPACESHIP_LEFT                             179
+#define IMG_SPACESHIP_DOWN                             180
+#define IMG_SPACESHIP_MOVING_RIGHT                     181
+#define IMG_SPACESHIP_MOVING_UP                                182
+#define IMG_SPACESHIP_MOVING_LEFT                      183
+#define IMG_SPACESHIP_MOVING_DOWN                      184
+#define IMG_SPACESHIP_TURNING_FROM_RIGHT_UP            185
+#define IMG_SPACESHIP_TURNING_FROM_UP_LEFT             186
+#define IMG_SPACESHIP_TURNING_FROM_LEFT_DOWN           187
+#define IMG_SPACESHIP_TURNING_FROM_DOWN_RIGHT          188
+#define IMG_SPACESHIP_TURNING_FROM_RIGHT_DOWN          189
+#define IMG_SPACESHIP_TURNING_FROM_UP_RIGHT            190
+#define IMG_SPACESHIP_TURNING_FROM_LEFT_UP             191
+#define IMG_SPACESHIP_TURNING_FROM_DOWN_LEFT           192
+#define IMG_YAMYAM                                     193
+#define IMG_YAMYAM_MOVING                              194
+#define IMG_ROBOT                                      195
+#define IMG_ROBOT_MOVING                               196
+#define IMG_ROBOT_WHEEL                                        197
+#define IMG_ROBOT_WHEEL_ACTIVE                         198
+#define IMG_MAGIC_WALL                                 199
+#define IMG_MAGIC_WALL_ACTIVE                          200
+#define IMG_MAGIC_WALL_FILLING                         201
+#define IMG_MAGIC_WALL_FULL                            202
+#define IMG_MAGIC_WALL_EMPTYING                                203
+#define IMG_MAGIC_WALL_DEAD                            204
+#define IMG_QUICKSAND_EMPTY                            205
+#define IMG_QUICKSAND_FILLING                          206
+#define IMG_QUICKSAND_FULL                             207
+#define IMG_QUICKSAND_FULL_EDITOR                      208
+#define IMG_QUICKSAND_EMPTYING                         209
+#define IMG_ACID_POOL_TOPLEFT                          210
+#define IMG_ACID_POOL_TOPRIGHT                         211
+#define IMG_ACID_POOL_BOTTOMLEFT                       212
+#define IMG_ACID_POOL_BOTTOM                           213
+#define IMG_ACID_POOL_BOTTOMRIGHT                      214
+#define IMG_ACID                                       215
+#define IMG_ACID_SPLASH_LEFT                           216
+#define IMG_ACID_SPLASH_RIGHT                          217
+#define IMG_AMOEBA_DROP                                        218
+#define IMG_AMOEBA_GROWING                             219
+#define IMG_AMOEBA_SHRINKING                           220
+#define IMG_AMOEBA_WET                                 221
+#define IMG_AMOEBA_WET_EDITOR                          222
+#define IMG_AMOEBA_DROPPING                            223
+#define IMG_AMOEBA_DRY                                 224
+#define IMG_AMOEBA_FULL                                        225
+#define IMG_AMOEBA_FULL_EDITOR                         226
+#define IMG_AMOEBA_DEAD                                        227
+#define IMG_AMOEBA_DEAD_EDITOR                         228
+#define IMG_EM_KEY_1                                   229
+#define IMG_EM_KEY_2                                   230
+#define IMG_EM_KEY_3                                   231
+#define IMG_EM_KEY_4                                   232
+#define IMG_EM_GATE_1                                  233
+#define IMG_EM_GATE_2                                  234
+#define IMG_EM_GATE_3                                  235
+#define IMG_EM_GATE_4                                  236
+#define IMG_EM_GATE_1_GRAY                             237
+#define IMG_EM_GATE_1_GRAY_EDITOR                      238
+#define IMG_EM_GATE_2_GRAY                             239
+#define IMG_EM_GATE_2_GRAY_EDITOR                      240
+#define IMG_EM_GATE_3_GRAY                             241
+#define IMG_EM_GATE_3_GRAY_EDITOR                      242
+#define IMG_EM_GATE_4_GRAY                             243
+#define IMG_EM_GATE_4_GRAY_EDITOR                      244
+#define IMG_EXIT_CLOSED                                        245
+#define IMG_EXIT_OPENING                               246
+#define IMG_EXIT_OPEN                                  247
+#define IMG_EXIT_CLOSING                               248
+#define IMG_BALLOON                                    249
+#define IMG_BALLOON_MOVING                             250
+#define IMG_BALLOON_PUSHING                            251
+#define IMG_BALLOON_SWITCH_LEFT                                252
+#define IMG_BALLOON_SWITCH_RIGHT                       253
+#define IMG_BALLOON_SWITCH_UP                          254
+#define IMG_BALLOON_SWITCH_DOWN                                255
+#define IMG_BALLOON_SWITCH_ANY                         256
+#define IMG_SPRING                                     257
+#define IMG_EMC_STEELWALL_1                            258
+#define IMG_EMC_STEELWALL_2                            259
+#define IMG_EMC_STEELWALL_3                            260
+#define IMG_EMC_STEELWALL_4                            261
+#define IMG_EMC_WALL_1                                 262
+#define IMG_EMC_WALL_2                                 263
+#define IMG_EMC_WALL_3                                 264
+#define IMG_EMC_WALL_4                                 265
+#define IMG_EMC_WALL_5                                 266
+#define IMG_EMC_WALL_6                                 267
+#define IMG_EMC_WALL_7                                 268
+#define IMG_EMC_WALL_8                                 269
+#define IMG_INVISIBLE_STEELWALL                                270
+#define IMG_INVISIBLE_STEELWALL_EDITOR                 271
+#define IMG_INVISIBLE_STEELWALL_ACTIVE                 272
+#define IMG_INVISIBLE_WALL                             273
+#define IMG_INVISIBLE_WALL_EDITOR                      274
+#define IMG_INVISIBLE_WALL_ACTIVE                      275
+#define IMG_INVISIBLE_SAND                             276
+#define IMG_INVISIBLE_SAND_EDITOR                      277
+#define IMG_INVISIBLE_SAND_ACTIVE                      278
+#define IMG_CONVEYOR_BELT_1_MIDDLE                     279
+#define IMG_CONVEYOR_BELT_1_MIDDLE_ACTIVE              280
+#define IMG_CONVEYOR_BELT_1_LEFT                       281
+#define IMG_CONVEYOR_BELT_1_LEFT_ACTIVE                        282
+#define IMG_CONVEYOR_BELT_1_RIGHT                      283
+#define IMG_CONVEYOR_BELT_1_RIGHT_ACTIVE               284
+#define IMG_CONVEYOR_BELT_1_SWITCH_LEFT                        285
+#define IMG_CONVEYOR_BELT_1_SWITCH_MIDDLE              286
+#define IMG_CONVEYOR_BELT_1_SWITCH_RIGHT               287
+#define IMG_CONVEYOR_BELT_2_MIDDLE                     288
+#define IMG_CONVEYOR_BELT_2_MIDDLE_ACTIVE              289
+#define IMG_CONVEYOR_BELT_2_LEFT                       290
+#define IMG_CONVEYOR_BELT_2_LEFT_ACTIVE                        291
+#define IMG_CONVEYOR_BELT_2_RIGHT                      292
+#define IMG_CONVEYOR_BELT_2_RIGHT_ACTIVE               293
+#define IMG_CONVEYOR_BELT_2_SWITCH_LEFT                        294
+#define IMG_CONVEYOR_BELT_2_SWITCH_MIDDLE              295
+#define IMG_CONVEYOR_BELT_2_SWITCH_RIGHT               296
+#define IMG_CONVEYOR_BELT_3_MIDDLE                     297
+#define IMG_CONVEYOR_BELT_3_MIDDLE_ACTIVE              298
+#define IMG_CONVEYOR_BELT_3_LEFT                       299
+#define IMG_CONVEYOR_BELT_3_LEFT_ACTIVE                        300
+#define IMG_CONVEYOR_BELT_3_RIGHT                      301
+#define IMG_CONVEYOR_BELT_3_RIGHT_ACTIVE               302
+#define IMG_CONVEYOR_BELT_3_SWITCH_LEFT                        303
+#define IMG_CONVEYOR_BELT_3_SWITCH_MIDDLE              304
+#define IMG_CONVEYOR_BELT_3_SWITCH_RIGHT               305
+#define IMG_CONVEYOR_BELT_4_MIDDLE                     306
+#define IMG_CONVEYOR_BELT_4_MIDDLE_ACTIVE              307
+#define IMG_CONVEYOR_BELT_4_LEFT                       308
+#define IMG_CONVEYOR_BELT_4_LEFT_ACTIVE                        309
+#define IMG_CONVEYOR_BELT_4_RIGHT                      310
+#define IMG_CONVEYOR_BELT_4_RIGHT_ACTIVE               311
+#define IMG_CONVEYOR_BELT_4_SWITCH_LEFT                        312
+#define IMG_CONVEYOR_BELT_4_SWITCH_MIDDLE              313
+#define IMG_CONVEYOR_BELT_4_SWITCH_RIGHT               314
+#define IMG_SWITCHGATE_SWITCH_UP                       315
+#define IMG_SWITCHGATE_SWITCH_DOWN                     316
+#define IMG_LIGHT_SWITCH                               317
+#define IMG_LIGHT_SWITCH_ACTIVE                                318
+#define IMG_TIMEGATE_SWITCH                            319
+#define IMG_TIMEGATE_SWITCH_ACTIVE                     320
+#define IMG_ENVELOPE_1                                 321
+#define IMG_ENVELOPE_1_COLLECTING                      322
+#define IMG_ENVELOPE_2                                 323
+#define IMG_ENVELOPE_2_COLLECTING                      324
+#define IMG_ENVELOPE_3                                 325
+#define IMG_ENVELOPE_3_COLLECTING                      326
+#define IMG_ENVELOPE_4                                 327
+#define IMG_ENVELOPE_4_COLLECTING                      328
+#define IMG_SIGN_EXCLAMATION                           329
+#define IMG_SIGN_STOP                                  330
+#define IMG_LANDMINE                                   331
+#define IMG_STEELWALL_SLIPPERY                         332
+#define IMG_EXTRA_TIME                                 333
+#define IMG_SHIELD_NORMAL                              334
+#define IMG_SHIELD_NORMAL_ACTIVE                       335
+#define IMG_SHIELD_DEADLY                              336
+#define IMG_SHIELD_DEADLY_ACTIVE                       337
+#define IMG_SWITCHGATE_CLOSED                          338
+#define IMG_SWITCHGATE_OPENING                         339
+#define IMG_SWITCHGATE_OPEN                            340
+#define IMG_SWITCHGATE_CLOSING                         341
+#define IMG_TIMEGATE_CLOSED                            342
+#define IMG_TIMEGATE_OPENING                           343
+#define IMG_TIMEGATE_OPEN                              344
+#define IMG_TIMEGATE_CLOSING                           345
+#define IMG_PEARL                                      346
+#define IMG_PEARL_BREAKING                             347
+#define IMG_CRYSTAL                                    348
+#define IMG_WALL_PEARL                                 349
+#define IMG_WALL_CRYSTAL                               350
+#define IMG_TUBE_RIGHT_DOWN                            351
+#define IMG_TUBE_HORIZONTAL_DOWN                       352
+#define IMG_TUBE_LEFT_DOWN                             353
+#define IMG_TUBE_HORIZONTAL                            354
+#define IMG_TUBE_VERTICAL_RIGHT                                355
+#define IMG_TUBE_ANY                                   356
+#define IMG_TUBE_VERTICAL_LEFT                         357
+#define IMG_TUBE_VERTICAL                              358
+#define IMG_TUBE_RIGHT_UP                              359
+#define IMG_TUBE_HORIZONTAL_UP                         360
+#define IMG_TUBE_LEFT_UP                               361
+#define IMG_TRAP                                       362
+#define IMG_TRAP_ACTIVE                                        363
+#define IMG_DX_SUPABOMB                                        364
+#define IMG_KEY_1                                      365
+#define IMG_KEY_1_EDITOR                               366
+#define IMG_KEY_2                                      367
+#define IMG_KEY_2_EDITOR                               368
+#define IMG_KEY_3                                      369
+#define IMG_KEY_3_EDITOR                               370
+#define IMG_KEY_4                                      371
+#define IMG_KEY_4_EDITOR                               372
+#define IMG_GATE_1                                     373
+#define IMG_GATE_2                                     374
+#define IMG_GATE_3                                     375
+#define IMG_GATE_4                                     376
+#define IMG_GATE_1_GRAY                                        377
+#define IMG_GATE_1_GRAY_EDITOR                         378
+#define IMG_GATE_2_GRAY                                        379
+#define IMG_GATE_2_GRAY_EDITOR                         380
+#define IMG_GATE_3_GRAY                                        381
+#define IMG_GATE_3_GRAY_EDITOR                         382
+#define IMG_GATE_4_GRAY                                        383
+#define IMG_GATE_4_GRAY_EDITOR                         384
+#define IMG_GAME_OF_LIFE                               385
+#define IMG_BIOMAZE                                    386
+#define IMG_PACMAN                                     387
+#define IMG_PACMAN_RIGHT                               388
+#define IMG_PACMAN_UP                                  389
+#define IMG_PACMAN_LEFT                                        390
+#define IMG_PACMAN_DOWN                                        391
+#define IMG_PACMAN_TURNING_FROM_RIGHT                  392
+#define IMG_PACMAN_TURNING_FROM_UP                     393
+#define IMG_PACMAN_TURNING_FROM_LEFT                   394
+#define IMG_PACMAN_TURNING_FROM_DOWN                   395
+#define IMG_LAMP                                       396
+#define IMG_LAMP_EDITOR                                        397
+#define IMG_LAMP_ACTIVE                                        398
+#define IMG_TIME_ORB_FULL                              399
+#define IMG_TIME_ORB_EMPTY                             400
+#define IMG_EMERALD_YELLOW                             401
+#define IMG_EMERALD_YELLOW_MOVING                      402
+#define IMG_EMERALD_YELLOW_FALLING                     403
+#define IMG_EMERALD_RED                                        404
+#define IMG_EMERALD_RED_MOVING                         405
+#define IMG_EMERALD_RED_FALLING                                406
+#define IMG_EMERALD_PURPLE                             407
+#define IMG_EMERALD_PURPLE_MOVING                      408
+#define IMG_EMERALD_PURPLE_FALLING                     409
+#define IMG_WALL_EMERALD_YELLOW                                410
+#define IMG_WALL_EMERALD_RED                           411
+#define IMG_WALL_EMERALD_PURPLE                                412
+#define IMG_WALL_BD_DIAMOND                            413
+#define IMG_EXPANDABLE_WALL                            414
+#define IMG_EXPANDABLE_WALL_HORIZONTAL                 415
+#define IMG_EXPANDABLE_WALL_HORIZONTAL_EDITOR          416
+#define IMG_EXPANDABLE_WALL_VERTICAL                   417
+#define IMG_EXPANDABLE_WALL_VERTICAL_EDITOR            418
+#define IMG_EXPANDABLE_WALL_ANY                                419
+#define IMG_EXPANDABLE_WALL_ANY_EDITOR                 420
+#define IMG_EXPANDABLE_WALL_GROWING_LEFT               421
+#define IMG_EXPANDABLE_WALL_GROWING_RIGHT              422
+#define IMG_EXPANDABLE_WALL_GROWING_UP                 423
+#define IMG_EXPANDABLE_WALL_GROWING_DOWN               424
+#define IMG_BLACK_ORB                                  425
+#define IMG_SPEED_PILL                                 426
+#define IMG_DARK_YAMYAM                                        427
+#define IMG_DYNABOMB                                   428
+#define IMG_DYNABOMB_ACTIVE                            429
+#define IMG_DYNABOMB_PLAYER_1                          430
+#define IMG_DYNABOMB_PLAYER_1_ACTIVE                   431
+#define IMG_DYNABOMB_PLAYER_2                          432
+#define IMG_DYNABOMB_PLAYER_2_ACTIVE                   433
+#define IMG_DYNABOMB_PLAYER_3                          434
+#define IMG_DYNABOMB_PLAYER_3_ACTIVE                   435
+#define IMG_DYNABOMB_PLAYER_4                          436
+#define IMG_DYNABOMB_PLAYER_4_ACTIVE                   437
+#define IMG_DYNABOMB_INCREASE_NUMBER                   438
+#define IMG_DYNABOMB_INCREASE_SIZE                     439
+#define IMG_DYNABOMB_INCREASE_POWER                    440
+#define IMG_PIG                                                441
+#define IMG_PIG_DOWN                                   442
+#define IMG_PIG_UP                                     443
+#define IMG_PIG_LEFT                                   444
+#define IMG_PIG_RIGHT                                  445
+#define IMG_PIG_MOVING_DOWN                            446
+#define IMG_PIG_MOVING_UP                              447
+#define IMG_PIG_MOVING_LEFT                            448
+#define IMG_PIG_MOVING_RIGHT                           449
+#define IMG_PIG_DIGGING_DOWN                           450
+#define IMG_PIG_DIGGING_UP                             451
+#define IMG_PIG_DIGGING_LEFT                           452
+#define IMG_PIG_DIGGING_RIGHT                          453
+#define IMG_DRAGON                                     454
+#define IMG_DRAGON_DOWN                                        455
+#define IMG_DRAGON_UP                                  456
+#define IMG_DRAGON_LEFT                                        457
+#define IMG_DRAGON_RIGHT                               458
+#define IMG_DRAGON_MOVING_DOWN                         459
+#define IMG_DRAGON_MOVING_UP                           460
+#define IMG_DRAGON_MOVING_LEFT                         461
+#define IMG_DRAGON_MOVING_RIGHT                                462
+#define IMG_DRAGON_ATTACKING_DOWN                      463
+#define IMG_DRAGON_ATTACKING_UP                                464
+#define IMG_DRAGON_ATTACKING_LEFT                      465
+#define IMG_DRAGON_ATTACKING_RIGHT                     466
+#define IMG_MOLE                                       467
+#define IMG_MOLE_DOWN                                  468
+#define IMG_MOLE_UP                                    469
+#define IMG_MOLE_LEFT                                  470
+#define IMG_MOLE_RIGHT                                 471
+#define IMG_MOLE_MOVING_DOWN                           472
+#define IMG_MOLE_MOVING_UP                             473
+#define IMG_MOLE_MOVING_LEFT                           474
+#define IMG_MOLE_MOVING_RIGHT                          475
+#define IMG_MOLE_DIGGING_DOWN                          476
+#define IMG_MOLE_DIGGING_UP                            477
+#define IMG_MOLE_DIGGING_LEFT                          478
+#define IMG_MOLE_DIGGING_RIGHT                         479
+#define IMG_PENGUIN                                    480
+#define IMG_PENGUIN_EDITOR                             481
+#define IMG_PENGUIN_DOWN                               482
+#define IMG_PENGUIN_UP                                 483
+#define IMG_PENGUIN_LEFT                               484
+#define IMG_PENGUIN_RIGHT                              485
+#define IMG_PENGUIN_MOVING_DOWN                                486
+#define IMG_PENGUIN_MOVING_UP                          487
+#define IMG_PENGUIN_MOVING_LEFT                                488
+#define IMG_PENGUIN_MOVING_RIGHT                       489
+#define IMG_SATELLITE                                  490
+#define IMG_FLAMES_1_LEFT                              491
+#define IMG_FLAMES_2_LEFT                              492
+#define IMG_FLAMES_3_LEFT                              493
+#define IMG_FLAMES_1_RIGHT                             494
+#define IMG_FLAMES_2_RIGHT                             495
+#define IMG_FLAMES_3_RIGHT                             496
+#define IMG_FLAMES_1_UP                                        497
+#define IMG_FLAMES_2_UP                                        498
+#define IMG_FLAMES_3_UP                                        499
+#define IMG_FLAMES_1_DOWN                              500
+#define IMG_FLAMES_2_DOWN                              501
+#define IMG_FLAMES_3_DOWN                              502
+#define IMG_STONEBLOCK                                 503
+#define IMG_PLAYER_1                                   504
+#define IMG_PLAYER_1_EDITOR                            505
+#define IMG_PLAYER_1_DOWN                              506
+#define IMG_PLAYER_1_UP                                        507
+#define IMG_PLAYER_1_LEFT                              508
+#define IMG_PLAYER_1_RIGHT                             509
+#define IMG_PLAYER_1_MOVING_DOWN                       510
+#define IMG_PLAYER_1_MOVING_UP                         511
+#define IMG_PLAYER_1_MOVING_LEFT                       512
+#define IMG_PLAYER_1_MOVING_RIGHT                      513
+#define IMG_PLAYER_1_DIGGING_DOWN                      514
+#define IMG_PLAYER_1_DIGGING_UP                                515
+#define IMG_PLAYER_1_DIGGING_LEFT                      516
+#define IMG_PLAYER_1_DIGGING_RIGHT                     517
+#define IMG_PLAYER_1_COLLECTING_DOWN                   518
+#define IMG_PLAYER_1_COLLECTING_UP                     519
+#define IMG_PLAYER_1_COLLECTING_LEFT                   520
+#define IMG_PLAYER_1_COLLECTING_RIGHT                  521
+#define IMG_PLAYER_1_PUSHING_DOWN                      522
+#define IMG_PLAYER_1_PUSHING_UP                                523
+#define IMG_PLAYER_1_PUSHING_LEFT                      524
+#define IMG_PLAYER_1_PUSHING_RIGHT                     525
+#define IMG_PLAYER_1_SNAPPING_DOWN                     526
+#define IMG_PLAYER_1_SNAPPING_UP                       527
+#define IMG_PLAYER_1_SNAPPING_LEFT                     528
+#define IMG_PLAYER_1_SNAPPING_RIGHT                    529
+#define IMG_PLAYER_2                                   530
+#define IMG_PLAYER_2_EDITOR                            531
+#define IMG_PLAYER_2_DOWN                              532
+#define IMG_PLAYER_2_UP                                        533
+#define IMG_PLAYER_2_LEFT                              534
+#define IMG_PLAYER_2_RIGHT                             535
+#define IMG_PLAYER_2_MOVING_DOWN                       536
+#define IMG_PLAYER_2_MOVING_UP                         537
+#define IMG_PLAYER_2_MOVING_LEFT                       538
+#define IMG_PLAYER_2_MOVING_RIGHT                      539
+#define IMG_PLAYER_2_DIGGING_DOWN                      540
+#define IMG_PLAYER_2_DIGGING_UP                                541
+#define IMG_PLAYER_2_DIGGING_LEFT                      542
+#define IMG_PLAYER_2_DIGGING_RIGHT                     543
+#define IMG_PLAYER_2_COLLECTING_DOWN                   544
+#define IMG_PLAYER_2_COLLECTING_UP                     545
+#define IMG_PLAYER_2_COLLECTING_LEFT                   546
+#define IMG_PLAYER_2_COLLECTING_RIGHT                  547
+#define IMG_PLAYER_2_PUSHING_DOWN                      548
+#define IMG_PLAYER_2_PUSHING_UP                                549
+#define IMG_PLAYER_2_PUSHING_LEFT                      550
+#define IMG_PLAYER_2_PUSHING_RIGHT                     551
+#define IMG_PLAYER_2_SNAPPING_DOWN                     552
+#define IMG_PLAYER_2_SNAPPING_UP                       553
+#define IMG_PLAYER_2_SNAPPING_LEFT                     554
+#define IMG_PLAYER_2_SNAPPING_RIGHT                    555
+#define IMG_PLAYER_3                                   556
+#define IMG_PLAYER_3_EDITOR                            557
+#define IMG_PLAYER_3_DOWN                              558
+#define IMG_PLAYER_3_UP                                        559
+#define IMG_PLAYER_3_LEFT                              560
+#define IMG_PLAYER_3_RIGHT                             561
+#define IMG_PLAYER_3_MOVING_DOWN                       562
+#define IMG_PLAYER_3_MOVING_UP                         563
+#define IMG_PLAYER_3_MOVING_LEFT                       564
+#define IMG_PLAYER_3_MOVING_RIGHT                      565
+#define IMG_PLAYER_3_DIGGING_DOWN                      566
+#define IMG_PLAYER_3_DIGGING_UP                                567
+#define IMG_PLAYER_3_DIGGING_LEFT                      568
+#define IMG_PLAYER_3_DIGGING_RIGHT                     569
+#define IMG_PLAYER_3_COLLECTING_DOWN                   570
+#define IMG_PLAYER_3_COLLECTING_UP                     571
+#define IMG_PLAYER_3_COLLECTING_LEFT                   572
+#define IMG_PLAYER_3_COLLECTING_RIGHT                  573
+#define IMG_PLAYER_3_PUSHING_DOWN                      574
+#define IMG_PLAYER_3_PUSHING_UP                                575
+#define IMG_PLAYER_3_PUSHING_LEFT                      576
+#define IMG_PLAYER_3_PUSHING_RIGHT                     577
+#define IMG_PLAYER_3_SNAPPING_DOWN                     578
+#define IMG_PLAYER_3_SNAPPING_UP                       579
+#define IMG_PLAYER_3_SNAPPING_LEFT                     580
+#define IMG_PLAYER_3_SNAPPING_RIGHT                    581
+#define IMG_PLAYER_4                                   582
+#define IMG_PLAYER_4_EDITOR                            583
+#define IMG_PLAYER_4_DOWN                              584
+#define IMG_PLAYER_4_UP                                        585
+#define IMG_PLAYER_4_LEFT                              586
+#define IMG_PLAYER_4_RIGHT                             587
+#define IMG_PLAYER_4_MOVING_DOWN                       588
+#define IMG_PLAYER_4_MOVING_UP                         589
+#define IMG_PLAYER_4_MOVING_LEFT                       590
+#define IMG_PLAYER_4_MOVING_RIGHT                      591
+#define IMG_PLAYER_4_DIGGING_DOWN                      592
+#define IMG_PLAYER_4_DIGGING_UP                                593
+#define IMG_PLAYER_4_DIGGING_LEFT                      594
+#define IMG_PLAYER_4_DIGGING_RIGHT                     595
+#define IMG_PLAYER_4_COLLECTING_DOWN                   596
+#define IMG_PLAYER_4_COLLECTING_UP                     597
+#define IMG_PLAYER_4_COLLECTING_LEFT                   598
+#define IMG_PLAYER_4_COLLECTING_RIGHT                  599
+#define IMG_PLAYER_4_PUSHING_DOWN                      600
+#define IMG_PLAYER_4_PUSHING_UP                                601
+#define IMG_PLAYER_4_PUSHING_LEFT                      602
+#define IMG_PLAYER_4_PUSHING_RIGHT                     603
+#define IMG_PLAYER_4_SNAPPING_DOWN                     604
+#define IMG_PLAYER_4_SNAPPING_UP                       605
+#define IMG_PLAYER_4_SNAPPING_LEFT                     606
+#define IMG_PLAYER_4_SNAPPING_RIGHT                    607
+#define IMG_DEFAULT_EXPLODING                          608
+#define IMG_TWINKLE_BLUE                               609
+#define IMG_TWINKLE_WHITE                              610
+#define IMG_STEELWALL_TOPLEFT                          611
+#define IMG_STEELWALL_TOPRIGHT                         612
+#define IMG_STEELWALL_BOTTOMLEFT                       613
+#define IMG_STEELWALL_BOTTOMRIGHT                      614
+#define IMG_STEELWALL_HORIZONTAL                       615
+#define IMG_STEELWALL_VERTICAL                         616
+#define IMG_STEELWALL_TOPLEFT_EDITOR                   617
+#define IMG_STEELWALL_TOPRIGHT_EDITOR                  618
+#define IMG_STEELWALL_BOTTOMLEFT_EDITOR                        619
+#define IMG_STEELWALL_BOTTOMRIGHT_EDITOR               620
+#define IMG_STEELWALL_HORIZONTAL_EDITOR                        621
+#define IMG_STEELWALL_VERTICAL_EDITOR                  622
+#define IMG_INVISIBLE_STEELWALL_TOPLEFT                        623
+#define IMG_INVISIBLE_STEELWALL_TOPRIGHT               624
+#define IMG_INVISIBLE_STEELWALL_BOTTOMLEFT             625
+#define IMG_INVISIBLE_STEELWALL_BOTTOMRIGHT            626
+#define IMG_INVISIBLE_STEELWALL_HORIZONTAL             627
+#define IMG_INVISIBLE_STEELWALL_VERTICAL               628
+#define IMG_INVISIBLE_STEELWALL_TOPLEFT_EDITOR         629
+#define IMG_INVISIBLE_STEELWALL_TOPRIGHT_EDITOR                630
+#define IMG_INVISIBLE_STEELWALL_BOTTOMLEFT_EDITOR      631
+#define IMG_INVISIBLE_STEELWALL_BOTTOMRIGHT_EDITOR     632
+#define IMG_INVISIBLE_STEELWALL_HORIZONTAL_EDITOR      633
+#define IMG_INVISIBLE_STEELWALL_VERTICAL_EDITOR                634
+#define IMG_ARROW_LEFT                                 635
+#define IMG_ARROW_RIGHT                                        636
+#define IMG_ARROW_UP                                   637
+#define IMG_ARROW_DOWN                                 638
+#define IMG_CHAR_SPACE                                 639
+#define IMG_CHAR_EXCLAM                                        640
+#define IMG_CHAR_QUOTEDBL                              641
+#define IMG_CHAR_NUMBERSIGN                            642
+#define IMG_CHAR_DOLLAR                                        643
+#define IMG_CHAR_PROCENT                               644
+#define IMG_CHAR_AMPERSAND                             645
+#define IMG_CHAR_APOSTROPHE                            646
+#define IMG_CHAR_PARENLEFT                             647
+#define IMG_CHAR_PARENRIGHT                            648
+#define IMG_CHAR_ASTERISK                              649
+#define IMG_CHAR_PLUS                                  650
+#define IMG_CHAR_COMMA                                 651
+#define IMG_CHAR_MINUS                                 652
+#define IMG_CHAR_PERIOD                                        653
+#define IMG_CHAR_SLASH                                 654
+#define IMG_CHAR_0                                     655
+#define IMG_CHAR_1                                     656
+#define IMG_CHAR_2                                     657
+#define IMG_CHAR_3                                     658
+#define IMG_CHAR_4                                     659
+#define IMG_CHAR_5                                     660
+#define IMG_CHAR_6                                     661
+#define IMG_CHAR_7                                     662
+#define IMG_CHAR_8                                     663
+#define IMG_CHAR_9                                     664
+#define IMG_CHAR_COLON                                 665
+#define IMG_CHAR_SEMICOLON                             666
+#define IMG_CHAR_LESS                                  667
+#define IMG_CHAR_EQUAL                                 668
+#define IMG_CHAR_GREATER                               669
+#define IMG_CHAR_QUESTION                              670
+#define IMG_CHAR_AT                                    671
+#define IMG_CHAR_A                                     672
+#define IMG_CHAR_B                                     673
+#define IMG_CHAR_C                                     674
+#define IMG_CHAR_D                                     675
+#define IMG_CHAR_E                                     676
+#define IMG_CHAR_F                                     677
+#define IMG_CHAR_G                                     678
+#define IMG_CHAR_H                                     679
+#define IMG_CHAR_I                                     680
+#define IMG_CHAR_J                                     681
+#define IMG_CHAR_K                                     682
+#define IMG_CHAR_L                                     683
+#define IMG_CHAR_M                                     684
+#define IMG_CHAR_N                                     685
+#define IMG_CHAR_O                                     686
+#define IMG_CHAR_P                                     687
+#define IMG_CHAR_Q                                     688
+#define IMG_CHAR_R                                     689
+#define IMG_CHAR_S                                     690
+#define IMG_CHAR_T                                     691
+#define IMG_CHAR_U                                     692
+#define IMG_CHAR_V                                     693
+#define IMG_CHAR_W                                     694
+#define IMG_CHAR_X                                     695
+#define IMG_CHAR_Y                                     696
+#define IMG_CHAR_Z                                     697
+#define IMG_CHAR_BRACKETLEFT                           698
+#define IMG_CHAR_BACKSLASH                             699
+#define IMG_CHAR_BRACKETRIGHT                          700
+#define IMG_CHAR_ASCIICIRCUM                           701
+#define IMG_CHAR_UNDERSCORE                            702
+#define IMG_CHAR_COPYRIGHT                             703
+#define IMG_CHAR_AUMLAUT                               704
+#define IMG_CHAR_OUMLAUT                               705
+#define IMG_CHAR_UUMLAUT                               706
+#define IMG_CHAR_DEGREE                                        707
+#define IMG_CHAR_TRADEMARK                             708
+#define IMG_CHAR_CURSOR                                        709
+#define IMG_CUSTOM_1                                   710
+#define IMG_CUSTOM_1_EDITOR                            711
+#define IMG_CUSTOM_2                                   712
+#define IMG_CUSTOM_2_EDITOR                            713
+#define IMG_CUSTOM_3                                   714
+#define IMG_CUSTOM_3_EDITOR                            715
+#define IMG_CUSTOM_4                                   716
+#define IMG_CUSTOM_4_EDITOR                            717
+#define IMG_CUSTOM_5                                   718
+#define IMG_CUSTOM_5_EDITOR                            719
+#define IMG_CUSTOM_6                                   720
+#define IMG_CUSTOM_6_EDITOR                            721
+#define IMG_CUSTOM_7                                   722
+#define IMG_CUSTOM_7_EDITOR                            723
+#define IMG_CUSTOM_8                                   724
+#define IMG_CUSTOM_8_EDITOR                            725
+#define IMG_CUSTOM_9                                   726
+#define IMG_CUSTOM_9_EDITOR                            727
+#define IMG_CUSTOM_10                                  728
+#define IMG_CUSTOM_10_EDITOR                           729
+#define IMG_CUSTOM_11                                  730
+#define IMG_CUSTOM_11_EDITOR                           731
+#define IMG_CUSTOM_12                                  732
+#define IMG_CUSTOM_12_EDITOR                           733
+#define IMG_CUSTOM_13                                  734
+#define IMG_CUSTOM_13_EDITOR                           735
+#define IMG_CUSTOM_14                                  736
+#define IMG_CUSTOM_14_EDITOR                           737
+#define IMG_CUSTOM_15                                  738
+#define IMG_CUSTOM_15_EDITOR                           739
+#define IMG_CUSTOM_16                                  740
+#define IMG_CUSTOM_16_EDITOR                           741
+#define IMG_CUSTOM_17                                  742
+#define IMG_CUSTOM_17_EDITOR                           743
+#define IMG_CUSTOM_18                                  744
+#define IMG_CUSTOM_18_EDITOR                           745
+#define IMG_CUSTOM_19                                  746
+#define IMG_CUSTOM_19_EDITOR                           747
+#define IMG_CUSTOM_20                                  748
+#define IMG_CUSTOM_20_EDITOR                           749
+#define IMG_CUSTOM_21                                  750
+#define IMG_CUSTOM_21_EDITOR                           751
+#define IMG_CUSTOM_22                                  752
+#define IMG_CUSTOM_22_EDITOR                           753
+#define IMG_CUSTOM_23                                  754
+#define IMG_CUSTOM_23_EDITOR                           755
+#define IMG_CUSTOM_24                                  756
+#define IMG_CUSTOM_24_EDITOR                           757
+#define IMG_CUSTOM_25                                  758
+#define IMG_CUSTOM_25_EDITOR                           759
+#define IMG_CUSTOM_26                                  760
+#define IMG_CUSTOM_26_EDITOR                           761
+#define IMG_CUSTOM_27                                  762
+#define IMG_CUSTOM_27_EDITOR                           763
+#define IMG_CUSTOM_28                                  764
+#define IMG_CUSTOM_28_EDITOR                           765
+#define IMG_CUSTOM_29                                  766
+#define IMG_CUSTOM_29_EDITOR                           767
+#define IMG_CUSTOM_30                                  768
+#define IMG_CUSTOM_30_EDITOR                           769
+#define IMG_CUSTOM_31                                  770
+#define IMG_CUSTOM_31_EDITOR                           771
+#define IMG_CUSTOM_32                                  772
+#define IMG_CUSTOM_32_EDITOR                           773
+#define IMG_CUSTOM_33                                  774
+#define IMG_CUSTOM_33_EDITOR                           775
+#define IMG_CUSTOM_34                                  776
+#define IMG_CUSTOM_34_EDITOR                           777
+#define IMG_CUSTOM_35                                  778
+#define IMG_CUSTOM_35_EDITOR                           779
+#define IMG_CUSTOM_36                                  780
+#define IMG_CUSTOM_36_EDITOR                           781
+#define IMG_CUSTOM_37                                  782
+#define IMG_CUSTOM_37_EDITOR                           783
+#define IMG_CUSTOM_38                                  784
+#define IMG_CUSTOM_38_EDITOR                           785
+#define IMG_CUSTOM_39                                  786
+#define IMG_CUSTOM_39_EDITOR                           787
+#define IMG_CUSTOM_40                                  788
+#define IMG_CUSTOM_40_EDITOR                           789
+#define IMG_CUSTOM_41                                  790
+#define IMG_CUSTOM_41_EDITOR                           791
+#define IMG_CUSTOM_42                                  792
+#define IMG_CUSTOM_42_EDITOR                           793
+#define IMG_CUSTOM_43                                  794
+#define IMG_CUSTOM_43_EDITOR                           795
+#define IMG_CUSTOM_44                                  796
+#define IMG_CUSTOM_44_EDITOR                           797
+#define IMG_CUSTOM_45                                  798
+#define IMG_CUSTOM_45_EDITOR                           799
+#define IMG_CUSTOM_46                                  800
+#define IMG_CUSTOM_46_EDITOR                           801
+#define IMG_CUSTOM_47                                  802
+#define IMG_CUSTOM_47_EDITOR                           803
+#define IMG_CUSTOM_48                                  804
+#define IMG_CUSTOM_48_EDITOR                           805
+#define IMG_CUSTOM_49                                  806
+#define IMG_CUSTOM_49_EDITOR                           807
+#define IMG_CUSTOM_50                                  808
+#define IMG_CUSTOM_50_EDITOR                           809
+#define IMG_CUSTOM_51                                  810
+#define IMG_CUSTOM_51_EDITOR                           811
+#define IMG_CUSTOM_52                                  812
+#define IMG_CUSTOM_52_EDITOR                           813
+#define IMG_CUSTOM_53                                  814
+#define IMG_CUSTOM_53_EDITOR                           815
+#define IMG_CUSTOM_54                                  816
+#define IMG_CUSTOM_54_EDITOR                           817
+#define IMG_CUSTOM_55                                  818
+#define IMG_CUSTOM_55_EDITOR                           819
+#define IMG_CUSTOM_56                                  820
+#define IMG_CUSTOM_56_EDITOR                           821
+#define IMG_CUSTOM_57                                  822
+#define IMG_CUSTOM_57_EDITOR                           823
+#define IMG_CUSTOM_58                                  824
+#define IMG_CUSTOM_58_EDITOR                           825
+#define IMG_CUSTOM_59                                  826
+#define IMG_CUSTOM_59_EDITOR                           827
+#define IMG_CUSTOM_60                                  828
+#define IMG_CUSTOM_60_EDITOR                           829
+#define IMG_CUSTOM_61                                  830
+#define IMG_CUSTOM_61_EDITOR                           831
+#define IMG_CUSTOM_62                                  832
+#define IMG_CUSTOM_62_EDITOR                           833
+#define IMG_CUSTOM_63                                  834
+#define IMG_CUSTOM_63_EDITOR                           835
+#define IMG_CUSTOM_64                                  836
+#define IMG_CUSTOM_64_EDITOR                           837
+#define IMG_CUSTOM_65                                  838
+#define IMG_CUSTOM_65_EDITOR                           839
+#define IMG_CUSTOM_66                                  840
+#define IMG_CUSTOM_66_EDITOR                           841
+#define IMG_CUSTOM_67                                  842
+#define IMG_CUSTOM_67_EDITOR                           843
+#define IMG_CUSTOM_68                                  844
+#define IMG_CUSTOM_68_EDITOR                           845
+#define IMG_CUSTOM_69                                  846
+#define IMG_CUSTOM_69_EDITOR                           847
+#define IMG_CUSTOM_70                                  848
+#define IMG_CUSTOM_70_EDITOR                           849
+#define IMG_CUSTOM_71                                  850
+#define IMG_CUSTOM_71_EDITOR                           851
+#define IMG_CUSTOM_72                                  852
+#define IMG_CUSTOM_72_EDITOR                           853
+#define IMG_CUSTOM_73                                  854
+#define IMG_CUSTOM_73_EDITOR                           855
+#define IMG_CUSTOM_74                                  856
+#define IMG_CUSTOM_74_EDITOR                           857
+#define IMG_CUSTOM_75                                  858
+#define IMG_CUSTOM_75_EDITOR                           859
+#define IMG_CUSTOM_76                                  860
+#define IMG_CUSTOM_76_EDITOR                           861
+#define IMG_CUSTOM_77                                  862
+#define IMG_CUSTOM_77_EDITOR                           863
+#define IMG_CUSTOM_78                                  864
+#define IMG_CUSTOM_78_EDITOR                           865
+#define IMG_CUSTOM_79                                  866
+#define IMG_CUSTOM_79_EDITOR                           867
+#define IMG_CUSTOM_80                                  868
+#define IMG_CUSTOM_80_EDITOR                           869
+#define IMG_CUSTOM_81                                  870
+#define IMG_CUSTOM_81_EDITOR                           871
+#define IMG_CUSTOM_82                                  872
+#define IMG_CUSTOM_82_EDITOR                           873
+#define IMG_CUSTOM_83                                  874
+#define IMG_CUSTOM_83_EDITOR                           875
+#define IMG_CUSTOM_84                                  876
+#define IMG_CUSTOM_84_EDITOR                           877
+#define IMG_CUSTOM_85                                  878
+#define IMG_CUSTOM_85_EDITOR                           879
+#define IMG_CUSTOM_86                                  880
+#define IMG_CUSTOM_86_EDITOR                           881
+#define IMG_CUSTOM_87                                  882
+#define IMG_CUSTOM_87_EDITOR                           883
+#define IMG_CUSTOM_88                                  884
+#define IMG_CUSTOM_88_EDITOR                           885
+#define IMG_CUSTOM_89                                  886
+#define IMG_CUSTOM_89_EDITOR                           887
+#define IMG_CUSTOM_90                                  888
+#define IMG_CUSTOM_90_EDITOR                           889
+#define IMG_CUSTOM_91                                  890
+#define IMG_CUSTOM_91_EDITOR                           891
+#define IMG_CUSTOM_92                                  892
+#define IMG_CUSTOM_92_EDITOR                           893
+#define IMG_CUSTOM_93                                  894
+#define IMG_CUSTOM_93_EDITOR                           895
+#define IMG_CUSTOM_94                                  896
+#define IMG_CUSTOM_94_EDITOR                           897
+#define IMG_CUSTOM_95                                  898
+#define IMG_CUSTOM_95_EDITOR                           899
+#define IMG_CUSTOM_96                                  900
+#define IMG_CUSTOM_96_EDITOR                           901
+#define IMG_CUSTOM_97                                  902
+#define IMG_CUSTOM_97_EDITOR                           903
+#define IMG_CUSTOM_98                                  904
+#define IMG_CUSTOM_98_EDITOR                           905
+#define IMG_CUSTOM_99                                  906
+#define IMG_CUSTOM_99_EDITOR                           907
+#define IMG_CUSTOM_100                                 908
+#define IMG_CUSTOM_100_EDITOR                          909
+#define IMG_CUSTOM_101                                 910
+#define IMG_CUSTOM_101_EDITOR                          911
+#define IMG_CUSTOM_102                                 912
+#define IMG_CUSTOM_102_EDITOR                          913
+#define IMG_CUSTOM_103                                 914
+#define IMG_CUSTOM_103_EDITOR                          915
+#define IMG_CUSTOM_104                                 916
+#define IMG_CUSTOM_104_EDITOR                          917
+#define IMG_CUSTOM_105                                 918
+#define IMG_CUSTOM_105_EDITOR                          919
+#define IMG_CUSTOM_106                                 920
+#define IMG_CUSTOM_106_EDITOR                          921
+#define IMG_CUSTOM_107                                 922
+#define IMG_CUSTOM_107_EDITOR                          923
+#define IMG_CUSTOM_108                                 924
+#define IMG_CUSTOM_108_EDITOR                          925
+#define IMG_CUSTOM_109                                 926
+#define IMG_CUSTOM_109_EDITOR                          927
+#define IMG_CUSTOM_110                                 928
+#define IMG_CUSTOM_110_EDITOR                          929
+#define IMG_CUSTOM_111                                 930
+#define IMG_CUSTOM_111_EDITOR                          931
+#define IMG_CUSTOM_112                                 932
+#define IMG_CUSTOM_112_EDITOR                          933
+#define IMG_CUSTOM_113                                 934
+#define IMG_CUSTOM_113_EDITOR                          935
+#define IMG_CUSTOM_114                                 936
+#define IMG_CUSTOM_114_EDITOR                          937
+#define IMG_CUSTOM_115                                 938
+#define IMG_CUSTOM_115_EDITOR                          939
+#define IMG_CUSTOM_116                                 940
+#define IMG_CUSTOM_116_EDITOR                          941
+#define IMG_CUSTOM_117                                 942
+#define IMG_CUSTOM_117_EDITOR                          943
+#define IMG_CUSTOM_118                                 944
+#define IMG_CUSTOM_118_EDITOR                          945
+#define IMG_CUSTOM_119                                 946
+#define IMG_CUSTOM_119_EDITOR                          947
+#define IMG_CUSTOM_120                                 948
+#define IMG_CUSTOM_120_EDITOR                          949
+#define IMG_CUSTOM_121                                 950
+#define IMG_CUSTOM_121_EDITOR                          951
+#define IMG_CUSTOM_122                                 952
+#define IMG_CUSTOM_122_EDITOR                          953
+#define IMG_CUSTOM_123                                 954
+#define IMG_CUSTOM_123_EDITOR                          955
+#define IMG_CUSTOM_124                                 956
+#define IMG_CUSTOM_124_EDITOR                          957
+#define IMG_CUSTOM_125                                 958
+#define IMG_CUSTOM_125_EDITOR                          959
+#define IMG_CUSTOM_126                                 960
+#define IMG_CUSTOM_126_EDITOR                          961
+#define IMG_CUSTOM_127                                 962
+#define IMG_CUSTOM_127_EDITOR                          963
+#define IMG_CUSTOM_128                                 964
+#define IMG_CUSTOM_128_EDITOR                          965
+#define IMG_CUSTOM_129                                 966
+#define IMG_CUSTOM_129_EDITOR                          967
+#define IMG_CUSTOM_130                                 968
+#define IMG_CUSTOM_130_EDITOR                          969
+#define IMG_CUSTOM_131                                 970
+#define IMG_CUSTOM_131_EDITOR                          971
+#define IMG_CUSTOM_132                                 972
+#define IMG_CUSTOM_132_EDITOR                          973
+#define IMG_CUSTOM_133                                 974
+#define IMG_CUSTOM_133_EDITOR                          975
+#define IMG_CUSTOM_134                                 976
+#define IMG_CUSTOM_134_EDITOR                          977
+#define IMG_CUSTOM_135                                 978
+#define IMG_CUSTOM_135_EDITOR                          979
+#define IMG_CUSTOM_136                                 980
+#define IMG_CUSTOM_136_EDITOR                          981
+#define IMG_CUSTOM_137                                 982
+#define IMG_CUSTOM_137_EDITOR                          983
+#define IMG_CUSTOM_138                                 984
+#define IMG_CUSTOM_138_EDITOR                          985
+#define IMG_CUSTOM_139                                 986
+#define IMG_CUSTOM_139_EDITOR                          987
+#define IMG_CUSTOM_140                                 988
+#define IMG_CUSTOM_140_EDITOR                          989
+#define IMG_CUSTOM_141                                 990
+#define IMG_CUSTOM_141_EDITOR                          991
+#define IMG_CUSTOM_142                                 992
+#define IMG_CUSTOM_142_EDITOR                          993
+#define IMG_CUSTOM_143                                 994
+#define IMG_CUSTOM_143_EDITOR                          995
+#define IMG_CUSTOM_144                                 996
+#define IMG_CUSTOM_144_EDITOR                          997
+#define IMG_CUSTOM_145                                 998
+#define IMG_CUSTOM_145_EDITOR                          999
+#define IMG_CUSTOM_146                                 1000
+#define IMG_CUSTOM_146_EDITOR                          1001
+#define IMG_CUSTOM_147                                 1002
+#define IMG_CUSTOM_147_EDITOR                          1003
+#define IMG_CUSTOM_148                                 1004
+#define IMG_CUSTOM_148_EDITOR                          1005
+#define IMG_CUSTOM_149                                 1006
+#define IMG_CUSTOM_149_EDITOR                          1007
+#define IMG_CUSTOM_150                                 1008
+#define IMG_CUSTOM_150_EDITOR                          1009
+#define IMG_CUSTOM_151                                 1010
+#define IMG_CUSTOM_151_EDITOR                          1011
+#define IMG_CUSTOM_152                                 1012
+#define IMG_CUSTOM_152_EDITOR                          1013
+#define IMG_CUSTOM_153                                 1014
+#define IMG_CUSTOM_153_EDITOR                          1015
+#define IMG_CUSTOM_154                                 1016
+#define IMG_CUSTOM_154_EDITOR                          1017
+#define IMG_CUSTOM_155                                 1018
+#define IMG_CUSTOM_155_EDITOR                          1019
+#define IMG_CUSTOM_156                                 1020
+#define IMG_CUSTOM_156_EDITOR                          1021
+#define IMG_CUSTOM_157                                 1022
+#define IMG_CUSTOM_157_EDITOR                          1023
+#define IMG_CUSTOM_158                                 1024
+#define IMG_CUSTOM_158_EDITOR                          1025
+#define IMG_CUSTOM_159                                 1026
+#define IMG_CUSTOM_159_EDITOR                          1027
+#define IMG_CUSTOM_160                                 1028
+#define IMG_CUSTOM_160_EDITOR                          1029
+#define IMG_CUSTOM_161                                 1030
+#define IMG_CUSTOM_161_EDITOR                          1031
+#define IMG_CUSTOM_162                                 1032
+#define IMG_CUSTOM_162_EDITOR                          1033
+#define IMG_CUSTOM_163                                 1034
+#define IMG_CUSTOM_163_EDITOR                          1035
+#define IMG_CUSTOM_164                                 1036
+#define IMG_CUSTOM_164_EDITOR                          1037
+#define IMG_CUSTOM_165                                 1038
+#define IMG_CUSTOM_165_EDITOR                          1039
+#define IMG_CUSTOM_166                                 1040
+#define IMG_CUSTOM_166_EDITOR                          1041
+#define IMG_CUSTOM_167                                 1042
+#define IMG_CUSTOM_167_EDITOR                          1043
+#define IMG_CUSTOM_168                                 1044
+#define IMG_CUSTOM_168_EDITOR                          1045
+#define IMG_CUSTOM_169                                 1046
+#define IMG_CUSTOM_169_EDITOR                          1047
+#define IMG_CUSTOM_170                                 1048
+#define IMG_CUSTOM_170_EDITOR                          1049
+#define IMG_CUSTOM_171                                 1050
+#define IMG_CUSTOM_171_EDITOR                          1051
+#define IMG_CUSTOM_172                                 1052
+#define IMG_CUSTOM_172_EDITOR                          1053
+#define IMG_CUSTOM_173                                 1054
+#define IMG_CUSTOM_173_EDITOR                          1055
+#define IMG_CUSTOM_174                                 1056
+#define IMG_CUSTOM_174_EDITOR                          1057
+#define IMG_CUSTOM_175                                 1058
+#define IMG_CUSTOM_175_EDITOR                          1059
+#define IMG_CUSTOM_176                                 1060
+#define IMG_CUSTOM_176_EDITOR                          1061
+#define IMG_CUSTOM_177                                 1062
+#define IMG_CUSTOM_177_EDITOR                          1063
+#define IMG_CUSTOM_178                                 1064
+#define IMG_CUSTOM_178_EDITOR                          1065
+#define IMG_CUSTOM_179                                 1066
+#define IMG_CUSTOM_179_EDITOR                          1067
+#define IMG_CUSTOM_180                                 1068
+#define IMG_CUSTOM_180_EDITOR                          1069
+#define IMG_CUSTOM_181                                 1070
+#define IMG_CUSTOM_181_EDITOR                          1071
+#define IMG_CUSTOM_182                                 1072
+#define IMG_CUSTOM_182_EDITOR                          1073
+#define IMG_CUSTOM_183                                 1074
+#define IMG_CUSTOM_183_EDITOR                          1075
+#define IMG_CUSTOM_184                                 1076
+#define IMG_CUSTOM_184_EDITOR                          1077
+#define IMG_CUSTOM_185                                 1078
+#define IMG_CUSTOM_185_EDITOR                          1079
+#define IMG_CUSTOM_186                                 1080
+#define IMG_CUSTOM_186_EDITOR                          1081
+#define IMG_CUSTOM_187                                 1082
+#define IMG_CUSTOM_187_EDITOR                          1083
+#define IMG_CUSTOM_188                                 1084
+#define IMG_CUSTOM_188_EDITOR                          1085
+#define IMG_CUSTOM_189                                 1086
+#define IMG_CUSTOM_189_EDITOR                          1087
+#define IMG_CUSTOM_190                                 1088
+#define IMG_CUSTOM_190_EDITOR                          1089
+#define IMG_CUSTOM_191                                 1090
+#define IMG_CUSTOM_191_EDITOR                          1091
+#define IMG_CUSTOM_192                                 1092
+#define IMG_CUSTOM_192_EDITOR                          1093
+#define IMG_CUSTOM_193                                 1094
+#define IMG_CUSTOM_193_EDITOR                          1095
+#define IMG_CUSTOM_194                                 1096
+#define IMG_CUSTOM_194_EDITOR                          1097
+#define IMG_CUSTOM_195                                 1098
+#define IMG_CUSTOM_195_EDITOR                          1099
+#define IMG_CUSTOM_196                                 1100
+#define IMG_CUSTOM_196_EDITOR                          1101
+#define IMG_CUSTOM_197                                 1102
+#define IMG_CUSTOM_197_EDITOR                          1103
+#define IMG_CUSTOM_198                                 1104
+#define IMG_CUSTOM_198_EDITOR                          1105
+#define IMG_CUSTOM_199                                 1106
+#define IMG_CUSTOM_199_EDITOR                          1107
+#define IMG_CUSTOM_200                                 1108
+#define IMG_CUSTOM_200_EDITOR                          1109
+#define IMG_CUSTOM_201                                 1110
+#define IMG_CUSTOM_201_EDITOR                          1111
+#define IMG_CUSTOM_202                                 1112
+#define IMG_CUSTOM_202_EDITOR                          1113
+#define IMG_CUSTOM_203                                 1114
+#define IMG_CUSTOM_203_EDITOR                          1115
+#define IMG_CUSTOM_204                                 1116
+#define IMG_CUSTOM_204_EDITOR                          1117
+#define IMG_CUSTOM_205                                 1118
+#define IMG_CUSTOM_205_EDITOR                          1119
+#define IMG_CUSTOM_206                                 1120
+#define IMG_CUSTOM_206_EDITOR                          1121
+#define IMG_CUSTOM_207                                 1122
+#define IMG_CUSTOM_207_EDITOR                          1123
+#define IMG_CUSTOM_208                                 1124
+#define IMG_CUSTOM_208_EDITOR                          1125
+#define IMG_CUSTOM_209                                 1126
+#define IMG_CUSTOM_209_EDITOR                          1127
+#define IMG_CUSTOM_210                                 1128
+#define IMG_CUSTOM_210_EDITOR                          1129
+#define IMG_CUSTOM_211                                 1130
+#define IMG_CUSTOM_211_EDITOR                          1131
+#define IMG_CUSTOM_212                                 1132
+#define IMG_CUSTOM_212_EDITOR                          1133
+#define IMG_CUSTOM_213                                 1134
+#define IMG_CUSTOM_213_EDITOR                          1135
+#define IMG_CUSTOM_214                                 1136
+#define IMG_CUSTOM_214_EDITOR                          1137
+#define IMG_CUSTOM_215                                 1138
+#define IMG_CUSTOM_215_EDITOR                          1139
+#define IMG_CUSTOM_216                                 1140
+#define IMG_CUSTOM_216_EDITOR                          1141
+#define IMG_CUSTOM_217                                 1142
+#define IMG_CUSTOM_217_EDITOR                          1143
+#define IMG_CUSTOM_218                                 1144
+#define IMG_CUSTOM_218_EDITOR                          1145
+#define IMG_CUSTOM_219                                 1146
+#define IMG_CUSTOM_219_EDITOR                          1147
+#define IMG_CUSTOM_220                                 1148
+#define IMG_CUSTOM_220_EDITOR                          1149
+#define IMG_CUSTOM_221                                 1150
+#define IMG_CUSTOM_221_EDITOR                          1151
+#define IMG_CUSTOM_222                                 1152
+#define IMG_CUSTOM_222_EDITOR                          1153
+#define IMG_CUSTOM_223                                 1154
+#define IMG_CUSTOM_223_EDITOR                          1155
+#define IMG_CUSTOM_224                                 1156
+#define IMG_CUSTOM_224_EDITOR                          1157
+#define IMG_CUSTOM_225                                 1158
+#define IMG_CUSTOM_225_EDITOR                          1159
+#define IMG_CUSTOM_226                                 1160
+#define IMG_CUSTOM_226_EDITOR                          1161
+#define IMG_CUSTOM_227                                 1162
+#define IMG_CUSTOM_227_EDITOR                          1163
+#define IMG_CUSTOM_228                                 1164
+#define IMG_CUSTOM_228_EDITOR                          1165
+#define IMG_CUSTOM_229                                 1166
+#define IMG_CUSTOM_229_EDITOR                          1167
+#define IMG_CUSTOM_230                                 1168
+#define IMG_CUSTOM_230_EDITOR                          1169
+#define IMG_CUSTOM_231                                 1170
+#define IMG_CUSTOM_231_EDITOR                          1171
+#define IMG_CUSTOM_232                                 1172
+#define IMG_CUSTOM_232_EDITOR                          1173
+#define IMG_CUSTOM_233                                 1174
+#define IMG_CUSTOM_233_EDITOR                          1175
+#define IMG_CUSTOM_234                                 1176
+#define IMG_CUSTOM_234_EDITOR                          1177
+#define IMG_CUSTOM_235                                 1178
+#define IMG_CUSTOM_235_EDITOR                          1179
+#define IMG_CUSTOM_236                                 1180
+#define IMG_CUSTOM_236_EDITOR                          1181
+#define IMG_CUSTOM_237                                 1182
+#define IMG_CUSTOM_237_EDITOR                          1183
+#define IMG_CUSTOM_238                                 1184
+#define IMG_CUSTOM_238_EDITOR                          1185
+#define IMG_CUSTOM_239                                 1186
+#define IMG_CUSTOM_239_EDITOR                          1187
+#define IMG_CUSTOM_240                                 1188
+#define IMG_CUSTOM_240_EDITOR                          1189
+#define IMG_CUSTOM_241                                 1190
+#define IMG_CUSTOM_241_EDITOR                          1191
+#define IMG_CUSTOM_242                                 1192
+#define IMG_CUSTOM_242_EDITOR                          1193
+#define IMG_CUSTOM_243                                 1194
+#define IMG_CUSTOM_243_EDITOR                          1195
+#define IMG_CUSTOM_244                                 1196
+#define IMG_CUSTOM_244_EDITOR                          1197
+#define IMG_CUSTOM_245                                 1198
+#define IMG_CUSTOM_245_EDITOR                          1199
+#define IMG_CUSTOM_246                                 1200
+#define IMG_CUSTOM_246_EDITOR                          1201
+#define IMG_CUSTOM_247                                 1202
+#define IMG_CUSTOM_247_EDITOR                          1203
+#define IMG_CUSTOM_248                                 1204
+#define IMG_CUSTOM_248_EDITOR                          1205
+#define IMG_CUSTOM_249                                 1206
+#define IMG_CUSTOM_249_EDITOR                          1207
+#define IMG_CUSTOM_250                                 1208
+#define IMG_CUSTOM_250_EDITOR                          1209
+#define IMG_CUSTOM_251                                 1210
+#define IMG_CUSTOM_251_EDITOR                          1211
+#define IMG_CUSTOM_252                                 1212
+#define IMG_CUSTOM_252_EDITOR                          1213
+#define IMG_CUSTOM_253                                 1214
+#define IMG_CUSTOM_253_EDITOR                          1215
+#define IMG_CUSTOM_254                                 1216
+#define IMG_CUSTOM_254_EDITOR                          1217
+#define IMG_CUSTOM_255                                 1218
+#define IMG_CUSTOM_255_EDITOR                          1219
+#define IMG_CUSTOM_256                                 1220
+#define IMG_CUSTOM_256_EDITOR                          1221
+#define IMG_TOON_1                                     1222
+#define IMG_TOON_2                                     1223
+#define IMG_TOON_3                                     1224
+#define IMG_TOON_4                                     1225
+#define IMG_TOON_5                                     1226
+#define IMG_TOON_6                                     1227
+#define IMG_TOON_7                                     1228
+#define IMG_TOON_8                                     1229
+#define IMG_TOON_9                                     1230
+#define IMG_TOON_10                                    1231
+#define IMG_TOON_11                                    1232
+#define IMG_TOON_12                                    1233
+#define IMG_TOON_13                                    1234
+#define IMG_TOON_14                                    1235
+#define IMG_TOON_15                                    1236
+#define IMG_TOON_16                                    1237
+#define IMG_TOON_17                                    1238
+#define IMG_TOON_18                                    1239
+#define IMG_TOON_19                                    1240
+#define IMG_TOON_20                                    1241
+#define IMG_MENU_CALIBRATE_RED                         1242
+#define IMG_MENU_CALIBRATE_BLUE                                1243
+#define IMG_MENU_CALIBRATE_YELLOW                      1244
+#define IMG_MENU_BUTTON                                        1245
+#define IMG_MENU_BUTTON_ACTIVE                         1246
+#define IMG_MENU_BUTTON_LEFT                           1247
+#define IMG_MENU_BUTTON_RIGHT                          1248
+#define IMG_MENU_BUTTON_UP                             1249
+#define IMG_MENU_BUTTON_DOWN                           1250
+#define IMG_MENU_BUTTON_LEFT_ACTIVE                    1251
+#define IMG_MENU_BUTTON_RIGHT_ACTIVE                   1252
+#define IMG_MENU_BUTTON_UP_ACTIVE                      1253
+#define IMG_MENU_BUTTON_DOWN_ACTIVE                    1254
+#define IMG_MENU_SCROLLBAR                             1255
+#define IMG_MENU_SCROLLBAR_ACTIVE                      1256
+#define IMG_FONT_INITIAL_1                             1257
+#define IMG_FONT_INITIAL_2                             1258
+#define IMG_FONT_INITIAL_3                             1259
+#define IMG_FONT_INITIAL_4                             1260
+#define IMG_FONT_TITLE_1                               1261
+#define IMG_FONT_TITLE_1_LEVELS                                1262
+#define IMG_FONT_TITLE_2                               1263
+#define IMG_FONT_MENU_1                                        1264
+#define IMG_FONT_MENU_2                                        1265
+#define IMG_FONT_TEXT_1                                        1266
+#define IMG_FONT_TEXT_1_LEVELS                         1267
+#define IMG_FONT_TEXT_1_PREVIEW                                1268
+#define IMG_FONT_TEXT_1_SCORES                         1269
+#define IMG_FONT_TEXT_1_ACTIVE_SCORES                  1270
+#define IMG_FONT_TEXT_2                                        1271
+#define IMG_FONT_TEXT_2_LEVELS                         1272
+#define IMG_FONT_TEXT_2_PREVIEW                                1273
+#define IMG_FONT_TEXT_2_SCORES                         1274
+#define IMG_FONT_TEXT_2_ACTIVE_SCORES                  1275
+#define IMG_FONT_TEXT_3                                        1276
+#define IMG_FONT_TEXT_3_LEVELS                         1277
+#define IMG_FONT_TEXT_3_PREVIEW                                1278
+#define IMG_FONT_TEXT_3_SCORES                         1279
+#define IMG_FONT_TEXT_3_ACTIVE_SCORES                  1280
+#define IMG_FONT_TEXT_4                                        1281
+#define IMG_FONT_TEXT_4_LEVELS                         1282
+#define IMG_FONT_TEXT_4_SCORES                         1283
+#define IMG_FONT_TEXT_4_ACTIVE_SCORES                  1284
+#define IMG_FONT_ENVELOPE_1                            1285
+#define IMG_FONT_ENVELOPE_2                            1286
+#define IMG_FONT_ENVELOPE_3                            1287
+#define IMG_FONT_ENVELOPE_4                            1288
+#define IMG_FONT_INPUT_1                               1289
+#define IMG_FONT_INPUT_1_MAIN                          1290
+#define IMG_FONT_INPUT_1_ACTIVE                                1291
+#define IMG_FONT_INPUT_1_ACTIVE_MAIN                   1292
+#define IMG_FONT_INPUT_1_ACTIVE_SETUP                  1293
+#define IMG_FONT_INPUT_2                               1294
+#define IMG_FONT_INPUT_2_ACTIVE                                1295
+#define IMG_FONT_OPTION_OFF                            1296
+#define IMG_FONT_OPTION_ON                             1297
+#define IMG_FONT_VALUE_1                               1298
+#define IMG_FONT_VALUE_2                               1299
+#define IMG_FONT_VALUE_OLD                             1300
+#define IMG_FONT_LEVEL_NUMBER                          1301
+#define IMG_FONT_TAPE_RECORDER                         1302
+#define IMG_FONT_GAME_INFO                             1303
+#define IMG_GLOBAL_BORDER                              1304
+#define IMG_GLOBAL_DOOR                                        1305
+#define IMG_EDITOR_ELEMENT_BORDER                      1306
+#define IMG_EDITOR_ELEMENT_BORDER_INPUT                        1307
+#define IMG_BACKGROUND_ENVELOPE_1                      1308
+#define IMG_BACKGROUND_ENVELOPE_2                      1309
+#define IMG_BACKGROUND_ENVELOPE_3                      1310
+#define IMG_BACKGROUND_ENVELOPE_4                      1311
+#define IMG_BACKGROUND                                 1312
+#define IMG_BACKGROUND_MAIN                            1313
+#define IMG_BACKGROUND_LEVELS                          1314
+#define IMG_BACKGROUND_SCORES                          1315
+#define IMG_BACKGROUND_EDITOR                          1316
+#define IMG_BACKGROUND_INFO                            1317
+#define IMG_BACKGROUND_SETUP                           1318
+#define IMG_BACKGROUND_DOOR                            1319
 
-#define NUM_IMAGE_FILES                                        1288
+#define NUM_IMAGE_FILES                                        1320
 
 #endif /* CONF_GFX_H */
index 4f1a8210e46b430d69c2920f989599c41ef5f392..27b664b0f2c46306b288aa37685930342834cc35 100644 (file)
@@ -71,6 +71,7 @@ struct ConfigInfo sound_config[] =
   { "[sp_port].passing",               "gate.wav"              },
   { "[sp_exit].passing",               "exit.wav"              },
   { "[sp_exit].opening",               UNDEFINED_FILENAME      },
+  { "[sp_exit].closing",               UNDEFINED_FILENAME      },
   { "sp_sniksnak.moving",              UNDEFINED_FILENAME      },
   { "sp_sniksnak.waiting",             UNDEFINED_FILENAME      },
   { "sp_electron.moving",              UNDEFINED_FILENAME      },
index ec2aa485f7f279042653295871823434f5c2b37b..9d89363f840f1d4ed2ffeb15ce6a667ce7dbde90 100644 (file)
 #define SND_CLASS_SP_PORT_PASSING                              35
 #define SND_CLASS_SP_EXIT_PASSING                              36
 #define SND_CLASS_SP_EXIT_OPENING                              37
-#define SND_SP_SNIKSNAK_MOVING                         38
-#define SND_SP_SNIKSNAK_WAITING                                39
-#define SND_SP_ELECTRON_MOVING                         40
-#define SND_SP_ELECTRON_WAITING                                41
-#define SND_SP_TERMINAL_ACTIVATING                             42
-#define SND_SP_TERMINAL_ACTIVE                         43
-#define SND_CLASS_SOKOBAN_PUSHING                              44
-#define SND_CLASS_SOKOBAN_FILLING                              45
-#define SND_CLASS_SOKOBAN_EMPTYING                             46
-#define SND_CLASS_PLAYER_MOVING                                        47
-#define SND_SAND_DIGGING                                       48
-#define SND_EMERALD_COLLECTING                         49
-#define SND_EMERALD_IMPACT                                     50
-#define SND_DIAMOND_COLLECTING                         51
-#define SND_DIAMOND_IMPACT                                     52
-#define SND_DIAMOND_BREAKING                           53
-#define SND_ROCK_PUSHING                                       54
-#define SND_ROCK_IMPACT                                        55
-#define SND_BOMB_PUSHING                                       56
-#define SND_NUT_PUSHING                                        57
-#define SND_NUT_BREAKING                                       58
-#define SND_NUT_IMPACT                                 59
-#define SND_CLASS_DYNAMITE_COLLECTING                          60
-#define SND_CLASS_DYNAMITE_DROPPING                            61
-#define SND_CLASS_DYNAMITE_ACTIVE                              62
-#define SND_CLASS_KEY_COLLECTING                               63
-#define SND_CLASS_GATE_PASSING                                 64
-#define SND_BUG_MOVING                                 65
-#define SND_BUG_WAITING                                        66
-#define SND_SPACESHIP_MOVING                           67
-#define SND_SPACESHIP_WAITING                          68
-#define SND_YAMYAM_MOVING                                      69
-#define SND_YAMYAM_WAITING                                     70
-#define SND_YAMYAM_DIGGING                                     71
-#define SND_ROBOT_MOVING                                       72
-#define SND_ROBOT_WAITING                                      73
-#define SND_ROBOT_WHEEL_ACTIVATING                             74
-#define SND_ROBOT_WHEEL_ACTIVE                         75
-#define SND_MAGIC_WALL_ACTIVATING                              76
-#define SND_MAGIC_WALL_ACTIVE                          77
-#define SND_MAGIC_WALL_FILLING                         78
-#define SND_CLASS_AMOEBA_WAITING                               79
-#define SND_CLASS_AMOEBA_GROWING                               80
-#define SND_CLASS_AMOEBA_DROPPING                              81
-#define SND_ACID_SPLASHING                                     82
-#define SND_CLASS_QUICKSAND_FILLING                            83
-#define SND_CLASS_QUICKSAND_EMPTYING                           84
-#define SND_CLASS_EXIT_OPENING                                 85
-#define SND_CLASS_EXIT_CLOSING                                 86
-#define SND_CLASS_EXIT_PASSING                                 87
-#define SND_PENGUIN_PASSING                                    88
-#define SND_BALLOON_MOVING                                     89
-#define SND_BALLOON_WAITING                                    90
-#define SND_BALLOON_PUSHING                                    91
-#define SND_CLASS_BALLOON_SWITCH_ACTIVATING                    92
-#define SND_SPRING_MOVING                                      93
-#define SND_SPRING_PUSHING                                     94
-#define SND_SPRING_IMPACT                                      95
-#define SND_CLASS_WALL_GROWING                                 96
-#define SND_PEARL_COLLECTING                           97
-#define SND_PEARL_BREAKING                                     98
-#define SND_PEARL_IMPACT                                       99
-#define SND_CRYSTAL_COLLECTING                         100
-#define SND_CRYSTAL_IMPACT                                     101
-#define SND_CLASS_ENVELOPE_COLLECTING                          102
-#define SND_CLASS_ENVELOPE_OPENING                             103
-#define SND_CLASS_ENVELOPE_CLOSING                             104
-#define SND_INVISIBLE_SAND_DIGGING                             105
-#define SND_SHIELD_NORMAL_COLLECTING                   106
-#define SND_SHIELD_NORMAL_ACTIVE                               107
-#define SND_SHIELD_DEADLY_COLLECTING                   108
-#define SND_SHIELD_DEADLY_ACTIVE                               109
-#define SND_EXTRA_TIME_COLLECTING                              110
-#define SND_MOLE_MOVING                                        111
-#define SND_MOLE_WAITING                                       112
-#define SND_MOLE_DIGGING                                       113
-#define SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING                 114
-#define SND_CLASS_SWITCHGATE_OPENING                           115
-#define SND_CLASS_SWITCHGATE_CLOSING                           116
-#define SND_CLASS_SWITCHGATE_PASSING                           117
-#define SND_TIMEGATE_SWITCH_ACTIVATING                 118
-#define SND_TIMEGATE_SWITCH_ACTIVE                             119
-#define SND_TIMEGATE_SWITCH_DEACTIVATING                       120
-#define SND_TIMEGATE_OPENING                           121
-#define SND_CLASS_TIMEGATE_CLOSING                             122
-#define SND_CLASS_TIMEGATE_PASSING                             123
-#define SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING              124
-#define SND_CLASS_CONVEYOR_BELT_ACTIVE                         125
-#define SND_CLASS_CONVEYOR_BELT_SWITCH_DEACTIVATING            126
-#define SND_LIGHT_SWITCH_ACTIVATING                            127
-#define SND_LIGHT_SWITCH_DEACTIVATING                  128
-#define SND_DX_SUPABOMB_PUSHING                                129
-#define SND_TRAP_DIGGING                                       130
-#define SND_TRAP_ACTIVATING                                    131
-#define SND_CLASS_TUBE_WALKING                                 132
-#define SND_AMOEBA_TURNING_TO_GEM                              133
-#define SND_AMOEBA_TURNING_TO_ROCK                             134
-#define SND_SPEED_PILL_COLLECTING                              135
-#define SND_DYNABOMB_INCREASE_NUMBER_COLLECTING                136
-#define SND_DYNABOMB_INCREASE_SIZE_COLLECTING          137
-#define SND_DYNABOMB_INCREASE_POWER_COLLECTING         138
-#define SND_CLASS_DYNABOMB_DROPPING                            139
-#define SND_CLASS_DYNABOMB_ACTIVE                              140
-#define SND_SATELLITE_MOVING                           141
-#define SND_SATELLITE_WAITING                          142
-#define SND_SATELLITE_PUSHING                          143
-#define SND_LAMP_ACTIVATING                                    144
-#define SND_LAMP_DEACTIVATING                          145
-#define SND_TIME_ORB_FULL_COLLECTING                   146
-#define SND_TIME_ORB_FULL_IMPACT                               147
-#define SND_TIME_ORB_EMPTY_PUSHING                             148
-#define SND_TIME_ORB_EMPTY_IMPACT                              149
-#define SND_GAME_OF_LIFE_WAITING                               150
-#define SND_GAME_OF_LIFE_GROWING                               151
-#define SND_BIOMAZE_WAITING                                    152
-#define SND_BIOMAZE_GROWING                                    153
-#define SND_PACMAN_MOVING                                      154
-#define SND_PACMAN_WAITING                                     155
-#define SND_PACMAN_DIGGING                                     156
-#define SND_DARK_YAMYAM_MOVING                         157
-#define SND_DARK_YAMYAM_WAITING                                158
-#define SND_DARK_YAMYAM_DIGGING                                159
-#define SND_PENGUIN_MOVING                                     160
-#define SND_PENGUIN_WAITING                                    161
-#define SND_PIG_MOVING                                 162
-#define SND_PIG_WAITING                                        163
-#define SND_PIG_DIGGING                                        164
-#define SND_DRAGON_MOVING                                      165
-#define SND_DRAGON_WAITING                                     166
-#define SND_DRAGON_ATTACKING                           167
-#define SND_GAME_STARTING                                      168
-#define SND_GAME_RUNNING_OUT_OF_TIME                   169
-#define SND_GAME_LEVELTIME_BONUS                               170
-#define SND_GAME_LOSING                                        171
-#define SND_GAME_WINNING                                       172
-#define SND_GAME_SOKOBAN_SOLVING                               173
-#define SND_DOOR_OPENING                                       174
-#define SND_DOOR_CLOSING                                       175
-#define SND_BACKGROUND_SCORES                          176
-#define SND_BACKGROUND_INFO                                    177
+#define SND_CLASS_SP_EXIT_CLOSING                              38
+#define SND_SP_SNIKSNAK_MOVING                         39
+#define SND_SP_SNIKSNAK_WAITING                                40
+#define SND_SP_ELECTRON_MOVING                         41
+#define SND_SP_ELECTRON_WAITING                                42
+#define SND_SP_TERMINAL_ACTIVATING                             43
+#define SND_SP_TERMINAL_ACTIVE                         44
+#define SND_CLASS_SOKOBAN_PUSHING                              45
+#define SND_CLASS_SOKOBAN_FILLING                              46
+#define SND_CLASS_SOKOBAN_EMPTYING                             47
+#define SND_CLASS_PLAYER_MOVING                                        48
+#define SND_SAND_DIGGING                                       49
+#define SND_EMERALD_COLLECTING                         50
+#define SND_EMERALD_IMPACT                                     51
+#define SND_DIAMOND_COLLECTING                         52
+#define SND_DIAMOND_IMPACT                                     53
+#define SND_DIAMOND_BREAKING                           54
+#define SND_ROCK_PUSHING                                       55
+#define SND_ROCK_IMPACT                                        56
+#define SND_BOMB_PUSHING                                       57
+#define SND_NUT_PUSHING                                        58
+#define SND_NUT_BREAKING                                       59
+#define SND_NUT_IMPACT                                 60
+#define SND_CLASS_DYNAMITE_COLLECTING                          61
+#define SND_CLASS_DYNAMITE_DROPPING                            62
+#define SND_CLASS_DYNAMITE_ACTIVE                              63
+#define SND_CLASS_KEY_COLLECTING                               64
+#define SND_CLASS_GATE_PASSING                                 65
+#define SND_BUG_MOVING                                 66
+#define SND_BUG_WAITING                                        67
+#define SND_SPACESHIP_MOVING                           68
+#define SND_SPACESHIP_WAITING                          69
+#define SND_YAMYAM_MOVING                                      70
+#define SND_YAMYAM_WAITING                                     71
+#define SND_YAMYAM_DIGGING                                     72
+#define SND_ROBOT_MOVING                                       73
+#define SND_ROBOT_WAITING                                      74
+#define SND_ROBOT_WHEEL_ACTIVATING                             75
+#define SND_ROBOT_WHEEL_ACTIVE                         76
+#define SND_MAGIC_WALL_ACTIVATING                              77
+#define SND_MAGIC_WALL_ACTIVE                          78
+#define SND_MAGIC_WALL_FILLING                         79
+#define SND_CLASS_AMOEBA_WAITING                               80
+#define SND_CLASS_AMOEBA_GROWING                               81
+#define SND_CLASS_AMOEBA_DROPPING                              82
+#define SND_ACID_SPLASHING                                     83
+#define SND_CLASS_QUICKSAND_FILLING                            84
+#define SND_CLASS_QUICKSAND_EMPTYING                           85
+#define SND_CLASS_EXIT_OPENING                                 86
+#define SND_CLASS_EXIT_CLOSING                                 87
+#define SND_CLASS_EXIT_PASSING                                 88
+#define SND_PENGUIN_PASSING                                    89
+#define SND_BALLOON_MOVING                                     90
+#define SND_BALLOON_WAITING                                    91
+#define SND_BALLOON_PUSHING                                    92
+#define SND_CLASS_BALLOON_SWITCH_ACTIVATING                    93
+#define SND_SPRING_MOVING                                      94
+#define SND_SPRING_PUSHING                                     95
+#define SND_SPRING_IMPACT                                      96
+#define SND_CLASS_WALL_GROWING                                 97
+#define SND_PEARL_COLLECTING                           98
+#define SND_PEARL_BREAKING                                     99
+#define SND_PEARL_IMPACT                                       100
+#define SND_CRYSTAL_COLLECTING                         101
+#define SND_CRYSTAL_IMPACT                                     102
+#define SND_CLASS_ENVELOPE_COLLECTING                          103
+#define SND_CLASS_ENVELOPE_OPENING                             104
+#define SND_CLASS_ENVELOPE_CLOSING                             105
+#define SND_INVISIBLE_SAND_DIGGING                             106
+#define SND_SHIELD_NORMAL_COLLECTING                   107
+#define SND_SHIELD_NORMAL_ACTIVE                               108
+#define SND_SHIELD_DEADLY_COLLECTING                   109
+#define SND_SHIELD_DEADLY_ACTIVE                               110
+#define SND_EXTRA_TIME_COLLECTING                              111
+#define SND_MOLE_MOVING                                        112
+#define SND_MOLE_WAITING                                       113
+#define SND_MOLE_DIGGING                                       114
+#define SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING                 115
+#define SND_CLASS_SWITCHGATE_OPENING                           116
+#define SND_CLASS_SWITCHGATE_CLOSING                           117
+#define SND_CLASS_SWITCHGATE_PASSING                           118
+#define SND_TIMEGATE_SWITCH_ACTIVATING                 119
+#define SND_TIMEGATE_SWITCH_ACTIVE                             120
+#define SND_TIMEGATE_SWITCH_DEACTIVATING                       121
+#define SND_TIMEGATE_OPENING                           122
+#define SND_CLASS_TIMEGATE_CLOSING                             123
+#define SND_CLASS_TIMEGATE_PASSING                             124
+#define SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING              125
+#define SND_CLASS_CONVEYOR_BELT_ACTIVE                         126
+#define SND_CLASS_CONVEYOR_BELT_SWITCH_DEACTIVATING            127
+#define SND_LIGHT_SWITCH_ACTIVATING                            128
+#define SND_LIGHT_SWITCH_DEACTIVATING                  129
+#define SND_DX_SUPABOMB_PUSHING                                130
+#define SND_TRAP_DIGGING                                       131
+#define SND_TRAP_ACTIVATING                                    132
+#define SND_CLASS_TUBE_WALKING                                 133
+#define SND_AMOEBA_TURNING_TO_GEM                              134
+#define SND_AMOEBA_TURNING_TO_ROCK                             135
+#define SND_SPEED_PILL_COLLECTING                              136
+#define SND_DYNABOMB_INCREASE_NUMBER_COLLECTING                137
+#define SND_DYNABOMB_INCREASE_SIZE_COLLECTING          138
+#define SND_DYNABOMB_INCREASE_POWER_COLLECTING         139
+#define SND_CLASS_DYNABOMB_DROPPING                            140
+#define SND_CLASS_DYNABOMB_ACTIVE                              141
+#define SND_SATELLITE_MOVING                           142
+#define SND_SATELLITE_WAITING                          143
+#define SND_SATELLITE_PUSHING                          144
+#define SND_LAMP_ACTIVATING                                    145
+#define SND_LAMP_DEACTIVATING                          146
+#define SND_TIME_ORB_FULL_COLLECTING                   147
+#define SND_TIME_ORB_FULL_IMPACT                               148
+#define SND_TIME_ORB_EMPTY_PUSHING                             149
+#define SND_TIME_ORB_EMPTY_IMPACT                              150
+#define SND_GAME_OF_LIFE_WAITING                               151
+#define SND_GAME_OF_LIFE_GROWING                               152
+#define SND_BIOMAZE_WAITING                                    153
+#define SND_BIOMAZE_GROWING                                    154
+#define SND_PACMAN_MOVING                                      155
+#define SND_PACMAN_WAITING                                     156
+#define SND_PACMAN_DIGGING                                     157
+#define SND_DARK_YAMYAM_MOVING                         158
+#define SND_DARK_YAMYAM_WAITING                                159
+#define SND_DARK_YAMYAM_DIGGING                                160
+#define SND_PENGUIN_MOVING                                     161
+#define SND_PENGUIN_WAITING                                    162
+#define SND_PIG_MOVING                                 163
+#define SND_PIG_WAITING                                        164
+#define SND_PIG_DIGGING                                        165
+#define SND_DRAGON_MOVING                                      166
+#define SND_DRAGON_WAITING                                     167
+#define SND_DRAGON_ATTACKING                           168
+#define SND_GAME_STARTING                                      169
+#define SND_GAME_RUNNING_OUT_OF_TIME                   170
+#define SND_GAME_LEVELTIME_BONUS                               171
+#define SND_GAME_LOSING                                        172
+#define SND_GAME_WINNING                                       173
+#define SND_GAME_SOKOBAN_SOLVING                               174
+#define SND_DOOR_OPENING                                       175
+#define SND_DOOR_CLOSING                                       176
+#define SND_BACKGROUND_SCORES                          177
+#define SND_BACKGROUND_INFO                                    178
 
-#define NUM_SOUND_FILES                                178
+#define NUM_SOUND_FILES                                179
 
 #endif /* CONF_SND_H */
index 2d21f40887c2e754e3caef2aa705ff6f49ce12d5..ec09d32961a64f0073f6dea76e7c0efd9fc27bcc 100644 (file)
 #include "config.h"
 #include "conftime.h"
 
-/* use timestamp created at compile-time */
-#define PROGRAM_BUILD_STRING   PROGRAM_IDENT_STRING " " COMPILE_DATE_STRING
+
+char *getProgramVersionString()
+{
+  static char program_version_string[32];
+
 #ifdef DEBUG
-#undef WINDOW_TITLE_STRING
-#define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_BUILD_STRING
+  sprintf(program_version_string, "%d.%d.%d-%d",
+         PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH,
+         PROGRAM_VERSION_BUILD);
+#else
+  sprintf(program_version_string, "%d.%d.%d",
+         PROGRAM_VERSION_MAJOR, PROGRAM_VERSION_MINOR, PROGRAM_VERSION_PATCH);
 #endif
 
+  return program_version_string;
+}
+
+char *getProgramInitString()
+{
+  static char *program_init_string = NULL;
+
+  if (program_init_string == NULL)
+  {
+    program_init_string = checked_malloc(strlen(PROGRAM_TITLE_STRING) + 1 +
+                                        strlen(getProgramVersionString()) +1 +
+                                        strlen(TARGET_STRING) + 1);
+
+    sprintf(program_init_string, "%s %s %s",
+           PROGRAM_TITLE_STRING, getProgramVersionString(), TARGET_STRING);
+  }
+
+  return program_init_string;
+}
 
 char *getWindowTitleString()
 {
-  return WINDOW_TITLE_STRING;
+#ifdef DEBUG
+  static char *window_title_string = NULL;
+
+  if (window_title_string == NULL)
+  {
+    window_title_string = checked_malloc(strlen(getProgramInitString()) + 1 +
+                                        strlen(COMPILE_DATE_STRING) + 1);
+
+    sprintf(window_title_string, "%s %s",
+           getProgramInitString(), COMPILE_DATE_STRING);
+  }
+
+  return window_title_string;
+#else
+  return getProgramInitString();
+#endif
 }
index d9e5d94d53ae38dac2f5e927528100c0742b0323..01ea5064c5b0a2199551e5b7c29bd15df9aa6699 100644 (file)
@@ -16,6 +16,8 @@
 
 #include "main.h"
 
+char *getProgramVersionString(void);
+char *getProgramInitString(void);
 char *getWindowTitleString(void);
 
 #endif /* CONFIG_H */
index 043d69f5fe6bc9d1308a2f4a4f513aa94333f572..47099876695f75946e30ffefdfd20c930f53d6d5 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-10-06 01:34]"
+#define COMPILE_DATE_STRING "[2003-11-09 23:35]"
index 8e9904e7d0d55ad3b27fbab90052fae056c7613a..5c3298f84201a9e98daeaa1190e17a2500812152 100644 (file)
@@ -1517,7 +1517,7 @@ static struct
   {
     -1,                                        ED_COUNTER_YPOS(6) - MINI_TILEY,
     GADGET_ID_GRAVITY,                 GADGET_ID_DOUBLE_SPEED,
-    &level.gravity,
+    &level.initial_gravity,
     " ", "gravity",                    "set level gravity"
   },
   {
@@ -5412,6 +5412,15 @@ static void DrawPropertiesInfo()
   int screen_line = 0;
   int i, x, y;
 
+#if DEBUG
+  if (IS_CUSTOM_ELEMENT(properties_element))
+  {
+    DrawTextF(pad_x, pad_y + screen_line++ * font2_height, FONT_TEXT_3,
+             "[Custom Element %d]", properties_element - EL_CUSTOM_START + 1);
+    screen_line++;
+  }
+#endif
+
   /* ----- print number of elements / percentage of this element in level */
 
   num_elements_in_level = 0;
index 96f4624df9df575da6d48ab02bf7d83124203812..e021ec83239051920c36a19b4cbeebde04931ada 100644 (file)
@@ -434,6 +434,7 @@ void HandleButton(int mx, int my, int button)
          printf("      ChangeDelay[%d][%d] == %d\n", x,y, ChangeDelay[x][y]);
          printf("      GfxElement[%d][%d] == %d\n", x,y, GfxElement[x][y]);
          printf("      GfxAction[%d][%d] == %d\n", x,y, GfxAction[x][y]);
+         printf("      GfxFrame[%d][%d] == %d\n", x,y, GfxFrame[x][y]);
          printf("\n");
        }
       }
index 4dac3c11d1c94aea0d67c9a1f63d284e85629607..813ce976bf0bba97cc5df07d40d3c089c8812606 100644 (file)
@@ -128,7 +128,7 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
   level->time_timegate = 10;
   level->amoeba_content = EL_DIAMOND;
   level->double_speed = FALSE;
-  level->gravity = FALSE;
+  level->initial_gravity = FALSE;
   level->em_slippery_gems = FALSE;
 
   level->use_custom_template = FALSE;
@@ -186,8 +186,8 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
     element_info[element].collect_score = 10;          /* special default */
     element_info[element].collect_count = 1;           /* special default */
 
-    element_info[element].push_delay_fixed = 2;                /* special default */
-    element_info[element].push_delay_random = 8;       /* special default */
+    element_info[element].push_delay_fixed = -1;       /* initialize later */
+    element_info[element].push_delay_random = -1;      /* initialize later */
     element_info[element].move_delay_fixed = 0;
     element_info[element].move_delay_random = 0;
 
@@ -242,12 +242,12 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
        strcpy(level->author, PROGRAM_AUTHOR_STRING);
        break;
 
-      case LEVELCLASS_CONTRIBUTION:
-       strncpy(level->author, leveldir_current->name,MAX_LEVEL_AUTHOR_LEN);
+      case LEVELCLASS_CONTRIB:
+       strncpy(level->author, leveldir_current->name, MAX_LEVEL_AUTHOR_LEN);
        level->author[MAX_LEVEL_AUTHOR_LEN] = '\0';
        break;
 
-      case LEVELCLASS_USER:
+      case LEVELCLASS_PRIVATE:
        strncpy(level->author, getRealName(), MAX_LEVEL_AUTHOR_LEN);
        level->author[MAX_LEVEL_AUTHOR_LEN] = '\0';
        break;
@@ -372,7 +372,7 @@ static int LoadLevel_HEAD(FILE *file, int chunk_size, struct LevelInfo *level)
   level->time_wheel            = getFile8Bit(file);
   level->amoeba_content                = checkLevelElement(getFile8Bit(file));
   level->double_speed          = (getFile8Bit(file) == 1 ? TRUE : FALSE);
-  level->gravity               = (getFile8Bit(file) == 1 ? TRUE : FALSE);
+  level->initial_gravity       = (getFile8Bit(file) == 1 ? TRUE : FALSE);
   level->encoding_16bit_field  = (getFile8Bit(file) == 1 ? TRUE : FALSE);
   level->em_slippery_gems      = (getFile8Bit(file) == 1 ? TRUE : FALSE);
 
@@ -925,23 +925,36 @@ void LoadLevelFromFilename(struct LevelInfo *level, char *filename)
   fclose(file);
 }
 
-#if 1
-
 static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
 {
   if (leveldir_current == NULL)                /* only when dumping level */
     return;
 
+#if 0
+  printf("::: sort_priority: %d\n", leveldir_current->sort_priority);
+#endif
+
   /* determine correct game engine version of current level */
-  if (IS_LEVELCLASS_CONTRIBUTION(leveldir_current) ||
-      IS_LEVELCLASS_USER(leveldir_current))
+#if 1
+  if (!leveldir_current->latest_engine)
+#else
+  if (IS_LEVELCLASS_CONTRIB(leveldir_current) ||
+      IS_LEVELCLASS_PRIVATE(leveldir_current) ||
+      IS_LEVELCLASS_UNDEFINED(leveldir_current))
+#endif
   {
 #if 0
     printf("\n::: This level is private or contributed: '%s'\n", filename);
 #endif
 
-    /* For user contributed and private levels, use the version of
-       the game engine the levels were created for.
+#if 0
+    printf("\n::: Use the stored game engine version for this level\n");
+#endif
+
+    /* For all levels which are not forced to use the latest game engine
+       version (normally user contributed, private and undefined levels),
+       use the version of the game engine the levels were created for.
+
        Since 2.0.1, the game engine version is now directly stored
        in the level file (chunk "VERS"), so there is no need anymore
        to set the game version from the file version (except for old,
@@ -951,7 +964,7 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
     /* do some special adjustments to support older level versions */
     if (level->file_version == FILE_VERSION_1_0)
     {
-      Error(ERR_WARN, "level file '%s'has version number 1.0", filename);
+      Error(ERR_WARN, "level file '%s' has version number 1.0", filename);
       Error(ERR_WARN, "using high speed movement for player");
 
       /* player was faster than monsters in (pre-)1.0 levels */
@@ -959,7 +972,7 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
     }
 
     /* Default behaviour for EM style gems was "slippery" only in 2.0.1 */
-    if (level->game_version == VERSION_IDENT(2,0,1))
+    if (level->game_version == VERSION_IDENT(2,0,1,0))
       level->em_slippery_gems = TRUE;
   }
   else
@@ -969,12 +982,22 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
           leveldir_current->sort_priority, filename);
 #endif
 
-    /* Always use the latest version of the game engine for all but
-       user contributed and private levels; this allows for actual
-       corrections in the game engine to take effect for existing,
-       converted levels (from "classic" or other existing games) to
-       make the game emulation more accurate, while (hopefully) not
-       breaking existing levels created from other players. */
+#if 0
+    printf("\n::: Use latest game engine version for this level.\n");
+#endif
+
+    /* For all levels which are forced to use the latest game engine version
+       (normally all but user contributed, private and undefined levels), set
+       the game engine version to the actual version; this allows for actual
+       corrections in the game engine to take effect for existing, converted
+       levels (from "classic" or other existing games) to make the emulation
+       of the corresponding game more accurate, while (hopefully) not breaking
+       existing levels created from other players. */
+
+#if 0
+    printf("::: changing engine from %d to %d\n",
+          level->game_version, GAME_VERSION_ACTUAL);
+#endif
 
     level->game_version = GAME_VERSION_ACTUAL;
 
@@ -988,6 +1011,10 @@ static void LoadLevel_InitVersion(struct LevelInfo *level, char *filename)
     if (level->file_version < FILE_VERSION_2_0)
       level->em_slippery_gems = TRUE;
   }
+
+#if 0
+  printf("::: => %d\n", level->game_version);
+#endif
 }
 
 static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
@@ -996,7 +1023,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
 
   /* map custom element change events that have changed in newer versions
      (these following values were accidentally changed in version 3.0.1) */
-  if (level->game_version <= VERSION_IDENT(3,0,0))
+  if (level->game_version <= VERSION_IDENT(3,0,0,0))
   {
     for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
     {
@@ -1040,7 +1067,7 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
   }
 
   /* initialize "can_change" field for old levels with only one change page */
-  if (level->game_version <= VERSION_IDENT(3,0,2))
+  if (level->game_version <= VERSION_IDENT(3,0,2,0))
   {
     for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
     {
@@ -1051,122 +1078,38 @@ static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
     }
   }
 
-  /* initialize element properties for level editor etc. */
-  InitElementPropertiesEngine(level->game_version);
-}
-
-static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename)
-{
-  int x, y;
-
-  /* map elements that have changed in newer versions */
-  for(y=0; y<level->fieldy; y++)
+#if 0
+  /* set default push delay values (corrected since version 3.0.7-1) */
+  if (level->game_version < VERSION_IDENT(3,0,7,1))
   {
-    for(x=0; x<level->fieldx; x++)
-    {
-      int element = level->field[x][y];
-
-      if (level->game_version <= VERSION_IDENT(2,2,0))
-      {
-       /* map game font elements */
-       element = (element == EL_CHAR('[')  ? EL_CHAR_AUMLAUT :
-                  element == EL_CHAR('\\') ? EL_CHAR_OUMLAUT :
-                  element == EL_CHAR(']')  ? EL_CHAR_UUMLAUT :
-                  element == EL_CHAR('^')  ? EL_CHAR_COPYRIGHT : element);
-      }
-
-      if (level->game_version < VERSION_IDENT(3,0,0))
-      {
-       /* map Supaplex gravity tube elements */
-       element = (element == EL_SP_GRAVITY_PORT_LEFT  ? EL_SP_PORT_LEFT  :
-                  element == EL_SP_GRAVITY_PORT_RIGHT ? EL_SP_PORT_RIGHT :
-                  element == EL_SP_GRAVITY_PORT_UP    ? EL_SP_PORT_UP    :
-                  element == EL_SP_GRAVITY_PORT_DOWN  ? EL_SP_PORT_DOWN  :
-                  element);
-      }
-
-      level->field[x][y] = element;
-    }
+    game.default_push_delay_fixed = 2;
+    game.default_push_delay_random = 8;
   }
-
-  /* copy elements to runtime playfield array */
-  for(x=0; x<MAX_LEV_FIELDX; x++)
-    for(y=0; y<MAX_LEV_FIELDY; y++)
-      Feld[x][y] = level->field[x][y];
-
-  /* initialize level size variables for faster access */
-  lev_fieldx = level->fieldx;
-  lev_fieldy = level->fieldy;
-
-  /* determine border element for this level */
-  SetBorderElement();
-}
-
-#else
-
-static void LoadLevel_InitLevel(struct LevelInfo *level, char *filename)
-{
-  int i, j, x, y;
-
-  if (leveldir_current == NULL)                /* only when dumping level */
-    return;
-
-  /* determine correct game engine version of current level */
-  if (IS_LEVELCLASS_CONTRIBUTION(leveldir_current) ||
-      IS_LEVELCLASS_USER(leveldir_current))
+  else
   {
-#if 0
-    printf("\n::: This level is private or contributed: '%s'\n", filename);
-#endif
-
-    /* For user contributed and private levels, use the version of
-       the game engine the levels were created for.
-       Since 2.0.1, the game engine version is now directly stored
-       in the level file (chunk "VERS"), so there is no need anymore
-       to set the game version from the file version (except for old,
-       pre-2.0 levels, where the game version is still taken from the
-       file format version used to store the level -- see above). */
-
-    /* do some special adjustments to support older level versions */
-    if (level->file_version == FILE_VERSION_1_0)
-    {
-      Error(ERR_WARN, "level file '%s'has version number 1.0", filename);
-      Error(ERR_WARN, "using high speed movement for player");
+    game.default_push_delay_fixed = 8;
+    game.default_push_delay_random = 8;
+  }
 
-      /* player was faster than monsters in (pre-)1.0 levels */
-      level->double_speed = TRUE;
-    }
+  /* set uninitialized push delay values of custom elements in older levels */
+  for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+  {
+    int element = EL_CUSTOM_START + i;
 
-    /* Default behaviour for EM style gems was "slippery" only in 2.0.1 */
-    if (level->game_version == VERSION_IDENT(2,0,1))
-      level->em_slippery_gems = TRUE;
+    if (element_info[element].push_delay_fixed == -1)
+      element_info[element].push_delay_fixed = game.default_push_delay_fixed;
+    if (element_info[element].push_delay_random == -1)
+      element_info[element].push_delay_random = game.default_push_delay_random;
   }
-  else
-  {
-#if 0
-    printf("\n::: ALWAYS USE LATEST ENGINE FOR THIS LEVEL: [%d] '%s'\n",
-          leveldir_current->sort_priority, filename);
 #endif
 
-    /* Always use the latest version of the game engine for all but
-       user contributed and private levels; this allows for actual
-       corrections in the game engine to take effect for existing,
-       converted levels (from "classic" or other existing games) to
-       make the game emulation more accurate, while (hopefully) not
-       breaking existing levels created from other players. */
-
-    level->game_version = GAME_VERSION_ACTUAL;
-
-    /* Set special EM style gems behaviour: EM style gems slip down from
-       normal, steel and growing wall. As this is a more fundamental change,
-       it seems better to set the default behaviour to "off" (as it is more
-       natural) and make it configurable in the level editor (as a property
-       of gem style elements). Already existing converted levels (neither
-       private nor contributed levels) are changed to the new behaviour. */
+  /* initialize element properties for level editor etc. */
+  InitElementPropertiesEngine(level->game_version);
+}
 
-    if (level->file_version < FILE_VERSION_2_0)
-      level->em_slippery_gems = TRUE;
-  }
+static void LoadLevel_InitPlayfield(struct LevelInfo *level, char *filename)
+{
+  int x, y;
 
   /* map elements that have changed in newer versions */
   for(y=0; y<level->fieldy; y++)
@@ -1175,7 +1118,7 @@ static void LoadLevel_InitLevel(struct LevelInfo *level, char *filename)
     {
       int element = level->field[x][y];
 
-      if (level->game_version <= VERSION_IDENT(2,2,0))
+      if (level->game_version <= VERSION_IDENT(2,2,0,0))
       {
        /* map game font elements */
        element = (element == EL_CHAR('[')  ? EL_CHAR_AUMLAUT :
@@ -1184,7 +1127,7 @@ static void LoadLevel_InitLevel(struct LevelInfo *level, char *filename)
                   element == EL_CHAR('^')  ? EL_CHAR_COPYRIGHT : element);
       }
 
-      if (level->game_version < VERSION_IDENT(3,0,0))
+      if (level->game_version < VERSION_IDENT(3,0,0,0))
       {
        /* map Supaplex gravity tube elements */
        element = (element == EL_SP_GRAVITY_PORT_LEFT  ? EL_SP_PORT_LEFT  :
@@ -1198,48 +1141,6 @@ static void LoadLevel_InitLevel(struct LevelInfo *level, char *filename)
     }
   }
 
-  /* map custom element change events that have changed in newer versions
-     (these following values have accidentally changed in version 3.0.1) */
-  if (level->game_version <= VERSION_IDENT(3,0,0))
-  {
-    for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
-    {
-      int element = EL_CUSTOM_START + i;
-
-      /* order of checking events to be mapped is important */
-      for (j=CE_BY_OTHER; j >= CE_BY_PLAYER; j--)
-      {
-       if (HAS_CHANGE_EVENT(element, j - 2))
-       {
-         SET_CHANGE_EVENT(element, j - 2, FALSE);
-         SET_CHANGE_EVENT(element, j, TRUE);
-       }
-      }
-
-      /* order of checking events to be mapped is important */
-      for (j=CE_OTHER_GETS_COLLECTED; j >= CE_COLLISION; j--)
-      {
-       if (HAS_CHANGE_EVENT(element, j - 1))
-       {
-         SET_CHANGE_EVENT(element, j - 1, FALSE);
-         SET_CHANGE_EVENT(element, j, TRUE);
-       }
-      }
-    }
-  }
-
-  /* initialize "can_change" field for old levels with only one change page */
-  if (level->game_version <= VERSION_IDENT(3,0,2))
-  {
-    for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
-    {
-      int element = EL_CUSTOM_START + i;
-
-      if (CAN_CHANGE(element))
-       element_info[element].change->can_change = TRUE;
-    }
-  }
-
   /* copy elements to runtime playfield array */
   for(x=0; x<MAX_LEV_FIELDX; x++)
     for(y=0; y<MAX_LEV_FIELDY; y++)
@@ -1251,13 +1152,8 @@ static void LoadLevel_InitLevel(struct LevelInfo *level, char *filename)
 
   /* determine border element for this level */
   SetBorderElement();
-
-  /* initialize element properties for level editor etc. */
-  InitElementPropertiesEngine(level->game_version);
 }
 
-#endif
-
 void LoadLevelTemplate(int level_nr)
 {
   char *filename = getLevelFilename(level_nr);
@@ -1321,7 +1217,7 @@ static void SaveLevel_HEAD(FILE *file, struct LevelInfo *level)
   putFile8Bit(file, (level->encoding_16bit_amoeba ? EL_EMPTY :
                     level->amoeba_content));
   putFile8Bit(file, (level->double_speed ? 1 : 0));
-  putFile8Bit(file, (level->gravity ? 1 : 0));
+  putFile8Bit(file, (level->initial_gravity ? 1 : 0));
   putFile8Bit(file, (level->encoding_16bit_field ? 1 : 0));
   putFile8Bit(file, (level->em_slippery_gems ? 1 : 0));
 
@@ -1796,7 +1692,7 @@ void DumpLevel(struct LevelInfo *level)
   printf("\n");
   printf("Amoeba Speed: %d\n", level->amoeba_speed);
   printf("\n");
-  printf("Gravity:                %s\n", (level->gravity ? "yes" : "no"));
+  printf("Gravity:                %s\n", (level->initial_gravity ? "yes" : "no"));
   printf("Double Speed Movement:  %s\n", (level->double_speed ? "yes" : "no"));
   printf("EM style slippery gems: %s\n", (level->em_slippery_gems ? "yes" : "no"));
 
@@ -2101,8 +1997,8 @@ void LoadTapeFromFilename(char *filename)
   tape.length_seconds = GetTapeLength();
 
 #if 0
-  printf("tape game version: %d\n", tape.game_version);
-  printf("tape engine version: %d\n", tape.engine_version);
+  printf("::: tape game version: %d\n", tape.game_version);
+  printf("::: tape engine version: %d\n", tape.engine_version);
 #endif
 }
 
index 007b3d14fc18c058b2f7af6f4c482cf5409b4e85..71013bf598ebd1a491c8cc3a52f2311f0db2fdbe 100644 (file)
 #define DF_DIG                 1
 #define DF_SNAP                        2
 
-/* for MoveFigure() */
+/* for MovePlayer() */
 #define MF_NO_ACTION           0
 #define MF_MOVING              1
 #define MF_ACTION              2
 
-/* for ScrollFigure() */
+/* for ScrollPlayer() */
 #define SCROLL_INIT            0
 #define SCROLL_GO_ON           1
 
@@ -98,6 +98,8 @@
                                 RND(element_info[e].push_delay_random))
 #define GET_NEW_MOVE_DELAY(e)  (   (element_info[e].move_delay_fixed) + \
                                 RND(element_info[e].move_delay_random))
+#define GET_MAX_MOVE_DELAY(e)  (   (element_info[e].move_delay_fixed) + \
+                                   (element_info[e].move_delay_random))
 
 #define ELEMENT_CAN_ENTER_FIELD_GENERIC(e, x, y, condition)            \
                (IN_LEV_FIELD(x, y) && (IS_FREE(x, y) ||                \
 
 /* forward declaration for internal use */
 
+static boolean MovePlayerOneStep(struct PlayerInfo *, int, int, int, int);
+static boolean MovePlayer(struct PlayerInfo *, int, int);
+static void ScrollPlayer(struct PlayerInfo *, int);
+static void ScrollScreen(struct PlayerInfo *, int);
+
 static void InitBeltMovement(void);
 static void CloseAllOpenTimegates(void);
 static void CheckGravityMovement(struct PlayerInfo *);
@@ -169,6 +176,7 @@ static void KillHeroUnlessProtected(int, int);
 static void TestIfPlayerTouchesCustomElement(int, int);
 static void TestIfElementTouchesCustomElement(int, int);
 
+static void ChangeElement(int, int, int);
 static boolean CheckTriggeredElementSideChange(int, int, int, int, int);
 static boolean CheckTriggeredElementChange(int, int, int, int);
 static boolean CheckElementSideChange(int, int, int, int, int, int);
@@ -251,6 +259,22 @@ static struct ChangingElementInfo change_delay_list[] =
     NULL,
     NULL
   },
+  {
+    EL_SP_EXIT_OPENING,
+    EL_SP_EXIT_OPEN,
+    29,
+    NULL,
+    NULL,
+    NULL
+  },
+  {
+    EL_SP_EXIT_CLOSING,
+    EL_SP_EXIT_CLOSED,
+    29,
+    NULL,
+    NULL,
+    NULL
+  },
   {
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_OPEN,
@@ -655,7 +679,7 @@ static void InitField(int x, int y, boolean init_game)
 
     case EL_PIG:
     case EL_DRAGON:
-      MovDir[x][y] = 1 << RND(4);
+      GfxDir[x][y] = MovDir[x][y] = 1 << RND(4);
       break;
 
 #if 0
@@ -778,13 +802,19 @@ static void InitGameEngine()
 
   /* dynamically adjust player properties according to game engine version */
   game.initial_move_delay =
-    (game.engine_version <= VERSION_IDENT(2,0,1) ? INITIAL_MOVE_DELAY_ON :
+    (game.engine_version <= VERSION_IDENT(2,0,1,0) ? INITIAL_MOVE_DELAY_ON :
      INITIAL_MOVE_DELAY_OFF);
 
   /* dynamically adjust player properties according to level information */
   game.initial_move_delay_value =
     (level.double_speed ? MOVE_DELAY_HIGH_SPEED : MOVE_DELAY_NORMAL_SPEED);
 
+  /* ---------- initialize player's initial push delay --------------------- */
+
+  /* dynamically adjust player properties according to game engine version */
+  game.initial_push_delay_value =
+    (game.engine_version < VERSION_IDENT(3,0,7,1) ? 5 : -1);
+
   /* ---------- initialize changing elements ------------------------------- */
 
   /* initialize changing elements information */
@@ -879,7 +909,7 @@ static void InitGameEngine()
 
     for (j=0; j < ei->num_change_pages; j++)
     {
-      if (!ei->change_page->can_change)
+      if (!ei->change_page[j].can_change)
        continue;
 
       if (ei->change_page[j].events & CH_EVENT_BIT(CE_BY_OTHER_ACTION))
@@ -905,8 +935,8 @@ static void InitGameEngine()
   {
     if (!IS_CUSTOM_ELEMENT(i))
     {
-      element_info[i].push_delay_fixed = 2;
-      element_info[i].push_delay_random = 8;
+      element_info[i].push_delay_fixed  = game.default_push_delay_fixed;
+      element_info[i].push_delay_random = game.default_push_delay_random;
     }
   }
 
@@ -1008,28 +1038,28 @@ void InitGame()
 
     player->MovDir = MV_NO_MOVING;
     player->MovPos = 0;
-    player->Pushing = FALSE;
-    player->Switching = FALSE;
     player->GfxPos = 0;
     player->GfxDir = MV_NO_MOVING;
     player->GfxAction = ACTION_DEFAULT;
     player->Frame = 0;
     player->StepFrame = 0;
 
-    player->switch_x = -1;
-    player->switch_y = -1;
-
     player->use_murphy_graphic = FALSE;
-    player->use_disk_red_graphic = FALSE;
 
     player->actual_frame_counter = 0;
 
     player->last_move_dir = MV_NO_MOVING;
 
-    player->is_moving = FALSE;
     player->is_waiting = FALSE;
+    player->is_moving = FALSE;
     player->is_digging = FALSE;
+    player->is_snapping = FALSE;
     player->is_collecting = FALSE;
+    player->is_pushing = FALSE;
+    player->is_switching = FALSE;
+
+    player->switch_x = -1;
+    player->switch_y = -1;
 
     player->show_envelope = 0;
 
@@ -1037,9 +1067,7 @@ void InitGame()
     player->move_delay_value = game.initial_move_delay_value;
 
     player->push_delay = 0;
-    player->push_delay_value = 5;
-
-    player->snapped = FALSE;
+    player->push_delay_value = game.initial_push_delay_value;
 
     player->last_jx = player->last_jy = 0;
     player->jx = player->jy = 0;
@@ -1086,6 +1114,7 @@ void InitGame()
   game.timegate_time_left = 0;
   game.switchgate_pos = 0;
   game.balloon_dir = MV_NO_MOVING;
+  game.gravity = level.initial_gravity;
   game.explosions_delayed = TRUE;
 
   game.envelope_active = FALSE;
@@ -1106,9 +1135,11 @@ void InitGame()
       Feld[x][y] = level.field[x][y];
       MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
       ChangeDelay[x][y] = 0;
+      ChangePage[x][y] = -1;
       Store[x][y] = Store2[x][y] = StorePlayer[x][y] = Back[x][y] = 0;
       AmoebaNr[x][y] = 0;
-      JustStopped[x][y] = 0;
+      WasJustMoving[x][y] = 0;
+      WasJustFalling[x][y] = 0;
       Stop[x][y] = FALSE;
       Pushed[x][y] = FALSE;
 
@@ -1119,9 +1150,10 @@ void InitGame()
       ExplodeField[x][y] = EX_NO_EXPLOSION;
 
       GfxFrame[x][y] = 0;
-      GfxAction[x][y] = ACTION_DEFAULT;
       GfxRandom[x][y] = INIT_GFX_RANDOM();
       GfxElement[x][y] = EL_UNDEFINED;
+      GfxAction[x][y] = ACTION_DEFAULT;
+      GfxDir[x][y] = MV_NO_MOVING;
     }
   }
 
@@ -1573,6 +1605,8 @@ void InitMovDir(int x, int y)
       }
       break;
   }
+
+  GfxDir[x][y] = MovDir[x][y];
 }
 
 void InitAmoebaNr(int x, int y)
@@ -1671,11 +1705,15 @@ void GameWon()
   }
 
   /* close exit door after last player */
-  if (Feld[ExitX][ExitY] == EL_EXIT_OPEN && AllPlayersGone)
+  if ((Feld[ExitX][ExitY] == EL_EXIT_OPEN ||
+       Feld[ExitX][ExitY] == EL_SP_EXIT_OPEN) && AllPlayersGone)
   {
-    Feld[ExitX][ExitY] = EL_EXIT_CLOSING;
+    int element = Feld[ExitX][ExitY];
+
+    Feld[ExitX][ExitY] = (element == EL_EXIT_OPEN ? EL_EXIT_CLOSING :
+                         EL_SP_EXIT_CLOSING);
 
-    PlaySoundLevelElementAction(ExitX, ExitY, EL_EXIT_OPEN, ACTION_CLOSING);
+    PlaySoundLevelElementAction(ExitX, ExitY, element, ACTION_CLOSING);
   }
 
   /* Hero disappears */
@@ -1813,6 +1851,7 @@ static void ResetGfxAnimation(int x, int y)
 {
   GfxFrame[x][y] = 0;
   GfxAction[x][y] = ACTION_DEFAULT;
+  GfxDir[x][y] = MovDir[x][y];
 }
 
 void InitMovingField(int x, int y, int direction)
@@ -1823,10 +1862,11 @@ void InitMovingField(int x, int y, int direction)
   int newx = x + dx;
   int newy = y + dy;
 
-  if (!JustStopped[x][y] || direction != MovDir[x][y])
+  if (!WasJustMoving[x][y] || direction != MovDir[x][y])
     ResetGfxAnimation(x, y);
 
   MovDir[newx][newy] = MovDir[x][y] = direction;
+  GfxDir[x][y] = direction;
 
   if (Feld[newx][newy] == EL_EMPTY)
     Feld[newx][newy] = EL_BLOCKED;
@@ -1837,8 +1877,9 @@ void InitMovingField(int x, int y, int direction)
     GfxAction[x][y] = ACTION_MOVING;
 
   GfxFrame[newx][newy] = GfxFrame[x][y];
-  GfxAction[newx][newy] = GfxAction[x][y];
   GfxRandom[newx][newy] = GfxRandom[x][y];
+  GfxAction[newx][newy] = GfxAction[x][y];
+  GfxDir[newx][newy] = GfxDir[x][y];
 }
 
 void Moving2Blocked(int x, int y, int *goes_to_x, int *goes_to_y)
@@ -1917,10 +1958,12 @@ static void RemoveField(int x, int y)
 
   AmoebaNr[x][y] = 0;
   ChangeDelay[x][y] = 0;
+  ChangePage[x][y] = -1;
   Pushed[x][y] = FALSE;
 
   GfxElement[x][y] = EL_UNDEFINED;
   GfxAction[x][y] = ACTION_DEFAULT;
+  GfxDir[x][y] = MV_NO_MOVING;
 }
 
 void RemoveMovingField(int x, int y)
@@ -2030,21 +2073,32 @@ void RelocatePlayer(int x, int y, int element)
 {
   struct PlayerInfo *player = &stored_player[element - EL_PLAYER_1];
 
+#if 1
+  RemoveField(x, y);           /* temporarily remove newly placed player */
+  DrawLevelField(x, y);
+#endif
+
   if (player->present)
   {
     while (player->MovPos)
     {
-      ScrollFigure(player, SCROLL_GO_ON);
+      ScrollPlayer(player, SCROLL_GO_ON);
       ScrollScreen(NULL, SCROLL_GO_ON);
       FrameCounter++;
-      DrawAllPlayers();
+
+      DrawPlayer(player);
+
       BackToFront();
+      Delay(GAME_FRAME_DELAY);
     }
 
-    RemoveField(player->jx, player->jy);
-    DrawLevelField(player->jx, player->jy);
+    DrawPlayer(player);                /* needed here only to cleanup last field */
+    DrawLevelField(player->jx, player->jy);    /* remove player graphic */
+
+    player->is_moving = FALSE;
   }
 
+  Feld[x][y] = element;
   InitPlayerField(x, y, element, TRUE);
 
   if (player == local_player)
@@ -2076,7 +2130,7 @@ void RelocatePlayer(int x, int y, int element)
       ScrollLevel(dx, dy);
       DrawAllPlayers();
 
-      /* scroll in to steps of half tile size to make things smoother */
+      /* scroll in two steps of half tile size to make things smoother */
       BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
       FlushDisplay();
       Delay(GAME_FRAME_DELAY);
@@ -2110,7 +2164,7 @@ void Explode(int ex, int ey, int phase, int mode)
 #if 0
     /* --- This is only really needed (and now handled) in "Impact()". --- */
     /* do not explode moving elements that left the explode field in time */
-    if (game.engine_version >= RELEASE_IDENT(2,2,0,7) &&
+    if (game.engine_version >= VERSION_IDENT(2,2,0,7) &&
        center_element == EL_EMPTY && (mode == EX_NORMAL || mode == EX_CENTER))
       return;
 #endif
@@ -2165,7 +2219,7 @@ void Explode(int ex, int ey, int phase, int mode)
 
 #else
       if ((IS_INDESTRUCTIBLE(element) &&
-          (game.engine_version < VERSION_IDENT(2,2,0) ||
+          (game.engine_version < VERSION_IDENT(2,2,0,0) ||
            (!IS_WALKABLE_OVER(element) && !IS_WALKABLE_UNDER(element)))) ||
          element == EL_FLAMES)
        continue;
@@ -2287,6 +2341,7 @@ void Explode(int ex, int ey, int phase, int mode)
       RemoveField(x, y);
 #else
       MovDir[x][y] = MovPos[x][y] = 0;
+      GfxDir[x][y] = MovDir[x][y];
       AmoebaNr[x][y] = 0;
 #endif
 #endif
@@ -2374,7 +2429,11 @@ void Explode(int ex, int ey, int phase, int mode)
       element = Feld[x][y] = Back[x][y];
     Back[x][y] = 0;
 
-    MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = ChangeDelay[x][y] = 0;
+    MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0;
+    GfxDir[x][y] = MV_NO_MOVING;
+    ChangeDelay[x][y] = 0;
+    ChangePage[x][y] = -1;
+
     InitField(x, y, FALSE);
     if (CAN_MOVE(element))
       InitMovDir(x, y);
@@ -2923,7 +2982,7 @@ void Impact(int x, int y)
                                         MovPos[x][y + 1] <= TILEY / 2));
 
     /* do not smash moving elements that left the smashed field in time */
-    if (game.engine_version >= RELEASE_IDENT(2,2,0,7) && IS_MOVING(x, y + 1) &&
+    if (game.engine_version >= VERSION_IDENT(2,2,0,7) && IS_MOVING(x, y + 1) &&
        ABS(MovPos[x][y + 1] + getElementMoveStepsize(x, y + 1)) >= TILEX)
       object_hit = FALSE;
 
@@ -3130,7 +3189,7 @@ void Impact(int x, int y)
     PlaySoundLevelElementAction(x, y, element, ACTION_IMPACT);
 }
 
-void TurnRound(int x, int y)
+inline static void TurnRoundExt(int x, int y)
 {
   static struct
   {
@@ -3670,6 +3729,32 @@ void TurnRound(int x, int y)
   }
 }
 
+static void TurnRound(int x, int y)
+{
+  int direction = MovDir[x][y];
+
+#if 0
+  GfxDir[x][y] = MovDir[x][y];
+#endif
+
+  TurnRoundExt(x, y);
+
+#if 1
+  GfxDir[x][y] = MovDir[x][y];
+#endif
+
+  if (direction != MovDir[x][y])
+    GfxFrame[x][y] = 0;
+
+#if 1
+  if (MovDelay[x][y])
+    GfxAction[x][y] = ACTION_TURNING_FROM_LEFT + MV_DIR_BIT(direction);
+#else
+  if (MovDelay[x][y])
+    GfxAction[x][y] = ACTION_WAITING;
+#endif
+}
+
 static boolean JustBeingPushed(int x, int y)
 {
   int i;
@@ -3678,7 +3763,7 @@ static boolean JustBeingPushed(int x, int y)
   {
     struct PlayerInfo *player = &stored_player[i];
 
-    if (player->active && player->Pushing && player->MovPos)
+    if (player->active && player->is_pushing && player->MovPos)
     {
       int next_jx = player->jx + (player->jx - player->last_jx);
       int next_jy = player->jy + (player->jy - player->last_jy);
@@ -3693,16 +3778,21 @@ static boolean JustBeingPushed(int x, int y)
 
 void StartMoving(int x, int y)
 {
-  boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0));
+  boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0,0));
   boolean started_moving = FALSE;      /* some elements can fall _and_ move */
   int element = Feld[x][y];
 
   if (Stop[x][y])
     return;
 
+#if 1
+  if (MovDelay[x][y] == 0)
+    GfxAction[x][y] = ACTION_DEFAULT;
+#else
   /* !!! this should be handled more generic (not only for mole) !!! */
   if (element != EL_MOLE && GfxAction[x][y] != ACTION_DIGGING)
     GfxAction[x][y] = ACTION_DEFAULT;
+#endif
 
   if (CAN_FALL(element) && y < lev_fieldy - 1)
   {
@@ -3849,36 +3939,37 @@ void StartMoving(int x, int y)
 #endif
     }
 #if 1
-
-#if 0
-    /* TEST: bug where player gets not killed by falling rock ... */
-    else if (CAN_SMASH(element) &&
-            (Feld[x][y + 1] == EL_BLOCKED ||
-             IS_PLAYER(x, y + 1)) &&
-            JustStopped[x][y] && !Pushed[x][y + 1])
+    else if ((game.engine_version < VERSION_IDENT(2,2,0,7) &&
+             CAN_SMASH(element) && WasJustMoving[x][y] && !Pushed[x][y + 1] &&
+             (Feld[x][y + 1] == EL_BLOCKED)) ||
+            (game.engine_version >= VERSION_IDENT(3,0,7,0) &&
+             CAN_SMASH(element) && WasJustFalling[x][y] &&
+             (Feld[x][y + 1] == EL_BLOCKED || IS_PLAYER(x, y + 1))))
 
 #else
 #if 1
-    else if (game.engine_version < RELEASE_IDENT(2,2,0,7) &&
+    else if (game.engine_version < VERSION_IDENT(2,2,0,7) &&
             CAN_SMASH(element) && Feld[x][y + 1] == EL_BLOCKED &&
-            JustStopped[x][y] && !Pushed[x][y + 1])
+            WasJustMoving[x][y] && !Pushed[x][y + 1])
 #else
     else if (CAN_SMASH(element) && Feld[x][y + 1] == EL_BLOCKED &&
-            JustStopped[x][y])
+            WasJustMoving[x][y])
 #endif
 #endif
 
     {
-      /* calling "Impact()" here is not only completely unneccessary
-        (because it already gets called from "ContinueMoving()" in
-        all relevant situations), but also completely bullshit, because
-        "JustStopped" also indicates a finished *horizontal* movement;
-        we must keep this trash for backwards compatibility with older
-        tapes */
+      /* this is needed for a special case not covered by calling "Impact()"
+        from "ContinueMoving()": if an element moves to a tile directly below
+        another element which was just falling on that tile (which was empty
+        in the previous frame), the falling element above would just stop
+        instead of smashing the element below (in previous version, the above
+        element was just checked for "moving" instead of "falling", resulting
+        in incorrect smashes caused by horizontal movement of the above
+        element; also, the case of the player being the element to smash was
+        simply not covered here... :-/ ) */
 
       Impact(x, y);
     }
-#endif
     else if (IS_FREE(x, y + 1) && element == EL_SPRING && use_spring_bug)
     {
       if (MovDir[x][y] == MV_NO_MOVING)
@@ -3889,7 +3980,7 @@ void StartMoving(int x, int y)
     }
     else if (IS_FREE(x, y + 1) || Feld[x][y + 1] == EL_DIAMOND_BREAKING)
     {
-      if (JustStopped[x][y])   /* prevent animation from being restarted */
+      if (WasJustFalling[x][y])        /* prevent animation from being restarted */
        MovDir[x][y] = MV_DOWN;
 
       InitMovingField(x, y, MV_DOWN);
@@ -3908,13 +3999,13 @@ void StartMoving(int x, int y)
     else if (IS_SLIPPERY(Feld[x][y + 1]) && !Store[x][y + 1])
 #else
     else if (IS_SLIPPERY(Feld[x][y + 1]) && !Store[x][y + 1] &&
-            !IS_FALLING(x, y + 1) && !JustStopped[x][y + 1] &&
+            !IS_FALLING(x, y + 1) && !WasJustMoving[x][y + 1] &&
             element != EL_DX_SUPABOMB)
 #endif
 #else
     else if (((IS_SLIPPERY(Feld[x][y + 1]) && !IS_PLAYER(x, y + 1)) ||
              (IS_EM_SLIPPERY_WALL(Feld[x][y + 1]) && IS_GEM(element))) &&
-            !IS_FALLING(x, y + 1) && !JustStopped[x][y + 1] &&
+            !IS_FALLING(x, y + 1) && !WasJustMoving[x][y + 1] &&
             element != EL_DX_SUPABOMB && element != EL_SP_DISK_ORANGE)
 #endif
     {
@@ -4045,7 +4136,13 @@ void StartMoving(int x, int y)
        /* !!! PLACE THIS SOMEWHERE AFTER "TurnRound()" !!! */
        ResetGfxAnimation(x, y);
 #endif
+
+#if 0
+       if (GfxAction[x][y] != ACTION_WAITING)
+         printf("::: %d: %d != ACTION_WAITING\n", element, GfxAction[x][y]);
+
        GfxAction[x][y] = ACTION_WAITING;
+#endif
       }
 
       if (element == EL_ROBOT ||
@@ -4074,12 +4171,27 @@ void StartMoving(int x, int y)
                       dir == MV_RIGHT  ? IMG_FLAMES_1_RIGHT :
                       dir == MV_UP     ? IMG_FLAMES_1_UP :
                       dir == MV_DOWN   ? IMG_FLAMES_1_DOWN : IMG_EMPTY);
-       int frame = getGraphicAnimationFrame(graphic, -1);
+       int frame = getGraphicAnimationFrame(graphic, GfxFrame[x][y]);
+
+#if 0
+       printf("::: %d, %d\n", GfxAction[x][y], GfxFrame[x][y]);
+#endif
+
+       GfxAction[x][y] = ACTION_ATTACKING;
+
+       if (IS_PLAYER(x, y))
+         DrawPlayerField(x, y);
+       else
+         DrawLevelField(x, y);
 
-       for (i=1; i<=3; i++)
+       PlaySoundLevelActionIfLoop(x, y, ACTION_ATTACKING);
+
+       for (i=1; i <= 3; i++)
        {
-         int xx = x + i*dx, yy = y + i*dy;
-         int sx = SCREENX(xx), sy = SCREENY(yy);
+         int xx = x + i * dx;
+         int yy = y + i * dy;
+         int sx = SCREENX(xx);
+         int sy = SCREENY(yy);
          int flame_graphic = graphic + (i - 1);
 
          if (!IN_LEV_FIELD(xx, yy) || IS_DRAGONFIRE_PROOF(Feld[xx][yy]))
@@ -4096,7 +4208,10 @@ void StartMoving(int x, int y)
 
            Feld[xx][yy] = EL_FLAMES;
            if (IN_SCR_FIELD(sx, sy))
+           {
+             DrawLevelFieldCrumbledSand(xx, yy);
              DrawGraphic(sx, sy, flame_graphic, frame);
+           }
          }
          else
          {
@@ -4114,10 +4229,12 @@ void StartMoving(int x, int y)
        return;
       }
 
+#if 0
       /* special case of "moving" animation of waiting elements (FIX THIS !!!);
         for all other elements GfxAction will be set by InitMovingField() */
       if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY)
        GfxAction[x][y] = ACTION_MOVING;
+#endif
     }
 
     /* now make next step */
@@ -4173,7 +4290,7 @@ void StartMoving(int x, int y)
        if (DigField(local_player, newx, newy, 0, 0, DF_DIG) == MF_MOVING)
          DrawLevelField(newx, newy);
        else
-         MovDir[x][y] = MV_NO_MOVING;
+         GfxDir[x][y] = MovDir[x][y] = MV_NO_MOVING;
       }
       else if (!IS_FREE(newx, newy))
       {
@@ -4217,14 +4334,15 @@ void StartMoving(int x, int y)
          DrawPlayerField(x, y);
        else
          DrawLevelField(x, y);
+
        return;
       }
       else
       {
        boolean wanna_flame = !RND(10);
        int dx = newx - x, dy = newy - y;
-       int newx1 = newx+1*dx, newy1 = newy+1*dy;
-       int newx2 = newx+2*dx, newy2 = newy+2*dy;
+       int newx1 = newx + 1 * dx, newy1 = newy + 1 * dy;
+       int newx2 = newx + 2 * dx, newy2 = newy + 2 * dy;
        int element1 = (IN_LEV_FIELD(newx1, newy1) ?
                        MovingOrBlocked2Element(newx1, newy1) : EL_STEELWALL);
        int element2 = (IN_LEV_FIELD(newx2, newy2) ?
@@ -4236,6 +4354,11 @@ void StartMoving(int x, int y)
            element1 != EL_DRAGON && element2 != EL_DRAGON &&
            element1 != EL_FLAMES && element2 != EL_FLAMES)
        {
+#if 1
+         ResetGfxAnimation(x, y);
+         GfxAction[x][y] = ACTION_ATTACKING;
+#endif
+
          if (IS_PLAYER(x, y))
            DrawPlayerField(x, y);
          else
@@ -4244,11 +4367,13 @@ void StartMoving(int x, int y)
          PlaySoundLevel(x, y, SND_DRAGON_ATTACKING);
 
          MovDelay[x][y] = 50;
+
          Feld[newx][newy] = EL_FLAMES;
          if (IN_LEV_FIELD(newx1, newy1) && Feld[newx1][newy1] == EL_EMPTY)
            Feld[newx1][newy1] = EL_FLAMES;
          if (IN_LEV_FIELD(newx2, newy2) && Feld[newx2][newy2] == EL_EMPTY)
            Feld[newx2][newy2] = EL_FLAMES;
+
          return;
        }
       }
@@ -4383,162 +4508,181 @@ void ContinueMoving(int x, int y)
   if (pushed)          /* special case: moving object pushed by player */
     MovPos[x][y] = SIGN(MovPos[x][y]) * (TILEX - ABS(PLAYERINFO(x,y)->MovPos));
 
-  if (ABS(MovPos[x][y]) >= TILEX)      /* object reached its destination */
+  if (ABS(MovPos[x][y]) < TILEX)
   {
-    Feld[x][y] = EL_EMPTY;
-    Feld[newx][newy] = element;
-    MovPos[x][y] = 0;  /* force "not moving" for "crumbled sand" */
+    DrawLevelField(x, y);
 
-    if (element == EL_MOLE)
-    {
-      Feld[x][y] = EL_SAND;
+    return;    /* element is still moving */
+  }
 
-      DrawLevelFieldCrumbledSandNeighbours(x, y);
-    }
-    else if (element == EL_QUICKSAND_FILLING)
-    {
-      element = Feld[newx][newy] = get_next_element(element);
-      Store[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_QUICKSAND_EMPTYING)
-    {
-      Feld[x][y] = get_next_element(element);
-      element = Feld[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_MAGIC_WALL_FILLING)
-    {
-      element = Feld[newx][newy] = get_next_element(element);
-      if (!game.magic_wall_active)
-       element = Feld[newx][newy] = EL_MAGIC_WALL_DEAD;
-      Store[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_MAGIC_WALL_EMPTYING)
-    {
-      Feld[x][y] = get_next_element(element);
-      if (!game.magic_wall_active)
-       Feld[x][y] = EL_MAGIC_WALL_DEAD;
-      element = Feld[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_BD_MAGIC_WALL_FILLING)
-    {
-      element = Feld[newx][newy] = get_next_element(element);
-      if (!game.magic_wall_active)
-       element = Feld[newx][newy] = EL_BD_MAGIC_WALL_DEAD;
-      Store[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_BD_MAGIC_WALL_EMPTYING)
-    {
-      Feld[x][y] = get_next_element(element);
-      if (!game.magic_wall_active)
-       Feld[x][y] = EL_BD_MAGIC_WALL_DEAD;
-      element = Feld[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_AMOEBA_DROPPING)
-    {
-      Feld[x][y] = get_next_element(element);
-      element = Feld[newx][newy] = Store[x][y];
-    }
-    else if (element == EL_SOKOBAN_OBJECT)
-    {
-      if (Back[x][y])
-       Feld[x][y] = Back[x][y];
+  /* element reached destination field */
 
-      if (Back[newx][newy])
-       Feld[newx][newy] = EL_SOKOBAN_FIELD_FULL;
+  Feld[x][y] = EL_EMPTY;
+  Feld[newx][newy] = element;
+  MovPos[x][y] = 0;    /* force "not moving" for "crumbled sand" */
 
-      Back[x][y] = Back[newx][newy] = 0;
-    }
-    else if (Store[x][y] == EL_ACID)
-    {
-      element = Feld[newx][newy] = EL_ACID;
-    }
+  if (element == EL_MOLE)
+  {
+    Feld[x][y] = EL_SAND;
+
+    DrawLevelFieldCrumbledSandNeighbours(x, y);
+  }
+  else if (element == EL_QUICKSAND_FILLING)
+  {
+    element = Feld[newx][newy] = get_next_element(element);
+    Store[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_QUICKSAND_EMPTYING)
+  {
+    Feld[x][y] = get_next_element(element);
+    element = Feld[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_MAGIC_WALL_FILLING)
+  {
+    element = Feld[newx][newy] = get_next_element(element);
+    if (!game.magic_wall_active)
+      element = Feld[newx][newy] = EL_MAGIC_WALL_DEAD;
+    Store[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_MAGIC_WALL_EMPTYING)
+  {
+    Feld[x][y] = get_next_element(element);
+    if (!game.magic_wall_active)
+      Feld[x][y] = EL_MAGIC_WALL_DEAD;
+    element = Feld[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_BD_MAGIC_WALL_FILLING)
+  {
+    element = Feld[newx][newy] = get_next_element(element);
+    if (!game.magic_wall_active)
+      element = Feld[newx][newy] = EL_BD_MAGIC_WALL_DEAD;
+    Store[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_BD_MAGIC_WALL_EMPTYING)
+  {
+    Feld[x][y] = get_next_element(element);
+    if (!game.magic_wall_active)
+      Feld[x][y] = EL_BD_MAGIC_WALL_DEAD;
+    element = Feld[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_AMOEBA_DROPPING)
+  {
+    Feld[x][y] = get_next_element(element);
+    element = Feld[newx][newy] = Store[x][y];
+  }
+  else if (element == EL_SOKOBAN_OBJECT)
+  {
+    if (Back[x][y])
+      Feld[x][y] = Back[x][y];
+
+    if (Back[newx][newy])
+      Feld[newx][newy] = EL_SOKOBAN_FIELD_FULL;
 
-    Store[x][y] = 0;
-    MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
-    MovDelay[newx][newy] = 0;
+    Back[x][y] = Back[newx][newy] = 0;
+  }
+  else if (Store[x][y] == EL_ACID)
+  {
+    element = Feld[newx][newy] = EL_ACID;
+  }
 
-    /* copy element change control values to new field */
-    ChangeDelay[newx][newy] = ChangeDelay[x][y];
-    Changed[newx][newy] = Changed[x][y];
-    ChangeEvent[newx][newy] = ChangeEvent[x][y];
+  Store[x][y] = 0;
+  MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
+  MovDelay[newx][newy] = 0;
 
-    ChangeDelay[x][y] = 0;
-    Changed[x][y] = CE_BITMASK_DEFAULT;
-    ChangeEvent[x][y] = CE_BITMASK_DEFAULT;
+  /* copy element change control values to new field */
+  ChangeDelay[newx][newy] = ChangeDelay[x][y];
+  ChangePage[newx][newy] = ChangePage[x][y];
+  Changed[newx][newy] = Changed[x][y];
+  ChangeEvent[newx][newy] = ChangeEvent[x][y];
+
+  ChangeDelay[x][y] = 0;
+  ChangePage[x][y] = -1;
+  Changed[x][y] = CE_BITMASK_DEFAULT;
+  ChangeEvent[x][y] = CE_BITMASK_DEFAULT;
 
-    /* copy animation control values to new field */
-    GfxFrame[newx][newy]  = GfxFrame[x][y];
-    GfxAction[newx][newy] = GfxAction[x][y];   /* keep action one frame */
-    GfxRandom[newx][newy] = GfxRandom[x][y];   /* keep same random value */
+  /* copy animation control values to new field */
+  GfxFrame[newx][newy]  = GfxFrame[x][y];
+  GfxRandom[newx][newy] = GfxRandom[x][y];     /* keep same random value */
+  GfxAction[newx][newy] = GfxAction[x][y];     /* keep action one frame  */
+  GfxDir[newx][newy]    = GfxDir[x][y];                /* keep element direction */
 
-    Pushed[x][y] = Pushed[newx][newy] = FALSE;
+  Pushed[x][y] = Pushed[newx][newy] = FALSE;
 
-    ResetGfxAnimation(x, y);   /* reset animation values for old field */
+  ResetGfxAnimation(x, y);     /* reset animation values for old field */
 
 #if 0
-    /* 2.1.1 (does not work correctly for spring) */
-    if (!CAN_MOVE(element))
-      MovDir[newx][newy] = 0;
+  /* 2.1.1 (does not work correctly for spring) */
+  if (!CAN_MOVE(element))
+    MovDir[newx][newy] = 0;
 #else
 
 #if 0
-    /* (does not work for falling objects that slide horizontally) */
-    if (CAN_FALL(element) && MovDir[newx][newy] == MV_DOWN)
-      MovDir[newx][newy] = 0;
+  /* (does not work for falling objects that slide horizontally) */
+  if (CAN_FALL(element) && MovDir[newx][newy] == MV_DOWN)
+    MovDir[newx][newy] = 0;
 #else
-    /*
-    if (!CAN_MOVE(element) ||
-       (element == EL_SPRING && MovDir[newx][newy] == MV_DOWN))
-      MovDir[newx][newy] = 0;
-    */
+  /*
+  if (!CAN_MOVE(element) ||
+      (element == EL_SPRING && MovDir[newx][newy] == MV_DOWN))
+    MovDir[newx][newy] = 0;
+  */
+
+  if (!CAN_MOVE(element) ||
+      (CAN_FALL(element) && direction == MV_DOWN))
+    GfxDir[x][y] = MovDir[newx][newy] = 0;
 
-    if (!CAN_MOVE(element) ||
-       (CAN_FALL(element) && MovDir[newx][newy] == MV_DOWN))
-      MovDir[newx][newy] = 0;
 #endif
 #endif
 
-    DrawLevelField(x, y);
-    DrawLevelField(newx, newy);
+  DrawLevelField(x, y);
+  DrawLevelField(newx, newy);
 
-    Stop[newx][newy] = TRUE;   /* ignore this element until the next frame */
+  Stop[newx][newy] = TRUE;     /* ignore this element until the next frame */
 
-    /* prevent pushed element from moving on in pushed direction */
-    if (pushed && CAN_MOVE(element) &&
-       element_info[element].move_pattern & MV_ANY_DIRECTION &&
-       !(element_info[element].move_pattern & MovDir[newx][newy]))
-      TurnRound(newx, newy);
+  /* prevent pushed element from moving on in pushed direction */
+  if (pushed && CAN_MOVE(element) &&
+      element_info[element].move_pattern & MV_ANY_DIRECTION &&
+      !(element_info[element].move_pattern & direction))
+    TurnRound(newx, newy);
 
-    if (!pushed)       /* special case: moving object pushed by player */
-      JustStopped[newx][newy] = 3;
+  if (!pushed) /* special case: moving object pushed by player */
+  {
+    WasJustMoving[newx][newy] = 3;
 
-    if (DONT_TOUCH(element))   /* object may be nasty to player or others */
-    {
-      TestIfBadThingTouchesHero(newx, newy);
-      TestIfBadThingTouchesFriend(newx, newy);
-      TestIfBadThingTouchesOtherBadThing(newx, newy);
-    }
-    else if (element == EL_PENGUIN)
-      TestIfFriendTouchesBadThing(newx, newy);
+    if (CAN_FALL(element) && direction == MV_DOWN)
+      WasJustFalling[newx][newy] = 3;
+  }
 
-    if (CAN_FALL(element) && direction == MV_DOWN &&
-       (newy == lev_fieldy - 1 || !IS_FREE(x, newy + 1)))
-      Impact(x, newy);
+  if (DONT_TOUCH(element))     /* object may be nasty to player or others */
+  {
+    TestIfBadThingTouchesHero(newx, newy);
+    TestIfBadThingTouchesFriend(newx, newy);
+
+    if (!IS_CUSTOM_ELEMENT(element))
+      TestIfBadThingTouchesOtherBadThing(newx, newy);
+  }
+  else if (element == EL_PENGUIN)
+    TestIfFriendTouchesBadThing(newx, newy);
 
-    if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
-      CheckElementSideChange(newx, newy, element, direction, CE_COLLISION, -1);
+  if (CAN_FALL(element) && direction == MV_DOWN &&
+      (newy == lev_fieldy - 1 || !IS_FREE(x, newy + 1)))
+    Impact(x, newy);
 
 #if 1
-    TestIfElementTouchesCustomElement(x, y);           /* for empty space */
+  TestIfElementTouchesCustomElement(x, y);             /* for empty space */
 #endif
 
-    TestIfPlayerTouchesCustomElement(newx, newy);
-    TestIfElementTouchesCustomElement(newx, newy);
-  }
-  else                         /* still moving on */
-  {
-    DrawLevelField(x, y);
-  }
+#if 0
+  if (ChangePage[newx][newy] != -1)                    /* delayed change */
+    ChangeElement(newx, newy, ChangePage[newx][newy]);
+#endif
+
+  if (!IN_LEV_FIELD(nextx, nexty) || !IS_FREE(nextx, nexty))
+    CheckElementSideChange(newx, newy, Feld[newx][newy], direction,
+                          CE_COLLISION, -1);
+
+  TestIfPlayerTouchesCustomElement(newx, newy);
+  TestIfElementTouchesCustomElement(newx, newy);
 }
 
 int AmoebeNachbarNr(int ax, int ay)
@@ -5094,7 +5238,10 @@ void CheckExitSP(int x, int y)
     return;
   }
 
-  Feld[x][y] = EL_SP_EXIT_OPEN;
+  if (AllPlayersGone)  /* do not re-open exit door closed after last player */
+    return;
+
+  Feld[x][y] = EL_SP_EXIT_OPENING;
 
   PlaySoundLevelNearest(x, y, SND_CLASS_SP_EXIT_OPENING);
 }
@@ -5177,7 +5324,7 @@ void MauerWaechst(int x, int y)
 
     if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
     {
-      int graphic = el_dir2img(Feld[x][y], MovDir[x][y]);
+      int graphic = el_dir2img(Feld[x][y], GfxDir[x][y]);
       int frame = getGraphicAnimationFrame(graphic, 17 - MovDelay[x][y]);
 
       DrawGraphic(SCREENX(x), SCREENY(y), graphic, frame);
@@ -5208,7 +5355,7 @@ void MauerWaechst(int x, int y)
 
       Feld[x][y] = Store[x][y];
       Store[x][y] = 0;
-      MovDir[x][y] = MV_NO_MOVING;
+      GfxDir[x][y] = MovDir[x][y] = MV_NO_MOVING;
       DrawLevelField(x, y);
     }
   }
@@ -5253,7 +5400,7 @@ void MauerAbleger(int ax, int ay)
     {
       Feld[ax][ay-1] = EL_EXPANDABLE_WALL_GROWING;
       Store[ax][ay-1] = element;
-      MovDir[ax][ay-1] = MV_UP;
+      GfxDir[ax][ay-1] = MovDir[ax][ay-1] = MV_UP;
       if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay-1)))
        DrawGraphic(SCREENX(ax), SCREENY(ay - 1),
                    IMG_EXPANDABLE_WALL_GROWING_UP, 0);
@@ -5263,7 +5410,7 @@ void MauerAbleger(int ax, int ay)
     {
       Feld[ax][ay+1] = EL_EXPANDABLE_WALL_GROWING;
       Store[ax][ay+1] = element;
-      MovDir[ax][ay+1] = MV_DOWN;
+      GfxDir[ax][ay+1] = MovDir[ax][ay+1] = MV_DOWN;
       if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay+1)))
        DrawGraphic(SCREENX(ax), SCREENY(ay + 1),
                    IMG_EXPANDABLE_WALL_GROWING_DOWN, 0);
@@ -5279,7 +5426,7 @@ void MauerAbleger(int ax, int ay)
     {
       Feld[ax-1][ay] = EL_EXPANDABLE_WALL_GROWING;
       Store[ax-1][ay] = element;
-      MovDir[ax-1][ay] = MV_LEFT;
+      GfxDir[ax-1][ay] = MovDir[ax-1][ay] = MV_LEFT;
       if (IN_SCR_FIELD(SCREENX(ax-1), SCREENY(ay)))
        DrawGraphic(SCREENX(ax - 1), SCREENY(ay),
                    IMG_EXPANDABLE_WALL_GROWING_LEFT, 0);
@@ -5290,7 +5437,7 @@ void MauerAbleger(int ax, int ay)
     {
       Feld[ax+1][ay] = EL_EXPANDABLE_WALL_GROWING;
       Store[ax+1][ay] = element;
-      MovDir[ax+1][ay] = MV_RIGHT;
+      GfxDir[ax+1][ay] = MovDir[ax+1][ay] = MV_RIGHT;
       if (IN_SCR_FIELD(SCREENX(ax+1), SCREENY(ay)))
        DrawGraphic(SCREENX(ax + 1), SCREENY(ay),
                    IMG_EXPANDABLE_WALL_GROWING_RIGHT, 0);
@@ -5592,7 +5739,8 @@ static boolean ChangeElementNow(int x, int y, int element, int page)
 static void ChangeElement(int x, int y, int page)
 {
   int element = MovingOrBlocked2Element(x, y);
-  struct ElementChangeInfo *change = &element_info[element].change_page[page];
+  struct ElementInfo *ei = &element_info[element];
+  struct ElementChangeInfo *change = &ei->change_page[page];
 
 #if 0
 #ifdef DEBUG
@@ -5623,7 +5771,7 @@ static void ChangeElement(int x, int y, int page)
 
   if (ChangeDelay[x][y] != 0)          /* continue element change */
   {
-    int graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+    int graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
 
     if (IS_ANIMATED(graphic))
       DrawLevelGraphicAnimationIfNeeded(x, y, graphic);
@@ -5633,9 +5781,16 @@ static void ChangeElement(int x, int y, int page)
   }
   else                                 /* finish element change */
   {
+    if (ChangePage[x][y] != -1)                /* remember page from delayed change */
+    {
+      page = ChangePage[x][y];
+      ChangePage[x][y] = -1;
+    }
+
     if (IS_MOVING(x, y))               /* never change a running system ;-) */
     {
       ChangeDelay[x][y] = 1;           /* try change after next move step */
+      ChangePage[x][y] = page;         /* remember page to use for change */
 
       return;
     }
@@ -5672,9 +5827,19 @@ static boolean CheckTriggeredElementSideChange(int lx, int ly,
     {
       struct ElementChangeInfo *change = &element_info[element].change_page[j];
 
-      if (change->sides & trigger_side &&
+      if (change->can_change &&
+#if 1
+         change->events & CH_EVENT_BIT(trigger_event) &&
+#endif
+         change->sides & trigger_side &&
          change->trigger_element == trigger_element)
       {
+#if 0
+       if (!(change->events & CH_EVENT_BIT(trigger_event)))
+         printf("::: !!! %d triggers %d: using wrong page %d [event %d]\n",
+                trigger_element-EL_CUSTOM_START+1, i+1, j, trigger_event);
+#endif
+
        change_element = TRUE;
        page = j;
 
@@ -5741,10 +5906,13 @@ static boolean CheckElementChange(int x, int y, int element, int trigger_event)
   return CheckElementSideChange(x, y, element, CH_SIDE_ANY, trigger_event, -1);
 }
 
-static void PlayerActions(struct PlayerInfo *player, byte player_action)
+#if 1
+static byte PlayerActions(struct PlayerInfo *player, byte player_action)
 {
+#if 0
   static byte stored_player_action[MAX_PLAYERS];
   static int num_stored_actions = 0;
+#endif
   boolean moved = FALSE, snapped = FALSE, dropped = FALSE;
   int left     = player_action & JOY_LEFT;
   int right    = player_action & JOY_RIGHT;
@@ -5755,14 +5923,24 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action)
   int dx       = (left ? -1    : right ? 1     : 0);
   int dy       = (up   ? -1    : down  ? 1     : 0);
 
+#if 0
   stored_player_action[player->index_nr] = 0;
   num_stored_actions++;
+#endif
+
+#if 0
+  printf("::: player %d [%d]\n", player->index_nr, FrameCounter);
+#endif
 
   if (!player->active || tape.pausing)
-    return;
+    return 0;
 
   if (player_action)
   {
+#if 0
+    printf("::: player %d acts [%d]\n", player->index_nr, FrameCounter);
+#endif
+
     if (button1)
       snapped = SnapField(player, dx, dy);
     else
@@ -5770,7 +5948,7 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action)
       if (button2)
        dropped = DropElement(player);
 
-      moved = MoveFigure(player, dx, dy);
+      moved = MovePlayer(player, dx, dy);
     }
 
     if (tape.single_step && tape.recording && !tape.pausing)
@@ -5782,10 +5960,18 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action)
       }
     }
 
+#if 1
+    return player_action;
+#else
     stored_player_action[player->index_nr] = player_action;
+#endif
   }
   else
   {
+#if 0
+    printf("::: player %d waits [%d]\n", player->index_nr, FrameCounter);
+#endif
+
     /* no actions for this player (no input at player's configured device) */
 
     DigField(player, 0, 0, 0, 0, DF_NO_PUSH);
@@ -5797,49 +5983,134 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action)
 
     if (player->MovPos == 0)   /* needed for tape.playing */
       player->is_moving = FALSE;
+
+    return 0;
   }
 
+#if 0
   if (tape.recording && num_stored_actions >= MAX_PLAYERS)
   {
+    printf("::: player %d recorded [%d]\n", player->index_nr, FrameCounter);
+
     TapeRecordAction(stored_player_action);
     num_stored_actions = 0;
   }
+#endif
 }
 
-void GameActions()
-{
-  static unsigned long action_delay = 0;
-  unsigned long action_delay_value;
-  int magic_wall_x = 0, magic_wall_y = 0;
-  int i, x, y, element, graphic;
-  byte *recorded_player_action;
-  byte summarized_player_action = 0;
-
-  if (game_status != GAME_MODE_PLAYING)
-    return;
+#else
 
-  action_delay_value =
-    (tape.playing && tape.fast_forward ? FfwdFrameDelay : GameFrameDelay);
+static void PlayerActions(struct PlayerInfo *player, byte player_action)
+{
+  static byte stored_player_action[MAX_PLAYERS];
+  static int num_stored_actions = 0;
+  boolean moved = FALSE, snapped = FALSE, dropped = FALSE;
+  int left     = player_action & JOY_LEFT;
+  int right    = player_action & JOY_RIGHT;
+  int up       = player_action & JOY_UP;
+  int down     = player_action & JOY_DOWN;
+  int button1  = player_action & JOY_BUTTON_1;
+  int button2  = player_action & JOY_BUTTON_2;
+  int dx       = (left ? -1    : right ? 1     : 0);
+  int dy       = (up   ? -1    : down  ? 1     : 0);
 
-  if (tape.playing && tape.index_search && !tape.pausing)
-    action_delay_value = 0;
+  stored_player_action[player->index_nr] = 0;
+  num_stored_actions++;
 
-  /* ---------- main game synchronization point ---------- */
+  printf("::: player %d [%d]\n", player->index_nr, FrameCounter);
 
-  WaitUntilDelayReached(&action_delay, action_delay_value);
+  if (!player->active || tape.pausing)
+    return;
 
-  if (network_playing && !network_player_action_received)
+  if (player_action)
   {
-    /*
-#ifdef DEBUG
-    printf("DEBUG: try to get network player actions in time\n");
-#endif
-    */
+    printf("::: player %d acts [%d]\n", player->index_nr, FrameCounter);
 
-#if defined(PLATFORM_UNIX)
-    /* last chance to get network player actions without main loop delay */
-    HandleNetworking();
-#endif
+    if (button1)
+      snapped = SnapField(player, dx, dy);
+    else
+    {
+      if (button2)
+       dropped = DropElement(player);
+
+      moved = MovePlayer(player, dx, dy);
+    }
+
+    if (tape.single_step && tape.recording && !tape.pausing)
+    {
+      if (button1 || (dropped && !moved))
+      {
+       TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+       SnapField(player, 0, 0);                /* stop snapping */
+      }
+    }
+
+    stored_player_action[player->index_nr] = player_action;
+  }
+  else
+  {
+    printf("::: player %d waits [%d]\n", player->index_nr, FrameCounter);
+
+    /* no actions for this player (no input at player's configured device) */
+
+    DigField(player, 0, 0, 0, 0, DF_NO_PUSH);
+    SnapField(player, 0, 0);
+    CheckGravityMovement(player);
+
+    if (player->MovPos == 0)
+      InitPlayerGfxAnimation(player, ACTION_DEFAULT, player->MovDir);
+
+    if (player->MovPos == 0)   /* needed for tape.playing */
+      player->is_moving = FALSE;
+  }
+
+  if (tape.recording && num_stored_actions >= MAX_PLAYERS)
+  {
+    printf("::: player %d recorded [%d]\n", player->index_nr, FrameCounter);
+
+    TapeRecordAction(stored_player_action);
+    num_stored_actions = 0;
+  }
+}
+#endif
+
+void GameActions()
+{
+  static unsigned long action_delay = 0;
+  unsigned long action_delay_value;
+  int magic_wall_x = 0, magic_wall_y = 0;
+  int i, x, y, element, graphic;
+  byte *recorded_player_action;
+  byte summarized_player_action = 0;
+#if 1
+  byte tape_action[MAX_PLAYERS];
+#endif
+
+  if (game_status != GAME_MODE_PLAYING)
+    return;
+
+  action_delay_value =
+    (tape.playing && tape.fast_forward ? FfwdFrameDelay : GameFrameDelay);
+
+  if (tape.playing && tape.index_search && !tape.pausing)
+    action_delay_value = 0;
+
+  /* ---------- main game synchronization point ---------- */
+
+  WaitUntilDelayReached(&action_delay, action_delay_value);
+
+  if (network_playing && !network_player_action_received)
+  {
+    /*
+#ifdef DEBUG
+    printf("DEBUG: try to get network player actions in time\n");
+#endif
+    */
+
+#if defined(PLATFORM_UNIX)
+    /* last chance to get network player actions without main loop delay */
+    HandleNetworking();
+#endif
 
     if (game_status != GAME_MODE_PLAYING)
       return;
@@ -5876,7 +6147,7 @@ void GameActions()
   if (!options.network && !setup.team_mode)
     local_player->effective_action = summarized_player_action;
 
-  for (i=0; i<MAX_PLAYERS; i++)
+  for (i=0; i < MAX_PLAYERS; i++)
   {
     int actual_player_action = stored_player[i].effective_action;
 
@@ -5886,10 +6157,16 @@ void GameActions()
     if (recorded_player_action)
       actual_player_action = recorded_player_action[i];
 
-    PlayerActions(&stored_player[i], actual_player_action);
-    ScrollFigure(&stored_player[i], SCROLL_GO_ON);
+    tape_action[i] = PlayerActions(&stored_player[i], actual_player_action);
+
+    ScrollPlayer(&stored_player[i], SCROLL_GO_ON);
   }
 
+#if 1
+  if (tape.recording)
+    TapeRecordAction(tape_action);
+#endif
+
   network_player_action_received = FALSE;
 
   ScrollScreen(NULL, SCROLL_GO_ON);
@@ -5903,7 +6180,7 @@ void GameActions()
 #endif
 
 #if 1
-  if (game.engine_version < RELEASE_IDENT(2,2,0,7))
+  if (game.engine_version < VERSION_IDENT(2,2,0,7))
   {
     for (i=0; i<MAX_PLAYERS; i++)
     {
@@ -5911,7 +6188,7 @@ void GameActions()
       int x = player->jx;
       int y = player->jy;
 
-      if (player->active && player->Pushing && player->is_moving &&
+      if (player->active && player->is_pushing && player->is_moving &&
          IS_MOVING(x, y))
       {
        ContinueMoving(x, y);
@@ -5931,9 +6208,21 @@ void GameActions()
     Changed[x][y] = CE_BITMASK_DEFAULT;
     ChangeEvent[x][y] = CE_BITMASK_DEFAULT;
 
+#if DEBUG
+    if (ChangePage[x][y] != -1 && ChangeDelay[x][y] != 1)
+    {
+      printf("GameActions(): x = %d, y = %d: ChangePage != -1\n", x, y);
+      printf("GameActions(): This should never happen!\n");
+
+      ChangePage[x][y] = -1;
+    }
+#endif
+
     Stop[x][y] = FALSE;
-    if (JustStopped[x][y] > 0)
-      JustStopped[x][y]--;
+    if (WasJustMoving[x][y] > 0)
+      WasJustMoving[x][y]--;
+    if (WasJustFalling[x][y] > 0)
+      WasJustFalling[x][y]--;
 
     GfxFrame[x][y]++;
 
@@ -5968,7 +6257,7 @@ void GameActions()
   {
     element = Feld[x][y];
 #if 1
-    graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+    graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
 #else
     graphic = el2img(element);
 #endif
@@ -6005,11 +6294,22 @@ void GameActions()
 
 #if 1
     /* this may take place after moving, so 'element' may have changed */
+#if 0
     if (IS_CHANGING(x, y))
+#else
+    if (IS_CHANGING(x, y) &&
+       (game.engine_version < VERSION_IDENT(3,0,7,1) || !Stop[x][y]))
+#endif
     {
+#if 0
+      ChangeElement(x, y, ChangePage[x][y] != -1 ? ChangePage[x][y] :
+                   element_info[element].event_page_nr[CE_DELAY]);
+#else
       ChangeElement(x, y, element_info[element].event_page_nr[CE_DELAY]);
+#endif
+
       element = Feld[x][y];
-      graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+      graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
     }
 #endif
 
@@ -6018,7 +6318,7 @@ void GameActions()
       StartMoving(x, y);
 
 #if 1
-      graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+      graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
 #if 0
       if (element == EL_MOLE)
        printf("::: %d, %d, %d [%d]\n",
@@ -6038,6 +6338,11 @@ void GameActions()
       {
        DrawLevelGraphicAnimationIfNeeded(x, y, graphic);
 
+#if 0
+       if (element == EL_BUG)
+         printf("::: %d, %d\n", graphic, GfxFrame[x][y]);
+#endif
+
 #if 0
        if (element == EL_MOLE)
          printf("::: %d, %d\n", graphic, GfxFrame[x][y]);
@@ -6425,7 +6730,7 @@ void ScrollLevel(int dx, int dy)
 
 static void CheckGravityMovement(struct PlayerInfo *player)
 {
-  if (level.gravity && !player->programmed_action)
+  if (game.gravity && !player->programmed_action)
   {
     int move_dir_vertical = player->action & (MV_UP | MV_DOWN);
     int move_dir_horizontal = player->action & (MV_LEFT | MV_RIGHT);
@@ -6453,15 +6758,16 @@ static void CheckGravityMovement(struct PlayerInfo *player)
 }
 
 /*
-  MoveFigureOneStep()
+  MovePlayerOneStep()
   -----------------------------------------------------------------------------
   dx, dy:              direction (non-diagonal) to try to move the player to
   real_dx, real_dy:    direction as read from input device (can be diagonal)
 */
 
-boolean MoveFigureOneStep(struct PlayerInfo *player,
+boolean MovePlayerOneStep(struct PlayerInfo *player,
                          int dx, int dy, int real_dx, int real_dy)
 {
+#if 0
   static int change_sides[4][2] =
   {
     /* enter side        leave side */
@@ -6476,6 +6782,7 @@ boolean MoveFigureOneStep(struct PlayerInfo *player,
                        dy == +1 ? MV_DOWN : MV_NO_MOVING);
   int enter_side = change_sides[MV_DIR_BIT(move_direction)][0];
   int leave_side = change_sides[MV_DIR_BIT(move_direction)][1];
+#endif
   int jx = player->jx, jy = player->jy;
   int new_jx = jx + dx, new_jy = jy + dy;
   int element;
@@ -6536,9 +6843,9 @@ boolean MoveFigureOneStep(struct PlayerInfo *player,
   player->MovPos =
     (dx > 0 || dy > 0 ? -1 : 1) * (TILEX - TILEX / player->move_delay_value);
 
-  ScrollFigure(player, SCROLL_INIT);
+  ScrollPlayer(player, SCROLL_INIT);
 
-#if 1
+#if 0
   if (IS_CUSTOM_ELEMENT(Feld[jx][jy]))
   {
     CheckTriggeredElementSideChange(jx, jy, Feld[jx][jy], leave_side,
@@ -6559,7 +6866,7 @@ boolean MoveFigureOneStep(struct PlayerInfo *player,
   return MF_MOVING;
 }
 
-boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
+boolean MovePlayer(struct PlayerInfo *player, int dx, int dy)
 {
   int jx = player->jx, jy = player->jy;
   int old_jx = jx, old_jy = jy;
@@ -6598,7 +6905,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
 
     while (player->MovPos)
     {
-      ScrollFigure(player, SCROLL_GO_ON);
+      ScrollPlayer(player, SCROLL_GO_ON);
       ScrollScreen(NULL, SCROLL_GO_ON);
       FrameCounter++;
       DrawAllPlayers();
@@ -6610,13 +6917,13 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
 
   if (player->last_move_dir & (MV_LEFT | MV_RIGHT))
   {
-    if (!(moved |= MoveFigureOneStep(player, 0, dy, dx, dy)))
-      moved |= MoveFigureOneStep(player, dx, 0, dx, dy);
+    if (!(moved |= MovePlayerOneStep(player, 0, dy, dx, dy)))
+      moved |= MovePlayerOneStep(player, dx, 0, dx, dy);
   }
   else
   {
-    if (!(moved |= MoveFigureOneStep(player, dx, 0, dx, dy)))
-      moved |= MoveFigureOneStep(player, 0, dy, dx, dy);
+    if (!(moved |= MovePlayerOneStep(player, dx, 0, dx, dy)))
+      moved |= MovePlayerOneStep(player, 0, dy, dx, dy);
   }
 
   jx = player->jx;
@@ -6695,7 +7002,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
 #if 1
   InitPlayerGfxAnimation(player, ACTION_DEFAULT);
 #else
-  if (!(moved & MF_MOVING) && !player->Pushing)
+  if (!(moved & MF_MOVING) && !player->is_pushing)
     player->Frame = 0;
 #endif
 #endif
@@ -6714,12 +7021,50 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
     player->last_move_dir = player->MovDir;
     player->is_moving = TRUE;
 #if 1
-    player->snapped = FALSE;
+    player->is_snapping = FALSE;
+#endif
+
+#if 1
+    player->is_switching = FALSE;
 #endif
 
+
+#if 1
+    {
+      static int change_sides[4][2] =
+      {
+       /* enter side           leave side */
+       { CH_SIDE_RIGHT,        CH_SIDE_LEFT    },      /* moving left  */
+       { CH_SIDE_LEFT,         CH_SIDE_RIGHT   },      /* moving right */
+       { CH_SIDE_BOTTOM,       CH_SIDE_TOP     },      /* moving up    */
+       { CH_SIDE_TOP,          CH_SIDE_BOTTOM  }       /* moving down  */
+      };
+      int move_direction = player->MovDir;
+      int enter_side = change_sides[MV_DIR_BIT(move_direction)][0];
+      int leave_side = change_sides[MV_DIR_BIT(move_direction)][1];
+
 #if 1
-    player->Switching = FALSE;
+      if (IS_CUSTOM_ELEMENT(Feld[old_jx][old_jy]))
+      {
+       CheckTriggeredElementSideChange(old_jx, old_jy, Feld[old_jx][old_jy],
+                                       leave_side, CE_OTHER_GETS_LEFT);
+       CheckElementSideChange(old_jx, old_jy, Feld[old_jx][old_jy],
+                              leave_side, CE_LEFT_BY_PLAYER, -1);
+      }
+
+      if (IS_CUSTOM_ELEMENT(Feld[jx][jy]))
+      {
+       CheckTriggeredElementSideChange(jx, jy, Feld[jx][jy],
+                                       enter_side, CE_OTHER_GETS_ENTERED);
+       CheckElementSideChange(jx, jy, Feld[jx][jy],
+                              enter_side, CE_ENTERED_BY_PLAYER, -1);
+      }
+#endif
+
+    }
 #endif
+
+
   }
   else
   {
@@ -6731,8 +7076,11 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
     player->is_moving = FALSE;
   }
 
-  TestIfHeroTouchesBadThing(jx, jy);
-  TestIfPlayerTouchesCustomElement(jx, jy);
+  if (game.engine_version < VERSION_IDENT(3,0,7,0))
+  {
+    TestIfHeroTouchesBadThing(jx, jy);
+    TestIfPlayerTouchesCustomElement(jx, jy);
+  }
 
   if (!player->active)
     RemoveHero(player);
@@ -6740,7 +7088,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy)
   return moved;
 }
 
-void ScrollFigure(struct PlayerInfo *player, int mode)
+void ScrollPlayer(struct PlayerInfo *player, int mode)
 {
   int jx = player->jx, jy = player->jy;
   int last_jx = player->last_jx, last_jy = player->last_jy;
@@ -6794,16 +7142,29 @@ void ScrollFigure(struct PlayerInfo *player, int mode)
     player->last_jy = jy;
 
     if (Feld[jx][jy] == EL_EXIT_OPEN ||
-       Feld[jx][jy] == EL_SP_EXIT_OPEN)
+       Feld[jx][jy] == EL_SP_EXIT_OPEN ||
+       Feld[jx][jy] == EL_SP_EXIT_OPENING)     /* <-- special case */
     {
       DrawPlayer(player);      /* needed here only to cleanup last field */
       RemoveHero(player);
 
       if (local_player->friends_still_needed == 0 ||
-         Feld[jx][jy] == EL_SP_EXIT_OPEN)
+         IS_SP_ELEMENT(Feld[jx][jy]))
        player->LevelSolved = player->GameOver = TRUE;
     }
 
+    if (game.engine_version >= VERSION_IDENT(3,0,7,0))
+    {
+      TestIfHeroTouchesBadThing(jx, jy);
+      TestIfPlayerTouchesCustomElement(jx, jy);
+#if 1
+      TestIfElementTouchesCustomElement(jx, jy);       /* for empty space */
+#endif
+
+      if (!player->active)
+       RemoveHero(player);
+    }
+
     if (tape.single_step && tape.recording && !tape.pausing &&
        !player->programmed_action)
       TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
@@ -6840,9 +7201,6 @@ void ScrollScreen(struct PlayerInfo *player, int mode)
 
 void TestIfPlayerTouchesCustomElement(int x, int y)
 {
-#if 0
-  static boolean check_changing = FALSE;
-#endif
   static int xy[4][2] =
   {
     { 0, -1 },
@@ -6858,68 +7216,65 @@ void TestIfPlayerTouchesCustomElement(int x, int y)
     { CH_SIDE_RIGHT,   CH_SIDE_LEFT    },      /* check right  */
     { CH_SIDE_BOTTOM,  CH_SIDE_TOP     }       /* check bottom */
   };
+  static int touch_dir[4] =
+  {
+    MV_LEFT | MV_RIGHT,
+    MV_UP   | MV_DOWN,
+    MV_UP   | MV_DOWN,
+    MV_LEFT | MV_RIGHT
+  };
+  int center_element = Feld[x][y];     /* should always be non-moving! */
   int i;
 
-#if 0
-  if (check_changing)  /* prevent this function from running into a loop */
-    return;
-
-  check_changing = TRUE;
-#endif
-
   for (i=0; i<4; i++)
   {
     int xx = x + xy[i][0];
     int yy = y + xy[i][1];
     int center_side = change_sides[i][0];
     int border_side = change_sides[i][1];
+    int border_element;
 
     if (!IN_LEV_FIELD(xx, yy))
       continue;
 
-#if 1
     if (IS_PLAYER(x, y))
     {
-      CheckTriggeredElementSideChange(xx, yy, Feld[xx][yy], border_side,
+      if (game.engine_version < VERSION_IDENT(3,0,7,0))
+       border_element = Feld[xx][yy];          /* may be moving! */
+      else if (!IS_MOVING(xx, yy) && !IS_BLOCKED(xx, yy))
+       border_element = Feld[xx][yy];
+      else if (MovDir[xx][yy] & touch_dir[i])  /* elements are touching */
+       border_element = MovingOrBlocked2Element(xx, yy);
+      else
+       continue;               /* center and border element do not touch */
+
+      CheckTriggeredElementSideChange(xx, yy, border_element, border_side,
                                      CE_OTHER_GETS_TOUCHED);
-      CheckElementSideChange(xx, yy, Feld[xx][yy], border_side,
+      CheckElementSideChange(xx, yy, border_element, border_side,
                             CE_TOUCHED_BY_PLAYER, -1);
     }
     else if (IS_PLAYER(xx, yy))
     {
-      CheckTriggeredElementSideChange(x, y, Feld[x][y], center_side,
+      if (game.engine_version >= VERSION_IDENT(3,0,7,0))
+      {
+       struct PlayerInfo *player = PLAYERINFO(xx, yy);
+
+       if (player->MovPos != 0 && !(player->MovDir & touch_dir[i]))
+         continue;             /* center and border element do not touch */
+      }
+
+      CheckTriggeredElementSideChange(x, y, center_element, center_side,
                                      CE_OTHER_GETS_TOUCHED);
-      CheckElementSideChange(x, y, Feld[x][y], center_side,
+      CheckElementSideChange(x, y, center_element, center_side,
                             CE_TOUCHED_BY_PLAYER, -1);
 
       break;
     }
-#else
-    if (IS_PLAYER(x, y))
-    {
-      CheckTriggeredElementChange(xx, yy, Feld[xx][yy], CE_OTHER_GETS_TOUCHED);
-      CheckElementChange(xx, yy, Feld[xx][yy], CE_TOUCHED_BY_PLAYER);
-    }
-    else if (IS_PLAYER(xx, yy))
-    {
-      CheckTriggeredElementChange(x, y, Feld[x][y], CE_OTHER_GETS_TOUCHED);
-      CheckElementChange(x, y, Feld[x][y], CE_TOUCHED_BY_PLAYER);
-
-      break;
-    }
-#endif
   }
-
-#if 0
-  check_changing = FALSE;
-#endif
 }
 
 void TestIfElementTouchesCustomElement(int x, int y)
 {
-#if 0
-  static boolean check_changing = FALSE;
-#endif
   static int xy[4][2] =
   {
     { 0, -1 },
@@ -6935,18 +7290,18 @@ void TestIfElementTouchesCustomElement(int x, int y)
     { CH_SIDE_RIGHT,   CH_SIDE_LEFT    },      /* check right  */
     { CH_SIDE_BOTTOM,  CH_SIDE_TOP     }       /* check bottom */
   };
+  static int touch_dir[4] =
+  {
+    MV_LEFT | MV_RIGHT,
+    MV_UP   | MV_DOWN,
+    MV_UP   | MV_DOWN,
+    MV_LEFT | MV_RIGHT
+  };
   boolean change_center_element = FALSE;
   int center_element_change_page = 0;
-  int center_element = Feld[x][y];
+  int center_element = Feld[x][y];     /* should always be non-moving! */
   int i, j;
 
-#if 0
-  if (check_changing)  /* prevent this function from running into a loop */
-    return;
-
-  check_changing = TRUE;
-#endif
-
   for (i=0; i<4; i++)
   {
     int xx = x + xy[i][0];
@@ -6958,7 +7313,14 @@ void TestIfElementTouchesCustomElement(int x, int y)
     if (!IN_LEV_FIELD(xx, yy))
       continue;
 
-    border_element = Feld[xx][yy];
+    if (game.engine_version < VERSION_IDENT(3,0,7,0))
+      border_element = Feld[xx][yy];   /* may be moving! */
+    else if (!IS_MOVING(xx, yy) && !IS_BLOCKED(xx, yy))
+      border_element = Feld[xx][yy];
+    else if (MovDir[xx][yy] & touch_dir[i])    /* elements are touching */
+      border_element = MovingOrBlocked2Element(xx, yy);
+    else
+      continue;                        /* center and border element do not touch */
 
     /* check for change of center element (but change it only once) */
     if (IS_CUSTOM_ELEMENT(center_element) &&
@@ -6970,7 +7332,8 @@ void TestIfElementTouchesCustomElement(int x, int y)
        struct ElementChangeInfo *change =
          &element_info[center_element].change_page[j];
 
-       if (change->events & CH_EVENT_BIT(CE_OTHER_IS_TOUCHING) &&
+       if (change->can_change &&
+           change->events & CH_EVENT_BIT(CE_OTHER_IS_TOUCHING) &&
            change->sides & border_side &&
            change->trigger_element == border_element)
        {
@@ -6991,7 +7354,8 @@ void TestIfElementTouchesCustomElement(int x, int y)
        struct ElementChangeInfo *change =
          &element_info[border_element].change_page[j];
 
-       if (change->events & CH_EVENT_BIT(CE_OTHER_IS_TOUCHING) &&
+       if (change->can_change &&
+           change->events & CH_EVENT_BIT(CE_OTHER_IS_TOUCHING) &&
            change->sides & center_side &&
            change->trigger_element == center_element)
        {
@@ -7006,10 +7370,6 @@ void TestIfElementTouchesCustomElement(int x, int y)
   if (change_center_element)
     CheckElementSideChange(x, y, center_element, CH_SIDE_ANY,
                           CE_OTHER_IS_TOUCHING, center_element_change_page);
-
-#if 0
-  check_changing = FALSE;
-#endif
 }
 
 void TestIfGoodThingHitsBadThing(int good_x, int good_y, int good_move_dir)
@@ -7087,6 +7447,13 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir)
     { +1, 0 },
     { 0, +1 }
   };
+  static int touch_dir[4] =
+  {
+    MV_LEFT | MV_RIGHT,
+    MV_UP   | MV_DOWN,
+    MV_UP   | MV_DOWN,
+    MV_LEFT | MV_RIGHT
+  };
   static int test_dir[4] =
   {
     MV_UP,
@@ -7126,6 +7493,12 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir)
        if (bad_element == EL_ROBOT && player->is_moving)
          continue;     /* robot does not kill player if he is moving */
 
+       if (game.engine_version >= VERSION_IDENT(3,0,7,0))
+       {
+         if (player->MovPos != 0 && !(player->MovDir & touch_dir[i]))
+           continue;           /* center and border element do not touch */
+       }
+
        kill_x = test_x;
        kill_y = test_y;
        break;
@@ -7145,24 +7518,6 @@ void TestIfBadThingHitsGoodThing(int bad_x, int bad_y, int bad_move_dir)
     {
       struct PlayerInfo *player = PLAYERINFO(kill_x, kill_y);
 
-#if 0
-      int dir = player->MovDir;
-      int newx = player->jx + (dir == MV_LEFT ? -1 : dir == MV_RIGHT ? +1 : 0);
-      int newy = player->jy + (dir == MV_UP   ? -1 : dir == MV_DOWN  ? +1 : 0);
-
-      if (Feld[bad_x][bad_y] == EL_ROBOT && player->is_moving &&
-         newx != bad_x && newy != bad_y)
-       ;       /* robot does not kill player if he is moving */
-      else
-       printf("-> %d\n", player->MovDir);
-
-      if (Feld[bad_x][bad_y] == EL_ROBOT && player->is_moving &&
-         newx != bad_x && newy != bad_y)
-       ;       /* robot does not kill player if he is moving */
-      else
-       ;
-#endif
-
       if (player->shield_deadly_time_left > 0)
        Bang(bad_x, bad_y);
       else if (!PLAYER_PROTECTED(kill_x, kill_y))
@@ -7348,7 +7703,7 @@ int DigField(struct PlayerInfo *player,
     CH_SIDE_BOTTOM,    /* moving up    */
     CH_SIDE_TOP,       /* moving down  */
   };
-  boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0));
+  boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0,0));
   int jx = player->jx, jy = player->jy;
   int dx = x - jx, dy = y - jy;
   int nextx = x + dx, nexty = y + dy;
@@ -7366,11 +7721,11 @@ int DigField(struct PlayerInfo *player,
   }
 
   if (player->MovPos == 0)     /* last pushing move finished */
-    player->Pushing = FALSE;
+    player->is_pushing = FALSE;
 
   if (mode == DF_NO_PUSH)      /* player just stopped pushing */
   {
-    player->Switching = FALSE;
+    player->is_switching = FALSE;
     player->push_delay = 0;
 
     return MF_NO_ACTION;
@@ -7383,7 +7738,7 @@ int DigField(struct PlayerInfo *player,
   if (IS_TUBE(Feld[jx][jy]) || IS_TUBE(Back[jx][jy]))
 #else
   if (IS_TUBE(Feld[jx][jy]) ||
-      (IS_TUBE(Back[jx][jy]) && game.engine_version >= VERSION_IDENT(2,2,0)))
+      (IS_TUBE(Back[jx][jy]) && game.engine_version >= VERSION_IDENT(2,2,0,0)))
 #endif
   {
     int i = 0;
@@ -7418,146 +7773,11 @@ int DigField(struct PlayerInfo *player,
   element = Feld[x][y];
 
   if (mode == DF_SNAP && !IS_SNAPPABLE(element) &&
-      game.engine_version >= VERSION_IDENT(2,2,0))
+      game.engine_version >= VERSION_IDENT(2,2,0,0))
     return MF_NO_ACTION;
 
   switch (element)
   {
-#if 0
-    case EL_ROBOT_WHEEL:
-      Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE;
-      ZX = x;
-      ZY = y;
-      DrawLevelField(x, y);
-      PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_SP_TERMINAL:
-      {
-       int xx, yy;
-
-       PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVATING);
-
-       for (yy=0; yy<lev_fieldy; yy++)
-       {
-         for (xx=0; xx<lev_fieldx; xx++)
-         {
-           if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
-             Bang(xx, yy);
-           else if (Feld[xx][yy] == EL_SP_TERMINAL)
-             Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
-         }
-       }
-
-       return MF_ACTION;
-      }
-      break;
-#endif
-
-#if 0
-    case EL_CONVEYOR_BELT_1_SWITCH_LEFT:
-    case EL_CONVEYOR_BELT_1_SWITCH_MIDDLE:
-    case EL_CONVEYOR_BELT_1_SWITCH_RIGHT:
-    case EL_CONVEYOR_BELT_2_SWITCH_LEFT:
-    case EL_CONVEYOR_BELT_2_SWITCH_MIDDLE:
-    case EL_CONVEYOR_BELT_2_SWITCH_RIGHT:
-    case EL_CONVEYOR_BELT_3_SWITCH_LEFT:
-    case EL_CONVEYOR_BELT_3_SWITCH_MIDDLE:
-    case EL_CONVEYOR_BELT_3_SWITCH_RIGHT:
-    case EL_CONVEYOR_BELT_4_SWITCH_LEFT:
-    case EL_CONVEYOR_BELT_4_SWITCH_MIDDLE:
-    case EL_CONVEYOR_BELT_4_SWITCH_RIGHT:
-#if 1
-      if (!PLAYER_SWITCHING(player, x, y))
-#else
-      if (!player->Switching)
-#endif
-      {
-       player->Switching = TRUE;
-       player->switch_x = x;
-       player->switch_y = y;
-
-       ToggleBeltSwitch(x, y);
-       PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
-      }
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_SWITCHGATE_SWITCH_UP:
-    case EL_SWITCHGATE_SWITCH_DOWN:
-#if 1
-      if (!PLAYER_SWITCHING(player, x, y))
-#else
-      if (!player->Switching)
-#endif
-      {
-       player->Switching = TRUE;
-       player->switch_x = x;
-       player->switch_y = y;
-
-       ToggleSwitchgateSwitch(x, y);
-       PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
-      }
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_LIGHT_SWITCH:
-    case EL_LIGHT_SWITCH_ACTIVE:
-#if 1
-      if (!PLAYER_SWITCHING(player, x, y))
-#else
-      if (!player->Switching)
-#endif
-      {
-       player->Switching = TRUE;
-       player->switch_x = x;
-       player->switch_y = y;
-
-       ToggleLightSwitch(x, y);
-       PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
-                      SND_LIGHT_SWITCH_ACTIVATING :
-                      SND_LIGHT_SWITCH_DEACTIVATING);
-      }
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_TIMEGATE_SWITCH:
-      ActivateTimegateSwitch(x, y);
-      PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
-
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_BALLOON_SWITCH_LEFT:
-    case EL_BALLOON_SWITCH_RIGHT:
-    case EL_BALLOON_SWITCH_UP:
-    case EL_BALLOON_SWITCH_DOWN:
-    case EL_BALLOON_SWITCH_ANY:
-      if (element == EL_BALLOON_SWITCH_ANY)
-       game.balloon_dir = move_direction;
-      else
-       game.balloon_dir = (element == EL_BALLOON_SWITCH_LEFT  ? MV_LEFT :
-                           element == EL_BALLOON_SWITCH_RIGHT ? MV_RIGHT :
-                           element == EL_BALLOON_SWITCH_UP    ? MV_UP :
-                           element == EL_BALLOON_SWITCH_DOWN  ? MV_DOWN :
-                           MV_NO_MOVING);
-      PlaySoundLevel(x, y, SND_CLASS_BALLOON_SWITCH_ACTIVATING);
-
-      return MF_ACTION;
-      break;
-#endif
-
     case EL_SP_PORT_LEFT:
     case EL_SP_PORT_RIGHT:
     case EL_SP_PORT_UP:
@@ -7597,7 +7817,7 @@ int DigField(struct PlayerInfo *player,
          element == EL_SP_GRAVITY_PORT_RIGHT ||
          element == EL_SP_GRAVITY_PORT_UP ||
          element == EL_SP_GRAVITY_PORT_DOWN)
-       level.gravity = !level.gravity;
+       game.gravity = !game.gravity;
 
       /* automatically move to the next field with double speed */
       player->programmed_action = move_direction;
@@ -7649,27 +7869,6 @@ int DigField(struct PlayerInfo *player,
       }
       break;
 
-#if 0
-    case EL_LAMP:
-      Feld[x][y] = EL_LAMP_ACTIVE;
-      local_player->lights_still_needed--;
-      DrawLevelField(x, y);
-      PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
-      return MF_ACTION;
-      break;
-#endif
-
-#if 0
-    case EL_TIME_ORB_FULL:
-      Feld[x][y] = EL_TIME_ORB_EMPTY;
-      TimeLeft += 10;
-      DrawText(DX_TIME, DY_TIME, int2str(TimeLeft, 3), FONT_TEXT_2);
-      DrawLevelField(x, y);
-      PlaySoundStereo(SND_TIME_ORB_FULL_COLLECTING, SOUND_MIDDLE);
-      return MF_ACTION;
-      break;
-#endif
-
     default:
 
       if (IS_WALKABLE(element))
@@ -7686,7 +7885,9 @@ int DigField(struct PlayerInfo *player,
          if (!player->key[element - EL_GATE_1_GRAY])
            return MF_NO_ACTION;
        }
-       else if (element == EL_EXIT_OPEN || element == EL_SP_EXIT_OPEN)
+       else if (element == EL_EXIT_OPEN ||
+                element == EL_SP_EXIT_OPEN ||
+                element == EL_SP_EXIT_OPENING)
        {
          sound_action = ACTION_PASSING;        /* player is passing exit */
        }
@@ -7751,7 +7952,10 @@ int DigField(struct PlayerInfo *player,
 
        CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_DIGGED);
 
-       TestIfElementTouchesCustomElement(x, y);        /* for empty space */
+#if 1
+       if (mode == DF_SNAP)
+         TestIfElementTouchesCustomElement(x, y);      /* for empty space */
+#endif
 
        break;
       }
@@ -7783,8 +7987,6 @@ int DigField(struct PlayerInfo *player,
          if (player->inventory_size < MAX_INVENTORY_SIZE)
            player->inventory_element[player->inventory_size++] = element;
 
-         player->use_disk_red_graphic = (element == EL_SP_DISK_RED);
-
          DrawText(DX_DYNAMITE, DY_DYNAMITE,
                   int2str(local_player->inventory_size, 3), FONT_TEXT_2);
        }
@@ -7848,7 +8050,10 @@ int DigField(struct PlayerInfo *player,
 
        CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_COLLECTED);
 
-       TestIfElementTouchesCustomElement(x, y);        /* for empty space */
+#if 1
+       if (mode == DF_SNAP)
+         TestIfElementTouchesCustomElement(x, y);      /* for empty space */
+#endif
 
        break;
       }
@@ -7864,6 +8069,21 @@ int DigField(struct PlayerInfo *player,
            !(element == EL_SPRING && use_spring_bug))
          return MF_NO_ACTION;
 
+#if 1
+       if (CAN_MOVE(element) && GET_MAX_MOVE_DELAY(element) == 0 &&
+           ((move_direction & MV_VERTICAL &&
+             ((element_info[element].move_pattern & MV_LEFT &&
+               IN_LEV_FIELD(x - 1, y) && IS_FREE(x - 1, y)) ||
+              (element_info[element].move_pattern & MV_RIGHT &&
+               IN_LEV_FIELD(x + 1, y) && IS_FREE(x + 1, y)))) ||
+            (move_direction & MV_HORIZONTAL &&
+             ((element_info[element].move_pattern & MV_UP &&
+               IN_LEV_FIELD(x, y - 1) && IS_FREE(x, y - 1)) ||
+              (element_info[element].move_pattern & MV_DOWN &&
+               IN_LEV_FIELD(x, y + 1) && IS_FREE(x, y + 1))))))
+         return MF_NO_ACTION;
+#endif
+
 #if 1
        /* do not push elements already moving away faster than player */
        if (CAN_MOVE(element) && MovDir[x][y] == move_direction &&
@@ -7873,11 +8093,38 @@ int DigField(struct PlayerInfo *player,
        if (element == EL_SPRING && MovDir[x][y] != MV_NO_MOVING)
          return MF_NO_ACTION;
 #endif
-       if (!player->Pushing &&
-           game.engine_version >= RELEASE_IDENT(2,2,0,7))
+
+#if 1
+       if (game.engine_version >= VERSION_IDENT(3,0,7,1))
+       {
+         if (player->push_delay_value == -1)
+           player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+       }
+       else if (game.engine_version >= VERSION_IDENT(2,2,0,7))
+       {
+         if (!player->is_pushing)
+           player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+       }
+
+       /*
+       if (game.engine_version >= VERSION_IDENT(2,2,0,7) &&
+           (game.engine_version < VERSION_IDENT(3,0,7,1) ||
+            !player_is_pushing))
+         player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+       */
+#else
+       if (!player->is_pushing &&
+           game.engine_version >= VERSION_IDENT(2,2,0,7))
          player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+#endif
+
+#if 0
+       printf("::: push delay: %ld [%d, %d] [%d]\n",
+              player->push_delay_value, FrameCounter, game.engine_version,
+              player->is_pushing);
+#endif
 
-       player->Pushing = TRUE;
+       player->is_pushing = TRUE;
 
        if (!(IN_LEV_FIELD(nextx, nexty) &&
              (IS_FREE(nextx, nexty) ||
@@ -7894,7 +8141,17 @@ int DigField(struct PlayerInfo *player,
        if (!FrameReached(&player->push_delay, player->push_delay_value) &&
            !(tape.playing && tape.file_version < FILE_VERSION_2_0) &&
            element != EL_SPRING && element != EL_BALLOON)
+       {
+         /* make sure that there is no move delay before next try to push */
+         if (game.engine_version >= VERSION_IDENT(3,0,7,1))
+           player->move_delay = INITIAL_MOVE_DELAY_OFF;
+
          return MF_NO_ACTION;
+       }
+
+#if 0
+       printf("::: NOW PUSHING... [%d]\n", FrameCounter);
+#endif
 
        if (IS_SB_ELEMENT(element))
        {
@@ -7942,18 +8199,15 @@ int DigField(struct PlayerInfo *player,
        Pushed[x][y] = TRUE;
        Pushed[nextx][nexty] = TRUE;
 
-       if (game.engine_version < RELEASE_IDENT(2,2,0,7))
+       if (game.engine_version < VERSION_IDENT(2,2,0,7))
          player->push_delay_value = GET_NEW_PUSH_DELAY(element);
+       else
+         player->push_delay_value = -1;        /* get new value later */
 
-#if 1
        CheckTriggeredElementSideChange(x, y, element, dig_side,
                                        CE_OTHER_GETS_PUSHED);
        CheckElementSideChange(x, y, element, dig_side,
                               CE_PUSHED_BY_PLAYER, -1);
-#else
-       CheckTriggeredElementChange(x, y, element, CE_OTHER_GETS_PUSHED);
-       CheckElementChange(x, y, element, CE_PUSHED_BY_PLAYER);
-#endif
 
        break;
       }
@@ -7962,9 +8216,11 @@ int DigField(struct PlayerInfo *player,
        if (PLAYER_SWITCHING(player, x, y))
          return MF_ACTION;
 
-#if 1
+       player->is_switching = TRUE;
+       player->switch_x = x;
+       player->switch_y = y;
+
        PlaySoundLevelElementAction(x, y, element, ACTION_ACTIVATING);
-#endif
 
        if (element == EL_ROBOT_WHEEL)
        {
@@ -7973,92 +8229,42 @@ int DigField(struct PlayerInfo *player,
          ZY = y;
 
          DrawLevelField(x, y);
-
-#if 0
-         PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVATING);
-#endif
        }
        else if (element == EL_SP_TERMINAL)
        {
          int xx, yy;
 
-#if 0
-         PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVATING);
-#endif
-
-         for (yy=0; yy<lev_fieldy; yy++)
+         for (yy=0; yy < lev_fieldy; yy++) for (xx=0; xx < lev_fieldx; xx++)
          {
-           for (xx=0; xx<lev_fieldx; xx++)
-           {
-             if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
-               Bang(xx, yy);
-             else if (Feld[xx][yy] == EL_SP_TERMINAL)
-               Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
-           }
+           if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
+             Bang(xx, yy);
+           else if (Feld[xx][yy] == EL_SP_TERMINAL)
+             Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
          }
        }
        else if (IS_BELT_SWITCH(element))
        {
-#if 0
-         if (!PLAYER_SWITCHING(player, x, y))
-#endif
-         {
-           player->Switching = TRUE;
-           player->switch_x = x;
-           player->switch_y = y;
-
-           ToggleBeltSwitch(x, y);
-
-#if 0
-           PlaySoundLevel(x, y, SND_CLASS_CONVEYOR_BELT_SWITCH_ACTIVATING);
-#endif
-         }
+         ToggleBeltSwitch(x, y);
        }
        else if (element == EL_SWITCHGATE_SWITCH_UP ||
                 element == EL_SWITCHGATE_SWITCH_DOWN)
        {
-#if 0
-         if (!PLAYER_SWITCHING(player, x, y))
-#endif
-         {
-           player->Switching = TRUE;
-           player->switch_x = x;
-           player->switch_y = y;
-
-           ToggleSwitchgateSwitch(x, y);
-
-#if 0
-           PlaySoundLevel(x, y, SND_CLASS_SWITCHGATE_SWITCH_ACTIVATING);
-#endif
-         }
+         ToggleSwitchgateSwitch(x, y);
        }
        else if (element == EL_LIGHT_SWITCH ||
                 element == EL_LIGHT_SWITCH_ACTIVE)
        {
-#if 0
-         if (!PLAYER_SWITCHING(player, x, y))
-#endif
-         {
-           player->Switching = TRUE;
-           player->switch_x = x;
-           player->switch_y = y;
-
-           ToggleLightSwitch(x, y);
+         ToggleLightSwitch(x, y);
 
 #if 0
-           PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
-                          SND_LIGHT_SWITCH_ACTIVATING :
-                          SND_LIGHT_SWITCH_DEACTIVATING);
+         PlaySoundLevel(x, y, element == EL_LIGHT_SWITCH ?
+                        SND_LIGHT_SWITCH_ACTIVATING :
+                        SND_LIGHT_SWITCH_DEACTIVATING);
 #endif
-         }
        }
        else if (element == EL_TIMEGATE_SWITCH)
        {
          ActivateTimegateSwitch(x, y);
-
-#if 0
-         PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVATING);
-#endif
        }
        else if (element == EL_BALLOON_SWITCH_LEFT ||
                 element == EL_BALLOON_SWITCH_RIGHT ||
@@ -8074,10 +8280,6 @@ int DigField(struct PlayerInfo *player,
                                element == EL_BALLOON_SWITCH_UP    ? MV_UP :
                                element == EL_BALLOON_SWITCH_DOWN  ? MV_DOWN :
                                MV_NO_MOVING);
-
-#if 0
-         PlaySoundLevel(x, y, SND_CLASS_BALLOON_SWITCH_ACTIVATING);
-#endif
        }
        else if (element == EL_LAMP)
        {
@@ -8085,10 +8287,6 @@ int DigField(struct PlayerInfo *player,
          local_player->lights_still_needed--;
 
          DrawLevelField(x, y);
-
-#if 0
-         PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
-#endif
        }
        else if (element == EL_TIME_ORB_FULL)
        {
@@ -8107,13 +8305,9 @@ int DigField(struct PlayerInfo *player,
       }
       else
       {
-#if 1
        if (!PLAYER_SWITCHING(player, x, y))
-#else
-       if (!player->Switching)
-#endif
        {
-         player->Switching = TRUE;
+         player->is_switching = TRUE;
          player->switch_x = x;
          player->switch_y = y;
 
@@ -8148,7 +8342,7 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy)
                        dy == -1 ? MV_UP :
                        dy == +1 ? MV_DOWN : MV_NO_MOVING);
 
-  if (player->MovPos && game.engine_version >= VERSION_IDENT(2,2,0))
+  if (player->MovPos && game.engine_version >= VERSION_IDENT(2,2,0,0))
     return FALSE;
 
   if (!player->active || !IN_LEV_FIELD(x, y))
@@ -8160,50 +8354,37 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy)
   if (!dx && !dy)
   {
     if (player->MovPos == 0)
-      player->Pushing = FALSE;
+      player->is_pushing = FALSE;
 
-    player->snapped = FALSE;
+    player->is_snapping = FALSE;
 
     if (player->MovPos == 0)
     {
+      player->is_moving = FALSE;
       player->is_digging = FALSE;
       player->is_collecting = FALSE;
-#if 1
-      player->is_moving = FALSE;
-#endif
     }
 
-#if 0
-    printf("::: trying to snap...\n");
-#endif
-
     return FALSE;
   }
 
-  if (player->snapped)
+  if (player->is_snapping)
     return FALSE;
 
   player->MovDir = snap_direction;
 
-#if 1
+  player->is_moving = FALSE;
   player->is_digging = FALSE;
   player->is_collecting = FALSE;
-#if 1
-  player->is_moving = FALSE;
-#endif
-#endif
 
   if (DigField(player, x, y, 0, 0, DF_SNAP) == MF_NO_ACTION)
     return FALSE;
 
-  player->snapped = TRUE;
-#if 1
+  player->is_snapping = TRUE;
+
+  player->is_moving = FALSE;
   player->is_digging = FALSE;
   player->is_collecting = FALSE;
-#if 1
-  player->is_moving = FALSE;
-#endif
-#endif
 
   DrawLevelField(x, y);
   BackToFront();
@@ -8247,14 +8428,9 @@ boolean DropElement(struct PlayerInfo *player)
   {
     int new_element = player->inventory_element[--player->inventory_size];
 
-#if 1
     Feld[jx][jy] = (new_element == EL_DYNAMITE ? EL_DYNAMITE_ACTIVE :
                    new_element == EL_SP_DISK_RED ? EL_SP_DISK_RED_ACTIVE :
                    new_element);
-#else
-    Feld[jx][jy] = (player->use_disk_red_graphic ? EL_SP_DISK_RED_ACTIVE :
-                   EL_DYNAMITE_ACTIVE);
-#endif
 
     DrawText(DX_DYNAMITE, DY_DYNAMITE,
             int2str(local_player->inventory_size, 3), FONT_TEXT_2);
index 6c6ea57bf46c6cf36fb6d1b791ecd60f26af5d9a..1821310253c4588e13e8ed7bfc57077ea30c221f 100644 (file)
@@ -54,7 +54,6 @@ void DynaExplode(int, int);
 void Bang(int, int);
 void Blurb(int, int);
 void Impact(int, int);
-void TurnRound(int, int);
 void StartMoving(int, int);
 void ContinueMoving(int, int);
 int AmoebeNachbarNr(int, int);
@@ -76,11 +75,6 @@ void MauerAbleger(int, int);
 void GameActions(void);
 void ScrollLevel(int, int);
 
-boolean MoveFigureOneStep(struct PlayerInfo *, int, int, int, int);
-boolean MoveFigure(struct PlayerInfo *, int, int);
-void ScrollFigure(struct PlayerInfo *, int);
-void ScrollScreen(struct PlayerInfo *, int);
-
 void TestIfGoodThingHitsBadThing(int, int, int);
 void TestIfBadThingHitsGoodThing(int, int, int);
 void TestIfHeroTouchesBadThing(int, int);
index c7a199118fea2390f170d8c2bbdc212910a0a1a8..6db9d2463deae2799248ff3d5cc1058540cf8da5 100644 (file)
@@ -24,6 +24,7 @@
 #include "network.h"
 #include "netserv.h"
 #include "cartoons.h"
+#include "config.h"
 
 #include "conf_e2g.c"  /* include auto-generated data structure definitions */
 #include "conf_esg.c"  /* include auto-generated data structure definitions */
@@ -614,6 +615,10 @@ void InitElementGraphicInfo()
       boolean act_remove = ((IS_DIGGABLE(i)    && act == ACTION_DIGGING)  ||
                            (IS_SNAPPABLE(i)   && act == ACTION_SNAPPING) ||
                            (IS_COLLECTIBLE(i) && act == ACTION_COLLECTING));
+      boolean act_turning = (act == ACTION_TURNING_FROM_LEFT ||
+                            act == ACTION_TURNING_FROM_RIGHT ||
+                            act == ACTION_TURNING_FROM_UP ||
+                            act == ACTION_TURNING_FROM_DOWN);
 
       /* generic default action graphic (defined by "[default]" directive) */
       int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
@@ -647,10 +652,16 @@ void InitElementGraphicInfo()
        /* no graphic for current action -- use default direction graphic */
        if (default_action_direction_graphic == -1)
          default_action_direction_graphic =
-           (act_remove ? IMG_EMPTY : default_direction_graphic[dir]);
+           (act_remove ? IMG_EMPTY :
+            act_turning ?
+            element_info[i].direction_graphic[ACTION_TURNING][dir] :
+            default_direction_graphic[dir]);
        if (default_action_direction_crumbled == -1)
          default_action_direction_crumbled =
-           (act_remove ? IMG_EMPTY : default_direction_crumbled[dir]);
+           (act_remove ? IMG_EMPTY :
+            act_turning ?
+            element_info[i].direction_crumbled[ACTION_TURNING][dir] :
+            default_direction_crumbled[dir]);
 
        if (element_info[i].direction_graphic[act][dir] == -1)
          element_info[i].direction_graphic[act][dir] =
@@ -663,10 +674,14 @@ void InitElementGraphicInfo()
       /* no graphic for this specific action -- use default action graphic */
       if (element_info[i].graphic[act] == -1)
        element_info[i].graphic[act] =
-         (act_remove ? IMG_EMPTY : default_action_graphic);
+         (act_remove ? IMG_EMPTY :
+          act_turning ? element_info[i].graphic[ACTION_TURNING] :
+          default_action_graphic);
       if (element_info[i].crumbled[act] == -1)
        element_info[i].crumbled[act] =
-         (act_remove ? IMG_EMPTY : default_action_crumbled);
+         (act_remove ? IMG_EMPTY :
+          act_turning ? element_info[i].crumbled[ACTION_TURNING] :
+          default_action_crumbled);
     }
   }
 
@@ -1758,6 +1773,7 @@ void InitElementPropertiesStatic()
     EL_SOKOBAN_FIELD_EMPTY,
     EL_EXIT_OPEN,
     EL_SP_EXIT_OPEN,
+    EL_SP_EXIT_OPENING,
     EL_GATE_1,
     EL_GATE_2,
     EL_GATE_3,
@@ -1996,6 +2012,8 @@ void InitElementPropertiesStatic()
     EL_SP_TERMINAL_ACTIVE,
     EL_SP_BUGGY_BASE_ACTIVATING,
     EL_SP_BUGGY_BASE_ACTIVE,
+    EL_SP_EXIT_OPENING,
+    EL_SP_EXIT_CLOSING,
     -1
   };
 
@@ -2836,7 +2854,7 @@ void InitElementPropertiesEngine(int engine_version)
       SET_PROPERTY(i, EP_WALL, TRUE);
 
     /* ---------- SOLID_FOR_PUSHING ---------------------------------------- */
-    if (engine_version < VERSION_IDENT(2,2,0))
+    if (engine_version < VERSION_IDENT(2,2,0,0))
       SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, IS_HISTORIC_SOLID(i));
     else
       SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, (!IS_WALKABLE(i) &&
@@ -2854,7 +2872,7 @@ void InitElementPropertiesEngine(int engine_version)
     /* ---------- EXPLOSION_PROOF ------------------------------------------ */
     if (i == EL_FLAMES)
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE);
-    else if (engine_version < VERSION_IDENT(2,2,0))
+    else if (engine_version < VERSION_IDENT(2,2,0,0))
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i));
     else
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) &&
@@ -2941,22 +2959,31 @@ void InitElementPropertiesEngine(int engine_version)
     /* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */
     SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL,
                 (level.em_slippery_gems &&
-                 engine_version > VERSION_IDENT(2,0,1)));
+                 engine_version > VERSION_IDENT(2,0,1,0)));
   }
 
-#if 0
-  /* dynamically adjust element properties according to game engine version */
-#if 0
-  if (engine_version < RELEASE_IDENT(2,2,0,7))
-#endif
+#if 1
+  /* set default push delay values (corrected since version 3.0.7-1) */
+  if (engine_version < VERSION_IDENT(3,0,7,1))
   {
-    for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
-    {
-      int element = EL_CUSTOM_START + i;
+    game.default_push_delay_fixed = 2;
+    game.default_push_delay_random = 8;
+  }
+  else
+  {
+    game.default_push_delay_fixed = 8;
+    game.default_push_delay_random = 8;
+  }
 
-      element_info[element].push_delay_fixed = 2;
-      element_info[element].push_delay_random = 8;
-    }
+  /* set uninitialized push delay values of custom elements in older levels */
+  for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+  {
+    int element = EL_CUSTOM_START + i;
+
+    if (element_info[element].push_delay_fixed == -1)
+      element_info[element].push_delay_fixed = game.default_push_delay_fixed;
+    if (element_info[element].push_delay_random == -1)
+      element_info[element].push_delay_random = game.default_push_delay_random;
   }
 #endif
 }
@@ -3269,8 +3296,8 @@ void InitGfx()
 
   InitFontGraphicInfo();
 
-  DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
-  DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
+  DrawInitText(getProgramInitString(), 20, FC_YELLOW);
+  DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
 
   DrawInitText("Loading graphics:", 120, FC_GREEN);
 
index 2eb6dda4bc8d7bdb732a1e01a12037de22b5ca4c..4d5b28c6b3eae4baadc7ddfe80b82ab7b7e874da 100644 (file)
@@ -1,7 +1,12 @@
-#=============================================================================#
-# Makefile for Artsoft Retro-Game Library                                     #
-# (c) 1994-2002 Holger Schemel, info@artsoft.org                              #
-#=============================================================================#
+# =============================================================================
+# Rocks'n'Diamonds Makefile (libgame)
+# -----------------------------------------------------------------------------
+# (c) 1995-2003 Holger Schemel <info@artsoft.org>
+# =============================================================================
+
+# -----------------------------------------------------------------------------
+# configuration
+# -----------------------------------------------------------------------------
 
 SRCS = system.c        \
        gadgets.c       \
@@ -38,6 +43,10 @@ OBJS =       system.o        \
 LIBGAME = libgame.a
 
 
+# -----------------------------------------------------------------------------
+# build targets
+# -----------------------------------------------------------------------------
+
 all: $(LIBGAME)
 
 $(LIBGAME): $(OBJS)
@@ -52,9 +61,9 @@ clean:
        $(RM) $(LIBGAME)
 
 
-#-----------------------------------------------------------------------------#
-# development only stuff                                                      #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
 
 depend:
        for i in $(SRCS); do $(CPP) $(CFLAGS) -M $$i; done > .depend
index 50a713f456be8c011b279044121e088516d57042..a19bcace92430800df871f8918dafb0a9974fdb0 100644 (file)
@@ -984,28 +984,26 @@ void putFileChunk(FILE *file, char *chunk_name, int chunk_size,
 
 int getFileVersion(FILE *file)
 {
-  int version_major, version_minor, version_patch, version_release;
+  int version_major = fgetc(file);
+  int version_minor = fgetc(file);
+  int version_patch = fgetc(file);
+  int version_build = fgetc(file);
 
-  version_major   = fgetc(file);
-  version_minor   = fgetc(file);
-  version_patch   = fgetc(file);
-  version_release = fgetc(file);
-
-  return RELEASE_IDENT(version_major, version_minor, version_patch,
-                      version_release);
+  return VERSION_IDENT(version_major, version_minor, version_patch,
+                      version_build);
 }
 
 void putFileVersion(FILE *file, int version)
 {
-  int version_major   = VERSION_MAJOR(version);
-  int version_minor   = VERSION_MINOR(version);
-  int version_patch   = VERSION_PATCH(version);
-  int version_release = VERSION_RELEASE(version);
+  int version_major = VERSION_MAJOR(version);
+  int version_minor = VERSION_MINOR(version);
+  int version_patch = VERSION_PATCH(version);
+  int version_build = VERSION_BUILD(version);
 
-  fputc(version_major,   file);
-  fputc(version_minor,   file);
-  fputc(version_patch,   file);
-  fputc(version_release, file);
+  fputc(version_major, file);
+  fputc(version_minor, file);
+  fputc(version_patch, file);
+  fputc(version_build, file);
 }
 
 void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes)
@@ -2293,6 +2291,9 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
   printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename);
 #endif
 
+  DrawInitText("Loading artwork config:", 120, FC_GREEN);
+  DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW);
+
   /* always start with reliable default values */
   for (i=0; i<num_file_list_entries; i++)
   {
index e8ae45f215a6191d1dd508037279d21c2e303ba0..3eb935c9b2df572e5ee1ad51bcfebe5b47f58c1e 100644 (file)
 #include "misc.h"
 #include "hash.h"
 
-/* file names and filename extensions */
-#if !defined(PLATFORM_MSDOS)
-#define LEVELSETUP_DIRECTORY   "levelsetup"
-#define SETUP_FILENAME         "setup.conf"
-#define LEVELSETUP_FILENAME    "levelsetup.conf"
-#define LEVELINFO_FILENAME     "levelinfo.conf"
-#define GRAPHICSINFO_FILENAME  "graphicsinfo.conf"
-#define SOUNDSINFO_FILENAME    "soundsinfo.conf"
-#define MUSICINFO_FILENAME     "musicinfo.conf"
-#define LEVELFILE_EXTENSION    "level"
-#define TAPEFILE_EXTENSION     "tape"
-#define SCOREFILE_EXTENSION    "score"
-#else
-#define LEVELSETUP_DIRECTORY   "lvlsetup"
-#define SETUP_FILENAME         "setup.cnf"
-#define LEVELSETUP_FILENAME    "lvlsetup.cnf"
-#define LEVELINFO_FILENAME     "lvlinfo.cnf"
-#define GRAPHICSINFO_FILENAME  "gfxinfo.cnf"
-#define SOUNDSINFO_FILENAME    "sndinfo.cnf"
-#define MUSICINFO_FILENAME     "musinfo.cnf"
-#define LEVELFILE_EXTENSION    "lvl"
-#define TAPEFILE_EXTENSION     "tap"
-#define SCOREFILE_EXTENSION    "sco"
-#endif
 
 #define NUM_LEVELCLASS_DESC    8
+
 static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
 {
   "Tutorial Levels",
@@ -61,64 +38,44 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
   "DX Boulderdash"
 };
 
-#define LEVELCOLOR(n)  (IS_LEVELCLASS_TUTORIAL(n) ?            FC_BLUE : \
-                        IS_LEVELCLASS_CLASSICS(n) ?            FC_RED : \
-                        IS_LEVELCLASS_BD(n) ?                  FC_GREEN : \
-                        IS_LEVELCLASS_EM(n) ?                  FC_YELLOW : \
-                        IS_LEVELCLASS_SP(n) ?                  FC_GREEN : \
-                        IS_LEVELCLASS_DX(n) ?                  FC_YELLOW : \
-                        IS_LEVELCLASS_CONTRIBUTION(n) ?        FC_GREEN : \
-                        IS_LEVELCLASS_USER(n) ?                FC_RED : \
+
+#define LEVELCOLOR(n)  (IS_LEVELCLASS_TUTORIAL(n) ?            FC_BLUE :    \
+                        IS_LEVELCLASS_CLASSICS(n) ?            FC_RED :     \
+                        IS_LEVELCLASS_BD(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_EM(n) ?                  FC_YELLOW :  \
+                        IS_LEVELCLASS_SP(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_DX(n) ?                  FC_YELLOW :  \
+                        IS_LEVELCLASS_CONTRIB(n) ?             FC_GREEN :   \
+                        IS_LEVELCLASS_PRIVATE(n) ?             FC_RED :     \
                         FC_BLUE)
 
-#define LEVELSORTING(n)        (IS_LEVELCLASS_TUTORIAL(n) ?            0 : \
-                        IS_LEVELCLASS_CLASSICS(n) ?            1 : \
-                        IS_LEVELCLASS_BD(n) ?                  2 : \
-                        IS_LEVELCLASS_EM(n) ?                  3 : \
-                        IS_LEVELCLASS_SP(n) ?                  4 : \
-                        IS_LEVELCLASS_DX(n) ?                  5 : \
-                        IS_LEVELCLASS_CONTRIBUTION(n) ?        6 : \
-                        IS_LEVELCLASS_USER(n) ?                7 : \
+#define LEVELSORTING(n)        (IS_LEVELCLASS_TUTORIAL(n) ?            0 :     \
+                        IS_LEVELCLASS_CLASSICS(n) ?            1 :     \
+                        IS_LEVELCLASS_BD(n) ?                  2 :     \
+                        IS_LEVELCLASS_EM(n) ?                  3 :     \
+                        IS_LEVELCLASS_SP(n) ?                  4 :     \
+                        IS_LEVELCLASS_DX(n) ?                  5 :     \
+                        IS_LEVELCLASS_CONTRIB(n) ?             6 :     \
+                        IS_LEVELCLASS_PRIVATE(n) ?             7 :     \
                         9)
 
-#define ARTWORKCOLOR(n)        (IS_ARTWORKCLASS_CLASSICS(n) ?          FC_RED : \
-                        IS_ARTWORKCLASS_CONTRIBUTION(n) ?      FC_YELLOW : \
-                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_GREEN : \
-                        IS_ARTWORKCLASS_USER(n) ?              FC_RED : \
+#define ARTWORKCOLOR(n)        (IS_ARTWORKCLASS_CLASSICS(n) ?          FC_RED :     \
+                        IS_ARTWORKCLASS_CONTRIB(n) ?           FC_YELLOW :  \
+                        IS_ARTWORKCLASS_PRIVATE(n) ?           FC_RED :     \
+                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_GREEN :   \
                         FC_BLUE)
 
-#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ?       0 : \
-                        IS_ARTWORKCLASS_CONTRIBUTION(n) ?      1 : \
-                        IS_ARTWORKCLASS_LEVEL(n) ?             2 : \
-                        IS_ARTWORKCLASS_USER(n) ?              3 : \
-                        9)
+#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ?       0 :     \
+                          IS_ARTWORKCLASS_LEVEL(n) ?           1 :     \
+                          IS_ARTWORKCLASS_CONTRIB(n) ?         2 :     \
+                          IS_ARTWORKCLASS_PRIVATE(n) ?         3 :     \
+                          9)
 
 #define TOKEN_VALUE_POSITION           40
 #define TOKEN_COMMENT_POSITION         60
 
 #define MAX_COOKIE_LEN                 256
 
-#define ARTWORKINFO_FILENAME(type)     ((type) == ARTWORK_TYPE_GRAPHICS ? \
-                                        GRAPHICSINFO_FILENAME :           \
-                                        (type) == ARTWORK_TYPE_SOUNDS ?   \
-                                        SOUNDSINFO_FILENAME :             \
-                                        (type) == ARTWORK_TYPE_MUSIC ?    \
-                                        MUSICINFO_FILENAME : "")
-
-#define ARTWORK_DIRECTORY(type)                ((type) == ARTWORK_TYPE_GRAPHICS ? \
-                                        GRAPHICS_DIRECTORY :              \
-                                        (type) == ARTWORK_TYPE_SOUNDS ?   \
-                                        SOUNDS_DIRECTORY :                \
-                                        (type) == ARTWORK_TYPE_MUSIC ?    \
-                                        MUSIC_DIRECTORY : "")
-
-#define OPTIONS_ARTWORK_DIRECTORY(type)        ((type) == ARTWORK_TYPE_GRAPHICS ? \
-                                        options.graphics_directory :      \
-                                        (type) == ARTWORK_TYPE_SOUNDS ?   \
-                                        options.sounds_directory :        \
-                                        (type) == ARTWORK_TYPE_MUSIC ?    \
-                                        options.music_directory : "")
-
 
 /* ------------------------------------------------------------------------- */
 /* file functions                                                            */
@@ -1096,7 +1053,7 @@ int getFileVersionFromCookieString(const char *cookie)
   version_major = ptr_cookie2[0] - '0';
   version_minor = ptr_cookie2[2] - '0';
 
-  return VERSION_IDENT(version_major, version_minor, 0);
+  return VERSION_IDENT(version_major, version_minor, 0, 0);
 }
 
 boolean checkCookieString(const char *cookie, const char *template)
@@ -1172,10 +1129,10 @@ char *getListEntry(SetupFileList *list, char *token)
     return getListEntry(list->next, token);
 }
 
-void setListEntry(SetupFileList *list, char *token, char *value)
+SetupFileList *setListEntry(SetupFileList *list, char *token, char *value)
 {
   if (list == NULL)
-    return;
+    return NULL;
 
   if (strcmp(list->token, token) == 0)
   {
@@ -1183,11 +1140,13 @@ void setListEntry(SetupFileList *list, char *token, char *value)
       free(list->value);
 
     list->value = getStringCopy(value);
+
+    return list;
   }
   else if (list->next == NULL)
-    list->next = newSetupFileList(token, value);
+    return (list->next = newSetupFileList(token, value));
   else
-    setListEntry(list->next, token, value);
+    return setListEntry(list->next, token, value);
 }
 
 #ifdef DEBUG
@@ -1308,13 +1267,13 @@ static void *loadSetupFileData(char *filename, boolean use_hash)
   int line_len;
   char line[MAX_LINE_LEN];
   char *token, *value, *line_ptr;
-  void *setup_file_data;
+  void *setup_file_data, *insert_ptr = NULL;
   FILE *file;
 
   if (use_hash)
     setup_file_data = newSetupFileHash();
   else
-    setup_file_data = newSetupFileList("", "");
+    insert_ptr = setup_file_data = newSetupFileList("", "");
 
   if (!(file = fopen(filename, MODE_READ)))
   {
@@ -1379,7 +1338,7 @@ static void *loadSetupFileData(char *filename, boolean use_hash)
       if (use_hash)
        setHashEntry((SetupFileHash *)setup_file_data, token, value);
       else
-       setListEntry((SetupFileList *)setup_file_data, token, value);
+       insert_ptr = setListEntry((SetupFileList *)insert_ptr, token, value);
     }
   }
 
@@ -1446,13 +1405,14 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash,
 #define LEVELINFO_TOKEN_LEVELS         5
 #define LEVELINFO_TOKEN_FIRST_LEVEL    6
 #define LEVELINFO_TOKEN_SORT_PRIORITY  7
-#define LEVELINFO_TOKEN_LEVEL_GROUP    8
-#define LEVELINFO_TOKEN_READONLY       9
-#define LEVELINFO_TOKEN_GRAPHICS_SET   10
-#define LEVELINFO_TOKEN_SOUNDS_SET     11
-#define LEVELINFO_TOKEN_MUSIC_SET      12
+#define LEVELINFO_TOKEN_LATEST_ENGINE  8
+#define LEVELINFO_TOKEN_LEVEL_GROUP    9
+#define LEVELINFO_TOKEN_READONLY       10
+#define LEVELINFO_TOKEN_GRAPHICS_SET   11
+#define LEVELINFO_TOKEN_SOUNDS_SET     12
+#define LEVELINFO_TOKEN_MUSIC_SET      13
 
-#define NUM_LEVELINFO_TOKENS           13
+#define NUM_LEVELINFO_TOKENS           14
 
 static LevelDirTree ldi;
 
@@ -1467,6 +1427,7 @@ static struct TokenInfo levelinfo_tokens[] =
   { TYPE_INTEGER, &ldi.levels,         "levels"        },
   { TYPE_INTEGER, &ldi.first_level,    "first_level"   },
   { TYPE_INTEGER, &ldi.sort_priority,  "sort_priority" },
+  { TYPE_BOOLEAN, &ldi.latest_engine,  "latest_engine" },
   { TYPE_BOOLEAN, &ldi.level_group,    "level_group"   },
   { TYPE_BOOLEAN, &ldi.readonly,       "readonly"      },
   { TYPE_STRING,  &ldi.graphics_set,   "graphics_set"  },
@@ -1500,6 +1461,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   ldi->author = getStringCopy(ANONYMOUS_NAME);
 
   ldi->sort_priority = LEVELCLASS_UNDEFINED;   /* default: least priority */
+  ldi->latest_engine = FALSE;                  /* default: get from level */
   ldi->parent_link = FALSE;
   ldi->user_defined = FALSE;
   ldi->color = 0;
@@ -1558,6 +1520,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->author = getStringCopy(parent->author);
 
   ldi->sort_priority = parent->sort_priority;
+  ldi->latest_engine = parent->latest_engine;
   ldi->parent_link = FALSE;
   ldi->user_defined = parent->user_defined;
   ldi->color = parent->color;
@@ -1763,6 +1726,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   setString(&ti_new->fullpath, node_parent->fullpath);
 
   ti_new->sort_priority = node_parent->sort_priority;
+  ti_new->latest_engine = node_parent->latest_engine;
 
   setString(&ti_new->class_desc, getLevelClassDescription(ti_new));
 #else
@@ -1774,6 +1738,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   ti_new->fullpath = getStringCopy(node_parent->fullpath);
 
   ti_new->sort_priority = node_parent->sort_priority;
+  ti_new->latest_engine = node_parent->latest_engine;
 
   ti_new->class_desc = getLevelClassDescription(ti_new);
 #endif
@@ -2129,7 +2094,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
 #else
        artwork_new->identifier = getStringCopy("private");
 #endif
-       artwork_new->sort_priority = ARTWORKCLASS_USER;
+       artwork_new->sort_priority = ARTWORKCLASS_PRIVATE;
       }
       else
       {
@@ -2472,7 +2437,7 @@ static void SaveUserLevelInfo()
   setString(&level_info->author, getRealName());
   level_info->levels = 100;
   level_info->first_level = 1;
-  level_info->sort_priority = LEVELCLASS_USER_START;
+  level_info->sort_priority = LEVELCLASS_PRIVATE_START;
   level_info->readonly = FALSE;
   setString(&level_info->graphics_set, GFX_CLASSIC_SUBDIR);
   setString(&level_info->sounds_set,   SND_CLASSIC_SUBDIR);
@@ -2482,7 +2447,7 @@ static void SaveUserLevelInfo()
   ldi.author = getStringCopy(getRealName());
   ldi.levels = 100;
   ldi.first_level = 1;
-  ldi.sort_priority = LEVELCLASS_USER_START;
+  ldi.sort_priority = LEVELCLASS_PRIVATE_START;
   ldi.readonly = FALSE;
   ldi.graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR);
   ldi.sounds_set = getStringCopy(SND_CLASSIC_SUBDIR);
index 5ae3bc4b97c36f72e00a292c0e25859a72219405..2498fe7d2345f5500484d05a99590454eaa74b5d 100644 (file)
@@ -89,10 +89,10 @@ typedef struct hashtable SetupFileHash;
 #define LEVELCLASS_TUTORIAL_END                99
 #define LEVELCLASS_CLASSICS_START      100
 #define LEVELCLASS_CLASSICS_END                199
-#define LEVELCLASS_CONTRIBUTION_START  200
-#define LEVELCLASS_CONTRIBUTION_END    299
-#define LEVELCLASS_USER_START          300
-#define LEVELCLASS_USER_END            399
+#define LEVELCLASS_CONTRIB_START       200
+#define LEVELCLASS_CONTRIB_END         299
+#define LEVELCLASS_PRIVATE_START       300
+#define LEVELCLASS_PRIVATE_END         399
 #define LEVELCLASS_BD_START            400
 #define LEVELCLASS_BD_END              499
 #define LEVELCLASS_EM_START            500
@@ -102,10 +102,13 @@ typedef struct hashtable SetupFileHash;
 #define LEVELCLASS_DX_START            700
 #define LEVELCLASS_DX_END              799
 
+#define LEVELCLASS_PREDEFINED_START    LEVELCLASS_TUTORIAL_START
+#define LEVELCLASS_PREDEFINED_END      LEVELCLASS_DX_END
+
 #define LEVELCLASS_TUTORIAL            LEVELCLASS_TUTORIAL_START
 #define LEVELCLASS_CLASSICS            LEVELCLASS_CLASSICS_START
-#define LEVELCLASS_CONTRIBUTION                LEVELCLASS_CONTRIBUTION_START
-#define LEVELCLASS_USER                        LEVELCLASS_USER_START
+#define LEVELCLASS_CONTRIB             LEVELCLASS_CONTRIB_START
+#define LEVELCLASS_PRIVATE             LEVELCLASS_PRIVATE_START
 #define LEVELCLASS_BD                  LEVELCLASS_BD_START
 #define LEVELCLASS_EM                  LEVELCLASS_EM_START
 #define LEVELCLASS_SP                  LEVELCLASS_SP_START
@@ -113,75 +116,78 @@ typedef struct hashtable SetupFileHash;
 
 #define LEVELCLASS_UNDEFINED           999
 
-#define IS_LEVELCLASS_TUTORIAL(p) \
-       ((p)->sort_priority >= LEVELCLASS_TUTORIAL_START && \
+#define IS_LEVELCLASS_TUTORIAL(p)                                      \
+       ((p)->sort_priority >= LEVELCLASS_TUTORIAL_START &&             \
         (p)->sort_priority <= LEVELCLASS_TUTORIAL_END)
-#define IS_LEVELCLASS_CLASSICS(p) \
-       ((p)->sort_priority >= LEVELCLASS_CLASSICS_START && \
+#define IS_LEVELCLASS_CLASSICS(p)                                      \
+       ((p)->sort_priority >= LEVELCLASS_CLASSICS_START &&             \
         (p)->sort_priority <= LEVELCLASS_CLASSICS_END)
-#define IS_LEVELCLASS_CONTRIBUTION(p) \
-       ((p)->sort_priority >= LEVELCLASS_CONTRIBUTION_START && \
-        (p)->sort_priority <= LEVELCLASS_CONTRIBUTION_END)
-#define IS_LEVELCLASS_USER(p) \
-       ((p)->sort_priority >= LEVELCLASS_USER_START && \
-        (p)->sort_priority <= LEVELCLASS_USER_END)
-#define IS_LEVELCLASS_BD(p) \
-       ((p)->sort_priority >= LEVELCLASS_BD_START && \
+#define IS_LEVELCLASS_CONTRIB(p)                                       \
+       ((p)->sort_priority >= LEVELCLASS_CONTRIB_START &&              \
+        (p)->sort_priority <= LEVELCLASS_CONTRIB_END)
+#define IS_LEVELCLASS_PRIVATE(p)                                       \
+       ((p)->sort_priority >= LEVELCLASS_PRIVATE_START &&              \
+        (p)->sort_priority <= LEVELCLASS_PRIVATE_END)
+#define IS_LEVELCLASS_BD(p)                                            \
+       ((p)->sort_priority >= LEVELCLASS_BD_START &&                   \
         (p)->sort_priority <= LEVELCLASS_BD_END)
-#define IS_LEVELCLASS_EM(p) \
-       ((p)->sort_priority >= LEVELCLASS_EM_START && \
+#define IS_LEVELCLASS_EM(p)                                            \
+       ((p)->sort_priority >= LEVELCLASS_EM_START &&                   \
         (p)->sort_priority <= LEVELCLASS_EM_END)
-#define IS_LEVELCLASS_SP(p) \
-       ((p)->sort_priority >= LEVELCLASS_SP_START && \
+#define IS_LEVELCLASS_SP(p)                                            \
+       ((p)->sort_priority >= LEVELCLASS_SP_START &&                   \
         (p)->sort_priority <= LEVELCLASS_SP_END)
-#define IS_LEVELCLASS_DX(p) \
-       ((p)->sort_priority >= LEVELCLASS_DX_START && \
+#define IS_LEVELCLASS_DX(p)                                            \
+       ((p)->sort_priority >= LEVELCLASS_DX_START &&                   \
         (p)->sort_priority <= LEVELCLASS_DX_END)
+#define IS_LEVELCLASS_UNDEFINED(p)                                     \
+       ((p)->sort_priority < LEVELCLASS_PREDEFINED_START ||            \
+        (p)->sort_priority > LEVELCLASS_PREDEFINED_END)
 
 #define LEVELCLASS(n)  (IS_LEVELCLASS_TUTORIAL(n) ? LEVELCLASS_TUTORIAL : \
                         IS_LEVELCLASS_CLASSICS(n) ? LEVELCLASS_CLASSICS : \
-                        IS_LEVELCLASS_CONTRIBUTION(n) ? LEVELCLASS_CONTRIBUTION : \
-                        IS_LEVELCLASS_USER(n) ? LEVELCLASS_USER : \
-                        IS_LEVELCLASS_BD(n) ? LEVELCLASS_BD : \
-                        IS_LEVELCLASS_EM(n) ? LEVELCLASS_EM : \
-                        IS_LEVELCLASS_SP(n) ? LEVELCLASS_SP : \
-                        IS_LEVELCLASS_DX(n) ? LEVELCLASS_DX : \
+                        IS_LEVELCLASS_CONTRIB(n) ? LEVELCLASS_CONTRIB :   \
+                        IS_LEVELCLASS_PRIVATE(n) ? LEVELCLASS_PRIVATE :   \
+                        IS_LEVELCLASS_BD(n) ? LEVELCLASS_BD :             \
+                        IS_LEVELCLASS_EM(n) ? LEVELCLASS_EM :             \
+                        IS_LEVELCLASS_SP(n) ? LEVELCLASS_SP :             \
+                        IS_LEVELCLASS_DX(n) ? LEVELCLASS_DX :             \
                         LEVELCLASS_UNDEFINED)
 
 /* sort priorities of artwork */
 #define ARTWORKCLASS_CLASSICS_START    100
 #define ARTWORKCLASS_CLASSICS_END      199
-#define ARTWORKCLASS_CONTRIBUTION_START        200
-#define ARTWORKCLASS_CONTRIBUTION_END  299
-#define ARTWORKCLASS_LEVEL_START       300
-#define ARTWORKCLASS_LEVEL_END         399
-#define ARTWORKCLASS_USER_START                400
-#define ARTWORKCLASS_USER_END          499
+#define ARTWORKCLASS_CONTRIB_START     200
+#define ARTWORKCLASS_CONTRIB_END       299
+#define ARTWORKCLASS_PRIVATE_START     300
+#define ARTWORKCLASS_PRIVATE_END       399
+#define ARTWORKCLASS_LEVEL_START       400
+#define ARTWORKCLASS_LEVEL_END         499
 
 #define ARTWORKCLASS_CLASSICS          ARTWORKCLASS_CLASSICS_START
-#define ARTWORKCLASS_CONTRIBUTION      ARTWORKCLASS_CONTRIBUTION_START
+#define ARTWORKCLASS_CONTRIB           ARTWORKCLASS_CONTRIB_START
+#define ARTWORKCLASS_PRIVATE           ARTWORKCLASS_PRIVATE_START
 #define ARTWORKCLASS_LEVEL             ARTWORKCLASS_LEVEL_START
-#define ARTWORKCLASS_USER              ARTWORKCLASS_USER_START
 
 #define ARTWORKCLASS_UNDEFINED         999
 
-#define IS_ARTWORKCLASS_CLASSICS(p) \
-       ((p)->sort_priority >= ARTWORKCLASS_CLASSICS_START && \
+#define IS_ARTWORKCLASS_CLASSICS(p)                                    \
+       ((p)->sort_priority >= ARTWORKCLASS_CLASSICS_START &&           \
         (p)->sort_priority <= ARTWORKCLASS_CLASSICS_END)
-#define IS_ARTWORKCLASS_CONTRIBUTION(p) \
-       ((p)->sort_priority >= ARTWORKCLASS_CONTRIBUTION_START && \
-        (p)->sort_priority <= ARTWORKCLASS_CONTRIBUTION_END)
-#define IS_ARTWORKCLASS_LEVEL(p) \
-       ((p)->sort_priority >= ARTWORKCLASS_LEVEL_START && \
+#define IS_ARTWORKCLASS_CONTRIB(p)                                     \
+       ((p)->sort_priority >= ARTWORKCLASS_CONTRIB_START &&            \
+        (p)->sort_priority <= ARTWORKCLASS_CONTRIB_END)
+#define IS_ARTWORKCLASS_PRIVATE(p)                                     \
+       ((p)->sort_priority >= ARTWORKCLASS_PRIVATE_START &&            \
+        (p)->sort_priority <= ARTWORKCLASS_PRIVATE_END)
+#define IS_ARTWORKCLASS_LEVEL(p)                                       \
+       ((p)->sort_priority >= ARTWORKCLASS_LEVEL_START &&              \
         (p)->sort_priority <= ARTWORKCLASS_LEVEL_END)
-#define IS_ARTWORKCLASS_USER(p) \
-       ((p)->sort_priority >= ARTWORKCLASS_USER_START && \
-        (p)->sort_priority <= ARTWORKCLASS_USER_END)
 
 #define ARTWORKCLASS(n)        (IS_ARTWORKCLASS_CLASSICS(n) ? ARTWORKCLASS_CLASSICS :\
-                        IS_ARTWORKCLASS_CONTRIBUTION(n) ? ARTWORKCLASS_CONTRIBUTION : \
-                        IS_ARTWORKCLASS_LEVEL(n) ? ARTWORKCLASS_LEVEL : \
-                        IS_ARTWORKCLASS_USER(n) ? ARTWORKCLASS_USER : \
+                        IS_ARTWORKCLASS_CONTRIB(n) ? ARTWORKCLASS_CONTRIB :  \
+                        IS_ARTWORKCLASS_PRIVATE(n) ? ARTWORKCLASS_PRIVATE :  \
+                        IS_ARTWORKCLASS_LEVEL(n) ? ARTWORKCLASS_LEVEL :      \
                         ARTWORKCLASS_UNDEFINED)
 
 
@@ -230,10 +236,10 @@ boolean checkCookieString(const char *, const char *);
 
 char *getFormattedSetupEntry(char *, char *);
 
-struct SetupFileList *newSetupFileList(char *, char *);
-void freeSetupFileList(struct SetupFileList *);
-char *getListEntry(struct SetupFileList *, char *);
-void setListEntry(struct SetupFileList *, char *, char *);
+SetupFileList *newSetupFileList(char *, char *);
+void freeSetupFileList(SetupFileList *);
+char *getListEntry(SetupFileList *, char *);
+SetupFileList *setListEntry(SetupFileList *, char *, char *);
 SetupFileList *loadSetupFileList(char *);
 
 SetupFileHash *newSetupFileHash();
index 007e02d3542f7583735f555a5889b0f71a839e30..ae8473465d2f8b087086c2bd9ce40c174dd99b18 100644 (file)
 #define RO_BASE_PATH           RO_GAME_DIR
 #define RW_BASE_PATH           RW_GAME_DIR
 
+/* directory names */
 #define GRAPHICS_DIRECTORY     "graphics"
 #define SOUNDS_DIRECTORY       "sounds"
 #define MUSIC_DIRECTORY                "music"
 #define MUS_CLASSIC_SUBDIR     "mus_orig"
 #endif
 
+/* file names and filename extensions */
+#if !defined(PLATFORM_MSDOS)
+#define LEVELSETUP_DIRECTORY   "levelsetup"
+#define SETUP_FILENAME         "setup.conf"
+#define LEVELSETUP_FILENAME    "levelsetup.conf"
+#define LEVELINFO_FILENAME     "levelinfo.conf"
+#define GRAPHICSINFO_FILENAME  "graphicsinfo.conf"
+#define SOUNDSINFO_FILENAME    "soundsinfo.conf"
+#define MUSICINFO_FILENAME     "musicinfo.conf"
+#define LEVELFILE_EXTENSION    "level"
+#define TAPEFILE_EXTENSION     "tape"
+#define SCOREFILE_EXTENSION    "score"
+#else
+#define LEVELSETUP_DIRECTORY   "lvlsetup"
+#define SETUP_FILENAME         "setup.cnf"
+#define LEVELSETUP_FILENAME    "lvlsetup.cnf"
+#define LEVELINFO_FILENAME     "lvlinfo.cnf"
+#define GRAPHICSINFO_FILENAME  "gfxinfo.cnf"
+#define SOUNDSINFO_FILENAME    "sndinfo.cnf"
+#define MUSICINFO_FILENAME     "musinfo.cnf"
+#define LEVELFILE_EXTENSION    "lvl"
+#define TAPEFILE_EXTENSION     "tap"
+#define SCOREFILE_EXTENSION    "sco"
+#endif
+
 
 /* areas in bitmap PIX_DOOR */
 /* meaning in PIX_DB_DOOR: (3 PAGEs)
 
 
 /* macros for version handling */
-#define VERSION_IDENT(x,y,z)   ((x) * 1000000 + (y) * 10000 + (z) * 100)
-#define RELEASE_IDENT(x,y,z,r) (VERSION_IDENT(x,y,z) + (r))
 #define VERSION_MAJOR(x)       ((x) / 1000000)
 #define VERSION_MINOR(x)       (((x) % 1000000) / 10000)
 #define VERSION_PATCH(x)       (((x) % 10000) / 100)
-#define VERSION_RELEASE(x)     ((x) % 100)
+#define VERSION_BUILD(x)       ((x) % 100)
+#define VERSION_IDENT(a,b,c,d) ((a) * 1000000 + (b) * 10000 + (c) * 100 + (d))
 
 
 /* macros for parent/child process identification */
                                 (artwork).snd_current_identifier :     \
                                 (artwork).mus_current_identifier)
 
+#define ARTWORKINFO_FILENAME(type)                                     \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                GRAPHICSINFO_FILENAME :                \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                SOUNDSINFO_FILENAME :                  \
+                                (type) == ARTWORK_TYPE_MUSIC ?         \
+                                MUSICINFO_FILENAME : "")
+
+#define ARTWORK_DIRECTORY(type)                                                \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                GRAPHICS_DIRECTORY :                   \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                SOUNDS_DIRECTORY :                     \
+                                (type) == ARTWORK_TYPE_MUSIC ?         \
+                                MUSIC_DIRECTORY : "")
+
+#define OPTIONS_ARTWORK_DIRECTORY(type)                                        \
+                               ((type) == ARTWORK_TYPE_GRAPHICS ?      \
+                                options.graphics_directory :           \
+                                (type) == ARTWORK_TYPE_SOUNDS ?        \
+                                options.sounds_directory :             \
+                                (type) == ARTWORK_TYPE_MUSIC ?         \
+                                options.music_directory : "")
+
 
 /* type definitions */
 typedef int (*EventFilter)(const Event *);
@@ -578,6 +627,8 @@ struct TreeInfo
   int last_level;      /* last level number (automatically calculated) */
   int sort_priority;   /* sort levels by 'sort_priority' and then by name */
 
+  boolean latest_engine;/* force level set to use the latest game engine */
+
   boolean level_group; /* directory contains more level series directories */
   boolean parent_link; /* entry links back to parent directory */
   boolean user_defined;        /* user defined levels are stored in home directory */
index 7f42c44b33f6fd060fbf059e3c50ba88a85a2f91..a06efd1ff5c5dfbdd38e456d27cddc17ce794730 100644 (file)
@@ -44,6 +44,7 @@ short                 MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -52,7 +53,8 @@ boolean                       Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 boolean                        Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 unsigned long          Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 unsigned long          ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-short                  JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaCnt[MAX_NUM_AMOEBA];
 short                  AmoebaCnt2[MAX_NUM_AMOEBA];
@@ -62,9 +64,10 @@ short                        ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 unsigned long          Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
 
 int                    GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-int                    GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+int                    GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+int                    GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 int                    lev_fieldx, lev_fieldy;
 int                    scroll_x, scroll_y;
@@ -3369,6 +3372,16 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "exit",
     "-"
   },
+  {
+    "sp_exit.opening",
+    "sp_exit",
+    "-"
+  },
+  {
+    "sp_exit.closing",
+    "sp_exit",
+    "-"
+  },
   {
     "sp_exit_open",
     "sp_exit",
@@ -3661,38 +3674,43 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
 
 struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] =
 {
-  { ".[DEFAULT]",      ACTION_DEFAULT,         TRUE    },
-  { ".waiting",                ACTION_WAITING,         TRUE    },
-  { ".falling",                ACTION_FALLING,         TRUE    },
-  { ".moving",         ACTION_MOVING,          TRUE    },
-  { ".digging",                ACTION_DIGGING,         FALSE   },
-  { ".snapping",       ACTION_SNAPPING,        FALSE   },
-  { ".collecting",     ACTION_COLLECTING,      FALSE   },
-  { ".dropping",       ACTION_DROPPING,        FALSE   },
-  { ".pushing",                ACTION_PUSHING,         FALSE   },
-  { ".walking",                ACTION_WALKING,         FALSE   },
-  { ".passing",                ACTION_PASSING,         FALSE   },
-  { ".impact",         ACTION_IMPACT,          FALSE   },
-  { ".breaking",       ACTION_BREAKING,        FALSE   },
-  { ".activating",     ACTION_ACTIVATING,      FALSE   },
-  { ".deactivating",   ACTION_DEACTIVATING,    FALSE   },
-  { ".opening",                ACTION_OPENING,         FALSE   },
-  { ".closing",                ACTION_CLOSING,         FALSE   },
-  { ".attacking",      ACTION_ATTACKING,       TRUE    },
-  { ".growing",                ACTION_GROWING,         TRUE    },
-  { ".shrinking",      ACTION_SHRINKING,       FALSE   },
-  { ".active",         ACTION_ACTIVE,          TRUE    },
-  { ".filling",                ACTION_FILLING,         FALSE   },
-  { ".emptying",       ACTION_EMPTYING,        FALSE   },
-  { ".changing",       ACTION_CHANGING,        FALSE   },
-  { ".exploding",      ACTION_EXPLODING,       FALSE   },
-  { ".dying",          ACTION_DYING,           FALSE   },
-  { ".other",          ACTION_OTHER,           FALSE   },
+  { ".[DEFAULT]",              ACTION_DEFAULT,                 TRUE    },
+  { ".waiting",                        ACTION_WAITING,                 TRUE    },
+  { ".falling",                        ACTION_FALLING,                 TRUE    },
+  { ".moving",                 ACTION_MOVING,                  TRUE    },
+  { ".digging",                        ACTION_DIGGING,                 FALSE   },
+  { ".snapping",               ACTION_SNAPPING,                FALSE   },
+  { ".collecting",             ACTION_COLLECTING,              FALSE   },
+  { ".dropping",               ACTION_DROPPING,                FALSE   },
+  { ".pushing",                        ACTION_PUSHING,                 FALSE   },
+  { ".walking",                        ACTION_WALKING,                 FALSE   },
+  { ".passing",                        ACTION_PASSING,                 FALSE   },
+  { ".impact",                 ACTION_IMPACT,                  FALSE   },
+  { ".breaking",               ACTION_BREAKING,                FALSE   },
+  { ".activating",             ACTION_ACTIVATING,              FALSE   },
+  { ".deactivating",           ACTION_DEACTIVATING,            FALSE   },
+  { ".opening",                        ACTION_OPENING,                 FALSE   },
+  { ".closing",                        ACTION_CLOSING,                 FALSE   },
+  { ".attacking",              ACTION_ATTACKING,               TRUE    },
+  { ".growing",                        ACTION_GROWING,                 TRUE    },
+  { ".shrinking",              ACTION_SHRINKING,               FALSE   },
+  { ".active",                 ACTION_ACTIVE,                  TRUE    },
+  { ".filling",                        ACTION_FILLING,                 FALSE   },
+  { ".emptying",               ACTION_EMPTYING,                FALSE   },
+  { ".changing",               ACTION_CHANGING,                FALSE   },
+  { ".exploding",              ACTION_EXPLODING,               FALSE   },
+  { ".dying",                  ACTION_DYING,                   FALSE   },
+  { ".turning",                        ACTION_TURNING,                 FALSE   },
+  { ".turning_from_left",      ACTION_TURNING_FROM_LEFT,       FALSE   },
+  { ".turning_from_right",     ACTION_TURNING_FROM_RIGHT,      FALSE   },
+  { ".turning_from_up",                ACTION_TURNING_FROM_UP,         FALSE   },
+  { ".turning_from_down",      ACTION_TURNING_FROM_DOWN,       FALSE   },
+  { ".other",                  ACTION_OTHER,                   FALSE   },
 
   /* empty suffix always matches -- check as last entry in InitSoundInfo() */
-  { "",                        ACTION_DEFAULT,         TRUE    },
+  { "",                                ACTION_DEFAULT,                 TRUE    },
 
-  { NULL,              0,                      0       }
+  { NULL,                      0,                              0       }
 };
 
 struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS + 1] =
index 985014bad0090e53a9d3630cc049b2795584c605..273052ecb6fe41575b3fca7ee6b255d6cc6d3ff6 100644 (file)
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
-#define PLAYER_SWITCHING(p,x,y)        ((p)->Switching &&                      \
+#define PLAYER_SWITCHING(p,x,y)        ((p)->is_switching &&                   \
                                 (p)->switch_x == (x) && (p)->switch_y == (y))
 
 #define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
 #define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 25)
 #define EL_EXIT_OPENING                        (EL_FIRST_RUNTIME_REAL + 26)
 #define EL_EXIT_CLOSING                        (EL_FIRST_RUNTIME_REAL + 27)
-#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 28)
-#define EL_SP_TERMINAL_ACTIVE          (EL_FIRST_RUNTIME_REAL + 29)
-#define EL_SP_BUGGY_BASE_ACTIVATING    (EL_FIRST_RUNTIME_REAL + 30)
-#define EL_SP_BUGGY_BASE_ACTIVE                (EL_FIRST_RUNTIME_REAL + 31)
-#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 32)
-#define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 33)
-#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 34)
-#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 35)
-#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 36)
-#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 37)
-#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 38)
-#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 39)
-#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 40)
-#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 41)
-#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 42)
+#define EL_SP_EXIT_OPENING             (EL_FIRST_RUNTIME_REAL + 28)
+#define EL_SP_EXIT_CLOSING             (EL_FIRST_RUNTIME_REAL + 29)
+#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 30)
+#define EL_SP_TERMINAL_ACTIVE          (EL_FIRST_RUNTIME_REAL + 31)
+#define EL_SP_BUGGY_BASE_ACTIVATING    (EL_FIRST_RUNTIME_REAL + 32)
+#define EL_SP_BUGGY_BASE_ACTIVE                (EL_FIRST_RUNTIME_REAL + 33)
+#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 34)
+#define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 35)
+#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 36)
+#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 37)
+#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 38)
+#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 39)
+#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 40)
+#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 41)
+#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 42)
+#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 43)
+#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 44)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 43)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 45)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define ACTION_CHANGING                                23
 #define ACTION_EXPLODING                       24
 #define ACTION_DYING                           25
-#define ACTION_OTHER                           26
+#define ACTION_TURNING                         26
+#define ACTION_TURNING_FROM_LEFT               27
+#define ACTION_TURNING_FROM_RIGHT              28
+#define ACTION_TURNING_FROM_UP                 29
+#define ACTION_TURNING_FROM_DOWN               30
+#define ACTION_OTHER                           31
 
-#define NUM_ACTIONS                            27
+#define NUM_ACTIONS                            32
 
 /* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_MAIN                   0
 
 #define PROGRAM_VERSION_MAJOR  3
 #define PROGRAM_VERSION_MINOR  0
-#define PROGRAM_VERSION_PATCH  6
-#define PROGRAM_VERSION_RELEASE        0
-#define PROGRAM_VERSION_STRING "3.0.6"
+#define PROGRAM_VERSION_PATCH  7
+#define PROGRAM_VERSION_BUILD  1
+
+#if 0
+#define PROGRAM_VERSION_STRING "3.0.7"
+#endif
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
-#define PROGRAM_RIGHTS_STRING  "Copyright Â©1995-2003 by"
+#define PROGRAM_COPYRIGHT_STRING "Copyright Â©1995-2003 by Holger Schemel"
+
+#if 0
 #define PROGRAM_DOS_PORT_STRING        "DOS port done by Guido Schulz"
 #define PROGRAM_IDENT_STRING   PROGRAM_VERSION_STRING " " TARGET_STRING
 #define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING
-#define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
+#endif
+
 #define ICON_TITLE_STRING      PROGRAM_TITLE_STRING
 #define COOKIE_PREFIX          "ROCKSNDIAMONDS"
 #define FILENAME_PREFIX                "Rocks"
 **     1.4 (still in use)
 **     2.0 (actual)
 */
-#define FILE_VERSION_1_0       VERSION_IDENT(1,0,0)
-#define FILE_VERSION_1_2       VERSION_IDENT(1,2,0)
-#define FILE_VERSION_1_4       VERSION_IDENT(1,4,0)
-#define FILE_VERSION_2_0       VERSION_IDENT(2,0,0)
+#define FILE_VERSION_1_0       VERSION_IDENT(1,0,0,0)
+#define FILE_VERSION_1_2       VERSION_IDENT(1,2,0,0)
+#define FILE_VERSION_1_4       VERSION_IDENT(1,4,0,0)
+#define FILE_VERSION_2_0       VERSION_IDENT(2,0,0,0)
 
 /* file version does not change for every program version, but is changed
    when new features are introduced that are incompatible with older file
 #define GAME_VERSION_1_4       FILE_VERSION_1_4
 #define GAME_VERSION_2_0       FILE_VERSION_2_0
 
-#define GAME_VERSION_ACTUAL    RELEASE_IDENT(PROGRAM_VERSION_MAJOR, \
+#define GAME_VERSION_ACTUAL    VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
                                              PROGRAM_VERSION_MINOR, \
                                              PROGRAM_VERSION_PATCH, \
-                                             PROGRAM_VERSION_RELEASE)
+                                             PROGRAM_VERSION_BUILD)
 
 /* values for game_emulation */
 #define EMU_NONE               0
@@ -1134,20 +1147,20 @@ struct PlayerInfo
   int GfxAction;
 
   boolean use_murphy_graphic;
-  boolean use_disk_red_graphic;
 
-  boolean Pushing;
-  boolean Switching;
   boolean LevelSolved, GameOver;
-  boolean snapped;
-
-  int switch_x, switch_y;
 
   int last_move_dir;
-  boolean is_moving;
+
   boolean is_waiting;
+  boolean is_moving;
   boolean is_digging;
+  boolean is_snapping;
   boolean is_collecting;
+  boolean is_pushing;
+  boolean is_switching;
+
+  int switch_x, switch_y;
 
   int show_envelope;
 
@@ -1199,7 +1212,7 @@ struct LevelInfo
   int time_light;
   int time_timegate;
   boolean double_speed;
-  boolean gravity;
+  boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
 
   short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -1244,13 +1257,16 @@ struct TapeInfo
 
 struct GameInfo
 {
+  /* values for engine initialization */
+  int default_push_delay_fixed;
+  int default_push_delay_random;
+
   /* constant within running game */
   int engine_version;
   int emulation;
   int initial_move_delay;
   int initial_move_delay_value;
-
-  boolean envelope_active;
+  int initial_push_delay_value;
 
   /* variable within running game */
   int yamyam_content_nr;
@@ -1262,7 +1278,9 @@ struct GameInfo
   int belt_dir_nr[4];
   int switchgate_pos;
   int balloon_dir;
+  boolean gravity;
   boolean explosions_delayed;
+  boolean envelope_active;
 };
 
 struct GlobalInfo
@@ -1476,6 +1494,7 @@ extern short                      MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   ChangePage[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -1484,7 +1503,8 @@ extern boolean                    Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern boolean                 Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern unsigned long           Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern unsigned long           ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short                   JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaCnt[MAX_NUM_AMOEBA];
 extern short                   AmoebaCnt2[MAX_NUM_AMOEBA];
@@ -1494,9 +1514,10 @@ extern short                     ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern unsigned long           Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
 
 extern int                     GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern int                     GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 extern int                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
index 4a60007b8b47f397177bd13f46883620e1663ade..11fd9bc864c4bb528f62c00f776bc23c1b65d894 100644 (file)
@@ -377,7 +377,7 @@ static void Handle_OP_STOP_PLAYING(struct NetworkServerPlayerInfo *player)
   broadcast(NULL, 2, 0);
 }
 
-static void Handle_OP_MOVE_FIGURE(struct NetworkServerPlayerInfo *player)
+static void Handle_OP_MOVE_PLAYER(struct NetworkServerPlayerInfo *player)
 {
   struct NetworkServerPlayerInfo *v;
   int last_client_nr = 0;
@@ -635,8 +635,8 @@ void NetworkServer(int port, int serveronly)
              Handle_OP_STOP_PLAYING(player);
              break;
 
-           case OP_MOVE_FIGURE:
-             Handle_OP_MOVE_FIGURE(player);
+           case OP_MOVE_PLAYER:
+             Handle_OP_MOVE_PLAYER(player);
              break;
 
            case OP_BROADCAST_MESSAGE:
index e3c20b72d397edf74ad06f9b39db78f64a838c9d..5805fa24aabbef50ac5f3458b3fe57bd7d22468c 100644 (file)
@@ -33,7 +33,7 @@
 #define OP_PAUSE_PLAYING       9
 #define OP_CONTINUE_PLAYING    10
 #define OP_STOP_PLAYING                11
-#define OP_MOVE_FIGURE         12
+#define OP_MOVE_PLAYER         12
 #define OP_BROADCAST_MESSAGE   13
 
 #define MAX_BUFFER_SIZE                4096
index a2928592b4a23fae7d379a47dbf68cf779e41e0f..5511d176a1b9a9264c0e9b9db35fec4efe0a39f2 100644 (file)
@@ -266,7 +266,7 @@ void SendToServer_StopPlaying()
 
 void SendToServer_MovePlayer(byte player_action)
 {
-  buffer[1] = OP_MOVE_FIGURE;
+  buffer[1] = OP_MOVE_PLAYER;
   buffer[2] = player_action;
 
   SendBufferToServer(3);
@@ -486,7 +486,7 @@ static void Handle_OP_STOP_PLAYING()
   DrawMainMenu();
 }
 
-static void Handle_OP_MOVE_FIGURE(unsigned int len)
+static void Handle_OP_MOVE_PLAYER(unsigned int len)
 {
   int server_frame_counter;
   int i;
@@ -569,8 +569,8 @@ static void HandleNetworkingMessages()
        Handle_OP_STOP_PLAYING();
        break;
 
-      case OP_MOVE_FIGURE:
-       Handle_OP_MOVE_FIGURE(message_length);
+      case OP_MOVE_PLAYER:
+       Handle_OP_MOVE_PLAYER(message_length);
        break;
 
       case OP_BROADCAST_MESSAGE:
index 90085a467a6c7ae39371790a4484b4ad97c3c006..8e66c8c9ed7831cc55f2c2b163dab62f8d2a1812 100644 (file)
@@ -155,13 +155,13 @@ static void PlaySound_Menu_Continue(int sound)
 
 void DrawHeadline()
 {
-  int text1_width = getTextWidth(PROGRAM_TITLE_STRING,   FONT_TITLE_1);
-  int text2_width = getTextWidth(WINDOW_SUBTITLE_STRING, FONT_TITLE_2);
+  int text1_width = getTextWidth(PROGRAM_TITLE_STRING,     FONT_TITLE_1);
+  int text2_width = getTextWidth(PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
   int x1 = SX + (SXSIZE - text1_width) / 2;
   int x2 = SX + (SXSIZE - text2_width) / 2;
 
-  DrawText(x1, SY + 8,  PROGRAM_TITLE_STRING,   FONT_TITLE_1);
-  DrawText(x2, SY + 46, WINDOW_SUBTITLE_STRING, FONT_TITLE_2);
+  DrawText(x1, SY + 8,  PROGRAM_TITLE_STRING,     FONT_TITLE_1);
+  DrawText(x2, SY + 46, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
 }
 
 static void ToggleFullscreenIfNeeded()
@@ -1254,7 +1254,8 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
 
   /* clear tree list area, but not title or scrollbar */
   DrawBackground(mSX, mSY + MENU_SCREEN_START_YPOS * 32,
-                SXSIZE - 32 + menu.scrollbar_xoffset, SYSIZE);
+                SXSIZE - 32 + menu.scrollbar_xoffset,
+                MAX_MENU_ENTRIES_ON_SCREEN * 32);
 
   for(i=0; i<num_page_entries; i++)
   {
@@ -1928,23 +1929,25 @@ static void drawSetupValue(int pos)
   int xpos = MENU_SCREEN_VALUE_XPOS;
   int ypos = MENU_SCREEN_START_YPOS + pos;
   int font_nr = FONT_VALUE_1;
-  char *value_string = getSetupValue(setup_info[pos].type & ~TYPE_GHOSTED,
-                                    setup_info[pos].value);
+  int type = setup_info[pos].type;
+  void *value = setup_info[pos].value;
+  char *value_string = (!(type & TYPE_GHOSTED) ? getSetupValue(type, value) :
+                       "n/a");
 
   if (value_string == NULL)
     return;
 
-  if (setup_info[pos].type & TYPE_KEY)
+  if (type & TYPE_KEY)
   {
     xpos = 3;
 
-    if (setup_info[pos].type & TYPE_QUERY)
+    if (type & TYPE_QUERY)
     {
       value_string = "<press key>";
       font_nr = FONT_INPUT_1_ACTIVE;
     }
   }
-  else if (setup_info[pos].type & TYPE_STRING)
+  else if (type & TYPE_STRING)
   {
     int max_value_len = (SCR_FIELDX - 2) * 2;
 
@@ -1954,10 +1957,9 @@ static void drawSetupValue(int pos)
     if (strlen(value_string) > max_value_len)
       value_string[max_value_len] = '\0';
   }
-  else if (setup_info[pos].type & TYPE_BOOLEAN_STYLE)
+  else if (type & TYPE_BOOLEAN_STYLE)
   {
-    font_nr = (*(boolean *)(setup_info[pos].value) ? FONT_OPTION_ON :
-              FONT_OPTION_OFF);
+    font_nr = (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
   }
 
   DrawText(mSX + xpos * 32, mSY + ypos * 32,
index a2d051fb1a87df424f3e5f704248e13110296684..fbb3079302ec7e5a67aa8b7986827f3596112b00 100644 (file)
@@ -486,7 +486,7 @@ void DrawLevelGraphicAnimation(int x, int y, int graphic)
 void DrawLevelElementAnimation(int x, int y, int element)
 {
 #if 1
-  int graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+  int graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
 
   DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic);
 #else
@@ -518,7 +518,7 @@ void DrawLevelElementAnimationIfNeeded(int x, int y, int element)
   if (!IN_LEV_FIELD(x, y) || !IN_SCR_FIELD(sx, sy))
     return;
 
-  graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]);
+  graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]);
 
   if (!IS_NEW_FRAME(GfxFrame[x][y], graphic))
     return;
@@ -529,6 +529,30 @@ void DrawLevelElementAnimationIfNeeded(int x, int y, int element)
     DrawLevelFieldCrumbledSand(x, y);
 }
 
+static int getPlayerGraphic(struct PlayerInfo *player, int move_dir)
+{
+  if (player->use_murphy_graphic)
+  {
+    /* this works only because currently only one player can be "murphy" ... */
+    static int last_horizontal_dir = MV_LEFT;
+    int graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, move_dir);
+
+    if (move_dir == MV_LEFT || move_dir == MV_RIGHT)
+      last_horizontal_dir = move_dir;
+
+    if (graphic == IMG_SP_MURPHY)      /* undefined => use special graphic */
+    {
+      int direction = (player->is_snapping ? move_dir : last_horizontal_dir);
+
+      graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
+    }
+
+    return graphic;
+  }
+  else
+    return el_act_dir2img(player->element_nr, player->GfxAction, move_dir);
+}
+
 void DrawAllPlayers()
 {
   int i;
@@ -548,41 +572,38 @@ void DrawPlayerField(int x, int y)
 
 void DrawPlayer(struct PlayerInfo *player)
 {
+  int jx = player->jx;
+  int jy = player->jy;
+  int move_dir = player->MovDir;
 #if 0
-  int jx = player->jx, jy = player->jy;
-  int last_jx = player->last_jx, last_jy = player->last_jy;
-  int next_jx = jx + (jx - last_jx), next_jy = jy + (jy - last_jy);
-  int sx = SCREENX(jx), sy = SCREENY(jy);
-  int sxx = 0, syy = 0;
-  int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy];
-  int graphic;
-  int frame = 0;
+  int last_jx = player->last_jx;
+  int last_jy = player->last_jy;
+  int next_jx = jx + (jx - last_jx);
+  int next_jy = jy + (jy - last_jy);
   boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
-  int move_dir = player->MovDir;
-  int action = ACTION_DEFAULT;
 #else
-  int jx = player->jx, jy = player->jy;
-  int move_dir = player->MovDir;
   int dx = (move_dir == MV_LEFT ? -1 : move_dir == MV_RIGHT ? +1 : 0);
   int dy = (move_dir == MV_UP   ? -1 : move_dir == MV_DOWN  ? +1 : 0);
   int last_jx = (player->is_moving ? jx - dx : jx);
   int last_jy = (player->is_moving ? jy - dy : jy);
   int next_jx = jx + dx;
   int next_jy = jy + dy;
+  boolean player_is_moving = (player->MovPos ? TRUE : FALSE);
+#endif
   int sx = SCREENX(jx), sy = SCREENY(jy);
   int sxx = 0, syy = 0;
   int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy];
   int graphic;
-  int frame = 0;
-  boolean player_is_moving = (player->MovPos ? TRUE : FALSE);
   int action = ACTION_DEFAULT;
-#endif
+  int last_player_graphic = getPlayerGraphic(player, move_dir);
+  int last_player_frame = player->Frame;
+  int frame = 0;
 
   if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
     return;
 
 #if DEBUG
-  if (!IN_LEV_FIELD(jx,jy))
+  if (!IN_LEV_FIELD(jx, jy))
   {
     printf("DrawPlayerField(): x = %d, y = %d\n",jx,jy);
     printf("DrawPlayerField(): sx = %d, sy = %d\n",sx,sy);
@@ -594,11 +615,11 @@ void DrawPlayer(struct PlayerInfo *player)
   if (element == EL_EXPLOSION)
     return;
 
-  action = (player->Pushing ? ACTION_PUSHING :
-           player->is_digging ? ACTION_DIGGING :
+  action = (player->is_pushing    ? ACTION_PUSHING    :
+           player->is_digging    ? ACTION_DIGGING    :
            player->is_collecting ? ACTION_COLLECTING :
-           player->is_moving ? ACTION_MOVING :
-           player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
+           player->is_moving     ? ACTION_MOVING     :
+           player->is_snapping   ? ACTION_SNAPPING   : ACTION_DEFAULT);
 
 #if 0
   printf("::: '%s'\n", element_action_info[action].suffix);
@@ -632,24 +653,8 @@ void DrawPlayer(struct PlayerInfo *player)
     else
       DrawLevelField(last_jx, last_jy);
 
-    if (player->Pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy)))
-    {
-#if 1
-#if 1
+    if (player->is_pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy)))
       DrawLevelElement(next_jx, next_jy, EL_EMPTY);
-#else
-      if (player->GfxPos)
-      {
-       if (Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL)
-         DrawLevelElement(next_jx, next_jy, EL_SOKOBAN_FIELD_EMPTY);
-       else
-         DrawLevelElement(next_jx, next_jy, EL_EMPTY);
-      }
-      else
-       DrawLevelField(next_jx, next_jy);
-#endif
-#endif
-    }
   }
 
   if (!IN_SCR_FIELD(sx, sy))
@@ -670,13 +675,8 @@ void DrawPlayer(struct PlayerInfo *player)
   {
     if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
     {
-#if 1
       if (GFX_CRUMBLED(GfxElement[jx][jy]))
        DrawLevelFieldCrumbledSandDigging(jx, jy, move_dir, player->StepFrame);
-#else
-      if (GfxElement[jx][jy] == EL_SAND)
-       DrawLevelFieldCrumbledSandDigging(jx, jy, move_dir, player->StepFrame);
-#endif
       else
       {
        int old_element = GfxElement[jx][jy];
@@ -698,21 +698,39 @@ void DrawPlayer(struct PlayerInfo *player)
   /* draw player himself                                                     */
   /* ----------------------------------------------------------------------- */
 
+#if 1
+
+  graphic = getPlayerGraphic(player, move_dir);
+
+  /* in the case of changed player action or direction, prevent the current
+     animation frame from being restarted for identical animations */
+  if (player->Frame == 0 &&
+      graphic_info[graphic].bitmap == graphic_info[last_player_graphic].bitmap)
+    player->Frame = last_player_frame;
+
+#else
+
   if (player->use_murphy_graphic)
   {
     static int last_horizontal_dir = MV_LEFT;
-    int direction;
 
     if (move_dir == MV_LEFT || move_dir == MV_RIGHT)
       last_horizontal_dir = move_dir;
 
-    direction = (player->snapped ? move_dir : last_horizontal_dir);
+    graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, move_dir);
 
-    graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
+    if (graphic == IMG_SP_MURPHY)      /* undefined => use special graphic */
+    {
+      int direction = (player->is_snapping ? move_dir : last_horizontal_dir);
+
+      graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
+    }
   }
   else
     graphic = el_act_dir2img(player->element_nr, player->GfxAction, move_dir);
 
+#endif
+
   frame = getGraphicAnimationFrame(graphic, player->Frame);
 
   if (player->GfxPos)
@@ -743,14 +761,14 @@ void DrawPlayer(struct PlayerInfo *player)
 
 #if 0
   printf("::: %d, %d [%d, %d] [%d]\n",
-        player->Pushing, player_is_moving, player->GfxAction,
+        player->is_pushing, player_is_moving, player->GfxAction,
         player->is_moving, player_is_moving);
 #endif
 
 #if 1
-  if (player->Pushing && player->is_moving)
+  if (player->is_pushing && player->is_moving)
 #else
-  if (player->Pushing && player_is_moving)
+  if (player->is_pushing && player_is_moving)
 #endif
   {
     int px = SCREENX(next_jx), py = SCREENY(next_jy);
@@ -758,48 +776,21 @@ void DrawPlayer(struct PlayerInfo *player)
     if (Back[next_jx][next_jy])
       DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]);
 
-#if 1
     if ((sxx || syy) && element == EL_SOKOBAN_OBJECT)
       DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0,
                                 NO_CUTTING);
-#else
-    if ((sxx || syy) &&
-       (element == EL_SOKOBAN_FIELD_EMPTY ||
-        Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL))
-      DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0,
-                                NO_CUTTING);
-#endif
     else
     {
-#if 1
       int element = MovingOrBlocked2Element(next_jx, next_jy);
-#else
+      int graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
 #if 1
-      int element = Feld[jx][jy];
+      int frame = getGraphicAnimationFrame(graphic, player->StepFrame);
 #else
-      int element = Feld[next_jx][next_jy];
-#endif
-#endif
-
-#if 1
-      int graphic = el2img(element);
-      int frame = 0;
-
-#if 0
-      if ((sxx || syy) && IS_PUSHABLE(element))
-#endif
-      {
-       graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir);
-       frame = getGraphicAnimationFrame(graphic, player->Frame);
-      }
-
-#if 0
-      printf("::: pushing %d: %d ...\n", sxx, frame);
+      int frame = getGraphicAnimationFrame(graphic, player->Frame);
 #endif
 
       DrawGraphicShifted(px, py, sxx, syy, graphic, frame,
                         NO_CUTTING, NO_MASKING);
-#endif
     }
   }
 
@@ -820,14 +811,7 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (player_is_moving && last_element == EL_EXPLOSION)
   {
-#if 1
     int graphic = el_act2img(GfxElement[last_jx][last_jy], ACTION_EXPLODING);
-#else
-    int stored = Store[last_jx][last_jy];
-    int graphic = (game.emulation != EMU_SUPAPLEX ? IMG_EXPLOSION :
-                  stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON :
-                  IMG_SP_EXPLOSION);
-#endif
     int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
     int phase = ExplodePhase[last_jx][last_jy] - 1;
     int frame = getGraphicAnimationFrame(graphic, phase - delay);
@@ -1128,7 +1112,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
   {
     SetRandomAnimationValue(lx, ly);
 
-    graphic = el_act_dir2img(element, GfxAction[lx][ly], MovDir[lx][ly]);
+    graphic = el_act_dir2img(element, GfxAction[lx][ly], GfxDir[lx][ly]);
     frame = getGraphicAnimationFrame(graphic, GfxFrame[lx][ly]);
   }
   else /* border element */