&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 ----------------------------------------------- */
{
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);
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++;
- }
}
}
}
}
+
+ /* 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)
if (level->file_has_custom_elements)
LoadLevel_InitCustomElements(level);
- if (level->file_has_custom_elements)
- InitElementPropertiesAfterLoading(level->game_version);
-
/* initialize element properties for level editor etc. */
InitElementPropertiesEngine(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);