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.115 by root, Mon Aug 14 03:41:29 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.1';
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,
396
397 client => "cfplus $CFPlus::VERSION $] $^O",
371 398
372 map_widget => $MAPWIDGET, 399 map_widget => $MAPWIDGET,
373 logview => $LOGVIEW, 400 logview => $LOGVIEW,
374 statusbox => $STATUSBOX, 401 statusbox => $STATUSBOX,
375 map => $MAP, 402 map => $MAP,
1043 }, 1070 },
1044 ); 1071 );
1045 1072
1046 $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");
1047 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry 1074 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry
1048 text => $CFG->{say_command}, 1075 text => $CFG->{say_command},
1049 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. "
1050 . "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. "
1051 . "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.",
1052 on_changed => sub { 1079 on_changed => sub {
1053 my ($self, $value) = @_; 1080 my ($self, $value) = @_;
1054 $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;
1055 0 1093 0
1056 } 1094 }
1057 ); 1095 );
1058 1096
1059 $vbox->add (new CFPlus::UI::FancyFrame 1097 $vbox->add (new CFPlus::UI::FancyFrame
1123 window => $window, 1161 window => $window,
1124 input => $input, 1162 input => $input,
1125 }; 1163 };
1126 1164
1127 $window 1165 $window
1128}
1129
1130sub open_string_query {
1131 my $cb = $_[1];
1132 my $dialog = new CFPlus::UI::Toplevel
1133 x => "center",
1134 y => "center",
1135 z => 50,
1136 force_w => $WIDTH * 4/5,
1137 title => $_[0];
1138
1139 $dialog->add (
1140 my $e = new CFPlus::UI::Entry
1141 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1142 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1143 );
1144
1145 $e->grab_focus;
1146 $dialog->show;
1147}
1148
1149sub open_quit_dialog {
1150 unless ($QUIT_DIALOG) {
1151 $QUIT_DIALOG = new CFPlus::UI::Toplevel
1152 x => "center",
1153 y => "center",
1154 z => 50,
1155 title => "Really Quit?",
1156 on_key_down => sub {
1157 my ($dialog, $ev) = @_;
1158 $ev->{sym} == 27 and $dialog->hide;
1159 }
1160 ;
1161
1162 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1);
1163
1164 $vb->add (new CFPlus::UI::Label
1165 text => "You should find a savebed and apply it first!",
1166 max_w => $WIDTH * 0.25,
1167 ellipsize => 0,
1168 );
1169 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1170 $hb->add (new CFPlus::UI::Button
1171 text => "Ok",
1172 expand => 1,
1173 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1174 );
1175 $hb->add (new CFPlus::UI::Button
1176 text => "Quit anyway",
1177 expand => 1,
1178 on_activate => sub { exit },
1179 );
1180 }
1181
1182 $QUIT_DIALOG->show;
1183 $QUIT_DIALOG->grab_focus;
1184} 1166}
1185 1167
1186sub autopickup_setup { 1168sub autopickup_setup {
1187 my $table = new CFPlus::UI::Table; 1169 my $table = new CFPlus::UI::Table;
1188 1170
1397 1379
1398 my $refresh; 1380 my $refresh;
1399 $refresh = $BIND_UPD_CB = sub { 1381 $refresh = $BIND_UPD_CB = sub {
1400 $binding_list->clear (); 1382 $binding_list->clear ();
1401 1383
1384 return unless $PROFILE;
1385
1402 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { 1386 for my $mod (keys %{$PROFILE->{bindings}}) {
1403 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { 1387 for my $sym (keys %{$PROFILE->{bindings}{$mod}}) {
1404 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1388 my $cmds = $PROFILE->{bindings}{$mod}{$sym};
1405 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1389 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1406 1390
1407 my $lbl = join "; ", @$cmds; 1391 my $lbl = join "; ", @$cmds;
1408 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym); 1392 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym);
1409 $binding_list->add (my $hb = new CFPlus::UI::HBox); 1393 $binding_list->add (my $hb = new CFPlus::UI::HBox);
1410 $hb->add (new CFPlus::UI::Button 1394 $hb->add (new CFPlus::UI::Button
1411 text => "delete", 1395 text => "delete",
1412 tooltip => "Deletes the binding", 1396 tooltip => "Deletes the binding",
1413 on_activate => sub { 1397 on_activate => sub {
1414 $binding_list->remove ($hb); 1398 $binding_list->remove ($hb);
1415 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1399 delete $PROFILE->{bindings}{$mod}{$sym};
1416 0 1400 0
1417 }); 1401 });
1418 1402
1419 $hb->add (new CFPlus::UI::Button 1403 $hb->add (new CFPlus::UI::Button
1420 text => "edit", 1404 text => "edit",
1421 tooltip => "Edits the binding", 1405 tooltip => "Edits the binding",
1422 on_activate => sub { 1406 on_activate => sub {
1423 $::BIND_EDITOR->set_binding ( 1407 $::BIND_EDITOR->set_binding (
1424 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, 1408 $mod, $sym, $PROFILE->{bindings}{$mod}{$sym},
1425 sub { 1409 sub {
1426 my ($nmod, $nsym, $ncmds) = @_; 1410 my ($nmod, $nsym, $ncmds) = @_;
1427 $::BIND_EDITOR->cfg_unbind ($mod, $sym); 1411 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1428 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds); 1412 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1429 $refresh->(); 1413 $refresh->();
1507 1491
1508sub help_window { 1492sub help_window {
1509 my $win = new CFPlus::UI::Toplevel 1493 my $win = new CFPlus::UI::Toplevel
1510 x => 'center', 1494 x => 'center',
1511 y => 'center', 1495 y => 'center',
1512 z => 2, 1496 z => 4,
1513 name => 'doc_browser', 1497 name => 'doc_browser',
1514 force_w => int $WIDTH * 7/8, 1498 force_w => int $WIDTH * 7/8,
1515 force_h => int $HEIGHT * 7/8, 1499 force_h => int $HEIGHT * 7/8,
1516 title => "Help Browser", 1500 title => "Help Browser",
1517 has_close_button => 1; 1501 has_close_button => 1;
1532 my $load_node; $load_node = sub { 1516 my $load_node; $load_node = sub {
1533 my ($node, $para) = @_; 1517 my ($node, $para) = @_;
1534 1518
1535 $buttons->clear; 1519 $buttons->clear;
1536 1520
1521 $buttons->add (new CFPlus::UI::Button
1522 text => "⇤",
1523 tooltip => "back to the starting page",
1524 on_activate => sub {
1525 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1526 unshift @future, @history;
1527 @history = ();
1528 $load_node->(@{shift @future});
1529 },
1530 );
1531
1537 if (@history) { 1532 if (@history) {
1538 $buttons->add (new CFPlus::UI::Button 1533 $buttons->add (new CFPlus::UI::Button
1539 text => "⋘", 1534 text => "⋘",
1540 tooltip => "back to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $history[-1]) . "</i>", 1535 tooltip => "back to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $history[-1][0]) . "</i>",
1541 on_activate => sub { 1536 on_activate => sub {
1542 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode; 1537 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1543 $load_node->(@{pop @history}); 1538 $load_node->(@{pop @history});
1544 }, 1539 },
1545 ); 1540 );
1546 } 1541 }
1547 1542
1548 if (@future) { 1543 if (@future) {
1549 $buttons->add (new CFPlus::UI::Button 1544 $buttons->add (new CFPlus::UI::Button
1550 text => "⋙", 1545 text => "⋙",
1551 tooltip => "forward to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $future[0]) . "</i>", 1546 tooltip => "forward to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $future[0][0]) . "</i>",
1552 on_activate => sub { 1547 on_activate => sub {
1553 push @history, [$curnode, $viewer->current_paragraph]; 1548 push @history, [$curnode, $viewer->current_paragraph];
1554 $load_node->(@{shift @future}); 1549 $load_node->(@{shift @future});
1555 }, 1550 },
1556 ); 1551 );
1587 $CFPlus::Pod::goto_document = sub { 1582 $CFPlus::Pod::goto_document = sub {
1588 my (@path) = @_; 1583 my (@path) = @_;
1589 1584
1590 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = (); 1585 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1591 1586
1592 $load_node->(CFPlus::Pod::find @path); 1587 $load_node->((CFPlus::Pod::find @path)[0]);
1593 $win->show; 1588 $win->show;
1594 }; 1589 };
1595 1590
1596 $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;
1597} 1702}
1598 1703
1599sub sdl_init { 1704sub sdl_init {
1600 CFPlus::SDL_Init 1705 CFPlus::SDL_Init
1601 and die "SDL::Init failed!\n"; 1706 and die "SDL::Init failed!\n";
1960 output_sync => 1, 2065 output_sync => 1,
1961 output_count => 1, 2066 output_count => 1,
1962 pickup => 0, 2067 pickup => 0,
1963 inv_sort => "mtime", 2068 inv_sort => "mtime",
1964 default => "profile", # default profile 2069 default => "profile", # default profile
2070 show_tips => 1,
1965 ); 2071 );
1966 2072
1967 while (my ($k, $v) = each %DEF_CFG) { 2073 while (my ($k, $v) = each %DEF_CFG) {
1968 $CFG->{$k} = $v unless exists $CFG->{$k}; 2074 $CFG->{$k} = $v unless exists $CFG->{$k};
1969 } 2075 }
2013# } 2119# }
2014# my $t2 = Time::HiRes::time; 2120# my $t2 = Time::HiRes::time;
2015# warn $t2-$t1; 2121# warn $t2-$t1;
2016# } 2122# }
2017 2123
2124 $startup_done->();
2125
2018 video_init; 2126 video_init;
2019 audio_init; 2127 audio_init;
2020} 2128}
2129
2130show_tip_of_the_day if $CFG->{show_tips};
2021 2131
2022Event::loop; 2132Event::loop;
2023#CFPlus::SDL_Quit; 2133#CFPlus::SDL_Quit;
2024#CFPlus::_exit 0; 2134#CFPlus::_exit 0;
2025 2135

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines