CONF_CONTENT_NUM_BYTES : 1)
#define CONF_ELEMENT_BYTE_POS(i) ((i) * CONF_ELEMENT_NUM_BYTES)
-#define CONF_ELEMENTS_ELEMENT(b,i) ((b[CONF_ELEMENT_BYTE_POS(i)] << 8) | \
+#define CONF_ELEMENTS_ELEMENT(b, i) ((b[CONF_ELEMENT_BYTE_POS(i)] << 8) | \
(b[CONF_ELEMENT_BYTE_POS(i) + 1]))
#define CONF_CONTENT_ELEMENT_POS(c,x,y) ((c) * CONF_CONTENT_NUM_ELEMENTS + \
},
{
EL_MM_GRAY_BALL, -1,
- TYPE_BOOLEAN, CONF_VALUE_8_BIT(1),
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(3),
&li.rotate_mm_ball_content, TRUE
},
+ {
+ EL_MM_GRAY_BALL, -1,
+ TYPE_BOOLEAN, CONF_VALUE_8_BIT(2),
+ &li.explode_mm_ball, FALSE
+ },
{
EL_MM_STEEL_BLOCK, -1,
cav->lenses_time = level->lenses_time;
cav->magnify_time = level->magnify_time;
+ cav->wind_time = 9999;
cav->wind_direction =
map_direction_RND_to_EM(level->wind_direction_initial);
level_mm->num_ball_contents = level->num_mm_ball_contents;
level_mm->ball_choice_mode = level->mm_ball_choice_mode;
level_mm->rotate_ball_content = level->rotate_mm_ball_content;
+ level_mm->explode_ball = level->explode_mm_ball;
for (i = 0; i < level->num_mm_ball_contents; i++)
level_mm->ball_content[i] =
level->num_mm_ball_contents = level_mm->num_ball_contents;
level->mm_ball_choice_mode = level_mm->ball_choice_mode;
level->rotate_mm_ball_content = level_mm->rotate_ball_content;
+ level->explode_mm_ball = level_mm->explode_ball;
for (i = 0; i < level->num_mm_ball_contents; i++)
level->mm_ball_content[i] =
vp_playfield->width = MIN(vp_playfield->width, vp_playfield->max_width);
if (vp_playfield->max_height != -1)
- vp_playfield->height = MIN(vp_playfield->height,vp_playfield->max_height);
+ vp_playfield->height = MIN(vp_playfield->height, vp_playfield->max_height);
// adjust playfield position according to specified alignment
{
{ "menu.draw_xoffset.INFO", &menu.draw_xoffset_info[i] },
{ "menu.draw_yoffset.INFO", &menu.draw_yoffset_info[i] },
- { "menu.list_size.INFO", &menu.list_size_info[i] }
+ { "menu.list_size.INFO", &menu.list_size_info[i] },
+ { "menu.list_entry_size.INFO", &menu.list_entry_size_info[i] },
+ { "menu.tile_size.INFO", &menu.tile_size_info[i] }
};
for (j = 0; j < ARRAY_SIZE(menu_config); j++)
struct TokenIntPtrInfo menu_config[] =
{
{ "menu.left_spacing.INFO", &menu.left_spacing_info[i] },
+ { "menu.middle_spacing.INFO", &menu.middle_spacing_info[i] },
{ "menu.right_spacing.INFO", &menu.right_spacing_info[i] },
{ "menu.top_spacing.INFO", &menu.top_spacing_info[i] },
{ "menu.bottom_spacing.INFO", &menu.bottom_spacing_info[i] },
return music_info_listed_ext(list, basename, TRUE);
}
+static boolean checkLevelSetHasMusic_NoConf(void)
+{
+ int i;
+
+ for (i = leveldir_current->first_level;
+ i <= leveldir_current->last_level; i++)
+ if (levelset.music[i] == MUS_UNDEFINED)
+ return TRUE;
+
+ return FALSE;
+}
+
void LoadMusicInfo(void)
{
- char *music_directory = getCustomMusicDirectory_NoConf();
int num_music = getMusicListSize();
- int num_music_noconf = 0;
int num_sounds = getSoundListSize();
- Directory *dir;
- DirectoryEntry *dir_entry;
struct FileInfo *music, *sound;
struct MusicFileInfo *next, **new;
int i;
new = &music_file_info;
+ // get music file info for all configured music files
for (i = 0; i < num_music; i++)
{
music = getMusicListEntry(i);
}
}
- if ((dir = openDirectory(music_directory)) == NULL)
- {
- Warn("cannot read music directory '%s'", music_directory);
-
- return;
- }
-
- while ((dir_entry = readDirectory(dir)) != NULL) // loop all entries
+ // if some levels have no game music configured, use unconfigured music
+ if (checkLevelSetHasMusic_NoConf())
{
- char *basename = dir_entry->basename;
- boolean music_already_used = FALSE;
- int i;
+ int num_music_noconf = getMusicListSize_NoConf();
- // skip all music files that are configured in music config file
- for (i = 0; i < num_music; i++)
+ // get music file info for all unconfigured music files
+ for (i = 0; i < num_music_noconf; i++)
{
- music = getMusicListEntry(i);
+ int music_nr_noconf = MAP_NOCONF_MUSIC(i);
+ char *basename = getMusicInfoEntryFilename(music_nr_noconf);
- if (music->filename == NULL)
+ if (basename == NULL)
continue;
- if (strEqual(basename, music->filename))
+ if (!music_info_listed(music_file_info, basename))
{
- music_already_used = TRUE;
- break;
- }
- }
+ *new = get_music_file_info(basename, music_nr_noconf);
- if (music_already_used)
- continue;
-
- if (!FileIsMusic(dir_entry->filename))
- continue;
-
- if (!music_info_listed(music_file_info, basename))
- {
- *new = get_music_file_info(basename, MAP_NOCONF_MUSIC(num_music_noconf));
-
- if (*new != NULL)
- new = &(*new)->next;
+ if (*new != NULL)
+ new = &(*new)->next;
+ }
}
-
- num_music_noconf++;
}
- closeDirectory(dir);
-
+ // get sound file info for all configured sound files
for (i = 0; i < num_sounds; i++)
{
sound = getSoundListEntry(i);