setLevelInfoToDefaults_EM();
setLevelInfoToDefaults_SP();
+ setLevelInfoToDefaults_MM();
level->native_em_level = &native_em_level;
level->native_sp_level = &native_sp_level;
BorderElement = EL_STEELWALL;
+ /* detect custom elements when loading them */
+ level->file_has_custom_elements = FALSE;
+
/* set all bug compatibility flags to "false" => do not emulate this bug */
level->use_action_after_change_bug = FALSE;
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 !!!
{
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)
element_info[element].push_delay_random = 8;
}
+ level->file_has_custom_elements = TRUE;
+
return chunk_size;
}
Error(ERR_WARN, "invalid custom element number %d", element);
}
+ level->file_has_custom_elements = TRUE;
+
return chunk_size;
}
ei->modified_settings = TRUE;
}
+ level->file_has_custom_elements = TRUE;
+
return chunk_size;
}
/* mark this custom element as modified */
ei->modified_settings = TRUE;
+ level->file_has_custom_elements = TRUE;
+
return chunk_size;
}
/* mark this group element as modified */
element_info[element].modified_settings = TRUE;
+ level->file_has_custom_elements = TRUE;
+
return chunk_size;
}
break;
}
+ level->file_has_custom_elements = TRUE;
+
return real_chunk_size;
}
*ei = xx_ei;
*group = xx_group;
+ level->file_has_custom_elements = TRUE;
+
return real_chunk_size;
}
level_mm->encoding_16bit_field = level->encoding_16bit_field;
level_mm->fieldx = MIN(level->fieldx, MM_MAX_PLAYFIELD_WIDTH);
- level_mm->fieldy = MIN(level->fieldx, MM_MAX_PLAYFIELD_HEIGHT);
+ level_mm->fieldy = MIN(level->fieldy, MM_MAX_PLAYFIELD_HEIGHT);
level_mm->time = level->time;
level_mm->kettles_needed = level->gems_needed;
level_mm->amoeba_speed = level->amoeba_speed;
level_mm->time_fuse = 0;
- for (y = 0; y < level_mm->fieldx; y++)
- for (x = 0; x < level_mm->fieldy; x++)
- level_mm->field[x][y] = map_element_RND_to_MM(level->field[x][y]);
+ for (x = 0; x < level->fieldx; x++)
+ for (y = 0; y < level->fieldy; 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)
level->encoding_16bit_field = level_mm->encoding_16bit_field;
level->fieldx = MIN(level_mm->fieldx, MAX_LEV_FIELDX);
- level->fieldy = MIN(level_mm->fieldx, MAX_LEV_FIELDY);
+ level->fieldy = MIN(level_mm->fieldy, MAX_LEV_FIELDY);
level->time = level_mm->time;
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];
level->amoeba_speed = level_mm->amoeba_speed;
- for (y = 0; y < level->fieldx; y++)
- for (x = 0; x < level->fieldy; x++)
+ 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++;
+ }
}
level->em_explodes_by_fire = TRUE;
}
-static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
+static void LoadLevel_InitStandardElements(struct LevelInfo *level)
{
- int i, j, x, y;
+ int i, x, y;
+
+ /* map elements that have changed in newer versions */
+ level->amoeba_content = getMappedElementByVersion(level->amoeba_content,
+ level->game_version);
+ for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
+ for (x = 0; x < 3; x++)
+ for (y = 0; y < 3; y++)
+ level->yamyam_content[i].e[x][y] =
+ getMappedElementByVersion(level->yamyam_content[i].e[x][y],
+ level->game_version);
+
+}
+
+static void LoadLevel_InitCustomElements(struct LevelInfo *level)
+{
+ int i, j;
/* map custom element change events that have changed in newer versions
(these following values were accidentally changed in version 3.0.1)
}
}
- /* map elements that have changed in newer versions */
- level->amoeba_content = getMappedElementByVersion(level->amoeba_content,
- level->game_version);
- for (i = 0; i < MAX_ELEMENT_CONTENTS; i++)
- for (x = 0; x < 3; x++)
- for (y = 0; y < 3; y++)
- level->yamyam_content[i].e[x][y] =
- getMappedElementByVersion(level->yamyam_content[i].e[x][y],
- level->game_version);
+ /* set some other uninitialized values of custom elements in older levels */
+ if (level->game_version < VERSION_IDENT(3,1,0,0))
+ {
+ for (i = 0; i < NUM_CUSTOM_ELEMENTS; i++)
+ {
+ int element = EL_CUSTOM_START + i;
+
+ element_info[element].access_direction = MV_ALL_DIRECTIONS;
+
+ element_info[element].explosion_delay = 17;
+ element_info[element].ignition_delay = 8;
+ }
+ }
+}
+
+static void LoadLevel_InitElements(struct LevelInfo *level, char *filename)
+{
+ LoadLevel_InitStandardElements(level);
+
+ if (level->file_has_custom_elements)
+ LoadLevel_InitCustomElements(level);
/* initialize element properties for level editor etc. */
InitElementPropertiesEngine(level->game_version);
- InitElementPropertiesAfterLoading(level->game_version);
InitElementPropertiesGfxElement();
}