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.121 by root, Sun Oct 1 18:17:38 2006 UTC vs.
Revision 1.146 by root, Wed Apr 4 02:43:30 2007 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;
26
27use Carp 'verbose';
5 28
6# do things only needed for single-binary version (par) 29# do things only needed for single-binary version (par)
7BEGIN { 30BEGIN {
8 if (%PAR::LibCache) { 31 if (%PAR::LibCache) {
9 @INC = grep ref, @INC; # weed out all paths except pars loader refs 32 @INC = grep ref, @INC; # weed out all paths except pars loader refs
10 33
11 while (my ($filename, $zip) = each %PAR::LibCache) { 34 while (my ($filename, $zip) = each %PAR::LibCache) {
12 for ($zip->memberNames) { 35 for ($zip->memberNames) {
13 next unless /^\/root\/(.*)/; 36 next unless /^root\/(.*)/;
14 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1") 37 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1")
15 unless -e "$ENV{PAR_TEMP}/$1"; 38 unless -e "$ENV{PAR_TEMP}/$1";
16 } 39 }
17 } 40 }
18 41
36 59
37use CFPlus; 60use CFPlus;
38use CFPlus::OpenGL (); 61use CFPlus::OpenGL ();
39use CFPlus::Protocol; 62use CFPlus::Protocol;
40use CFPlus::UI; 63use CFPlus::UI;
64use CFPlus::UI::Inventory;
65use CFPlus::UI::SpellList;
41use CFPlus::Pod; 66use CFPlus::Pod;
42use CFPlus::BindingEditor;
43use CFPlus::MapWidget; 67use CFPlus::MapWidget;
68use CFPlus::Macro;
44 69
45$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 70$SIG{QUIT} = sub { Carp::cluck "QUIT" };
46$SIG{PIPE} = 'IGNORE'; 71$SIG{PIPE} = 'IGNORE';
47 72
48$Event::Eval = 0; 73$Event::Eval = 1;
49$Event::DIED = sub { 74$Event::DIED = sub {
50 # TODO: display dialog box or so 75 CFPlus::fatal Carp::longmess $_[1]
51 Carp::cluck $_[1];#d#TODO: remove when stable
52 return;#d#
53 CFPlus::fatal ($_[1]);
54}; 76};
55 77
56my $MAX_FPS = 60; 78my $MAX_FPS = 60;
57my $MIN_FPS = 5; # unused as of yet 79my $MIN_FPS = 5; # unused as of yet
58 80
59our $META_SERVER = "crossfire.real-time.com:13326"; 81our $META_SERVER = "http://metaserver.schmorp.de/current.json";
60 82
61our $LAST_REFRESH; 83our $LAST_REFRESH;
62our $NOW; 84our $NOW;
63 85
64our $CFG; 86our $CFG;
102 124
103our $INVENTORY_PAGE; 125our $INVENTORY_PAGE;
104our $STATS_PAGE; 126our $STATS_PAGE;
105our $SKILL_PAGE; 127our $SKILL_PAGE;
106our $SPELL_PAGE; 128our $SPELL_PAGE;
129our $SPELL_LIST;
107 130
108our $HELP_WINDOW; 131our $HELP_WINDOW;
109our $MESSAGE_WINDOW; 132our $MESSAGE_WINDOW;
110our $FLOORBOX; 133our $FLOORBOX;
111our $GAUGES; 134our $GAUGES;
124 147
125our $INV; 148our $INV;
126our $INVR; 149our $INVR;
127our $INV_RIGHT_HB; 150our $INV_RIGHT_HB;
128 151
129our $BIND_EDITOR;
130our $BIND_UPD_CB;
131
132our $PICKUP_CFG; 152our $PICKUP_CFG;
153
154our $IN_BUILD_MODE;
155our $BUILD_BUTTON;
133 156
134sub status { 157sub status {
135 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 158 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
136} 159}
137 160
138sub debug { 161sub debug {
139 $DEBUG_STATUS->set_text ($_[0]); 162 $DEBUG_STATUS->set_text ($_[0]);
163}
164
165sub message {
166 my ($para) = @_;
167
168 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
169
170 $para->{markup} = "<span foreground='#ffffff'>$time</span> $para->{markup}";
171
172 $LOGVIEW->add_paragraph ($para);
173 $LOGVIEW->scroll_to_bottom;
140} 174}
141 175
142sub destroy_query_dialog { 176sub destroy_query_dialog {
143 (delete $_[0]{query_dialog})->destroy 177 (delete $_[0]{query_dialog})->destroy
144 if $_[0]{query_dialog}; 178 if $_[0]{query_dialog};
145} 179}
146 180
181# FIXME: a very ugly hack to wait for stat update look below! #d#
182our $QUERY_TIMER; #d#
183
147# server query dialog 184# server query dialog
148sub server_query { 185sub server_query {
149 my ($conn, $flags, $prompt) = @_; 186 my ($conn, $flags, $prompt) = @_;
187
188 # FIXME: a very ugly hack to wait for stat update #d#
189 if ($prompt =~ /roll new stats/ and not $conn->{stat_change_with}) {
190 unless ($QUERY_TIMER) {
191 $QUERY_TIMER =
192 Event->timer (
193 after => 1,
194 cb => sub {
195 server_query ($conn, $flags, $prompt, 1);
196 $QUERY_TIMER = undef
197 }
198 );
199 return;
200 }
201 }
150 202
151 $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel 203 $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel
152 x => "center", 204 x => "center",
153 y => "center", 205 y => "center",
154 title => "Server Query", 206 title => "Server Query",
343 status "logging in..."; 395 status "logging in...";
344 396
345 $LOGIN_BUTTON->set_text ("Logout"); 397 $LOGIN_BUTTON->set_text ("Logout");
346 $SETUP_DIALOG->hide; 398 $SETUP_DIALOG->hide;
347 399
348 $PROFILE = $CFG->{profile}{default};
349
350 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 400 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
351 401
352 my ($host, $port) = split /:/, $PROFILE->{host}; 402 my ($host, $port) = split /:/, $PROFILE->{host};
353 403
354 $MAP = new CFPlus::Map $mapsize, $mapsize; 404 $MAP = new CFPlus::Map;
355 405
356 $CONN = eval { 406 $CONN = eval {
357 new CFPlus::Protocol 407 new CFPlus::Protocol
358 host => $host, 408 host => $host,
359 port => $port || 13327, 409 port => $port || 13327,
397sub stop_game { 447sub stop_game {
398 $LOGIN_BUTTON->set_text ("Login"); 448 $LOGIN_BUTTON->set_text ("Login");
399 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER); 449 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
400 $SETUP_DIALOG->show; 450 $SETUP_DIALOG->show;
401 $PL_WINDOW->hide; 451 $PL_WINDOW->hide;
402 $SPELL_PAGE->clear_spells; 452 $SPELL_LIST->clear_spells;
403 453
404 return unless $CONN; 454 return unless $CONN;
405 455
406 status "connection closed"; 456 status "connection closed";
407 457
415sub graphics_setup { 465sub graphics_setup {
416 my $vbox = new CFPlus::UI::VBox; 466 my $vbox = new CFPlus::UI::VBox;
417 467
418 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]); 468 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]);
419 469
470 my $row = 0;
471
472 $table->add (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "OpenGL Info");
473 $table->add (1, $row++, new CFPlus::UI::Label valign => 0, fontsize => 0.8, text => CFPlus::OpenGL::gl_vendor . ", " . CFPlus::OpenGL::gl_version,
474 can_events => 1,
475 tooltip => "<tt><span size='8192'>" . (CFPlus::OpenGL::gl_extensions) . "</span></tt>");
476
420 $table->add (0, 0, new CFPlus::UI::Label valign => 0, align => 1, text => "Video Mode"); 477 $table->add (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Video Mode");
421 $table->add (1, 0, my $hbox = new CFPlus::UI::HBox); 478 $table->add (1, $row++, my $hbox = new CFPlus::UI::HBox);
422 479
423 $hbox->add (my $mode_slider = new CFPlus::UI::Slider force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1]); 480 $hbox->add (my $mode_slider = new CFPlus::UI::Slider force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1]);
424 $hbox->add (my $mode_label = new CFPlus::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999"); 481 $hbox->add (my $mode_label = new CFPlus::UI::Label align => 0, valign => 0, height => 0.8, template => "9999x9999");
425 482
426 $mode_slider->connect (changed => sub { 483 $mode_slider->connect (changed => sub {
428 485
429 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value; 486 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value;
430 $mode_label->set_text (sprintf "%dx%d", @{$SDL_MODES[$value]}); 487 $mode_label->set_text (sprintf "%dx%d", @{$SDL_MODES[$value]});
431 }); 488 });
432 $mode_slider->emit (changed => $mode_slider->{range}[0]); 489 $mode_slider->emit (changed => $mode_slider->{range}[0]);
433
434 my $row = 1;
435 490
436 $table->add (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fullscreen"); 491 $table->add (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fullscreen");
437 $table->add (1, $row++, $FULLSCREEN_ENABLE = new CFPlus::UI::CheckBox 492 $table->add (1, $row++, $FULLSCREEN_ENABLE = new CFPlus::UI::CheckBox
438 state => $CFG->{fullscreen}, 493 state => $CFG->{fullscreen},
439 tooltip => "Bring the client into fullscreen mode.", 494 tooltip => "Bring the client into fullscreen mode.",
634 $table->add (1, 1, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 }); 689 $table->add (1, 1, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
635 $table->add (0, 2, new CFPlus::UI::Label text => "Show FPS"); 690 $table->add (0, 2, new CFPlus::UI::Label text => "Show FPS");
636 $table->add (1, 2, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 691 $table->add (1, 2, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
637 $table->add (0, 3, new CFPlus::UI::Label text => "Suppress Tooltips"); 692 $table->add (0, 3, new CFPlus::UI::Label text => "Suppress Tooltips");
638 $table->add (1, 3, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 693 $table->add (1, 3, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
694 $table->add (0, 4, new CFPlus::UI::Button text => "die on click(tm)", on_activate => sub { die "violator" } );
639 695
640 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05); 696 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
641 697
642 for my $x (0..2) { 698 for my $x (0..2) {
643 for my $y (0 .. 2) { 699 for my $y (0 .. 2) {
647 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 }, 703 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 },
648 ); 704 );
649 } 705 }
650 } 706 }
651 707
708 $table->add (0, 5, new CFPlus::UI::TextEdit text => "line1\0152\0153");#d#
652 709
653 $table 710 $table
654} 711}
655 712
656sub stats_window { 713sub stats_window {
825 882
826 my $table = $METASERVER->{table}; 883 my $table = $METASERVER->{table};
827 $table->clear; 884 $table->clear;
828 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list..."); 885 $table->add (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list...");
829 886
830 my $buf; 887 my $ok = 0;
831 888
832 my $fh = new IO::Socket::INET PeerHost => $META_SERVER, Blocking => 0; 889 CFPlus::background {
890 my $ua = CFPlus::lwp_useragent;
833 891
834 unless ($fh) { 892 CFPlus::background_msg CFPlus::from_json +(CFPlus::lwp_check $ua->get ($META_SERVER))->decoded_content;
835 $label->set_text ("unable to contact metaserver: $!"); 893 } sub {
836 return; 894 my ($msg) = @_;
837 } 895 if ($msg) {
838
839 Event->io (fd => $fh, poll => 'r', cb => sub {
840 my $res = sysread $fh, $buf, 8192, length $buf;
841
842 if (!defined $res) {
843 $_[0]->w->cancel;
844 $label->set_text ("error while retrieving server list: $!");
845 } elsif ($res == 0) {
846 $_[0]->w->cancel;
847 status "server list retrieved";
848
849 utf8::decode $buf if utf8::valid $buf;
850
851 $table->clear; 896 $table->clear;
852 897
853 my @tip = ( 898 my @tip = (
854 "The current number of users logged in on the server.", 899 "The current number of users logged in on the server.",
855 "The hostname of the server.", 900 "The hostname of the server.",
865 for 0 .. $#col; 910 for 0 .. $#col;
866 911
867 my @align = qw(1 0 1 1 -1); 912 my @align = qw(1 0 1 1 -1);
868 913
869 my $y = 0; 914 my $y = 0;
870 for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) { 915 for my $m (@{ $msg->{servers} }) {
871 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime) = @$m; 916 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime, $highlight) =
917 @$m{qw(ip age hostname users version description ibytes obytes uptime highlight)};
872 918
873 for ($desc) { 919 for ($desc) {
874 s/<br>/\n/gi; 920 s/<br>/\n/gi;
875 s/<li>/\n· /gi; 921 s/<li>/\n· /gi;
876 s/<.*?>//sgi; 922 s/<.*?>//sgi;
877 s/&/&amp;/g; 923 s/&amp;/&/g;
878 s/</&lt;/g; 924 s/&lt;/</g;
879 s/>/&gt;/g; 925 s/&gt;/>/g;
880 } 926 }
881 927
882 $uptime = sprintf "%dd %02d:%02d:%02d", 928 $uptime = sprintf "%dd %02d:%02d:%02d",
883 (int $m->[8] / 86400), 929 (int $uptime / 86400),
884 (int $m->[8] / 3600) % 24, 930 (int $uptime / 3600) % 24,
885 (int $m->[8] / 60) % 60, 931 (int $uptime / 60) % 60,
886 $m->[8] % 60; 932 $uptime % 60;
887 933
888 $m = [$users, $host, $uptime, $version, $desc]; 934 $m = [$users, $host, $uptime, $version, $desc];
889 935
890 $y++; 936 $y++;
891 937
901 ), 947 ),
902 (new CFPlus::UI::Empty expand => 1), 948 (new CFPlus::UI::Empty expand => 1),
903 ]); 949 ]);
904 950
905 $table->add ($_, $y, new CFPlus::UI::Label 951 $table->add ($_, $y, new CFPlus::UI::Label
952 max_w => $::WIDTH * 0.4,
906 ellipsise => 0, 953 ellipsise => 0,
907 align => $align[$_], 954 align => $align[$_],
908 text => $m->[$_], 955 text => $m->[$_],
909 tooltip => $tip[$_], 956 tooltip => $tip[$_],
957 fg => ($highlight ? [1, 1, 1] : [.7, .7, .7]),
910 can_hover => 1, 958 can_hover => 1,
911 can_events => 1, 959 can_events => 1,
912 fontsize => 0.8) 960 fontsize => 0.8)
913 for 0 .. $#$m; 961 for 0 .. $#$m;
914 } 962 }
963 } else {
964 $ok or $label->set_text ("error while contacting metaserver");
915 } 965 }
916 }); 966 };
967
917} 968}
918 969
919sub metaserver_dialog { 970sub metaserver_dialog {
920 my $vbox = new CFPlus::UI::VBox; 971 my $vbox = new CFPlus::UI::VBox;
921 my $table = new CFPlus::UI::Table; 972 my $table = new CFPlus::UI::Table;
925 title => "Server List", 976 title => "Server List",
926 name => 'metaserver_dialog', 977 name => 'metaserver_dialog',
927 x => 'center', 978 x => 'center',
928 y => 'center', 979 y => 'center',
929 z => 3, 980 z => 3,
981 force_w => $::WIDTH * 0.9,
930 force_h => $::HEIGHT * 0.4, 982 force_h => $::HEIGHT * 0.7,
931 child => $vbox, 983 child => $vbox,
932 has_close_button => 1, 984 has_close_button => 1,
933 table => $table, 985 table => $table,
934 on_visibility_change => sub { 986 on_visibility_change => sub {
935 update_metaserver ($_[0]) if $_[1]; 987 update_metaserver ($_[0]) if $_[1];
1011 . "so only set it if you really need to prefetch images. " 1063 . "so only set it if you really need to prefetch images. "
1012 . "This option can be set and unset any time.", 1064 . "This option can be set and unset any time.",
1013 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 }, 1065 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 },
1014 ); 1066 );
1015 1067
1016 $table->add (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Count"); 1068 $table->add (0, 9, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Rate");
1017 $table->add (1, 9, new CFPlus::UI::Entry 1069 $table->add (1, 9, new CFPlus::UI::Entry
1070 text => $CFG->{output_rate},
1071 tooltip => "The approximate bandwidth in bytes per second that the server should not exceed "
1072 . "when sending images, to ensure interactiveness. When 0 or unset, the server "
1073 . "default will be used, which is usually around 100kb/s.",
1074 on_changed => sub { $CFG->{output_rate} = $_[1]; 0 },
1075 );
1076
1077 $table->add (0, 10, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Count");
1078 $table->add (1, 10, new CFPlus::UI::Entry
1018 text => $CFG->{output_count}, 1079 text => $CFG->{output_count},
1019 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1080 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1020 on_changed => sub { $CFG->{output_count} = $_[1]; 0 }, 1081 on_changed => sub { $CFG->{output_count} = $_[1]; 0 },
1021 ); 1082 );
1022 1083
1023 $table->add (0, 10, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Sync"); 1084 $table->add (0, 11, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Sync");
1024 $table->add (1, 10, new CFPlus::UI::Entry 1085 $table->add (1, 11, new CFPlus::UI::Entry
1025 text => $CFG->{output_sync}, 1086 text => $CFG->{output_sync},
1026 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1087 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1027 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 }, 1088 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 },
1028 ); 1089 );
1029 1090
1030 $table->add (1, 11, $LOGIN_BUTTON = new CFPlus::UI::Button 1091 $table->add (1, 12, $LOGIN_BUTTON = new CFPlus::UI::Button
1031 expand => 1, 1092 expand => 1,
1032 align => 0, 1093 align => 0,
1033 text => "Login", 1094 text => "Login",
1034 on_activate => sub { 1095 on_activate => sub {
1035 $CONN ? stop_game 1096 $CONN ? stop_game
1036 : start_game; 1097 : start_game;
1037 0 1098 0
1038 }, 1099 },
1039 ); 1100 );
1040 1101
1041 $table->add (0, 12, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command"); 1102 $table->add (0, 13, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command");
1042 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry 1103 $table->add (1, 13, my $saycmd = new CFPlus::UI::Entry
1043 text => $CFG->{say_command}, 1104 text => $CFG->{say_command},
1044 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. " 1105 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. "
1045 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1106 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1046 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1107 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1047 on_changed => sub { 1108 on_changed => sub {
1049 $CFG->{say_command} = $value; 1110 $CFG->{say_command} = $value;
1050 0 1111 0
1051 } 1112 }
1052 ); 1113 );
1053 1114
1054 $table->add (0, 13, new CFPlus::UI::Label valign => 0, align => 1, text => "Tip of the day"); 1115 $table->add (0, 14, new CFPlus::UI::Label valign => 0, align => 1, text => "Tip of the day");
1055 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox 1116 $table->add (1, 14, my $saycmd = new CFPlus::UI::CheckBox
1056 state => $CFG->{show_tips}, 1117 state => $CFG->{show_tips},
1057 tooltip => "Show the <b>Tip of the day</b> window at startup?", 1118 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1058 on_changed => sub { 1119 on_changed => sub {
1059 my ($self, $value) = @_; 1120 my ($self, $value) = @_;
1060 $CFG->{show_tips} = $value; 1121 $CFG->{show_tips} = $value;
1156 ["Boots" => PICKUP_BOOTS], 1217 ["Boots" => PICKUP_BOOTS],
1157 ["Gloves" => PICKUP_GLOVES], 1218 ["Gloves" => PICKUP_GLOVES],
1158 ["Cloaks" => PICKUP_CLOAK], 1219 ["Cloaks" => PICKUP_CLOAK],
1159 ], 1220 ],
1160 1221
1161 ["Readables", 2, 2, 1222 ["Readables", 2, 0,
1162 ["Spellbooks" => PICKUP_SPELLBOOK], 1223 ["Spellbooks" => PICKUP_SPELLBOOK],
1163 ["Skillscrolls" => PICKUP_SKILLSCROLL], 1224 ["Skillscrolls" => PICKUP_SKILLSCROLL],
1164 ["Normal Books/Scrolls" => PICKUP_READABLES], 1225 ["Normal Books/Scrolls" => PICKUP_READABLES],
1165 ], 1226 ],
1166 ["Misc", 2, 7, 1227 ["Misc", 2, 5,
1167 ["Food" => PICKUP_FOOD], 1228 ["Food" => PICKUP_FOOD],
1168 ["Drinks" => PICKUP_DRINK], 1229 ["Drinks" => PICKUP_DRINK],
1169 ["Valuables (Money, Gems)" => PICKUP_VALUABLES], 1230 ["Valuables (Money, Gems)" => PICKUP_VALUABLES],
1170 ["Keys" => PICKUP_KEY], 1231 ["Keys" => PICKUP_KEY],
1171 ["Magical Items" => PICKUP_MAGICAL], 1232 ["Magical Items" => PICKUP_MAGICAL],
1172 ["Potions" => PICKUP_POTION], 1233 ["Potions" => PICKUP_POTION],
1173 ["Magic Devices" => PICKUP_MAGIC_DEVICE], 1234 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1174 ["Ignore cursed" => PICKUP_NOT_CURSED], 1235 ["Ignore cursed" => PICKUP_NOT_CURSED],
1175 ["Jewelery" => PICKUP_JEWELS], 1236 ["Jewelery" => PICKUP_JEWELS],
1237 ["Flesh" => PICKUP_FLESH],
1176 ], 1238 ],
1177 ["Weight/Value ratio", 2, 17] 1239 ["Weight/Value ratio", 2, 17]
1178 ) 1240 )
1179 { 1241 {
1180 my ($title, $x, $y, @bits) = @$_; 1242 my ($title, $x, $y, @bits) = @$_;
1230 $table 1292 $table
1231} 1293}
1232 1294
1233my %SORT_ORDER = ( 1295my %SORT_ORDER = (
1234 type => undef, 1296 type => undef,
1235 mtime => sub { sort { 1297 mtime => sub {
1298 my $NOW = time;
1299 sort {
1300 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1301 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1302
1236 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 1303 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1237 or $b->{mtime} <=> $a->{mtime} 1304 or $btime <=> $atime
1238 or $a->{type} <=> $b->{type} 1305 or $a->{type} <=> $b->{type}
1306 } @_
1239 } @_ }, 1307 },
1240 weight => sub { sort { 1308 weight => sub { sort {
1241 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 1309 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1242 or $a->{type} <=> $b->{type} 1310 or $a->{type} <=> $b->{type}
1243 } @_ }, 1311 } @_ },
1244); 1312);
1269 #TODO# update to weigh/maxweight 1337 #TODO# update to weigh/maxweight
1270 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1); 1338 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1);
1271 1339
1272 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1340 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1);
1273 $sw1->add ($INV = new CFPlus::UI::Inventory); 1341 $sw1->add ($INV = new CFPlus::UI::Inventory);
1342 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1274 1343
1275 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1344 $hb->add (my $vb2 = new CFPlus::UI::VBox);
1276 1345
1277 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox); 1346 $vb2->add ($INV_RIGHT_HB = new CFPlus::UI::HBox);
1278 1347
1318 $ntb->add ( 1387 $ntb->add (
1319 "Skills (F3)" => $SKILL_PAGE = skill_window, 1388 "Skills (F3)" => $SKILL_PAGE = skill_window,
1320 "Shows all your Skills." 1389 "Shows all your Skills."
1321 ); 1390 );
1322 1391
1323 my $spellsw = new CFPlus::UI::ScrolledWindow (expand => 1, scroll_y => 1); 1392 my $spellsw = $SPELL_PAGE = new CFPlus::UI::ScrolledWindow (expand => 1, scroll_y => 1);
1324 $spellsw->add ($SPELL_PAGE = new CFPlus::UI::SpellList); 1393 $spellsw->add ($SPELL_LIST = new CFPlus::UI::SpellList);
1325 $ntb->add ( 1394 $ntb->add (
1326 "Spellbook (F4)" => $spellsw, 1395 "Spellbook (F4)" => $spellsw,
1327 "Displays all spells you have and lets you edit keyboard shortcuts for them." 1396 "Displays all spells you have and lets you edit keyboard shortcuts for them."
1328 ); 1397 );
1329 $ntb->add ( 1398 $ntb->add (
1336 1405
1337 $plwin->add ($ntb); 1406 $plwin->add ($ntb);
1338 $plwin 1407 $plwin
1339} 1408}
1340 1409
1341sub update_bindings {
1342 $BIND_UPD_CB->() if $BIND_UPD_CB;
1343}
1344
1345sub keyboard_setup { 1410sub keyboard_setup {
1346 my $binding_list = new CFPlus::UI::VBox; 1411 CFPlus::Macro::keyboard_setup
1347
1348 my $refresh;
1349 $refresh = $BIND_UPD_CB = sub {
1350 $binding_list->clear ();
1351
1352 return unless $PROFILE;
1353
1354 for my $mod (keys %{$PROFILE->{bindings}}) {
1355 for my $sym (keys %{$PROFILE->{bindings}{$mod}}) {
1356 my $cmds = $PROFILE->{bindings}{$mod}{$sym};
1357 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1358
1359 my $lbl = join "; ", @$cmds;
1360 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym);
1361 $binding_list->add (my $hb = new CFPlus::UI::HBox);
1362 $hb->add (new CFPlus::UI::Button
1363 text => "delete",
1364 tooltip => "Deletes the binding",
1365 on_activate => sub {
1366 $binding_list->remove ($hb);
1367 delete $PROFILE->{bindings}{$mod}{$sym};
1368 0
1369 });
1370
1371 $hb->add (new CFPlus::UI::Button
1372 text => "edit",
1373 tooltip => "Edits the binding",
1374 on_activate => sub {
1375 $::BIND_EDITOR->set_binding (
1376 $mod, $sym, $PROFILE->{bindings}{$mod}{$sym},
1377 sub {
1378 my ($nmod, $nsym, $ncmds) = @_;
1379 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1380 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1381 $refresh->();
1382 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1383 $SETUP_DIALOG->show;
1384 },
1385 sub {
1386 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1387 $SETUP_DIALOG->show;
1388 });
1389 $::BIND_EDITOR->show;
1390 $SETUP_DIALOG->hide;
1391 0
1392 });
1393
1394 $hb->add (new CFPlus::UI::Label text => "(Key: $nam)");
1395 $hb->add (new CFPlus::UI::Label text => $lbl, expand => 1);
1396 }
1397 }
1398 };
1399
1400 my $vb = new CFPlus::UI::VBox;
1401 $vb->add (new CFPlus::UI::FancyFrame
1402 label => "Options",
1403 child => (my $hb = new CFPlus::UI::HBox),
1404 );
1405 $hb->add (new CFPlus::UI::Label text => "only shift-up stops fire");
1406 $hb->add (new CFPlus::UI::CheckBox
1407 expand => 1,
1408 state => $CFG->{shift_fire_stop},
1409 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift",
1410 on_changed => sub {
1411 my ($cbox, $value) = @_;
1412 $CFG->{shift_fire_stop} = $value;
1413 0
1414 });
1415
1416 $vb->add (new CFPlus::UI::FancyFrame
1417 label => "Bindings",
1418 child => $binding_list);
1419 $vb->add (my $hb = new CFPlus::UI::HBox);
1420
1421 $hb->add (new CFPlus::UI::Button
1422 text => "record new",
1423 expand => 1,
1424 tooltip => "This button opens the binding editor with an empty binding.",
1425 on_activate => sub {
1426 $::BIND_EDITOR->set_binding (undef, undef, [],
1427 sub {
1428 my ($mod, $sym, $cmds) = @_;
1429 $::BIND_EDITOR->cfg_bind ($mod, $sym, $cmds);
1430 $refresh->();
1431 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1432 $SETUP_DIALOG->show;
1433 },
1434 sub {
1435 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1436 $SETUP_DIALOG->show;
1437 },
1438 );
1439 $SETUP_DIALOG->hide;
1440 $::BIND_EDITOR->show;
1441 0
1442 },
1443 );
1444
1445 $hb->add (new CFPlus::UI::Button
1446 text => "close",
1447 tooltip => "Closes the binding window",
1448 expand => 1,
1449 on_activate => sub {
1450 $SETUP_DIALOG->hide;
1451 0
1452 }
1453 );
1454
1455 $refresh->();
1456
1457 $vb
1458} 1412}
1459 1413
1460sub help_window { 1414sub help_window {
1461 my $win = new CFPlus::UI::Toplevel 1415 my $win = new CFPlus::UI::Toplevel
1462 x => 'center', 1416 x => 'center',
1647 1601
1648 $vbox->add (my $viewer = new CFPlus::UI::TextScroller 1602 $vbox->add (my $viewer = new CFPlus::UI::TextScroller
1649 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4); 1603 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
1650 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $tod[$todindex]); 1604 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $tod[$todindex]);
1651 1605
1652 $vbox->add (my $table = new CFPlus::UI::Table); 1606 $vbox->add (my $table = new CFPlus::UI::Table col_expand => [0, 1]);
1653 1607
1654 $table->add (0, 0, new CFPlus::UI::Button 1608 $table->add (0, 0, new CFPlus::UI::Button
1655 text => "Close", 1609 text => "Close",
1656 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>.", 1610 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>.",
1657 on_activate => $close, 1611 on_activate => $close,
1658 ); 1612 );
1659 1613
1660 $table->add (2, 0, new CFPlus::UI::Button 1614 $table->add (2, 0, new CFPlus::UI::Button
1661 text => "Next", 1615 text => "Next",
1662 tooltip => "Show the next <b>Tip of the day</b>.", 1616 tooltip => "Show the next <b>Tip of the day</b>.",
1663 on_activate => sub { 1617 on_activate => sub {
1664 $close->(); 1618 $close->();
1665 &show_tip_of_the_day; 1619 &show_tip_of_the_day;
1666 }, 1620 },
1708 padding => 0, 1662 padding => 0,
1709 z => 100, 1663 z => 100,
1710 force_x => "max", 1664 force_x => "max",
1711 force_y => 0; 1665 force_y => 0;
1712 $DEBUG_STATUS->show; 1666 $DEBUG_STATUS->show;
1713
1714 $BIND_EDITOR = new CFPlus::BindingEditor (x => "max", y => 0);
1715 1667
1716 $STATUSBOX = new CFPlus::UI::Statusbox; 1668 $STATUSBOX = new CFPlus::UI::Statusbox;
1717 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]); 1669 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1718 1670
1719 (new CFPlus::UI::Frame 1671 (new CFPlus::UI::Frame
1820 ); 1772 );
1821 1773
1822 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, 1774 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
1823 tooltip => "View Documentation"); 1775 tooltip => "View Documentation");
1824 1776
1777
1825 $BUTTONBAR->add (new CFPlus::UI::Button 1778 $BUTTONBAR->add (new CFPlus::UI::Button
1826 text => "Quit", 1779 text => "Quit",
1827 tooltip => "Terminates the program", 1780 tooltip => "Terminates the program",
1828 on_activate => sub { 1781 on_activate => sub {
1829 if ($CONN) { 1782 if ($CONN) {
1840 } 1793 }
1841 1794
1842 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1795 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1843} 1796}
1844 1797
1798sub setup_build_button {
1799 my ($enabled) = @_;
1800 if ($enabled) {
1801 $BUILD_BUTTON->hide if $BUILD_BUTTON;
1802 $BUILD_BUTTON ||= new CFPlus::UI::Button
1803 text => "Build",
1804 tooltip => "Opens the ingame builder",
1805 on_activate => sub {
1806 if ($CONN) {
1807 $CONN->send_ext_req (builder_player_items => sub {
1808 open_ingame_editor ($_[0]) if exists $_[0]->{items};
1809 });
1810 }
1811 0
1812 };
1813 $BUTTONBAR->add ($BUILD_BUTTON);
1814 } else {
1815 $BUILD_BUTTON->hide if $BUILD_BUTTON;
1816 }
1817}
1818
1819sub open_ingame_editor {
1820 my ($msg) = @_;
1821
1822 my $win = new CFPlus::UI::Toplevel
1823 x => 0,
1824 y => 'center',
1825 z => 4,
1826 name => 'builder_window',
1827 force_w => int $WIDTH * 1/4,
1828 force_h => int $HEIGHT * 3/4,
1829 title => "In game builder",
1830 has_close_button => 1;
1831
1832 my $r = new CFPlus::UI::ScrolledWindow (
1833 expand => 1,
1834 scroll_y => 1
1835 );
1836 $r->add (my $vb = new CFPlus::UI::VBox);
1837 $win->add ($r);
1838
1839
1840 $vb->add (
1841 new CFPlus::UI::Button
1842 text => "Disable build mode",
1843 on_activate => sub { $::IN_BUILD_MODE = undef }
1844 );
1845 $vb->add (
1846 new CFPlus::UI::Button
1847 text => "ERASE",
1848 on_activate => sub { $::IN_BUILD_MODE = { do_erase => 1 } }
1849 );
1850
1851 for my $itemarchname (
1852 sort {
1853 $msg->{items}->{$a}->{build_arch_name}
1854 cmp $msg->{items}->{$b}->{build_arch_name}
1855 } keys %{$msg->{items}}
1856 ) {
1857 my $info = $msg->{items}->{$itemarchname};
1858 $vb->add (
1859 new CFPlus::UI::Button text => $info->{build_arch_name},
1860 on_activate => sub {
1861 $::IN_BUILD_MODE = { item => $itemarchname, info => $info };
1862
1863 if (grep { $msg->{items}->{$itemarchname}->{$_} } qw/has_connection has_name has_text/) {
1864 build_mode_query_arch_info ();
1865 }
1866 }
1867 );
1868 }
1869
1870 $win->show;
1871}
1872
1873sub build_mode_query_arch_info {
1874 my ($iteminfo) = $::IN_BUILD_MODE;
1875 my $itemarchname = $iteminfo->{item};
1876 my $info = $iteminfo->{info};
1877
1878 my $dialog = new CFPlus::UI::Toplevel
1879 x => "center",
1880 y => "center",
1881 z => 50,
1882 force_w => int $WIDTH * 1/2,
1883 title => "Enter information for placement of '$itemarchname'",
1884 has_close_button => 1;
1885
1886 $dialog->add (my $vb = new CFPlus::UI::VBox expand => 1);
1887
1888 $vb->add (my $table = new CFPlus::UI::Table expand => 1);
1889 my $row = 0;
1890 if ($info->{has_name}) {
1891 $table->add (0, $row, new CFPlus::UI::Label text => "Name:");
1892 $table->add (1, $row++, new CFPlus::UI::Entry expand => 1, on_changed => sub { $::IN_BUILD_MODE->{name} = $_[1]; 0 });
1893 }
1894 if ($info->{has_text}) {
1895 $table->add (0, $row, new CFPlus::UI::Label text => "Text:");
1896 $table->add (1, $row++, new CFPlus::UI::Entry expand => 1, on_changed => sub { $::IN_BUILD_MODE->{text} = $_[1]; 0 });
1897 }
1898 if ($info->{has_connection}) {
1899 $table->add (0, $row, new CFPlus::UI::Label text => "Connection ID:");
1900 $table->add (1, $row++,
1901 new CFPlus::UI::Entry
1902 expand => 1,
1903 on_changed => sub { $::IN_BUILD_MODE->{connection} = $_[1]; 0 },
1904 tooltip => "Enter the connection ID here. The connection ID connects actors like a lever to a gate or a magic ear to a gate"
1905 );
1906 }
1907
1908 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1909 $hb->add (new CFPlus::UI::Button
1910 text => "Close",
1911 expand => 1,
1912 on_activate => sub { $dialog->hide; 0 },
1913 );
1914 $dialog->show;
1915}
1916
1845sub video_shutdown { 1917sub video_shutdown {
1846 CFPlus::OpenGL::shutdown; 1918 CFPlus::OpenGL::shutdown;
1847 1919
1848 undef $SDL_ACTIVE; 1920 undef $SDL_ACTIVE;
1849} 1921}
1880 CFPlus::Mix_AllocateChannels 8; 1952 CFPlus::Mix_AllocateChannels 8;
1881 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128; 1953 CFPlus::MixMusic::volume $CFG->{bgm_volume} * 128;
1882 1954
1883 audio_music_finished; 1955 audio_music_finished;
1884 1956
1957 local $_;
1885 while (<$fh>) { 1958 while (<$fh>) {
1886 next if /^\s*#/; 1959 next if /^\s*#/;
1887 next if /^\s*$/; 1960 next if /^\s*$/;
1888 1961
1889 my ($file, $volume, $event) = split /\s+/, $_, 3; 1962 my ($file, $volume, $event) = split /\s+/, $_, 3;
1974 }, 2047 },
1975 CFPlus::SDL_VIDEOEXPOSE => sub { 2048 CFPlus::SDL_VIDEOEXPOSE => sub {
1976 CFPlus::UI::full_refresh; 2049 CFPlus::UI::full_refresh;
1977 }, 2050 },
1978 CFPlus::SDL_ACTIVEEVENT => sub { 2051 CFPlus::SDL_ACTIVEEVENT => sub {
1979# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 2052# not useful, as APPACTIVE include sonly iconified state, not unmapped
2053# printf "active %x %x\n", $_[0]{gain}, $_[0]{state};#d#
2054# printf "A\n" if $_[0]{state} & CFPlus::SDL_APPACTIVE;
2055# printf "K\n" if $_[0]{state} & CFPlus::SDL_APPINPUTFOCUS;
2056# printf "M\n" if $_[0]{state} & CFPlus::SDL_APPMOUSEFOCUS;
1980 }, 2057 },
1981 CFPlus::SDL_KEYDOWN => sub { 2058 CFPlus::SDL_KEYDOWN => sub {
1982 if ($_[0]{mod} & CFPlus::KMOD_ALT && $_[0]{sym} == 13) { 2059 if ($_[0]{mod} & CFPlus::KMOD_ALT && $_[0]{sym} == 13) {
1983 # alt-enter 2060 # alt-enter
1984 $FULLSCREEN_ENABLE->toggle; 2061 $FULLSCREEN_ENABLE->toggle;
2023 log_fontsize => 0.7, 2100 log_fontsize => 0.7,
2024 gauge_fontsize => 1, 2101 gauge_fontsize => 1,
2025 gauge_size => 0.35, 2102 gauge_size => 0.35,
2026 stat_fontsize => 0.7, 2103 stat_fontsize => 0.7,
2027 mapsize => 100, 2104 mapsize => 100,
2028 say_command => 'say', 2105 say_command => 'chat',
2029 audio_enable => 1, 2106 audio_enable => 1,
2030 bgm_enable => 1, 2107 bgm_enable => 1,
2031 bgm_volume => 0.25, 2108 bgm_volume => 0.25,
2032 face_prefetch => 0, 2109 face_prefetch => 0,
2033 output_sync => 1, 2110 output_sync => 1,
2034 output_count => 1, 2111 output_count => 1,
2112 output_rate => "",
2035 pickup => 0, 2113 pickup => 0,
2036 inv_sort => "mtime", 2114 inv_sort => "mtime",
2037 default => "profile", # default profile 2115 default => "profile", # default profile
2038 show_tips => 1, 2116 show_tips => 1,
2039 ); 2117 );
2041 while (my ($k, $v) = each %DEF_CFG) { 2119 while (my ($k, $v) = each %DEF_CFG) {
2042 $CFG->{$k} = $v unless exists $CFG->{$k}; 2120 $CFG->{$k} = $v unless exists $CFG->{$k};
2043 } 2121 }
2044 2122
2045 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de"; 2123 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de";
2124 $PROFILE = $CFG->{profile}{default};
2125
2126 # convert old bindings (only default profile matters)
2127 if (my $bindings = delete $PROFILE->{bindings}) {
2128 while (my ($mod, $syms) = each %$bindings) {
2129 while (my ($sym, $cmds) = each %$syms) {
2130 push @{ $PROFILE->{macro} }, {
2131 accelkey => [$mod*1, $sym*1],
2132 action => $cmds,
2133 };
2134 }
2135 }
2136 }
2046 2137
2047 sdl_init; 2138 sdl_init;
2048 2139
2049 @SDL_MODES = reverse 2140 @SDL_MODES = reverse
2050 grep $_->[0] >= 640 && $_->[1] >= 480, 2141 grep $_->[0] >= 640 && $_->[1] >= 480,
2087# } 2178# }
2088# my $t2 = Time::HiRes::time; 2179# my $t2 = Time::HiRes::time;
2089# warn $t2-$t1; 2180# warn $t2-$t1;
2090# } 2181# }
2091 2182
2183 $startup_done->();
2184
2092 video_init; 2185 video_init;
2093 audio_init; 2186 audio_init;
2094} 2187}
2095 2188
2096show_tip_of_the_day if $CFG->{show_tips}; 2189show_tip_of_the_day if $CFG->{show_tips};

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines