&li.auto_exit_sokoban, FALSE
},
+ {
+ -1, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(10),
+ &li.auto_count_gems, FALSE
+ },
+
{
-1, -1,
-1, -1,
&li.num_ball_contents, 4, MAX_ELEMENT_CONTENTS
},
+ {
+ EL_MM_MCDUFFIN, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(1),
+ &li.mm_laser_red, FALSE
+ },
+ {
+ EL_MM_MCDUFFIN, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(2),
+ &li.mm_laser_green, FALSE
+ },
+ {
+ EL_MM_MCDUFFIN, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(3),
+ &li.mm_laser_blue, TRUE
+ },
+
+ {
+ EL_DF_LASER, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(1),
+ &li.df_laser_red, TRUE
+ },
+ {
+ EL_DF_LASER, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(2),
+ &li.df_laser_green, TRUE
+ },
+ {
+ EL_DF_LASER, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(3),
+ &li.df_laser_blue, FALSE
+ },
+
+ {
+ EL_MM_FUSE, -1,
+ TYPE_INTEGER, CONF_VALUE_16_BIT(1),
+ &li.mm_time_fuse, 0
+ },
+
/* ---------- unused values ----------------------------------------------- */
{
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;
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->time = level->time;
level_mm->kettles_needed = level->gems_needed;
- level_mm->auto_count_kettles = FALSE;
- level_mm->laser_red = FALSE;
- level_mm->laser_green = FALSE;
- level_mm->laser_blue = TRUE;
+ level_mm->auto_count_kettles = level->auto_count_gems;
+
+ level_mm->laser_red = level->mm_laser_red;
+ level_mm->laser_green = level->mm_laser_green;
+ level_mm->laser_blue = level->mm_laser_blue;
strcpy(level_mm->name, level->name);
strcpy(level_mm->author, level->author);
level_mm->score[SC_TIME_BONUS] = level->score[SC_TIME_BONUS];
level_mm->amoeba_speed = level->amoeba_speed;
- level_mm->time_fuse = 0;
+ level_mm->time_fuse = level->mm_time_fuse;
for (x = 0; x < level->fieldx; x++)
for (y = 0; y < level->fieldy; y++)
level->time = level_mm->time;
level->gems_needed = level_mm->kettles_needed;
+ level->auto_count_gems = level_mm->auto_count_kettles;
+
+ level->mm_laser_red = level_mm->laser_red;
+ level->mm_laser_green = level_mm->laser_green;
+ level->mm_laser_blue = level_mm->laser_blue;
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->score[SC_TIME_BONUS] = level_mm->score[SC_TIME_BONUS];
level->amoeba_speed = level_mm->amoeba_speed;
+ level->mm_time_fuse = level_mm->time_fuse;
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();
}
#define NUM_GLOBAL_SETUP_TOKENS 44
+/* auto setup */
+#define SETUP_TOKEN_AUTO_EDITOR_ZOOM_TILESIZE 0
+
+#define NUM_AUTO_SETUP_TOKENS 1
+
/* editor setup */
#define SETUP_TOKEN_EDITOR_EL_CLASSIC 0
#define SETUP_TOKEN_EDITOR_EL_CUSTOM 1
static struct SetupInfo si;
+static struct SetupAutoSetupInfo sasi;
static struct SetupEditorInfo sei;
static struct SetupEditorCascadeInfo seci;
static struct SetupShortcutInfo ssi;
{ TYPE_INTEGER,&si.touch.drop_distance, "touch.drop_distance" },
};
+static struct TokenInfo auto_setup_tokens[] =
+{
+ { TYPE_INTEGER,&sasi.editor_zoom_tilesize, "editor.zoom_tilesize" },
+};
+
static struct TokenInfo editor_setup_tokens[] =
{
{ TYPE_SWITCH, &sei.el_classic, "editor.el_classic" },
#endif
}
+static void setSetupInfoToDefaults_AutoSetup(struct SetupInfo *si)
+{
+ si->auto_setup.editor_zoom_tilesize = MINI_TILESIZE;
+}
+
static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si)
{
si->editor_cascade.el_bd = TRUE;
setup.options = soi;
}
+static void decodeSetupFileHash_AutoSetup(SetupFileHash *setup_file_hash)
+{
+ int i;
+
+ if (!setup_file_hash)
+ return;
+
+ /* auto setup */
+ sasi = setup.auto_setup;
+ for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++)
+ setSetupInfo(auto_setup_tokens, i,
+ getHashEntry(setup_file_hash,
+ auto_setup_tokens[i].text));
+ setup.auto_setup = sasi;
+}
+
static void decodeSetupFileHash_EditorCascade(SetupFileHash *setup_file_hash)
{
int i;
LoadSetup_SpecialPostProcessing();
}
+void LoadSetup_AutoSetup()
+{
+ char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
+ SetupFileHash *setup_file_hash = NULL;
+
+ /* always start with reliable default values */
+ setSetupInfoToDefaults_AutoSetup(&setup);
+
+ setup_file_hash = loadSetupFileHash(filename);
+
+ if (setup_file_hash)
+ {
+ decodeSetupFileHash_AutoSetup(setup_file_hash);
+
+ freeSetupFileHash(setup_file_hash);
+ }
+
+ free(filename);
+}
+
void LoadSetup_EditorCascade()
{
char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
SetFilePermissions(filename, PERMS_PRIVATE);
}
+void SaveSetup_AutoSetup()
+{
+ char *filename = getPath2(getSetupDir(), AUTOSETUP_FILENAME);
+ FILE *file;
+ int i;
+
+ InitUserDataDirectory();
+
+ if (!(file = fopen(filename, MODE_WRITE)))
+ {
+ Error(ERR_WARN, "cannot write auto setup file '%s'", filename);
+ free(filename);
+ return;
+ }
+
+ fprintFileHeader(file, AUTOSETUP_FILENAME);
+
+ sasi = setup.auto_setup;
+ for (i = 0; i < NUM_AUTO_SETUP_TOKENS; i++)
+ fprintf(file, "%s\n", getSetupLine(auto_setup_tokens, "", i));
+
+ fclose(file);
+
+ SetFilePermissions(filename, PERMS_PRIVATE);
+
+ free(filename);
+}
+
void SaveSetup_EditorCascade()
{
char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);