--- deliantra/Deliantra-Client/bin/cfplus 2006/10/01 14:48:51 1.120 +++ deliantra/Deliantra-Client/bin/cfplus 2006/11/18 22:36:00 1.127 @@ -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,12 +74,10 @@ 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; @@ -141,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}; @@ -353,7 +383,7 @@ my ($host, $port) = split /:/, $PROFILE->{host}; - $MAP = new CFPlus::Map $mapsize, $mapsize; + $MAP = new CFPlus::Map; $CONN = eval { new CFPlus::Protocol @@ -364,7 +394,7 @@ mapw => $mapsize, maph => $mapsize, - client => "cfplus $VERSION $] $^O", + client => "cfplus $CFPlus::VERSION $] $^O", map_widget => $MAPWIDGET, logview => $LOGVIEW, @@ -412,7 +442,6 @@ $CONN = 0; # false, does not autovivify undef $MAP; - undef $PROFILE; } sub graphics_setup { @@ -830,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 = ( @@ -870,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]; @@ -906,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 { @@ -930,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, @@ -1060,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 } ); @@ -1274,6 +1304,7 @@ $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); $sw1->add ($INV = new CFPlus::UI::Inventory); + $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}}); $hb->add (my $vb2 = new CFPlus::UI::VBox); @@ -2028,7 +2059,7 @@ gauge_size => 0.35, stat_fontsize => 0.7, mapsize => 100, - say_command => 'say', + say_command => 'chat', audio_enable => 1, bgm_enable => 1, bgm_volume => 0.25, @@ -2092,14 +2123,14 @@ # warn $t2-$t1; # } + $startup_done->(); + video_init; audio_init; } show_tip_of_the_day if $CFG->{show_tips}; -use Data::Dumper; warn Dumper [CFPlus::win32_proxy_info()];#d# - Event::loop; #CFPlus::SDL_Quit; #CFPlus::_exit 0;