rnd-20041124-1-src
[rocksndiamonds.git] / src / files.c
index 4b4ddebd95e8b808c7f9005d410d9c64999b42b7..abcf15d20761100b5e14479b9a3acc7985349a7f 100644 (file)
 #define TAPE_COOKIE_TMPL       "ROCKSNDIAMONDS_TAPE_FILE_VERSION_x.x"
 #define SCORE_COOKIE           "ROCKSNDIAMONDS_SCORE_FILE_VERSION_1.2"
 
+static struct
+{
+  int filetype;
+  char *id;
+}
+filetype_id_list[] =
+{
+  { LEVEL_FILE_TYPE_RND,       "RND"   },
+  { LEVEL_FILE_TYPE_BD,                "BD"    },
+  { LEVEL_FILE_TYPE_EM,                "EM"    },
+  { LEVEL_FILE_TYPE_SP,                "SP"    },
+  { LEVEL_FILE_TYPE_DX,                "DX"    },
+  { LEVEL_FILE_TYPE_SB,                "SB"    },
+  { LEVEL_FILE_TYPE_DC,                "DC"    },
+  { -1,                                NULL    },
+};
+
 
 /* ========================================================================= */
 /* level file functions                                                      */
@@ -111,9 +128,10 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change)
 static void setLevelInfoToDefaults(struct LevelInfo *level)
 {
   static boolean clipboard_elements_initialized = FALSE;
-
   int i, j, x, y;
 
+  setLevelInfoToDefaults_EM();
+
   level->native_em_level = &native_em_level;
 
   level->game_engine_type = GAME_ENGINE_TYPE_RND;
@@ -162,6 +180,25 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
   level->use_spring_bug = FALSE;
   level->use_step_counter = FALSE;
 
+  /* values for the new EMC elements */
+  level->android_move_time = 10;
+  level->android_clone_time = 10;
+  level->ball_random = FALSE;
+  level->ball_state_initial = FALSE;
+  level->ball_time = 10;
+  level->lenses_score = 10;
+  level->magnify_score = 10;
+  level->slurp_score = 10;
+  level->lenses_time = 10;
+  level->magnify_time = 10;
+  level->wind_direction_initial = MV_NO_MOVING;
+  for (i = 0; i < NUM_MAGIC_BALL_CONTENTS; i++)
+    for (x = 0; x < 3; x++)
+      for (y = 0; y < 3; y++)
+       level->ball_content[i][x][y] = EL_EMPTY;
+  for (i = 0; i < 16; i++)
+    level->android_array[i] = FALSE;
+
   level->use_custom_template = FALSE;
 
   for (i = 0; i < MAX_LEVEL_NAME_LEN; i++)
@@ -391,34 +428,14 @@ static int getFileTypeFromBasename(char *basename)
   return LEVEL_FILE_TYPE_UNKNOWN;
 }
 
-static char *getSingleLevelBasename(int nr, int type)
+static char *getSingleLevelBasename(int nr)
 {
   static char basename[MAX_FILENAME_LEN];
-  char *level_filename = getStringCopy(leveldir_current->level_filename);
-
-  if (level_filename == NULL)
-    level_filename = getStringCat2("%03d.", LEVELFILE_EXTENSION);
-
-  switch (type)
-  {
-    case LEVEL_FILE_TYPE_RND:
-      if (nr < 0)
-       sprintf(basename, "template.%s", LEVELFILE_EXTENSION);
-      else
-       sprintf(basename, "%03d.%s", nr, LEVELFILE_EXTENSION);
-      break;
-
-    case LEVEL_FILE_TYPE_EM:
-      sprintf(basename, "%d", nr);
-      break;
-
-    case LEVEL_FILE_TYPE_UNKNOWN:
-    default:
-      sprintf(basename, level_filename, nr);
-      break;
-  }
 
-  free(level_filename);
+  if (nr < 0)
+    sprintf(basename, "template.%s", LEVELFILE_EXTENSION);
+  else
+    sprintf(basename, "%03d.%s", nr, LEVELFILE_EXTENSION);
 
   return basename;
 }
@@ -461,9 +478,9 @@ static char *getPackedLevelBasename(int type)
   return basename;
 }
 
-static char *getSingleLevelFilename(int nr, int type)
+static char *getSingleLevelFilename(int nr)
 {
-  return getLevelFilenameFromBasename(getSingleLevelBasename(nr, type));
+  return getLevelFilenameFromBasename(getSingleLevelBasename(nr));
 }
 
 #if 0
@@ -475,9 +492,10 @@ static char *getPackedLevelFilename(int type)
 
 char *getDefaultLevelFilename(int nr)
 {
-  return getSingleLevelFilename(nr, LEVEL_FILE_TYPE_RND);
+  return getSingleLevelFilename(nr);
 }
 
+#if 0
 static void setLevelFileInfo_SingleLevelFilename(struct LevelFileInfo *lfi,
                                                 int type)
 {
@@ -486,6 +504,23 @@ static void setLevelFileInfo_SingleLevelFilename(struct LevelFileInfo *lfi,
   lfi->basename = getSingleLevelBasename(lfi->nr, lfi->type);
   lfi->filename = getLevelFilenameFromBasename(lfi->basename);
 }
+#endif
+
+static void setLevelFileInfo_FormatLevelFilename(struct LevelFileInfo *lfi,
+                                                int type, char *format, ...)
+{
+  static char basename[MAX_FILENAME_LEN];
+  va_list ap;
+
+  va_start(ap, format);
+  vsprintf(basename, format, ap);
+  va_end(ap);
+
+  lfi->type = type;
+  lfi->packed = FALSE;
+  lfi->basename = basename;
+  lfi->filename = getLevelFilenameFromBasename(lfi->basename);
+}
 
 static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi,
                                                 int type)
@@ -496,7 +531,37 @@ static void setLevelFileInfo_PackedLevelFilename(struct LevelFileInfo *lfi,
   lfi->filename = getLevelFilenameFromBasename(lfi->basename);
 }
 
-static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
+static int getFiletypeFromID(char *filetype_id)
+{
+  char *filetype_id_lower;
+  int filetype = LEVEL_FILE_TYPE_UNKNOWN;
+  int i;
+
+  if (filetype_id == NULL)
+    return LEVEL_FILE_TYPE_UNKNOWN;
+
+  filetype_id_lower = getStringToLower(filetype_id);
+
+  for (i = 0; filetype_id_list[i].id != NULL; i++)
+  {
+    char *id_lower = getStringToLower(filetype_id_list[i].id);
+    
+    if (strcmp(filetype_id_lower, id_lower) == 0)
+      filetype = filetype_id_list[i].filetype;
+
+    free(id_lower);
+
+    if (filetype != LEVEL_FILE_TYPE_UNKNOWN)
+      break;
+  }
+
+  free(filetype_id_lower);
+
+  return filetype;
+}
+
+#if 0
+static void OLD_determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
 {
   /* special case: level number is negative => check for level template file */
   if (lfi->nr < 0)
@@ -508,8 +573,11 @@ static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
 
   if (leveldir_current->level_filename != NULL)
   {
+    int filetype = getFiletypeFromID(leveldir_current->level_filetype);
+
     /* check for file name/pattern specified in "levelinfo.conf" */
-    setLevelFileInfo_SingleLevelFilename(lfi, LEVEL_FILE_TYPE_UNKNOWN);
+    setLevelFileInfo_SingleLevelFilename(lfi, filetype);
+
     if (fileExists(lfi->filename))
       return;
   }
@@ -532,6 +600,79 @@ static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
   /* no known level file found -- try to use default values */
   setLevelFileInfo_SingleLevelFilename(lfi, LEVEL_FILE_TYPE_UNKNOWN);
 }
+#endif
+
+static void determineLevelFileInfo_Filename(struct LevelFileInfo *lfi)
+{
+  int nr = lfi->nr;
+
+  /* special case: level number is negative => check for level template file */
+  if (nr < 0)
+  {
+    setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND,
+                                        "template.%s", LEVELFILE_EXTENSION);
+
+    /* no fallback if template file not existing */
+    return;
+  }
+
+  /* special case: check for file name/pattern specified in "levelinfo.conf" */
+  if (leveldir_current->level_filename != NULL)
+  {
+    int filetype = getFiletypeFromID(leveldir_current->level_filetype);
+
+    setLevelFileInfo_FormatLevelFilename(lfi, filetype,
+                                        leveldir_current->level_filename, nr);
+    if (fileExists(lfi->filename))
+      return;
+  }
+
+  /* check for native Rocks'n'Diamonds level file */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND,
+                                      "%03d.%s", nr, LEVELFILE_EXTENSION);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* check for Emerald Mine level file (V1) */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "a%c%c",
+                                      'a' + (nr / 10) % 26, '0' + nr % 10);
+  if (fileExists(lfi->filename))
+    return;
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "A%c%c",
+                                      'A' + (nr / 10) % 26, '0' + nr % 10);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* check for Emerald Mine level file (V2 to V5) */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "%d", nr);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* check for Emerald Mine level file (V6 / single mode) */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "%02ds", nr);
+  if (fileExists(lfi->filename))
+    return;
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "%02dS", nr);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* check for Emerald Mine level file (V6 / teamwork mode) */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "%02dt", nr);
+  if (fileExists(lfi->filename))
+    return;
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_EM, "%02dT", nr);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* check for various packed level file formats */
+  setLevelFileInfo_PackedLevelFilename(lfi, LEVEL_FILE_TYPE_UNKNOWN);
+  if (fileExists(lfi->filename))
+    return;
+
+  /* no known level file found -- use default values (and fail later) */
+  setLevelFileInfo_FormatLevelFilename(lfi, LEVEL_FILE_TYPE_RND,
+                                      "%03d.%s", nr, LEVELFILE_EXTENSION);
+}
 
 static void determineLevelFileInfo_Filetype(struct LevelFileInfo *lfi)
 {
@@ -1767,648 +1908,29 @@ static void OLD_LoadLevelFromFileInfo_EM(struct LevelInfo *level,
 
 #else
 
-static int map_element_RND_to_EM(int element_rnd)
-{
-  static unsigned short mapping_RND_to_EM[NUM_FILE_ELEMENTS];
-  static boolean mapping_initialized = FALSE;
-
-  struct
-  {
-    int element_em;
-    int element_rnd;
-  }
-  mapping_RND_to_EM_list[] =
-  {
-    { Xblank,                  EL_EMPTY                        },
-    { Xstone,                  EL_ROCK                         },
-    { Xnut,                    EL_NUT                          },
-    { Xbug_n,                  EL_BUG_UP                       },
-    { Xbug_e,                  EL_BUG_RIGHT                    },
-    { Xbug_s,                  EL_BUG_DOWN                     },
-    { Xbug_w,                  EL_BUG_LEFT                     },
-    { Xtank_n,                 EL_SPACESHIP_UP                 },
-    { Xtank_e,                 EL_SPACESHIP_RIGHT              },
-    { Xtank_s,                 EL_SPACESHIP_DOWN               },
-    { Xtank_w,                 EL_SPACESHIP_LEFT               },
-    { Xandroid,                        EL_EMC_ANDROID                  },
-    { Xandroid_1_n,            EL_EMC_ANDROID_UP               },
-    { Xandroid_1_e,            EL_EMC_ANDROID_RIGHT            },
-    { Xandroid_1_w,            EL_EMC_ANDROID_LEFT             },
-    { Xandroid_1_s,            EL_EMC_ANDROID_DOWN             },
-    { Xspring,                 EL_SPRING                       },
-    { Xeater_n,                        EL_YAMYAM                       },
-    { Xalien,                  EL_ROBOT                        },
-    { Xemerald,                        EL_EMERALD                      },
-    { Xdiamond,                        EL_DIAMOND                      },
-    { Xdrip_fall,              EL_AMOEBA_DROP                  },
-    { Xbomb,                   EL_BOMB                         },
-    { Xballoon,                        EL_BALLOON                      },
-    { Xgrass,                  EL_EMC_GRASS                    },
-    { Xdirt,                   EL_SAND                         },
-    { Xacid_ne,                        EL_ACID_POOL_TOPRIGHT           },
-    { Xacid_se,                        EL_ACID_POOL_BOTTOMRIGHT        },
-    { Xacid_s,                 EL_ACID_POOL_BOTTOM             },
-    { Xacid_sw,                        EL_ACID_POOL_BOTTOMLEFT         },
-    { Xacid_nw,                        EL_ACID_POOL_TOPLEFT            },
-    { Xacid_1,                 EL_ACID                         },
-    { Xball_1,                 EL_EMC_GENERATOR_BALL           },
-    { Xgrow_ns,                        EL_EMC_GROW                     },
-    { Xwonderwall,             EL_MAGIC_WALL                   },
-    { Xameuba_1,               EL_AMOEBA_WET                   },
-    { Xdoor_1,                 EL_EM_GATE_1                    },
-    { Xdoor_2,                 EL_EM_GATE_2                    },
-    { Xdoor_3,                 EL_EM_GATE_3                    },
-    { Xdoor_4,                 EL_EM_GATE_4                    },
-    { Xdoor_5,                 EL_EMC_GATE_5                   },
-    { Xdoor_6,                 EL_EMC_GATE_6                   },
-    { Xdoor_7,                 EL_EMC_GATE_7                   },
-    { Xdoor_8,                 EL_EMC_GATE_8                   },
-    { Xkey_1,                  EL_EM_KEY_1                     },
-    { Xkey_2,                  EL_EM_KEY_2                     },
-    { Xkey_3,                  EL_EM_KEY_3                     },
-    { Xkey_4,                  EL_EM_KEY_4                     },
-    { Xkey_5,                  EL_EMC_KEY_5                    },
-    { Xkey_6,                  EL_EMC_KEY_6                    },
-    { Xkey_7,                  EL_EMC_KEY_7                    },
-    { Xkey_8,                  EL_EMC_KEY_8                    },
-    { Xwind_n,                 EL_BALLOON_SWITCH_UP            },
-    { Xwind_e,                 EL_BALLOON_SWITCH_RIGHT         },
-    { Xwind_s,                 EL_BALLOON_SWITCH_DOWN          },
-    { Xwind_w,                 EL_BALLOON_SWITCH_LEFT          },
-    { Xwind_nesw,              EL_BALLOON_SWITCH_ANY           },
-    { Xwind_stop,              EL_BALLOON_SWITCH_NONE          },
-    { Xexit,                   EL_EXIT_CLOSED                  },
-    { Xexit_1,                 EL_EXIT_OPEN                    },
-    { Xdynamite,               EL_DYNAMITE                     },
-    { Xdynamite_1,             EL_DYNAMITE_ACTIVE              },
-    { Xbumper,                 EL_EMC_BUMPER                   },
-    { Xwheel,                  EL_ROBOT_WHEEL                  },
-    { Xswitch,                 EL_UNKNOWN                      },
-    { Xsand,                   EL_QUICKSAND_EMPTY              },
-    { Xsand_stone,             EL_QUICKSAND_FULL               },
-    { Xplant,                  EL_EMC_PLANT                    },
-    { Xlenses,                 EL_EMC_LENSES                   },
-    { Xmagnify,                        EL_EMC_MAGNIFY                  },
-    { Xdripper,                        EL_UNKNOWN                      },
-    { Xfake_blank,             EL_INVISIBLE_WALL               },
-    { Xfake_grass,             EL_INVISIBLE_SAND               },
-    { Xfake_door_1,            EL_EM_GATE_1_GRAY               },
-    { Xfake_door_2,            EL_EM_GATE_2_GRAY               },
-    { Xfake_door_3,            EL_EM_GATE_3_GRAY               },
-    { Xfake_door_4,            EL_EM_GATE_4_GRAY               },
-    { Xfake_door_5,            EL_EMC_GATE_5_GRAY              },
-    { Xfake_door_6,            EL_EMC_GATE_6_GRAY              },
-    { Xfake_door_7,            EL_EMC_GATE_7_GRAY              },
-    { Xfake_door_8,            EL_EMC_GATE_8_GRAY              },
-    { Xsteel_1,                        EL_UNKNOWN                      },
-    { Xsteel_2,                        EL_UNKNOWN                      },
-    { Xsteel_3,                        EL_UNKNOWN                      },
-    { Xsteel_4,                        EL_UNKNOWN                      },
-    { Xwall_1,                 EL_UNKNOWN                      },
-    { Xwall_2,                 EL_UNKNOWN                      },
-    { Xwall_3,                 EL_UNKNOWN                      },
-    { Xwall_4,                 EL_UNKNOWN                      },
-    { Xround_wall_1,           EL_UNKNOWN                      },
-    { Xround_wall_2,           EL_UNKNOWN                      },
-    { Xround_wall_3,           EL_UNKNOWN                      },
-    { Xround_wall_4,           EL_UNKNOWN                      },
-    { Xdecor_1,                        EL_UNKNOWN                      },
-    { Xdecor_2,                        EL_UNKNOWN                      },
-    { Xdecor_3,                        EL_UNKNOWN                      },
-    { Xdecor_4,                        EL_UNKNOWN                      },
-    { Xdecor_5,                        EL_UNKNOWN                      },
-    { Xdecor_6,                        EL_UNKNOWN                      },
-    { Xdecor_7,                        EL_UNKNOWN                      },
-    { Xdecor_8,                        EL_UNKNOWN                      },
-    { Xdecor_9,                        EL_UNKNOWN                      },
-    { Xdecor_10,               EL_UNKNOWN                      },
-    { Xdecor_11,               EL_UNKNOWN                      },
-    { Xdecor_12,               EL_UNKNOWN                      },
-    { Xalpha_0,                        EL_CHAR('0')                    },
-    { Xalpha_1,                        EL_CHAR('1')                    },
-    { Xalpha_2,                        EL_CHAR('2')                    },
-    { Xalpha_3,                        EL_CHAR('3')                    },
-    { Xalpha_4,                        EL_CHAR('4')                    },
-    { Xalpha_5,                        EL_CHAR('5')                    },
-    { Xalpha_6,                        EL_CHAR('6')                    },
-    { Xalpha_7,                        EL_CHAR('7')                    },
-    { Xalpha_8,                        EL_CHAR('8')                    },
-    { Xalpha_9,                        EL_CHAR('9')                    },
-    { Xalpha_excla,            EL_CHAR('!')                    },
-    { Xalpha_quote,            EL_CHAR('"')                    },
-    { Xalpha_comma,            EL_CHAR(',')                    },
-    { Xalpha_minus,            EL_CHAR('-')                    },
-    { Xalpha_perio,            EL_CHAR('.')                    },
-    { Xalpha_colon,            EL_CHAR(':')                    },
-    { Xalpha_quest,            EL_CHAR('?')                    },
-    { Xalpha_a,                        EL_CHAR('A')                    },
-    { Xalpha_b,                        EL_CHAR('B')                    },
-    { Xalpha_c,                        EL_CHAR('C')                    },
-    { Xalpha_d,                        EL_CHAR('D')                    },
-    { Xalpha_e,                        EL_CHAR('E')                    },
-    { Xalpha_f,                        EL_CHAR('F')                    },
-    { Xalpha_g,                        EL_CHAR('G')                    },
-    { Xalpha_h,                        EL_CHAR('H')                    },
-    { Xalpha_i,                        EL_CHAR('I')                    },
-    { Xalpha_j,                        EL_CHAR('J')                    },
-    { Xalpha_k,                        EL_CHAR('K')                    },
-    { Xalpha_l,                        EL_CHAR('L')                    },
-    { Xalpha_m,                        EL_CHAR('M')                    },
-    { Xalpha_n,                        EL_CHAR('N')                    },
-    { Xalpha_o,                        EL_CHAR('O')                    },
-    { Xalpha_p,                        EL_CHAR('P')                    },
-    { Xalpha_q,                        EL_CHAR('Q')                    },
-    { Xalpha_r,                        EL_CHAR('R')                    },
-    { Xalpha_s,                        EL_CHAR('S')                    },
-    { Xalpha_t,                        EL_CHAR('T')                    },
-    { Xalpha_u,                        EL_CHAR('U')                    },
-    { Xalpha_v,                        EL_CHAR('V')                    },
-    { Xalpha_w,                        EL_CHAR('W')                    },
-    { Xalpha_x,                        EL_CHAR('X')                    },
-    { Xalpha_y,                        EL_CHAR('Y')                    },
-    { Xalpha_z,                        EL_CHAR('Z')                    },
-    { Xalpha_arrow_e,          EL_CHAR('>')                    },
-    { Xalpha_arrow_w,          EL_CHAR('<')                    },
-    { Xalpha_copyr,            EL_CHAR('©')                    },
-
-    { Zplayer,                 EL_PLAYER_1                     },
-    { Zplayer,                 EL_PLAYER_2                     },
-    { Zplayer,                 EL_PLAYER_3                     },
-    { Zplayer,                 EL_PLAYER_4                     },
-
-    { ZBORDER,                 EL_EMC_LEVEL_BORDER             },
-
-    { -1,                      -1                              }
-  };
-
-  if (!mapping_initialized)
-  {
-    int i;
-
-    /* return "Xalpha_quest" for all undefined elements in mapping array */
-    for (i = 0; i < NUM_FILE_ELEMENTS; i++)
-      mapping_RND_to_EM[i] = Xalpha_quest;
-
-    for (i = 0; mapping_RND_to_EM_list[i].element_rnd != -1; i++)
-      mapping_RND_to_EM[mapping_RND_to_EM_list[i].element_rnd] =
-       mapping_RND_to_EM_list[i].element_em;
-
-    mapping_initialized = TRUE;
-  }
-
-  if (element_rnd >= 0 && element_rnd < NUM_FILE_ELEMENTS)
-    return mapping_RND_to_EM[element_rnd];
-
-  Error(ERR_WARN, "invalid RND level element %d", element_rnd);
-
-  return EL_UNKNOWN;
-}
-
-static int map_element_EM_to_RND(int element_em)
-{
-  static unsigned short mapping_EM_to_RND[TILE_MAX];
-  static boolean mapping_initialized = FALSE;
-
-  struct
-  {
-    int element_em;
-    int element_rnd;
-  }
-  mapping_EM_to_RND_list[] =
-  {
-    { Xblank,                  EL_EMPTY                        },
-    { Yacid_splash_eB,         EL_EMPTY                        },
-    { Yacid_splash_wB,         EL_EMPTY                        },
-
-#ifdef EM_ENGINE_BAD_ROLL
-    { Xstone_force_e,          EL_ROCK                         },
-    { Xstone_force_w,          EL_ROCK                         },
-    { Xnut_force_e,            EL_NUT                          },
-    { Xnut_force_w,            EL_NUT                          },
-    { Xspring_force_e,         EL_SPRING                       },
-    { Xspring_force_w,         EL_SPRING                       },
-    { Xemerald_force_e,                EL_EMERALD                      },
-    { Xemerald_force_w,                EL_EMERALD                      },
-    { Xdiamond_force_e,                EL_DIAMOND                      },
-    { Xdiamond_force_w,                EL_DIAMOND                      },
-    { Xbomb_force_e,           EL_BOMB                         },
-    { Xbomb_force_w,           EL_BOMB                         },
-#endif
-
-    { Xstone,                  EL_ROCK                         },
-    { Xstone_pause,            EL_ROCK                         },
-    { Xstone_fall,             EL_ROCK                         },
-    { Ystone_s,                        EL_ROCK                         },
-    { Ystone_sB,               EL_ROCK                         },
-    { Ystone_e,                        EL_ROCK                         },
-    { Ystone_eB,               EL_ROCK                         },
-    { Ystone_w,                        EL_ROCK                         },
-    { Ystone_wB,               EL_ROCK                         },
-    { Xnut,                    EL_NUT                          },
-    { Xnut_pause,              EL_NUT                          },
-    { Xnut_fall,               EL_NUT                          },
-    { Ynut_s,                  EL_NUT                          },
-    { Ynut_sB,                 EL_NUT                          },
-    { Ynut_e,                  EL_NUT                          },
-    { Ynut_eB,                 EL_NUT                          },
-    { Ynut_w,                  EL_NUT                          },
-    { Ynut_wB,                 EL_NUT                          },
-    { Xbug_n,                  EL_BUG_UP                       },
-    { Xbug_e,                  EL_BUG_RIGHT                    },
-    { Xbug_s,                  EL_BUG_DOWN                     },
-    { Xbug_w,                  EL_BUG_LEFT                     },
-    { Xbug_gon,                        EL_BUG_UP                       },
-    { Xbug_goe,                        EL_BUG_RIGHT                    },
-    { Xbug_gos,                        EL_BUG_DOWN                     },
-    { Xbug_gow,                        EL_BUG_LEFT                     },
-    { Ybug_n,                  EL_BUG_UP                       },
-    { Ybug_nB,                 EL_BUG_UP                       },
-    { Ybug_e,                  EL_BUG_RIGHT                    },
-    { Ybug_eB,                 EL_BUG_RIGHT                    },
-    { Ybug_s,                  EL_BUG_DOWN                     },
-    { Ybug_sB,                 EL_BUG_DOWN                     },
-    { Ybug_w,                  EL_BUG_LEFT                     },
-    { Ybug_wB,                 EL_BUG_LEFT                     },
-    { Ybug_w_n,                        EL_BUG_UP                       },
-    { Ybug_n_e,                        EL_BUG_RIGHT                    },
-    { Ybug_e_s,                        EL_BUG_DOWN                     },
-    { Ybug_s_w,                        EL_BUG_LEFT                     },
-    { Ybug_e_n,                        EL_BUG_UP                       },
-    { Ybug_s_e,                        EL_BUG_RIGHT                    },
-    { Ybug_w_s,                        EL_BUG_DOWN                     },
-    { Ybug_n_w,                        EL_BUG_LEFT                     },
-    { Ybug_stone,              EL_ROCK                         },
-    { Ybug_spring,             EL_SPRING                       },
-    { Xtank_n,                 EL_SPACESHIP_UP                 },
-    { Xtank_e,                 EL_SPACESHIP_RIGHT              },
-    { Xtank_s,                 EL_SPACESHIP_DOWN               },
-    { Xtank_w,                 EL_SPACESHIP_LEFT               },
-    { Xtank_gon,               EL_SPACESHIP_UP                 },
-    { Xtank_goe,               EL_SPACESHIP_RIGHT              },
-    { Xtank_gos,               EL_SPACESHIP_DOWN               },
-    { Xtank_gow,               EL_SPACESHIP_LEFT               },
-    { Ytank_n,                 EL_SPACESHIP_UP                 },
-    { Ytank_nB,                        EL_SPACESHIP_UP                 },
-    { Ytank_e,                 EL_SPACESHIP_RIGHT              },
-    { Ytank_eB,                        EL_SPACESHIP_RIGHT              },
-    { Ytank_s,                 EL_SPACESHIP_DOWN               },
-    { Ytank_sB,                        EL_SPACESHIP_DOWN               },
-    { Ytank_w,                 EL_SPACESHIP_LEFT               },
-    { Ytank_wB,                        EL_SPACESHIP_LEFT               },
-    { Ytank_w_n,               EL_SPACESHIP_UP                 },
-    { Ytank_n_e,               EL_SPACESHIP_RIGHT              },
-    { Ytank_e_s,               EL_SPACESHIP_DOWN               },
-    { Ytank_s_w,               EL_SPACESHIP_LEFT               },
-    { Ytank_e_n,               EL_SPACESHIP_UP                 },
-    { Ytank_s_e,               EL_SPACESHIP_RIGHT              },
-    { Ytank_w_s,               EL_SPACESHIP_DOWN               },
-    { Ytank_n_w,               EL_SPACESHIP_LEFT               },
-    { Ytank_stone,             EL_ROCK                         },
-    { Ytank_spring,            EL_SPRING                       },
-    { Xandroid,                        EL_EMC_ANDROID                  },
-    { Xandroid_1_n,            EL_EMC_ANDROID_UP               },
-    { Xandroid_2_n,            EL_EMC_ANDROID_UP               },
-    { Xandroid_1_e,            EL_EMC_ANDROID_RIGHT            },
-    { Xandroid_2_e,            EL_EMC_ANDROID_RIGHT            },
-    { Xandroid_1_w,            EL_EMC_ANDROID_LEFT             },
-    { Xandroid_2_w,            EL_EMC_ANDROID_LEFT             },
-    { Xandroid_1_s,            EL_EMC_ANDROID_DOWN             },
-    { Xandroid_2_s,            EL_EMC_ANDROID_DOWN             },
-    { Yandroid_n,              EL_EMC_ANDROID_UP               },
-    { Yandroid_nB,             EL_EMC_ANDROID_UP               },
-    { Yandroid_ne,             EL_EMC_ANDROID_RIGHT_UP         },
-    { Yandroid_neB,            EL_EMC_ANDROID_RIGHT_UP         },
-    { Yandroid_e,              EL_EMC_ANDROID_RIGHT            },
-    { Yandroid_eB,             EL_EMC_ANDROID_RIGHT            },
-    { Yandroid_se,             EL_EMC_ANDROID_RIGHT_DOWN       },
-    { Yandroid_seB,            EL_EMC_ANDROID_RIGHT_DOWN       },
-    { Yandroid_s,              EL_EMC_ANDROID_DOWN             },
-    { Yandroid_sB,             EL_EMC_ANDROID_DOWN             },
-    { Yandroid_sw,             EL_EMC_ANDROID_LEFT_DOWN        },
-    { Yandroid_swB,            EL_EMC_ANDROID_LEFT_DOWN        },
-    { Yandroid_w,              EL_EMC_ANDROID_LEFT             },
-    { Yandroid_wB,             EL_EMC_ANDROID_LEFT             },
-    { Yandroid_nw,             EL_EMC_ANDROID_LEFT_UP          },
-    { Yandroid_nwB,            EL_EMC_ANDROID_LEFT_UP          },
-    { Xspring,                 EL_SPRING                       },
-    { Xspring_pause,           EL_SPRING                       },
-    { Xspring_e,               EL_SPRING                       },
-    { Xspring_w,               EL_SPRING                       },
-    { Xspring_fall,            EL_SPRING                       },
-    { Yspring_s,               EL_SPRING                       },
-    { Yspring_sB,              EL_SPRING                       },
-    { Yspring_e,               EL_SPRING                       },
-    { Yspring_eB,              EL_SPRING                       },
-    { Yspring_w,               EL_SPRING                       },
-    { Yspring_wB,              EL_SPRING                       },
-    { Yspring_kill_e,          EL_SPRING                       },
-    { Yspring_kill_eB,         EL_SPRING                       },
-    { Yspring_kill_w,          EL_SPRING                       },
-    { Yspring_kill_wB,         EL_SPRING                       },
-    { Xeater_n,                        EL_YAMYAM                       },
-    { Xeater_e,                        EL_YAMYAM                       },
-    { Xeater_w,                        EL_YAMYAM                       },
-    { Xeater_s,                        EL_YAMYAM                       },
-    { Yeater_n,                        EL_YAMYAM                       },
-    { Yeater_nB,               EL_YAMYAM                       },
-    { Yeater_e,                        EL_YAMYAM                       },
-    { Yeater_eB,               EL_YAMYAM                       },
-    { Yeater_s,                        EL_YAMYAM                       },
-    { Yeater_sB,               EL_YAMYAM                       },
-    { Yeater_w,                        EL_YAMYAM                       },
-    { Yeater_wB,               EL_YAMYAM                       },
-    { Yeater_stone,            EL_ROCK                         },
-    { Yeater_spring,           EL_SPRING                       },
-    { Xalien,                  EL_ROBOT                        },
-    { Xalien_pause,            EL_ROBOT                        },
-    { Yalien_n,                        EL_ROBOT                        },
-    { Yalien_nB,               EL_ROBOT                        },
-    { Yalien_e,                        EL_ROBOT                        },
-    { Yalien_eB,               EL_ROBOT                        },
-    { Yalien_s,                        EL_ROBOT                        },
-    { Yalien_sB,               EL_ROBOT                        },
-    { Yalien_w,                        EL_ROBOT                        },
-    { Yalien_wB,               EL_ROBOT                        },
-    { Yalien_stone,            EL_ROCK                         },
-    { Yalien_spring,           EL_SPRING                       },
-    { Xemerald,                        EL_EMERALD                      },
-    { Xemerald_pause,          EL_EMERALD                      },
-    { Xemerald_fall,           EL_EMERALD                      },
-    { Xemerald_shine,          EL_EMERALD                      },
-    { Yemerald_s,              EL_EMERALD                      },
-    { Yemerald_sB,             EL_EMERALD                      },
-    { Yemerald_e,              EL_EMERALD                      },
-    { Yemerald_eB,             EL_EMERALD                      },
-    { Yemerald_w,              EL_EMERALD                      },
-    { Yemerald_wB,             EL_EMERALD                      },
-    { Yemerald_eat,            EL_EMERALD                      },
-    { Yemerald_stone,          EL_ROCK                         },
-    { Xdiamond,                        EL_DIAMOND                      },
-    { Xdiamond_pause,          EL_DIAMOND                      },
-    { Xdiamond_fall,           EL_DIAMOND                      },
-    { Xdiamond_shine,          EL_DIAMOND                      },
-    { Ydiamond_s,              EL_DIAMOND                      },
-    { Ydiamond_sB,             EL_DIAMOND                      },
-    { Ydiamond_e,              EL_DIAMOND                      },
-    { Ydiamond_eB,             EL_DIAMOND                      },
-    { Ydiamond_w,              EL_DIAMOND                      },
-    { Ydiamond_wB,             EL_DIAMOND                      },
-    { Ydiamond_eat,            EL_DIAMOND                      },
-    { Ydiamond_stone,          EL_ROCK                         },
-    { Xdrip_fall,              EL_AMOEBA_DROP                  },
-    { Xdrip_stretch,           EL_AMOEBA_DROP                  },
-    { Xdrip_stretchB,          EL_AMOEBA_DROP                  },
-    { Xdrip_eat,               EL_AMOEBA_DROP                  },
-    { Ydrip_s1,                        EL_AMOEBA_DROP                  },
-    { Ydrip_s1B,               EL_AMOEBA_DROP                  },
-    { Ydrip_s2,                        EL_AMOEBA_DROP                  },
-    { Ydrip_s2B,               EL_AMOEBA_DROP                  },
-    { Xbomb,                   EL_BOMB                         },
-    { Xbomb_pause,             EL_BOMB                         },
-    { Xbomb_fall,              EL_BOMB                         },
-    { Ybomb_s,                 EL_BOMB                         },
-    { Ybomb_sB,                        EL_BOMB                         },
-    { Ybomb_e,                 EL_BOMB                         },
-    { Ybomb_eB,                        EL_BOMB                         },
-    { Ybomb_w,                 EL_BOMB                         },
-    { Ybomb_wB,                        EL_BOMB                         },
-    { Ybomb_eat,               EL_BOMB                         },
-    { Xballoon,                        EL_BALLOON                      },
-    { Yballoon_n,              EL_BALLOON                      },
-    { Yballoon_nB,             EL_BALLOON                      },
-    { Yballoon_e,              EL_BALLOON                      },
-    { Yballoon_eB,             EL_BALLOON                      },
-    { Yballoon_s,              EL_BALLOON                      },
-    { Yballoon_sB,             EL_BALLOON                      },
-    { Yballoon_w,              EL_BALLOON                      },
-    { Yballoon_wB,             EL_BALLOON                      },
-    { Xgrass,                  EL_SAND                         },
-    { Ygrass_nB,               EL_SAND                         },
-    { Ygrass_eB,               EL_SAND                         },
-    { Ygrass_sB,               EL_SAND                         },
-    { Ygrass_wB,               EL_SAND                         },
-    { Xdirt,                   EL_SAND                         },
-    { Ydirt_nB,                        EL_SAND                         },
-    { Ydirt_eB,                        EL_SAND                         },
-    { Ydirt_sB,                        EL_SAND                         },
-    { Ydirt_wB,                        EL_SAND                         },
-    { Xacid_ne,                        EL_ACID_POOL_TOPRIGHT           },
-    { Xacid_se,                        EL_ACID_POOL_BOTTOMRIGHT        },
-    { Xacid_s,                 EL_ACID_POOL_BOTTOM             },
-    { Xacid_sw,                        EL_ACID_POOL_BOTTOMLEFT         },
-    { Xacid_nw,                        EL_ACID_POOL_TOPLEFT            },
-    { Xacid_1,                 EL_ACID                         },
-    { Xacid_2,                 EL_ACID                         },
-    { Xacid_3,                 EL_ACID                         },
-    { Xacid_4,                 EL_ACID                         },
-    { Xacid_5,                 EL_ACID                         },
-    { Xacid_6,                 EL_ACID                         },
-    { Xacid_7,                 EL_ACID                         },
-    { Xacid_8,                 EL_ACID                         },
-    { Xball_1,                 EL_EMC_GENERATOR_BALL           },
-    { Xball_1B,                        EL_EMC_GENERATOR_BALL           },
-    { Xball_2,                 EL_EMC_GENERATOR_BALL           },
-    { Xball_2B,                        EL_EMC_GENERATOR_BALL           },
-    { Yball_eat,               EL_EMC_GENERATOR_BALL           },
-    { Xgrow_ns,                        EL_EMC_GROW                     },
-    { Ygrow_ns_eat,            EL_EMC_GROW                     },
-    { Xgrow_ew,                        EL_EMC_GROW                     },
-    { Ygrow_ew_eat,            EL_EMC_GROW                     },
-    { Xwonderwall,             EL_MAGIC_WALL                   },
-    { XwonderwallB,            EL_MAGIC_WALL                   },
-    { Xameuba_1,               EL_AMOEBA_WET                   },
-    { Xameuba_2,               EL_AMOEBA_WET                   },
-    { Xameuba_3,               EL_AMOEBA_WET                   },
-    { Xameuba_4,               EL_AMOEBA_WET                   },
-    { Xameuba_5,               EL_AMOEBA_WET                   },
-    { Xameuba_6,               EL_AMOEBA_WET                   },
-    { Xameuba_7,               EL_AMOEBA_WET                   },
-    { Xameuba_8,               EL_AMOEBA_WET                   },
-    { Xdoor_1,                 EL_EM_GATE_1                    },
-    { Xdoor_2,                 EL_EM_GATE_2                    },
-    { Xdoor_3,                 EL_EM_GATE_3                    },
-    { Xdoor_4,                 EL_EM_GATE_4                    },
-    { Xdoor_5,                 EL_EMC_GATE_5                   },
-    { Xdoor_6,                 EL_EMC_GATE_6                   },
-    { Xdoor_7,                 EL_EMC_GATE_7                   },
-    { Xdoor_8,                 EL_EMC_GATE_8                   },
-    { Xkey_1,                  EL_EM_KEY_1                     },
-    { Xkey_2,                  EL_EM_KEY_2                     },
-    { Xkey_3,                  EL_EM_KEY_3                     },
-    { Xkey_4,                  EL_EM_KEY_4                     },
-    { Xkey_5,                  EL_EMC_KEY_5                    },
-    { Xkey_6,                  EL_EMC_KEY_6                    },
-    { Xkey_7,                  EL_EMC_KEY_7                    },
-    { Xkey_8,                  EL_EMC_KEY_8                    },
-    { Xwind_n,                 EL_BALLOON_SWITCH_UP            },
-    { Xwind_e,                 EL_BALLOON_SWITCH_RIGHT         },
-    { Xwind_s,                 EL_BALLOON_SWITCH_DOWN          },
-    { Xwind_w,                 EL_BALLOON_SWITCH_LEFT          },
-    { Xwind_nesw,              EL_BALLOON_SWITCH_ANY           },
-    { Xwind_stop,              EL_BALLOON_SWITCH_NONE          },
-    { Xexit,                   EL_EXIT_CLOSED                  },
-    { Xexit_1,                 EL_EXIT_OPEN                    },
-    { Xexit_2,                 EL_EXIT_OPEN                    },
-    { Xexit_3,                 EL_EXIT_OPEN                    },
-    { Xdynamite,               EL_DYNAMITE                     },
-    { Ydynamite_eat,           EL_DYNAMITE                     },
-    { Xdynamite_1,             EL_DYNAMITE_ACTIVE              },
-    { Xdynamite_2,             EL_DYNAMITE_ACTIVE              },
-    { Xdynamite_3,             EL_DYNAMITE_ACTIVE              },
-    { Xdynamite_4,             EL_DYNAMITE_ACTIVE              },
-    { Xbumper,                 EL_EMC_BUMPER                   },
-    { XbumperB,                        EL_EMC_BUMPER                   },
-    { Xwheel,                  EL_ROBOT_WHEEL                  },
-    { XwheelB,                 EL_ROBOT_WHEEL                  },
-    { Xswitch,                 EL_UNKNOWN                      },
-    { XswitchB,                        EL_UNKNOWN                      },
-    { Xsand,                   EL_QUICKSAND_EMPTY              },
-    { Xsand_stone,             EL_QUICKSAND_FULL               },
-    { Xsand_stonein_1,         EL_QUICKSAND_FULL               },
-    { Xsand_stonein_2,         EL_QUICKSAND_FULL               },
-    { Xsand_stonein_3,         EL_QUICKSAND_FULL               },
-    { Xsand_stonein_4,         EL_QUICKSAND_FULL               },
-    { Xsand_stonesand_1,       EL_QUICKSAND_FULL               },
-    { Xsand_stonesand_2,       EL_QUICKSAND_FULL               },
-    { Xsand_stonesand_3,       EL_QUICKSAND_FULL               },
-    { Xsand_stonesand_4,       EL_QUICKSAND_FULL               },
-    { Xsand_stoneout_1,                EL_QUICKSAND_FULL               },
-    { Xsand_stoneout_2,                EL_QUICKSAND_FULL               },
-    { Xsand_sandstone_1,       EL_QUICKSAND_FULL               },
-    { Xsand_sandstone_2,       EL_QUICKSAND_FULL               },
-    { Xsand_sandstone_3,       EL_QUICKSAND_FULL               },
-    { Xsand_sandstone_4,       EL_QUICKSAND_FULL               },
-    { Xplant,                  EL_EMC_PLANT                    },
-    { Yplant,                  EL_EMC_PLANT                    },
-    { Xlenses,                 EL_EMC_LENSES                   },
-    { Xmagnify,                        EL_EMC_MAGNIFY                  },
-    { Xdripper,                        EL_UNKNOWN                      },
-    { XdripperB,               EL_UNKNOWN                      },
-    { Xfake_blank,             EL_INVISIBLE_WALL               },
-    { Xfake_blankB,            EL_INVISIBLE_WALL               },
-    { Xfake_grass,             EL_INVISIBLE_SAND               },
-    { Xfake_grassB,            EL_INVISIBLE_SAND               },
-    { Xfake_door_1,            EL_EM_GATE_1_GRAY               },
-    { Xfake_door_2,            EL_EM_GATE_2_GRAY               },
-    { Xfake_door_3,            EL_EM_GATE_3_GRAY               },
-    { Xfake_door_4,            EL_EM_GATE_4_GRAY               },
-    { Xfake_door_5,            EL_EMC_GATE_5_GRAY              },
-    { Xfake_door_6,            EL_EMC_GATE_6_GRAY              },
-    { Xfake_door_7,            EL_EMC_GATE_7_GRAY              },
-    { Xfake_door_8,            EL_EMC_GATE_8_GRAY              },
-    { Xsteel_1,                        EL_STEELWALL                    },
-    { Xsteel_2,                        EL_UNKNOWN                      },
-    { Xsteel_3,                        EL_EMC_STEELWALL_1              },
-    { Xsteel_4,                        EL_UNKNOWN                      },
-    { Xwall_1,                 EL_WALL                         },
-    { Xwall_2,                 EL_UNKNOWN                      },
-    { Xwall_3,                 EL_UNKNOWN                      },
-    { Xwall_4,                 EL_UNKNOWN                      },
-    { Xround_wall_1,           EL_WALL_SLIPPERY                },
-    { Xround_wall_2,           EL_UNKNOWN                      },
-    { Xround_wall_3,           EL_UNKNOWN                      },
-    { Xround_wall_4,           EL_UNKNOWN                      },
-    { Xdecor_1,                        EL_UNKNOWN                      },
-    { Xdecor_2,                        EL_EMC_WALL_6                   },
-    { Xdecor_3,                        EL_EMC_WALL_4                   },
-    { Xdecor_4,                        EL_EMC_WALL_5                   },
-    { Xdecor_5,                        EL_EMC_WALL_7                   },
-    { Xdecor_6,                        EL_EMC_WALL_8                   },
-    { Xdecor_7,                        EL_UNKNOWN                      },
-    { Xdecor_8,                        EL_EMC_WALL_1                   },
-    { Xdecor_9,                        EL_EMC_WALL_2                   },
-    { Xdecor_10,               EL_EMC_WALL_3                   },
-    { Xdecor_11,               EL_UNKNOWN                      },
-    { Xdecor_12,               EL_UNKNOWN                      },
-    { Xalpha_0,                        EL_CHAR('0')                    },
-    { Xalpha_1,                        EL_CHAR('1')                    },
-    { Xalpha_2,                        EL_CHAR('2')                    },
-    { Xalpha_3,                        EL_CHAR('3')                    },
-    { Xalpha_4,                        EL_CHAR('4')                    },
-    { Xalpha_5,                        EL_CHAR('5')                    },
-    { Xalpha_6,                        EL_CHAR('6')                    },
-    { Xalpha_7,                        EL_CHAR('7')                    },
-    { Xalpha_8,                        EL_CHAR('8')                    },
-    { Xalpha_9,                        EL_CHAR('9')                    },
-    { Xalpha_excla,            EL_CHAR('!')                    },
-    { Xalpha_quote,            EL_CHAR('"')                    },
-    { Xalpha_comma,            EL_CHAR(',')                    },
-    { Xalpha_minus,            EL_CHAR('-')                    },
-    { Xalpha_perio,            EL_CHAR('.')                    },
-    { Xalpha_colon,            EL_CHAR(':')                    },
-    { Xalpha_quest,            EL_CHAR('?')                    },
-    { Xalpha_a,                        EL_CHAR('A')                    },
-    { Xalpha_b,                        EL_CHAR('B')                    },
-    { Xalpha_c,                        EL_CHAR('C')                    },
-    { Xalpha_d,                        EL_CHAR('D')                    },
-    { Xalpha_e,                        EL_CHAR('E')                    },
-    { Xalpha_f,                        EL_CHAR('F')                    },
-    { Xalpha_g,                        EL_CHAR('G')                    },
-    { Xalpha_h,                        EL_CHAR('H')                    },
-    { Xalpha_i,                        EL_CHAR('I')                    },
-    { Xalpha_j,                        EL_CHAR('J')                    },
-    { Xalpha_k,                        EL_CHAR('K')                    },
-    { Xalpha_l,                        EL_CHAR('L')                    },
-    { Xalpha_m,                        EL_CHAR('M')                    },
-    { Xalpha_n,                        EL_CHAR('N')                    },
-    { Xalpha_o,                        EL_CHAR('O')                    },
-    { Xalpha_p,                        EL_CHAR('P')                    },
-    { Xalpha_q,                        EL_CHAR('Q')                    },
-    { Xalpha_r,                        EL_CHAR('R')                    },
-    { Xalpha_s,                        EL_CHAR('S')                    },
-    { Xalpha_t,                        EL_CHAR('T')                    },
-    { Xalpha_u,                        EL_CHAR('U')                    },
-    { Xalpha_v,                        EL_CHAR('V')                    },
-    { Xalpha_w,                        EL_CHAR('W')                    },
-    { Xalpha_x,                        EL_CHAR('X')                    },
-    { Xalpha_y,                        EL_CHAR('Y')                    },
-    { Xalpha_z,                        EL_CHAR('Z')                    },
-    { Xalpha_arrow_e,          EL_CHAR('>')                    },
-    { Xalpha_arrow_w,          EL_CHAR('<')                    },
-    { Xalpha_copyr,            EL_CHAR('©')                    },
-
-    { Zplayer,                 EL_PLAYER_1                     },
-
-    { ZBORDER,                 EL_EMC_LEVEL_BORDER             },
-
-    { -1,                      -1                              }
-  };
-
-  if (!mapping_initialized)
-  {
-    int i;
-
-    /* return "EL_UNKNOWN" for all undefined elements in mapping array */
-    for (i = 0; i < TILE_MAX; i++)
-      mapping_EM_to_RND[i] = EL_UNKNOWN;
-
-    for (i = 0; mapping_EM_to_RND_list[i].element_em != -1; i++)
-      mapping_EM_to_RND[mapping_EM_to_RND_list[i].element_em] =
-       mapping_EM_to_RND_list[i].element_rnd;
-
-    mapping_initialized = TRUE;
-  }
-
-  if (element_em >= 0 && element_em < TILE_MAX)
-    return mapping_EM_to_RND[element_em];
-
-  Error(ERR_WARN, "invalid EM level element %d", element_em);
-
-  return EL_UNKNOWN;
-}
-
 void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
 {
+  static int ball_xy[8][2] =
+  {
+    { 0, 0 },
+    { 1, 0 },
+    { 2, 0 },
+    { 0, 1 },
+    { 2, 1 },
+    { 0, 2 },
+    { 1, 2 },
+    { 2, 2 },
+  };
   struct LevelInfo_EM *level_em = level->native_em_level;
   struct LEVEL *lev = level_em->lev;
   struct PLAYER *ply1 = level_em->ply1;
   struct PLAYER *ply2 = level_em->ply2;
-  int i, x, y;
+  int i, j, x, y;
 
   lev->width  = MIN(level->fieldx, EM_MAX_CAVE_WIDTH);
   lev->height = MIN(level->fieldy, EM_MAX_CAVE_HEIGHT);
 
-  lev->time_initial = level->time;
+  lev->time_seconds     = level->time;
   lev->required_initial = level->gems_needed;
 
   lev->emerald_score   = level->score[SC_EMERALD];
@@ -2419,7 +1941,8 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   lev->eater_score     = level->score[SC_YAMYAM];
   lev->nut_score       = level->score[SC_NUT];
   lev->dynamite_score  = level->score[SC_DYNAMITE];
-  lev->key_score       = level->score[SC_TIME_BONUS];  /* ??? CHECK THIS */
+  lev->key_score       = level->score[SC_KEY];
+  lev->exit_score      = level->score[SC_TIME_BONUS];
 
   for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
     for (y = 0; y < 3; y++)
@@ -2427,10 +1950,33 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
        lev->eater_array[i][y * 3 + x] =
          map_element_RND_to_EM(level->yamyam_content[i][x][y]);
 
-  lev->ameuba_time             = level->amoeba_speed;
+  lev->amoeba_time             = level->amoeba_speed;
   lev->wonderwall_time_initial = level->time_magic_wall;
   lev->wheel_time              = level->time_wheel;
 
+  lev->android_move_time       = level->android_move_time;
+  lev->android_clone_time      = level->android_clone_time;
+  lev->ball_random             = level->ball_random;
+  lev->ball_state_initial      = level->ball_state_initial;
+  lev->ball_time               = level->ball_time;
+
+  lev->lenses_score            = level->lenses_score;
+  lev->magnify_score           = level->magnify_score;
+  lev->slurp_score             = level->slurp_score;
+
+  lev->lenses_time             = level->lenses_time;
+  lev->magnify_time            = level->magnify_time;
+  lev->wind_direction_initial  = level->wind_direction_initial;
+
+  for (i = 0; i < NUM_MAGIC_BALL_CONTENTS; i++)
+    for (j = 0; j < 8; j++)
+      lev->ball_array[i][j] =
+       map_element_RND_to_EM(level->
+                             ball_content[i][ball_xy[j][0]][ball_xy[j][1]]);
+
+  for (i = 0; i < 16; i++)
+    lev->android_array[i] = FALSE;     /* !!! YET TO COME !!! */
+
   /* first fill the complete playfield with the default border element */
   for (y = 0; y < EM_MAX_CAVE_HEIGHT; y++)
     for (x = 0; x < EM_MAX_CAVE_WIDTH; x++)
@@ -2441,6 +1987,9 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   {
     int new_element = map_element_RND_to_EM(level->field[x][y]);
 
+    if (level->field[x][y] == EL_AMOEBA_DEAD)
+      new_element = map_element_RND_to_EM(EL_AMOEBA_WET);
+
     level_em->cave[x + 1][y + 1] = new_element;
   }
 
@@ -2450,34 +1999,47 @@ void CopyNativeLevel_RND_to_EM(struct LevelInfo *level)
   ply2->x_initial = 0;
   ply2->y_initial = 0;
 
-  /* at last, set the two players at their positions in the playfield */
+  /* initialize player positions and delete players from the playfield */
   for (y = 0; y < lev->height; y++) for (x = 0; x < lev->width; x++)
   {
     if (level->field[x][y] == EL_PLAYER_1)
     {
       ply1->x_initial = x + 1;
       ply1->y_initial = y + 1;
+      level_em->cave[x + 1][y + 1] = map_element_RND_to_EM(EL_EMPTY);
     }
     else if (level->field[x][y] == EL_PLAYER_2)
     {
       ply2->x_initial = x + 1;
       ply2->y_initial = y + 1;
+      level_em->cave[x + 1][y + 1] = map_element_RND_to_EM(EL_EMPTY);
     }
   }
 }
 
 void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
 {
+  static int ball_xy[8][2] =
+  {
+    { 0, 0 },
+    { 1, 0 },
+    { 2, 0 },
+    { 0, 1 },
+    { 2, 1 },
+    { 0, 2 },
+    { 1, 2 },
+    { 2, 2 },
+  };
   struct LevelInfo_EM *level_em = level->native_em_level;
   struct LEVEL *lev = level_em->lev;
   struct PLAYER *ply1 = level_em->ply1;
   struct PLAYER *ply2 = level_em->ply2;
-  int i, x, y;
+  int i, j, x, y;
 
   level->fieldx = MIN(lev->width,  MAX_LEV_FIELDX);
   level->fieldy = MIN(lev->height, MAX_LEV_FIELDY);
 
-  level->time = lev->time_initial;
+  level->time        = lev->time_seconds;
   level->gems_needed = lev->required_initial;
 
   sprintf(level->name, "Level %d", level->file_info.nr);
@@ -2490,7 +2052,8 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
   level->score[SC_YAMYAM]      = lev->eater_score;
   level->score[SC_NUT]         = lev->nut_score;
   level->score[SC_DYNAMITE]    = lev->dynamite_score;
-  level->score[SC_TIME_BONUS]  = lev->key_score;       /* ??? CHECK THIS */
+  level->score[SC_KEY]         = lev->key_score;
+  level->score[SC_TIME_BONUS]  = lev->exit_score;
 
   level->num_yamyam_contents = MAX_ELEMENT_CONTENTS;
 
@@ -2500,10 +2063,33 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
        level->yamyam_content[i][x][y] =
          map_element_EM_to_RND(lev->eater_array[i][y * 3 + x]);
 
-  level->amoeba_speed          = lev->ameuba_time;
+  level->amoeba_speed          = lev->amoeba_time;
   level->time_magic_wall       = lev->wonderwall_time_initial;
   level->time_wheel            = lev->wheel_time;
 
+  level->android_move_time     = lev->android_move_time;
+  level->android_clone_time    = lev->android_clone_time;
+  level->ball_random           = lev->ball_random;
+  level->ball_state_initial    = lev->ball_state_initial;
+  level->ball_time             = lev->ball_time;
+
+  level->lenses_score          = lev->lenses_score;
+  level->magnify_score         = lev->magnify_score;
+  level->slurp_score           = lev->slurp_score;
+
+  level->lenses_time           = lev->lenses_time;
+  level->magnify_time          = lev->magnify_time;
+  level->wind_direction_initial        = lev->wind_direction_initial;
+
+  for (i = 0; i < NUM_MAGIC_BALL_CONTENTS; i++)
+    for (j = 0; j < 8; j++)
+      level->ball_content[i][ball_xy[j][0]][ball_xy[j][1]] =
+       map_element_EM_to_RND(lev->ball_array[i][j]);
+
+  for (i = 0; i < 16; i++)
+    level->android_array[i] = FALSE;   /* !!! YET TO COME !!! */
+
+  /* convert the playfield (some elements need special treatment) */
   for (y = 0; y < level->fieldy; y++) for (x = 0; x < level->fieldx; x++)
   {
     int new_element = map_element_EM_to_RND(level_em->cave[x + 1][y + 1]);
@@ -2514,8 +2100,13 @@ void CopyNativeLevel_EM_to_RND(struct LevelInfo *level)
     level->field[x][y] = new_element;
   }
 
-  level->field[ply1->x_initial - 1][ply1->y_initial - 1] = EL_PLAYER_1;
+  /* in case of both players set to the same field, use the first player */
   level->field[ply2->x_initial - 1][ply2->y_initial - 1] = EL_PLAYER_2;
+  level->field[ply1->x_initial - 1][ply1->y_initial - 1] = EL_PLAYER_1;
+
+#if 0
+  printf("::: native Emerald Mine file version: %d\n", level_em->file_version);
+#endif
 }
 
 static void LoadLevelFromFileInfo_EM(struct LevelInfo *level,
@@ -2523,12 +2114,22 @@ static void LoadLevelFromFileInfo_EM(struct LevelInfo *level,
 {
   if (!LoadNativeLevel_EM(level_file_info->filename))
     level->no_valid_file = TRUE;
-
-  CopyNativeLevel_EM_to_RND(level);
 }
 
 #endif
 
+void CopyNativeLevel_RND_to_Native(struct LevelInfo *level)
+{
+  if (level->game_engine_type == GAME_ENGINE_TYPE_EM)
+    CopyNativeLevel_RND_to_EM(level);
+}
+
+void CopyNativeLevel_Native_to_RND(struct LevelInfo *level)
+{
+  if (level->game_engine_type == GAME_ENGINE_TYPE_EM)
+    CopyNativeLevel_EM_to_RND(level);
+}
+
 
 /* ------------------------------------------------------------------------- */
 /* functions for loading SP level                                            */
@@ -2902,6 +2503,8 @@ void LoadLevelFromFileInfo(struct LevelInfo *level,
 
   if (level->game_engine_type == GAME_ENGINE_TYPE_UNKNOWN)
     level->game_engine_type = GAME_ENGINE_TYPE_RND;
+
+  CopyNativeLevel_Native_to_RND(level);
 }
 
 void LoadLevelFromFilename(struct LevelInfo *level, char *filename)
@@ -4574,18 +4177,19 @@ void SaveScore(int nr)
 /* editor setup */
 #define SETUP_TOKEN_EDITOR_EL_BOULDERDASH      0
 #define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE     1
-#define SETUP_TOKEN_EDITOR_EL_MORE             2
-#define SETUP_TOKEN_EDITOR_EL_SOKOBAN          3
-#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX         4
-#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES    5
-#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH   6
-#define SETUP_TOKEN_EDITOR_EL_CHARS            7
-#define SETUP_TOKEN_EDITOR_EL_CUSTOM           8
-#define SETUP_TOKEN_EDITOR_EL_CUSTOM_MORE      9
-#define SETUP_TOKEN_EDITOR_EL_HEADLINES                10
-#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED     11
-
-#define NUM_EDITOR_SETUP_TOKENS                        12
+#define SETUP_TOKEN_EDITOR_EL_EMERALD_MINE_CLUB        2
+#define SETUP_TOKEN_EDITOR_EL_MORE             3
+#define SETUP_TOKEN_EDITOR_EL_SOKOBAN          4
+#define SETUP_TOKEN_EDITOR_EL_SUPAPLEX         5
+#define SETUP_TOKEN_EDITOR_EL_DIAMOND_CAVES    6
+#define SETUP_TOKEN_EDITOR_EL_DX_BOULDERDASH   7
+#define SETUP_TOKEN_EDITOR_EL_CHARS            8
+#define SETUP_TOKEN_EDITOR_EL_CUSTOM           9
+#define SETUP_TOKEN_EDITOR_EL_CUSTOM_MORE      10
+#define SETUP_TOKEN_EDITOR_EL_HEADLINES                11
+#define SETUP_TOKEN_EDITOR_EL_USER_DEFINED     12
+
+#define NUM_EDITOR_SETUP_TOKENS                        13
 
 /* shortcut setup */
 #define SETUP_TOKEN_SHORTCUT_SAVE_GAME         0
@@ -4663,6 +4267,7 @@ static struct TokenInfo editor_setup_tokens[] =
 {
   { TYPE_SWITCH, &sei.el_boulderdash,  "editor.el_boulderdash"         },
   { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine"        },
+  { TYPE_SWITCH, &sei.el_emerald_mine_club,"editor.el_emerald_mine_club"},
   { TYPE_SWITCH, &sei.el_more,         "editor.el_more"                },
   { TYPE_SWITCH, &sei.el_sokoban,      "editor.el_sokoban"             },
   { TYPE_SWITCH, &sei.el_supaplex,     "editor.el_supaplex"            },
@@ -4759,16 +4364,17 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->override_level_sounds = FALSE;
   si->override_level_music = FALSE;
 
-  si->editor.el_boulderdash = TRUE;
-  si->editor.el_emerald_mine = TRUE;
-  si->editor.el_more = TRUE;
-  si->editor.el_sokoban = TRUE;
-  si->editor.el_supaplex = TRUE;
-  si->editor.el_diamond_caves = TRUE;
-  si->editor.el_dx_boulderdash = TRUE;
-  si->editor.el_chars = TRUE;
-  si->editor.el_custom = TRUE;
-  si->editor.el_custom_more = FALSE;
+  si->editor.el_boulderdash       = TRUE;
+  si->editor.el_emerald_mine      = TRUE;
+  si->editor.el_emerald_mine_club = TRUE;
+  si->editor.el_more              = TRUE;
+  si->editor.el_sokoban           = TRUE;
+  si->editor.el_supaplex          = TRUE;
+  si->editor.el_diamond_caves     = TRUE;
+  si->editor.el_dx_boulderdash    = TRUE;
+  si->editor.el_chars             = TRUE;
+  si->editor.el_custom            = TRUE;
+  si->editor.el_custom_more       = FALSE;
 
   si->editor.el_headlines = TRUE;
   si->editor.el_user_defined = FALSE;