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.42 by root, Fri Jun 2 06:22:55 2006 UTC vs.
Revision 1.59 by root, Mon Jun 5 22:30:35 2006 UTC

25# need to do it again because that pile of garbage called PAR nukes it before main 25# need to do it again because that pile of garbage called PAR nukes it before main
26unshift @INC, $ENV{PAR_TEMP} 26unshift @INC, $ENV{PAR_TEMP}
27 if %PAR::LibCache; 27 if %PAR::LibCache;
28 28
29use Time::HiRes 'time'; 29use Time::HiRes 'time';
30use Pod::POM;
31use Event; 30use Event;
32 31
33use Crossfire; 32use Crossfire;
34use Crossfire::Protocol::Constants; 33use Crossfire::Protocol::Constants;
35 34
39use CFClient::OpenGL (); 38use CFClient::OpenGL ();
40use CFClient::Protocol; 39use CFClient::Protocol;
41use CFClient::UI; 40use CFClient::UI;
42use CFClient::MapWidget; 41use CFClient::MapWidget;
43 42
43$SIG{QUIT} = sub { Carp::cluck "QUIT" };
44
44$Event::DIED = sub { 45$Event::DIED = sub {
45 # TODO: display dialog box or so 46 # TODO: display dialog box or so
47 Carp::confess $_[1];#d#TODO: remove when stable
46 CFClient::error $_[1]; 48 CFClient::error $_[1];
47}; 49};
48 50
49#$SIG{__WARN__} = sub { Carp::cluck $_[0] };#d# 51#$SIG{__WARN__} = sub { Carp::cluck $_[0] };#d#
50 52
82our $CONSOLE; 84our $CONSOLE;
83our $METASERVER; 85our $METASERVER;
84our $LOGIN_BUTTON; 86our $LOGIN_BUTTON;
85our $QUIT_DIALOG; 87our $QUIT_DIALOG;
86our $HOST_ENTRY; 88our $HOST_ENTRY;
87our $SERVER_SETUP; 89
90our $SETUP_DIALOG;
91our $SETUP_NOTEBOOK;
92our $SETUP_SERVER;
93our $SETUP_KEYBOARD;
94our $SETUP_SPELLS;
88 95
89our $FLOORBOX; 96our $FLOORBOX;
90our $GAUGES; 97our $GAUGES;
91our $STATWIDS; 98our $STATWIDS;
92 99
104our $INV_WINDOW; 111our $INV_WINDOW;
105our $INV; 112our $INV;
106our $INVR; 113our $INVR;
107our $INV_RIGHT_HB; 114our $INV_RIGHT_HB;
108 115
109our $BIND_WINDOW;
110our $BIND_EDITOR; 116our $BIND_EDITOR;
111 117
112our $SPELL_LIST; 118our $PICKUP_CFG;
113 119
114sub status { 120sub status {
115 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 121 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
116} 122}
117 123
121 127
122sub start_game { 128sub start_game {
123 status "logging in..."; 129 status "logging in...";
124 130
125 $LOGIN_BUTTON->set_text ("Logout"); 131 $LOGIN_BUTTON->set_text ("Logout");
126 $SERVER_SETUP->hide; 132 $SETUP_DIALOG->hide;
127 133
128 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 134 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
129 135
130 my ($host, $port) = split /:/, $CFG->{host}; 136 my ($host, $port) = split /:/, $CFG->{host};
131 137
169 } 175 }
170} 176}
171 177
172sub stop_game { 178sub stop_game {
173 $LOGIN_BUTTON->set_text ("Login"); 179 $LOGIN_BUTTON->set_text ("Login");
174 $SERVER_SETUP->show; 180 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
181 $SETUP_DIALOG->show;
175 $INV_WINDOW->hide; 182 $INV_WINDOW->hide;
176 $LOGVIEW->hide;
177 183
178 return unless $CONN; 184 return unless $CONN;
179 185
180 status "connection closed"; 186 status "connection closed";
181 187
182 $CONN->destroy; 188 $CONN->destroy;
183 $CONN = 0; # false, does not autovivify 189 $CONN = 0; # false, does not autovivify
184} 190}
185 191
186sub client_setup { 192sub graphics_setup {
187 my $dialog = new CFClient::UI::FancyFrame
188 x => 1,
189 y => $HEIGHT * (1/8),
190 name => "client_setup",
191 title => "Client Setup",
192 child => (my $vbox = new CFClient::UI::VBox); 193 my $vbox = new CFClient::UI::VBox;
193 194
194 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 195 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
195 196
196 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); 197 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode");
197 $table->add (1, 0, my $hbox = new CFClient::UI::HBox); 198 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
321 on_activate => sub { 322 on_activate => sub {
322 video_shutdown (); 323 video_shutdown ();
323 video_init (); 324 video_init ();
324 } 325 }
325 ); 326 );
327
328 $vbox
329}
330
331sub audio_setup {
332 my $vbox = new CFClient::UI::VBox;
333
334 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
335
336 my $row = 0;
326 337
327 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable"); 338 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable");
328 $table->add (1, $row++, new CFClient::UI::CheckBox 339 $table->add (1, $row++, new CFClient::UI::CheckBox
329 state => $CFG->{audio_enable}, 340 state => $CFG->{audio_enable},
330 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", 341 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.",
361 audio_shutdown (); 372 audio_shutdown ();
362 audio_init (); 373 audio_init ();
363 } 374 }
364 ); 375 );
365 376
366 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 377 $vbox
367 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry
368 text => $CFG->{say_command},
369 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. "
370 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
371 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
372 on_changed => sub {
373 my ($self, $value) = @_;
374 $CFG->{say_command} = $value;
375 }
376 );
377
378 $dialog
379} 378}
380 379
381sub set_stats_window_fontsize { 380sub set_stats_window_fontsize {
382 for (values %{$STATWIDS}) { 381 for (values %{$STATWIDS}) {
383 $_->set_fontsize ($::CFG->{stat_fontsize}); 382 $_->set_fontsize ($::CFG->{stat_fontsize});
556 update_stats_window ({}); 555 update_stats_window ({});
557 556
558 $tgw 557 $tgw
559} 558}
560 559
561sub formsep { 560sub formsep($) {
562 reverse join ",", grep length, split /(...)/, reverse $_[0] * 1 561 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
563} 562}
564 563
565sub update_stats_window { 564sub update_stats_window {
566 my ($stats) = @_; 565 my ($stats) = @_;
567 566
713 my $dialog = new CFClient::UI::FancyFrame 712 my $dialog = new CFClient::UI::FancyFrame
714 title => "Server List", 713 title => "Server List",
715 name => 'metaserver_dialog', 714 name => 'metaserver_dialog',
716 x => 'center', 715 x => 'center',
717 y => 'center', 716 y => 'center',
717 z => 3,
718 child => (my $vbox = new CFClient::UI::VBox), 718 child => (my $vbox = new CFClient::UI::VBox),
719 on_visibility_change => sub { 719 on_visibility_change => sub {
720 update_metaserver if $_[1]; 720 update_metaserver if $_[1];
721 }, 721 },
722 ; 722 ;
725 725
726 $dialog 726 $dialog
727} 727}
728 728
729sub server_setup { 729sub server_setup {
730 my $dialog = $SERVER_SETUP = new CFClient::UI::FancyFrame
731 x => "center",
732 y => "center",
733 name => "server_setup",
734 title => "Server Setup",
735 child => (my $vbox = new CFClient::UI::VBox), 730 my $vbox = new CFClient::UI::VBox;
736 ;
737 731
738 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 732 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
739 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port"); 733 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port");
740 734
741 { 735 {
834 $CONN ? stop_game 828 $CONN ? stop_game
835 : start_game; 829 : start_game;
836 }, 830 },
837 ); 831 );
838 832
839 $dialog 833 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
834 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
835 text => $CFG->{say_command},
836 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. "
837 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
838 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
839 on_changed => sub {
840 my ($self, $value) = @_;
841 $CFG->{say_command} = $value;
842 }
843 );
844
845 $vbox
840} 846}
841 847
842sub message_window { 848sub message_window {
843 my $window = new CFClient::UI::FancyFrame 849 my $window = new CFClient::UI::FancyFrame
844 name => "message_window", 850 name => "message_window",
870 }, 876 },
871 on_activate => sub { 877 on_activate => sub {
872 my ($input, $text) = @_; 878 my ($input, $text) = @_;
873 $input->set_text (''); 879 $input->set_text ('');
874 880
875 if ($text =~ /^\/bind\s+(.*)$/) {
876 CFClient::Binder::open_binding_dialog (sub {
877 my ($mod, $sym) = @_;
878 $::CFG->{bindings}->{$mod}->{$sym} = [$1];
879 });
880 } elsif ($text =~ /^\/(.*)/) { 881 if ($text =~ /^\/(.*)/) {
881 $::CONN->user_send ($1); 882 $::CONN->user_send ($1);
882 } else { 883 } else {
883 my $say_cmd = $::CFG->{say_command} || 'say'; 884 my $say_cmd = $::CFG->{say_command} || 'say';
884 $::CONN->user_send ("$say_cmd $text"); 885 $::CONN->user_send ("$say_cmd $text");
885 } 886 }
904sub open_quit_dialog { 905sub open_quit_dialog {
905 unless ($QUIT_DIALOG) { 906 unless ($QUIT_DIALOG) {
906 $QUIT_DIALOG = new CFClient::UI::FancyFrame 907 $QUIT_DIALOG = new CFClient::UI::FancyFrame
907 x => "center", 908 x => "center",
908 y => "center", 909 y => "center",
910 z => 50,
909 title => "Really Quit?", 911 title => "Really Quit?",
910 ; 912 ;
911 913
912 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); 914 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1);
913 915
930 } 932 }
931 933
932 $QUIT_DIALOG->show; 934 $QUIT_DIALOG->show;
933} 935}
934 936
937sub autopickup_setup {
938 my $table = new CFClient::UI::Table;
939
940 for (
941 ["General", 0, 0,
942 ["Enable autopickup" => PICKUP_NEWMODE],
943 ["Inhibit autopickup" => PICKUP_INHIBIT],
944 ["Stop before pickup" => PICKUP_STOP],
945 ["Debug autopickup" => PICKUP_DEBUG],
946 ],
947 ["Weapons", 0, 6,
948 ["All weapons" => PICKUP_ALLWEAPON],
949 ["Missile weapons" => PICKUP_MISSILEWEAPON],
950 ["Bows" => PICKUP_BOW],
951 ["Arrows" => PICKUP_ARROW],
952 ],
953 ["Armour", 0, 12,
954 ["Helmets" => PICKUP_HELMET],
955 ["Shields" => PICKUP_SHIELD],
956 ["Body Armour" => PICKUP_ARMOUR],
957 ["Boots" => PICKUP_BOOTS],
958 ["Gloves" => PICKUP_GLOVES],
959 ["Cloaks" => PICKUP_CLOAK],
960 ],
961
962 ["Readables", 2, 2,
963 ["Spellbooks" => PICKUP_SPELLBOOK],
964 ["Skillscrolls" => PICKUP_SKILLSCROLL],
965 ["Normal Books/Scrolls" => PICKUP_READABLES],
966 ],
967 ["Misc", 2, 7,
968 ["Food" => PICKUP_FOOD],
969 ["Drinks" => PICKUP_DRINK],
970 ["Valuables (Money, Gems)" => PICKUP_VALUABLES],
971 ["Keys" => PICKUP_KEY],
972 ["Magical Items" => PICKUP_MAGICAL],
973 ["Potions" => PICKUP_POTION],
974 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
975 ["Ignore cursed" => PICKUP_NOT_CURSED],
976 ["Jewelery" => PICKUP_JEWELS],
977 ],
978 )
979 {
980 my ($title, $x, $y, @bits) = @$_;
981 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
982
983 for (@bits) {
984 ++$y;
985
986 my $mask = $_->[1];
987 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1);
988 $table->add ($x+1, $y, new CFClient::UI::CheckBox
989 state => $CFG->{pickup} & $mask,
990 on_changed => sub {
991 my ($box, $value) = @_;
992 if ($value) {
993 $::CFG->{pickup} |= $mask;
994 } else {
995 $::CFG->{pickup} = $::CFG->{pickup} & ~$mask;
996 }
997 $::CONN->send (sprintf "command pickup %u", $::CFG->{pickup})
998 if defined $::CONN;
999 });
1000 }
1001 }
1002
1003 $table
1004}
1005
935sub make_inventory_window { 1006sub make_inventory_window {
936 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame 1007 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
937 x => "center", 1008 x => "center",
938 y => "center", 1009 y => "center",
939 force_w => $WIDTH * 9/10, 1010 force_w => $WIDTH * 9/10,
957 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); 1028 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
958 1029
959 $invwin 1030 $invwin
960} 1031}
961 1032
962sub make_spell_list { 1033sub spell_setup {
963 $SPELL_LIST = new CFClient::UI::SpellList 1034 new CFClient::UI::SpellList
964 force_w => $WIDTH * (9/10),
965 force_h => $HEIGHT * (9/10);
966 $SPELL_LIST
967} 1035}
968 1036
969sub make_binding_window { 1037sub keyboard_setup {
970 my $binding_list = new CFClient::UI::VBox; 1038 my $binding_list = new CFClient::UI::VBox;
971 1039
972 my $refresh; 1040 my $refresh;
973 $refresh = sub { 1041 $refresh = sub {
974 $binding_list->clear (); 1042 $binding_list->clear ();
998 sub { 1066 sub {
999 my ($nmod, $nsym, $ncmds) = @_; 1067 my ($nmod, $nsym, $ncmds) = @_;
1000 delete $::CFG->{bindings}->{$mod}->{$sym}; 1068 delete $::CFG->{bindings}->{$mod}->{$sym};
1001 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1069 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds;
1002 $refresh->(); 1070 $refresh->();
1071 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1003 $::BIND_WINDOW->show; 1072 $SETUP_DIALOG->show;
1004 }, 1073 },
1005 sub { 1074 sub {
1075 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1006 $::BIND_WINDOW->show; 1076 $SETUP_DIALOG->show;
1007 }); 1077 });
1008 $::BIND_EDITOR->show; 1078 $::BIND_EDITOR->show;
1009 $::BIND_WINDOW->hide; 1079 $SETUP_DIALOG->hide;
1010 }); 1080 });
1011 1081
1012 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1082 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1013 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1083 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1014 } 1084 }
1015 } 1085 }
1016 }; 1086 };
1017 1087
1018 $BIND_WINDOW = new CFClient::UI::FancyFrame
1019 title => "Bindings",
1020 x => "center",
1021 y => "center",
1022 def_w => int $WIDTH * 9/10,
1023 def_h => int $HEIGHT * 9/10,
1024 on_visibility_change => sub {
1025 my ($self, $visible) = @_;
1026 $refresh->() if $visible;
1027 };
1028
1029 $BIND_WINDOW->add (my $vb = new CFClient::UI::VBox); 1088 my $vb = new CFClient::UI::VBox;
1030 $vb->add ($binding_list); 1089 $vb->add ($binding_list);
1031 $vb->add (my $hb = new CFClient::UI::HBox); 1090 $vb->add (my $hb = new CFClient::UI::HBox);
1091
1032 $hb->add (new CFClient::UI::Button 1092 $hb->add (new CFClient::UI::Button
1033 text => "record new", 1093 text => "record new",
1034 expand => 1, 1094 expand => 1,
1035 tooltip => "This button opens the binding editor with an empty binding.", 1095 tooltip => "This button opens the binding editor with an empty binding.",
1036 on_activate => sub { 1096 on_activate => sub {
1037 $::BIND_EDITOR->set_binding (undef, undef, [], 1097 $::BIND_EDITOR->set_binding (undef, undef, [],
1038 sub { 1098 sub {
1039 my ($mod, $sym, $cmds) = @_; 1099 my ($mod, $sym, $cmds) = @_;
1040 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1100 $::CFG->{bindings}->{$mod}->{$sym} = $cmds;
1041 $refresh->(); 1101 $refresh->();
1042 $::BIND_WINDOW->show; 1102 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1103 $SETUP_DIALOG->show;
1043 }, 1104 },
1044 sub { 1105 sub {
1045 $::BIND_WINDOW->show; 1106 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1107 $SETUP_DIALOG->show;
1046 }); 1108 },
1047 $::BIND_WINDOW->hide; 1109 );
1110 $SETUP_DIALOG->hide;
1048 $::BIND_EDITOR->show; 1111 $::BIND_EDITOR->show;
1049 }, 1112 },
1050 ); 1113 );
1114
1051 $hb->add (new CFClient::UI::Button 1115 $hb->add (new CFClient::UI::Button
1052 text => "close", 1116 text => "close",
1053 tooltip => "Closes the binding window", 1117 tooltip => "Closes the binding window",
1054 expand => 1, 1118 expand => 1,
1055 on_activate => sub { 1119 on_activate => sub {
1056 $::BIND_WINDOW->hide; 1120 $SETUP_DIALOG->hide;
1057 } 1121 }
1058 ); 1122 );
1059 1123
1060 $refresh->(); 1124 $refresh->();
1061 $BIND_WINDOW 1125
1126 $vb
1062} 1127}
1063 1128
1064sub make_help_window { 1129sub make_help_window {
1065 my $win = new CFClient::UI::FancyFrame 1130 my $win = new CFClient::UI::FancyFrame
1066 x => 'center', 1131 x => 'center',
1067 y => 'center', 1132 y => 'center',
1133 z => 2,
1068 name => 'doc_browser', 1134 name => 'doc_browser',
1069 force_w => int $WIDTH * 7/8, 1135 force_w => int $WIDTH * 7/8,
1070 force_h => int $HEIGHT * 7/8, 1136 force_h => int $HEIGHT * 7/8,
1071 title => "Documentation"; 1137 title => "Documentation";
1072 1138
1084 my ($pod, $label) = @$_; 1150 my ($pod, $label) = @$_;
1085 1151
1086 $buttons->add (new CFClient::UI::Button 1152 $buttons->add (new CFClient::UI::Button
1087 text => $label, 1153 text => $label,
1088 on_activate => sub { 1154 on_activate => sub {
1089 my $parser = new Pod::POM; 1155 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1090 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod"); 1156 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1091 1157
1092 $viewer->clear; 1158 $viewer->clear;
1093 1159
1094 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1160 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1095 for @{ CFClient::pod_to_pango_list $pom }; 1161 for @$pom;
1096 1162
1097 $viewer->set_offset (0); 1163 $viewer->set_offset (0);
1098 }, 1164 },
1099 ); 1165 );
1100 } 1166 }
1147 $DEBUG_STATUS->show; 1213 $DEBUG_STATUS->show;
1148 1214
1149 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0); 1215 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0);
1150 1216
1151 $STATUSBOX = new CFClient::UI::Statusbox; 1217 $STATUSBOX = new CFClient::UI::Statusbox;
1152 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]); 1218 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1153 1219
1154 (new CFClient::UI::Frame 1220 (new CFClient::UI::Frame
1155 bg => [0, 0, 0, 0.4], 1221 bg => [0, 0, 0, 0.4],
1156 force_x => 0, 1222 force_x => 0,
1157 force_y => "max", 1223 force_y => "max",
1158 child => $STATUSBOX, 1224 child => $STATUSBOX,
1159 )->show; 1225 )->show;
1160 1226
1161 CFClient::UI::FancyFrame->new ( 1227 CFClient::UI::FancyFrame->new (
1162 title => "Mini Map", 1228 title => "Map",
1163 name => "mapmap", 1229 name => "mapmap",
1164 x => 0, 1230 x => 0,
1165 y => $FONTSIZE + 8, 1231 y => $FONTSIZE + 8,
1166 border_bg => [1, 1, 1, 192/255], 1232 border_bg => [1, 1, 1, 192/255],
1167 bg => [1, 1, 1, 0], 1233 bg => [1, 1, 1, 0],
1193 can_hover => 1, 1259 can_hover => 1,
1194 can_events => 1, 1260 can_events => 1,
1195 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.", 1261 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.",
1196 ; 1262 ;
1197 1263
1264 $SETUP_DIALOG = new CFClient::UI::FancyFrame
1265 title => "Setup",
1266 name => "setup_dialog",
1267 x => 'center',
1268 y => 'center',
1269 z => 2,
1270 force_w => $::WIDTH * 0.6,
1271 force_h => $::HEIGHT * 0.6,
1272 ;
1273
1274 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1275 filter => new CFClient::UI::ScrolledWindow xxx => 1, expand => 1, scroll_y => 1);
1276
1277 $SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup,
1278 "Configure the server to play on, your username, password and other server-related options.");
1279 $SETUP_NOTEBOOK->add (Pickup => autopickup_setup,
1280 "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them.");
1281 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1282 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1283 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1284 "Configure the use of audio, sound effects and background music.");
1285 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1286 "Lets you define, edit and delete bindings."
1287 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor "
1288 . "with nothing set and the recording started. After doing the actions you "
1289 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1290 . "After pressing the combo the binding will be saved automatically and the "
1291 . "binding editor closes");
1292 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1293 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1294
1198 $BUTTONBAR = new CFClient::UI::HBox x => 0, y => 0; 1295 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1199 1296
1200 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Client Setup", other => client_setup, 1297 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1201 tooltip => "Toggles a dialog where you can configure various aspects of the client, such as graphics mode, performance, and audio options."); 1298 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1202 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Server Setup", other => server_setup, 1299
1203 tooltip => "Toggles a dialog where you can configure the server to play on, your username, password and other server-related options.");
1204 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window, 1300 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window,
1205 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 1301 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
1206 1302
1207 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D 1303 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D
1208 1304
1209 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window, 1305 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window,
1210 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times."); 1306 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times.");
1211 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window, 1307 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window,
1212 tooltip => "Toggles the inventory window, where you can manage your loot (or treaures :)." 1308 tooltip => "Toggles the inventory window, where you can manage your loot (or treasures :). "
1213 ."You can also hit the Tab-key to show/hide the Inventory."); 1309 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory.");
1214 1310
1215 $BUTTONBAR->add (new CFClient::UI::Button 1311 $BUTTONBAR->add (new CFClient::UI::Button
1216 text => "Save Config", 1312 text => "Save Config",
1217 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1313 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1218 on_activate => sub { 1314 on_activate => sub {
1222 }, 1318 },
1223 ); 1319 );
1224 1320
1225 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, 1321 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window,
1226 tooltip => "View Documentation"); 1322 tooltip => "View Documentation");
1227
1228 $BUTTONBAR->add (new CFClient::UI::Flopper
1229 text => "Bindings",
1230 other => make_binding_window,
1231 tooltip =>
1232 "Lets you define, edit and delete bindings."
1233 ."There is a shortcut for making bindings: LCTRL+Insert opens the binding editor "
1234 ."with nothing set and the recording started. After doing the actions you "
1235 ."want to record press Insert and you will be asked to press a key-combo."
1236 ."After pressing the combo the binding will be saved automatically and the "
1237 ."binding editor closes");
1238
1239 $BUTTONBAR->add (new CFClient::UI::Flopper
1240 text => "Spells",
1241 other => make_spell_list,
1242 tooltip => "The spell list");
1243 1323
1244 $BUTTONBAR->add (new CFClient::UI::Button 1324 $BUTTONBAR->add (new CFClient::UI::Button
1245 text => "Quit", 1325 text => "Quit",
1246 tooltip => "Terminates the program", 1326 tooltip => "Terminates the program",
1247 on_activate => sub { 1327 on_activate => sub {
1252 } 1332 }
1253 }, 1333 },
1254 ); 1334 );
1255 1335
1256 $BUTTONBAR->show; 1336 $BUTTONBAR->show;
1257 $SERVER_SETUP->show; 1337 $SETUP_DIALOG->show;
1338 }
1258 1339
1259 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1340 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1260 }
1261} 1341}
1262 1342
1263sub video_shutdown { 1343sub video_shutdown {
1264 undef $SDL_ACTIVE; 1344 undef $SDL_ACTIVE;
1265} 1345}
1397}; 1477};
1398 1478
1399 CFClient::SDL_GL_SwapBuffers; 1479 CFClient::SDL_GL_SwapBuffers;
1400} 1480}
1401 1481
1402my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub { 1482my $refresh_watcher = Event->timer (after => 0, hard => 0, interval => 1 / $MAX_FPS, cb => sub {
1403 $NOW = time; 1483 $NOW = time;
1404 1484
1405 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 1485 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
1406 for CFClient::SDL_PollEvent; 1486 for CFClient::SDL_PollEvent;
1407 1487
1474############################################################################# 1554#############################################################################
1475 1555
1476$SIG{INT} = $SIG{TERM} = sub { exit }; 1556$SIG{INT} = $SIG{TERM} = sub { exit };
1477 1557
1478{ 1558{
1479 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] if defined $^S && !$^S }; 1559 local $SIG{__DIE__} = sub {
1560 return unless defined $^S && !$^S;
1561 Carp::confess $_[1];#d#TODO: remove when stable
1562 CFClient::fatal $_[0];
1563 };
1480 1564
1481 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1565 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1482 CFClient::UI::set_layout ($::CFG->{layout}); 1566 CFClient::UI::set_layout ($::CFG->{layout});
1483 1567
1484 my %DEF_CFG = ( 1568 my %DEF_CFG = (

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines