added using author from file 'levelinfo.conf' if not defined (MM engine)
[rocksndiamonds.git] / src / files.c
index 795aeda2befb595fc04508083404fd91e729275f..33990a38ff52adf06fb7fe560981c012e6469188 100644 (file)
@@ -1918,6 +1918,26 @@ static int getFileTypeFromBasename(char *basename)
   return LEVEL_FILE_TYPE_UNKNOWN;
 }
 
+static int getFileTypeFromMagicBytes(char *filename, int type)
+{
+  File *file;
+
+  if ((file = openFile(filename, MODE_READ)))
+  {
+    char chunk_name[CHUNK_ID_LEN + 1];
+
+    getFileChunkBE(file, chunk_name, NULL);
+
+    if (strEqual(chunk_name, "MMII") ||
+       strEqual(chunk_name, "MIRR"))
+      type = LEVEL_FILE_TYPE_MM;
+
+    closeFile(file);
+  }
+
+  return type;
+}
+
 static boolean checkForPackageFromBasename(char *basename)
 {
   /* !!! WON'T WORK ANYMORE IF getFileTypeFromBasename() ALSO DETECTS !!!
@@ -2184,6 +2204,9 @@ static void determineLevelFileInfo_Filetype(struct LevelFileInfo *lfi)
 {
   if (lfi->type == LEVEL_FILE_TYPE_UNKNOWN)
     lfi->type = getFileTypeFromBasename(lfi->basename);
+
+  if (lfi->type == LEVEL_FILE_TYPE_RND)
+    lfi->type = getFileTypeFromMagicBytes(lfi->filename, lfi->type);
 }
 
 static void setLevelFileInfo(struct LevelFileInfo *level_file_info, int nr)
@@ -3917,7 +3940,8 @@ void CopyNativeLevel_RND_to_MM(struct LevelInfo *level)
 
   for (x = 0; x < level->fieldx; x++)
     for (y = 0; y < level->fieldy; y++)
-      level_mm->field[x][y] = map_element_RND_to_MM(level->field[x][y]);
+      Ur[x][y] =
+       level_mm->field[x][y] = map_element_RND_to_MM(level->field[x][y]);
 }
 
 void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
@@ -3936,7 +3960,10 @@ void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
   level->gems_needed = level_mm->kettles_needed;
 
   strcpy(level->name, level_mm->name);
-  strcpy(level->author, level_mm->author);
+
+  /* only overwrite author from 'levelinfo.conf' if author defined in level */
+  if (!strEqual(level_mm->author, ANONYMOUS_NAME))
+    strcpy(level->author, level_mm->author);
 
   level->score[SC_PACMAN]     = level_mm->score[SC_PACMAN];
   level->score[SC_KEY]        = level_mm->score[SC_PACMAN];
@@ -3947,6 +3974,17 @@ void CopyNativeLevel_MM_to_RND(struct LevelInfo *level)
   for (x = 0; x < level->fieldx; x++)
     for (y = 0; y < level->fieldy; y++)
       level->field[x][y] = map_element_MM_to_RND(level_mm->field[x][y]);
+
+  if (level_mm->auto_count_kettles)
+  {
+    level->gems_needed = 0;
+
+    for (x = 0; x < level->fieldx; x++)
+      for (y = 0; y < level->fieldy; y++)
+       if (level->field[x][y] == EL_MM_KETTLE ||
+           level->field[x][y] == EL_DF_CELL)
+         level->gems_needed++;
+  }
 }