ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/cfplus
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.196 by root, Tue Jul 31 02:03:13 2007 UTC vs.
Revision 1.199 by root, Wed Aug 1 14:27:21 2007 UTC

159our $STATWIDS; 159our $STATWIDS;
160 160
161our $SDL_ACTIVE; 161our $SDL_ACTIVE;
162our %SDL_CB; 162our %SDL_CB;
163 163
164our $ALT_ENTER_MESSAGE;
165our $STATUSBOX;
166our $DEBUG_STATUS;
167
168our $INV;
169our $INVR;
170our $INV_RIGHT_HB;
171
172our $PICKUP_CFG;
173
174#############################################################################
175
176sub status {
177 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
178}
179
180sub debug {
181 $DEBUG_STATUS->set_text ($_[0]);
182}
183
184sub message {
185 my ($para) = @_;
186 $MESSAGE_WINDOW->message ($para);
187}
188
189#############################################################################
190#TODO: maybe move into own audio module...
191
164our $SDL_MIXER; 192our $SDL_MIXER;
193
165our $MUSIC_DEFAULT = "in_a_heartbeat.ogg"; 194our $MUSIC_DEFAULT = "in_a_heartbeat.ogg";
166our $MUSIC_WANT; # arryref of ambient music 195our $MUSIC_WANT; # arryref of ambient music we want to play
167our @MUSIC_HAVE; # ambient music we want now 196our @MUSIC_HAVE; # ambient music we have on disk
168our $MUSIC_START; 197our $MUSIC_START;
198our @MUSIC_JINGLE; # which jingles to play next
169our $MUSIC_PLAYING_DATA; 199our $MUSIC_PLAYING_DATA;
170our $MUSIC_PLAYING_META; 200our $MUSIC_PLAYING_META;
171our $MUSIC_PLAYER; 201our $MUSIC_PLAYER;
172our $MUSIC_RESUME = 30; # resume music when players less than these many seconds before 202our $MUSIC_RESUME = 30; # resume music when played less than these many seconds before
173our @SOUNDS; # event => file mapping 203
174our %AUDIO_CHUNK; # audio files 204our %AUDIO_CHUNK; # audio "files"
175 205our %AUDIO_PLAY; # which audio faces should be played
176our $ALT_ENTER_MESSAGE;
177our $STATUSBOX;
178our $DEBUG_STATUS;
179
180our $INV;
181our $INVR;
182our $INV_RIGHT_HB;
183
184our $PICKUP_CFG;
185
186#############################################################################
187#TODO: maybe move into own audio module...
188 206
189sub audio_channel_finished { 207sub audio_channel_finished {
190 my ($channel) = @_; 208 my ($channel) = @_;
191 209
192# warn "channel $channel finished\n";#d# 210# warn "channel $channel finished\n";#d#
193} 211}
194 212
195our %AUDIO_PLAY;
196our %AUDIO_CHUNK;
197
198sub audio_sound_push($) { 213sub audio_sound_push($) {
199 my ($face) = @_; 214 my ($face) = @_;
215
216 $CFG->{effects_enable}
217 or return;
200 218
201 if (my $chunk = $AUDIO_CHUNK{$face}) { 219 if (my $chunk = $AUDIO_CHUNK{$face}) {
202 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { 220 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) {
203 my (undef, $dx, $dy, $vol) = @$_; 221 my (undef, $dx, $dy, $vol) = @$_;
204 222
205 my $channel = CFPlus::Channel::find; 223 my $channel = CFPlus::Channel::find;
206 $channel->volume ($vol * 128 / 255); 224 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255);
207 $dx = $dx / 10 * 255; 225 $dx = $dx / 10 * 255;
208 $channel->set_panning (255 - $dx, 255 + $dx); 226 $channel->set_panning (255 - $dx, 255 + $dx);
209 227
210# my $angle = $dx ? : $dx < 0 ? 228# my $angle = $dx ? : $dx < 0 ?
211# my $distance = -$vol; 229# my $distance = -$vol;
216 } else { 234 } else {
217 # sound_meta not set means data is in flight either way 235 # sound_meta not set means data is in flight either way
218 my $meta = $CONN->{sound_meta}{$face} 236 my $meta = $CONN->{sound_meta}{$face}
219 or return; 237 or return;
220 238
239 # if its a jingle, play it as ambient music
240 if ($meta->{meta}{jingle}) {
241 delete $AUDIO_PLAY{$face}; # take the jingle out of the sound queue
242 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
243 &audio_music_push ($face);
244 } else {
221 # fetch from database 245 # fetch from database
222 CFPlus::DB::get res_data => $meta->{name}, sub { 246 CFPlus::DB::get res_data => $meta->{name}, sub {
223 my $rwops = new CFPlus::RW $_[0]; 247 my $rwops = new CFPlus::RW $_[0];
224 my $chunk = new CFPlus::MixChunk $rwops; 248 my $chunk = new CFPlus::MixChunk $rwops;
225 $chunk->volume (($meta->{meta}{volume} || 1) * 128); 249 $chunk->volume (($meta->{meta}{volume} || 1) * 128);
226 $AUDIO_CHUNK{$face} = $chunk; 250 $AUDIO_CHUNK{$face} = $chunk;
227 251
228 audio_sound_push ($face); 252 audio_sound_push ($face);
253 };
229 }; 254 }
230 } 255 }
231} 256}
232 257
233sub audio_sound_play { 258sub audio_sound_play {
234 my ($face, $dx, $dy, $vol) = @_; 259 my ($face, $dx, $dy, $vol) = @_;
235 260
236 $SDL_MIXER 261 $SDL_MIXER
262 or return;
263 $CFG->{effects_enable}
237 or return; 264 or return;
238 265
239 my $queue = $AUDIO_PLAY{$face} ||= []; 266 my $queue = $AUDIO_PLAY{$face} ||= [];
240 push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s 267 push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s
241 audio_sound_push $face 268 audio_sound_push $face
243} 270}
244 271
245sub audio_music_update_volume { 272sub audio_music_update_volume {
246 return unless $MUSIC_PLAYING_META; 273 return unless $MUSIC_PLAYING_META;
247 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; 274 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1;
248 my $base = $CFG->{bgm_volume}; 275 my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume};
249 CFPlus::MixMusic::volume $base * $volume * 128; 276 CFPlus::MixMusic::volume $base * $volume * 128;
250}
251
252sub audio_music_push {
253 my @have =
254 grep $_,
255 map $CONN->{music_meta}{$_},
256 @$MUSIC_WANT;
257
258 if (@have) {
259 @MUSIC_HAVE = @have;
260 &audio_music_changed ();
261 }
262}
263
264sub audio_music_set_ambient {
265 my ($songs) = @_;
266
267 $MUSIC_WANT = $songs;
268
269 audio_music_push;
270} 277}
271 278
272sub audio_music_start { 279sub audio_music_start {
273 my $meta = $MUSIC_PLAYING_META; 280 my $meta = $MUSIC_PLAYING_META;
274 281
304 delete $MUSIC_PLAYING_META->{stop_time}; 311 delete $MUSIC_PLAYING_META->{stop_time};
305 delete $MUSIC_PLAYING_META->{stop_pos}; 312 delete $MUSIC_PLAYING_META->{stop_pos};
306 } 313 }
307} 314}
308 315
309sub audio_music_changed { 316sub audio_music_push {
310 return unless $CFG->{bgm_enable};
311 return unless $SDL_MIXER; 317 return unless $SDL_MIXER;
312 318
319 my $fade_out;
320
321 if (@MUSIC_JINGLE) {
322 @MUSIC_HAVE = $MUSIC_JINGLE[0];
323 $fade_out = 333;
324 } else {
325 return unless $CFG->{bgm_enable};
326
327 my @have =
328 grep $_,
329 map $CONN->{music_meta}{$_},
330 @$MUSIC_WANT;
331
332 @MUSIC_HAVE = @have
333 if @have;
334
313 # default MUSIC_HAVE == MUSIC_DEFAULT 335 # default MUSIC_HAVE == MUSIC_DEFAULT
314 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE; 336 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE;
337 $fade_out = 1000;
338 }
315 339
316 # if the currently playing song is acceptable, let it continue 340 # if the currently playing song is acceptable, let it continue
317 return if $MUSIC_PLAYING_META 341 return if $MUSIC_PLAYING_META
318 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE; 342 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
319 343
320 my $NOW = time; 344 my $NOW = time;
321 345
322 if ($MUSIC_PLAYING_META) { 346 if ($MUSIC_PLAYING_META) {
323 $MUSIC_PLAYING_META->{stop_time} = $NOW; 347 $MUSIC_PLAYING_META->{stop_time} = $NOW;
324 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START; 348 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START;
325 CFPlus::MixMusic::fade_out 1000; 349 CFPlus::MixMusic::fade_out $fade_out;
326 } else { 350 } else {
327 # sort by stop time, oldest first 351 # sort by stop time, oldest first
328 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; 352 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
329 353
330 # if the most recently-played piece played very recently, 354 # if the most recently-played piece played very recently,
336 360
337 audio_music_start; 361 audio_music_start;
338 } 362 }
339} 363}
340 364
365sub audio_music_set_ambient {
366 my ($songs) = @_;
367
368 $MUSIC_WANT = $songs;
369 audio_music_push;
370}
371
341sub audio_music_finished { 372sub audio_music_finished {
373 # we compress multiple jingles of the same type
374 shift @MUSIC_JINGLE
375 while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0];
376
342 undef $MUSIC_PLAYER; 377 undef $MUSIC_PLAYER;
343 undef $MUSIC_PLAYING_META; 378 undef $MUSIC_PLAYING_META;
344 undef $MUSIC_PLAYING_DATA; 379 undef $MUSIC_PLAYING_DATA;
345 380
346 audio_music_changed; 381 audio_music_push;
382}
383
384sub audio_init {
385 if ($CFG->{audio_enable}) {
386 $ENV{MIX_EFFECTSMAXSPEED} = 1;
387 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
388
389 unless ($SDL_MIXER) {
390 status "Unable to open sound device: there will be no sound";
391 return;
392 }
393
394 CFPlus::Mix_AllocateChannels 16;
395
396 audio_music_finished;
397 } else {
398 undef $SDL_MIXER;
399 }
400}
401
402sub audio_shutdown {
403 undef $MUSIC_PLAYER;
404 undef $MUSIC_PLAYING_META;
405 undef $MUSIC_PLAYING_DATA;
406
407 $MUSIC_WANT = [];
408 @MUSIC_JINGLE = ();
409 %AUDIO_PLAY = ();
410 %AUDIO_CHUNK = ();
411
412 CFPlus::Mix_CloseAudio if $SDL_MIXER;
413 undef $SDL_MIXER;
347} 414}
348 415
349############################################################################# 416#############################################################################
350
351sub status {
352 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
353}
354
355sub debug {
356 $DEBUG_STATUS->set_text ($_[0]);
357}
358
359sub message {
360 my ($para) = @_;
361 $MESSAGE_WINDOW->message ($para);
362}
363 417
364sub destroy_query_dialog { 418sub destroy_query_dialog {
365 (delete $_[0]{query_dialog})->destroy 419 (delete $_[0]{query_dialog})->destroy
366 if $_[0]{query_dialog}; 420 if $_[0]{query_dialog};
367} 421}
790} 844}
791 845
792sub audio_setup { 846sub audio_setup {
793 my $vbox = new CFPlus::UI::VBox; 847 my $vbox = new CFPlus::UI::VBox;
794 848
795 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]); 849 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1]);
796 850
797 my $row = 0; 851 my $row = 0;
798 852
799 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Audio Enable"); 853 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Audio Enable");
800 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 854 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
804 ); 858 );
805# $table->add_at (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume"); 859# $table->add_at (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume");
806# $table->add_at (1, 8, new CFPlus::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub { 860# $table->add_at (1, 8, new CFPlus::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
807# $CFG->{effects_volume} = $_[1]; 861# $CFG->{effects_volume} = $_[1];
808# }); 862# });
863
864 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume");
865 $table->add_at (1, $row, new CFPlus::UI::CheckBox
866 expand => 1, state => $CFG->{effects_enable},
867 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.",
868 on_changed => sub { $CFG->{effects_enable} = $_[1]; 0 }
869 );
870 $table->add_at (2, $row++, new CFPlus::UI::Slider
871 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128],
872 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this "
873 . "is set highest and you use your operating system volume setting. Changes are instant.",
874 on_changed => sub { $CFG->{effects_volume} = $_[1]; 0 }
875 );
876
809 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music"); 877 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music");
810 $table->add_at (1, $row++, my $hbox = new CFPlus::UI::HBox); 878 $table->add_at (1, $row, new CFPlus::UI::CheckBox
811 $hbox->add (new CFPlus::UI::CheckBox
812 expand => 1, state => $CFG->{bgm_enable}, 879 expand => 1, state => $CFG->{bgm_enable},
813 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 880 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
814 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 } 881 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 }
815 ); 882 );
816 $hbox->add (new CFPlus::UI::Slider 883 $table->add_at (2, $row++, new CFPlus::UI::Slider
817 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 884 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
818 tooltip => "The volume of the background music. Changes are instant.", 885 tooltip => "The volume of the background music. Changes are instant.",
819 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } 886 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 }
820 ); 887 );
821 888
822 $table->add_at (1, $row++, new CFPlus::UI::Button 889 $table->add_at (1, $row++, new CFPlus::UI::Button
823 expand => 1, align => 0, text => "Apply", 890 c_colspan => 2, expand => 1, align => 0, text => "Apply",
824 tooltip => "Apply the audio settings", 891 tooltip => "Apply the audio settings",
825 on_activate => sub { 892 on_activate => sub {
826 audio_shutdown (); 893 audio_shutdown ();
827 audio_init (); 894 audio_init ();
828 0 895 0
899 $table->add_at (0, 4, new CFPlus::UI::Button text => "die on click(tm)", on_activate => sub { &CFPlus::debug() } ); 966 $table->add_at (0, 4, new CFPlus::UI::Button text => "die on click(tm)", on_activate => sub { &CFPlus::debug() } );
900 967
901 $table->add_at (0, 5, new CFPlus::UI::TextEdit text => "line1\0152\0153");#d# 968 $table->add_at (0, 5, new CFPlus::UI::TextEdit text => "line1\0152\0153");#d#
902 969
903 $table->add_at (7,7, my $t = new CFPlus::UI::Table expand => 0); 970 $table->add_at (7,7, my $t = new CFPlus::UI::Table expand => 0);
904 $t->add_at (0,0, new CFPlus::UI::Label text => "a a a a", rowspan => 1, colspan => 2); 971 $t->add_at (0,0, new CFPlus::UI::Label text => "a a a a", c_rowspan => 1, c_colspan => 2);
905 $t->add_at (2,0, new CFPlus::UI::Label text => "b\nb", rowspan => 2, colspan => 1); 972 $t->add_at (2,0, new CFPlus::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1);
906 $t->add_at (1,2, new CFPlus::UI::Label text => "c c c c", rowspan => 1, colspan => 2); 973 $t->add_at (1,2, new CFPlus::UI::Label text => "c c c c", c_rowspan => 1, c_colspan => 2);
907 $t->add_at (0,1, new CFPlus::UI::Label text => "d\nd", rowspan => 2, colspan => 1); 974 $t->add_at (0,1, new CFPlus::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1);
908 $t->add_at (1,1, new CFPlus::UI::Label text => "e"); 975 $t->add_at (1,1, new CFPlus::UI::Label text => "e");
909 976
910 $table->add_at (7, 6, my $c = new CFPlus::UI::Canvas); 977 $table->add_at (7, 6, my $c = new CFPlus::UI::Canvas);
911 978
912 $c->add_items ({ 979 $c->add_items ({
1951 2018
1952sub video_shutdown { 2019sub video_shutdown {
1953 CFPlus::OpenGL::shutdown; 2020 CFPlus::OpenGL::shutdown;
1954 2021
1955 undef $SDL_ACTIVE; 2022 undef $SDL_ACTIVE;
1956}
1957
1958sub audio_init {
1959 if ($CFG->{audio_enable}) {
1960 $ENV{MIX_EFFECTSMAXSPEED} = 1;
1961 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
1962
1963 unless ($SDL_MIXER) {
1964 status "Unable to open sound device: there will be no sound";
1965 return;
1966 }
1967
1968 CFPlus::Mix_AllocateChannels 16;
1969
1970 audio_music_finished;
1971 } else {
1972 undef $SDL_MIXER;
1973 }
1974}
1975
1976sub audio_shutdown {
1977 CFPlus::Mix_CloseAudio if $SDL_MIXER;
1978 undef $SDL_MIXER;
1979 @SOUNDS = ();
1980 %AUDIO_CHUNK = ();
1981} 2023}
1982 2024
1983my %animate_object; 2025my %animate_object;
1984my $animate_timer; 2026my $animate_timer;
1985 2027
2089 gauge_fontsize => 1, 2131 gauge_fontsize => 1,
2090 gauge_size => 0.35, 2132 gauge_size => 0.35,
2091 stat_fontsize => 0.7, 2133 stat_fontsize => 0.7,
2092 mapsize => 100, 2134 mapsize => 100,
2093 audio_enable => 1, 2135 audio_enable => 1,
2136 effects_enable => 1,
2137 effects_volume => 1,
2094 bgm_enable => 1, 2138 bgm_enable => 1,
2095 bgm_volume => 0.25, 2139 bgm_volume => 0.5,
2096 output_sync => 1, 2140 output_sync => 1,
2097 output_count => 1, 2141 output_count => 1,
2098 output_rate => "", 2142 output_rate => "",
2099 pickup => 0, 2143 pickup => 0,
2100 inv_sort => "mtime", 2144 inv_sort => "mtime",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines