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.118 by root, Tue Aug 22 06:37:30 2006 UTC vs.
Revision 1.124 by root, Tue Nov 7 22:41:27 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
47 68
48$Event::Eval = 0; 69$Event::Eval = 0;
49$Event::DIED = sub { 70$Event::DIED = sub {
50 # TODO: display dialog box or so 71 # TODO: display dialog box or so
51 Carp::cluck $_[1];#d#TODO: remove when stable 72 Carp::cluck $_[1];#d#TODO: remove when stable
52 CFPlus::error $_[1]; 73 return;#d#
74 CFPlus::fatal ($_[1]);
53}; 75};
54
55$SIG{__DIE__} = sub {
56 return if CFPlus::in_destruct;
57 Carp::cluck $_[0];
58 CFPlus::error $_[0];
59 return;#d#
60 #return unless defined $^S && !$^S;
61 $Event::DIED->(undef, $_[0]);
62};
63
64our $VERSION = '0.9';
65 76
66my $MAX_FPS = 60; 77my $MAX_FPS = 60;
67my $MIN_FPS = 5; # unused as of yet 78my $MIN_FPS = 5; # unused as of yet
68 79
69our $META_SERVER = "crossfire.real-time.com:13326"; 80our $META_SERVER = "crossfire.real-time.com:13326";
71our $LAST_REFRESH; 82our $LAST_REFRESH;
72our $NOW; 83our $NOW;
73 84
74our $CFG; 85our $CFG;
75our $CONN; 86our $CONN;
87our $PROFILE; # current profile
76our $FAST; # fast, low-quality mode, possibly useful for software-rendering 88our $FAST; # fast, low-quality mode, possibly useful for software-rendering
77 89
78our $WANT_REFRESH; 90our $WANT_REFRESH;
79our $CAN_REFRESH; 91our $CAN_REFRESH;
80 92
144 $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]);
145} 157}
146 158
147sub debug { 159sub debug {
148 $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;
149} 172}
150 173
151sub destroy_query_dialog { 174sub destroy_query_dialog {
152 (delete $_[0]{query_dialog})->destroy 175 (delete $_[0]{query_dialog})->destroy
153 if $_[0]{query_dialog}; 176 if $_[0]{query_dialog};
352 status "logging in..."; 375 status "logging in...";
353 376
354 $LOGIN_BUTTON->set_text ("Logout"); 377 $LOGIN_BUTTON->set_text ("Logout");
355 $SETUP_DIALOG->hide; 378 $SETUP_DIALOG->hide;
356 379
380 $PROFILE = $CFG->{profile}{default};
381
357 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;
358 383
359 my ($host, $port) = split /:/, $CFG->{profile}{default}{host}; 384 my ($host, $port) = split /:/, $PROFILE->{host};
360 385
361 $MAP = new CFPlus::Map $mapsize, $mapsize; 386 $MAP = new CFPlus::Map;
362 387
363 $CONN = eval { 388 $CONN = eval {
364 new CFPlus::Protocol 389 new CFPlus::Protocol
365 host => $host, 390 host => $host,
366 port => $port || 13327, 391 port => $port || 13327,
367 user => $CFG->{profile}{default}{user}, 392 user => $PROFILE->{user},
368 pass => $CFG->{profile}{default}{password}, 393 pass => $PROFILE->{password},
369 mapw => $mapsize, 394 mapw => $mapsize,
370 maph => $mapsize, 395 maph => $mapsize,
371 396
372 client => "cfplus $VERSION $] $^O", 397 client => "cfplus $CFPlus::VERSION $] $^O",
373 398
374 map_widget => $MAPWIDGET, 399 map_widget => $MAPWIDGET,
375 logview => $LOGVIEW, 400 logview => $LOGVIEW,
376 statusbox => $STATUSBOX, 401 statusbox => $STATUSBOX,
377 map => $MAP, 402 map => $MAP,
1045 }, 1070 },
1046 ); 1071 );
1047 1072
1048 $table->add (0, 12, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command"); 1073 $table->add (0, 12, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command");
1049 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry 1074 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry
1050 text => $CFG->{say_command}, 1075 text => $CFG->{say_command},
1051 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. " 1076 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. "
1052 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1077 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1053 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1078 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1054 on_changed => sub { 1079 on_changed => sub {
1055 my ($self, $value) = @_; 1080 my ($self, $value) = @_;
1056 $CFG->{say_command} = $value; 1081 $CFG->{say_command} = $value;
1082 0
1083 }
1084 );
1085
1086 $table->add (0, 13, new CFPlus::UI::Label valign => 0, align => 1, text => "Tip of the day");
1087 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox
1088 state => $CFG->{show_tips},
1089 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1090 on_changed => sub {
1091 my ($self, $value) = @_;
1092 $CFG->{show_tips} = $value;
1057 0 1093 0
1058 } 1094 }
1059 ); 1095 );
1060 1096
1061 $vbox->add (new CFPlus::UI::FancyFrame 1097 $vbox->add (new CFPlus::UI::FancyFrame
1125 window => $window, 1161 window => $window,
1126 input => $input, 1162 input => $input,
1127 }; 1163 };
1128 1164
1129 $window 1165 $window
1130}
1131
1132sub open_string_query {
1133 my ($title, $cb, $txt, $tooltip) = @_;
1134 my $dialog = new CFPlus::UI::Toplevel
1135 x => "center",
1136 y => "center",
1137 z => 50,
1138 force_w => $WIDTH * 4/5,
1139 title => $title;
1140
1141 $dialog->add (
1142 my $e = new CFPlus::UI::Entry
1143 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1144 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1145 tooltip => $tooltip
1146 );
1147
1148 $e->grab_focus;
1149 $e->set_text ($txt) if $txt;
1150 $dialog->show;
1151}
1152
1153sub open_quit_dialog {
1154 unless ($QUIT_DIALOG) {
1155 $QUIT_DIALOG = new CFPlus::UI::Toplevel
1156 x => "center",
1157 y => "center",
1158 z => 50,
1159 title => "Really Quit?",
1160 on_key_down => sub {
1161 my ($dialog, $ev) = @_;
1162 $ev->{sym} == 27 and $dialog->hide;
1163 }
1164 ;
1165
1166 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1);
1167
1168 $vb->add (new CFPlus::UI::Label
1169 text => "You should find a savebed and apply it first!",
1170 max_w => $WIDTH * 0.25,
1171 ellipsize => 0,
1172 );
1173 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1174 $hb->add (new CFPlus::UI::Button
1175 text => "Ok",
1176 expand => 1,
1177 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1178 );
1179 $hb->add (new CFPlus::UI::Button
1180 text => "Quit anyway",
1181 expand => 1,
1182 on_activate => sub { exit },
1183 );
1184 }
1185
1186 $QUIT_DIALOG->show;
1187 $QUIT_DIALOG->grab_focus;
1188} 1166}
1189 1167
1190sub autopickup_setup { 1168sub autopickup_setup {
1191 my $table = new CFPlus::UI::Table; 1169 my $table = new CFPlus::UI::Table;
1192 1170
1401 1379
1402 my $refresh; 1380 my $refresh;
1403 $refresh = $BIND_UPD_CB = sub { 1381 $refresh = $BIND_UPD_CB = sub {
1404 $binding_list->clear (); 1382 $binding_list->clear ();
1405 1383
1384 return unless $PROFILE;
1385
1406 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { 1386 for my $mod (keys %{$PROFILE->{bindings}}) {
1407 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { 1387 for my $sym (keys %{$PROFILE->{bindings}{$mod}}) {
1408 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1388 my $cmds = $PROFILE->{bindings}{$mod}{$sym};
1409 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1389 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1410 1390
1411 my $lbl = join "; ", @$cmds; 1391 my $lbl = join "; ", @$cmds;
1412 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym); 1392 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym);
1413 $binding_list->add (my $hb = new CFPlus::UI::HBox); 1393 $binding_list->add (my $hb = new CFPlus::UI::HBox);
1414 $hb->add (new CFPlus::UI::Button 1394 $hb->add (new CFPlus::UI::Button
1415 text => "delete", 1395 text => "delete",
1416 tooltip => "Deletes the binding", 1396 tooltip => "Deletes the binding",
1417 on_activate => sub { 1397 on_activate => sub {
1418 $binding_list->remove ($hb); 1398 $binding_list->remove ($hb);
1419 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1399 delete $PROFILE->{bindings}{$mod}{$sym};
1420 0 1400 0
1421 }); 1401 });
1422 1402
1423 $hb->add (new CFPlus::UI::Button 1403 $hb->add (new CFPlus::UI::Button
1424 text => "edit", 1404 text => "edit",
1425 tooltip => "Edits the binding", 1405 tooltip => "Edits the binding",
1426 on_activate => sub { 1406 on_activate => sub {
1427 $::BIND_EDITOR->set_binding ( 1407 $::BIND_EDITOR->set_binding (
1428 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, 1408 $mod, $sym, $PROFILE->{bindings}{$mod}{$sym},
1429 sub { 1409 sub {
1430 my ($nmod, $nsym, $ncmds) = @_; 1410 my ($nmod, $nsym, $ncmds) = @_;
1431 $::BIND_EDITOR->cfg_unbind ($mod, $sym); 1411 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1432 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds); 1412 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1433 $refresh->(); 1413 $refresh->();
1511 1491
1512sub help_window { 1492sub help_window {
1513 my $win = new CFPlus::UI::Toplevel 1493 my $win = new CFPlus::UI::Toplevel
1514 x => 'center', 1494 x => 'center',
1515 y => 'center', 1495 y => 'center',
1516 z => 2, 1496 z => 4,
1517 name => 'doc_browser', 1497 name => 'doc_browser',
1518 force_w => int $WIDTH * 7/8, 1498 force_w => int $WIDTH * 7/8,
1519 force_h => int $HEIGHT * 7/8, 1499 force_h => int $HEIGHT * 7/8,
1520 title => "Help Browser", 1500 title => "Help Browser",
1521 has_close_button => 1; 1501 has_close_button => 1;
1607 $load_node->((CFPlus::Pod::find @path)[0]); 1587 $load_node->((CFPlus::Pod::find @path)[0]);
1608 $win->show; 1588 $win->show;
1609 }; 1589 };
1610 1590
1611 $win 1591 $win
1592}
1593
1594sub open_string_query {
1595 my ($title, $cb, $txt, $tooltip) = @_;
1596 my $dialog = new CFPlus::UI::Toplevel
1597 x => "center",
1598 y => "center",
1599 z => 50,
1600 force_w => $WIDTH * 4/5,
1601 title => $title;
1602
1603 $dialog->add (
1604 my $e = new CFPlus::UI::Entry
1605 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1606 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1607 tooltip => $tooltip
1608 );
1609
1610 $e->grab_focus;
1611 $e->set_text ($txt) if $txt;
1612 $dialog->show;
1613}
1614
1615sub open_quit_dialog {
1616 unless ($QUIT_DIALOG) {
1617 $QUIT_DIALOG = new CFPlus::UI::Toplevel
1618 x => "center",
1619 y => "center",
1620 z => 50,
1621 title => "Really Quit?",
1622 on_key_down => sub {
1623 my ($dialog, $ev) = @_;
1624 $ev->{sym} == 27 and $dialog->hide;
1625 }
1626 ;
1627
1628 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1);
1629
1630 $vb->add (new CFPlus::UI::Label
1631 text => "You should find a savebed and apply it first!",
1632 max_w => $WIDTH * 0.25,
1633 ellipsize => 0,
1634 );
1635 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1636 $hb->add (new CFPlus::UI::Button
1637 text => "Ok",
1638 expand => 1,
1639 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1640 );
1641 $hb->add (new CFPlus::UI::Button
1642 text => "Quit anyway",
1643 expand => 1,
1644 on_activate => sub { exit },
1645 );
1646 }
1647
1648 $QUIT_DIALOG->show;
1649 $QUIT_DIALOG->grab_focus;
1650}
1651
1652sub show_tip_of_the_day {
1653 # find all tips
1654 my @tod = CFPlus::Pod::find tip_of_the_day => "*";
1655
1656 my $todindex = $CFPlus::DB_STATE->get ("tip_of_the_day");
1657 $todindex = 0 if $todindex >= @tod;
1658 $CFPlus::DB_STATE->put (tip_of_the_day => $todindex + 1);
1659
1660 # create dialog
1661 my $dialog;
1662
1663 my $close = sub {
1664 $dialog->destroy;
1665 };
1666
1667 $dialog = new CFPlus::UI::Toplevel
1668 x => "center",
1669 y => "center",
1670 z => 3,
1671 name => 'tip_of_the_day',
1672 force_w => int $WIDTH * 4/9,
1673 force_h => int $WIDTH * 2/9,
1674 title => "Tip of the day #" . (1 + $todindex),
1675 child => my $vbox = new CFPlus::UI::VBox,
1676 has_close_button => 1,
1677 on_delete => $close,
1678 ;
1679
1680 $vbox->add (my $viewer = new CFPlus::UI::TextScroller
1681 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
1682 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $tod[$todindex]);
1683
1684 $vbox->add (my $table = new CFPlus::UI::Table);
1685
1686 $table->add (0, 0, new CFPlus::UI::Button
1687 text => "Close",
1688 tooltip => "Close the tip of the day window. To never see it again, disable the tip of the day in the <b>Server Setup</b>.",
1689 on_activate => $close,
1690 );
1691
1692 $table->add (2, 0, new CFPlus::UI::Button
1693 text => "Next",
1694 tooltip => "Show the next <b>Tip of the day</b>.",
1695 on_activate => sub {
1696 $close->();
1697 &show_tip_of_the_day;
1698 },
1699 );
1700
1701 $dialog->show;
1612} 1702}
1613 1703
1614sub sdl_init { 1704sub sdl_init {
1615 CFPlus::SDL_Init 1705 CFPlus::SDL_Init
1616 and die "SDL::Init failed!\n"; 1706 and die "SDL::Init failed!\n";
1975 output_sync => 1, 2065 output_sync => 1,
1976 output_count => 1, 2066 output_count => 1,
1977 pickup => 0, 2067 pickup => 0,
1978 inv_sort => "mtime", 2068 inv_sort => "mtime",
1979 default => "profile", # default profile 2069 default => "profile", # default profile
2070 show_tips => 1,
1980 ); 2071 );
1981 2072
1982 while (my ($k, $v) = each %DEF_CFG) { 2073 while (my ($k, $v) = each %DEF_CFG) {
1983 $CFG->{$k} = $v unless exists $CFG->{$k}; 2074 $CFG->{$k} = $v unless exists $CFG->{$k};
1984 } 2075 }
2028# } 2119# }
2029# my $t2 = Time::HiRes::time; 2120# my $t2 = Time::HiRes::time;
2030# warn $t2-$t1; 2121# warn $t2-$t1;
2031# } 2122# }
2032 2123
2124 $startup_done->();
2125
2033 video_init; 2126 video_init;
2034 audio_init; 2127 audio_init;
2035} 2128}
2129
2130show_tip_of_the_day if $CFG->{show_tips};
2036 2131
2037Event::loop; 2132Event::loop;
2038#CFPlus::SDL_Quit; 2133#CFPlus::SDL_Quit;
2039#CFPlus::_exit 0; 2134#CFPlus::_exit 0;
2040 2135

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines