--- deliantra/Deliantra-Client/bin/deliantra 2008/08/30 04:43:02 1.64 +++ deliantra/Deliantra-Client/bin/deliantra 2008/12/19 22:06:53 1.79 @@ -51,30 +51,10 @@ if ($^O eq "MSWin32") { # pango is relocatable on win32 - } elsif (-e "$root/pangoversion") { - open my $fh, "<:perlio", "$root/pangoversion" - or die "pangoversion: $!"; - my $PANGO = <$fh>; - # unix, need to patch pango rc file - open my $fh, "<:perlio", "$root/usr/lib/pango/$PANGO/module-files.d/libpango1.0-0.modules" - or die "$root/usr/lib/$PANGO/module-files.d/libpango1.0-0.modules: $!"; - local $/; - my $rc = <$fh>; - $rc =~ s/^\//$root\//gm; # replace abs paths by relative ones - - mkdir "$root/pango-modules"; - open my $fh, ">:perlio", "$root/pango-modules/pango.modules" - or die "$root/pango-modules/pango.modules: $!"; - print $fh $rc; - - $ENV{PANGO_RC_FILE} = "$root/pango.rc"; - open my $fh, ">:perlio", $ENV{PANGO_RC_FILE} - or die "$ENV{PANGO_RC_FILE}: $!"; - print $fh "[Pango]\nModuleFiles = $root/pango-modules\n"; } else { # OS X - $ENV{FC_CONFIG_FILE} = "$root/fonts.conf"; # no effect??!?! - $ENV{FC_CONFIG_DIR} = $root; # no effect??!?! + $ENV{FONTCONFIG_FILE} = "$root/fonts.conf"; # no effect??!?! + $ENV{FONTCONFIG_DIR} = $root; # no effect??!?! $ENV{PANGO_RC_FILE} = "$root/pango.rc"; $ENV{DYLD_LIBRARY_PATH} = $root; chdir $root; # for pango modules, maybe other things @@ -99,20 +79,35 @@ unshift @INC, $ENV{PAR_TEMP} if %PAR::LibCache; -use Time::HiRes 'time'; use EV; +BEGIN { *time = \&EV::time } + use List::Util qw(max min); use Deliantra; use Deliantra::Protocol::Constants; +use AnyEvent::Util (); use AnyEvent::DNS; use AnyEvent::Socket (); use Compress::LZF; +use JSON::XS; use DC; -BEGIN { $SIG{__DIE__} = sub { DC::fatal Carp::longmess "$_[0]" unless $^S } } + +sub crash($;$) { + # nop during compiletime +} + +BEGIN { + $SIG{__DIE__} = sub { + return if $^S; + crash "CRASH/DIE: $_[0]" => 1; + DC::fatal Carp::longmess "$_[0]"; + } +} + use DC::OpenGL (); use DC::Protocol; use DC::DB; @@ -122,7 +117,6 @@ use DC::UI::SpellList; use DC::UI::Dockable; use DC::UI::Dockbar; -use DC::UI::MessageWindow; use DC::UI::ChatView; use DC::MessageDistributor; use DC::Pod; @@ -133,6 +127,7 @@ $SIG{PIPE} = 'IGNORE'; $EV::DIED = sub { + crash "CRASH/EV::DIED: $@" => 1; DC::fatal Carp::longmess $@; }; @@ -144,7 +139,6 @@ our $NOW; our $CFG; -our $CONN; our $PROFILE; # current profile our $FAST; # fast, low-quality mode, possibly useful for software-rendering @@ -163,6 +157,8 @@ our $FONT_PROP; our $FONT_FIXED; +our $CONN; + our $MAP; our $MAPMAP; our $MAPWIDGET; @@ -216,6 +212,33 @@ ############################################################################# +# write a crash message blockingly to the socket, if possible +# this is a bit too complicated for my tastes, but it was easy. +*crash = sub($;$) { + my ($msg, $backtrace) = @_; + + return unless $CONN; + + my $fh = $CONN->{fh} + or return; + + my $buf = delete $CONN->{wbuf}; + + $buf .= pack "n/a*", "exti " . JSON::XS::encode_json [clientlog => undef, substr $msg, 0, 8000]; + + AnyEvent::Util::fh_nonblocking $fh, 0; + syswrite $fh, $buf; + AnyEvent::Util::fh_nonblocking $fh, 1; + + $msg =~ s/\s+$//; + + # backtrace as second step, in case it crashes, too + crash Carp::longmess "$msg\nbacktrace, for client version $DC::VERSION, generated" + if $backtrace; +}; + +############################################################################# + sub status { $STATUSBOX->add (DC::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); } @@ -745,7 +768,8 @@ sub dc_connect { my ($host, $port) = @_; - my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; + my $mapw = List::Util::min 48, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; + my $maph = List::Util::min 48, List::Util::max 11, int $HEIGHT * $CFG->{mapsize} * 0.01 / 32; $CONN = new DC::Protocol @@ -753,8 +777,8 @@ port => $port, user => $PROFILE->{user}, pass => $PROFILE->{password}, - mapw => $mapsize, - maph => $mapsize, + mapw => $mapw, + maph => $maph, client => "$DC::VERSION $] $^O", @@ -809,6 +833,8 @@ } sub stop_game { + crash "stop_game"; + $LOGIN_BUTTON->set_text ("Login / Register"); $SETUP_NOTEBOOK->set_current_page ($SETUP_LOGIN); $SETUP_DIALOG->show; @@ -832,184 +858,208 @@ sub graphics_setup { my $vbox = new DC::UI::VBox; - $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]); - - my $row = 0; + { + $vbox->add (my $frame = new DC::UI::FancyFrame expand => 1, label => "Video Mode"); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "OpenGL Info"); - $table->add_at (1, $row++, new DC::UI::Label fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version, - can_events => 1, - tooltip => "" . (DC::OpenGL::gl_extensions) . ""); - - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Caveats"); - $table->add_at (1, $row++, $CAVEAT_LABEL = new DC::UI::Label fontsize => 0.8, - can_events => 1, - tooltip => "This field shows any known issues with your config or driver, such as " - . "a non-accelerated display format. You can try to work around these issues " - . "by selecting a different video mode, changing the settings below or " - . "by installing the right driver for your graphics card."); - - my $vidmode_tooltip = - "Video Mode. The video mode to use for fullscreen (and the window size for windowed operation). " - . "The format is width x height \@ depth-per-channel + alpha-channel."; - - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Video Mode"); - $table->add_at (1, $row++, my $hbox = new DC::UI::HBox); - - $hbox->add ($MODE_SLIDER = new DC::UI::Slider - force_w => $WIDTH * 0.1, expand => 1, - range => [ ($CFG->{sdl_mode}) x 3 ], - tooltip => $vidmode_tooltip); - $hbox->add (my $mode_label = new DC::UI::Label - height => 0.8, template => "9999x9999@9+9", - can_events => 1, tooltip => $vidmode_tooltip); + $frame->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]); - $MODE_SLIDER->connect (changed => sub { - my ($self, $value) = @_; + my $row = 0; - $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value; - $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]}); - }); - $MODE_SLIDER->emit (changed => $MODE_SLIDER->{range}[0]); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "OpenGL Info"); + $table->add_at (1, $row++, new DC::UI::Label fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version, + can_events => 1, + tooltip => "" . (DC::OpenGL::gl_extensions) . ""); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fullscreen"); - $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::CheckBox - state => $CFG->{fullscreen}, - tooltip => "Bring the client into fullscreen mode.", - on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Caveats"); + $table->add_at (1, $row++, $CAVEAT_LABEL = new DC::UI::Label fontsize => 0.8, + can_events => 1, + tooltip => "This field shows any known issues with your config or driver, such as " + . "a non-accelerated display format. You can try to work around these issues " + . "by selecting a different video mode, changing the settings below or " + . "by installing the right driver for your graphics card."); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "UI Theme"); + $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::Selector + value => $CFG->{uitheme}, + options => [ + [wood => "Wood (the default)"], + [plain => "Plain (very)"], + [blue => "Blue (dark)"], + [metal => "Metal (light)"], + ], + tooltip => "Choose the User Interface theme that you like most :)", + on_changed => sub { my ($self, $value) = @_; $CFG->{uitheme} = $value; 0 } + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Force OpenGL 1.1"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{force_opengl11}, - tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in " - . "higher memory usage and slower performance. It will, however, help tremendously on " - . "cards that claim to support a feature but fall back to software rendering. " - . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, " - . "but cards and drivers from other vendors (ATI) are often just as bad. " - . "If you experience extremely low framerates and your card should do better, try this option.", - on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 } - ); + my $vidmode_tooltip = + "Video Mode. The video mode to use for fullscreen (and the window size for windowed operation). " + . "The format is width x height \@ depth-per-channel + alpha-channel."; + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Video Mode"); + $table->add_at (1, $row++, my $hbox = new DC::UI::HBox); + + $hbox->add ($MODE_SLIDER = new DC::UI::Slider + force_w => $WIDTH * 0.1, expand => 1, + range => [ ($CFG->{sdl_mode}) x 3 ], + tooltip => $vidmode_tooltip); + $hbox->add (my $mode_label = new DC::UI::Label + height => 0.8, template => "9999x9999@9+9", + can_events => 1, tooltip => $vidmode_tooltip); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Forbid Alpha"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{disable_alpha}, - tooltip => "Forbid off the use of the alpha channel. This makes Deliantra look a lot worse " - . "by disabling a number of textures and transparency effects. Normally, these " - . "effects do not cost a lot of resources, but some graphics cards might fall " - . "back to etxremely slow rendering if this is enabled. If disabling this option " - . "noticably improves the framerate of the client please report this! " - . "If you experience extremely low framerates and your card should do better, try this option.", - on_changed => sub { + $MODE_SLIDER->connect (changed => sub { my ($self, $value) = @_; - $CFG->{disable_alpha} = $value; - $SDL_REINIT = 1; # SDL_SetVideoMode ignores GL attr changes - 0 - } - ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{texture_compression}, - tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but " - . "will save a lot of memory and increase performance (and also fall prey to the ever-buggy Mac OS X software renderer). " - . "The compression algorithm can differ form card to card, so your mileage may vary. This setting is ignored in " - . "forced OpenGL 1.1 mode and when using the Apple renderer.", - on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 } - ); + $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value; + $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]}); + }); + $MODE_SLIDER->emit (changed => $MODE_SLIDER->{range}[0]); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fast & Ugly"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{fast}, - tooltip => "Lower the visual quality considerably to speed up rendering.", - on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fullscreen"); + $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::CheckBox + state => $CFG->{fullscreen}, + tooltip => "Bring the client into fullscreen mode.", + on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "GUI Fontsize"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], - tooltip => "The base font size used by most GUI elements that do not have their own setting.", - on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 }, - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Force OpenGL 1.1"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{force_opengl11}, + tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in " + . "higher memory usage and slower performance. It will, however, help tremendously on " + . "cards that claim to support a feature but fall back to software rendering. " + . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, " + . "but cards and drivers from other vendors (ATI) are often just as bad. " + . "If you experience extremely low framerates and your card should do better, try this option.", + on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 } + ); - $table->add_at (1, $row++, new DC::UI::Button - expand => 1, text => "Apply", - tooltip => "Apply the video settings above.", - on_activate => sub { - video_shutdown (); - video_init (); - 0 - } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Forbid Alpha"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{disable_alpha}, + tooltip => "Forbid off the use of the alpha channel. This makes Deliantra look a lot worse " + . "by disabling a number of textures and transparency effects. Normally, these " + . "effects do not cost a lot of resources, but some graphics cards might fall " + . "back to extremely slow rendering if this is enabled. If disabling this option " + . "noticably improves the framerate of the client please report this! " + . "If you experience extremely low framerates and your card should do better, try this option.", + on_changed => sub { + my ($self, $value) = @_; + $CFG->{disable_alpha} = $value; + $SDL_REINIT = 1; # SDL_SetVideoMode ignores GL attr changes + 0 + } + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Smooth Movement"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{smooth_movement}, - tooltip => "Smooth Movement tries to make movement, well, smoother, but also increases the framerate. " - . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, " - . "then disable this option. Changes take effect immdiately.", - on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{texture_compression}, + tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but " + . "will save a lot of memory and increase performance (and also fall prey to the ever-buggy Mac OS X software renderer). " + . "The compression algorithm can differ form card to card, so your mileage may vary. This setting is ignored in " + . "forced OpenGL 1.1 mode and when using the Apple renderer.", + on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 } + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], - tooltip => "Enlarge or shrink the displayed map. Changes are instant.", - on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fast & Ugly"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{fast}, + tooltip => "Lower the visual quality considerably to speed up rendering.", + on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Smoothing"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{map_smoothing}, - tooltip => "Map Smoothing tries to make tile borders less square. " - . "This increases load on the graphics subsystem and works only with TRT servers. " - . "Changes take effect at next login only.", - on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } - ); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "GUI Fontsize"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], + tooltip => "The base font size used by most GUI elements that do not have their own setting.", + on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 }, + ); - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War"); - $table->add_at (1, $row++, new DC::UI::CheckBox - state => $CFG->{fow_enable}, - tooltip => "Fog-of-War marks areas that cannot be seen by the player. Changes are instant.", - on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } - ); - - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], - tooltip => "Fog of War Lightness. The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", - on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 } - ); - - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Fontsize"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], - tooltip => "The font size used by the message/server log window only. Changes are instant, " - . "but you still need to press apply to correctly re-layout the widget.", - on_changed => sub { $MESSAGE_DIST->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, - ); - - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge fontsize"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], - tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", - on_changed => sub { - $CFG->{gauge_fontsize} = $_[1]; - &set_gauge_window_fontsize; - 0 - } - ); + $table->add_at (1, $row++, new DC::UI::Button + expand => 1, text => "Apply", + tooltip => "Apply the video settings above.", + on_activate => sub { + video_shutdown (); + video_init (); + 0 + } + ); + } - $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge size"); - $table->add_at (1, $row++, new DC::UI::Slider - range => [$CFG->{gauge_size}, 0.2, 0.8], - tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", - on_changed => sub { - $CFG->{gauge_size} = $_[1]; - $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); - 0 - } - ); + { + $vbox->add (my $frame = new DC::UI::FancyFrame expand => 1, label => "Other Settings"); + + $frame->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]); + + my $row = 0; + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Smooth Movement"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{smooth_movement}, + tooltip => "Smooth Movement tries to make movement, well, smoother, but also increases the framerate. " + . "If you have a very slow system, non-accelerated drivers or plain dislike smooth scrolling, " + . "then disable this option. Changes take effect immdiately.", + on_changed => sub { my ($self, $value) = @_; $CFG->{smooth_movement} = $value; 0 } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], + tooltip => "Enlarge or shrink the displayed map. Changes are instant.", + on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Smoothing"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{map_smoothing}, + tooltip => "Map Smoothing tries to make tile borders less square. " + . "This increases load on the graphics subsystem and works only with TRT servers. " + . "Changes take effect at next login only.", + on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War"); + $table->add_at (1, $row++, new DC::UI::CheckBox + state => $CFG->{fow_enable}, + tooltip => "Fog-of-War marks areas that cannot be seen by the player. Changes are instant.", + on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], + tooltip => "Fog of War Lightness. The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", + on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Fontsize"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], + tooltip => "The font size used by the message/server log window only. Changes are instant, " + . "but you still need to press apply to correctly re-layout the widget.", + on_changed => sub { $MESSAGE_DIST->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge fontsize"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], + tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", + on_changed => sub { + $CFG->{gauge_fontsize} = $_[1]; + &set_gauge_window_fontsize; + 0 + } + ); + + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge size"); + $table->add_at (1, $row++, new DC::UI::Slider + range => [$CFG->{gauge_size}, 0.2, 0.8], + tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", + on_changed => sub { + $CFG->{gauge_size} = $_[1]; + $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); + 0 + } + ); + } $vbox } @@ -1599,7 +1649,7 @@ $vbox->add (new DC::UI::FancyFrame label => "How to Play", - min_h => 200, + min_h => 240, child => (new DC::UI::Label valign => 0, ellipsise => 0, markup => "First select a suitable video resolution in the Graphics tab, above.\n\n" @@ -2135,7 +2185,10 @@ $hb->add (new DC::UI::Button text => "Quit anyway", expand => 1, - on_activate => sub { EV::unloop EV::UNLOOP_ALL }, + on_activate => sub { + crash "Quit anyway"; + EV::unloop EV::UNLOOP_ALL; + }, ); } @@ -2203,6 +2256,8 @@ } sub video_init { + DC::set_theme $CFG->{uitheme}; + DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; $SDL_REINIT = 0; @@ -2216,7 +2271,7 @@ if (!defined $CFG->{sdl_mode} or $CFG->{sdl_mode} > $#SDL_MODES) { $CFG->{sdl_mode} = 0; # lowest resolution by default - # now choose biggets mode <= 1024x768 + # now choose biggest mode <= 1024x768 for (0 .. $#SDL_MODES) { if ($SDL_MODES[$_][0] * $SDL_MODES[$_][1] <= 1024 * 768) { $CFG->{sdl_mode} = $_; @@ -2309,7 +2364,7 @@ border_bg => [1, 1, 1, 192/255], bg => [1, 1, 1, 0], child => ($MAPMAP = new DC::MapWidget::MapMap - tooltip => "Map. On servers that support this feature, this will display an overview of the surrounding areas.", + tooltip => "Minimap. This will display an overview of the surrounding areas.", ), )->show; @@ -2418,7 +2473,7 @@ $MESSAGE_WINDOW->show; } - $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, $#SDL_MODES, 1, 1]); + $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, scalar @SDL_MODES, 1, 1]); $MODE_SLIDER->emit (changed => $CFG->{sdl_mode}); $CAVEAT_LABEL->set_text ("None :)"); @@ -2483,6 +2538,7 @@ %SDL_CB = ( DC::SDL_QUIT => sub { + crash "SDL_QUIT"; EV::unloop EV::UNLOOP_ALL; }, DC::SDL_VIDEORESIZE => sub { @@ -2592,6 +2648,7 @@ show_tips => 1, logview_max_par => 1000, shift_fire_stop => 0, + uitheme => "wood", ); while (my ($k, $v) = each %DEF_CFG) {