+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
-#=============================================================================#
-# 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)
@$(MAKE_CMD) clean
-#-----------------------------------------------------------------------------#
-# development only stuff #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
auto-conf:
@$(MAKE_CMD) auto-conf
enginetest:
./Scripts/make_enginetest.sh
+enginetestcustom:
+ ./Scripts/make_enginetest.sh custom
+
enginetestfast:
./Scripts/make_enginetest.sh fast
-#=============================================================================#
-# 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
endif
+# -----------------------------------------------------------------------------
+# build targets
+# -----------------------------------------------------------------------------
+
all: libgame_dir $(PROGNAME)
$(PROGNAME): $(LIBGAME) $(TIMESTAMP_FILE) $(OBJS) $(ICON)
clean: clean-obj clean-ico clean-bin
-#-----------------------------------------------------------------------------#
-# development only stuff #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
dist-clean: clean-obj
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
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
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
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
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
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
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,
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
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
{ "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" },
{ "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 */
{ "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" },
{ "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" },
{ "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" },
{ "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" },
{ "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" },
{ "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" },
#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 */
{ "[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 },
#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 */
#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
}
#include "main.h"
+char *getProgramVersionString(void);
+char *getProgramInitString(void);
char *getWindowTitleString(void);
#endif /* CONFIG_H */
-#define COMPILE_DATE_STRING "[2003-10-06 01:34]"
+#define COMPILE_DATE_STRING "[2003-11-09 23:35]"
{
-1, ED_COUNTER_YPOS(6) - MINI_TILEY,
GADGET_ID_GRAVITY, GADGET_ID_DOUBLE_SPEED,
- &level.gravity,
+ &level.initial_gravity,
" ", "gravity", "set level gravity"
},
{
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;
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");
}
}
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;
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;
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;
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);
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,
/* 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 */
}
/* 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
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;
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)
/* 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++)
{
}
/* 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++)
{
}
}
- /* 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++)
{
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 :
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 :
}
}
- /* 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++)
/* 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);
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));
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"));
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
}
#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
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 *);
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);
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,
case EL_PIG:
case EL_DRAGON:
- MovDir[x][y] = 1 << RND(4);
+ GfxDir[x][y] = MovDir[x][y] = 1 << RND(4);
break;
#if 0
/* 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 */
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))
{
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;
}
}
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;
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;
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;
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;
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;
}
}
}
break;
}
+
+ GfxDir[x][y] = MovDir[x][y];
}
void InitAmoebaNr(int x, int y)
}
/* 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 */
{
GfxFrame[x][y] = 0;
GfxAction[x][y] = ACTION_DEFAULT;
+ GfxDir[x][y] = MovDir[x][y];
}
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;
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)
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)
{
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)
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);
#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
#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;
RemoveField(x, y);
#else
MovDir[x][y] = MovPos[x][y] = 0;
+ GfxDir[x][y] = MovDir[x][y];
AmoebaNr[x][y] = 0;
#endif
#endif
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);
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;
PlaySoundLevelElementAction(x, y, element, ACTION_IMPACT);
}
-void TurnRound(int x, int y)
+inline static void TurnRoundExt(int x, int y)
{
static struct
{
}
}
+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;
{
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);
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)
{
#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)
}
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);
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
{
/* !!! 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 ||
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]))
Feld[xx][yy] = EL_FLAMES;
if (IN_SCR_FIELD(sx, sy))
+ {
+ DrawLevelFieldCrumbledSand(xx, yy);
DrawGraphic(sx, sy, flame_graphic, frame);
+ }
}
else
{
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 */
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))
{
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) ?
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
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;
}
}
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)
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);
}
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);
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);
}
}
{
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);
{
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);
{
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);
{
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);
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
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);
}
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;
}
{
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;
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;
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
if (button2)
dropped = DropElement(player);
- moved = MoveFigure(player, dx, dy);
+ moved = MovePlayer(player, dx, dy);
}
if (tape.single_step && tape.recording && !tape.pausing)
}
}
+#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);
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;
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;
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);
#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++)
{
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);
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]++;
{
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
#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
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",
{
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]);
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);
}
/*
- 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 */
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;
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,
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;
while (player->MovPos)
{
- ScrollFigure(player, SCROLL_GO_ON);
+ ScrollPlayer(player, SCROLL_GO_ON);
ScrollScreen(NULL, SCROLL_GO_ON);
FrameCounter++;
DrawAllPlayers();
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;
#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
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
{
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);
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;
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);
void TestIfPlayerTouchesCustomElement(int x, int y)
{
-#if 0
- static boolean check_changing = FALSE;
-#endif
static int xy[4][2] =
{
{ 0, -1 },
{ 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 },
{ 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];
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) &&
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)
{
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)
{
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)
{ +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,
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;
{
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))
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;
}
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;
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;
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:
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;
}
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))
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 */
}
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;
}
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);
}
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;
}
!(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 &&
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) ||
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))
{
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;
}
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)
{
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 ||
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)
{
local_player->lights_still_needed--;
DrawLevelField(x, y);
-
-#if 0
- PlaySoundLevel(x, y, SND_LAMP_ACTIVATING);
-#endif
}
else if (element == EL_TIME_ORB_FULL)
{
}
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;
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))
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();
{
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);
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);
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);
#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 */
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];
/* 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] =
/* 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);
}
}
EL_SOKOBAN_FIELD_EMPTY,
EL_EXIT_OPEN,
EL_SP_EXIT_OPEN,
+ EL_SP_EXIT_OPENING,
EL_GATE_1,
EL_GATE_2,
EL_GATE_3,
EL_SP_TERMINAL_ACTIVE,
EL_SP_BUGGY_BASE_ACTIVATING,
EL_SP_BUGGY_BASE_ACTIVE,
+ EL_SP_EXIT_OPENING,
+ EL_SP_EXIT_CLOSING,
-1
};
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) &&
/* ---------- 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) &&
/* "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
}
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);
-#=============================================================================#
-# 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 \
LIBGAME = libgame.a
+# -----------------------------------------------------------------------------
+# build targets
+# -----------------------------------------------------------------------------
+
all: $(LIBGAME)
$(LIBGAME): $(OBJS)
$(RM) $(LIBGAME)
-#-----------------------------------------------------------------------------#
-# development only stuff #
-#-----------------------------------------------------------------------------#
+# -----------------------------------------------------------------------------
+# development only
+# -----------------------------------------------------------------------------
depend:
for i in $(SRCS); do $(CPP) $(CFLAGS) -M $$i; done > .depend
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)
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++)
{
#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",
"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 */
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)
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)
{
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
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)))
{
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);
}
}
#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;
{ 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" },
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;
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;
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
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
#else
artwork_new->identifier = getStringCopy("private");
#endif
- artwork_new->sort_priority = ARTWORKCLASS_USER;
+ artwork_new->sort_priority = ARTWORKCLASS_PRIVATE;
}
else
{
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);
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);
#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
#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
#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)
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();
#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 *);
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 */
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];
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];
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;
"exit",
"-"
},
+ {
+ "sp_exit.opening",
+ "sp_exit",
+ "-"
+ },
+ {
+ "sp_exit.closing",
+ "sp_exit",
+ "-"
+ },
{
"sp_exit_open",
"sp_exit",
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] =
#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
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;
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];
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;
int belt_dir_nr[4];
int switchgate_pos;
int balloon_dir;
+ boolean gravity;
boolean explosions_delayed;
+ boolean envelope_active;
};
struct GlobalInfo
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];
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];
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;
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;
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:
#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
void SendToServer_MovePlayer(byte player_action)
{
- buffer[1] = OP_MOVE_FIGURE;
+ buffer[1] = OP_MOVE_PLAYER;
buffer[2] = player_action;
SendBufferToServer(3);
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;
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:
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()
/* 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++)
{
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;
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,
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
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;
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;
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);
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);
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))
{
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];
/* 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)
#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);
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
}
}
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);
{
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 */