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.203 by root, Mon Aug 6 02:11:45 2007 UTC vs.
Revision 1.228 by root, Mon Oct 8 16:10:14 2007 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2 2
3# do splash-screen thingy on win32
3my $startup_done = sub { }; 4my $startup_done = sub { };
4our $PANGO = "1.5.0";
5
6# do splash-screen thingy on win32
7BEGIN { 5BEGIN {
8 if (%PAR::LibCache && $^O eq "MSWin32") { 6 if (%PAR::LibCache && $^O eq "MSWin32") {
9 while (my ($filename, $zip) = each %PAR::LibCache) { 7 while (my ($filename, $zip) = each %PAR::LibCache) {
10 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp"); 8 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
11 } 9 }
30# do things only needed for single-binary version (par) 28# do things only needed for single-binary version (par)
31BEGIN { 29BEGIN {
32 if (%PAR::LibCache) { 30 if (%PAR::LibCache) {
33 @INC = grep ref, @INC; # weed out all paths except pars loader refs 31 @INC = grep ref, @INC; # weed out all paths except pars loader refs
34 32
35 my $tmp = $ENV{PAR_TEMP}; 33 my $root = $ENV{PAR_TEMP};
36 34
37 while (my ($filename, $zip) = each %PAR::LibCache) { 35 while (my ($filename, $zip) = each %PAR::LibCache) {
38 for ($zip->memberNames) { 36 for ($zip->memberNames) {
39 next unless /^root\/(.*)/; 37 next unless /^root\/(.*)/;
40 $zip->extractMember ($_, "$tmp/$1") 38 $zip->extractMember ($_, "$root/$1")
41 unless -e "$tmp/$1"; 39 unless -e "$root/$1";
42 } 40 }
43 } 41 }
44 42
45 if ($^O eq "MSWin32") { 43 if ($^O eq "MSWin32") {
46 # relocatable 44 # pango is relocatable on win32
47 } else { 45 } else {
46 open my $fh, "<:perlio", "$root/pangoversion"
47 or die "pangoversion: $!";
48 my $PANGO = <$fh>;
48 # unix, need to patch pango rc file 49 # unix, need to patch pango rc file
49 open my $fh, "<:perlio", "$tmp/usr/lib/pango/$PANGO/module-files.d/libpango1.0-0.modules" 50 open my $fh, "<:perlio", "$root/usr/lib/pango/$PANGO/module-files.d/libpango1.0-0.modules"
50 or die "$tmp/usr/lib/$PANGO/module-files.d/libpango1.0-0.modules: $!"; 51 or die "$root/usr/lib/$PANGO/module-files.d/libpango1.0-0.modules: $!";
51 local $/; 52 local $/;
52 my $rc = <$fh>; 53 my $rc = <$fh>;
53 $rc =~ s/^\//$tmp\//gm; # replace abs paths by relative ones 54 $rc =~ s/^\//$root\//gm; # replace abs paths by relative ones
54 55
55 mkdir "$tmp/pango-modules"; 56 mkdir "$root/pango-modules";
56 open my $fh, ">:perlio", "$tmp/pango-modules/pango.modules" 57 open my $fh, ">:perlio", "$root/pango-modules/pango.modules"
57 or die "$tmp/pango-modules/pango.modules: $!"; 58 or die "$root/pango-modules/pango.modules: $!";
58 print $fh $rc; 59 print $fh $rc;
59 60
60 $ENV{PANGO_RC_FILE} = "$tmp/pango.rc"; 61 $ENV{PANGO_RC_FILE} = "$root/pango.rc";
61 open my $fh, ">:perlio", $ENV{PANGO_RC_FILE} 62 open my $fh, ">:perlio", $ENV{PANGO_RC_FILE}
62 or die "$ENV{PANGO_RC_FILE}: $!"; 63 or die "$ENV{PANGO_RC_FILE}: $!";
63 print $fh "[Pango]\nModuleFiles = $tmp/pango-modules\n"; 64 print $fh "[Pango]\nModuleFiles = $root/pango-modules\n";
64 } 65 }
65 66
66 unshift @INC, $tmp; 67 unshift @INC, $root;
67 } 68 }
68} 69}
69 70
70# need to do it again because that pile of garbage called PAR nukes it before main 71# need to do it again because that pile of garbage called PAR nukes it before main
71unshift @INC, $ENV{PAR_TEMP} 72unshift @INC, $ENV{PAR_TEMP}
86use CFPlus::DB; 87use CFPlus::DB;
87use CFPlus::UI; 88use CFPlus::UI;
88use CFPlus::UI::Canvas; 89use CFPlus::UI::Canvas;
89use CFPlus::UI::Inventory; 90use CFPlus::UI::Inventory;
90use CFPlus::UI::SpellList; 91use CFPlus::UI::SpellList;
92use CFPlus::UI::Dockable;
91use CFPlus::UI::MessageWindow; 93use CFPlus::UI::MessageWindow;
94use CFPlus::UI::ChatView;
92use CFPlus::Pod; 95use CFPlus::Pod;
93use CFPlus::MapWidget; 96use CFPlus::MapWidget;
94use CFPlus::Macro; 97use CFPlus::Macro;
95 98
96$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 99$SIG{QUIT} = sub { Carp::cluck "QUIT" };
113our $CONN; 116our $CONN;
114our $PROFILE; # current profile 117our $PROFILE; # current profile
115our $FAST; # fast, low-quality mode, possibly useful for software-rendering 118our $FAST; # fast, low-quality mode, possibly useful for software-rendering
116 119
117our $WANT_REFRESH; 120our $WANT_REFRESH;
118our $CAN_REFRESH;
119 121
120our @SDL_MODES; 122our @SDL_MODES;
121our $WIDTH; 123our $WIDTH;
122our $HEIGHT; 124our $HEIGHT;
123our $FULLSCREEN; 125our $FULLSCREEN;
127our $FONT_FIXED; 129our $FONT_FIXED;
128 130
129our $MAP; 131our $MAP;
130our $MAPMAP; 132our $MAPMAP;
131our $MAPWIDGET; 133our $MAPWIDGET;
134our $COMPLETER;
132our $BUTTONBAR; 135our $BUTTONBAR;
133our $METASERVER; 136our $METASERVER;
134our $LOGIN_BUTTON; 137our $LOGIN_BUTTON;
135our $QUIT_DIALOG; 138our $QUIT_DIALOG;
136our $HOST_ENTRY; 139our $HOST_ENTRY;
147our $PL_WINDOW; 150our $PL_WINDOW;
148 151
149our $MUSIC_PLAYING_WIDGET; 152our $MUSIC_PLAYING_WIDGET;
150our $LICENSE_WIDGET; 153our $LICENSE_WIDGET;
151 154
155our $PICKUP_PAGE;
152our $INVENTORY_PAGE; 156our $INVENTORY_PAGE;
153our $STATS_PAGE; 157our $STATS_PAGE;
154our $SKILL_PAGE; 158our $SKILL_PAGE;
155our $SPELL_PAGE; 159our $SPELL_PAGE;
156our $SPELL_LIST; 160our $SPELL_LIST;
168our $STATUSBOX; 172our $STATUSBOX;
169our $DEBUG_STATUS; 173our $DEBUG_STATUS;
170 174
171our $INV; 175our $INV;
172our $INVR; 176our $INVR;
173our $INV_RIGHT_HB; 177our $INVR_HB;
174
175our $PICKUP_CFG;
176 178
177############################################################################# 179#############################################################################
178 180
179sub status { 181sub status {
180 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 182 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
183sub debug { 185sub debug {
184 $DEBUG_STATUS->set_text ($_[0]); 186 $DEBUG_STATUS->set_text ($_[0]);
185} 187}
186 188
187sub message { 189sub message {
188 my ($para) = @_;
189 $MESSAGE_WINDOW->message ($para); 190 $MESSAGE_WINDOW->message (@_);
190} 191}
191 192
192############################################################################# 193#############################################################################
193#TODO: maybe move into own audio module... 194#TODO: maybe move into own audio module...
194 195
217 my ($face) = @_; 218 my ($face) = @_;
218 219
219 $CFG->{effects_enable} 220 $CFG->{effects_enable}
220 or return; 221 or return;
221 222
223 $AUDIO_PLAY{$face}
224 or return;
225
222 if (my $chunk = $AUDIO_CHUNK{$face}) { 226 if (my $chunk = $AUDIO_CHUNK{$face}) {
223 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { 227 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) {
224 my (undef, $dx, $dy, $vol) = @$_; 228 my (undef, $dx, $dy, $vol) = @$_;
225 229
226 my $channel = CFPlus::Channel::find; 230 my $channel = CFPlus::Channel::find;
227 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255); 231 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255);
228 $dx = $dx / 10 * 255;
229 $channel->set_panning (255 - $dx, 255 + $dx);
230
231# my $angle = $dx ? : $dx < 0 ?
232# my $distance = -$vol;
233# $channel->set_position ($angle, $distance); 232 $channel->set_position_r ($dx, $dy, 20);
234
235 $chunk->play ($channel); 233 $chunk->play ($channel);
236 } 234 }
237 } else { 235 } else {
238 # sound_meta not set means data is in flight either way 236 # sound_meta not set means data is in flight either way
239 my $meta = $CONN->{sound_meta}{$face} 237 my $meta = $CONN->{face}[$face]
240 or return; 238 or return;
241 239
240 $meta->{data}
241 or return;
242
242 # if its a jingle, play it as ambient music 243 # if its a jingle, play it as ambient music
243 if ($meta->{meta}{jingle}) { 244 if ($meta->{data}{jingle}) {
244 if (delete $AUDIO_PLAY{$face}) { # take the jingle out of the sound queue 245 if (delete $AUDIO_PLAY{$face}) { # take the jingle out of the sound queue
245 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue 246 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
246 &audio_music_push ($face); 247 &audio_music_push ($face);
247 } 248 }
248 } else { 249 } else {
249 # fetch from database 250 # fetch from database
250 CFPlus::DB::get res_data => $meta->{name}, sub { 251 CFPlus::DB::get res_data => $meta->{name}, sub {
251 my $rwops = new CFPlus::RW $_[0]; 252 my $rwops = new CFPlus::RW $_[0];
252 my $chunk = new CFPlus::MixChunk $rwops 253 my $chunk = new CFPlus::MixChunk $rwops
253 or Carp::confess "sound face $meta->{face} unloadable: " . CFPlus::Mix_GetError; 254 or Carp::confess "sound face " . (JSON::XS::to_json $meta) . " unloadable: " . CFPlus::Mix_GetError;
254 $chunk->volume (($meta->{meta}{volume} || 1) * 128); 255 $chunk->volume (($meta->{data}{volume} || 1) * 128);
255 $AUDIO_CHUNK{$face} = $chunk; 256 $AUDIO_CHUNK{$face} = $chunk;
256 257
257 audio_sound_push ($face); 258 audio_sound_push ($face);
258 }; 259 };
259 } 260 }
267 or return; 268 or return;
268 $CFG->{effects_enable} 269 $CFG->{effects_enable}
269 or return; 270 or return;
270 271
271 my $queue = $AUDIO_PLAY{$face} ||= []; 272 my $queue = $AUDIO_PLAY{$face} ||= [];
272 push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s 273 push @$queue, [Event::time + 0.6, $dx, $dy, $vol]; # do not play sound for outdated events
273 audio_sound_push $face 274 audio_sound_push $face
274 unless @$queue > 1; 275 unless @$queue > 1;
275} 276}
276 277
277sub audio_music_set_meta { 278sub audio_music_set_meta {
278 my ($meta) = @_; 279 my ($meta) = @_;
279 280
280 $MUSIC_PLAYING_META = $meta; 281 $MUSIC_PLAYING_META = $meta;
281 $MUSIC_PLAYING_WIDGET->set_markup ( 282 $MUSIC_PLAYING_WIDGET->set_markup (
282 "<b>Name</b>: " . (CFPlus::asxml $meta->{meta}{name}) . "\n" 283 "<b>Name</b>: " . (CFPlus::asxml $meta->{data}{name}) . "\n"
283 . "<b>Author</b>: " . (CFPlus::asxml $meta->{meta}{author}) . "\n" 284 . "<b>Author</b>: " . (CFPlus::asxml $meta->{data}{author}) . "\n"
284 . "<b>Source</b>: " . (CFPlus::asxml $meta->{meta}{source}) . "\n" 285 . "<b>Source</b>: " . (CFPlus::asxml $meta->{data}{source}) . "\n"
285 . "<b>License</b>: " . (CFPlus::asxml $meta->{meta}{license}) 286 . "<b>License</b>: " . (CFPlus::asxml $meta->{data}{license})
286 ); 287 );
287} 288}
288 289
289sub audio_music_update_volume { 290sub audio_music_update_volume {
290 return unless $MUSIC_PLAYING_META; 291 return unless $MUSIC_PLAYING_META;
291 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; 292 my $volume = $MUSIC_PLAYING_META->{data}{volume} || 1;
292 my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume}; 293 my $base = $MUSIC_PLAYING_META->{data}{jingle} ? 1 : $CFG->{bgm_volume};
293 CFPlus::MixMusic::volume $base * $volume * 128; 294 CFPlus::MixMusic::volume $base * $volume * 128;
294} 295}
295 296
296sub audio_music_start { 297sub audio_music_start {
297 my $meta = $MUSIC_PLAYING_META; 298 my $meta = $MUSIC_PLAYING_META;
316 317
317 my $NOW = time; 318 my $NOW = time;
318 319
319 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) { 320 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) {
320 my $pos = $MUSIC_PLAYING_META->{stop_pos}; 321 my $pos = $MUSIC_PLAYING_META->{stop_pos};
321 $MUSIC_PLAYER->fade_in_pos (0, 1000, $pos); 322 $MUSIC_PLAYER->fade_in_pos (0, 700, $pos);
322 $MUSIC_START = time - $pos; 323 $MUSIC_START = time - $pos;
323 } else { 324 } else {
324 $MUSIC_PLAYER->play (0); 325 $MUSIC_PLAYER->play (0);
325 $MUSIC_START = time; 326 $MUSIC_START = time;
326 } 327 }
340 $fade_out = 333; 341 $fade_out = 333;
341 } else { 342 } else {
342 return unless $CFG->{bgm_enable}; 343 return unless $CFG->{bgm_enable};
343 344
344 my @have = 345 my @have =
345 grep $_, 346 grep $_ && $_->{data},
346 map $CONN->{music_meta}{$_}, 347 map $CONN->{face}[$_],
347 @$MUSIC_WANT; 348 @$MUSIC_WANT;
349
350 # randomize music a bit so that the order is not always the same
351 $_->{stop_time} ||= rand for @have;
348 352
349 @MUSIC_HAVE = @have 353 @MUSIC_HAVE = @have
350 if @have; 354 if @have;
351 355
352 # default MUSIC_HAVE == MUSIC_DEFAULT 356 # default MUSIC_HAVE == MUSIC_DEFAULT
353 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE; 357 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } unless @MUSIC_HAVE;
354 $fade_out = 1000; 358 $fade_out = 700;
355 } 359 }
356 360
357 # if the currently playing song is acceptable, let it continue 361 # if the currently playing song is acceptable, let it continue
358 return if grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE; 362 return if grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
359 363
368 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; 372 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
369 373
370 # if the most recently-played piece played very recently, 374 # if the most recently-played piece played very recently,
371 # resume it, else choose the oldest piece for rotation. 375 # resume it, else choose the oldest piece for rotation.
372 audio_music_set_meta 376 audio_music_set_meta
373 $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME 377 $MUSIC_HAVE[-1]{stop_pos} && $MUSIC_HAVE[-1]{stop_time} > $NOW - $MUSIC_RESUME
374 ? $MUSIC_HAVE[-1] 378 ? $MUSIC_HAVE[-1]
375 : $MUSIC_HAVE[0]; 379 : $MUSIC_HAVE[0];
376 380
377 audio_music_start; 381 audio_music_start;
378 } 382 }
384 $MUSIC_WANT = $songs; 388 $MUSIC_WANT = $songs;
385 audio_music_push; 389 audio_music_push;
386} 390}
387 391
388sub audio_music_finished { 392sub audio_music_finished {
393 if ($MUSIC_PLAYING_META) {
394 $MUSIC_PLAYING_META->{stop_time} = time;
395 }
396
389 # we compress multiple jingles of the same type 397 # we compress multiple jingles of the same type
390 shift @MUSIC_JINGLE 398 shift @MUSIC_JINGLE
391 while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0]; 399 while @MUSIC_JINGLE && $MUSIC_PLAYING_META == $MUSIC_JINGLE[0];
392 400
393 $MUSIC_PLAYING_WIDGET->clear; 401 $MUSIC_PLAYING_WIDGET->clear;
400} 408}
401 409
402sub audio_init { 410sub audio_init {
403 if ($CFG->{audio_enable}) { 411 if ($CFG->{audio_enable}) {
404 $ENV{MIX_EFFECTSMAXSPEED} = 1; 412 $ENV{MIX_EFFECTSMAXSPEED} = 1;
405 $SDL_MIXER = !CFPlus::Mix_OpenAudio; 413 $SDL_MIXER = !CFPlus::Mix_OpenAudio
414 $CFG->{audio_hw_frequency},
415 CFPlus::MIX_DEFAULT_FORMAT,
416 $CFG->{audio_hw_channels},
417 $CFG->{audio_hw_chunksize};
406 418
407 unless ($SDL_MIXER) { 419 if ($SDL_MIXER) {
420 CFPlus::Mix_AllocateChannels $CFG->{audio_mix_channels};
421
422 audio_music_finished;
423 } else {
408 status "Unable to open sound device: there will be no sound"; 424 status "Unable to open sound device: there will be no sound";
409 return;
410 } 425 }
411
412 CFPlus::Mix_AllocateChannels 16;
413
414 audio_music_finished;
415 } else { 426 } else {
416 undef $SDL_MIXER; 427 undef $SDL_MIXER;
417 } 428 }
429
430 sub audio_tab_update;
431 audio_tab_update;
418} 432}
419 433
420sub audio_shutdown { 434sub audio_shutdown {
421 undef $MUSIC_PLAYER; 435 undef $MUSIC_PLAYER;
422 undef $MUSIC_PLAYING_META; 436 undef $MUSIC_PLAYING_META;
423 undef $MUSIC_PLAYING_DATA; 437 undef $MUSIC_PLAYING_DATA;
424
425 audio_music_set_meta { };
426 438
427 $MUSIC_WANT = []; 439 $MUSIC_WANT = [];
428 @MUSIC_JINGLE = (); 440 @MUSIC_JINGLE = ();
429 %AUDIO_PLAY = (); 441 %AUDIO_PLAY = ();
430 %AUDIO_CHUNK = (); 442 %AUDIO_CHUNK = ();
775 state => $CFG->{fullscreen}, 787 state => $CFG->{fullscreen},
776 tooltip => "Bring the client into fullscreen mode.", 788 tooltip => "Bring the client into fullscreen mode.",
777 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } 789 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
778 ); 790 );
779 791
792 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Force OpenGL 1.1");
793 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
794 state => $CFG->{force_opengl11},
795 tooltip => "Limit CFPlus to use OpenGL 1.1 features only. This will normally result in "
796 . "higher memory usage and slower performance. It will, however, help tremendously on "
797 . "cards that claim to support a feature but fall back to software rendering. "
798 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, "
799 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you "
800 . "experience extremely low framerates and your card should do better, try this option.</b>",
801 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 }
802 );
803
804 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Compress Textures");
805 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
806 state => $CFG->{texture_compression},
807 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but "
808 . "will save a lot of memory and increase performance. The compression algorithm "
809 . "can differ form card to card, so your mileage may vary. This setting is ignored in "
810 . "forced OpenGL 1.1 mode.",
811 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 }
812 );
813
780 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 814 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fast & Ugly");
781 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 815 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
782 state => $CFG->{fast}, 816 state => $CFG->{fast},
783 tooltip => "Lower the visual quality considerably to speed up rendering.", 817 tooltip => "Lower the visual quality considerably to speed up rendering.",
784 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } 818 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
810 844
811 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Smoothing"); 845 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Smoothing");
812 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 846 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
813 state => $CFG->{map_smoothing}, 847 state => $CFG->{map_smoothing},
814 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. " 848 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. "
815 . "This increases load on the graphics subsystem and works only with 2.x servers. " 849 . "This increases load on the graphics subsystem and works only with TRT servers. "
816 . "Changes take effect at next connection only.", 850 . "Changes take effect at next login only.",
817 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } 851 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 }
818 ); 852 );
819 853
820 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fog of War"); 854 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fog of War");
821 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 855 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
832 ); 866 );
833 867
834 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 868 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Message Fontsize");
835 $table->add_at (1, $row++, new CFPlus::UI::Slider 869 $table->add_at (1, $row++, new CFPlus::UI::Slider
836 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 870 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
837 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.", 871 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, "
872 . "but you still need to press apply to correctly re-layout the widget.",
838 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, 873 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
839 ); 874 );
840 875
841 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 876 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
842 $table->add_at (1, $row++, new CFPlus::UI::Slider 877 $table->add_at (1, $row++, new CFPlus::UI::Slider
861 ); 896 );
862 897
863 $vbox 898 $vbox
864} 899}
865 900
901our $AUDIO_HW_CHUNKSIZE;
902our $AUDIO_INFO;
903
904sub audio_tab_update {
905 my ($freq, $format, $chans) = CFPlus::Mix_QuerySpec;
906
907 $AUDIO_HW_CHUNKSIZE->set_options ([
908 map {
909 my $ms = sprintf "%dms", 1000 * $_ / $CFG->{audio_hw_frequency};
910 [$_, $ms, "$ms ($_ samples)"],
911 } 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
912 ]);
913
914 my $text = !$freq
915 ? "audio is off"
916 : "Frequency (Hz): $freq\n"
917 . "Channels: $chans";
918
919 $AUDIO_INFO->set_text ($text);
920}
921
866sub audio_setup { 922sub audio_setup {
867 my $vbox = new CFPlus::UI::VBox; 923 my $vbox = new CFPlus::UI::VBox;
868 924
869 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1]); 925 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1]);
870 926
872 928
873 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Audio Enable"); 929 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Audio Enable");
874 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 930 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
875 state => $CFG->{audio_enable}, 931 state => $CFG->{audio_enable},
876 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", 932 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.",
877 on_changed => sub { $CFG->{audio_enable} = $_[1]; 0 } 933 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 }
878 ); 934 );
879# $table->add_at (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume");
880# $table->add_at (1, 8, new CFPlus::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
881# $CFG->{effects_volume} = $_[1];
882# });
883 935
884 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume"); 936 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Sound Effects");
885 $table->add_at (1, $row, new CFPlus::UI::CheckBox 937 $table->add_at (1, $row, new CFPlus::UI::CheckBox
886 expand => 1, state => $CFG->{effects_enable}, 938 expand => 1, state => $CFG->{effects_enable},
887 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.", 939 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.",
940 on_changed => sub {
888 on_changed => sub { $CFG->{effects_enable} = $_[1]; 0 } 941 $CFG->{effects_enable} = $_[1];
942 $CONN->update_fx_want if $CONN;
943 1
944 }
889 ); 945 );
890 $table->add_at (2, $row++, new CFPlus::UI::Slider 946 $table->add_at (2, $row++, new CFPlus::UI::Slider
891 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128], 947 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128],
892 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this " 948 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this "
893 . "is set highest and you use your operating system volume setting. Changes are instant.", 949 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.",
894 on_changed => sub { $CFG->{effects_volume} = $_[1]; 0 } 950 on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 }
895 ); 951 );
896 952
897 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music"); 953 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music");
898 $table->add_at (1, $row, new CFPlus::UI::CheckBox 954 $table->add_at (1, $row, new CFPlus::UI::CheckBox
899 expand => 1, state => $CFG->{bgm_enable}, 955 expand => 1, state => $CFG->{bgm_enable},
900 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 956 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
901 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 } 957 on_changed => sub {
958 $CFG->{bgm_enable} = $_[1];
959 $CONN->update_fx_want if $CONN;
960 audio_music_push;
961 1
962 }
902 ); 963 );
903 $table->add_at (2, $row++, new CFPlus::UI::Slider 964 $table->add_at (2, $row++, new CFPlus::UI::Slider
904 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 965 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
905 tooltip => "The volume of the background music. Changes are instant.", 966 tooltip => "The volume of the background music. Changes are instant.",
906 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } 967 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 }
968 );
969
970 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Frequency");
971 $table->add_at (1, $row++, new CFPlus::UI::Selector
972 c_colspan => 2, expand => 1,
973 value => $CFG->{audio_hw_frequency},
974 options => [
975 [11025, "11 kHz" , "11kHz (low quality)"],
976 [22050, "22 kHz" , "22kHz (reduced quality)"],
977 [44100, "44.1 kHz", "44.1kHz (cd quality)"],
978 [48000, "48 kHz" , "48kHz (studio quality)"],
979 ],
980 tooltip => "The sampling frequency to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.",
981 on_changed => sub {
982 $CFG->{audio_hw_frequency} = $_[1];
983 audio_tab_update;
984 1
985 }
986 );
987
988 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Channels");
989 $table->add_at (1, $row++, new CFPlus::UI::Selector
990 c_colspan => 2, expand => 1,
991 value => $CFG->{audio_hw_channels},
992 options => [
993 [1, "Mono" , "Mono (single channel, low quality)"],
994 [2, "Stereo" , "Stereo (dual channe, standard quality)"],
995 [4, "4 Ch Surround", "4 Channel Surround Sound (3d sound, high quality)"],
996 [6, "6 Ch Surround", "6 Channel Surround Sound (3d sound + center + lfe)"],
997 ],
998 tooltip => "The number of independent sound channels to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.",
999 on_changed => sub {
1000 $CFG->{audio_hw_channels} = $_[1];
1001 audio_tab_update;
1002 1
1003 }
1004 );
1005
1006 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Latency");
1007 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new CFPlus::UI::Selector
1008 c_colspan => 2, expand => 1,
1009 value => $CFG->{audio_hw_chunksize},
1010 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback "
1011 . "is stuttering, increase this value. Values of 50-100ms are optimal.",
1012 on_changed => sub {
1013 $CFG->{audio_hw_chunksize} = $_[1]
1014 if $_[1];
1015 audio_tab_update;
1016 1
1017 }
1018 );
1019
1020 # should really be a slider
1021 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Mixer Voices");
1022 $table->add_at (1, $row++, new CFPlus::UI::ValSlider
1023 c_colspan => 2, expand => 1,
1024 tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.",
1025 range => [$::CFG->{audio_mix_channels}, 4, 32, 0, 1],
1026 template => ">= 99",
1027 on_changed => sub {
1028 my ($slider, $value) = @_;
1029
1030 $CFG->{audio_mix_channels} = $value
1031 if $value;
1032 1;
1033 }
907 ); 1034 );
908 1035
909 $table->add_at (1, $row++, new CFPlus::UI::Button 1036 $table->add_at (1, $row++, new CFPlus::UI::Button
910 c_colspan => 2, expand => 1, align => 0, text => "Apply", 1037 c_colspan => 2, expand => 1, align => 0, text => "Apply",
911 tooltip => "Apply the audio settings", 1038 tooltip => "Apply the audio settings",
913 audio_shutdown (); 1040 audio_shutdown ();
914 audio_init (); 1041 audio_init ();
915 0 1042 0
916 } 1043 }
917 ); 1044 );
1045
1046 $vbox->add (new CFPlus::UI::FancyFrame
1047 expand => 1,
1048 label => "Audio Info",
1049 child => ($AUDIO_INFO = new CFPlus::UI::Label ellipsise => 0),
1050 );
1051
1052 audio_tab_update;
918 1053
919 $vbox 1054 $vbox
920} 1055}
921 1056
922sub set_gauge_window_fontsize { 1057sub set_gauge_window_fontsize {
957 $hb->add (my $hg = new CFPlus::UI::Gauge type => 'hp', tooltip => "#stat_health"); 1092 $hb->add (my $hg = new CFPlus::UI::Gauge type => 'hp', tooltip => "#stat_health");
958 $hb->add (my $mg = new CFPlus::UI::Gauge type => 'mana', tooltip => "#stat_mana"); 1093 $hb->add (my $mg = new CFPlus::UI::Gauge type => 'mana', tooltip => "#stat_mana");
959 $hb->add (my $gg = new CFPlus::UI::Gauge type => 'grace', tooltip => "#stat_grace"); 1094 $hb->add (my $gg = new CFPlus::UI::Gauge type => 'grace', tooltip => "#stat_grace");
960 $hb->add (my $fg = new CFPlus::UI::Gauge type => 'food', tooltip => "#stat_food"); 1095 $hb->add (my $fg = new CFPlus::UI::Gauge type => 'food', tooltip => "#stat_food");
961 1096
962 $vbox->add (my $exp = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); 1097 $vbox->add (my $exp = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp");
1098 $vbox->add (my $prg = new CFPlus::UI::ExperienceProgress);
1099 $vbox->add (my $sklprg = new CFPlus::UI::ExperienceProgress);
963 $vbox->add (my $rng = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); 1100 $vbox->add (my $rng = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged");
964 1101
965 $GAUGES = { 1102 $GAUGES = {
1103 exp => $exp, prg => $prg, sklprg => $sklprg,
966 exp => $exp, win => $win, range => $rng, 1104 win => $win, range => $rng,
967 food => $fg, mana => $mg, hp => $hg, grace => $gg 1105 hp => $hg, mana => $mg, grace => $gg, food => $fg,
968 }; 1106 };
969 1107
970 &set_gauge_window_fontsize; 1108 &set_gauge_window_fontsize;
971 1109
972 $win 1110 $win
1173 $r 1311 $r
1174} 1312}
1175 1313
1176sub skill_window { 1314sub skill_window {
1177 my $sw = new CFPlus::UI::ScrolledWindow (expand => 1); 1315 my $sw = new CFPlus::UI::ScrolledWindow (expand => 1);
1316
1178 $sw->add ($STATWIDS->{skill_tbl} = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1]); 1317 $sw->add ($STATWIDS->{skill_tbl} = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1, .1, 0, 0, 1, .1]);
1318
1179 $sw 1319 $sw
1180} 1320}
1181 1321
1182sub formsep($) { 1322sub formsep($) {
1183 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1 1323 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
1595 $sw1->add ($INV = new CFPlus::UI::Inventory); 1735 $sw1->add ($INV = new CFPlus::UI::Inventory);
1596 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}}); 1736 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1597 1737
1598 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1738 $hb->add (my $vb2 = new CFPlus::UI::VBox);
1599 1739
1600 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox); 1740 $vb2->add ($INVR_HB = new CFPlus::UI::HBox);
1601 1741
1602 $vb2->add (my $sw2 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1742 $vb2->add (my $sw2 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1);
1603 $sw2->add ($INVR = new CFPlus::UI::Inventory); 1743 $sw2->add ($INVR = new CFPlus::UI::Inventory);
1604 1744
1605 # XXX: Call after $INVR = ... because set_opencont sets the items 1745 # XXX: Call after $INVR = ... because set_opencont sets the items
1628} 1768}
1629 1769
1630sub add_license { 1770sub add_license {
1631 my ($meta) = @_; 1771 my ($meta) = @_;
1632 1772
1633 $meta = $meta->{meta} 1773 $meta = $meta->{data}
1634 or return; 1774 or return;
1635 1775
1636 $meta->{license} || $meta->{author} || $meta->{source} 1776 $meta->{license} || $meta->{author} || $meta->{source}
1637 or return; 1777 or return;
1638 1778
1692 $ntb->add_tab ( 1832 $ntb->add_tab (
1693 "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget, 1833 "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget,
1694 "Toggles the inventory window, where you can manage your loot (or treasures :). " 1834 "Toggles the inventory window, where you can manage your loot (or treasures :). "
1695 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory." 1835 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory."
1696 ); 1836 );
1697 $ntb->add_tab (Pickup => autopickup_setup, 1837 $ntb->add_tab (Pickup => $PICKUP_PAGE = autopickup_setup,
1698 "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them."); 1838 "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them.");
1699 1839
1700 $ntb->add_tab (Media => media_window, 1840 $ntb->add_tab (Media => media_window,
1701 "License, Author and Source info for media sent by the server."); 1841 "License, Author and Source info for media sent by the server.");
1702 1842
1860 on_activate => sub { $QUIT_DIALOG->hide; 0 }, 2000 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1861 ); 2001 );
1862 $hb->add (new CFPlus::UI::Button 2002 $hb->add (new CFPlus::UI::Button
1863 text => "Quit anyway", 2003 text => "Quit anyway",
1864 expand => 1, 2004 expand => 1,
1865 on_activate => sub { exit }, 2005 on_activate => sub { Event::unloop_all },
1866 ); 2006 );
1867 } 2007 }
1868 2008
1869 $QUIT_DIALOG->show; 2009 $QUIT_DIALOG->show;
1870 $QUIT_DIALOG->grab_focus; 2010 $QUIT_DIALOG->grab_focus;
1943 2083
1944 $SDL_ACTIVE = 1; 2084 $SDL_ACTIVE = 1;
1945 $LAST_REFRESH = time - 0.01; 2085 $LAST_REFRESH = time - 0.01;
1946 2086
1947 CFPlus::OpenGL::init; 2087 CFPlus::OpenGL::init;
2088 CFPlus::Macro::init;
1948 2089
1949 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; 2090 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
1950 2091
1951 $CFPlus::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d# 2092 $CFPlus::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
1952 2093
1953 ############################################################################# 2094 #############################################################################
1954 2095
1955 if ($DEBUG_STATUS) { 2096 if ($DEBUG_STATUS) {
1956 CFPlus::UI::rescale_widgets $WIDTH / $old_w, $HEIGHT / $old_h; 2097 CFPlus::UI::rescale_widgets $WIDTH / $old_w, $HEIGHT / $old_h;
1957 } else { 2098 } else {
1958 # create the widgets 2099 # create/configure the widgets
2100
2101 $CFPlus::UI::ROOT->connect (key_down => sub {
2102 my (undef, $ev) = @_;
2103
2104 if (my @macros = CFPlus::Macro::find $ev) {
2105 CFPlus::Macro::execute $_ for @macros;
2106
2107 return 1;
2108 }
2109
2110 0
2111 });
1959 2112
1960 $DEBUG_STATUS = new CFPlus::UI::Label 2113 $DEBUG_STATUS = new CFPlus::UI::Label
1961 padding => 0, 2114 padding => 0,
1962 z => 100, 2115 z => 100,
1963 force_x => "max", 2116 force_x => "max",
1993 $MESSAGE_WINDOW->activate_console ($preset) 2146 $MESSAGE_WINDOW->activate_console ($preset)
1994 if $MESSAGE_WINDOW; 2147 if $MESSAGE_WINDOW;
1995 }); 2148 });
1996 $MAPWIDGET->show; 2149 $MAPWIDGET->show;
1997 $MAPWIDGET->grab_focus; 2150 $MAPWIDGET->grab_focus;
2151
2152 $COMPLETER = new CFPlus::MapWidget::Command::
2153 command => { },
2154 tooltip => "#completer_help",
2155 ;
1998 2156
1999 $SETUP_DIALOG = new CFPlus::UI::Toplevel 2157 $SETUP_DIALOG = new CFPlus::UI::Toplevel
2000 title => "Setup", 2158 title => "Setup",
2001 name => "setup_dialog", 2159 name => "setup_dialog",
2002 x => 'center', 2160 x => 'center',
2064 tooltip => "Terminates the program", 2222 tooltip => "Terminates the program",
2065 on_activate => sub { 2223 on_activate => sub {
2066 if ($CONN) { 2224 if ($CONN) {
2067 open_quit_dialog; 2225 open_quit_dialog;
2068 } else { 2226 } else {
2069 exit; 2227 Event::unloop_all;
2070 } 2228 }
2071 0 2229 0
2072 }, 2230 },
2073 ); 2231 );
2074 2232
2075 $BUTTONBAR->show; 2233 $BUTTONBAR->show;
2076 $SETUP_DIALOG->show; 2234 $SETUP_DIALOG->show;
2235 $MESSAGE_WINDOW->show;
2077 } 2236 }
2078 2237
2079 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2238 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2080} 2239}
2081 2240
2089my $animate_timer; 2248my $animate_timer;
2090 2249
2091my $fps = 9; 2250my $fps = 9;
2092 2251
2093sub force_refresh { 2252sub force_refresh {
2253 if ($ENV{CFPLUS_DEBUG} & 4) {
2094 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05; 2254 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02;
2095 debug sprintf "%3.2f", $fps if $ENV{CFPLUS_DEBUG} & 4; 2255 debug sprintf "%3.2f", $fps;
2256 }
2096 2257
2097 $CFPlus::UI::ROOT->draw; 2258 $CFPlus::UI::ROOT->draw;
2098 2259 CFPlus::SDL_GL_SwapBuffers;
2099 $WANT_REFRESH = 0;
2100 $CAN_REFRESH = 0;
2101 $LAST_REFRESH = $NOW; 2260 $LAST_REFRESH = $NOW;
2102 2261 $WANT_REFRESH->stop;
2103 CFPlus::SDL_GL_SwapBuffers;
2104} 2262}
2105 2263
2264$WANT_REFRESH = Event->idle (min => 0.001, max => 0.06, parked => 1, cb => \&force_refresh);
2265
2106my $refresh_watcher = Event->timer (after => 0, hard => 0, interval => 1 / $MAX_FPS, cb => sub { 2266my $input = Event->timer (after => 0, hard => 0, interval => 1 / 50, cb => sub {
2107 $NOW = time; 2267 $NOW = time;
2108 2268
2109 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2269 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
2110 for CFPlus::poll_events; 2270 for CFPlus::poll_events;
2111 2271
2112 if (%animate_object) { 2272 if (%animate_object) {
2113 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 2273 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
2114 ++$WANT_REFRESH; 2274 $WANT_REFRESH->start;
2115 }
2116
2117 if ($WANT_REFRESH) {
2118 force_refresh;
2119 } else {
2120 $CAN_REFRESH = 1;
2121 } 2275 }
2122}); 2276});
2123 2277
2124sub animation_start { 2278sub animation_start {
2125 my ($widget) = @_; 2279 my ($widget) = @_;
2131 delete $animate_object{$widget}; 2285 delete $animate_object{$widget};
2132} 2286}
2133 2287
2134%SDL_CB = ( 2288%SDL_CB = (
2135 CFPlus::SDL_QUIT => sub { 2289 CFPlus::SDL_QUIT => sub {
2136 exit; 2290 Event::unloop_all;
2137 }, 2291 },
2138 CFPlus::SDL_VIDEORESIZE => sub { 2292 CFPlus::SDL_VIDEORESIZE => sub {
2139 }, 2293 },
2140 CFPlus::SDL_VIDEOEXPOSE => sub { 2294 CFPlus::SDL_VIDEOEXPOSE => sub {
2141 CFPlus::UI::full_refresh; 2295 CFPlus::UI::full_refresh;
2180 CFPlus::DB::Server::run; 2334 CFPlus::DB::Server::run;
2181 2335
2182 CFPlus::UI::set_layout ($::CFG->{layout}); 2336 CFPlus::UI::set_layout ($::CFG->{layout});
2183 2337
2184 my %DEF_CFG = ( 2338 my %DEF_CFG = (
2185 sdl_mode => 0, 2339 sdl_mode => 0,
2186 fullscreen => 0, 2340 fullscreen => 0,
2187 fast => 0, 2341 fast => 0,
2342 force_opengl11 => undef,
2343 texture_compression => 1,
2188 map_scale => 1, 2344 map_scale => 1,
2189 fow_enable => 1, 2345 fow_enable => 1,
2190 fow_intensity => 0, 2346 fow_intensity => 0,
2191 map_smoothing => 1, 2347 map_smoothing => 1,
2192 gui_fontsize => 1, 2348 gui_fontsize => 1,
2193 log_fontsize => 0.7, 2349 log_fontsize => 0.7,
2194 gauge_fontsize => 1, 2350 gauge_fontsize => 1,
2195 gauge_size => 0.35, 2351 gauge_size => 0.35,
2196 stat_fontsize => 0.7, 2352 stat_fontsize => 0.7,
2197 mapsize => 100, 2353 mapsize => 100,
2198 audio_enable => 1, 2354 audio_enable => 1,
2355 audio_hw_channels => 2,
2356 audio_hw_frequency => 22050,
2357 audio_hw_chunksize => 2048,
2358 audio_mix_channels => 8,
2199 effects_enable => 1, 2359 effects_enable => 1,
2200 effects_volume => 1, 2360 effects_volume => 1,
2201 bgm_enable => 1, 2361 bgm_enable => 1,
2202 bgm_volume => 0.5, 2362 bgm_volume => 0.5,
2203 output_sync => 1, 2363 output_sync => 1,
2204 output_count => 1, 2364 output_count => 1,
2205 output_rate => "", 2365 output_rate => "",
2206 pickup => 0, 2366 pickup => 0,
2207 inv_sort => "mtime", 2367 inv_sort => "mtime",
2208 default => "profile", # default profile 2368 default => "profile", # default profile
2209 show_tips => 1, 2369 show_tips => 1,
2210 logview_max_par => 1000, 2370 logview_max_par => 1000,
2211 ); 2371 );
2212 2372
2213 while (my ($k, $v) = each %DEF_CFG) { 2373 while (my ($k, $v) = each %DEF_CFG) {
2214 $CFG->{$k} = $v unless exists $CFG->{$k}; 2374 $CFG->{$k} = $v unless exists $CFG->{$k};
2215 } 2375 }
2272# } 2432# }
2273# my $t2 = Time::HiRes::time; 2433# my $t2 = Time::HiRes::time;
2274# warn $t2-$t1; 2434# warn $t2-$t1;
2275# } 2435# }
2276 2436
2277 $startup_done->();
2278
2279 video_init; 2437 video_init;
2280 audio_init; 2438 audio_init;
2281} 2439}
2282 2440
2283show_tip_of_the_day if $CFG->{show_tips}; 2441show_tip_of_the_day if $CFG->{show_tips};
2284 2442
2443Event->idle (cb => sub {
2444 $_[0]->w->cancel;
2445 $startup_done->();
2446});
2447
2285Event::loop; 2448Event::loop;
2449
2450#video_shutdown;
2451#audio_shutdown;
2286#CFPlus::SDL_Quit; 2452CFPlus::SDL_Quit;
2287#CFPlus::_exit 0;
2288
2289END {
2290 CFPlus::SDL_Quit;
2291 CFPlus::DB::Server::stop; 2453CFPlus::DB::Server::stop;
2292}
2293 2454
2294=head1 NAME 2455=head1 NAME
2295 2456
2296cfplus - A Crossfire+ and Crossfire game client 2457cfplus - A Crossfire TRT and Crossfire game client
2297 2458
2298=head1 SYNOPSIS 2459=head1 SYNOPSIS
2299 2460
2300Just run it - no commandline arguments are supported. 2461Just run it - no commandline arguments are supported.
2301 2462
2302=head1 USAGE 2463=head1 USAGE
2303 2464
2304cfplus utilises OpenGL for all UI elements and the game. It is supposed to be used 2465cfplus utilises OpenGL for all UI elements and the game. It is supposed to
2305fullscreen and interactively. 2466be used in fullscreen mode and interactively.
2306 2467
2307=head1 DEBUGGING 2468=head1 DEBUGGING
2308 2469
2309 2470
2310CFPLUS_DEBUG - environment variable 2471CFPLUS_DEBUG - environment variable

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines