… | |
… | |
168 | our $MUSIC_PLAYING_DATA; |
168 | our $MUSIC_PLAYING_DATA; |
169 | our $MUSIC_PLAYING_META; |
169 | our $MUSIC_PLAYING_META; |
170 | our $MUSIC_PLAYER; |
170 | our $MUSIC_PLAYER; |
171 | our $MUSIC_RESUME = 30; # resume music when players less than these many seconds before |
171 | our $MUSIC_RESUME = 30; # resume music when players less than these many seconds before |
172 | our @SOUNDS; # event => file mapping |
172 | our @SOUNDS; # event => file mapping |
173 | our %AUDIO_CHUNKS; # audio files |
173 | our %AUDIO_CHUNK; # audio files |
174 | |
174 | |
175 | our $ALT_ENTER_MESSAGE; |
175 | our $ALT_ENTER_MESSAGE; |
176 | our $STATUSBOX; |
176 | our $STATUSBOX; |
177 | our $DEBUG_STATUS; |
177 | our $DEBUG_STATUS; |
178 | |
178 | |
… | |
… | |
481 | $SETUP_DIALOG->show; |
481 | $SETUP_DIALOG->show; |
482 | $PL_WINDOW->hide; |
482 | $PL_WINDOW->hide; |
483 | $SPELL_LIST->clear_spells; |
483 | $SPELL_LIST->clear_spells; |
484 | $CFPlus::UI::ROOT->emit (stop_game => ! ! $CONN); |
484 | $CFPlus::UI::ROOT->emit (stop_game => ! ! $CONN); |
485 | |
485 | |
486 | &audio_music_set ([]); |
486 | &audio_music_set_ambient ([]); |
487 | |
487 | |
488 | return unless $CONN; |
488 | return unless $CONN; |
489 | |
489 | |
490 | status "connection closed"; |
490 | status "connection closed"; |
491 | |
491 | |
… | |
… | |
1803 | |
1803 | |
1804 | if (my $chunk = $AUDIO_CHUNK{$face}) { |
1804 | if (my $chunk = $AUDIO_CHUNK{$face}) { |
1805 | for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { |
1805 | for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { |
1806 | my (undef, $dx, $dy, $vol) = @$_; |
1806 | my (undef, $dx, $dy, $vol) = @$_; |
1807 | |
1807 | |
1808 | my $channel = $chunk->play |
1808 | my $channel = CFPlus::Channel::find; |
1809 | or return; |
|
|
1810 | |
|
|
1811 | $channel->volume (128 + $vol); |
1809 | $channel->volume (128 + $vol); |
1812 | $dx = $dx / 10 * 255; |
1810 | $dx = $dx / 10 * 255; |
1813 | $channel->set_panning ((min 255, 255 - $dx), (min 255, 255 + $dx)); |
1811 | $channel->set_panning ((min 255, 255 - $dx), (min 255, 255 + $dx)); |
|
|
1812 | |
1814 | # my $angle = $dx ? : $dx < 0 ? |
1813 | # my $angle = $dx ? : $dx < 0 ? |
1815 | # my $distance = -$vol; |
1814 | # my $distance = -$vol; |
1816 | # $channel->set_position ($angle, $distance); |
1815 | # $channel->set_position ($angle, $distance); |
|
|
1816 | |
|
|
1817 | $chunk->play ($channel); |
1817 | } |
1818 | } |
1818 | } else { |
1819 | } else { |
1819 | # sound_meta not set means data is in flight either way |
1820 | # sound_meta not set means data is in flight either way |
1820 | my $meta = $CONN->{sound_meta}{$face} |
1821 | my $meta = $CONN->{sound_meta}{$face} |
1821 | or return; |
1822 | or return; |
… | |
… | |
1843 | push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s |
1844 | push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s |
1844 | audio_sound_push $face |
1845 | audio_sound_push $face |
1845 | unless @$queue > 1; |
1846 | unless @$queue > 1; |
1846 | } |
1847 | } |
1847 | |
1848 | |
1848 | sub audio_music_set { |
1849 | sub audio_music_set_ambient { |
1849 | my ($songs) = @_; |
1850 | my ($songs) = @_; |
1850 | |
1851 | |
1851 | my @want = |
1852 | my @want = |
1852 | grep $_, |
1853 | grep $_, |
1853 | map $CONN->{music_meta}{$_}, |
1854 | map $CONN->{music_meta}{$_}, |
… | |
… | |
1955 | |
1956 | |
1956 | sub audio_shutdown { |
1957 | sub audio_shutdown { |
1957 | CFPlus::Mix_CloseAudio if $SDL_MIXER; |
1958 | CFPlus::Mix_CloseAudio if $SDL_MIXER; |
1958 | undef $SDL_MIXER; |
1959 | undef $SDL_MIXER; |
1959 | @SOUNDS = (); |
1960 | @SOUNDS = (); |
1960 | %AUDIO_CHUNKS = (); |
1961 | %AUDIO_CHUNK = (); |
1961 | } |
1962 | } |
1962 | |
1963 | |
1963 | my %animate_object; |
1964 | my %animate_object; |
1964 | my $animate_timer; |
1965 | my $animate_timer; |
1965 | |
1966 | |