|
@@ -127,70 +127,70 @@ static void SelectSongToPlay()
|
|
|
} while (_playlists[msf.playlist][++i] != 0 && j < lengthof(_cur_playlist) - 1);
|
|
|
|
|
|
/* Do not shuffle when on the intro-start window, as the song to play has to be the original TTD Theme*/
|
|
|
if (msf.shuffle && _game_mode != GM_MENU) {
|
|
|
i = 500;
|
|
|
do {
|
|
|
uint32 r = InteractiveRandom();
|
|
|
byte *a = &_cur_playlist[GB(r, 0, 5)];
|
|
|
byte *b = &_cur_playlist[GB(r, 8, 5)];
|
|
|
|
|
|
if (*a != 0 && *b != 0) {
|
|
|
byte t = *a;
|
|
|
*a = *b;
|
|
|
*b = t;
|
|
|
}
|
|
|
} while (--i);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void StopMusic()
|
|
|
{
|
|
|
_music_wnd_cursong = 0;
|
|
|
DoStopMusic();
|
|
|
_song_is_active = false;
|
|
|
InvalidateWindowWidget(WC_MUSIC_WINDOW, 0, 9);
|
|
|
SetWindowWidgetDirty(WC_MUSIC_WINDOW, 0, 9);
|
|
|
}
|
|
|
|
|
|
static void PlayPlaylistSong()
|
|
|
{
|
|
|
if (_cur_playlist[0] == 0) {
|
|
|
SelectSongToPlay();
|
|
|
/* if there is not songs in the playlist, it may indicate
|
|
|
* no file on the gm folder, or even no gm folder.
|
|
|
* Stop the playback, then */
|
|
|
if (_cur_playlist[0] == 0) {
|
|
|
_song_is_active = false;
|
|
|
_music_wnd_cursong = 0;
|
|
|
msf.playing = false;
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
_music_wnd_cursong = _cur_playlist[0];
|
|
|
DoPlaySong();
|
|
|
_song_is_active = true;
|
|
|
|
|
|
InvalidateWindowWidget(WC_MUSIC_WINDOW, 0, 9);
|
|
|
SetWindowWidgetDirty(WC_MUSIC_WINDOW, 0, 9);
|
|
|
}
|
|
|
|
|
|
void ResetMusic()
|
|
|
{
|
|
|
_music_wnd_cursong = 1;
|
|
|
DoPlaySong();
|
|
|
}
|
|
|
|
|
|
void MusicLoop()
|
|
|
{
|
|
|
if (!msf.playing && _song_is_active) {
|
|
|
StopMusic();
|
|
|
} else if (msf.playing && !_song_is_active) {
|
|
|
PlayPlaylistSong();
|
|
|
}
|
|
|
|
|
|
if (!_song_is_active) return;
|
|
|
|
|
|
if (!_music_driver->IsSongPlaying()) {
|
|
|
if (_game_mode != GM_MENU) {
|
|
|
StopMusic();
|
|
|
SkipToNextSong();
|
|
|
PlayPlaylistSong();
|
|
|
} else {
|
|
@@ -579,72 +579,72 @@ struct MusicWindow : public Window {
|
|
|
break;
|
|
|
|
|
|
case MW_PLAY: // start playing
|
|
|
msf.playing = true;
|
|
|
break;
|
|
|
|
|
|
case MW_MUSIC_VOL: case MW_EFFECT_VOL: { // volume sliders
|
|
|
int x = pt.x - this->nested_array[widget]->pos_x;
|
|
|
|
|
|
byte *vol = (widget == MW_MUSIC_VOL) ? &msf.music_vol : &msf.effect_vol;
|
|
|
|
|
|
byte new_vol = x * 127 / this->nested_array[widget]->current_x;
|
|
|
if (new_vol != *vol) {
|
|
|
*vol = new_vol;
|
|
|
if (widget == MW_MUSIC_VOL) MusicVolumeChanged(new_vol);
|
|
|
this->SetDirty();
|
|
|
}
|
|
|
|
|
|
_left_button_clicked = false;
|
|
|
} break;
|
|
|
|
|
|
case MW_SHUFFLE: // toggle shuffle
|
|
|
msf.shuffle ^= 1;
|
|
|
this->SetWidgetLoweredState(MW_SHUFFLE, msf.shuffle);
|
|
|
this->InvalidateWidget(MW_SHUFFLE);
|
|
|
this->SetWidgetDirty(MW_SHUFFLE);
|
|
|
StopMusic();
|
|
|
SelectSongToPlay();
|
|
|
this->SetDirty();
|
|
|
break;
|
|
|
|
|
|
case MW_PROGRAMME: // show track selection
|
|
|
ShowMusicTrackSelection();
|
|
|
break;
|
|
|
|
|
|
case MW_ALL: case MW_OLD: case MW_NEW:
|
|
|
case MW_EZY: case MW_CUSTOM1: case MW_CUSTOM2: // playlist
|
|
|
SelectPlaylist(widget - MW_ALL);
|
|
|
StopMusic();
|
|
|
SelectSongToPlay();
|
|
|
this->SetDirty();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#if 0
|
|
|
virtual void OnTick()
|
|
|
{
|
|
|
this->InvalidateWidget(MW_GAUGE);
|
|
|
this->SetWidgetDirty(MW_GAUGE);
|
|
|
}
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
static const NWidgetPart _nested_music_window_widgets[] = {
|
|
|
NWidget(NWID_HORIZONTAL),
|
|
|
NWidget(WWT_CLOSEBOX, COLOUR_GREY, MW_CLOSE),
|
|
|
NWidget(WWT_CAPTION, COLOUR_GREY, MW_CAPTION), SetDataTip(STR_MUSIC_JAZZ_JUKEBOX_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
|
|
|
EndContainer(),
|
|
|
|
|
|
NWidget(NWID_HORIZONTAL),
|
|
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, MW_PREV), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_SKIP_TO_PREV, STR_MUSIC_TOOLTIP_SKIP_TO_PREVIOUS_TRACK),
|
|
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, MW_NEXT), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_SKIP_TO_NEXT, STR_MUSIC_TOOLTIP_SKIP_TO_NEXT_TRACK_IN_SELECTION),
|
|
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, MW_STOP), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_STOP_MUSIC, STR_MUSIC_TOOLTIP_STOP_PLAYING_MUSIC),
|
|
|
NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, MW_PLAY), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_PLAY_MUSIC, STR_MUSIC_TOOLTIP_START_PLAYING_MUSIC),
|
|
|
NWidget(WWT_PANEL, COLOUR_GREY, MW_SLIDERS),
|
|
|
NWidget(NWID_HORIZONTAL), SetPIP(20, 0, 20),
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, MW_MUSIC_VOL), SetMinimalSize(67, 22), SetFill(false, false), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC),
|
|
|
NWidget(WWT_PANEL, COLOUR_GREY, MW_GAUGE), SetMinimalSize(16, 20), SetPadding(1, 11, 1, 11), SetFill(false, false), EndContainer(),
|
|
|
NWidget(WWT_EMPTY, COLOUR_GREY, MW_EFFECT_VOL), SetMinimalSize(67, 22), SetFill(false, false), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC),
|
|
|
NWidget(NWID_SPACER), SetFill(true, false),
|
|
|
EndContainer(),
|
|
|
EndContainer(),
|
|
|
EndContainer(),
|