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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines