… | |
… | |
144 | our $SETUP_KEYBOARD; |
144 | our $SETUP_KEYBOARD; |
145 | |
145 | |
146 | our $PL_NOTEBOOK; |
146 | our $PL_NOTEBOOK; |
147 | our $PL_WINDOW; |
147 | our $PL_WINDOW; |
148 | |
148 | |
|
|
149 | our $MUSIC_PLAYING_WIDGET; |
|
|
150 | our $LICENSE_WIDGET; |
|
|
151 | |
149 | our $INVENTORY_PAGE; |
152 | our $INVENTORY_PAGE; |
150 | our $STATS_PAGE; |
153 | our $STATS_PAGE; |
151 | our $SKILL_PAGE; |
154 | our $SKILL_PAGE; |
152 | our $SPELL_PAGE; |
155 | our $SPELL_PAGE; |
153 | our $SPELL_LIST; |
156 | our $SPELL_LIST; |
… | |
… | |
267 | push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s |
270 | push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s |
268 | audio_sound_push $face |
271 | audio_sound_push $face |
269 | unless @$queue > 1; |
272 | unless @$queue > 1; |
270 | } |
273 | } |
271 | |
274 | |
|
|
275 | sub audio_music_set_meta { |
|
|
276 | my ($meta) = @_; |
|
|
277 | |
|
|
278 | $MUSIC_PLAYING_META = $meta; |
|
|
279 | $MUSIC_PLAYING_WIDGET->set_markup ( |
|
|
280 | "<b>Name</b>: " . (CFPlus::asxml $meta->{meta}{name}) . "\n" |
|
|
281 | . "<b>Author</b>: " . (CFPlus::asxml $meta->{meta}{author}) . "\n" |
|
|
282 | . "<b>Source</b>: " . (CFPlus::asxml $meta->{meta}{source}) . "\n" |
|
|
283 | . "<b>License</b>: " . (CFPlus::asxml $meta->{meta}{license}) |
|
|
284 | ); |
|
|
285 | } |
|
|
286 | |
272 | sub audio_music_update_volume { |
287 | sub audio_music_update_volume { |
273 | return unless $MUSIC_PLAYING_META; |
288 | return unless $MUSIC_PLAYING_META; |
274 | my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; |
289 | my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; |
275 | my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume}; |
290 | my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume}; |
276 | CFPlus::MixMusic::volume $base * $volume * 128; |
291 | CFPlus::MixMusic::volume $base * $volume * 128; |
… | |
… | |
306 | } else { |
321 | } else { |
307 | $MUSIC_PLAYER->play (0); |
322 | $MUSIC_PLAYER->play (0); |
308 | $MUSIC_START = time; |
323 | $MUSIC_START = time; |
309 | } |
324 | } |
310 | |
325 | |
311 | delete $MUSIC_PLAYING_META->{stop_time}; |
326 | delete $meta->{stop_time}; |
312 | delete $MUSIC_PLAYING_META->{stop_pos}; |
327 | delete $meta->{stop_pos}; |
313 | } |
328 | } |
314 | } |
329 | } |
315 | |
330 | |
316 | sub audio_music_push { |
331 | sub audio_music_push { |
317 | return unless $SDL_MIXER; |
332 | return unless $SDL_MIXER; |
… | |
… | |
351 | # sort by stop time, oldest first |
366 | # sort by stop time, oldest first |
352 | @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; |
367 | @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; |
353 | |
368 | |
354 | # if the most recently-played piece played very recently, |
369 | # if the most recently-played piece played very recently, |
355 | # resume it, else choose the oldest piece for rotation. |
370 | # resume it, else choose the oldest piece for rotation. |
356 | $MUSIC_PLAYING_META = |
371 | audio_music_set_meta |
357 | $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME |
372 | $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME |
358 | ? $MUSIC_HAVE[-1] |
373 | ? $MUSIC_HAVE[-1] |
359 | : $MUSIC_HAVE[0]; |
374 | : $MUSIC_HAVE[0]; |
360 | |
375 | |
361 | audio_music_start; |
376 | audio_music_start; |
… | |
… | |
372 | sub audio_music_finished { |
387 | sub audio_music_finished { |
373 | # we compress multiple jingles of the same type |
388 | # we compress multiple jingles of the same type |
374 | shift @MUSIC_JINGLE |
389 | shift @MUSIC_JINGLE |
375 | while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0]; |
390 | while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0]; |
376 | |
391 | |
|
|
392 | $MUSIC_PLAYING_WIDGET->clear; |
|
|
393 | |
377 | undef $MUSIC_PLAYER; |
394 | undef $MUSIC_PLAYER; |
378 | undef $MUSIC_PLAYING_META; |
395 | undef $MUSIC_PLAYING_META; |
379 | undef $MUSIC_PLAYING_DATA; |
396 | undef $MUSIC_PLAYING_DATA; |
380 | |
397 | |
381 | audio_music_push; |
398 | audio_music_push; |
… | |
… | |
401 | |
418 | |
402 | sub audio_shutdown { |
419 | sub audio_shutdown { |
403 | undef $MUSIC_PLAYER; |
420 | undef $MUSIC_PLAYER; |
404 | undef $MUSIC_PLAYING_META; |
421 | undef $MUSIC_PLAYING_META; |
405 | undef $MUSIC_PLAYING_DATA; |
422 | undef $MUSIC_PLAYING_DATA; |
|
|
423 | |
|
|
424 | audio_music_set_meta { }; |
406 | |
425 | |
407 | $MUSIC_WANT = []; |
426 | $MUSIC_WANT = []; |
408 | @MUSIC_JINGLE = (); |
427 | @MUSIC_JINGLE = (); |
409 | %AUDIO_PLAY = (); |
428 | %AUDIO_PLAY = (); |
410 | %AUDIO_CHUNK = (); |
429 | %AUDIO_CHUNK = (); |
… | |
… | |
1586 | CFPlus::Protocol::set_opencont ($::CONN, 0, "Floor"); |
1605 | CFPlus::Protocol::set_opencont ($::CONN, 0, "Floor"); |
1587 | |
1606 | |
1588 | $hb |
1607 | $hb |
1589 | } |
1608 | } |
1590 | |
1609 | |
|
|
1610 | sub media_window { |
|
|
1611 | my $vb = new CFPlus::UI::VBox; |
|
|
1612 | |
|
|
1613 | $vb->add (new CFPlus::UI::FancyFrame |
|
|
1614 | label => "Currently playing music", |
|
|
1615 | child => ($MUSIC_PLAYING_WIDGET = new CFPlus::UI::Label ellipsise => 0), |
|
|
1616 | ); |
|
|
1617 | |
|
|
1618 | $vb->add (new CFPlus::UI::FancyFrame |
|
|
1619 | label => "Other media used in this session", |
|
|
1620 | child => ($LICENSE_WIDGET = new CFPlus::UI::TextScroller |
|
|
1621 | expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4), |
|
|
1622 | ); |
|
|
1623 | |
|
|
1624 | $vb |
|
|
1625 | } |
|
|
1626 | |
1591 | sub toggle_player_page { |
1627 | sub toggle_player_page { |
1592 | my ($widget) = @_; |
1628 | my ($widget) = @_; |
1593 | |
1629 | |
1594 | if ($PL_WINDOW->{visible} && $PL_NOTEBOOK->get_current_page == $widget) { |
1630 | if ($PL_WINDOW->{visible} && $PL_NOTEBOOK->get_current_page == $widget) { |
1595 | $PL_WINDOW->hide; |
1631 | $PL_WINDOW->hide; |
… | |
… | |
1632 | $ntb->add_tab ( |
1668 | $ntb->add_tab ( |
1633 | "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget, |
1669 | "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget, |
1634 | "Toggles the inventory window, where you can manage your loot (or treasures :). " |
1670 | "Toggles the inventory window, where you can manage your loot (or treasures :). " |
1635 | . "You can also hit the <b>Tab</b>-key to show/hide the Inventory." |
1671 | . "You can also hit the <b>Tab</b>-key to show/hide the Inventory." |
1636 | ); |
1672 | ); |
1637 | $ntb->add_tab (Pickup => autopickup_setup, |
1673 | $ntb->add_tab (Pickup => autopickup_setup, |
1638 | "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them."); |
1674 | "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them."); |
|
|
1675 | |
|
|
1676 | $ntb->add_tab (Media => media_window, |
|
|
1677 | "License, Author and Source info for media sent by the server."); |
1639 | |
1678 | |
1640 | $ntb->set_current_page ($INVENTORY_PAGE); |
1679 | $ntb->set_current_page ($INVENTORY_PAGE); |
1641 | |
1680 | |
1642 | $plwin->add ($ntb); |
1681 | $plwin->add ($ntb); |
1643 | $plwin |
1682 | $plwin |