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.198 by root, Tue Jul 31 02:45:39 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
195our %AUDIO_PLAY;
196our %AUDIO_CHUNK;
197 212
198sub audio_sound_push($) { 213sub audio_sound_push($) {
199 my ($face) = @_; 214 my ($face) = @_;
200 215
201 if (my $chunk = $AUDIO_CHUNK{$face}) { 216 if (my $chunk = $AUDIO_CHUNK{$face}) {
216 } else { 231 } else {
217 # sound_meta not set means data is in flight either way 232 # sound_meta not set means data is in flight either way
218 my $meta = $CONN->{sound_meta}{$face} 233 my $meta = $CONN->{sound_meta}{$face}
219 or return; 234 or return;
220 235
236 # if its a jingle, play it as ambient music
237 if ($meta->{meta}{jingle}) {
238 delete $AUDIO_PLAY{$face}; # take the jingle out of the sound queue
239 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
240 &audio_music_push ($face);
241 } else {
221 # fetch from database 242 # fetch from database
222 CFPlus::DB::get res_data => $meta->{name}, sub { 243 CFPlus::DB::get res_data => $meta->{name}, sub {
223 my $rwops = new CFPlus::RW $_[0]; 244 my $rwops = new CFPlus::RW $_[0];
224 my $chunk = new CFPlus::MixChunk $rwops; 245 my $chunk = new CFPlus::MixChunk $rwops;
225 $chunk->volume (($meta->{meta}{volume} || 1) * 128); 246 $chunk->volume (($meta->{meta}{volume} || 1) * 128);
226 $AUDIO_CHUNK{$face} = $chunk; 247 $AUDIO_CHUNK{$face} = $chunk;
227 248
228 audio_sound_push ($face); 249 audio_sound_push ($face);
250 };
229 }; 251 }
230 } 252 }
231} 253}
232 254
233sub audio_sound_play { 255sub audio_sound_play {
234 my ($face, $dx, $dy, $vol) = @_; 256 my ($face, $dx, $dy, $vol) = @_;
243} 265}
244 266
245sub audio_music_update_volume { 267sub audio_music_update_volume {
246 return unless $MUSIC_PLAYING_META; 268 return unless $MUSIC_PLAYING_META;
247 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; 269 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1;
248 my $base = $CFG->{bgm_volume}; 270 my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume};
249 CFPlus::MixMusic::volume $base * $volume * 128; 271 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} 272}
271 273
272sub audio_music_start { 274sub audio_music_start {
273 my $meta = $MUSIC_PLAYING_META; 275 my $meta = $MUSIC_PLAYING_META;
274 276
304 delete $MUSIC_PLAYING_META->{stop_time}; 306 delete $MUSIC_PLAYING_META->{stop_time};
305 delete $MUSIC_PLAYING_META->{stop_pos}; 307 delete $MUSIC_PLAYING_META->{stop_pos};
306 } 308 }
307} 309}
308 310
309sub audio_music_changed { 311sub audio_music_push {
310 return unless $CFG->{bgm_enable};
311 return unless $SDL_MIXER; 312 return unless $SDL_MIXER;
312 313
314 my $fade_out;
315
316 if (@MUSIC_JINGLE) {
317 @MUSIC_HAVE = $MUSIC_JINGLE[0];
318 $fade_out = 333;
319 } else {
320 return unless $CFG->{bgm_enable};
321
322 my @have =
323 grep $_,
324 map $CONN->{music_meta}{$_},
325 @$MUSIC_WANT;
326
327 @MUSIC_HAVE = @have
328 if @have;
329
313 # default MUSIC_HAVE == MUSIC_DEFAULT 330 # default MUSIC_HAVE == MUSIC_DEFAULT
314 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE; 331 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE;
332 $fade_out = 1000;
333 }
315 334
316 # if the currently playing song is acceptable, let it continue 335 # if the currently playing song is acceptable, let it continue
317 return if $MUSIC_PLAYING_META 336 return if $MUSIC_PLAYING_META
318 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE; 337 && grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
319 338
320 my $NOW = time; 339 my $NOW = time;
321 340
322 if ($MUSIC_PLAYING_META) { 341 if ($MUSIC_PLAYING_META) {
323 $MUSIC_PLAYING_META->{stop_time} = $NOW; 342 $MUSIC_PLAYING_META->{stop_time} = $NOW;
324 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START; 343 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START;
325 CFPlus::MixMusic::fade_out 1000; 344 CFPlus::MixMusic::fade_out $fade_out;
326 } else { 345 } else {
327 # sort by stop time, oldest first 346 # sort by stop time, oldest first
328 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; 347 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
329 348
330 # if the most recently-played piece played very recently, 349 # if the most recently-played piece played very recently,
336 355
337 audio_music_start; 356 audio_music_start;
338 } 357 }
339} 358}
340 359
360sub audio_music_set_ambient {
361 my ($songs) = @_;
362
363 $MUSIC_WANT = $songs;
364 audio_music_push;
365}
366
341sub audio_music_finished { 367sub audio_music_finished {
368 # we compress multiple jingles of the same type
369 shift @MUSIC_JINGLE
370 while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0];
371
342 undef $MUSIC_PLAYER; 372 undef $MUSIC_PLAYER;
343 undef $MUSIC_PLAYING_META; 373 undef $MUSIC_PLAYING_META;
344 undef $MUSIC_PLAYING_DATA; 374 undef $MUSIC_PLAYING_DATA;
345 375
346 audio_music_changed; 376 audio_music_push;
377}
378
379sub audio_init {
380 if ($CFG->{audio_enable}) {
381 $ENV{MIX_EFFECTSMAXSPEED} = 1;
382 $SDL_MIXER = !CFPlus::Mix_OpenAudio;
383
384 unless ($SDL_MIXER) {
385 status "Unable to open sound device: there will be no sound";
386 return;
387 }
388
389 CFPlus::Mix_AllocateChannels 16;
390
391 audio_music_finished;
392 } else {
393 undef $SDL_MIXER;
394 }
395}
396
397sub audio_shutdown {
398 undef $MUSIC_PLAYER;
399 undef $MUSIC_PLAYING_META;
400 undef $MUSIC_PLAYING_DATA;
401
402 $MUSIC_WANT = [];
403 @MUSIC_JINGLE = ();
404 %AUDIO_PLAY = ();
405 %AUDIO_CHUNK = ();
406
407 CFPlus::Mix_CloseAudio if $SDL_MIXER;
408 undef $SDL_MIXER;
347} 409}
348 410
349############################################################################# 411#############################################################################
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 412
364sub destroy_query_dialog { 413sub destroy_query_dialog {
365 (delete $_[0]{query_dialog})->destroy 414 (delete $_[0]{query_dialog})->destroy
366 if $_[0]{query_dialog}; 415 if $_[0]{query_dialog};
367} 416}
1951 2000
1952sub video_shutdown { 2001sub video_shutdown {
1953 CFPlus::OpenGL::shutdown; 2002 CFPlus::OpenGL::shutdown;
1954 2003
1955 undef $SDL_ACTIVE; 2004 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} 2005}
1982 2006
1983my %animate_object; 2007my %animate_object;
1984my $animate_timer; 2008my $animate_timer;
1985 2009

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines