improved inserting level sketch from clipboard to level editor
authorHolger Schemel <info@artsoft.org>
Sat, 24 Oct 2020 00:50:36 +0000 (02:50 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 24 Oct 2020 00:51:19 +0000 (02:51 +0200)
When pasting a level sketch to the level editor that has been copied
from the R'n'D forum, obsolete (historic) game elements will be mapped
to their current counterparts (just like it is done when loading an
old R'n'D level file). In addition, the corresponding game engine is
auto-detected (if possible) and set accordingly.

src/editor.c
src/files.c
src/files.h
src/main.h

index b7b739f5145bfab4cc27355d7a8a7f20c6e850a4..acd199d5f243ad147ef52a58d3b69dd523ec551f 100644 (file)
@@ -12162,6 +12162,9 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
          ptr++;
        }
 
+       // remap some (historic, now obsolete) elements
+       element = getMappedElement(element);
+
        if (element >= NUM_FILE_ELEMENTS)
          element = EL_UNKNOWN;
 
@@ -12237,6 +12240,36 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
       lev_fieldx = level.fieldx = brush_width;
       lev_fieldy = level.fieldy = brush_height;
 
+      boolean use_em_engine = TRUE;
+      boolean use_sp_engine = TRUE;
+      boolean use_mm_engine = TRUE;
+
+      for (x = 0; x < MAX_LEV_FIELDX; x++)
+      {
+       for (y = 0; y < MAX_LEV_FIELDY; y++)
+       {
+         int element = Tile[x][y];
+
+         if (!IS_EM_ELEMENT(element) && !ELEM_IS_PLAYER(element))
+           use_em_engine = FALSE;
+
+         if (!IS_SP_ELEMENT(element))
+           use_sp_engine = FALSE;
+
+         if (!IS_MM_ELEMENT(element) && element != EL_EMPTY)
+           use_mm_engine = FALSE;
+       }
+      }
+
+      level.game_engine_type = (use_em_engine ? GAME_ENGINE_TYPE_EM :
+                               use_sp_engine ? GAME_ENGINE_TYPE_SP :
+                               use_mm_engine ? GAME_ENGINE_TYPE_MM :
+                               GAME_ENGINE_TYPE_RND);
+
+      // update element selection list
+      ReinitializeElementList();
+      ModifyEditorElementList();
+
       SetBorderElement();
 
       DrawEditModeWindow();
index 706b819e701fa4905d691d8e6cc609703dea37a9..13deca88d15f236b1e7a173b1253051ab3ee57b1 100644 (file)
@@ -2334,7 +2334,7 @@ static void copyLevelFileInfo(struct LevelFileInfo *lfi_from,
 // functions for loading R'n'D level
 // ----------------------------------------------------------------------------
 
-static int getMappedElement(int element)
+int getMappedElement(int element)
 {
   // remap some (historic, now obsolete) elements
 
index ca331ad70e3b089a92244b918df666bdca5e7d82..e324404b36da0739bd41f6ce34fe9b105d77bca4 100644 (file)
@@ -33,6 +33,8 @@ char *getDefaultLevelFilename(int);
 char *getLocalLevelTemplateFilename(void);
 char *getGlobalLevelTemplateFilename(void);
 
+int getMappedElement(int);
+
 void LoadLevelFromFilename(struct LevelInfo *, char *);
 void LoadLevel(int);
 void LoadLevelTemplate(int);
index 9837ffdd8d5d52d5ac7be2c8385073ddd071efde..a10e6468022024de4cf34c3dd4dfcd0a8076316c 100644 (file)
 #define IS_DC_STEELWALL_2(e)   ((e) >= EL_DC_STEELWALL_2_LEFT &&       \
                                 (e) <= EL_DC_STEELWALL_2_SINGLE)
 
+// !!! IMPROVE THIS !!!
+#define IS_EM_ELEMENT(e)       (map_element_EM_to_RND_cave(map_element_RND_to_EM_cave(e)) == (e))
+
 #define MM_WALL_BASE(e)                ((e) & 0xfff0)
 #define MM_WALL_BITS(e)                ((e) & 0x000f)