--- deliantra/Deliantra-Client/bin/deliantra 2007/12/26 21:03:21 1.18 +++ deliantra/Deliantra-Client/bin/deliantra 2008/07/23 03:38:34 1.57 @@ -80,7 +80,7 @@ # prepend private library directory BEGIN { for (grep !ref, @INC) { - my $path = "$_/Deliantra/Client/private/dc"; + my $path = "$_/Deliantra/Client/private"; if (-d $path) { unshift @INC, $path; last; @@ -99,9 +99,13 @@ use Deliantra; use Deliantra::Protocol::Constants; +use AnyEvent::DNS; +use AnyEvent::Socket (); + use Compress::LZF; use DC; +BEGIN { $SIG{__DIE__} = sub { DC::fatal Carp::longmess "$_[0]" unless $^S } } use DC::OpenGL (); use DC::Protocol; use DC::DB; @@ -110,8 +114,10 @@ use DC::UI::Inventory; 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; use DC::MapWidget; use DC::Macro; @@ -124,7 +130,6 @@ }; my $MAX_FPS = 60; -my $MIN_FPS = 5; # unused as of yet our $META_SERVER = "http://metaserver.schmorp.de/current.json"; @@ -138,7 +143,11 @@ our $WANT_REFRESH; +our $MODE_SLIDER; +our $CAVEAT_LABEL; + our @SDL_MODES; +our $SDL_REINIT = 1; our $WIDTH; our $HEIGHT; our $FULLSCREEN; @@ -181,6 +190,7 @@ our $HELP_WINDOW; our $MESSAGE_WINDOW; +our $MESSAGE_DIST; our $FLOORBOX; our $GAUGES; our $STATWIDS; @@ -190,6 +200,7 @@ our $ALT_ENTER_MESSAGE; our $STATUSBOX; +our $MODBOX; our $DEBUG_STATUS; our $INV; @@ -207,7 +218,33 @@ } sub message { - $MESSAGE_WINDOW->message (@_); + $MESSAGE_DIST->message (@_); +} + +sub update_modbox { + my $mod = DC::SDL_GetModState; + + my $markup; + + $markup .= $mod & DC::KMOD_CTRL + ? ($MAPWIDGET->{ctrl} ? "[REPEAT]" : "[REPEAT]") + : "[ once ]"; + + $markup .= $mod & DC::KMOD_SHIFT + ? ($MAPWIDGET->{shft} ? "[FIRE]" : "[FIRE]") + : "[move]"; + + $markup .= $mod & (DC::KMOD_ALT | DC::KMOD_META) + ? "[ALT]" + : "[alt]"; + + $markup .= $mod & DC::KMOD_NUM + ? "[NUM]" + : "[num]"; + + # around next statement works around some bug that keeps the + # "font =>" from being used on windows + $MODBOX->set_markup ("$markup"); } ############################################################################# @@ -637,7 +674,6 @@ text => "Accept", on_activate => sub { $conn->send ("reply n"); - $STATS_PAGE->hide; destroy_query_dialog $conn; 0 }, @@ -656,7 +692,6 @@ my ($name, $id) = @$_; $hbox->add (new DC::UI::Label markup => "$conn->{stat}{$id} $name", - align => 0, expand => 1, can_events => 1, can_hover => 1, @@ -700,28 +735,21 @@ $dialog->show; } -sub start_game { - status "logging in..."; - - $LOGIN_BUTTON->set_text ("Logout"); - $SETUP_DIALOG->hide; +sub dc_connect { + my ($host, $port) = @_; my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; - my ($host, $port) = split /:/, $PROFILE->{host}; - - $MAP = new DC::Map; - - $CONN = eval { + $CONN = new DC::Protocol host => $host, - port => $port || 13327, + port => $port, user => $PROFILE->{user}, pass => $PROFILE->{password}, mapw => $mapsize, maph => $mapsize, - client => "cfplus $DC::VERSION $] $^O", + client => "$DC::VERSION $] $^O", map_widget => $MAPWIDGET, statusbox => $STATUSBOX, @@ -732,15 +760,44 @@ setup_req => { smoothing => $CFG->{map_smoothing}*1, }, - }; - if ($CONN) { - DC::lowdelay fileno $CONN->{fh}; + on_connect => sub { + if ($_[0]) { + DC::lowdelay fileno $CONN->{fh}; + + status "login successful"; + } else { + undef $CONN; + status "unable to connect: $!"; + stop_game(); + } + }, + ; +} + +sub start_game { + status "logging in..."; + + $LOGIN_BUTTON->set_text ("Logout"); + $SETUP_DIALOG->hide; + + my ($host, $port) = AnyEvent::Socket::parse_hostport $PROFILE->{host}, "deliantra=13327"; + + $MAP = new DC::Map; + + # hack to make SURE we find the IP address all right + # can be removed once AnyEvent::DNS is proven stable. + if ($host eq "gameserver.deliantra.net") { + AnyEvent::DNS::a "dnstest.deliantra.net", sub { + if ($_[0] ne "80.101.114.108") { # Perl + status "dns failure, using hardcoded address"; + $host = "129.13.162.95"; + } - status "login successful"; + dc_connect $host, $port; + }; } else { - status "unable to connect"; - stop_game(); + dc_connect $host, $port; } } @@ -772,53 +829,79 @@ my $row = 0; - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "OpenGL Info"); - $table->add_at (1, $row++, new DC::UI::Label valign => 0, fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version, + $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 valign => 0, align => 1, text => "Video Mode"); + $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 (my $mode_slider = new DC::UI::Slider - force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1], + $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 - align => 0, valign => 0, height => 0.8, template => "9999x9999@9+9", + height => 0.8, template => "9999x9999@9+9", can_events => 1, tooltip => $vidmode_tooltip); - $mode_slider->connect (changed => sub { + $MODE_SLIDER->connect (changed => sub { my ($self, $value) = @_; $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]); + $MODE_SLIDER->emit (changed => $MODE_SLIDER->{range}[0]); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fullscreen"); + $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 valign => 0, align => 1, text => "Force OpenGL 1.1"); + $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 CFPlus to use OpenGL 1.1 features only. This will normally result in " + 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.", + . "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 (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Compress Textures"); + $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 { + 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 " @@ -828,14 +911,14 @@ on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); + $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 valign => 0, align => 1, text => "GUI Fontsize"); + $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.", @@ -843,7 +926,7 @@ ); $table->add_at (1, $row++, new DC::UI::Button - expand => 1, align => 0, text => "Apply", + expand => 1, text => "Apply", tooltip => "Apply the video settings above.", on_activate => sub { video_shutdown (); @@ -852,14 +935,23 @@ } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Map Scale"); + $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 valign => 0, align => 1, text => "Map Smoothing"); + $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. " @@ -868,29 +960,29 @@ on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Fog of War"); + $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 valign => 0, align => 1, text => "FoW Intensity"); + $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 valign => 0, align => 1, text => "Message Fontsize"); + $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_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, + on_changed => sub { $MESSAGE_DIST->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); + $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.", @@ -901,7 +993,7 @@ } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Gauge size"); + $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.", @@ -945,14 +1037,14 @@ my $row = 0; - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Audio Enable"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable"); $table->add_at (1, $row++, new DC::UI::CheckBox state => $CFG->{audio_enable}, tooltip => "Master Audio Enable. If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Sound Effects"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects"); $table->add_at (1, $row, new DC::UI::CheckBox expand => 1, state => $CFG->{effects_enable}, tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.", @@ -969,7 +1061,7 @@ on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Background Music"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music"); $table->add_at (1, $row, new DC::UI::CheckBox expand => 1, state => $CFG->{bgm_enable}, tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", @@ -986,7 +1078,7 @@ on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Frequency"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Frequency"); $table->add_at (1, $row++, new DC::UI::Selector c_colspan => 2, expand => 1, value => $CFG->{audio_hw_frequency}, @@ -1005,7 +1097,7 @@ } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Channels"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Channels"); $table->add_at (1, $row++, new DC::UI::Selector c_colspan => 2, expand => 1, value => $CFG->{audio_hw_channels}, @@ -1024,7 +1116,7 @@ } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Latency"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency"); $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector c_colspan => 2, expand => 1, value => $CFG->{audio_hw_chunksize}, @@ -1038,7 +1130,7 @@ ); # should really be a slider - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Mixer Voices"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Mixer Voices"); $table->add_at (1, $row++, new DC::UI::ValSlider c_colspan => 2, expand => 1, tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.", @@ -1054,7 +1146,7 @@ ); $table->add_at (1, $row++, new DC::UI::Button - c_colspan => 2, expand => 1, align => 0, text => "Apply", + c_colspan => 2, expand => 1, text => "Apply", tooltip => "Apply the audio settings", on_activate => sub { audio_shutdown (); @@ -1114,10 +1206,10 @@ $hb->add (my $gg = new DC::UI::Gauge type => 'grace', tooltip => "#stat_grace"); $hb->add (my $fg = new DC::UI::Gauge type => 'food', tooltip => "#stat_food"); - $vbox->add (my $exp = new DC::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); + $vbox->add (my $exp = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); $vbox->add (my $prg = new DC::UI::ExperienceProgress); $vbox->add (my $sklprg = new DC::UI::ExperienceProgress); - $vbox->add (my $rng = new DC::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); + $vbox->add (my $rng = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); $GAUGES = { exp => $exp, prg => $prg, sklprg => $sklprg, @@ -1143,13 +1235,13 @@ $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } ); - $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153");#d# + $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d# $table->add_at (7,7, my $t = new DC::UI::Table expand => 0); - $t->add_at (0,0, new DC::UI::Label text => "a a a a", c_rowspan => 1, c_colspan => 2); - $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1); - $t->add_at (1,2, new DC::UI::Label text => "c c c c", c_rowspan => 1, c_colspan => 2); - $t->add_at (0,1, new DC::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1); + $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2); + $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 ); + $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2); + $t->add_at (0,1, new DC::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1, ellipsise => 0 ); $t->add_at (1,1, new DC::UI::Label text => "e"); $table->add_at (7, 6, my $c = new DC::UI::Canvas); @@ -1193,18 +1285,18 @@ child => (my $pi = new DC::UI::VBox), ); - $pi->add ($STATWIDS->{title} = new DC::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, + $pi->add ($STATWIDS->{title} = new DC::UI::Label text => "Title:", expand => 1, align => 0, can_hover => 1, can_events => 1, tooltip => "Your name and title. You can change your title by using the title command, if supported by the server."); - $pi->add ($STATWIDS->{map} = new DC::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, + $pi->add ($STATWIDS->{map} = new DC::UI::Label align => 0, text => "Map:", expand => 1, can_hover => 1, can_events => 1, tooltip => "The map you are currently on (if supported by the server)."); $pi->add (my $hb0 = new DC::UI::HBox); - $hb0->add ($STATWIDS->{weight} = new DC::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1, + $hb0->add ($STATWIDS->{weight} = new DC::UI::Label text => "Weight:", expand => 1, align => 0, can_hover => 1, can_events => 1, tooltip => "The weight of the player including all inventory items."); - $hb0->add ($STATWIDS->{m_weight} = new DC::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1, + $hb0->add ($STATWIDS->{m_weight} = new DC::UI::Label align => 0, text => "Max weight:", expand => 1, can_hover => 1, can_events => 1, tooltip => "The weight limit: you cannot carry more than this."); @@ -1235,16 +1327,16 @@ my ($col, $row, $id, $label, $template) = @$_; $tbl->add_at ($col , $row, $STATWIDS->{$id} = new DC::UI::Label - font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, - align => +1, template => $template, tooltip => "#stat_$label"); + font => $FONT_FIXED, can_hover => 1, can_events => 1, + align => 1, template => $template, tooltip => "#stat_$label"); $tbl->add_at ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new DC::UI::Label - font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, - align => -1, text => $label, tooltip => "#stat_$label"); + font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, + align => 0, text => $label, tooltip => "#stat_$label"); } $vb->add (new DC::UI::FancyFrame label => "Resistancies", - child => (my $tbl2 = new DC::UI::Table expand => 1), + child => (my $tbl2 = new DC::UI::Table expand => 1, col_expand => [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0]), ); my $row = 0; @@ -1293,13 +1385,12 @@ drain acid pois para deat phys blind fear tund elec cold ghit/) { - $tbl2->add_at ($col, $row, + $tbl2->add_at ($col + 2, $row, $STATWIDS->{"res_$_"} = new DC::UI::Label font => $FONT_FIXED, template => "-100%", - align => +1, - valign => 0, + align => 1, can_events => 1, can_hover => 1, tooltip => $resist_names{$_}->[1], @@ -1311,9 +1402,10 @@ path => "ui/resist/resist_$_.png", tooltip => $resist_names{$_}->[1], ); - $tbl2->add_at ($col + 2, $row, new DC::UI::Label + $tbl2->add_at ($col + 0, $row, new DC::UI::Label text => $resist_names{$_}->[0], font => $FONT_FIXED, + align => 1, can_hover => 1, can_events => 1, tooltip => $resist_names{$_}->[1], @@ -1321,7 +1413,7 @@ $row++; if ($row % 6 == 0) { - $col += 3; + $col += 4; $row = 0; } } @@ -1377,12 +1469,11 @@ ); my @col = qw(#Users Host Uptime Version Description); $table->add_at ($_, 0, new DC::UI::Label - can_hover => 1, can_events => 1, - align => 0, fg => [1, 1, 0], + can_hover => 1, can_events => 1, fg => [1, 1, 0], text => $col[$_], tooltip => $tip[$_]) for 0 .. $#col; - my @align = qw(1 0 1 1 -1); + my @align = qw(1 0.5 1 1 0); my $y = 0; for my $m (@{ $msg->{servers} }) { @@ -1473,14 +1564,14 @@ child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]), ); - $table->add_at (0, 4, new DC::UI::Label valign => 0, align => 1, text => "Username"); + $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username"); $table->add_at (1, 4, new DC::UI::Entry text => $CFG->{profile}{default}{user}, tooltip => "The name of your character on the server.", on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } ); - $table->add_at (0, 5, new DC::UI::Label valign => 0, align => 1, text => "Password"); + $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password"); $table->add_at (1, 5, new DC::UI::Entry text => $CFG->{profile}{default}{password}, hidden => 1, @@ -1490,7 +1581,6 @@ $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button expand => 1, - align => 0, text => "Login / Register", tooltip => "This button will either login to the account configured above or register a new account.", on_activate => sub { @@ -1503,7 +1593,7 @@ $vbox->add (new DC::UI::FancyFrame label => "Registering", min_h => 200, - child => (new DC::UI::Label valign => -1, ellipsise => 0, + child => (new DC::UI::Label valign => 0, ellipsise => 0, markup => "To register a new account, choose a username that hasn't been taken yet and " . "try to log-in. Follow the instructions in the Log tab in the message window.", @@ -1523,7 +1613,7 @@ my $row = 0; - $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Host:Port"); + $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Host:Port"); { $table->add_at (1, $row, my $vbox = new DC::UI::VBox); @@ -1531,7 +1621,7 @@ $HOST_ENTRY = new DC::UI::Entry expand => 1, text => $CFG->{profile}{default}{host}, - tooltip => "The hostname or ip address of the Deliantra server to connect to", + tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. gameserver.deliantra.net)", on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{host} = $value; @@ -1544,14 +1634,14 @@ expand => 1, text => "Server List", other => $METASERVER, - tooltip => "Show a list of available crossfire servers", + tooltip => "Show a list of available Deliantra servers", on_activate => sub { $METASERVER->toggle_visibility; 0 }, on_visibility_change => sub { $METASERVER->hide unless $_[1]; 1 }, ); }#d# } - $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Map Size"); + $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Map Size"); $table->add_at (1, $row, new DC::UI::Slider force_w => 100, range => [$CFG->{mapsize}, 10, 100, 0, 1], @@ -1562,7 +1652,7 @@ on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 1 }, ); - $table->add_at (0, ++$row, new DC::UI::Label valign => 0, align => 1, text => "Output-Rate"); + $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Output-Rate"); $table->add_at (1, $row, new DC::UI::Entry text => $CFG->{output_rate}, tooltip => "The maximum bandwidth in bytes per second that the server should not exceed " @@ -1585,7 +1675,7 @@ my $row = 0; - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Tip of the day"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Tip of the day"); $table->add_at (1, $row++, new DC::UI::CheckBox state => $CFG->{show_tips}, tooltip => "Show the Tip of the day window at startup?", @@ -1596,15 +1686,15 @@ } ); - $table->add_at (0, $row, new DC::UI::Label valign => 0, align => 1, text => "Messages Window Size"); + $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Window Size"); $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry text => $CFG->{logview_max_par}, - tooltip => "This is maximum number of messages remembered in the Messages window. If the server " + tooltip => "This is maximum number of messages remembered in the Message window. If the server " . "sends more messages than this number, older messages get removed to save memory and " . "computing time. A value of 0 disables this feature, but that is not recommended.", on_changed => sub { my ($self, $value) = @_; - $MESSAGE_WINDOW->set_max_para ($CFG->{logview_max_par} = $value*1); + $MESSAGE_DIST->set_max_par ($CFG->{logview_max_par} = $value*1); 0 }, ); @@ -1718,7 +1808,9 @@ } my %SORT_ORDER = ( - type => undef, + type => sub { + sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_ + }, mtime => sub { my $NOW = time; sort { @@ -1740,7 +1832,7 @@ my $hb = new DC::UI::HBox homogeneous => 1; $hb->add (my $vb1 = new DC::UI::VBox); - $vb1->add (new DC::UI::Label align => 0, text => "Player"); + $vb1->add (new DC::UI::Label text => "Player"); $vb1->add (my $hb1 = new DC::UI::HBox); @@ -1760,7 +1852,7 @@ ); $hb1->add (new DC::UI::Label text => "Weight: ", align => 1, expand => 1); #TODO# update to weigh/maxweight - $hb1->add ($STATWIDS->{i_weight} = new DC::UI::Label align => -1); + $hb1->add ($STATWIDS->{i_weight} = new DC::UI::Label align => 0); $vb1->add (my $sw1 = new DC::UI::ScrolledWindow expand => 1, scroll_y => 1); $sw1->add ($INV = new DC::UI::Inventory); @@ -1950,7 +2042,7 @@ for my $node (@path) { $buttons->add (new DC::UI::Button - text => $node->{kw}[0], + text => $node->[DC::Pod::N_KW][0], tooltip => "go to " . (DC::asxml DC::Pod::full_path $node) . "", on_activate => sub { push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = (); @@ -1960,7 +2052,7 @@ $buttons->add (new DC::UI::Label text => "/"); } - $buttons->add (new DC::UI::Label text => $node->{kw}[0], padding_x => 4, padding_y => 4); + $buttons->add (new DC::UI::Label text => $node->[DC::Pod::N_KW][0], padding_x => 4, padding_y => 4); $curnode = $node; @@ -2096,12 +2188,27 @@ } sub sdl_init { - DC::SDL_Init + DC::SDL_Init DC::SDL_INIT_AUDIO #| DC::SDL_NOPARACHUTE and die "SDL::Init failed!\n"; } sub video_init { - $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} >= @SDL_MODES; + DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; + $SDL_REINIT = 0; + + @SDL_MODES = DC::SDL_ListModes 8, $CFG->{disable_alpha} ? 0 : 8; + @SDL_MODES = DC::SDL_ListModes 8, 8 unless @SDL_MODES; + @SDL_MODES = DC::SDL_ListModes 5, 0 unless @SDL_MODES; + @SDL_MODES or DC::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)"; + + @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES; + + if (!exists $CFG->{sdl_mode} or $CFG->{sdl_mode} > $#SDL_MODES) { + $CFG->{sdl_mode} = 0; + for (reverse 0 .. $#SDL_MODES) { + $CFG->{sdl_mode} = $_ if $SDL_MODES[$_][0] * $SDL_MODES[$_][1] >= 800 * 600; + } + } my ($old_w, $old_h) = ($WIDTH, $HEIGHT); @@ -2149,15 +2256,35 @@ $DEBUG_STATUS->show; $STATUSBOX = new DC::UI::Statusbox; - $STATUSBOX->add ("Use Alt-Enter to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]); + + $MODBOX = new DC::UI::Label + can_events => 1, + can_hover => 1, + markup => "", + align => 0, + font => $FONT_FIXED, + tooltip => "#modifier_box", + tooltip_width => 0.67, + ; + + update_modbox; (new DC::UI::Frame bg => [0, 0, 0, 0.4], force_x => 0, force_y => "max", - child => $STATUSBOX, + child => (my $LR = new DC::UI::VBox), )->show; + $LR->add ($STATUSBOX); + $LR->add ($MODBOX); + $LR->add (new DC::UI::Label + align => 0, + markup => "Use Alt-Enter to toggle fullscreen mode", + fontsize => 0.5, + fg => [1, 1, 0, 0.7], + ); + DC::UI::Toplevel->new ( title => "Minimap", name => "mapmap", @@ -2174,8 +2301,8 @@ $MAPWIDGET->connect (activate_console => sub { my ($mapwidget, $preset) = @_; - $MESSAGE_WINDOW->activate_console ($preset) - if $MESSAGE_WINDOW; + $MESSAGE_DIST->activate_console ($preset) + if $MESSAGE_DIST; }); $MAPWIDGET->show; $MAPWIDGET->grab_focus; @@ -2197,9 +2324,17 @@ ; $METASERVER = metaserver_dialog; - $MESSAGE_WINDOW = new DC::UI::MessageWindow; + # the name is changed to not conflict with the older name as users could have hidden it + $MESSAGE_WINDOW = new DC::UI::Dockbar + name => "message_window2", + title => 'Messages', + force_w => $::WIDTH * 0.6, + force_h => $::HEIGHT * 0.25, + ; + + $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW; - $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1, debug => 1, + $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1, filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1); $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup, @@ -2227,8 +2362,8 @@ $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG, tooltip => "Toggles a dialog where you can configure all aspects of this client."); - $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW, - tooltip => "Toggles the server message log, where the client collects all messages from the server."); +# $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW, +# tooltip => "Toggles the server message log, where the client collects all messages from the server."); make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D @@ -2240,7 +2375,7 @@ tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", on_activate => sub { $::CFG->{layout} = DC::UI::get_layout; - DC::write_cfg "$Deliantra::VARDIR/client.cf"; + DC::write_cfg; status "Configuration Saved"; 0 }, @@ -2249,7 +2384,6 @@ $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, tooltip => "View Documentation"); - $BUTTONBAR->add (new DC::UI::Button text => "Quit", tooltip => "Terminates the program", @@ -2268,11 +2402,19 @@ $MESSAGE_WINDOW->show; } + $MODE_SLIDER->set_range ([$CFG->{sdl_mode}, 0, $#SDL_MODES, 1, 1]); + $MODE_SLIDER->emit (changed => $CFG->{sdl_mode}); + + $CAVEAT_LABEL->set_text ("None :)"); + $CAVEAT_LABEL->set_text ("Software Rendering (very slow)") + unless DC::SDL_GL_GetAttribute DC::SDL_GL_ACCELERATED_VISUAL; + $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); } sub video_shutdown { DC::OpenGL::shutdown; + DC::SDL_QuitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; undef $SDL_ACTIVE; } @@ -2296,10 +2438,10 @@ $LAST_REFRESH = $NOW; } -my $want_refresh = EV::idle_ns \&force_refresh; +my $want_refresh = EV::prepare_ns \&force_refresh; -my $input = EV::periodic 0, 1/60, undef, sub { - $NOW = time; +my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub { + $NOW = EV::now; ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) for DC::poll_events; @@ -2343,14 +2485,18 @@ DC::SDL_KEYDOWN => sub { if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) { # alt-enter - $FULLSCREEN_ENABLE->toggle; video_shutdown; + $FULLSCREEN_ENABLE->toggle; video_init; } else { - DC::UI::feed_sdl_key_down_event ($_[0]); + &DC::UI::feed_sdl_key_down_event; } + update_modbox; + }, + DC::SDL_KEYUP => sub { + &DC::UI::feed_sdl_key_up_event; + update_modbox; }, - DC::SDL_KEYUP => \&DC::UI::feed_sdl_key_up_event, DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event, DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event, DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event, @@ -2371,16 +2517,27 @@ }; { + DC::Pod::load_docwiki DC::find_rcfile "docwiki.pst"; + if (-e "$Deliantra::VARDIR/client.cf") { DC::read_cfg "$Deliantra::VARDIR/client.cf"; } else { #TODO: compatibility cruft DC::read_cfg "$Deliantra::OLDDIR/cfplusrc"; - print STDERR "INFO: used old configuratrion file\n"; + print STDERR "INFO: used old configuration file\n"; } DC::DB::Server::run; + if ($CFG->{db_schema} < 1) { + warn "INFO: upgrading database schema from 0 to 1, mapcache and tilecache will be lost\n"; + DC::DB::nuke_db; + $CFG->{db_schema} = 1; + DC::write_cfg; + } + + DC::DB::open_db; + DC::UI::set_layout ($::CFG->{layout}); my %DEF_CFG = ( @@ -2388,6 +2545,8 @@ fullscreen => 1, fast => 0, force_opengl11 => undef, + disable_alpha => 0, + smooth_movement => 1, texture_compression => 1, map_scale => 1, fow_enable => 1, @@ -2414,6 +2573,7 @@ default => "profile", # default profile show_tips => 1, logview_max_par => 1000, + shift_fire_stop => 0, ); while (my ($k, $v) = each %DEF_CFG) { @@ -2437,14 +2597,6 @@ sdl_init; - @SDL_MODES = DC::SDL_ListModes 8, 8; - @SDL_MODES = DC::SDL_ListModes 5, 0 unless @SDL_MODES; - @SDL_MODES or DC::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)"; - - @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES; - - $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES; - { my @fonts = map DC::find_rcfile "fonts/$_", qw( DejaVuSans.ttf @@ -2459,12 +2611,12 @@ DC::add_font $_ for @fonts; - DC::pango_init; - $FONT_PROP = new_from_file DC::Font $fonts[0]; $FONT_FIXED = new_from_file DC::Font $fonts[1]; $FONT_PROP->make_default; + + DC::pango_init; } # compare mono (ft) vs. rgba (cairo) @@ -2491,6 +2643,7 @@ $startup_done->(); }; +delete $SIG{__DIE__}; EV::loop; #video_shutdown; @@ -2524,7 +2677,7 @@ =head1 AUTHOR -Marc Lehmann , Robin Redeker +Marc Lehmann , Robin Redeker