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.202 by root, Sat Aug 4 03:29:03 2007 UTC vs.
Revision 1.222 by root, Sun Aug 26 03:12:34 2007 UTC

113our $CONN; 113our $CONN;
114our $PROFILE; # current profile 114our $PROFILE; # current profile
115our $FAST; # fast, low-quality mode, possibly useful for software-rendering 115our $FAST; # fast, low-quality mode, possibly useful for software-rendering
116 116
117our $WANT_REFRESH; 117our $WANT_REFRESH;
118our $CAN_REFRESH;
119 118
120our @SDL_MODES; 119our @SDL_MODES;
121our $WIDTH; 120our $WIDTH;
122our $HEIGHT; 121our $HEIGHT;
123our $FULLSCREEN; 122our $FULLSCREEN;
168our $STATUSBOX; 167our $STATUSBOX;
169our $DEBUG_STATUS; 168our $DEBUG_STATUS;
170 169
171our $INV; 170our $INV;
172our $INVR; 171our $INVR;
173our $INV_RIGHT_HB; 172our $INVR_HB;
174
175our $PICKUP_CFG;
176 173
177############################################################################# 174#############################################################################
178 175
179sub status { 176sub status {
180 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 177 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
217 my ($face) = @_; 214 my ($face) = @_;
218 215
219 $CFG->{effects_enable} 216 $CFG->{effects_enable}
220 or return; 217 or return;
221 218
219 $AUDIO_PLAY{$face}
220 or return;
221
222 if (my $chunk = $AUDIO_CHUNK{$face}) { 222 if (my $chunk = $AUDIO_CHUNK{$face}) {
223 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) { 223 for (grep $_->[0] >= Event::time, @{(delete $AUDIO_PLAY{$face}) || []}) {
224 my (undef, $dx, $dy, $vol) = @$_; 224 my (undef, $dx, $dy, $vol) = @$_;
225 225
226 my $channel = CFPlus::Channel::find; 226 my $channel = CFPlus::Channel::find;
227 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255); 227 $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); 228 $channel->set_position_r ($dx, $dy, 20);
234
235 $chunk->play ($channel); 229 $chunk->play ($channel);
236 } 230 }
237 } else { 231 } else {
238 # sound_meta not set means data is in flight either way 232 # sound_meta not set means data is in flight either way
239 my $meta = $CONN->{sound_meta}{$face} 233 my $meta = $CONN->{face}[$face]
240 or return; 234 or return;
241 235
236 $meta->{data}
237 or return;
238
242 # if its a jingle, play it as ambient music 239 # if its a jingle, play it as ambient music
243 if ($meta->{meta}{jingle}) { 240 if ($meta->{data}{jingle}) {
244 delete $AUDIO_PLAY{$face}; # take the jingle out of the sound queue 241 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 242 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
246 &audio_music_push ($face); 243 &audio_music_push ($face);
244 }
247 } else { 245 } else {
248 # fetch from database 246 # fetch from database
249 CFPlus::DB::get res_data => $meta->{name}, sub { 247 CFPlus::DB::get res_data => $meta->{name}, sub {
250 my $rwops = new CFPlus::RW $_[0]; 248 my $rwops = new CFPlus::RW $_[0];
251 my $chunk = new CFPlus::MixChunk $rwops; 249 my $chunk = new CFPlus::MixChunk $rwops
250 or Carp::confess "sound face " . (JSON::XS::to_json $meta) . " unloadable: " . CFPlus::Mix_GetError;
252 $chunk->volume (($meta->{meta}{volume} || 1) * 128); 251 $chunk->volume (($meta->{data}{volume} || 1) * 128);
253 $AUDIO_CHUNK{$face} = $chunk; 252 $AUDIO_CHUNK{$face} = $chunk;
254 253
255 audio_sound_push ($face); 254 audio_sound_push ($face);
256 }; 255 };
257 } 256 }
265 or return; 264 or return;
266 $CFG->{effects_enable} 265 $CFG->{effects_enable}
267 or return; 266 or return;
268 267
269 my $queue = $AUDIO_PLAY{$face} ||= []; 268 my $queue = $AUDIO_PLAY{$face} ||= [];
270 push @$queue, [Event::time + 0.2, $dx, $dy, $vol]; # delay sound by max. 0.2s 269 push @$queue, [Event::time + 0.6, $dx, $dy, $vol]; # do not play sound for outdated events
271 audio_sound_push $face 270 audio_sound_push $face
272 unless @$queue > 1; 271 unless @$queue > 1;
273} 272}
274 273
275sub audio_music_set_meta { 274sub audio_music_set_meta {
276 my ($meta) = @_; 275 my ($meta) = @_;
277 276
278 $MUSIC_PLAYING_META = $meta; 277 $MUSIC_PLAYING_META = $meta;
279 $MUSIC_PLAYING_WIDGET->set_markup ( 278 $MUSIC_PLAYING_WIDGET->set_markup (
280 "<b>Name</b>: " . (CFPlus::asxml $meta->{meta}{name}) . "\n" 279 "<b>Name</b>: " . (CFPlus::asxml $meta->{data}{name}) . "\n"
281 . "<b>Author</b>: " . (CFPlus::asxml $meta->{meta}{author}) . "\n" 280 . "<b>Author</b>: " . (CFPlus::asxml $meta->{data}{author}) . "\n"
282 . "<b>Source</b>: " . (CFPlus::asxml $meta->{meta}{source}) . "\n" 281 . "<b>Source</b>: " . (CFPlus::asxml $meta->{data}{source}) . "\n"
283 . "<b>License</b>: " . (CFPlus::asxml $meta->{meta}{license}) 282 . "<b>License</b>: " . (CFPlus::asxml $meta->{data}{license})
284 ); 283 );
285} 284}
286 285
287sub audio_music_update_volume { 286sub audio_music_update_volume {
288 return unless $MUSIC_PLAYING_META; 287 return unless $MUSIC_PLAYING_META;
289 my $volume = $MUSIC_PLAYING_META->{meta}{volume} || 1; 288 my $volume = $MUSIC_PLAYING_META->{data}{volume} || 1;
290 my $base = $MUSIC_PLAYING_META->{meta}{jingle} ? 1 : $CFG->{bgm_volume}; 289 my $base = $MUSIC_PLAYING_META->{data}{jingle} ? 1 : $CFG->{bgm_volume};
291 CFPlus::MixMusic::volume $base * $volume * 128; 290 CFPlus::MixMusic::volume $base * $volume * 128;
292} 291}
293 292
294sub audio_music_start { 293sub audio_music_start {
295 my $meta = $MUSIC_PLAYING_META; 294 my $meta = $MUSIC_PLAYING_META;
308 my $rwops = $meta->{path} 307 my $rwops = $meta->{path}
309 ? new_from_file CFPlus::RW $meta->{path} 308 ? new_from_file CFPlus::RW $meta->{path}
310 : new CFPlus::RW $$MUSIC_PLAYING_DATA; 309 : new CFPlus::RW $$MUSIC_PLAYING_DATA;
311 310
312 $MUSIC_PLAYER = new CFPlus::MixMusic $rwops 311 $MUSIC_PLAYER = new CFPlus::MixMusic $rwops
313 or ((warn CFPlus::Mix_GetError), return); # pretty fatal error 312 or Carp::confess "music face $meta->{face} unloadable: " . CFPlus::Mix_GetError;
314 313
315 my $NOW = time; 314 my $NOW = time;
316 315
317 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) { 316 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) {
318 my $pos = $MUSIC_PLAYING_META->{stop_pos}; 317 my $pos = $MUSIC_PLAYING_META->{stop_pos};
338 $fade_out = 333; 337 $fade_out = 333;
339 } else { 338 } else {
340 return unless $CFG->{bgm_enable}; 339 return unless $CFG->{bgm_enable};
341 340
342 my @have = 341 my @have =
343 grep $_, 342 grep $_ && $_->{data},
344 map $CONN->{music_meta}{$_}, 343 map $CONN->{face}[$_],
345 @$MUSIC_WANT; 344 @$MUSIC_WANT;
346 345
347 @MUSIC_HAVE = @have 346 @MUSIC_HAVE = @have
348 if @have; 347 if @have;
349 348
417 416
418sub audio_shutdown { 417sub audio_shutdown {
419 undef $MUSIC_PLAYER; 418 undef $MUSIC_PLAYER;
420 undef $MUSIC_PLAYING_META; 419 undef $MUSIC_PLAYING_META;
421 undef $MUSIC_PLAYING_DATA; 420 undef $MUSIC_PLAYING_DATA;
422
423 audio_music_set_meta { };
424 421
425 $MUSIC_WANT = []; 422 $MUSIC_WANT = [];
426 @MUSIC_JINGLE = (); 423 @MUSIC_JINGLE = ();
427 %AUDIO_PLAY = (); 424 %AUDIO_PLAY = ();
428 %AUDIO_CHUNK = (); 425 %AUDIO_CHUNK = ();
773 state => $CFG->{fullscreen}, 770 state => $CFG->{fullscreen},
774 tooltip => "Bring the client into fullscreen mode.", 771 tooltip => "Bring the client into fullscreen mode.",
775 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } 772 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
776 ); 773 );
777 774
775 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Force OpenGL 1.1");
776 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
777 state => $CFG->{force_opengl11},
778 tooltip => "Limit CFPlus to use OpenGL 1.1 features only. This will normally result in "
779 . "higher memory usage and slower performance. It will, however, help tremendously on "
780 . "cards that claim to support a feature but fall back to software rendering. "
781 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, "
782 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you "
783 . "experience extremely low framerates and your card should do better, try this option.</b>",
784 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 }
785 );
786
787 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Compress Textures");
788 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
789 state => $CFG->{texture_compression},
790 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but "
791 . "will save a lot of memory and increase performance. The compression algorithm "
792 . "can differ form card to card, so your mileage may vary. This setting is ignored in "
793 . "forced OpenGL 1.1 mode.",
794 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 }
795 );
796
778 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 797 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fast & Ugly");
779 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 798 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
780 state => $CFG->{fast}, 799 state => $CFG->{fast},
781 tooltip => "Lower the visual quality considerably to speed up rendering.", 800 tooltip => "Lower the visual quality considerably to speed up rendering.",
782 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } 801 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
808 827
809 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Smoothing"); 828 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Smoothing");
810 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 829 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
811 state => $CFG->{map_smoothing}, 830 state => $CFG->{map_smoothing},
812 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. " 831 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. "
813 . "This increases load on the graphics subsystem and works only with 2.x servers. " 832 . "This increases load on the graphics subsystem and works only with TRT servers. "
814 . "Changes take effect at next connection only.", 833 . "Changes take effect at next login only.",
815 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } 834 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 }
816 ); 835 );
817 836
818 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fog of War"); 837 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fog of War");
819 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 838 $table->add_at (1, $row++, new CFPlus::UI::CheckBox
830 ); 849 );
831 850
832 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 851 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Message Fontsize");
833 $table->add_at (1, $row++, new CFPlus::UI::Slider 852 $table->add_at (1, $row++, new CFPlus::UI::Slider
834 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 853 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
835 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.", 854 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, "
855 . "but you still need to press apply to correctly re-layout the widget.",
836 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, 856 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
837 ); 857 );
838 858
839 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 859 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
840 $table->add_at (1, $row++, new CFPlus::UI::Slider 860 $table->add_at (1, $row++, new CFPlus::UI::Slider
877# $table->add_at (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume"); 897# $table->add_at (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume");
878# $table->add_at (1, 8, new CFPlus::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub { 898# $table->add_at (1, 8, new CFPlus::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
879# $CFG->{effects_volume} = $_[1]; 899# $CFG->{effects_volume} = $_[1];
880# }); 900# });
881 901
882 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Effects Volume"); 902 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Sound Effects");
883 $table->add_at (1, $row, new CFPlus::UI::CheckBox 903 $table->add_at (1, $row, new CFPlus::UI::CheckBox
884 expand => 1, state => $CFG->{effects_enable}, 904 expand => 1, state => $CFG->{effects_enable},
885 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.", 905 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.",
906 on_changed => sub {
886 on_changed => sub { $CFG->{effects_enable} = $_[1]; 0 } 907 $CFG->{effects_enable} = $_[1];
908 $CONN->update_fx_want if $CONN;
909 0
910 }
887 ); 911 );
888 $table->add_at (2, $row++, new CFPlus::UI::Slider 912 $table->add_at (2, $row++, new CFPlus::UI::Slider
889 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128], 913 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128],
890 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this " 914 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this "
891 . "is set highest and you use your operating system volume setting. Changes are instant.", 915 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.",
892 on_changed => sub { $CFG->{effects_volume} = $_[1]; 0 } 916 on_changed => sub { $CFG->{effects_volume} = $_[1]; 0 }
893 ); 917 );
894 918
895 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music"); 919 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music");
896 $table->add_at (1, $row, new CFPlus::UI::CheckBox 920 $table->add_at (1, $row, new CFPlus::UI::CheckBox
897 expand => 1, state => $CFG->{bgm_enable}, 921 expand => 1, state => $CFG->{bgm_enable},
898 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 922 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
899 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 } 923 on_changed => sub {
924 $CFG->{bgm_enable} = $_[1];
925 $CONN->update_fx_want if $CONN;
926 audio_music_push;
927 0
928 }
900 ); 929 );
901 $table->add_at (2, $row++, new CFPlus::UI::Slider 930 $table->add_at (2, $row++, new CFPlus::UI::Slider
902 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 931 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
903 tooltip => "The volume of the background music. Changes are instant.", 932 tooltip => "The volume of the background music. Changes are instant.",
904 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } 933 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 }
955 $hb->add (my $hg = new CFPlus::UI::Gauge type => 'hp', tooltip => "#stat_health"); 984 $hb->add (my $hg = new CFPlus::UI::Gauge type => 'hp', tooltip => "#stat_health");
956 $hb->add (my $mg = new CFPlus::UI::Gauge type => 'mana', tooltip => "#stat_mana"); 985 $hb->add (my $mg = new CFPlus::UI::Gauge type => 'mana', tooltip => "#stat_mana");
957 $hb->add (my $gg = new CFPlus::UI::Gauge type => 'grace', tooltip => "#stat_grace"); 986 $hb->add (my $gg = new CFPlus::UI::Gauge type => 'grace', tooltip => "#stat_grace");
958 $hb->add (my $fg = new CFPlus::UI::Gauge type => 'food', tooltip => "#stat_food"); 987 $hb->add (my $fg = new CFPlus::UI::Gauge type => 'food', tooltip => "#stat_food");
959 988
960 $vbox->add (my $exp = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); 989 $vbox->add (my $exp = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp");
990 $vbox->add (my $prg = new CFPlus::UI::ExperienceProgress);
991 $vbox->add (my $sklprg = new CFPlus::UI::ExperienceProgress);
961 $vbox->add (my $rng = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); 992 $vbox->add (my $rng = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged");
962 993
963 $GAUGES = { 994 $GAUGES = {
995 exp => $exp, prg => $prg, sklprg => $sklprg,
964 exp => $exp, win => $win, range => $rng, 996 win => $win, range => $rng,
965 food => $fg, mana => $mg, hp => $hg, grace => $gg 997 hp => $hg, mana => $mg, grace => $gg, food => $fg,
966 }; 998 };
967 999
968 &set_gauge_window_fontsize; 1000 &set_gauge_window_fontsize;
969 1001
970 $win 1002 $win
1171 $r 1203 $r
1172} 1204}
1173 1205
1174sub skill_window { 1206sub skill_window {
1175 my $sw = new CFPlus::UI::ScrolledWindow (expand => 1); 1207 my $sw = new CFPlus::UI::ScrolledWindow (expand => 1);
1208
1176 $sw->add ($STATWIDS->{skill_tbl} = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1]); 1209 $sw->add ($STATWIDS->{skill_tbl} = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1, .1, 0, 0, 1, .1]);
1210
1177 $sw 1211 $sw
1178} 1212}
1179 1213
1180sub formsep($) { 1214sub formsep($) {
1181 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1 1215 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
1593 $sw1->add ($INV = new CFPlus::UI::Inventory); 1627 $sw1->add ($INV = new CFPlus::UI::Inventory);
1594 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}}); 1628 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1595 1629
1596 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1630 $hb->add (my $vb2 = new CFPlus::UI::VBox);
1597 1631
1598 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox); 1632 $vb2->add ($INVR_HB = new CFPlus::UI::HBox);
1599 1633
1600 $vb2->add (my $sw2 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1634 $vb2->add (my $sw2 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1);
1601 $sw2->add ($INVR = new CFPlus::UI::Inventory); 1635 $sw2->add ($INVR = new CFPlus::UI::Inventory);
1602 1636
1603 # XXX: Call after $INVR = ... because set_opencont sets the items 1637 # XXX: Call after $INVR = ... because set_opencont sets the items
1626} 1660}
1627 1661
1628sub add_license { 1662sub add_license {
1629 my ($meta) = @_; 1663 my ($meta) = @_;
1630 1664
1631 $meta = $meta->{meta} 1665 $meta = $meta->{data}
1632 or return; 1666 or return;
1633 1667
1634 $meta->{license} || $meta->{author} || $meta->{source} 1668 $meta->{license} || $meta->{author} || $meta->{source}
1635 or return; 1669 or return;
1636 1670
1858 on_activate => sub { $QUIT_DIALOG->hide; 0 }, 1892 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1859 ); 1893 );
1860 $hb->add (new CFPlus::UI::Button 1894 $hb->add (new CFPlus::UI::Button
1861 text => "Quit anyway", 1895 text => "Quit anyway",
1862 expand => 1, 1896 expand => 1,
1863 on_activate => sub { exit }, 1897 on_activate => sub { Event::unloop_all },
1864 ); 1898 );
1865 } 1899 }
1866 1900
1867 $QUIT_DIALOG->show; 1901 $QUIT_DIALOG->show;
1868 $QUIT_DIALOG->grab_focus; 1902 $QUIT_DIALOG->grab_focus;
2062 tooltip => "Terminates the program", 2096 tooltip => "Terminates the program",
2063 on_activate => sub { 2097 on_activate => sub {
2064 if ($CONN) { 2098 if ($CONN) {
2065 open_quit_dialog; 2099 open_quit_dialog;
2066 } else { 2100 } else {
2067 exit; 2101 Event::unloop_all;
2068 } 2102 }
2069 0 2103 0
2070 }, 2104 },
2071 ); 2105 );
2072 2106
2073 $BUTTONBAR->show; 2107 $BUTTONBAR->show;
2074 $SETUP_DIALOG->show; 2108 $SETUP_DIALOG->show;
2109 $MESSAGE_WINDOW->show;
2075 } 2110 }
2076 2111
2077 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2112 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2078} 2113}
2079 2114
2087my $animate_timer; 2122my $animate_timer;
2088 2123
2089my $fps = 9; 2124my $fps = 9;
2090 2125
2091sub force_refresh { 2126sub force_refresh {
2127 if ($ENV{CFPLUS_DEBUG} & 4) {
2092 $fps = $fps * 0.95 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.05; 2128 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02;
2093 debug sprintf "%3.2f", $fps if $ENV{CFPLUS_DEBUG} & 4; 2129 debug sprintf "%3.2f", $fps;
2130 }
2094 2131
2095 $CFPlus::UI::ROOT->draw; 2132 $CFPlus::UI::ROOT->draw;
2096 2133 CFPlus::SDL_GL_SwapBuffers;
2097 $WANT_REFRESH = 0;
2098 $CAN_REFRESH = 0;
2099 $LAST_REFRESH = $NOW; 2134 $LAST_REFRESH = $NOW;
2100 2135 $WANT_REFRESH->stop;
2101 CFPlus::SDL_GL_SwapBuffers;
2102} 2136}
2103 2137
2138$WANT_REFRESH = Event->idle (min => 0.001, max => 0.06, parked => 1, cb => \&force_refresh);
2139
2104my $refresh_watcher = Event->timer (after => 0, hard => 0, interval => 1 / $MAX_FPS, cb => sub { 2140my $input = Event->timer (after => 0, hard => 0, interval => 1 / 50, cb => sub {
2105 $NOW = time; 2141 $NOW = time;
2106 2142
2107 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2143 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
2108 for CFPlus::poll_events; 2144 for CFPlus::poll_events;
2109 2145
2110 if (%animate_object) { 2146 if (%animate_object) {
2111 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 2147 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
2112 ++$WANT_REFRESH; 2148 $WANT_REFRESH->start;
2113 }
2114
2115 if ($WANT_REFRESH) {
2116 force_refresh;
2117 } else {
2118 $CAN_REFRESH = 1;
2119 } 2149 }
2120}); 2150});
2121 2151
2122sub animation_start { 2152sub animation_start {
2123 my ($widget) = @_; 2153 my ($widget) = @_;
2129 delete $animate_object{$widget}; 2159 delete $animate_object{$widget};
2130} 2160}
2131 2161
2132%SDL_CB = ( 2162%SDL_CB = (
2133 CFPlus::SDL_QUIT => sub { 2163 CFPlus::SDL_QUIT => sub {
2134 exit; 2164 Event::unloop_all;
2135 }, 2165 },
2136 CFPlus::SDL_VIDEORESIZE => sub { 2166 CFPlus::SDL_VIDEORESIZE => sub {
2137 }, 2167 },
2138 CFPlus::SDL_VIDEOEXPOSE => sub { 2168 CFPlus::SDL_VIDEOEXPOSE => sub {
2139 CFPlus::UI::full_refresh; 2169 CFPlus::UI::full_refresh;
2178 CFPlus::DB::Server::run; 2208 CFPlus::DB::Server::run;
2179 2209
2180 CFPlus::UI::set_layout ($::CFG->{layout}); 2210 CFPlus::UI::set_layout ($::CFG->{layout});
2181 2211
2182 my %DEF_CFG = ( 2212 my %DEF_CFG = (
2183 sdl_mode => 0, 2213 sdl_mode => 0,
2184 fullscreen => 0, 2214 fullscreen => 0,
2185 fast => 0, 2215 fast => 0,
2216 force_opengl11 => undef,
2217 texture_compression => 1,
2186 map_scale => 1, 2218 map_scale => 1,
2187 fow_enable => 1, 2219 fow_enable => 1,
2188 fow_intensity => 0, 2220 fow_intensity => 0,
2189 map_smoothing => 1, 2221 map_smoothing => 1,
2190 gui_fontsize => 1, 2222 gui_fontsize => 1,
2191 log_fontsize => 0.7, 2223 log_fontsize => 0.7,
2192 gauge_fontsize => 1, 2224 gauge_fontsize => 1,
2193 gauge_size => 0.35, 2225 gauge_size => 0.35,
2194 stat_fontsize => 0.7, 2226 stat_fontsize => 0.7,
2195 mapsize => 100, 2227 mapsize => 100,
2196 audio_enable => 1, 2228 audio_enable => 1,
2197 effects_enable => 1, 2229 effects_enable => 1,
2198 effects_volume => 1, 2230 effects_volume => 1,
2199 bgm_enable => 1, 2231 bgm_enable => 1,
2200 bgm_volume => 0.5, 2232 bgm_volume => 0.5,
2201 output_sync => 1, 2233 output_sync => 1,
2202 output_count => 1, 2234 output_count => 1,
2203 output_rate => "", 2235 output_rate => "",
2204 pickup => 0, 2236 pickup => 0,
2205 inv_sort => "mtime", 2237 inv_sort => "mtime",
2206 default => "profile", # default profile 2238 default => "profile", # default profile
2207 show_tips => 1, 2239 show_tips => 1,
2208 logview_max_par => 1000, 2240 logview_max_par => 1000,
2209 ); 2241 );
2210 2242
2211 while (my ($k, $v) = each %DEF_CFG) { 2243 while (my ($k, $v) = each %DEF_CFG) {
2212 $CFG->{$k} = $v unless exists $CFG->{$k}; 2244 $CFG->{$k} = $v unless exists $CFG->{$k};
2213 } 2245 }
2270# } 2302# }
2271# my $t2 = Time::HiRes::time; 2303# my $t2 = Time::HiRes::time;
2272# warn $t2-$t1; 2304# warn $t2-$t1;
2273# } 2305# }
2274 2306
2275 $startup_done->();
2276
2277 video_init; 2307 video_init;
2278 audio_init; 2308 audio_init;
2279} 2309}
2280 2310
2281show_tip_of_the_day if $CFG->{show_tips}; 2311show_tip_of_the_day if $CFG->{show_tips};
2282 2312
2313Event->idle (cb => sub {
2314 $_[0]->w->cancel;
2315 $startup_done->();
2316});
2317
2283Event::loop; 2318Event::loop;
2319
2320#video_shutdown;
2321#audio_shutdown;
2284#CFPlus::SDL_Quit; 2322CFPlus::SDL_Quit;
2285#CFPlus::_exit 0;
2286
2287END {
2288 CFPlus::SDL_Quit;
2289 CFPlus::DB::Server::stop; 2323CFPlus::DB::Server::stop;
2290}
2291 2324
2292=head1 NAME 2325=head1 NAME
2293 2326
2294cfplus - A Crossfire+ and Crossfire game client 2327cfplus - A Crossfire TRT and Crossfire game client
2295 2328
2296=head1 SYNOPSIS 2329=head1 SYNOPSIS
2297 2330
2298Just run it - no commandline arguments are supported. 2331Just run it - no commandline arguments are supported.
2299 2332
2300=head1 USAGE 2333=head1 USAGE
2301 2334
2302cfplus utilises OpenGL for all UI elements and the game. It is supposed to be used 2335cfplus utilises OpenGL for all UI elements and the game. It is supposed to
2303fullscreen and interactively. 2336be used in fullscreen mode and interactively.
2304 2337
2305=head1 DEBUGGING 2338=head1 DEBUGGING
2306 2339
2307 2340
2308CFPLUS_DEBUG - environment variable 2341CFPLUS_DEBUG - environment variable

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines