rnd-20070331-1-src
[rocksndiamonds.git] / src / main.h
index 19b7322f27075b9f1a90203908f5eeab0ece330c..32d81de6e43e9fa9a91281378a63033b364718b3 100644 (file)
 #define MAX_LEV_FIELDX                 MAX_PLAYFIELD_WIDTH
 #define MAX_LEV_FIELDY                 MAX_PLAYFIELD_HEIGHT
 
+#define MIN_SCROLL_DELAY               0
+#define STD_SCROLL_DELAY               3
+#define MAX_SCROLL_DELAY               9
+
 #define SCREENX(a)                     ((a) - scroll_x)
 #define SCREENY(a)                     ((a) - scroll_y)
 #define LEVELX(a)                      ((a) + scroll_x)
@@ -72,6 +76,7 @@
 #define IN_SCR_FIELD(x, y)             IN_FIELD_MINMAX(x,y, BX1,BY1, BX2,BY2)
 
 /* values for configurable properties (custom elem's only, else pre-defined) */
+/* (never change these values, as they are stored in level files!) */
 #define EP_DIGGABLE                    0
 #define EP_COLLECTIBLE_ONLY            1
 #define EP_DONT_RUN_INTO               2
 #define EP_GRAVITY_REACHABLE           30
 
 /* values for pre-defined properties */
+/* (from here on, values can be changed by inserting new values) */
 #define EP_PLAYER                      32
 #define EP_CAN_PASS_MAGIC_WALL         33
-#define EP_SWITCHABLE                  34
-#define EP_BD_ELEMENT                  35
-#define EP_SP_ELEMENT                  36
-#define EP_SB_ELEMENT                  37
-#define EP_GEM                         38
-#define EP_FOOD_DARK_YAMYAM            39
-#define EP_FOOD_PENGUIN                        40
-#define EP_FOOD_PIG                    41
-#define EP_HISTORIC_WALL               42
-#define EP_HISTORIC_SOLID              43
-#define EP_CLASSIC_ENEMY               44
-#define EP_BELT                                45
-#define EP_BELT_ACTIVE                 46
-#define EP_BELT_SWITCH                 47
-#define EP_TUBE                                48
-#define EP_KEYGATE                     49
-#define EP_AMOEBOID                    50
-#define EP_AMOEBALIVE                  51
-#define EP_HAS_EDITOR_CONTENT          52
-#define EP_CAN_TURN_EACH_MOVE          53
-#define EP_CAN_GROW                    54
-#define EP_ACTIVE_BOMB                 55
-#define EP_INACTIVE                    56
+#define EP_CAN_PASS_DC_MAGIC_WALL      34
+#define EP_SWITCHABLE                  35
+#define EP_BD_ELEMENT                  36
+#define EP_SP_ELEMENT                  37
+#define EP_SB_ELEMENT                  38
+#define EP_GEM                         39
+#define EP_FOOD_DARK_YAMYAM            40
+#define EP_FOOD_PENGUIN                        41
+#define EP_FOOD_PIG                    42
+#define EP_HISTORIC_WALL               43
+#define EP_HISTORIC_SOLID              44
+#define EP_CLASSIC_ENEMY               45
+#define EP_BELT                                46
+#define EP_BELT_ACTIVE                 47
+#define EP_BELT_SWITCH                 48
+#define EP_TUBE                                49
+#define EP_ACID_POOL                   50
+#define EP_KEYGATE                     51
+#define EP_AMOEBOID                    52
+#define EP_AMOEBALIVE                  53
+#define EP_HAS_EDITOR_CONTENT          54
+#define EP_CAN_TURN_EACH_MOVE          55
+#define EP_CAN_GROW                    56
+#define EP_ACTIVE_BOMB                 57
+#define EP_INACTIVE                    58
 
 /* values for special configurable properties (depending on level settings) */
-#define EP_EM_SLIPPERY_WALL            57
+#define EP_EM_SLIPPERY_WALL            59
 
 /* values for special graphics properties (no effect on game engine) */
-#define EP_GFX_CRUMBLED                        58
+#define EP_GFX_CRUMBLED                        60
 
 /* values for derived properties (determined from properties above) */
-#define EP_ACCESSIBLE_OVER             59
-#define EP_ACCESSIBLE_INSIDE           60
-#define EP_ACCESSIBLE_UNDER            61
-#define EP_WALKABLE                    62
-#define EP_PASSABLE                    63
-#define EP_ACCESSIBLE                  64
-#define EP_COLLECTIBLE                 65
-#define EP_SNAPPABLE                   66
-#define EP_WALL                                67
-#define EP_SOLID_FOR_PUSHING           68
-#define EP_DRAGONFIRE_PROOF            69
-#define EP_EXPLOSION_PROOF             70
-#define EP_CAN_SMASH                   71
-#define EP_EXPLODES_3X3_OLD            72
-#define EP_CAN_EXPLODE_BY_FIRE         73
-#define EP_CAN_EXPLODE_SMASHED         74
-#define EP_CAN_EXPLODE_IMPACT          75
-#define EP_SP_PORT                     76
-#define EP_CAN_EXPLODE_BY_DRAGONFIRE   77
-#define EP_CAN_EXPLODE_BY_EXPLOSION    78
-#define EP_COULD_MOVE_INTO_ACID                79
-#define EP_MAYBE_DONT_COLLIDE_WITH     80
-#define EP_CAN_BE_CLONED_BY_ANDROID    81
+#define EP_ACCESSIBLE_OVER             61
+#define EP_ACCESSIBLE_INSIDE           62
+#define EP_ACCESSIBLE_UNDER            63
+#define EP_WALKABLE                    64
+#define EP_PASSABLE                    65
+#define EP_ACCESSIBLE                  66
+#define EP_COLLECTIBLE                 67
+#define EP_SNAPPABLE                   68
+#define EP_WALL                                69
+#define EP_SOLID_FOR_PUSHING           70
+#define EP_DRAGONFIRE_PROOF            71
+#define EP_EXPLOSION_PROOF             72
+#define EP_CAN_SMASH                   73
+#define EP_EXPLODES_3X3_OLD            74
+#define EP_CAN_EXPLODE_BY_FIRE         75
+#define EP_CAN_EXPLODE_SMASHED         76
+#define EP_CAN_EXPLODE_IMPACT          77
+#define EP_SP_PORT                     78
+#define EP_CAN_EXPLODE_BY_DRAGONFIRE   79
+#define EP_CAN_EXPLODE_BY_EXPLOSION    80
+#define EP_COULD_MOVE_INTO_ACID                81
+#define EP_MAYBE_DONT_COLLIDE_WITH     82
+#define EP_CAN_BE_CLONED_BY_ANDROID    83
 
 /* values for internal purpose only (level editor) */
-#define EP_WALK_TO_OBJECT              82
-#define EP_DEADLY                      83
-#define EP_EDITOR_CASCADE              84
-#define EP_EDITOR_CASCADE_ACTIVE       85
-#define EP_EDITOR_CASCADE_INACTIVE     86
+#define EP_WALK_TO_OBJECT              84
+#define EP_DEADLY                      85
+#define EP_EDITOR_CASCADE              86
+#define EP_EDITOR_CASCADE_ACTIVE       87
+#define EP_EDITOR_CASCADE_INACTIVE     88
 
 /* values for internal purpose only (game engine) */
-#define EP_HAS_ACTION                  87
-#define EP_CAN_CHANGE_OR_HAS_ACTION    88
+#define EP_HAS_ACTION                  89
+#define EP_CAN_CHANGE_OR_HAS_ACTION    90
 
 /* values for internal purpose only (other) */
-#define EP_OBSOLETE                    89
+#define EP_OBSOLETE                    91
 
-#define NUM_ELEMENT_PROPERTIES         90
+#define NUM_ELEMENT_PROPERTIES         92
 
 #define NUM_EP_BITFIELDS               ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE_NR            0
 /* macros for pre-defined properties */
 #define ELEM_IS_PLAYER(e)      HAS_PROPERTY(e, EP_PLAYER)
 #define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
+#define CAN_PASS_DC_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_DC_MAGIC_WALL)
 #define IS_SWITCHABLE(e)       HAS_PROPERTY(e, EP_SWITCHABLE)
 #define IS_BD_ELEMENT(e)       HAS_PROPERTY(e, EP_BD_ELEMENT)
 #define IS_SP_ELEMENT(e)       HAS_PROPERTY(e, EP_SP_ELEMENT)
 #define IS_BELT_ACTIVE(e)      HAS_PROPERTY(e, EP_BELT_ACTIVE)
 #define IS_BELT_SWITCH(e)      HAS_PROPERTY(e, EP_BELT_SWITCH)
 #define IS_TUBE(e)             HAS_PROPERTY(e, EP_TUBE)
+#define IS_ACID_POOL(e)                HAS_PROPERTY(e, EP_ACID_POOL)
 #define IS_KEYGATE(e)          HAS_PROPERTY(e, EP_KEYGATE)
 #define IS_AMOEBOID(e)         HAS_PROPERTY(e, EP_AMOEBOID)
 #define IS_AMOEBALIVE(e)       HAS_PROPERTY(e, EP_AMOEBALIVE)
                                 IS_EM_GATE_GRAY(e) ?  EM_GATE_GRAY_NR(e) :   \
                                 IS_EMC_GATE_GRAY(e) ? EMC_GATE_GRAY_NR(e) : 0)
 
+#define IS_ACID_POOL_OR_ACID(e)        (IS_ACID_POOL(e) || (e) == EL_ACID)
+
+#define IS_EMC_PILLAR(e)       ((e) >= EL_EMC_WALL_1 &&                \
+                                (e) <= EL_EMC_WALL_3)
+#define IS_SP_CHIP(e)          ((e) == EL_SP_CHIP_SINGLE ||            \
+                                (e) == EL_SP_CHIP_LEFT ||              \
+                                (e) == EL_SP_CHIP_RIGHT ||             \
+                                (e) == EL_SP_CHIP_TOP ||               \
+                                (e) == EL_SP_CHIP_BOTTOM)
+#define IS_SP_HARDWARE_BASE(e) ((e) == EL_SP_HARDWARE_BASE_1 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_2 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_3 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_4 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_5 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_6)
+
+#define IS_DC_STEELWALL_2(e)   ((e) >= EL_DC_STEELWALL_2_LEFT &&       \
+                                (e) <= EL_DC_STEELWALL_2_SINGLE)
+
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 
                                 (e) == EL_EMERALD_RED    ? EL_DIAMOND :    \
                                 (e) == EL_EMERALD_PURPLE ? EL_DIAMOND :    \
                                 EL_ROCK)
-#define EL_CHANGED2(e)         ((e) == EL_ROCK           ? EL_BD_DIAMOND : \
+#define EL_CHANGED_BD(e)       ((e) == EL_ROCK           ? EL_BD_DIAMOND : \
                                 (e) == EL_BD_ROCK        ? EL_BD_DIAMOND : \
                                 EL_BD_ROCK)
+#define EL_CHANGED_DC(e)       ((e) == EL_ROCK           ? EL_EMERALD :    \
+                                (e) == EL_BD_ROCK        ? EL_BD_DIAMOND : \
+                                (e) == EL_EMERALD        ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_YELLOW ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_RED    ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_PURPLE ? EL_DIAMOND :    \
+                                (e) == EL_PEARL          ? EL_BOMB    :    \
+                                (e) == EL_CRYSTAL        ? EL_CRYSTAL :    \
+                                EL_ROCK)
 #define IS_DRAWABLE(e)         ((e) < EL_BLOCKED)
 #define IS_NOT_DRAWABLE(e)     ((e) >= EL_BLOCKED)
 #define TAPE_IS_EMPTY(x)       ((x).length == 0)
 
 #define IS_LOOP_SOUND(s)       (sound_info[s].loop)
 
+#define IS_SPECIAL_GFX_ARG(a)  ((a) >= 0 && (a) < NUM_SPECIAL_GFX_ARGS)
+
 #define EL_CASCADE_ACTIVE(e)   (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 : (e))
 #define EL_CASCADE_INACTIVE(e) (IS_EDITOR_CASCADE_ACTIVE(e)   ? (e) - 1 : (e))
 #define EL_CASCADE_TOGGLE(e)   (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 :    \
 #define MAX_ELEMENT_NAME_LEN   32
 #define MAX_TAPES_PER_SET      1024
 #define MAX_SCORE_ENTRIES      100
-#define MAX_NUM_TITLE_SCREENS  5
+#define MAX_NUM_TITLE_IMAGES   5
+#define MAX_NUM_TITLE_MESSAGES 5
 
 #define MAX_NUM_AMOEBA         100
 
 #define EL_CRYSTAL                     257
 #define EL_WALL_PEARL                  258
 #define EL_WALL_CRYSTAL                        259
-#define EL_DOOR_WHITE                  260
-#define EL_DOOR_WHITE_GRAY             261
-#define EL_KEY_WHITE                   262
+#define EL_DC_GATE_WHITE               260
+#define EL_DC_GATE_WHITE_GRAY          261
+#define EL_DC_KEY_WHITE                        262
 #define EL_SHIELD_NORMAL               263
 #define EL_EXTRA_TIME                  264
 #define EL_SWITCHGATE_OPEN             265
 #define EL_EM_STEEL_EXIT_CLOSED                857
 #define EL_EM_STEEL_EXIT_OPEN          858
 
-#define NUM_FILE_ELEMENTS              859
+#define EL_DC_GATE_FAKE_GRAY           859
+
+#define EL_DC_MAGIC_WALL               860
+
+#define EL_QUICKSAND_FAST_EMPTY                861
+#define EL_QUICKSAND_FAST_FULL         862
+
+#define NUM_FILE_ELEMENTS              863
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 40)
 #define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 41)
 #define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 42)
-#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 43)
-#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 44)
-#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 45)
-#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 46)
-#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 47)
-#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 48)
-#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 49)
-#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 50)
-#define EL_EMC_FAKE_GRASS_ACTIVE       (EL_FIRST_RUNTIME_REAL + 51)
-#define EL_GATE_1_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 52)
-#define EL_GATE_2_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 53)
-#define EL_GATE_3_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 54)
-#define EL_GATE_4_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 55)
-#define EL_EM_GATE_1_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 56)
-#define EL_EM_GATE_2_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 57)
-#define EL_EM_GATE_3_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 58)
-#define EL_EM_GATE_4_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 59)
-#define EL_EMC_GATE_5_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 60)
-#define EL_EMC_GATE_6_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 61)
-#define EL_EMC_GATE_7_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 62)
-#define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 63)
-#define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 64)
-#define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 65)
+#define EL_QUICKSAND_FAST_EMPTYING     (EL_FIRST_RUNTIME_REAL + 43)
+#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 44)
+#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 45)
+#define EL_DC_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 46)
+#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 47)
+#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 48)
+#define EL_DC_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 49)
+#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 50)
+#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 51)
+#define EL_DC_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 52)
+#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 53)
+#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 54)
+#define EL_DC_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 55)
+#define EL_EMC_FAKE_GRASS_ACTIVE       (EL_FIRST_RUNTIME_REAL + 56)
+#define EL_GATE_1_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 57)
+#define EL_GATE_2_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 58)
+#define EL_GATE_3_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 59)
+#define EL_GATE_4_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 60)
+#define EL_EM_GATE_1_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 61)
+#define EL_EM_GATE_2_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 62)
+#define EL_EM_GATE_3_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 63)
+#define EL_EM_GATE_4_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 64)
+#define EL_EMC_GATE_5_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 65)
+#define EL_EMC_GATE_6_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 66)
+#define EL_EMC_GATE_7_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 67)
+#define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 68)
+#define EL_DC_GATE_WHITE_GRAY_ACTIVE   (EL_FIRST_RUNTIME_REAL + 69)
+#define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 70)
+#define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 71)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 66)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 72)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define EL_PLAYER_IS_EXPLODING_3       (EL_FIRST_RUNTIME_UNREAL + 14)
 #define EL_PLAYER_IS_EXPLODING_4       (EL_FIRST_RUNTIME_UNREAL + 15)
 #define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 16)
-#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 17)
-#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 18)
-#define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 19)
-#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 20)
-#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 21)
+#define EL_QUICKSAND_FAST_FILLING      (EL_FIRST_RUNTIME_UNREAL + 17)
+#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_DC_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 20)
+#define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 21)
+#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 22)
+#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 23)
 
-#define NUM_RUNTIME_ELEMENTS           (EL_FIRST_RUNTIME_UNREAL + 22)
+#define NUM_RUNTIME_ELEMENTS           (EL_FIRST_RUNTIME_UNREAL + 24)
 
 /* dummy elements (never used as game elements, only used as graphics) */
 #define EL_FIRST_DUMMY                 NUM_RUNTIME_ELEMENTS
 
 /* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_DEFAULT                0
-#define GFX_SPECIAL_ARG_TITLE          1
-#define GFX_SPECIAL_ARG_MESSAGE                2
+#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_INFO_MUSIC     3
 #define GFX_SPECIAL_ARG_INFO_CREDITS   4
 #define GFX_SPECIAL_ARG_INFO_PROGRAM   5
-#define GFX_SPECIAL_ARG_INFO_LEVELSET  6
+#define GFX_SPECIAL_ARG_INFO_VERSION   6
+#define GFX_SPECIAL_ARG_INFO_LEVELSET  7
 
-#define NUM_SPECIAL_GFX_INFO_ARGS      7
+#define NUM_SPECIAL_GFX_INFO_ARGS      8
 
 
 /* values for image configuration suffixes */
 #define GFX_ARG_NAME                   36
 #define GFX_ARG_SCALE_UP_FACTOR                37
 #define GFX_ARG_CLONE_FROM             38
-#define GFX_ARG_FADE_DELAY             39
-#define GFX_ARG_POST_DELAY             40
-#define GFX_ARG_AUTO_DELAY             41
+#define GFX_ARG_FADE_MODE              39
+#define GFX_ARG_FADE_DELAY             40
+#define GFX_ARG_POST_DELAY             41
+#define GFX_ARG_AUTO_DELAY             42
+#define GFX_ARG_ALIGN                  43
+#define GFX_ARG_VALIGN                 44
+#define GFX_ARG_SORT_PRIORITY          45
 
-#define NUM_GFX_ARGS                   42
+#define NUM_GFX_ARGS                   46
 
 
 /* values for sound configuration suffixes */
 #define FONT_LEVEL_NUMBER              32
 #define FONT_TAPE_RECORDER             33
 #define FONT_GAME_INFO                 34
+#define FONT_INFO_ELEMENTS             35
+#define FONT_INFO_LEVELSET             36
 
-#define NUM_FONTS                      35
+#define NUM_FONTS                      37
 #define NUM_INITIAL_FONTS              4
 
 #define FONT_ACTIVE(f)                                                   \
 
 /* values for game_status (must match special image configuration suffixes) */
 #define GAME_MODE_DEFAULT              0
-#define GAME_MODE_TITLE                        1
-#define GAME_MODE_MESSAGE              2
+#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
 
 struct BorderInfo
 {
-  int draw_masked[NUM_SPECIAL_GFX_ARGS];
-};
-
-struct MenuPosInfo
-{
-  int x, y;
-  int width, height;
-  int align;
+  boolean draw_masked[NUM_SPECIAL_GFX_ARGS];
 };
 
 struct MenuMainButtonInfo
@@ -1959,28 +2015,34 @@ struct MenuMainButtonInfo
 
 struct MenuMainTextInfo
 {
-  struct MenuPosInfo name;
-  struct MenuPosInfo levels;
-  struct MenuPosInfo scores;
-  struct MenuPosInfo editor;
-  struct MenuPosInfo info;
-  struct MenuPosInfo game;
-  struct MenuPosInfo setup;
-  struct MenuPosInfo quit;
-
-  struct MenuPosInfo current_level;
-  struct MenuPosInfo first_level;
-  struct MenuPosInfo last_level;
-  struct MenuPosInfo level_info_1;
-  struct MenuPosInfo level_info_2;
-  struct MenuPosInfo title_1;
-  struct MenuPosInfo title_2;
-  struct MenuPosInfo title_3;
+  struct TextPosInfo name;
+  struct TextPosInfo levels;
+  struct TextPosInfo scores;
+  struct TextPosInfo editor;
+  struct TextPosInfo info;
+  struct TextPosInfo game;
+  struct TextPosInfo setup;
+  struct TextPosInfo quit;
+
+  struct TextPosInfo first_level;
+  struct TextPosInfo last_level;
+  struct TextPosInfo level_number;
+  struct TextPosInfo level_info_1;
+  struct TextPosInfo level_info_2;
+  struct TextPosInfo level_name;
+  struct TextPosInfo level_author;
+  struct TextPosInfo level_year;
+  struct TextPosInfo level_imported_from;
+  struct TextPosInfo level_imported_by;
+  struct TextPosInfo level_tested_by;
+  struct TextPosInfo title_1;
+  struct TextPosInfo title_2;
+  struct TextPosInfo title_3;
 };
 
 struct MenuMainInputInfo
 {
-  struct MenuPosInfo name;
+  struct TextPosInfo name;
 };
 
 struct MenuMainInfo
@@ -1990,15 +2052,30 @@ struct MenuMainInfo
   struct MenuMainInputInfo input;
 };
 
-struct TitleInfo
+struct TitleFadingInfo
 {
+  int fade_mode;
   int fade_delay;
   int post_delay;
   int auto_delay;
+};
 
-  int fade_delay_final;
-  int post_delay_final;
-  int auto_delay_final;
+struct TitleMessageInfo
+{
+  int x, y;
+  int width, height;
+  int chars, lines;
+  int align, valign;
+  int font;
+  boolean autowrap;
+  boolean centered;
+  boolean parse_comments;
+  int sort_priority;
+
+  int fade_mode;
+  int fade_delay;
+  int post_delay;
+  int auto_delay;
 };
 
 struct MenuInfo
@@ -2012,9 +2089,9 @@ struct MenuInfo
 
   int list_size[NUM_SPECIAL_GFX_ARGS];
 
-  int fade_delay;
-  int post_delay;
-  int auto_delay;
+  struct TitleFadingInfo enter_menu;
+  struct TitleFadingInfo leave_menu;
+  struct TitleFadingInfo start_item;
 
   int sound[NUM_SPECIAL_GFX_ARGS];
   int music[NUM_SPECIAL_GFX_ARGS];
@@ -2034,7 +2111,7 @@ struct DoorInfo
 struct PreviewInfo
 {
   int x, y;
-  int align;
+  int align, valign;
   int xsize, ysize;
   int xoffset, yoffset;
   int tile_size;
@@ -2059,6 +2136,9 @@ struct EnvelopeInfo
   int xsize;
   int ysize;
 
+  boolean autowrap;
+  boolean centered;
+
   char text[MAX_ENVELOPE_TEXT_LEN + 1];
 };
 
@@ -2173,6 +2253,7 @@ struct LevelInfo
   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 */
 
@@ -2444,9 +2525,12 @@ struct GraphicInfo
 
   int draw_masked;             /* optional setting for drawing envelope gfx */
 
+  int fade_mode;               /* optional setting for drawing title screens */
   int fade_delay;              /* optional setting for drawing title screens */
   int post_delay;              /* optional setting for drawing title screens */
   int auto_delay;              /* optional setting for drawing title screens */
+  int align, valign;           /* optional setting for drawing title screens */
+  int sort_priority;           /* optional setting for drawing title screens */
 
   boolean use_image_size;      /* use image size as default width and height */
 
@@ -2609,7 +2693,15 @@ extern struct HiScore            highscore[];
 extern struct TapeInfo         tape;
 extern struct GlobalInfo       global;
 extern struct BorderInfo       border;
-extern struct TitleInfo                title;
+extern struct TitleFadingInfo  fading;
+extern struct TitleFadingInfo  fading_none;
+extern struct TitleFadingInfo  title_initial_default;
+extern struct TitleFadingInfo  title_default;
+extern struct TitleMessageInfo titlemessage_initial_default;
+extern struct TitleMessageInfo titlemessage_initial[];
+extern struct TitleMessageInfo titlemessage_default;
+extern struct TitleMessageInfo titlemessage[];
+extern struct TitleMessageInfo readme;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
 extern struct PreviewInfo      preview;