rnd-20060805-5-src
[rocksndiamonds.git] / src / editor.c
index c2ffbcd3dd71397dbb9cbfc4da8edceae1df6556..04c6a46c074c195602a6f778cb0b15f1902c8e5a 100644 (file)
@@ -1026,7 +1026,7 @@ static struct
     NULL,                              " ", "height",
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(6),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
     0,                                 999,
     GADGET_ID_LEVEL_GEMSLIMIT_DOWN,    GADGET_ID_LEVEL_GEMSLIMIT_UP,
     GADGET_ID_LEVEL_GEMSLIMIT_TEXT,    GADGET_ID_NONE,
@@ -1034,7 +1034,7 @@ static struct
     NULL, "number of gems to collect:",        NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(8),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(7),
     0,                                 9999,
     GADGET_ID_LEVEL_TIMELIMIT_DOWN,    GADGET_ID_LEVEL_TIMELIMIT_UP,
     GADGET_ID_LEVEL_TIMELIMIT_TEXT,    GADGET_ID_NONE,
@@ -1042,7 +1042,7 @@ static struct
     "time or step limit to solve level:", NULL, NULL
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(9),
     0,                                 255,
     GADGET_ID_LEVEL_TIMESCORE_DOWN,    GADGET_ID_LEVEL_TIMESCORE_UP,
     GADGET_ID_LEVEL_TIMESCORE_TEXT,    GADGET_ID_NONE,
@@ -1549,8 +1549,10 @@ static struct ValueTextInfo options_change_direct_action[] =
 #endif
   { CE_IMPACT,                 "impact (on something)"         },
   { CE_SMASHED,                        "smashed (from above)"          },
+#if 0
   { CE_VALUE_CHANGES,          "CE value changes"              },
   { CE_SCORE_CHANGES,          "CE score changes"              },
+#endif
   { CE_VALUE_GETS_ZERO,                "CE value gets 0"               },
   { CE_SCORE_GETS_ZERO,                "CE score gets 0"               },
 
@@ -2001,7 +2003,7 @@ static struct
   /* ---------- level and editor settings ---------------------------------- */
 
   {
-    -1,                                        ED_LEVEL_SETTINGS_YPOS(8),
+    -1,                                        ED_LEVEL_SETTINGS_YPOS(7),
     GADGET_ID_TIME_OR_STEPS,           GADGET_ID_LEVEL_TIMELIMIT_UP,
     -1,
     options_time_or_steps,
@@ -2009,7 +2011,7 @@ static struct
     NULL, "(0 => no limit)",           "time or step limit"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(5),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(11),
     GADGET_ID_GAME_ENGINE_TYPE,                GADGET_ID_NONE,
     -1,
     options_game_engine_type,
@@ -2017,7 +2019,7 @@ static struct
     "game engine:", NULL,              "game engine"
   },
   {
-    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(12),
+    ED_LEVEL_SETTINGS_XPOS(0),         ED_LEVEL_SETTINGS_YPOS(10),
     GADGET_ID_WIND_DIRECTION,          GADGET_ID_NONE,
     -1,
     options_wind_direction,
@@ -2032,7 +2034,7 @@ static struct
     GADGET_ID_PLAYER_SPEED,            GADGET_ID_NONE,
     -1,
     options_player_speed,
-    &level.initial_player_stepsize,
+    &level.initial_player_stepsize[0],
     "initial player speed:", NULL,     "initial player speed"
   },
 
@@ -2400,6 +2402,8 @@ static struct
   int gd_x, gd_y;
   int x, y;
   int width, height;
+  int wheel_x, wheel_y;
+  int wheel_width, wheel_height;
   int type;
   int gadget_id;
   char *infotext;
@@ -2409,6 +2413,8 @@ static struct
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
     SX + ED_SCROLL_HORIZONTAL_XPOS,    SY + ED_SCROLL_HORIZONTAL_YPOS,
     ED_SCROLL_HORIZONTAL_XSIZE,                ED_SCROLL_HORIZONTAL_YSIZE,
+    0,                                 0,
+    SX + SXSIZE + SX,                  WIN_YSIZE,
     GD_TYPE_SCROLLBAR_HORIZONTAL,
     GADGET_ID_SCROLL_HORIZONTAL,
     "scroll level editing area horizontally"
@@ -2417,6 +2423,8 @@ static struct
     ED_SCROLLBAR_XPOS,                 ED_SCROLLBAR_YPOS,
     SX + ED_SCROLL_VERTICAL_XPOS,      SY + ED_SCROLL_VERTICAL_YPOS,
     ED_SCROLL_VERTICAL_XSIZE,          ED_SCROLL_VERTICAL_YSIZE,
+    0,                                 0,
+    SX + SXSIZE + SX,                  WIN_YSIZE,
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_VERTICAL,
     "scroll level editing area vertically"
@@ -2425,6 +2433,8 @@ static struct
     ED_SCROLLBAR2_XPOS,                        ED_SCROLLBAR2_YPOS,
     DX + ED_SCROLL2_VERTICAL_XPOS,     DY + ED_SCROLL2_VERTICAL_YPOS,
     ED_SCROLL2_VERTICAL_XSIZE,         ED_SCROLL2_VERTICAL_YSIZE,
+    SX + SXSIZE + SX,                  0,
+    WIN_XSIZE - (SX + SXSIZE + SX),    WIN_YSIZE,
     GD_TYPE_SCROLLBAR_VERTICAL,
     GADGET_ID_SCROLL_LIST_VERTICAL,
     "scroll element list vertically"
@@ -3109,6 +3119,16 @@ static int edit_mode_properties;
 
 static int element_shift = 0;
 
+static int editor_el_players[] =
+{
+  EL_PLAYER_1,
+  EL_PLAYER_2,
+  EL_PLAYER_3,
+  EL_PLAYER_4
+};
+static int *editor_el_players_ptr = editor_el_players;
+static int num_editor_el_players = SIZEOF_ARRAY_INT(editor_el_players);
+
 static int editor_hl_boulderdash[] =
 {
   EL_INTERNAL_CASCADE_BD_ACTIVE,
@@ -3136,6 +3156,34 @@ static int editor_hl_boulderdash[] =
 
 static int editor_el_boulderdash[] =
 {
+#if 1
+  EL_EMPTY,
+  EL_SAND,
+  EL_BD_ROCK,
+  EL_BD_DIAMOND,
+
+  EL_STEELWALL,
+  EL_BD_WALL,
+  EL_BD_EXPANDABLE_WALL,
+  EL_BD_MAGIC_WALL,
+
+  EL_BD_AMOEBA,
+  EL_BD_BUTTERFLY_UP,
+  EL_BD_FIREFLY_UP,
+  EL_EXIT_CLOSED,
+
+  EL_BD_BUTTERFLY_LEFT,
+  EL_BD_FIREFLY_LEFT,
+  EL_BD_BUTTERFLY_RIGHT,
+  EL_BD_FIREFLY_RIGHT,
+
+  EL_EMPTY,
+  EL_BD_BUTTERFLY_DOWN,
+  EL_BD_FIREFLY_DOWN,
+  EL_EXIT_OPEN,
+
+#else
+
   EL_PLAYER_1,
   EL_EMPTY,
   EL_SAND,
@@ -3159,7 +3207,8 @@ static int editor_el_boulderdash[] =
   EL_BD_AMOEBA,
   EL_BD_BUTTERFLY_DOWN,
   EL_BD_FIREFLY_DOWN,
-  EL_EMPTY,
+  EL_BD_EXPANDABLE_WALL,
+#endif
 };
 static int *editor_hl_boulderdash_ptr = editor_hl_boulderdash;
 static int *editor_el_boulderdash_ptr = editor_el_boulderdash;
@@ -3193,13 +3242,71 @@ static int editor_hl_emerald_mine[] =
 
 static int editor_el_emerald_mine[] =
 {
-  EL_PLAYER_1,
-  EL_PLAYER_2,
-  EL_PLAYER_3,
-  EL_PLAYER_4,
+#if 1
+  EL_SAND,
+  EL_ROCK,
+  EL_QUICKSAND_EMPTY,
+  EL_QUICKSAND_FULL,
+
+  EL_STEELWALL,
+  EL_WALL,
+  EL_WALL_SLIPPERY,
+  EL_MAGIC_WALL,
+
+  EL_EMERALD,
+  EL_DIAMOND,
+  EL_NUT,
+  EL_BOMB,
+
+  EL_WALL_EMERALD,
+  EL_WALL_DIAMOND,
+  EL_DYNAMITE,
+  EL_DYNAMITE_ACTIVE,
+
+  EL_YAMYAM,
+  EL_BUG_UP,
+  EL_SPACESHIP_UP,
+  EL_ROBOT,
+
+  EL_BUG_LEFT,
+  EL_SPACESHIP_LEFT,
+  EL_BUG_RIGHT,
+  EL_SPACESHIP_RIGHT,
+
+  EL_ROBOT_WHEEL,
+  EL_BUG_DOWN,
+  EL_SPACESHIP_DOWN,
+  EL_INVISIBLE_WALL,
+
+  EL_ACID_POOL_TOPLEFT,
+  EL_ACID,
+  EL_ACID_POOL_TOPRIGHT,
+  EL_AMOEBA_DROP,
+
+  EL_ACID_POOL_BOTTOMLEFT,
+  EL_ACID_POOL_BOTTOM,
+  EL_ACID_POOL_BOTTOMRIGHT,
+  EL_AMOEBA_WET,
+
+  EL_EM_KEY_1,
+  EL_EM_KEY_2,
+  EL_EM_KEY_3,
+  EL_EM_KEY_4,
+
+  EL_EM_GATE_1,
+  EL_EM_GATE_2,
+  EL_EM_GATE_3,
+  EL_EM_GATE_4,
+
+  EL_EM_GATE_1_GRAY,
+  EL_EM_GATE_2_GRAY,
+  EL_EM_GATE_3_GRAY,
+  EL_EM_GATE_4_GRAY,
+
+#else
 
   EL_PLAYER_1,
-  EL_EMPTY,
+  EL_PLAYER_2,
   EL_SAND,
   EL_ROCK,
 
@@ -3267,6 +3374,7 @@ static int editor_el_emerald_mine[] =
   EL_EM_GATE_2_GRAY,
   EL_EM_GATE_3_GRAY,
   EL_EM_GATE_4_GRAY,
+#endif
 };
 static int *editor_hl_emerald_mine_ptr = editor_hl_emerald_mine;
 static int *editor_el_emerald_mine_ptr = editor_el_emerald_mine;
@@ -3305,6 +3413,84 @@ static int editor_hl_emerald_mine_club[] =
 
 static int editor_el_emerald_mine_club[] =
 {
+#if 1
+  EL_EMC_KEY_5,
+  EL_EMC_KEY_6,
+  EL_EMC_KEY_7,
+  EL_EMC_KEY_8,
+
+  EL_EMC_GATE_5,
+  EL_EMC_GATE_6,
+  EL_EMC_GATE_7,
+  EL_EMC_GATE_8,
+
+  EL_EMC_GATE_5_GRAY,
+  EL_EMC_GATE_6_GRAY,
+  EL_EMC_GATE_7_GRAY,
+  EL_EMC_GATE_8_GRAY,
+
+  EL_EMC_STEELWALL_1,
+  EL_EMC_STEELWALL_2,
+  EL_EMC_STEELWALL_3,
+  EL_EMC_STEELWALL_4,
+
+  EL_EMC_WALL_13,
+  EL_EMC_WALL_14,
+  EL_EMC_WALL_15,
+  EL_EMC_WALL_16,
+
+  EL_EMC_WALL_SLIPPERY_1,
+  EL_EMC_WALL_SLIPPERY_2,
+  EL_EMC_WALL_SLIPPERY_3,
+  EL_EMC_WALL_SLIPPERY_4,
+
+  EL_EMC_WALL_1,
+  EL_EMC_WALL_2,
+  EL_EMC_WALL_3,
+  EL_EMC_WALL_4,
+
+  EL_EMC_WALL_5,
+  EL_EMC_WALL_6,
+  EL_EMC_WALL_7,
+  EL_EMC_WALL_8,
+
+  EL_EMC_WALL_9,
+  EL_EMC_WALL_10,
+  EL_EMC_WALL_11,
+  EL_EMC_WALL_12,
+
+  EL_EMC_GRASS,
+  EL_EMC_FAKE_GRASS,
+  EL_EMC_PLANT,
+  EL_EMC_DRIPPER,
+
+  EL_EMC_MAGIC_BALL,
+  EL_EMC_MAGIC_BALL_SWITCH,
+  EL_SPRING,
+  EL_EMC_SPRING_BUMPER,
+
+  EL_EMC_LENSES,
+  EL_EMC_MAGNIFIER,
+  EL_EM_DYNAMITE,
+  EL_EM_DYNAMITE_ACTIVE,
+
+  EL_BALLOON,
+  EL_YAMYAM_UP,
+  EL_BALLOON_SWITCH_UP,
+  EL_BALLOON_SWITCH_ANY,
+
+  EL_YAMYAM_LEFT,
+  EL_BALLOON_SWITCH_LEFT,
+  EL_YAMYAM_RIGHT,
+  EL_BALLOON_SWITCH_RIGHT,
+
+  EL_EMC_ANDROID,
+  EL_YAMYAM_DOWN,
+  EL_BALLOON_SWITCH_DOWN,
+  EL_BALLOON_SWITCH_NONE,
+
+#else
+
   EL_EMC_KEY_5,
   EL_EMC_KEY_6,
   EL_EMC_KEY_7,
@@ -3384,13 +3570,14 @@ static int editor_el_emerald_mine_club[] =
   EL_YAMYAM_RIGHT,
   EL_YAMYAM_UP,
   EL_YAMYAM_DOWN,
+#endif
 };
 static int *editor_hl_emerald_mine_club_ptr = editor_hl_emerald_mine_club;
 static int *editor_el_emerald_mine_club_ptr = editor_el_emerald_mine_club;
 static int num_editor_hl_emerald_mine_club=SIZEOF_ARRAY_INT(editor_hl_emerald_mine_club);
 static int num_editor_el_emerald_mine_club=SIZEOF_ARRAY_INT(editor_el_emerald_mine_club);
 
-static int editor_hl_more[] =
+static int editor_hl_rnd[] =
 {
   EL_INTERNAL_CASCADE_RND_ACTIVE,
   EL_CHAR('R'),
@@ -3405,8 +3592,9 @@ static int editor_hl_more[] =
 #endif
 };
 
-static int editor_el_more[] =
+static int editor_el_rnd[] =
 {
+#if 1
   EL_KEY_1,
   EL_KEY_2,
   EL_KEY_3,
@@ -3427,7 +3615,94 @@ static int editor_el_more[] =
   EL_ARROW_UP,
   EL_ARROW_DOWN,
 
+  EL_AMOEBA_DEAD,
+  EL_AMOEBA_DRY,
   EL_AMOEBA_FULL,
+  EL_GAME_OF_LIFE,
+
+  EL_EMERALD_YELLOW,
+  EL_EMERALD_RED,
+  EL_EMERALD_PURPLE,
+  EL_BIOMAZE,
+
+  EL_WALL_EMERALD_YELLOW,
+  EL_WALL_EMERALD_RED,
+  EL_WALL_EMERALD_PURPLE,
+  EL_WALL_BD_DIAMOND,
+
+  EL_SPEED_PILL,
+  EL_PACMAN_UP,
+  EL_TIME_ORB_FULL,
+  EL_TIME_ORB_EMPTY,
+
+  EL_PACMAN_LEFT,
+  EL_DARK_YAMYAM,
+  EL_PACMAN_RIGHT,
+  EL_EMPTY,
+
+  EL_BLACK_ORB,
+  EL_PACMAN_DOWN,
+  EL_LAMP,
+  EL_LAMP_ACTIVE,
+
+  EL_DYNABOMB_INCREASE_NUMBER,
+  EL_DYNABOMB_INCREASE_SIZE,
+  EL_DYNABOMB_INCREASE_POWER,
+  EL_STONEBLOCK,
+
+  EL_MOLE,
+  EL_PENGUIN,
+  EL_PIG,
+  EL_DRAGON,
+
+  EL_BUG,
+  EL_MOLE_UP,
+  EL_BD_BUTTERFLY,
+  EL_BD_FIREFLY,
+
+  EL_MOLE_LEFT,
+  EL_SATELLITE,
+  EL_MOLE_RIGHT,
+  EL_PACMAN,
+
+  EL_SPACESHIP,
+  EL_MOLE_DOWN,
+  EL_INVISIBLE_STEELWALL,
+  EL_INVISIBLE_WALL,
+
+  EL_EXPANDABLE_WALL,
+  EL_EXPANDABLE_WALL_HORIZONTAL,
+  EL_EXPANDABLE_WALL_VERTICAL,
+  EL_EXPANDABLE_WALL_ANY,
+
+#else
+
+  EL_KEY_1,
+  EL_KEY_2,
+  EL_KEY_3,
+  EL_KEY_4,
+
+  EL_GATE_1,
+  EL_GATE_2,
+  EL_GATE_3,
+  EL_GATE_4,
+
+  EL_GATE_1_GRAY,
+  EL_GATE_2_GRAY,
+  EL_GATE_3_GRAY,
+  EL_GATE_4_GRAY,
+
+  EL_ARROW_LEFT,
+  EL_ARROW_RIGHT,
+  EL_ARROW_UP,
+  EL_ARROW_DOWN,
+
+  EL_AMOEBA_DEAD,
+  EL_AMOEBA_DRY,
+  EL_AMOEBA_FULL,
+  EL_EMPTY,
+
+  EL_EMPTY,
   EL_EMERALD_YELLOW,
   EL_EMERALD_RED,
   EL_EMERALD_PURPLE,
@@ -3486,11 +3761,12 @@ static int editor_el_more[] =
   EL_INVISIBLE_WALL,
   EL_SPEED_PILL,
   EL_BLACK_ORB,
+#endif
 };
-static int *editor_hl_more_ptr = editor_hl_more;
-static int *editor_el_more_ptr = editor_el_more;
-static int num_editor_hl_more = SIZEOF_ARRAY_INT(editor_hl_more);
-static int num_editor_el_more = SIZEOF_ARRAY_INT(editor_el_more);
+static int *editor_hl_rnd_ptr = editor_hl_rnd;
+static int *editor_el_rnd_ptr = editor_el_rnd;
+static int num_editor_hl_rnd = SIZEOF_ARRAY_INT(editor_hl_rnd);
+static int num_editor_el_rnd = SIZEOF_ARRAY_INT(editor_el_rnd);
 
 static int editor_hl_sokoban[] =
 {
@@ -3546,6 +3822,59 @@ static int editor_hl_supaplex[] =
 
 static int editor_el_supaplex[] =
 {
+#if 1
+  EL_SP_MURPHY,
+  EL_EMPTY,
+  EL_SP_BASE,
+  EL_SP_BUGGY_BASE,
+
+  EL_SP_INFOTRON,
+  EL_SP_ZONK,
+  EL_SP_SNIKSNAK,
+  EL_SP_ELECTRON,
+
+  EL_SP_DISK_RED,
+  EL_SP_DISK_ORANGE,
+  EL_SP_DISK_YELLOW,
+  EL_SP_TERMINAL,
+
+  EL_SP_EXIT_CLOSED,
+  EL_SP_PORT_HORIZONTAL,
+  EL_SP_PORT_VERTICAL,
+  EL_SP_PORT_ANY,
+
+  EL_SP_PORT_LEFT,
+  EL_SP_PORT_RIGHT,
+  EL_SP_PORT_UP,
+  EL_SP_PORT_DOWN,
+
+  EL_SP_GRAVITY_PORT_LEFT,
+  EL_SP_GRAVITY_PORT_RIGHT,
+  EL_SP_GRAVITY_PORT_UP,
+  EL_SP_GRAVITY_PORT_DOWN,
+
+  EL_SP_HARDWARE_GRAY,
+  EL_SP_HARDWARE_GREEN,
+  EL_SP_HARDWARE_BLUE,
+  EL_SP_HARDWARE_RED,
+
+  EL_SP_HARDWARE_BASE_1,
+  EL_SP_HARDWARE_BASE_2,
+  EL_SP_HARDWARE_BASE_3,
+  EL_SP_HARDWARE_BASE_4,
+
+  EL_SP_HARDWARE_BASE_5,
+  EL_SP_HARDWARE_BASE_6,
+  EL_SP_HARDWARE_YELLOW,
+  EL_SP_CHIP_TOP,
+
+  EL_SP_CHIP_SINGLE,
+  EL_SP_CHIP_LEFT,
+  EL_SP_CHIP_RIGHT,
+  EL_SP_CHIP_BOTTOM,
+
+#else
+
 #if 1
   EL_EMPTY,
 #else
@@ -3599,6 +3928,7 @@ static int editor_el_supaplex[] =
   EL_SP_HARDWARE_BASE_6,
   EL_SP_CHIP_TOP,
   EL_SP_CHIP_BOTTOM,
+#endif
 };
 static int *editor_hl_supaplex_ptr = editor_hl_supaplex;
 static int *editor_el_supaplex_ptr = editor_el_supaplex;
@@ -3637,6 +3967,74 @@ static int editor_hl_diamond_caves[] =
 
 static int editor_el_diamond_caves[] =
 {
+#if 1
+  EL_PEARL,
+  EL_CRYSTAL,
+  EL_WALL_PEARL,
+  EL_WALL_CRYSTAL,
+
+  EL_CONVEYOR_BELT_1_LEFT,
+  EL_CONVEYOR_BELT_1_MIDDLE,
+  EL_CONVEYOR_BELT_1_RIGHT,
+  EL_CONVEYOR_BELT_1_SWITCH_MIDDLE,
+
+  EL_CONVEYOR_BELT_2_LEFT,
+  EL_CONVEYOR_BELT_2_MIDDLE,
+  EL_CONVEYOR_BELT_2_RIGHT,
+  EL_CONVEYOR_BELT_2_SWITCH_MIDDLE,
+
+  EL_CONVEYOR_BELT_3_LEFT,
+  EL_CONVEYOR_BELT_3_MIDDLE,
+  EL_CONVEYOR_BELT_3_RIGHT,
+  EL_CONVEYOR_BELT_3_SWITCH_MIDDLE,
+
+  EL_CONVEYOR_BELT_4_LEFT,
+  EL_CONVEYOR_BELT_4_MIDDLE,
+  EL_CONVEYOR_BELT_4_RIGHT,
+  EL_CONVEYOR_BELT_4_SWITCH_MIDDLE,
+
+  EL_CONVEYOR_BELT_1_SWITCH_LEFT,
+  EL_CONVEYOR_BELT_2_SWITCH_LEFT,
+  EL_CONVEYOR_BELT_3_SWITCH_LEFT,
+  EL_CONVEYOR_BELT_4_SWITCH_LEFT,
+
+  EL_CONVEYOR_BELT_1_SWITCH_RIGHT,
+  EL_CONVEYOR_BELT_2_SWITCH_RIGHT,
+  EL_CONVEYOR_BELT_3_SWITCH_RIGHT,
+  EL_CONVEYOR_BELT_4_SWITCH_RIGHT,
+
+  EL_SWITCHGATE_CLOSED,
+  EL_SWITCHGATE_OPEN,
+  EL_SWITCHGATE_SWITCH_UP,
+  EL_SWITCHGATE_SWITCH_DOWN,
+
+  EL_TIMEGATE_CLOSED,
+  EL_TIMEGATE_OPEN,
+  EL_TIMEGATE_SWITCH,
+  EL_EMPTY,
+
+  EL_SIGN_EXCLAMATION,
+  EL_SIGN_STOP,
+  EL_LIGHT_SWITCH,
+  EL_LIGHT_SWITCH_ACTIVE,
+
+  EL_STEELWALL_SLIPPERY,
+  EL_INVISIBLE_SAND,
+  EL_LANDMINE,
+  EL_EMPTY,
+
+  EL_SHIELD_NORMAL,
+  EL_SHIELD_DEADLY,
+  EL_EXTRA_TIME,
+  EL_EMPTY,
+
+  EL_ENVELOPE_1,
+  EL_ENVELOPE_2,
+  EL_ENVELOPE_3,
+  EL_ENVELOPE_4,
+
+#else
+
   EL_PEARL,
   EL_CRYSTAL,
   EL_WALL_PEARL,
@@ -3701,6 +4099,8 @@ static int editor_el_diamond_caves[] =
   EL_SHIELD_DEADLY,
   EL_EXTRA_TIME,
   EL_EMPTY,
+
+#endif
 };
 static int *editor_hl_diamond_caves_ptr = editor_hl_diamond_caves;
 static int *editor_el_diamond_caves_ptr = editor_el_diamond_caves;
@@ -4226,17 +4626,7 @@ static int editor_el_custom[] =
   EL_CUSTOM_START + 252,
   EL_CUSTOM_START + 253,
   EL_CUSTOM_START + 254,
-  EL_CUSTOM_START + 255,
-
-  EL_TRIGGER_PLAYER,
-  EL_TRIGGER_ELEMENT,
-  EL_TRIGGER_CE_VALUE,
-  EL_TRIGGER_CE_SCORE,
-
-  EL_EMPTY,
-  EL_EMPTY,
-  EL_CURRENT_CE_VALUE,
-  EL_CURRENT_CE_SCORE
+  EL_CUSTOM_START + 255
 };
 static int *editor_hl_custom_ptr = editor_hl_custom;
 static int *editor_el_custom_ptr = editor_el_custom;
@@ -4320,6 +4710,51 @@ static int *editor_el_group_ptr = editor_el_group;
 static int num_editor_hl_group = SIZEOF_ARRAY_INT(editor_hl_group);
 static int num_editor_el_group = SIZEOF_ARRAY_INT(editor_el_group);
 
+static int editor_hl_reference[] =
+{
+  EL_INTERNAL_CASCADE_REF_ACTIVE,
+  EL_CHAR('R'),
+  EL_CHAR('E'),
+  EL_CHAR('F')
+};
+
+static int editor_el_reference[] =
+{
+  EL_TRIGGER_PLAYER,
+  EL_TRIGGER_ELEMENT,
+  EL_TRIGGER_CE_VALUE,
+  EL_TRIGGER_CE_SCORE,
+
+  EL_SELF,
+  EL_ANY_ELEMENT,
+  EL_CURRENT_CE_VALUE,
+  EL_CURRENT_CE_SCORE,
+
+  EL_LAST_CE_8,
+  EL_LAST_CE_7,
+  EL_LAST_CE_6,
+  EL_LAST_CE_5,
+
+  EL_LAST_CE_4,
+  EL_LAST_CE_3,
+  EL_LAST_CE_2,
+  EL_LAST_CE_1,
+
+  EL_NEXT_CE_1,
+  EL_NEXT_CE_2,
+  EL_NEXT_CE_3,
+  EL_NEXT_CE_4,
+
+  EL_NEXT_CE_5,
+  EL_NEXT_CE_6,
+  EL_NEXT_CE_7,
+  EL_NEXT_CE_8,
+};
+static int *editor_hl_reference_ptr = editor_hl_reference;
+static int *editor_el_reference_ptr = editor_el_reference;
+static int num_editor_hl_reference = SIZEOF_ARRAY_INT(editor_hl_reference);
+static int num_editor_el_reference = SIZEOF_ARRAY_INT(editor_el_reference);
+
 static int editor_hl_user_defined[] =
 {
   EL_INTERNAL_CASCADE_USER_ACTIVE,
@@ -4376,6 +4811,13 @@ static boolean use_el_empty = FALSE;
 static int *editor_elements = NULL;    /* dynamically allocated */
 static int num_editor_elements = 0;    /* dynamically determined */
 
+static boolean setup_editor_show_always = TRUE;
+static boolean setup_editor_cascade_never = FALSE;
+
+static int editor_hl_unused[] = { EL_EMPTY };
+static int *editor_hl_unused_ptr = editor_hl_unused;
+static int num_editor_hl_unused = 0;
+
 static struct
 {
   boolean *setup_value;
@@ -4391,6 +4833,12 @@ static struct
 }
 editor_elements_info[] =
 {
+  {
+    &setup_editor_show_always,
+    &setup_editor_cascade_never,
+    &editor_hl_unused_ptr,             &num_editor_hl_unused,
+    &editor_el_players_ptr,            &num_editor_el_players
+  },
   {
     &setup.editor.el_boulderdash,
     &setup.editor_cascade.el_bd,
@@ -4412,8 +4860,8 @@ editor_elements_info[] =
   {
     &setup.editor.el_more,
     &setup.editor_cascade.el_rnd,
-    &editor_hl_more_ptr,               &num_editor_hl_more,
-    &editor_el_more_ptr,               &num_editor_el_more
+    &editor_hl_rnd_ptr,                        &num_editor_hl_rnd,
+    &editor_el_rnd_ptr,                        &num_editor_el_rnd
   },
   {
     &setup.editor.el_sokoban,
@@ -4457,6 +4905,12 @@ editor_elements_info[] =
     &editor_hl_group_ptr,              &num_editor_hl_group,
     &editor_el_group_ptr,              &num_editor_el_group
   },
+  {
+    &setup.editor.el_custom,
+    &setup.editor_cascade.el_ref,
+    &editor_hl_reference_ptr,          &num_editor_hl_reference,
+    &editor_el_reference_ptr,          &num_editor_el_reference
+  },
   {
     &setup.editor.el_user_defined,
     &setup.editor_cascade.el_user,
@@ -5714,6 +6168,10 @@ static void CreateScrollbarGadgets()
                      GDI_SCROLLBAR_ITEMS_MAX, items_max,
                      GDI_SCROLLBAR_ITEMS_VISIBLE, items_visible,
                      GDI_SCROLLBAR_ITEM_POSITION, item_position,
+                     GDI_WHEEL_AREA_X, scrollbar_info[i].wheel_x,
+                     GDI_WHEEL_AREA_Y, scrollbar_info[i].wheel_y,
+                     GDI_WHEEL_AREA_WIDTH, scrollbar_info[i].wheel_width,
+                     GDI_WHEEL_AREA_HEIGHT, scrollbar_info[i].wheel_height,
                      GDI_STATE, GD_BUTTON_UNPRESSED,
                      GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y1,
                      GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y2,
@@ -7485,7 +7943,7 @@ static void DrawEnvelopeTextArea(int envelope_nr)
   DrawBackground(gi->x, gi->y, gi->width, gi->height);
 
   if (envelope_nr != -1)
-    textarea_info[id].value = level.envelope_text[envelope_nr];
+    textarea_info[id].value = level.envelope[envelope_nr].text;
 
   ModifyGadget(gi, GDI_AREA_SIZE,
               *counterbutton_info[ED_COUNTER_ID_ENVELOPE_XSIZE].value,
@@ -7814,6 +8272,7 @@ static struct
 
 #if 1
   { EL_TIMEGATE_SWITCH,        &level.time_timegate,           TEXT_DURATION   },
+  { EL_LIGHT_SWITCH,   &level.time_light,              TEXT_DURATION   },
   { EL_LIGHT_SWITCH_ACTIVE, &level.time_light,         TEXT_DURATION   },
   { EL_SHIELD_NORMAL,  &level.shield_normal_time,      TEXT_DURATION   },
   { EL_SHIELD_DEADLY,  &level.shield_deadly_time,      TEXT_DURATION   },
@@ -7947,6 +8406,7 @@ static void DrawPropertiesConfig()
     int player_nr = GET_PLAYER_NR(properties_element);
 
     /* these properties can be set for every player individually */
+
     drawingarea_info[ED_DRAWING_ID_START_ELEMENT].value =
       &level.start_element[player_nr];
     drawingarea_info[ED_DRAWING_ID_ARTWORK_ELEMENT].value =
@@ -7954,7 +8414,6 @@ static void DrawPropertiesConfig()
     drawingarea_info[ED_DRAWING_ID_EXPLOSION_ELEMENT].value =
       &level.explosion_element[player_nr];
 
-    /* these properties can be set for every player individually */
     checkbutton_info[ED_CHECKBUTTON_ID_USE_START_ELEMENT].value =
       &level.use_start_element[player_nr];
     checkbutton_info[ED_CHECKBUTTON_ID_USE_ARTWORK_ELEMENT].value =
@@ -7964,6 +8423,9 @@ static void DrawPropertiesConfig()
     checkbutton_info[ED_CHECKBUTTON_ID_INITIAL_GRAVITY].value =
       &level.initial_player_gravity[player_nr];
 
+    selectbox_info[ED_SELECTBOX_ID_PLAYER_SPEED].value =
+      &level.initial_player_stepsize[player_nr];
+
     MapCheckbuttonGadget(ED_CHECKBUTTON_ID_CAN_FALL_INTO_ACID);
     MapCheckbuttonGadget(properties_element == EL_SP_MURPHY ?
                         ED_CHECKBUTTON_ID_SP_BLOCK_LAST_FIELD :
@@ -8030,8 +8492,8 @@ static void DrawPropertiesConfig()
     int counter2_id = ED_COUNTER_ID_ENVELOPE_YSIZE;
     int envelope_nr = properties_element - EL_ENVELOPE_1;
 
-    counterbutton_info[counter1_id].value = &level.envelope_xsize[envelope_nr];
-    counterbutton_info[counter2_id].value = &level.envelope_ysize[envelope_nr];
+    counterbutton_info[counter1_id].value = &level.envelope[envelope_nr].xsize;
+    counterbutton_info[counter2_id].value = &level.envelope[envelope_nr].ysize;
 
     /* display counter to choose size of envelope text area */
     MapCounterButtons(ED_COUNTER_ID_ENVELOPE_XSIZE);
@@ -8852,11 +9314,20 @@ static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy,
     DrawAreaBorder(sx, sy, sx, sy);
 }
 
+static void CheckLevelBorderElement(boolean redraw_playfield)
+{
+  int last_border_element = BorderElement;
+
+  SetBorderElement();
+
+  if (redraw_playfield && BorderElement != last_border_element)
+    DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+}
+
 static void CopyLevelToUndoBuffer(int mode)
 {
   static boolean accumulated_undo = FALSE;
   boolean new_undo_buffer_position = TRUE;
-  int last_border_element;
   int x, y;
 
   switch (mode)
@@ -8889,10 +9360,7 @@ static void CopyLevelToUndoBuffer(int mode)
       UndoBuffer[undo_buffer_position][x][y] = Feld[x][y];
 
   /* check if drawing operation forces change of border style */
-  last_border_element = BorderElement;
-  SetBorderElement();
-  if (BorderElement != last_border_element)
-    DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+  CheckLevelBorderElement(TRUE);
 
   level.changed = TRUE;
 }
@@ -9778,7 +10246,12 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       for (x = 0; x < lev_fieldx; x++)
        for (y = 0; y < lev_fieldy; y++)
          Feld[x][y] = UndoBuffer[undo_buffer_position][x][y];
-      DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos,level_ypos);
+
+      /* check if undo operation forces change of border style */
+      CheckLevelBorderElement(FALSE);
+
+      DrawMiniLevel(ed_fieldx, ed_fieldy, level_xpos, level_ypos);
+
       break;
 
     case GADGET_ID_INFO:
@@ -10014,15 +10487,20 @@ void HandleLevelEditorKeyInput(Key key)
 
       case KSYM_Insert:
       case KSYM_Delete:
-#if 1
-       /* IS_EDITOR_CASCADE */
+
+       /* this is needed to prevent interference with running "True X-Mouse" */
+       if (GetKeyModStateFromEvents() & KMOD_Control)
+         break;
+
+       /* check for last or next editor cascade block in element list */
        for (i = 0; i < num_editor_elements; i++)
        {
          if ((key == KSYM_Insert && i == element_shift) ||
              (key == KSYM_Delete && new_element_shift > element_shift))
            break;
 
-         if (IS_EDITOR_CASCADE(editor_elements[i]))
+         /* jump to next cascade block (or to start of element list) */
+         if (i == 0 || IS_EDITOR_CASCADE(editor_elements[i]))
            new_element_shift = i;
        }
 
@@ -10038,36 +10516,6 @@ void HandleLevelEditorKeyInput(Key key)
 
        ModifyEditorElementList();
 
-#else
-
-       for (i = 0; i < num_editor_elements; i++)
-       {
-         int e = editor_elements[i];
-
-         if ((key == KSYM_Insert &&
-              (e == EL_INTERNAL_CASCADE_CE ||
-               e == EL_INTERNAL_CASCADE_CE_ACTIVE)) ||
-             (key == KSYM_Delete &&
-              (e == EL_INTERNAL_CASCADE_GE ||
-               e == EL_INTERNAL_CASCADE_GE_ACTIVE)))
-           break;
-       }
-
-       if (i < num_editor_elements)
-       {
-         element_shift = i;
-
-         if (element_shift > num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS)
-           element_shift = num_editor_elements - ED_NUM_ELEMENTLIST_BUTTONS;
-
-         ModifyGadget(level_editor_gadget[GADGET_ID_SCROLL_LIST_VERTICAL],
-                      GDI_SCROLLBAR_ITEM_POSITION,
-                      element_shift / ED_ELEMENTLIST_BUTTONS_HORIZ, GDI_END);
-
-         ModifyEditorElementList();
-       }
-#endif
-
        break;
 
       case KSYM_Escape:
@@ -10088,6 +10536,7 @@ void HandleLevelEditorKeyInput(Key key)
          DrawDrawingWindow();
          edit_mode = ED_MODE_DRAWING;
        }
+
         break;
 
       default: