rnd-20131212-1-src
[rocksndiamonds.git] / src / main.h
index bc09a36d9fb4abec2a1e980c43b12ccfa21709c6..9f02e0e6ccb9e4581eed7de6b0eefc61f31f8d18 100644 (file)
 
 #include "libgame/libgame.h"
 #include "game_em/game_em.h"
+#include "game_sp/game_sp.h"
 
 #include "conf_gfx.h"  /* include auto-generated data structure definitions */
 #include "conf_snd.h"  /* include auto-generated data structure definitions */
 #include "conf_mus.h"  /* include auto-generated data structure definitions */
 
+
+#define NEW_TILESIZE                   1
+#define NEW_SCROLL                     1
+
 #define IMG_UNDEFINED                  (-1)
 #define IMG_EMPTY                      IMG_EMPTY_SPACE
-#define IMG_SP_EMPTY                   IMG_SP_EMPTY_SPACE
+#define IMG_SP_EMPTY                   IMG_EMPTY_SPACE
+#define IMG_SP_EMPTY_SPACE             IMG_EMPTY_SPACE
 #define IMG_EXPLOSION                  IMG_DEFAULT_EXPLODING
 #define IMG_CHAR_START                 IMG_CHAR_SPACE
 #define IMG_STEEL_CHAR_START           IMG_STEEL_CHAR_SPACE
 #define SND_UNDEFINED                  (-1)
 #define MUS_UNDEFINED                  (-1)
 
+#if 0
 #define WIN_XSIZE                      672
 #define WIN_YSIZE                      560
+#endif
 
 #define DEFAULT_FULLSCREEN_MODE                "800x600"
 
+#if 0
 #define SCR_FIELDX                     17
 #define SCR_FIELDY                     17
+#endif
 #define MAX_BUF_XSIZE                  (SCR_FIELDX + 2)
 #define MAX_BUF_YSIZE                  (SCR_FIELDY + 2)
 #define MIN_LEV_FIELDX                 3
 #define EP_THROWABLE                   28
 #define EP_CAN_EXPLODE                 29
 #define EP_GRAVITY_REACHABLE           30
+#define EP_DONT_GET_HIT_BY             31
 
 /* values for pre-defined properties */
 /* (from here on, values can be changed by inserting new values) */
                                         PLAYER_BITS_3 | \
                                         PLAYER_BITS_4)
 #define PLAYER_BITS_TRIGGER            (1 << 4)
+#define PLAYER_BITS_ACTION             (1 << 5)
 
 /* values for move directions (bits 0 - 3: basic move directions) */
 #define MV_BIT_PREVIOUS                        4
 #define CP_WHEN_REMOVABLE              4
 #define CP_WHEN_WALKABLE               5
 
-/* values for change actions for custom elements */
+/* values for change actions for custom elements (stored in level file) */
 #define CA_NO_ACTION                   0
 #define CA_EXIT_PLAYER                 1
 #define CA_KILL_PLAYER                 2
 #define CA_SET_CE_SCORE                        15
 #define CA_SET_CE_VALUE                        16
 #define CA_SET_ENGINE_SCAN_MODE                17
+#define CA_SET_PLAYER_INVENTORY                18
+#define CA_SET_CE_ARTWORK              19
+#define CA_SET_LEVEL_RANDOM_SEED       20
 
 #define CA_HEADLINE_LEVEL_ACTIONS      250
 #define CA_HEADLINE_PLAYER_ACTIONS     251
 #define CA_ARG_PLAYER_4                        (CA_ARG_PLAYER + PLAYER_BITS_4)
 #define CA_ARG_PLAYER_ANY              (CA_ARG_PLAYER + PLAYER_BITS_ANY)
 #define CA_ARG_PLAYER_TRIGGER          (CA_ARG_PLAYER + PLAYER_BITS_TRIGGER)
+#define CA_ARG_PLAYER_ACTION           (CA_ARG_PLAYER + PLAYER_BITS_ACTION)
 #define CA_ARG_PLAYER_HEADLINE         (CA_ARG_PLAYER + 999)
 #define CA_ARG_NUMBER                  11000
 #define CA_ARG_NUMBER_MIN              (CA_ARG_NUMBER + 0)
 #define CA_ARG_ELEMENT_RESET           (CA_ARG_ELEMENT + 0)
 #define CA_ARG_ELEMENT_TARGET          (CA_ARG_ELEMENT + 1)
 #define CA_ARG_ELEMENT_TRIGGER         (CA_ARG_ELEMENT + 2)
+#define CA_ARG_ELEMENT_ACTION          (CA_ARG_ELEMENT + 7)
 #define CA_ARG_ELEMENT_HEADLINE                (CA_ARG_ELEMENT + 997)
 #define CA_ARG_ELEMENT_CV_TARGET       (CA_ARG_ELEMENT_TARGET)
 #define CA_ARG_ELEMENT_CV_TRIGGER      (CA_ARG_ELEMENT_TRIGGER)
+#define CA_ARG_ELEMENT_CV_ACTION       (CA_ARG_ELEMENT_ACTION)
 #define CA_ARG_ELEMENT_CV_HEADLINE     (CA_ARG_ELEMENT_HEADLINE)
 #define CA_ARG_ELEMENT_NR_TARGET       (CA_ARG_ELEMENT + 3)
 #define CA_ARG_ELEMENT_NR_TRIGGER      (CA_ARG_ELEMENT + 4)
+#define CA_ARG_ELEMENT_NR_ACTION       (CA_ARG_ELEMENT + 8)
 #define CA_ARG_ELEMENT_NR_HEADLINE     (CA_ARG_ELEMENT + 998)
 #define CA_ARG_ELEMENT_CS_TARGET       (CA_ARG_ELEMENT + 5)
 #define CA_ARG_ELEMENT_CS_TRIGGER      (CA_ARG_ELEMENT + 6)
+#define CA_ARG_ELEMENT_CS_ACTION       (CA_ARG_ELEMENT + 9)
 #define CA_ARG_ELEMENT_CS_HEADLINE     (CA_ARG_ELEMENT + 999)
 #define CA_ARG_SPEED                   13000
 #define CA_ARG_SPEED_NOT_MOVING                (CA_ARG_SPEED + STEPSIZE_NOT_MOVING)
 #define CA_ARG_SCAN_MODE_NORMAL                (CA_ARG_SCAN_MODE + MV_NORMAL)
 #define CA_ARG_SCAN_MODE_REVERSE       (CA_ARG_SCAN_MODE + MV_REVERSE)
 #define CA_ARG_SCAN_MODE_HEADLINE      (CA_ARG_SCAN_MODE + 999)
+#define CA_ARG_INVENTORY               18000
+#define CA_ARG_INVENTORY_RESET         (CA_ARG_INVENTORY + 0)
+#define CA_ARG_INVENTORY_RM_TARGET     (CA_ARG_INVENTORY + 1)
+#define CA_ARG_INVENTORY_RM_TRIGGER    (CA_ARG_INVENTORY + 2)
+#define CA_ARG_INVENTORY_RM_ACTION     (CA_ARG_INVENTORY + 3)
+#define CA_ARG_INVENTORY_RM_FIRST      (CA_ARG_INVENTORY + 4)
+#define CA_ARG_INVENTORY_RM_LAST       (CA_ARG_INVENTORY + 5)
+#define CA_ARG_INVENTORY_RM_ALL                (CA_ARG_INVENTORY + 6)
+#define CA_ARG_INVENTORY_HEADLINE      (CA_ARG_INVENTORY + 998)
+#define CA_ARG_INVENTORY_RM_HEADLINE   (CA_ARG_INVENTORY + 999)
 #define CA_ARG_UNDEFINED               65535
 
 /* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define IS_THROWABLE(e)                HAS_PROPERTY(e, EP_THROWABLE)
 #define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
 #define IS_GRAVITY_REACHABLE(e)        HAS_PROPERTY(e, EP_GRAVITY_REACHABLE)
+#define DONT_GET_HIT_BY(e)     HAS_PROPERTY(e, EP_DONT_GET_HIT_BY)
 
 /* macros for special configurable properties */
 #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
                                 (e) <= EL_EM_GATE_4)
 #define IS_EMC_GATE(e)         ((e) >= EL_EMC_GATE_5 &&                \
                                 (e) <= EL_EMC_GATE_8)
+#define IS_DC_GATE(e)          ((e) == EL_DC_GATE_WHITE)
 #define IS_GATE(e)             (IS_RND_GATE(e) ||                      \
                                 IS_EM_GATE(e) ||                       \
-                                IS_EMC_GATE(e))
+                                IS_EMC_GATE(e) ||                      \
+                                IS_DC_GATE(e))
 #define RND_GATE_NR(e)         ((e) - EL_GATE_1)
 #define EM_GATE_NR(e)          ((e) - EL_EM_GATE_1)
 #define EMC_GATE_NR(e)         ((e) - EL_EMC_GATE_5 + 4)
                                 (e) <= EL_EMC_GATE_8_GRAY)
 #define IS_EMC_GATE_GRAY_ACTIVE(e) ((e) >= EL_EMC_GATE_5_GRAY_ACTIVE &&        \
                                 (e) <= EL_EMC_GATE_8_GRAY_ACTIVE)
+#define IS_DC_GATE_GRAY(e)     ((e) == EL_DC_GATE_WHITE_GRAY)
+#define IS_DC_GATE_GRAY_ACTIVE(e) ((e) == EL_DC_GATE_WHITE_GRAY_ACTIVE)
+
 #define IS_GATE_GRAY(e)                (IS_RND_GATE_GRAY(e) ||                 \
                                 IS_EM_GATE_GRAY(e) ||                  \
-                                IS_EMC_GATE_GRAY(e))
+                                IS_EMC_GATE_GRAY(e) ||                 \
+                                IS_DC_GATE_GRAY(e))
 #define IS_GATE_GRAY_ACTIVE(e) (IS_RND_GATE_GRAY_ACTIVE(e) ||          \
                                 IS_EM_GATE_GRAY_ACTIVE(e) ||           \
-                                IS_EMC_GATE_GRAY_ACTIVE(e))
+                                IS_EMC_GATE_GRAY_ACTIVE(e) ||          \
+                                IS_DC_GATE_GRAY_ACTIVE(e))
 #define RND_GATE_GRAY_NR(e)    ((e) - EL_GATE_1_GRAY)
 #define RND_GATE_GRAY_ACTIVE_NR(e) ((e) - EL_GATE_1_GRAY_ACTIVE)
 #define EM_GATE_GRAY_NR(e)     ((e) - EL_EM_GATE_1_GRAY)
 #define IS_DC_STEELWALL_2(e)   ((e) >= EL_DC_STEELWALL_2_LEFT &&       \
                                 (e) <= EL_DC_STEELWALL_2_SINGLE)
 
+#if 1
+
+#if 1
+#define GFX_ELEMENT(e)         (element_info[e].gfx_element)
+#else
+#define GFX_ELEMENT(e)         (element_info[e].gfx_element ==         \
+                                (element_info[e].use_gfx_element ?     \
+                                 element_info[e].gfx_element : e)  ?   \
+                                element_info[e].gfx_element :          \
+                                element_info[e].gfx_element +          \
+                                0 * printf("::: %d: %d <-> %d\n",      \
+                                           e,                          \
+                                           element_info[e].gfx_element,      \
+                                           element_info[e].use_gfx_element ? \
+                                           element_info[e].gfx_element : e))
+#endif
+
+#else
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
+#endif
 
 /* !!! CHECK THIS !!! */
 #if 1
 #define STD_ELEMENT_CONTENTS   4
 #define MAX_ELEMENT_CONTENTS   8
 
+/* values for initial player inventory */
+#define MIN_INITIAL_INVENTORY_SIZE     1
+#define MAX_INITIAL_INVENTORY_SIZE     8
+
 /* often used screen positions */
+#if 0
 #define SX                     8
 #define SY                     8
 #define REAL_SX                        (SX - 2)
 #define VY                     400
 #define EX                     DX
 #define EY                     (VY - 44)
+#endif
 #define TILESIZE               32
 #define TILEX                  TILESIZE
 #define TILEY                  TILESIZE
+#define TILEX_VAR              TILESIZE_VAR
+#define TILEY_VAR              TILESIZE_VAR
 #define MINI_TILESIZE          (TILESIZE / 2)
 #define MINI_TILEX             MINI_TILESIZE
 #define MINI_TILEY             MINI_TILESIZE
 #define MICRO_TILEY            MICRO_TILESIZE
 #define MIDPOSX                        (SCR_FIELDX / 2)
 #define MIDPOSY                        (SCR_FIELDY / 2)
+#if NEW_TILESIZE
+#if NEW_SCROLL
+#if 0
+#define SXSIZE                 (SCR_FIELDX * TILEX_VAR)
+#define SYSIZE                 (SCR_FIELDY * TILEY_VAR)
+#endif
+#define FXSIZE                 ((2 + SCR_FIELDX + 2) * TILEX_VAR)
+#define FYSIZE                 ((2 + SCR_FIELDY + 2) * TILEY_VAR)
+#else
+#if 0
+#define SXSIZE                 (SCR_FIELDX * TILEX_VAR)
+#define SYSIZE                 (SCR_FIELDY * TILEY_VAR)
+#endif
+#define FXSIZE                 ((SCR_FIELDX + 2) * TILEX_VAR)
+#define FYSIZE                 ((SCR_FIELDY + 2) * TILEY_VAR)
+#endif
+#else
+#if NEW_SCROLL
+#if 0
+#define SXSIZE                 (SCR_FIELDX * TILEX)
+#define SYSIZE                 (SCR_FIELDY * TILEY)
+#endif
+#define FXSIZE                 ((2 + SCR_FIELDX + 2) * TILEX)
+#define FYSIZE                 ((2 + SCR_FIELDY + 2) * TILEY)
+#else
+#if 0
 #define SXSIZE                 (SCR_FIELDX * TILEX)
 #define SYSIZE                 (SCR_FIELDY * TILEY)
+#endif
 #define FXSIZE                 ((SCR_FIELDX + 2) * TILEX)
 #define FYSIZE                 ((SCR_FIELDY + 2) * TILEY)
+#endif
+#endif
 #define DXSIZE                 100
 #define DYSIZE                 280
 #define VXSIZE                 DXSIZE
 #define VYSIZE                 100
 #define EXSIZE                 DXSIZE
 #define EYSIZE                 (VYSIZE + 44)
+#if 0
 #define FULL_SXSIZE            (2 + SXSIZE + 2)
 #define FULL_SYSIZE            (2 + SYSIZE + 2)
+#endif
 #define MICROLEVEL_XSIZE       ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
 #define MICROLEVEL_YSIZE       ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
 #define MICROLEVEL_XPOS                (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2)
 #define MICROLABEL1_YPOS       (MICROLEVEL_YPOS - 36)
 #define MICROLABEL2_YPOS       (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7)
 
+/* values for GfxRedraw */
+#define GFX_REDRAW_NONE                                (0)
+#define GFX_REDRAW_TILE                                (1 << 0)
+#define GFX_REDRAW_TILE_CRUMBLED               (1 << 1)
+#define GFX_REDRAW_TILE_CRUMBLED_NEIGHBOURS    (1 << 2)
+#define GFX_REDRAW_TILE_TWINKLED               (1 << 3)
 
 /* score for elements */
 #define SC_EMERALD             0
 #define EL_QUICKSAND_FAST_EMPTY                861
 #define EL_QUICKSAND_FAST_FULL         862
 
-#define NUM_FILE_ELEMENTS              863
+#define EL_FROM_LEVEL_TEMPLATE         863
+
+#define NUM_FILE_ELEMENTS              864
 
 
 /* "real" (and therefore drawable) runtime elements */
 
 /* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_DEFAULT                0
-#define GFX_SPECIAL_ARG_TITLE_INITIAL  1
-#define GFX_SPECIAL_ARG_TITLE          2
-#define GFX_SPECIAL_ARG_MAIN           3
-#define GFX_SPECIAL_ARG_LEVELS         4
-#define GFX_SPECIAL_ARG_SCORES         5
-#define GFX_SPECIAL_ARG_EDITOR         6
-#define GFX_SPECIAL_ARG_INFO           7
-#define GFX_SPECIAL_ARG_SETUP          8
-#define GFX_SPECIAL_ARG_PLAYING                9
-#define GFX_SPECIAL_ARG_DOOR           10
-#define GFX_SPECIAL_ARG_PANEL          11
-#define GFX_SPECIAL_ARG_PREVIEW                12
-#define GFX_SPECIAL_ARG_CRUMBLED       13
-
-#define NUM_SPECIAL_GFX_ARGS           14
+#define GFX_SPECIAL_ARG_LOADING                1
+#define GFX_SPECIAL_ARG_TITLE_INITIAL  2
+#define GFX_SPECIAL_ARG_TITLE          3
+#define GFX_SPECIAL_ARG_MAIN           4
+#define GFX_SPECIAL_ARG_LEVELS         5
+#define GFX_SPECIAL_ARG_LEVELNR                6
+#define GFX_SPECIAL_ARG_SCORES         7
+#define GFX_SPECIAL_ARG_EDITOR         8
+#define GFX_SPECIAL_ARG_INFO           9
+#define GFX_SPECIAL_ARG_SETUP          10
+#define GFX_SPECIAL_ARG_PLAYING                11
+#define GFX_SPECIAL_ARG_DOOR           12
+#define GFX_SPECIAL_ARG_TAPE           13
+#define GFX_SPECIAL_ARG_PANEL          14
+#define GFX_SPECIAL_ARG_PREVIEW                15
+#define GFX_SPECIAL_ARG_CRUMBLED       16
+
+#define NUM_SPECIAL_GFX_ARGS           17
 
 /* these additional definitions are currently only used for draw offsets */
 #define GFX_SPECIAL_ARG_INFO_MAIN      0
 #define GFX_SPECIAL_ARG_SETUP_SOUND            4
 #define GFX_SPECIAL_ARG_SETUP_ARTWORK          5
 #define GFX_SPECIAL_ARG_SETUP_INPUT            6
-#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_1      7
-#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_2      8
-#define GFX_SPECIAL_ARG_SETUP_CHOOSE_ARTWORK   9
-#define GFX_SPECIAL_ARG_SETUP_CHOOSE_OTHER     10
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS                7
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_1      8
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_2      9
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_3      10
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_4      11
+#define GFX_SPECIAL_ARG_SETUP_CHOOSE_ARTWORK   12
+#define GFX_SPECIAL_ARG_SETUP_CHOOSE_OTHER     13
 
-#define NUM_SPECIAL_GFX_SETUP_ARGS             11
+#define NUM_SPECIAL_GFX_SETUP_ARGS             14
 
 
 /* values for image configuration suffixes */
 #define GFX_ARG_ALIGN                  43
 #define GFX_ARG_VALIGN                 44
 #define GFX_ARG_SORT_PRIORITY          45
+#define GFX_ARG_CLASS                  46
+#define GFX_ARG_STYLE                  47
+#define GFX_ARG_ACTIVE_XOFFSET         48
+#define GFX_ARG_ACTIVE_YOFFSET         49
+#define GFX_ARG_PRESSED_XOFFSET                50
+#define GFX_ARG_PRESSED_YOFFSET                51
 
-#define NUM_GFX_ARGS                   46
+#define NUM_GFX_ARGS                   52
 
 
 /* values for sound configuration suffixes */
 
 /* values for game_status (must match special image configuration suffixes) */
 #define GAME_MODE_DEFAULT              0
-#define GAME_MODE_TITLE_INITIAL                1
-#define GAME_MODE_TITLE                        2
-#define GAME_MODE_MAIN                 3
-#define GAME_MODE_LEVELS               4
-#define GAME_MODE_SCORES               5
-#define GAME_MODE_EDITOR               6
-#define GAME_MODE_INFO                 7
-#define GAME_MODE_SETUP                        8
-#define GAME_MODE_PLAYING              9
-#define GAME_MODE_PSEUDO_DOOR          10
-#define GAME_MODE_PSEUDO_PANEL         11
-#define GAME_MODE_PSEUDO_PREVIEW       12
-#define GAME_MODE_PSEUDO_CRUMBLED      13
+#define GAME_MODE_LOADING              1
+#define GAME_MODE_TITLE_INITIAL                2
+#define GAME_MODE_TITLE                        3
+#define GAME_MODE_MAIN                 4
+#define GAME_MODE_LEVELS               5
+#define GAME_MODE_LEVELNR              6
+#define GAME_MODE_SCORES               7
+#define GAME_MODE_EDITOR               8
+#define GAME_MODE_INFO                 9
+#define GAME_MODE_SETUP                        10
+#define GAME_MODE_PLAYING              11
+#define GAME_MODE_PSEUDO_DOOR          12
+#define GAME_MODE_PSEUDO_TAPE          13
+#define GAME_MODE_PSEUDO_PANEL         14
+#define GAME_MODE_PSEUDO_PREVIEW       15
+#define GAME_MODE_PSEUDO_CRUMBLED      16
 
 /* there are no special config file suffixes for these modes */
-#define GAME_MODE_PSEUDO_TYPENAME      14
-#define GAME_MODE_QUIT                 15
+#define GAME_MODE_PSEUDO_TYPENAME      17
+#define GAME_MODE_QUIT                 18
 
 /* special definitions currently only used for custom artwork configuration */
 #define MUSIC_PREFIX_BACKGROUND                0
 #define NUM_MUSIC_PREFIXES             1
-#define MAX_LEVELS                     1000
 
 /* definitions for demo animation lists */
 #define HELPANIM_LIST_NEXT             -1
 
 /* program information and versioning definitions */
 #define PROGRAM_VERSION_MAJOR          3
-#define PROGRAM_VERSION_MINOR          2
-#define PROGRAM_VERSION_PATCH          4
-#define PROGRAM_VERSION_BUILD          2
+#define PROGRAM_VERSION_MINOR          3
+#define PROGRAM_VERSION_PATCH          1
+#define PROGRAM_VERSION_BUILD          3
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
-#define PROGRAM_COPYRIGHT_STRING       "Copyright ©1995-2007 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING       "Copyright ©1995-2013 by Holger Schemel"
 #define PROGRAM_EMAIL_STRING           "info@artsoft.org"
 #define PROGRAM_WEBSITE_STRING         "http://www.artsoft.org/"
 #define PROGRAM_GAME_BY_STRING         "A Game by Artsoft Entertainment"
 #define PROGRAM_UNIX_DATADIR_STRING    ".rocksndiamonds"
 
-#if CREATE_SPECIAL_EDITION_RND_JUE
+#if defined(CREATE_SPECIAL_EDITION_RND_JUE)
 #undef  PROGRAM_TITLE_STRING
-#define PROGRAM_TITLE_STRING           "R'n'D - Version Jue"
+#define PROGRAM_TITLE_STRING           "R'n'D jue"
 #undef  PROGRAM_UNIX_DATADIR_STRING
-#define PROGRAM_UNIX_DATADIR_STRING    ".rocksndiamonds-jue"
+#define PROGRAM_UNIX_DATADIR_STRING    ".rnd_jue"
 #endif
 
 #define ICON_TITLE_STRING              PROGRAM_TITLE_STRING
 
 #define X11_ICON_FILENAME              "rocks_icon.xbm"
 #define X11_ICONMASK_FILENAME          "rocks_iconmask.xbm"
-#define SDL_ICON_FILENAME              "rocks_icon_32x32.pcx"
+#define SDL_ICON_FILENAME              "RocksIcon32x32.png"
 #define MSDOS_POINTER_FILENAME         "mouse.pcx"
 
 /* file version numbers for resource files (levels, tapes, score, setup, etc.)
 #define GAME_ENGINE_TYPE_UNKNOWN       LEVEL_FILE_TYPE_UNKNOWN
 #define GAME_ENGINE_TYPE_RND           LEVEL_FILE_TYPE_RND
 #define GAME_ENGINE_TYPE_EM            LEVEL_FILE_TYPE_EM
+#define GAME_ENGINE_TYPE_SP            LEVEL_FILE_TYPE_SP
 
-#define NUM_ENGINE_TYPES               3
+#define NUM_ENGINE_TYPES               4
 
 
 struct BorderInfo
@@ -2152,6 +2271,7 @@ struct MenuInfo
   struct TitleFadingInfo leave_menu;
   struct TitleFadingInfo enter_screen[NUM_SPECIAL_GFX_ARGS];
   struct TitleFadingInfo leave_screen[NUM_SPECIAL_GFX_ARGS];
+  struct TitleFadingInfo next_screen;
 
   int sound[NUM_SPECIAL_GFX_ARGS];
   int music[NUM_SPECIAL_GFX_ARGS];
@@ -2180,6 +2300,14 @@ struct PreviewInfo
   int anim_mode;
 };
 
+struct ViewportInfo
+{
+  struct RectWithBorder window;
+  struct RectWithBorder playfield[NUM_SPECIAL_GFX_ARGS];
+  struct RectWithBorder door_1[NUM_SPECIAL_GFX_ARGS];
+  struct RectWithBorder door_2[NUM_SPECIAL_GFX_ARGS];
+};
+
 struct HiScore
 {
   char Name[MAX_PLAYER_NAME_LEN + 1];
@@ -2221,6 +2349,12 @@ struct DateInfo
   int year;
   int month;
   int day;
+
+  enum
+  {
+    DATE_SRC_CLOCK,
+    DATE_SRC_LEVELFILE
+  } src;
 };
 
 struct LevelInfo
@@ -2231,6 +2365,7 @@ struct LevelInfo
 
   /* level stored in native format for the alternative native game engines */
   struct LevelInfo_EM *native_em_level;
+  struct LevelInfo_SP *native_sp_level;
 
   int file_version;    /* file format version the level is stored with    */
   int game_version;    /* game release version the level was created with */
@@ -2249,6 +2384,8 @@ struct LevelInfo
   char name[MAX_LEVEL_NAME_LEN + 1];
   char author[MAX_LEVEL_AUTHOR_LEN + 1];
 
+  int random_seed;
+
   struct EnvelopeInfo envelope[NUM_ENVELOPES];
 
   int score[LEVEL_SCORE_ELEMENTS];
@@ -2309,13 +2446,19 @@ struct LevelInfo
   int initial_player_stepsize[MAX_PLAYERS];    /* initial player speed */
   boolean initial_player_gravity[MAX_PLAYERS];
 
+  boolean use_initial_inventory[MAX_PLAYERS];
+  int initial_inventory_size[MAX_PLAYERS];
+  int initial_inventory_content[MAX_PLAYERS][MAX_INITIAL_INVENTORY_SIZE];
+
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
+  boolean em_explodes_by_fire; /* EM style chain explosion behaviour */
   boolean use_spring_bug;      /* for compatibility with old levels */
   boolean use_time_orb_bug;    /* for compatibility with old levels */
   boolean instant_relocation;  /* no visual delay when relocating player */
   boolean shifted_relocation;  /* no level centering when relocating player */
   boolean can_pass_to_walkable;        /* player can pass to empty or walkable tile */
   boolean grow_into_diggable;  /* amoeba can grow into anything diggable */
+  boolean auto_exit_sokoban;   /* automatically finish solved Sokoban levels */
 
   boolean continuous_snapping; /* repeated snapping without releasing key */
   boolean block_snap_field;    /* snapping blocks field to show animation */
@@ -2332,6 +2475,9 @@ struct LevelInfo
   boolean no_valid_file;       /* set when level file missing or invalid */
 
   boolean changed;             /* set when level was changed in the editor */
+
+  /* runtime flags to handle bugs in old levels (not stored in level file) */
+  boolean use_action_after_change_bug;
 };
 
 struct GlobalInfo
@@ -2343,6 +2489,8 @@ struct GlobalInfo
   char *convert_leveldir;
   int convert_level_nr;
 
+  char *create_images_dir;
+
   int num_toons;
 
   float frames_per_second;
@@ -2355,6 +2503,8 @@ struct GlobalInfo
   int fading_status;
   int fading_type;
 #endif
+
+  boolean use_envelope_request;
 };
 
 struct ElementChangeInfo
@@ -2373,7 +2523,7 @@ struct ElementChangeInfo
   int delay_random;            /* added frame delay before changed (random) */
   int delay_frames;            /* either 1 (frames) or 50 (seconds; 50 fps) */
 
-  int trigger_element;         /* element triggering change */
+  int initial_trigger_element; /* initial element triggering change */
 
   struct Content target_content;/* elements for extended change target */
   boolean use_target_content;  /* use extended change target */
@@ -2388,9 +2538,12 @@ struct ElementChangeInfo
   int action_type;             /* type of action */
   int action_mode;             /* mode of action */
   int action_arg;              /* parameter of action */
+  int action_element;          /* element related to action */
 
   /* ---------- internal values used at runtime when playing ---------- */
 
+  int trigger_element;         /* element triggering change */
+
   /* functions that are called before, while and after the change of an
      element -- currently only used for non-custom elements */
   void (*pre_change_function)(int x, int y);
@@ -2400,6 +2553,7 @@ struct ElementChangeInfo
   short actual_trigger_element;        /* element that actually triggered change */
   int actual_trigger_side;     /* element side that triggered the change */
   int actual_trigger_player;   /* player which actually triggered change */
+  int actual_trigger_player_bits; /* player bits of triggering players */
   int actual_trigger_ce_value; /* CE value of element that triggered change */
   int actual_trigger_ce_score; /* CE score of element that triggered change */
 
@@ -2464,10 +2618,10 @@ struct ElementInfo
 
   /* ---------- special element property values ---------- */
 
-  unsigned long properties[NUM_EP_BITFIELDS];  /* element base properties */
+  unsigned int properties[NUM_EP_BITFIELDS];   /* element base properties */
 
   boolean use_gfx_element;     /* use custom graphic element */
-  int gfx_element;             /* optional custom graphic element */
+  int gfx_element_initial;     /* initial optional custom graphic element */
 
   int access_direction;                /* accessible from which direction */
 
