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.195 by root, Tue Jul 31 01:03:52 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; 195our $MUSIC_WANT; # arryref of ambient music we want to play
196our @MUSIC_HAVE; # ambient music we have on disk
167our $MUSIC_START; 197our $MUSIC_START;
198our @MUSIC_JINGLE; # which jingles to play next
168our $MUSIC_PLAYING_DATA; 199our $MUSIC_PLAYING_DATA;
169our $MUSIC_PLAYING_META; 200our $MUSIC_PLAYING_META;
170our $MUSIC_PLAYER; 201our $MUSIC_PLAYER;
171our $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
172our @SOUNDS; # event => file mapping 203
173our %AUDIO_CHUNK; # audio files 204our %AUDIO_CHUNK; # audio "files"
174 205our %AUDIO_PLAY; # which audio faces should be played
175our $ALT_ENTER_MESSAGE;
176our $STATUSBOX;
177our $DEBUG_STATUS;
178
179our $INV;
180our $INVR;
181our $INV_RIGHT_HB;
182
183our $PICKUP_CFG;
184
185#############################################################################
186#TODO: maybe move into own audio module...
187 206
188sub audio_channel_finished { 207sub audio_channel_finished {
189 my ($channel) = @_; 208 my ($channel) = @_;
190 209
191# warn "channel $channel finished\n";#d# 210# warn "channel $channel finished\n";#d#
192} 211}
193 212
194our %AUDIO_PLAY;
195our %AUDIO_CHUNK;
196
197sub audio_sound_push($) { 213sub audio_sound_push($) {
198 my ($face) = @_; 214 my ($face) = @_;
215
216 $CFG->{effects_enable}
217 or return;
199 218
200 if (my $chunk = $AUDIO_CHUNK{$face}) { 219 if (my $chunk = $AUDIO_CHUNK{$face}) {
201 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { 220 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) {
202 my (undef, $dx, $dy, $vol) = @$_; 221 my (undef, $dx, $dy, $vol) = @$_;
203 222
204 my $channel = CFPlus::Channel::find; 223 my $channel = CFPlus::Channel::find;
205 $channel->volume (128 + $vol); 224 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255);
206 $dx = $dx / 10 * 255; 225 $dx = $dx / 10 * 255;
207 $channel->set_panning ((min 255, 255 - $dx), (min 255, 255 + $dx)); 226 $channel->set_panning (255 - $dx, 255 + $dx);
208 227
209# my $angle = $dx ? : $dx < 0 ? 228# my $angle = $dx ? : $dx < 0 ?
210# my $distance = -$vol; 229# my $distance = -$vol;
211# $channel->set_position ($angle, $distance); 230# $channel->set_position ($angle, $distance);
212 231
215 } else { 234 } else {
216 # sound_meta not set means data is in flight either way 235 # sound_meta not set means data is in flight either way
217 my $meta = $CONN->{sound_meta}{$face} 236 my $meta = $CONN->{sound_meta}{$face}
218 or return; 237 or return;
219 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 {
220 # fetch from database 245 # fetch from database
221 CFPlus::DB::get res_data => $meta->{name}, sub { 246 CFPlus::DB::get res_data => $meta->{name}, sub {
222 my $vol = $meta->{meta}{volume} || 1;
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 ($vol * 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_set_ambient {
253 my ($songs) = @_;
254
255 my @want =
256 grep $_,
257 map $CONN->{music_meta}{$_},
258 @$songs;
259
260 if (@want) {
261 @MUSIC_WANT = @want;
262 &audio_music_changed ();
263 }
264} 277}
265 278
266sub audio_music_start { 279sub audio_music_start {
267 my $meta = $MUSIC_PLAYING_META; 280 my $meta = $MUSIC_PLAYING_META;
268 281
298 delete $MUSIC_PLAYING_META->{stop_time}; 311 delete $MUSIC_PLAYING_META->{stop_time};
299 delete $MUSIC_PLAYING_META->{stop_pos}; 312 delete $MUSIC_PLAYING_META->{stop_pos};
300 } 313 }
301} 314}
302 315
303sub audio_music_changed { 316sub audio_music_push {
304 return unless $CFG->{bgm_enable};
305 return unless $SDL_MIXER; 317 return unless $SDL_MIXER;
306 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
307 # default MUSIC_WANT == MUSIC_DEFAULT 335 # default MUSIC_HAVE == MUSIC_DEFAULT
308 @MUSIC_WANT = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_WANT; 336 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE;
337 $fade_out = 1000;
338 }
309 339
310 # if the currently playing song is acceptable, let it continue 340 # if the currently playing song is acceptable, let it continue
311 return if $MUSIC_PLAYING_META 341 return if $MUSIC_PLAYING_META
312 && grep $MUSIC_PLAYING_META == $_, @MUSIC_WANT; 342 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
313 343
314 my $NOW = time; 344 my $NOW = time;
315 345
316 if ($MUSIC_PLAYING_META) { 346 if ($MUSIC_PLAYING_META) {
317 $MUSIC_PLAYING_META->{stop_time} = $NOW; 347 $MUSIC_PLAYING_META->{stop_time} = $NOW;
318 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START; 348 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START;
319 CFPlus::MixMusic::fade_out 1000; 349 CFPlus::MixMusic::fade_out $fade_out;
320 } else { 350 } else {
321 # sort by stop time, oldest first 351 # sort by stop time, oldest first
322 @MUSIC_WANT = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_WANT; 352 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
323 353
324 # if the most recently-played piece played very recently, 354 # if the most recently-played piece played very recently,
325 # resume it, else choose the oldest piece for rotation. 355 # resume it, else choose the oldest piece for rotation.
326 $MUSIC_PLAYING_META = 356 $MUSIC_PLAYING_META =
327 $MUSIC_WANT[-1]{stop_time} > $NOW - $MUSIC_RESUME 357 $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME
328 ? $MUSIC_WANT[-1] 358 ? $MUSIC_HAVE[-1]
329 : $MUSIC_WANT[0]; 359 : $MUSIC_HAVE[0];
330 360
331 audio_music_start; 361 audio_music_start;
332 } 362 }
333} 363}
334 364
365sub audio_music_set_ambient {
366 my ($songs) = @_;
367
368 $MUSIC_WANT = $songs;
369 audio_music_push;
370}
371
335sub 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
336 undef $MUSIC_PLAYER; 377 undef $MUSIC_PLAYER;
337 undef $MUSIC_PLAYING_META; 378 undef $MUSIC_PLAYING_META;
338 undef $MUSIC_PLAYING_DATA; 379 undef $MUSIC_PLAYING_DATA;
339 380
340 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;
341} 414}
342 415
343############################################################################# 416#############################################################################
344
345sub status {
346 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
347}
348
349sub debug {
350 $DEBUG_STATUS->set_text ($_[0]);
351}
352
353sub message {
354 my ($para) = @_;
355 $MESSAGE_WINDOW->message ($para);
356}
357 417
358sub destroy_query_dialog { 418sub destroy_query_dialog {
359 (delete $_[0]{query_dialog})->destroy 419 (delete $_[0]{query_dialog})->destroy
360 if $_[0]{query_dialog}; 420 if $_[0]{query_dialog};
361} 421}
784} 844}
785 845
786sub audio_setup { 846sub audio_setup {
787 my $vbox = new CFPlus::UI::VBox; 847 my $vbox = new CFPlus::UI::VBox;
788 848
789 $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]);
790 850
791 my $row = 0; 851 my $row = 0;
792 852
793 $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");
794 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 854 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
798 ); 858 );
799# $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");
800# $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 {
801# $CFG->{effects_volume} = $_[1]; 861# $CFG->{effects_volume} = $_[1];
802# }); 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
803 $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");
804 $table->add_at (1, $row++, my $hbox = new CFPlus::UI::HBox); 878 $table->add_at (1, $row, new CFPlus::UI::CheckBox
805 $hbox->add (new CFPlus::UI::CheckBox
806 expand => 1, state => $CFG->{bgm_enable}, 879 expand => 1, state => $CFG->{bgm_enable},
807 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.",
808 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 } 881 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 }
809 ); 882 );
810 $hbox->add (new CFPlus::UI::Slider 883 $table->add_at (2, $row++, new CFPlus::UI::Slider
811 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 884 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
812 tooltip => "The volume of the background music. Changes are instant.", 885 tooltip => "The volume of the background music. Changes are instant.",
813 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 }
814 ); 887 );
815 888
816 $table->add_at (1, $row++, new CFPlus::UI::Button 889 $table->add_at (1, $row++, new CFPlus::UI::Button
817 expand => 1, align => 0, text => "Apply", 890 c_colspan => 2, expand => 1, align => 0, text => "Apply",
818 tooltip => "Apply the audio settings", 891 tooltip => "Apply the audio settings",
819 on_activate => sub { 892 on_activate => sub {
820 audio_shutdown (); 893 audio_shutdown ();
821 audio_init (); 894 audio_init ();
822 0 895 0
893 $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() } );
894 967
895 $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#
896 969
897 $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);
898 $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);
899 $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);
900 $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);
901 $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);
902 $t->add_at (1,1, new CFPlus::UI::Label text => "e"); 975 $t->add_at (1,1, new CFPlus::UI::Label text => "e");
903 976
904 $table->add_at (7, 6, my $c = new CFPlus::UI::Canvas); 977 $table->add_at (7, 6, my $c = new CFPlus::UI::Canvas);
905 978
906 $c->add_items ({ 979 $c->add_items ({
1945 2018
1946sub video_shutdown { 2019sub video_shutdown {
1947 CFPlus::OpenGL::shutdown; 2020 CFPlus::OpenGL::shutdown;
1948 2021
1949 undef $SDL_ACTIVE; 2022 undef $SDL_ACTIVE;
1950}
1951
1952sub audio_init {
1953 if ($CFG->{audio_enable}) {
1954 $ENV{MIX_EFFECTSMAXSPEED} = 1;
1955 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
1956
1957 unless ($SDL_MIXER) {
1958 status "Unable to open sound device: there will be no sound";
1959 return;
1960 }
1961
1962 CFPlus::Mix_AllocateChannels 16;
1963
1964 audio_music_finished;
1965 } else {
1966 undef $SDL_MIXER;
1967 }
1968}
1969
1970sub audio_shutdown {
1971 CFPlus::Mix_CloseAudio if $SDL_MIXER;
1972 undef $SDL_MIXER;
1973 @SOUNDS = ();
1974 %AUDIO_CHUNK = ();
1975} 2023}
1976 2024
1977my %animate_object; 2025my %animate_object;
1978my $animate_timer; 2026my $animate_timer;
1979 2027
2083 gauge_fontsize => 1, 2131 gauge_fontsize => 1,
2084 gauge_size => 0.35, 2132 gauge_size => 0.35,
2085 stat_fontsize => 0.7, 2133 stat_fontsize => 0.7,
2086 mapsize => 100, 2134 mapsize => 100,
2087 audio_enable => 1, 2135 audio_enable => 1,
2136 effects_enable => 1,
2137 effects_volume => 1,
2088 bgm_enable => 1, 2138 bgm_enable => 1,
2089 bgm_volume => 0.25, 2139 bgm_volume => 0.5,
2090 output_sync => 1, 2140 output_sync => 1,
2091 output_count => 1, 2141 output_count => 1,
2092 output_rate => "", 2142 output_rate => "",
2093 pickup => 0, 2143 pickup => 0,
2094 inv_sort => "mtime", 2144 inv_sort => "mtime",

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines