added basic support for MM style wall elements in level editor
[rocksndiamonds.git] / src / editor.c
index ca104b8d9b16dd6e74e4c88537cb10ae24a27e55..d73b60c935a3d4a3a711ffb5fe86736d6133033e 100644 (file)
@@ -1618,6 +1618,7 @@ static struct ValueTextInfo options_game_engine_type[] =
   { GAME_ENGINE_TYPE_RND,      "Rocks'n'Diamonds"              },
   { GAME_ENGINE_TYPE_EM,       "Emerald Mine"                  },
   { GAME_ENGINE_TYPE_SP,       "Supaplex"                      },
+  { GAME_ENGINE_TYPE_MM,       "Mirror Magic"                  },
 
   { -1,                                NULL                            }
 };
@@ -4215,6 +4216,116 @@ static int *editor_el_dx_boulderdash_ptr = editor_el_dx_boulderdash;
 static int num_editor_hl_dx_boulderdash = SIZEOF_ARRAY_INT(editor_hl_dx_boulderdash);
 static int num_editor_el_dx_boulderdash = SIZEOF_ARRAY_INT(editor_el_dx_boulderdash);
 
+static int editor_hl_mirror_magic[] =
+{
+  EL_INTERNAL_CASCADE_MM_ACTIVE,
+  EL_CHAR('M'),
+  EL_CHAR('M'),
+  EL_EMPTY,
+};
+
+static int editor_el_mirror_magic[] =
+{
+  EL_MM_MCDUFFIN_RIGHT,
+  EL_MM_MCDUFFIN_UP,
+  EL_MM_MCDUFFIN_LEFT,
+  EL_MM_MCDUFFIN_DOWN,
+
+  EL_MM_MIRROR_START,
+  EL_MM_MIRROR_FIXED_START,
+  EL_MM_POLARISATOR_START,
+  EL_MM_POLARISATOR_CROSS_START,
+
+  EL_MM_BEAMER_RED_START,
+  EL_MM_BEAMER_YELLOW_START,
+  EL_MM_BEAMER_GREEN_START,
+  EL_MM_BEAMER_BLUE_START,
+
+  EL_MM_PRISM,
+  EL_MM_FUSE_ACTIVE,
+  EL_MM_PACMAN_RIGHT,
+  EL_MM_EXIT_CLOSED,
+
+  EL_MM_KETTLE,
+  EL_MM_BOMB,
+  EL_MM_KEY,
+  EL_MM_FUEL_FULL,
+
+  EL_MM_LIGHTBULB,
+  EL_MM_LIGHTBULB_ACTIVE,
+  EL_MM_GRAY_BALL,
+  EL_MM_LIGHTBALL,
+
+  EL_MM_STEEL_WALL,
+  EL_MM_WOODEN_WALL,
+  EL_MM_ICE_WALL,
+  EL_MM_AMOEBA_WALL,
+
+  EL_MM_STEEL_LOCK,
+  EL_MM_WOODEN_LOCK,
+  EL_MM_STEEL_BLOCK,
+  EL_MM_WOODEN_BLOCK,
+
+  EL_MM_STEEL_GRID_FIXED_1,
+  EL_MM_STEEL_GRID_FIXED_2,
+  EL_MM_STEEL_GRID_FIXED_3,
+  EL_MM_STEEL_GRID_FIXED_4,
+
+  EL_MM_WOODEN_GRID_FIXED_1,
+  EL_MM_WOODEN_GRID_FIXED_2,
+  EL_MM_WOODEN_GRID_FIXED_3,
+  EL_MM_WOODEN_GRID_FIXED_4
+};
+static int *editor_hl_mirror_magic_ptr = editor_hl_mirror_magic;
+static int *editor_el_mirror_magic_ptr = editor_el_mirror_magic;
+static int num_editor_hl_mirror_magic = SIZEOF_ARRAY_INT(editor_hl_mirror_magic);
+static int num_editor_el_mirror_magic = SIZEOF_ARRAY_INT(editor_el_mirror_magic);
+
+static int editor_hl_deflektor[] =
+{
+  EL_INTERNAL_CASCADE_DF_ACTIVE,
+  EL_CHAR('D'),
+  EL_CHAR('F'),
+  EL_EMPTY,
+};
+
+static int editor_el_deflektor[] =
+{
+  EL_DF_LASER_RIGHT,
+  EL_DF_LASER_UP,
+  EL_DF_LASER_LEFT,
+  EL_DF_LASER_DOWN,
+
+  EL_DF_RECEIVER_RIGHT,
+  EL_DF_RECEIVER_UP,
+  EL_DF_RECEIVER_LEFT,
+  EL_DF_RECEIVER_DOWN,
+
+  EL_DF_MIRROR_START,
+  EL_DF_MIRROR_ROTATING_START,
+  EL_DF_CELL,
+  EL_DF_MINE,
+
+  EL_DF_FIBRE_OPTIC_RED_1,
+  EL_DF_FIBRE_OPTIC_YELLOW_1,
+  EL_DF_FIBRE_OPTIC_GREEN_1,
+  EL_DF_FIBRE_OPTIC_BLUE_1,
+
+  EL_DF_STEEL_GRID_FIXED_START,
+  EL_DF_STEEL_GRID_ROTATING_START,
+  EL_DF_WOODEN_GRID_FIXED_START,
+  EL_DF_WOODEN_GRID_ROTATING_START,
+
+  EL_DF_STEEL_WALL,
+  EL_DF_WOODEN_WALL,
+  EL_DF_REFRACTOR,
+  EL_EMPTY
+};
+static int *editor_hl_deflektor_ptr = editor_hl_deflektor;
+static int *editor_el_deflektor_ptr = editor_el_deflektor;
+static int num_editor_hl_deflektor = SIZEOF_ARRAY_INT(editor_hl_deflektor);
+static int num_editor_el_deflektor = SIZEOF_ARRAY_INT(editor_el_deflektor);
+
 static int editor_hl_chars[] =
 {
   EL_INTERNAL_CASCADE_CHARS_ACTIVE,
@@ -4911,6 +5022,23 @@ static int num_editor_elements = 0;      /* dynamically determined */
 
 static boolean setup_editor_cascade_never = FALSE;
 
+static boolean setup_editor_el_players                 = TRUE;
+static boolean setup_editor_el_boulderdash             = TRUE;
+static boolean setup_editor_el_emerald_mine            = TRUE;
+static boolean setup_editor_el_emerald_mine_club       = TRUE;
+static boolean setup_editor_el_more                    = TRUE;
+static boolean setup_editor_el_sokoban                 = TRUE;
+static boolean setup_editor_el_supaplex                        = TRUE;
+static boolean setup_editor_el_diamond_caves           = TRUE;
+static boolean setup_editor_el_dx_boulderdash          = TRUE;
+static boolean setup_editor_el_mirror_magic            = TRUE;
+static boolean setup_editor_el_deflektor               = TRUE;
+static boolean setup_editor_el_chars                   = TRUE;
+static boolean setup_editor_el_steel_chars             = TRUE;
+static boolean setup_editor_el_custom                  = TRUE;
+static boolean setup_editor_el_user_defined            = TRUE;
+static boolean setup_editor_el_dynamic                 = TRUE;
+
 static int editor_hl_unused[] = { EL_EMPTY };
 static int *editor_hl_unused_ptr = editor_hl_unused;
 static int num_editor_hl_unused = 0;
@@ -4931,97 +5059,109 @@ static struct
 editor_elements_info[] =
 {
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_players,
     &setup_editor_cascade_never,
     &editor_hl_unused_ptr,             &num_editor_hl_unused,
     &editor_el_players_ptr,            &num_editor_el_players
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_boulderdash,
     &setup.editor_cascade.el_bd,
     &editor_hl_boulderdash_ptr,                &num_editor_hl_boulderdash,
     &editor_el_boulderdash_ptr,                &num_editor_el_boulderdash
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_emerald_mine,
     &setup.editor_cascade.el_em,
     &editor_hl_emerald_mine_ptr,       &num_editor_hl_emerald_mine,
     &editor_el_emerald_mine_ptr,       &num_editor_el_emerald_mine
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_emerald_mine_club,
     &setup.editor_cascade.el_emc,
     &editor_hl_emerald_mine_club_ptr,  &num_editor_hl_emerald_mine_club,
     &editor_el_emerald_mine_club_ptr,  &num_editor_el_emerald_mine_club
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_more,
     &setup.editor_cascade.el_rnd,
     &editor_hl_rnd_ptr,                        &num_editor_hl_rnd,
     &editor_el_rnd_ptr,                        &num_editor_el_rnd
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_sokoban,
     &setup.editor_cascade.el_sb,
     &editor_hl_sokoban_ptr,            &num_editor_hl_sokoban,
     &editor_el_sokoban_ptr,            &num_editor_el_sokoban
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_supaplex,
     &setup.editor_cascade.el_sp,
     &editor_hl_supaplex_ptr,           &num_editor_hl_supaplex,
     &editor_el_supaplex_ptr,           &num_editor_el_supaplex
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_diamond_caves,
     &setup.editor_cascade.el_dc,
     &editor_hl_diamond_caves_ptr,      &num_editor_hl_diamond_caves,
     &editor_el_diamond_caves_ptr,      &num_editor_el_diamond_caves
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_dx_boulderdash,
     &setup.editor_cascade.el_dx,
     &editor_hl_dx_boulderdash_ptr,     &num_editor_hl_dx_boulderdash,
     &editor_el_dx_boulderdash_ptr,     &num_editor_el_dx_boulderdash
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_mirror_magic,
+    &setup.editor_cascade.el_mm,
+    &editor_hl_mirror_magic_ptr,       &num_editor_hl_mirror_magic,
+    &editor_el_mirror_magic_ptr,       &num_editor_el_mirror_magic
+  },
+  {
+    &setup_editor_el_deflektor,
+    &setup.editor_cascade.el_df,
+    &editor_hl_deflektor_ptr,          &num_editor_hl_deflektor,
+    &editor_el_deflektor_ptr,          &num_editor_el_deflektor
+  },
+  {
+    &setup_editor_el_chars,
     &setup.editor_cascade.el_chars,
     &editor_hl_chars_ptr,              &num_editor_hl_chars,
     &editor_el_chars_ptr,              &num_editor_el_chars
   },
   {
-    &setup.editor.el_classic,
+    &setup_editor_el_steel_chars,
     &setup.editor_cascade.el_steel_chars,
     &editor_hl_steel_chars_ptr,                &num_editor_hl_steel_chars,
     &editor_el_steel_chars_ptr,                &num_editor_el_steel_chars
   },
   {
-    &setup.editor.el_custom,
+    &setup_editor_el_custom,
     &setup.editor_cascade.el_ce,
     &editor_hl_custom_ptr,             &num_editor_hl_custom,
     &editor_el_custom_ptr,             &num_editor_el_custom
   },
   {
-    &setup.editor.el_custom,
+    &setup_editor_el_custom,
     &setup.editor_cascade.el_ge,
     &editor_hl_group_ptr,              &num_editor_hl_group,
     &editor_el_group_ptr,              &num_editor_el_group
   },
   {
-    &setup.editor.el_custom,
+    &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_el_user_defined,
     &setup.editor_cascade.el_user,
     &editor_hl_user_defined_ptr,       &num_editor_hl_user_defined,
     &editor_el_user_defined_ptr,       &num_editor_el_user_defined
   },
   {
-    &setup.editor.el_dynamic,
+    &setup_editor_el_dynamic,
     &setup.editor_cascade.el_dynamic,
     &editor_hl_dynamic_ptr,            &num_editor_hl_dynamic,
     &editor_el_dynamic_ptr,            &num_editor_el_dynamic,
@@ -5186,12 +5326,122 @@ static void InitDynamicEditorElementList(int **elements, int *num_elements)
     (*elements)[(*num_elements)++] = EL_EMPTY;
 }
 
+static void ReinitializeElementList_EnableSections()
+{
+  /* default: enable all element sections */
+
+  setup_editor_el_players              = TRUE;
+  setup_editor_el_boulderdash          = TRUE;
+  setup_editor_el_emerald_mine         = TRUE;
+  setup_editor_el_emerald_mine_club    = TRUE;
+  setup_editor_el_more                 = TRUE;
+  setup_editor_el_sokoban              = TRUE;
+  setup_editor_el_supaplex             = TRUE;
+  setup_editor_el_diamond_caves                = TRUE;
+  setup_editor_el_dx_boulderdash       = TRUE;
+  setup_editor_el_mirror_magic         = TRUE;
+  setup_editor_el_deflektor            = TRUE;
+  setup_editor_el_chars                        = TRUE;
+  setup_editor_el_steel_chars          = TRUE;
+
+  setup_editor_el_custom               = TRUE;
+  setup_editor_el_user_defined         = TRUE;
+  setup_editor_el_dynamic              = TRUE;
+
+  /* now disable all element sections not to be displayed */
+
+  if (!setup.editor.el_classic)
+  {
+    setup_editor_el_players            = FALSE;
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_emerald_mine       = FALSE;
+    setup_editor_el_emerald_mine_club  = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+    setup_editor_el_chars              = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+  }
+
+  if (!setup.editor.el_custom)
+  {
+    setup_editor_el_custom             = FALSE;
+  }
+
+  if (!setup.editor.el_user_defined)
+  {
+    setup_editor_el_user_defined       = FALSE;
+  }
+
+  if (!setup.editor.el_dynamic)
+  {
+    setup_editor_el_dynamic            = FALSE;
+  }
+
+  if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+  {
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+  {
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+
+    setup_editor_el_custom             = FALSE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+  {
+    setup_editor_el_players            = FALSE;
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_emerald_mine       = FALSE;
+    setup_editor_el_emerald_mine_club  = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
+    setup_editor_el_mirror_magic       = FALSE;
+    setup_editor_el_deflektor          = FALSE;
+    setup_editor_el_chars              = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+
+    setup_editor_el_custom             = FALSE;
+  }
+  else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+  {
+    setup_editor_el_players            = FALSE;
+    setup_editor_el_boulderdash                = FALSE;
+    setup_editor_el_emerald_mine       = FALSE;
+    setup_editor_el_emerald_mine_club  = FALSE;
+    setup_editor_el_more               = FALSE;
+    setup_editor_el_sokoban            = FALSE;
+    setup_editor_el_supaplex           = FALSE;
+    setup_editor_el_diamond_caves      = FALSE;
+    setup_editor_el_dx_boulderdash     = FALSE;
+    setup_editor_el_steel_chars                = FALSE;
+
+    setup_editor_el_custom             = FALSE;
+  }
+}
+
 static void ReinitializeElementList()
 {
   static boolean initialization_needed = TRUE;
   int pos = 0;
   int i, j;
 
+  ReinitializeElementList_EnableSections();
+
   if (initialization_needed)
   {
     LoadSetup_EditorCascade();         /* load last editor cascade state */
@@ -5236,7 +5486,7 @@ static void ReinitializeElementList()
        Error(ERR_WARN, "editor element %d is runtime element", element);
 
       if (strEqual(getElementInfoText(element), INFOTEXT_UNKNOWN_ELEMENT))
-       Error(ERR_WARN, "no element description for element %d", element);
+       Error(ERR_WARN, "no element description text for element %d", element);
     }
   }
 
@@ -5957,7 +6207,7 @@ static void CreateDrawingAreas()
 
     event_mask =
       GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
-      GD_EVENT_OFF_BORDERS;
+      GD_EVENT_OFF_BORDERS | GD_EVENT_PIXEL_PRECISE;
 
     /* determine horizontal position to the right of specified gadget */
     if (drawingarea_info[i].gadget_id_align != GADGET_ID_NONE)
@@ -7802,7 +8052,8 @@ void CheckElementDescriptions()
 
   for (i = 0; i < NUM_FILE_ELEMENTS; i++)
     if (getElementDescriptionFilename(i) == NULL && !IS_OBSOLETE(i))
-      Error(ERR_WARN, "no element description for element '%s'", EL_NAME(i));
+      Error(ERR_WARN, "no element description file for element '%s'",
+           EL_NAME(i));
 }
 
 static int getMaxEdFieldX(boolean has_scrollbar)
@@ -9885,10 +10136,28 @@ static int getClosedChip(int x, int y)
   return getChipFromOpenDirectionNotEmpty(direction_new, element_old);
 }
 
-static void SetElementSimple(int x, int y, int element, boolean change_level)
+static void SetElementSimpleExt(int x, int y, int dx, int dy, int element,
+                               boolean change_level)
 {
   int sx = x - level_xpos;
   int sy = y - level_ypos;
+  int old_element = Feld[x][y];
+  unsigned int new_bitmask = (dx + 1) << (dy * 2);
+
+  if (IS_MM_WALL_EDITOR(element))
+  {
+    element = map_mm_wall_element_editor(element) | new_bitmask;
+
+    if (IS_MM_WALL(old_element))
+      element |= MM_WALL_BITS(old_element);
+  }
+  else if (IS_MM_WALL(old_element) && element == EL_EMPTY)
+  {
+    int element_changed = old_element & ~new_bitmask;
+
+    if (MM_WALL_BITS(element_changed) != 0)
+      element = element_changed;
+  }
 
   IntelliDrawBuffer[x][y] = element;
 
@@ -9899,6 +10168,11 @@ static void SetElementSimple(int x, int y, int element, boolean change_level)
     DrawEditorElement(sx, sy, element);
 }
 
+static void SetElementSimple(int x, int y, int element, boolean change_level)
+{
+  SetElementSimpleExt(x, y, 0, 0, element, change_level);
+}
+
 static void MergeAndCloseNeighbourElements(int x1, int y1, int *element1,
                                           int x2, int y2, int *element2,
                                           int (*close_function)(int, int),
@@ -10416,25 +10690,26 @@ static void ResetIntelliDraw()
   SetElementIntelliDraw(-1, -1, EL_UNDEFINED, FALSE, -1);
 }
 
-static void SetElementExt(int x, int y, int element, boolean change_level,
-                         int button)
+static void SetElementExt(int x, int y, int dx, int dy, int element,
+                         boolean change_level, int button)
 {
   if (element < 0)
     SetElementSimple(x, y, Feld[x][y], change_level);
   else if (GetKeyModState() & KMOD_Shift)
     SetElementIntelliDraw(x, y, element, change_level, button);
   else
-    SetElementSimple(x, y, element, change_level);
+    SetElementSimpleExt(x, y, dx, dy, element, change_level);
 }
 
 static void SetElement(int x, int y, int element)
 {
-  SetElementExt(x, y, element, TRUE, -1);
+  SetElementExt(x, y, 0, 0, element, TRUE, -1);
 }
 
-static void SetElementButton(int x, int y, int element, int button)
+static void SetElementButton(int x, int y, int dx, int dy, int element,
+                            int button)
 {
-  SetElementExt(x, y, element, TRUE, button);
+  SetElementExt(x, y, dx, dy, element, TRUE, button);
 }
 
 static void DrawLineElement(int sx, int sy, int element, boolean change_level)
@@ -10442,7 +10717,7 @@ static void DrawLineElement(int sx, int sy, int element, boolean change_level)
   int lx = sx + level_xpos;
   int ly = sy + level_ypos;
 
-  SetElementExt(lx, ly, element, change_level, -1);
+  SetElementExt(lx, ly, 0, 0, element, change_level, -1);
 }
 
 static void DrawLine(int from_x, int from_y, int to_x, int to_y,
@@ -11071,6 +11346,8 @@ void WrapLevel(int dx, int dy)
 static void HandleDrawingAreas(struct GadgetInfo *gi)
 {
   static boolean started_inside_drawing_area = FALSE;
+  static int last_sx = -1, last_sy = -1;
+  static int last_sx2 = -1, last_sy2 = -1;
   int id = gi->custom_id;
   int type_id = gi->custom_type_id;
   boolean button_press_event;
@@ -11084,17 +11361,42 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   int min_sx = 0, min_sy = 0;
   int max_sx = gi->drawing.area_xsize - 1, max_sy = gi->drawing.area_ysize - 1;
   int item_xsize = gi->drawing.item_xsize, item_ysize = gi->drawing.item_ysize;
+  int mini_item_xsize = item_xsize / 2, mini_item_ysize = item_ysize / 2;
+  int sx2 = gi->event.mx / mini_item_xsize;
+  int sy2 = gi->event.my / mini_item_ysize;
+  int dx = sx2 % 2;
+  int dy = sy2 % 2;
   int lx = 0, ly = 0;
   int min_lx = 0, min_ly = 0;
   int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
   int x, y;
 
-  /* handle info callback for each invocation of action callback */
-  gi->callback_info(gi);
-
   button_press_event = (gi->event.type == GD_EVENT_PRESSED);
   button_release_event = (gi->event.type == GD_EVENT_RELEASED);
 
+  if (button_release_event)
+  {
+    last_sx = -1;
+    last_sy = -1;
+    last_sx2 = -1;
+    last_sy2 = -1;
+  }
+  else if (!button_press_event)
+  {
+    if ((sx == last_sx && sy == last_sy &&
+        !IS_MM_WALL_EDITOR(new_element) && new_element != EL_EMPTY) ||
+       (sx2 == last_sx2 && sy2 == last_sy2))
+      return;
+  }
+
+  last_sx = sx;
+  last_sy = sy;
+  last_sx2 = sx2;
+  last_sy2 = sy2;
+
+  /* handle info callback for each invocation of action callback */
+  gi->callback_info(gi);
+
   /* make sure to stay inside drawing area boundaries */
   sx = (sx < min_sx ? min_sx : sx > max_sx ? max_sx : sx);
   sy = (sy < min_sy ? min_sy : sy > max_sy ? max_sy : sy);
@@ -11179,7 +11481,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
                  SetElement(x, y, EL_EMPTY);
          }
 
-         SetElementButton(lx, ly, new_element, button);
+         SetElementButton(lx, ly, dx, dy, new_element, button);
        }
       }
       else if (!button_release_event)
@@ -11366,6 +11668,8 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
       LoadLevel(level_nr);
       LoadScore(level_nr);
 
+      SaveLevelSetup_SeriesInfo();
+
       TapeErase();
 
       ResetUndoBuffer();
@@ -11490,6 +11794,12 @@ static void HandleSelectboxGadgets(struct GadgetInfo *gi)
 
     level.changed = TRUE;
   }
+  else if (type_id == ED_SELECTBOX_ID_GAME_ENGINE_TYPE)
+  {
+    /* update element selection list */
+    ReinitializeElementList();
+    ModifyEditorElementList();
+  }
 }
 
 static void HandleTextbuttonGadgets(struct GadgetInfo *gi)