@@ -2518,6 +2672,8 @@ struct ElementInfo
 
   boolean in_group[NUM_GROUP_ELEMENTS];
 
+  int gfx_element;             /* runtime optional custom graphic element */
+
   int collect_score;           /* runtime score value for collecting */
 
   /* count of this element on playfield, calculated after each frame */
@@ -2602,6 +2758,14 @@ struct GraphicInfo
   int align, valign;           /* optional setting for drawing title screens */
   int sort_priority;           /* optional setting for drawing title screens */
 
+  int class;
+  int style;
+
+  int active_xoffset;
+  int active_yoffset;
+  int pressed_xoffset;
+  int pressed_yoffset;
+
   boolean use_image_size;      /* use image size as default width and height */
 
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
@@ -2678,10 +2842,12 @@ struct HelpAnimInfo
 };
 
 
+extern Bitmap                 *bitmap_db_store;
 extern Bitmap                 *bitmap_db_cross;
 extern Bitmap                 *bitmap_db_field;
 extern Bitmap                 *bitmap_db_panel;
 extern Bitmap                 *bitmap_db_door;
+extern Bitmap                 *bitmap_db_toons;
 extern Pixmap                  tile_clipmask[];
 extern DrawBuffer             *fieldbuffer;
 extern DrawBuffer             *drawto_field;
@@ -2697,7 +2863,15 @@ extern SDL_Thread               *server_thread;
 
 extern int                     key_joystick_mapping;
 
+#if 1
+#if NEW_SCROLL
+extern boolean                 redraw[2 + MAX_LEV_FIELDX + 2][2 + MAX_LEV_FIELDY + 2];
+#else
+extern boolean                 redraw[MAX_LEV_FIELDX + 2][MAX_LEV_FIELDY + 2];
+#endif
+#else
 extern boolean                 redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
+#endif
 extern int                     redraw_x1, redraw_y1;
 
 extern short                   Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -2733,6 +2907,7 @@ 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                     GfxRedraw[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 extern int                     ActiveElement[MAX_NUM_ELEMENTS];
 extern int                     ActiveButton[NUM_IMAGE_FILES];
@@ -2741,6 +2916,18 @@ extern int                       ActiveFont[NUM_FONTS];
 extern int                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
 
+extern int                     WIN_XSIZE, WIN_YSIZE;
+extern int                     SCR_FIELDX, SCR_FIELDY;
+extern int                     SX, SY;
+extern int                     REAL_SX, REAL_SY;
+extern int                     DX, DY;
+extern int                     VX, VY;
+extern int                     EX, EY;
+extern int                     dDX, dDY;
+extern int                     SXSIZE, SYSIZE;
+extern int                     FULL_SXSIZE, FULL_SYSIZE;
+extern int                     TILESIZE_VAR;
+
 extern int                     FX, FY;
 extern int                     ScrollStepSize;
 extern int                     ScreenMovDir, ScreenMovPos, ScreenGfxPos;
@@ -2767,6 +2954,7 @@ extern struct HiScore             highscore[];
 extern struct TapeInfo         tape;
 extern struct GlobalInfo       global;
 extern struct BorderInfo       border;
+extern struct ViewportInfo     viewport;
 extern struct TitleFadingInfo  fading;
 extern struct TitleFadingInfo  fading_none;
 extern struct TitleFadingInfo  title_initial_default;
@@ -2776,7 +2964,7 @@ extern struct TitleMessageInfo    titlemessage_initial[];
 extern struct TitleMessageInfo titlemessage_default;
 extern struct TitleMessageInfo titlemessage[];
 extern struct TitleMessageInfo readme;
-extern struct InitInfo         init;
+extern struct InitInfo         init, init_last;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
 extern struct PreviewInfo      preview;
@@ -2794,6 +2982,10 @@ extern struct MusicInfo         *music_info;
 extern struct MusicFileInfo    *music_file_info;
 extern struct HelpAnimInfo     *helpanim_info;
 extern SetupFileHash           *helptext_info;
+extern SetupFileHash          *image_config_hash;
+extern SetupFileHash          *element_token_hash;
+extern SetupFileHash          *graphic_token_hash;
+extern SetupFileHash          *font_token_hash;
 extern struct ConfigTypeInfo   image_config_suffix[];
 extern struct ConfigTypeInfo   sound_config_suffix[];
 extern struct ConfigTypeInfo   music_config_suffix[];