--- deliantra/Deliantra-Client/bin/cfplus 2006/09/29 00:56:06 1.119 +++ deliantra/Deliantra-Client/bin/cfplus 2006/11/16 19:42:46 1.125 @@ -1,5 +1,26 @@ #!/opt/bin/perl +my $startup_done = sub { }; + +# do splash-screen thingy on win32 +BEGIN { + if (%PAR::LibCache && $^O eq "MSWin32") { + while (my ($filename, $zip) = each %PAR::LibCache) { + $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp"); + } + + require Win32::GUI::SplashScreen; + + Win32::GUI::SplashScreen::Show ( + -file => "$ENV{PAR_TEMP}/SPLASH.bmp", + ); + + $startup_done = sub { + Win32::GUI::SplashScreen::Done (1); + }; + } +} + use strict; use utf8; @@ -10,7 +31,7 @@ while (my ($filename, $zip) = each %PAR::LibCache) { for ($zip->memberNames) { - next unless /^\/root\/(.*)/; + next unless /^root\/(.*)/; $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1") unless -e "$ENV{PAR_TEMP}/$1"; } @@ -53,18 +74,17 @@ CFPlus::fatal ($_[1]); }; -our $VERSION = '0.9'; - my $MAX_FPS = 60; my $MIN_FPS = 5; # unused as of yet -our $META_SERVER = "crossfire.real-time.com:13326"; +our $META_SERVER = "http://metaserver.schmorp.de/current.json"; our $LAST_REFRESH; our $NOW; our $CFG; our $CONN; +our $PROFILE; # current profile our $FAST; # fast, low-quality mode, possibly useful for software-rendering our $WANT_REFRESH; @@ -140,6 +160,17 @@ $DEBUG_STATUS->set_text ($_[0]); } +sub message { + my ($para) = @_; + + my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0]; + + $para->{markup} = "$time $para->{markup}"; + + $LOGVIEW->add_paragraph ($para); + $LOGVIEW->scroll_to_bottom; +} + sub destroy_query_dialog { (delete $_[0]{query_dialog})->destroy if $_[0]{query_dialog}; @@ -346,22 +377,24 @@ $LOGIN_BUTTON->set_text ("Logout"); $SETUP_DIALOG->hide; + $PROFILE = $CFG->{profile}{default}; + my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; - my ($host, $port) = split /:/, $CFG->{profile}{default}{host}; + my ($host, $port) = split /:/, $PROFILE->{host}; - $MAP = new CFPlus::Map $mapsize, $mapsize; + $MAP = new CFPlus::Map; $CONN = eval { new CFPlus::Protocol host => $host, port => $port || 13327, - user => $CFG->{profile}{default}{user}, - pass => $CFG->{profile}{default}{password}, + user => $PROFILE->{user}, + pass => $PROFILE->{password}, mapw => $mapsize, maph => $mapsize, - client => "cfplus $VERSION $] $^O", + client => "cfplus $CFPlus::VERSION $] $^O", map_widget => $MAPWIDGET, logview => $LOGVIEW, @@ -826,27 +859,15 @@ $table->clear; $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list..."); - my $buf; - - my $fh = new IO::Socket::INET PeerHost => $META_SERVER, Blocking => 0; - - unless ($fh) { - $label->set_text ("unable to contact metaserver: $!"); - return; - } - - Event->io (fd => $fh, poll => 'r', cb => sub { - my $res = sysread $fh, $buf, 8192, length $buf; + my $ok = 0; - if (!defined $res) { - $_[0]->w->cancel; - $label->set_text ("error while retrieving server list: $!"); - } elsif ($res == 0) { - $_[0]->w->cancel; - status "server list retrieved"; - - utf8::decode $buf if utf8::valid $buf; + CFPlus::background { + my $ua = CFPlus::lwp_useragent; + CFPlus::background_msg CFPlus::from_json +(CFPlus::lwp_check $ua->get ($META_SERVER))->decoded_content; + } sub { + my ($msg) = @_; + if ($msg) { $table->clear; my @tip = ( @@ -866,23 +887,30 @@ my @align = qw(1 0 1 1 -1); my $y = 0; - for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) { - my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) = @$m; + for my $m ( + sort { + $b->{version} <=> $a->{version} + or $b->{users} <=> $a->{users} + } + @{ $msg->{servers} } + ) { + my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) = + @$m{qw(ip age hostname users version description ibytes obytes uptime)}; for ($desc) { s/
/\n/gi; s/
  • /\n· /gi; s/<.*?>//sgi; - s/&/&/g; - s//>/g; + s/&/&/g; + s/<//g; } $uptime = sprintf "%dd %02d:%02d:%02d", - (int $m->[8] / 86400), - (int $m->[8] / 3600) % 24, - (int $m->[8] / 60) % 60, - $m->[8] % 60; + (int $uptime / 86400), + (int $uptime / 3600) % 24, + (int $uptime / 60) % 60, + $uptime % 60; $m = [$users, $host, $uptime, $version, $desc]; @@ -902,17 +930,22 @@ ]); $table->add ($_, $y, new CFPlus::UI::Label + max_w => $::WIDTH * 0.4, ellipsise => 0, align => $align[$_], text => $m->[$_], tooltip => $tip[$_], + fg => ($m->[3] =~ /\+$/ ? [1, 1, 1] : [.7, .7, .7]), can_hover => 1, can_events => 1, fontsize => 0.8) for 0 .. $#$m; } + } else { + $ok or $label->set_text ("error while contacting metaserver"); } - }); + }; + } sub metaserver_dialog { @@ -926,7 +959,8 @@ x => 'center', y => 'center', z => 3, - force_h => $::HEIGHT * 0.4, + force_w => $::WIDTH * 0.9, + force_h => $::HEIGHT * 0.7, child => $vbox, has_close_button => 1, table => $table, @@ -1056,7 +1090,7 @@ tooltip => "Show the Tip of the day window at startup?", on_changed => sub { my ($self, $value) = @_; - $CFG->{shop_tips} = $value; + $CFG->{show_tips} = $value; 0 } ); @@ -1348,9 +1382,11 @@ $refresh = $BIND_UPD_CB = sub { $binding_list->clear (); - for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { - for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { - my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; + return unless $PROFILE; + + for my $mod (keys %{$PROFILE->{bindings}}) { + for my $sym (keys %{$PROFILE->{bindings}{$mod}}) { + my $cmds = $PROFILE->{bindings}{$mod}{$sym}; next unless ref $cmds eq 'ARRAY' and @$cmds > 0; my $lbl = join "; ", @$cmds; @@ -1361,7 +1397,7 @@ tooltip => "Deletes the binding", on_activate => sub { $binding_list->remove ($hb); - delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; + delete $PROFILE->{bindings}{$mod}{$sym}; 0 }); @@ -1370,7 +1406,7 @@ tooltip => "Edits the binding", on_activate => sub { $::BIND_EDITOR->set_binding ( - $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, + $mod, $sym, $PROFILE->{bindings}{$mod}{$sym}, sub { my ($nmod, $nsym, $ncmds) = @_; $::BIND_EDITOR->cfg_unbind ($mod, $sym); @@ -2086,6 +2122,8 @@ # warn $t2-$t1; # } + $startup_done->(); + video_init; audio_init; }