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.120 by root, Sun Oct 1 14:48:51 2006 UTC vs.
Revision 1.128 by root, Sat Nov 18 23:31:24 2006 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2
3my $startup_done = sub { };
4
5# do splash-screen thingy on win32
6BEGIN {
7 if (%PAR::LibCache && $^O eq "MSWin32") {
8 while (my ($filename, $zip) = each %PAR::LibCache) {
9 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
10 }
11
12 require Win32::GUI::SplashScreen;
13
14 Win32::GUI::SplashScreen::Show (
15 -file => "$ENV{PAR_TEMP}/SPLASH.bmp",
16 );
17
18 $startup_done = sub {
19 Win32::GUI::SplashScreen::Done (1);
20 };
21 }
22}
2 23
3use strict; 24use strict;
4use utf8; 25use utf8;
5 26
6# do things only needed for single-binary version (par) 27# do things only needed for single-binary version (par)
8 if (%PAR::LibCache) { 29 if (%PAR::LibCache) {
9 @INC = grep ref, @INC; # weed out all paths except pars loader refs 30 @INC = grep ref, @INC; # weed out all paths except pars loader refs
10 31
11 while (my ($filename, $zip) = each %PAR::LibCache) { 32 while (my ($filename, $zip) = each %PAR::LibCache) {
12 for ($zip->memberNames) { 33 for ($zip->memberNames) {
13 next unless /^\/root\/(.*)/; 34 next unless /^root\/(.*)/;
14 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1") 35 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1")
15 unless -e "$ENV{PAR_TEMP}/$1"; 36 unless -e "$ENV{PAR_TEMP}/$1";
16 } 37 }
17 } 38 }
18 39
51 Carp::cluck $_[1];#d#TODO: remove when stable 72 Carp::cluck $_[1];#d#TODO: remove when stable
52 return;#d# 73 return;#d#
53 CFPlus::fatal ($_[1]); 74 CFPlus::fatal ($_[1]);
54}; 75};
55 76
56our $VERSION = '0.9';
57
58my $MAX_FPS = 60; 77my $MAX_FPS = 60;
59my $MIN_FPS = 5; # unused as of yet 78my $MIN_FPS = 5; # unused as of yet
60 79
61our $META_SERVER = "crossfire.real-time.com:13326"; 80our $META_SERVER = "http://metaserver.schmorp.de/current.json";
62 81
63our $LAST_REFRESH; 82our $LAST_REFRESH;
64our $NOW; 83our $NOW;
65 84
66our $CFG; 85our $CFG;
137 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 156 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
138} 157}
139 158
140sub debug { 159sub debug {
141 $DEBUG_STATUS->set_text ($_[0]); 160 $DEBUG_STATUS->set_text ($_[0]);
161}
162
163sub message {
164 my ($para) = @_;
165
166 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
167
168 $para->{markup} = "<span foreground='#ffffff'>$time</span> $para->{markup}";
169
170 $LOGVIEW->add_paragraph ($para);
171 $LOGVIEW->scroll_to_bottom;
142} 172}
143 173
144sub destroy_query_dialog { 174sub destroy_query_dialog {
145 (delete $_[0]{query_dialog})->destroy 175 (delete $_[0]{query_dialog})->destroy
146 if $_[0]{query_dialog}; 176 if $_[0]{query_dialog};
351 381
352 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 382 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
353 383
354 my ($host, $port) = split /:/, $PROFILE->{host}; 384 my ($host, $port) = split /:/, $PROFILE->{host};
355 385
356 $MAP = new CFPlus::Map $mapsize, $mapsize; 386 $MAP = new CFPlus::Map;
357 387
358 $CONN = eval { 388 $CONN = eval {
359 new CFPlus::Protocol 389 new CFPlus::Protocol
360 host => $host, 390 host => $host,
361 port => $port || 13327, 391 port => $port || 13327,
362 user => $PROFILE->{user}, 392 user => $PROFILE->{user},
363 pass => $PROFILE->{password}, 393 pass => $PROFILE->{password},
364 mapw => $mapsize, 394 mapw => $mapsize,
365 maph => $mapsize, 395 maph => $mapsize,
366 396
367 client => "cfplus $VERSION $] $^O", 397 client => "cfplus $CFPlus::VERSION $] $^O",
368 398
369 map_widget => $MAPWIDGET, 399 map_widget => $MAPWIDGET,
370 logview => $LOGVIEW, 400 logview => $LOGVIEW,
371 statusbox => $STATUSBOX, 401 statusbox => $STATUSBOX,
372 map => $MAP, 402 map => $MAP,
410 destroy_query_dialog $CONN; 440 destroy_query_dialog $CONN;
411 $CONN->destroy; 441 $CONN->destroy;
412 $CONN = 0; # false, does not autovivify 442 $CONN = 0; # false, does not autovivify
413 443
414 undef $MAP; 444 undef $MAP;
415 undef $PROFILE;
416} 445}
417 446
418sub graphics_setup { 447sub graphics_setup {
419 my $vbox = new CFPlus::UI::VBox; 448 my $vbox = new CFPlus::UI::VBox;
420 449
828 857
829 my $table = $METASERVER->{table}; 858 my $table = $METASERVER->{table};
830 $table->clear; 859 $table->clear;
831 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list..."); 860 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list...");
832 861
833 my $buf; 862 my $ok = 0;
834 863
835 my $fh = new IO::Socket::INET PeerHost => $META_SERVER, Blocking => 0; 864 CFPlus::background {
865 my $ua = CFPlus::lwp_useragent;
836 866
837 unless ($fh) { 867 CFPlus::background_msg CFPlus::from_json +(CFPlus::lwp_check $ua->get ($META_SERVER))->decoded_content;
838 $label->set_text ("unable to contact metaserver: $!"); 868 } sub {
839 return; 869 my ($msg) = @_;
840 } 870 if ($msg) {
841
842 Event->io (fd => $fh, poll => 'r', cb => sub {
843 my $res = sysread $fh, $buf, 8192, length $buf;
844
845 if (!defined $res) {
846 $_[0]->w->cancel;
847 $label->set_text ("error while retrieving server list: $!");
848 } elsif ($res == 0) {
849 $_[0]->w->cancel;
850 status "server list retrieved";
851
852 utf8::decode $buf if utf8::valid $buf;
853
854 $table->clear; 871 $table->clear;
855 872
856 my @tip = ( 873 my @tip = (
857 "The current number of users logged in on the server.", 874 "The current number of users logged in on the server.",
858 "The hostname of the server.", 875 "The hostname of the server.",
868 for 0 .. $#col; 885 for 0 .. $#col;
869 886
870 my @align = qw(1 0 1 1 -1); 887 my @align = qw(1 0 1 1 -1);
871 888
872 my $y = 0; 889 my $y = 0;
873 for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) { 890 for my $m (
891 sort {
892 $b->{version} <=> $a->{version}
893 or $b->{users} <=> $a->{users}
894 }
895 @{ $msg->{servers} }
896 ) {
874 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) = @$m; 897 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) =
898 @$m{qw(ip age hostname users version description ibytes obytes uptime)};
875 899
876 for ($desc) { 900 for ($desc) {
877 s/<br>/\n/gi; 901 s/<br>/\n/gi;
878 s/<li>/\n· /gi; 902 s/<li>/\n· /gi;
879 s/<.*?>//sgi; 903 s/<.*?>//sgi;
880 s/&/&amp;/g; 904 s/&amp;/&/g;
881 s/</&lt;/g; 905 s/&lt;/</g;
882 s/>/&gt;/g; 906 s/&gt;/>/g;
883 } 907 }
884 908
885 $uptime = sprintf "%dd %02d:%02d:%02d", 909 $uptime = sprintf "%dd %02d:%02d:%02d",
886 (int $m->[8] / 86400), 910 (int $uptime / 86400),
887 (int $m->[8] / 3600) % 24, 911 (int $uptime / 3600) % 24,
888 (int $m->[8] / 60) % 60, 912 (int $uptime / 60) % 60,
889 $m->[8] % 60; 913 $uptime % 60;
890 914
891 $m = [$users, $host, $uptime, $version, $desc]; 915 $m = [$users, $host, $uptime, $version, $desc];
892 916
893 $y++; 917 $y++;
894 918
904 ), 928 ),
905 (new CFPlus::UI::Empty expand => 1), 929 (new CFPlus::UI::Empty expand => 1),
906 ]); 930 ]);
907 931
908 $table->add ($_, $y, new CFPlus::UI::Label 932 $table->add ($_, $y, new CFPlus::UI::Label
933 max_w => $::WIDTH * 0.4,
909 ellipsise => 0, 934 ellipsise => 0,
910 align => $align[$_], 935 align => $align[$_],
911 text => $m->[$_], 936 text => $m->[$_],
912 tooltip => $tip[$_], 937 tooltip => $tip[$_],
938 fg => ($m->[3] =~ /\+$/ ? [1, 1, 1] : [.7, .7, .7]),
913 can_hover => 1, 939 can_hover => 1,
914 can_events => 1, 940 can_events => 1,
915 fontsize => 0.8) 941 fontsize => 0.8)
916 for 0 .. $#$m; 942 for 0 .. $#$m;
917 } 943 }
944 } else {
945 $ok or $label->set_text ("error while contacting metaserver");
918 } 946 }
919 }); 947 };
948
920} 949}
921 950
922sub metaserver_dialog { 951sub metaserver_dialog {
923 my $vbox = new CFPlus::UI::VBox; 952 my $vbox = new CFPlus::UI::VBox;
924 my $table = new CFPlus::UI::Table; 953 my $table = new CFPlus::UI::Table;
928 title => "Server List", 957 title => "Server List",
929 name => 'metaserver_dialog', 958 name => 'metaserver_dialog',
930 x => 'center', 959 x => 'center',
931 y => 'center', 960 y => 'center',
932 z => 3, 961 z => 3,
962 force_w => $::WIDTH * 0.9,
933 force_h => $::HEIGHT * 0.4, 963 force_h => $::HEIGHT * 0.7,
934 child => $vbox, 964 child => $vbox,
935 has_close_button => 1, 965 has_close_button => 1,
936 table => $table, 966 table => $table,
937 on_visibility_change => sub { 967 on_visibility_change => sub {
938 update_metaserver ($_[0]) if $_[1]; 968 update_metaserver ($_[0]) if $_[1];
1058 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox 1088 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox
1059 state => $CFG->{show_tips}, 1089 state => $CFG->{show_tips},
1060 tooltip => "Show the <b>Tip of the day</b> window at startup?", 1090 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1061 on_changed => sub { 1091 on_changed => sub {
1062 my ($self, $value) = @_; 1092 my ($self, $value) = @_;
1063 $CFG->{shop_tips} = $value; 1093 $CFG->{show_tips} = $value;
1064 0 1094 0
1065 } 1095 }
1066 ); 1096 );
1067 1097
1068 $vbox->add (new CFPlus::UI::FancyFrame 1098 $vbox->add (new CFPlus::UI::FancyFrame
1272 #TODO# update to weigh/maxweight 1302 #TODO# update to weigh/maxweight
1273 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1); 1303 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1);
1274 1304
1275 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1305 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1);
1276 $sw1->add ($INV = new CFPlus::UI::Inventory); 1306 $sw1->add ($INV = new CFPlus::UI::Inventory);
1307 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1277 1308
1278 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1309 $hb->add (my $vb2 = new CFPlus::UI::VBox);
1279 1310
1280 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox); 1311 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox);
1281 1312
1884 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128; 1915 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128;
1885 1916
1886 audio_music_finished; 1917 audio_music_finished;
1887 1918
1888 while (<$fh>) { 1919 while (<$fh>) {
1920 last;
1889 next if /^\s*#/; 1921 next if /^\s*#/;
1890 next if /^\s*$/; 1922 next if /^\s*$/;
1891 1923
1892 my ($file, $volume, $event) = split /\s+/, $_, 3; 1924 my ($file, $volume, $event) = split /\s+/, $_, 3;
1893 1925
1894 push @SOUNDS, "$volume,$file"; 1926 push @SOUNDS, "$volume,$file";
1895 1927
1896 $AUDIO_CHUNKS{"$volume,$file"} ||= do { 1928# $AUDIO_CHUNKS{"$volume,$file"} ||= do {
1897 my $chunk = new_from_file CFPlus::MixChunk CFPlus::find_rcfile "sounds/$file"; 1929# my $chunk = new_from_file CFPlus::MixChunk CFPlus::find_rcfile "sounds/$file";
1898 $chunk->volume ($volume * 128 / 100); 1930# $chunk->volume ($volume * 128 / 100);
1899 $chunk 1931# $chunk
1900 }; 1932# };
1901 } 1933 }
1902 } else { 1934 } else {
1903 status "unable to open sound config: $!"; 1935 status "unable to open sound config: $!";
1904 } 1936 }
1905 } 1937 }
2026 log_fontsize => 0.7, 2058 log_fontsize => 0.7,
2027 gauge_fontsize => 1, 2059 gauge_fontsize => 1,
2028 gauge_size => 0.35, 2060 gauge_size => 0.35,
2029 stat_fontsize => 0.7, 2061 stat_fontsize => 0.7,
2030 mapsize => 100, 2062 mapsize => 100,
2031 say_command => 'say', 2063 say_command => 'chat',
2032 audio_enable => 1, 2064 audio_enable => 1,
2033 bgm_enable => 1, 2065 bgm_enable => 1,
2034 bgm_volume => 0.25, 2066 bgm_volume => 0.25,
2035 face_prefetch => 0, 2067 face_prefetch => 0,
2036 output_sync => 1, 2068 output_sync => 1,
2090# } 2122# }
2091# my $t2 = Time::HiRes::time; 2123# my $t2 = Time::HiRes::time;
2092# warn $t2-$t1; 2124# warn $t2-$t1;
2093# } 2125# }
2094 2126
2127 $startup_done->();
2128
2095 video_init; 2129 video_init;
2096 audio_init; 2130 audio_init;
2097} 2131}
2098 2132
2099show_tip_of_the_day if $CFG->{show_tips}; 2133show_tip_of_the_day if $CFG->{show_tips};
2100
2101use Data::Dumper; warn Dumper [CFPlus::win32_proxy_info()];#d#
2102 2134
2103Event::loop; 2135Event::loop;
2104#CFPlus::SDL_Quit; 2136#CFPlus::SDL_Quit;
2105#CFPlus::_exit 0; 2137#CFPlus::_exit 0;
2106 2138

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines