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.39 by root, Thu Jun 1 03:42:58 2006 UTC vs.
Revision 1.56 by root, Mon Jun 5 05:23:21 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
81our $LOGVIEW; 81our $LOGVIEW;
82our $CONSOLE; 82our $CONSOLE;
83our $METASERVER; 83our $METASERVER;
84our $LOGIN_BUTTON; 84our $LOGIN_BUTTON;
85our $QUIT_DIALOG; 85our $QUIT_DIALOG;
86our $SERVER_SETUP; 86our $HOST_ENTRY;
87
88our $SETUP_DIALOG;
89our $SETUP_NOTEBOOK;
90our $SETUP_SERVER;
91our $SETUP_KEYBOARD;
92our $SETUP_SPELLS;
87 93
88our $FLOORBOX; 94our $FLOORBOX;
89our $GAUGES; 95our $GAUGES;
90our $STATWIDS; 96our $STATWIDS;
91 97
103our $INV_WINDOW; 109our $INV_WINDOW;
104our $INV; 110our $INV;
105our $INVR; 111our $INVR;
106our $INV_RIGHT_HB; 112our $INV_RIGHT_HB;
107 113
108our $BIND_WINDOW;
109our $BIND_EDITOR; 114our $BIND_EDITOR;
110 115
111our $SPELL_LIST; 116our $PICKUP_CFG;
112 117
113sub status { 118sub status {
114 $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]);
115} 120}
116 121
120 125
121sub start_game { 126sub start_game {
122 status "logging in..."; 127 status "logging in...";
123 128
124 $LOGIN_BUTTON->set_text ("Logout"); 129 $LOGIN_BUTTON->set_text ("Logout");
125 $SERVER_SETUP->hide; 130 $SETUP_DIALOG->hide;
126 131
127 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;
128 133
129 my ($host, $port) = split /:/, $CFG->{host}; 134 my ($host, $port) = split /:/, $CFG->{host};
130 135
168 } 173 }
169} 174}
170 175
171sub stop_game { 176sub stop_game {
172 $LOGIN_BUTTON->set_text ("Login"); 177 $LOGIN_BUTTON->set_text ("Login");
173 $SERVER_SETUP->show; 178 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
179 $SETUP_DIALOG->show;
174 $INV_WINDOW->hide; 180 $INV_WINDOW->hide;
175 $LOGVIEW->hide;
176 181
177 return unless $CONN; 182 return unless $CONN;
178 183
179 status "connection closed"; 184 status "connection closed";
180 185
181 $CONN->destroy; 186 $CONN->destroy;
182 $CONN = 0; # false, does not autovivify 187 $CONN = 0; # false, does not autovivify
183} 188}
184 189
185sub client_setup { 190sub graphics_setup {
186 my $dialog = new CFClient::UI::FancyFrame
187 x => 1,
188 y => $HEIGHT * (1/8),
189 name => "client_setup",
190 title => "Client Setup",
191 child => (my $vbox = new CFClient::UI::VBox); 191 my $vbox = new CFClient::UI::VBox;
192 192
193 $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]);
194 194
195 $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");
196 $table->add (1, 0, my $hbox = new CFClient::UI::HBox); 196 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
320 on_activate => sub { 320 on_activate => sub {
321 video_shutdown (); 321 video_shutdown ();
322 video_init (); 322 video_init ();
323 } 323 }
324 ); 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;
325 335
326 $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");
327 $table->add (1, $row++, new CFClient::UI::CheckBox 337 $table->add (1, $row++, new CFClient::UI::CheckBox
328 state => $CFG->{audio_enable}, 338 state => $CFG->{audio_enable},
329 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.",
360 audio_shutdown (); 370 audio_shutdown ();
361 audio_init (); 371 audio_init ();
362 } 372 }
363 ); 373 );
364 374
365 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 375 $vbox
366 $table->add (1, $row++, my $saycmd = new CFClient::UI::Entry
367 text => $CFG->{say_command},
368 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. "
369 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
370 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
371 on_changed => sub {
372 my ($self, $value) = @_;
373 $CFG->{say_command} = $value;
374 }
375 );
376
377 $dialog
378} 376}
379 377
380sub set_stats_window_fontsize { 378sub set_stats_window_fontsize {
381 for (values %{$STATWIDS}) { 379 for (values %{$STATWIDS}) {
382 $_->set_fontsize ($::CFG->{stat_fontsize}); 380 $_->set_fontsize ($::CFG->{stat_fontsize});
555 update_stats_window ({}); 553 update_stats_window ({});
556 554
557 $tgw 555 $tgw
558} 556}
559 557
560sub formsep { 558sub formsep($) {
561 reverse join ",", grep length, split /(...)/, reverse $_[0] * 1 559 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
562} 560}
563 561
564sub update_stats_window { 562sub update_stats_window {
565 my ($stats) = @_; 563 my ($stats) = @_;
566 564
628 626
629 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}) 627 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
630 for keys %tbl; 628 for keys %tbl;
631} 629}
632 630
633sub metaserver_dialog {
634 my $dialog = new CFClient::UI::FancyFrame
635 title => "Server List",
636 child => (my $vbox = new CFClient::UI::VBox);
637
638 $vbox->add ($dialog->{table} = new CFClient::UI::Table);
639
640 $dialog
641}
642
643my $METASERVER_ATIME; 631my $METASERVER_ATIME;
644 632
645sub update_metaserver { 633sub update_metaserver {
646 my ($HOST) = @_;
647
648 return if $METASERVER_ATIME > time; 634 return if $METASERVER_ATIME > time;
649 $METASERVER_ATIME = time + 60; 635 $METASERVER_ATIME = time + 60;
650 636
651 my $table = $METASERVER->{table}; 637 my $table = $METASERVER->{table};
652 $table->clear; 638 $table->clear;
704 690
705 $y++; 691 $y++;
706 692
707 $table->add (0, $y, new CFClient::UI::VBox children => [ 693 $table->add (0, $y, new CFClient::UI::VBox children => [
708 (new CFClient::UI::Button text => "Use", on_activate => sub { 694 (new CFClient::UI::Button text => "Use", on_activate => sub {
709 $HOST->set_text ($CFG->{host} = $host); 695 $HOST_ENTRY->set_text ($CFG->{host} = $host);
696 $METASERVER->toggle_visibility;
710 }), 697 }),
711 (new CFClient::UI::Empty expand => 1), 698 (new CFClient::UI::Empty expand => 1),
712 ]); 699 ]);
713 700
714 $table->add ($_ + 1, $y, new CFClient::UI::Label 701 $table->add ($_ + 1, $y, new CFClient::UI::Label
717 } 704 }
718 } 705 }
719 }); 706 });
720} 707}
721 708
709sub metaserver_dialog {
710 my $dialog = new CFClient::UI::FancyFrame
711 title => "Server List",
712 name => 'metaserver_dialog',
713 x => 'center',
714 y => 'center',
715 child => (my $vbox = new CFClient::UI::VBox),
716 on_visibility_change => sub {
717 update_metaserver if $_[1];
718 },
719 ;
720
721 $vbox->add ($dialog->{table} = new CFClient::UI::Table);
722
723 $dialog
724}
725
722sub server_setup { 726sub server_setup {
723 my $dialog = $SERVER_SETUP = new CFClient::UI::FancyFrame
724 x => "center",
725 y => "center",
726 name => "server_setup",
727 title => "Server Setup",
728 child => (my $vbox = new CFClient::UI::VBox), 727 my $vbox = new CFClient::UI::VBox;
729 ;
730 728
731 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 729 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
732 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port"); 730 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port");
733 731
734 { 732 {
735 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 733 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
736 734
737 $vbox->add ( 735 $vbox->add (
738 my $HOST = new CFClient::UI::Entry 736 $HOST_ENTRY = new CFClient::UI::Entry
739 expand => 1, 737 expand => 1,
740 text => $CFG->{host}, 738 text => $CFG->{host},
741 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", 739 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to",
742 on_changed => sub { 740 on_changed => sub {
743 my ($self, $value) = @_; 741 my ($self, $value) = @_;
745 } 743 }
746 ); 744 );
747 745
748 $METASERVER = metaserver_dialog; 746 $METASERVER = metaserver_dialog;
749 747
750 $vbox->add (new CFClient::UI::Flopper 748 $vbox->add (new CFClient::UI::Button
751 expand => 1, 749 expand => 1,
752 text => "Server List", 750 text => "Server List",
753 other => $METASERVER, 751 other => $METASERVER,
754 tooltip => "Show a list of available crossfire servers", 752 tooltip => "Show a list of available crossfire servers",
755 on_open => sub { 753 on_activate => sub { $METASERVER->toggle_visibility },
756 update_metaserver $HOST;
757 }
758 ); 754 );
759 } 755 }
760 756
761 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); 757 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username");
762 $table->add (1, 4, new CFClient::UI::Entry 758 $table->add (1, 4, new CFClient::UI::Entry
829 $CONN ? stop_game 825 $CONN ? stop_game
830 : start_game; 826 : start_game;
831 }, 827 },
832 ); 828 );
833 829
834 $dialog 830 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
831 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
832 text => $CFG->{say_command},
833 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. "
834 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
835 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
836 on_changed => sub {
837 my ($self, $value) = @_;
838 $CFG->{say_command} = $value;
839 }
840 );
841
842 $vbox
835} 843}
836 844
837sub message_window { 845sub message_window {
838 my $window = new CFClient::UI::FancyFrame 846 my $window = new CFClient::UI::FancyFrame
839 name => "message_window", 847 name => "message_window",
865 }, 873 },
866 on_activate => sub { 874 on_activate => sub {
867 my ($input, $text) = @_; 875 my ($input, $text) = @_;
868 $input->set_text (''); 876 $input->set_text ('');
869 877
870 if ($text =~ /^\/bind\s+(.*)$/) {
871 CFClient::Binder::open_binding_dialog (sub {
872 my ($mod, $sym) = @_;
873 $::CFG->{bindings}->{$mod}->{$sym} = [$1];
874 });
875 } elsif ($text =~ /^\/(.*)/) { 878 if ($text =~ /^\/(.*)/) {
876 $::CONN->user_send ($1); 879 $::CONN->user_send ($1);
877 } else { 880 } else {
878 my $say_cmd = $::CFG->{say_command} || 'say'; 881 my $say_cmd = $::CFG->{say_command} || 'say';
879 $::CONN->user_send ("$say_cmd $text"); 882 $::CONN->user_send ("$say_cmd $text");
880 } 883 }
899sub open_quit_dialog { 902sub open_quit_dialog {
900 unless ($QUIT_DIALOG) { 903 unless ($QUIT_DIALOG) {
901 $QUIT_DIALOG = new CFClient::UI::FancyFrame 904 $QUIT_DIALOG = new CFClient::UI::FancyFrame
902 x => "center", 905 x => "center",
903 y => "center", 906 y => "center",
907 z => 50,
904 title => "Really Quit?", 908 title => "Really Quit?",
905 ; 909 ;
906 910
907 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); 911 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1);
908 912
925 } 929 }
926 930
927 $QUIT_DIALOG->show; 931 $QUIT_DIALOG->show;
928} 932}
929 933
934sub autopickup_setup {
935 my $table = new CFClient::UI::Table;
936
937 for (
938 ["General", 0, 0,
939 ["Enable autopickup" => CFClient::Pickup::PU_NEWMODE],
940 ["Inhibit autopickup" => CFClient::Pickup::PU_INHIBIT],
941 ["Stop before pickup" => CFClient::Pickup::PU_STOP],
942 ["Debug autopickup" => CFClient::Pickup::PU_DEBUG],
943 ],
944 ["Weapons", 0, 6,
945 ["All weapons" => CFClient::Pickup::PU_ALLWEAPON],
946 ["Missile weapons" => CFClient::Pickup::PU_MISSILEWEAPON],
947 ["Bows" => CFClient::Pickup::PU_BOW],
948 ["Arrows" => CFClient::Pickup::PU_ARROW],
949 ],
950 ["Armour", 0, 12,
951 ["Helmets" => CFClient::Pickup::PU_HELMET],
952 ["Shields" => CFClient::Pickup::PU_SHIELD],
953 ["Body Armour" => CFClient::Pickup::PU_ARMOUR],
954 ["Boots" => CFClient::Pickup::PU_BOOTS],
955 ["Gloves" => CFClient::Pickup::PU_GLOVES],
956 ["Cloaks" => CFClient::Pickup::PU_CLOAK],
957 ],
958
959 ["Readables", 2, 2,
960 ["Spellbooks" => CFClient::Pickup::PU_SPELLBOOK],
961 ["Skillscrolls" => CFClient::Pickup::PU_SKILLSCROLL],
962 ["Normal Books/Scrolls" => CFClient::Pickup::PU_READABLES],
963 ],
964 ["Misc", 2, 7,
965 ["Food" => CFClient::Pickup::PU_FOOD],
966 ["Drinks" => CFClient::Pickup::PU_DRINK],
967 ["Valuables (Money, Gems)" => CFClient::Pickup::PU_VALUABLES],
968 ["Keys" => CFClient::Pickup::PU_KEY],
969 ["Magical Items" => CFClient::Pickup::PU_MAGICAL],
970 ["Potions" => CFClient::Pickup::PU_POTION],
971 ["Magic Devices" => CFClient::Pickup::PU_MAGIC_DEVICE],
972 ["Ignore cursed" => CFClient::Pickup::PU_NOT_CURSED],
973 ["Jewelery" => CFClient::Pickup::PU_JEWELS],
974 ],
975 )
976 {
977 my ($title, $x, $y, @bits) = @$_;
978 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
979
980 for (@bits) {
981 ++$y;
982
983 my $mask = $_->[1];
984 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1);
985 $table->add ($x+1, $y, new CFClient::UI::CheckBox
986 state => $CFG->{pickup} & $mask,
987 on_changed => sub {
988 my ($box, $value) = @_;
989 if ($value) {
990 $::CFG->{pickup} |= $mask;
991 } else {
992 $::CFG->{pickup} = $::CFG->{pickup} & ~$mask;
993 }
994 $::CONN->send (sprintf "command pickup %u", $::CFG->{pickup})
995 if defined $::CONN;
996 });
997 }
998 }
999
1000 $table
1001}
1002
930sub make_inventory_window { 1003sub make_inventory_window {
931 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame 1004 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
932 x => "center", 1005 x => "center",
933 y => "center", 1006 y => "center",
934 force_w => $WIDTH * 9/10, 1007 force_w => $WIDTH * 9/10,
952 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); 1025 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
953 1026
954 $invwin 1027 $invwin
955} 1028}
956 1029
957sub make_spell_list { 1030sub spell_setup {
958 $SPELL_LIST = new CFClient::UI::SpellList 1031 new CFClient::UI::SpellList
959 force_w => $WIDTH * (9/10),
960 force_h => $HEIGHT * (9/10);
961 $SPELL_LIST
962} 1032}
963 1033
964sub make_binding_window { 1034sub keyboard_setup {
965 my $binding_list = new CFClient::UI::VBox; 1035 my $binding_list = new CFClient::UI::VBox;
966 1036
967 my $refresh; 1037 my $refresh;
968 $refresh = sub { 1038 $refresh = sub {
969 $binding_list->clear (); 1039 $binding_list->clear ();
993 sub { 1063 sub {
994 my ($nmod, $nsym, $ncmds) = @_; 1064 my ($nmod, $nsym, $ncmds) = @_;
995 delete $::CFG->{bindings}->{$mod}->{$sym}; 1065 delete $::CFG->{bindings}->{$mod}->{$sym};
996 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1066 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds;
997 $refresh->(); 1067 $refresh->();
1068 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
998 $::BIND_WINDOW->show; 1069 $SETUP_DIALOG->show;
999 }, 1070 },
1000 sub { 1071 sub {
1072 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1001 $::BIND_WINDOW->show; 1073 $SETUP_DIALOG->show;
1002 }); 1074 });
1003 $::BIND_EDITOR->show; 1075 $::BIND_EDITOR->show;
1004 $::BIND_WINDOW->hide; 1076 $SETUP_DIALOG->hide;
1005 }); 1077 });
1006 1078
1007 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1079 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1008 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1080 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1009 } 1081 }
1010 } 1082 }
1011 }; 1083 };
1012 1084
1013 $BIND_WINDOW = new CFClient::UI::FancyFrame
1014 title => "Bindings",
1015 x => "center",
1016 y => "center",
1017 def_w => int $WIDTH * 9/10,
1018 def_h => int $HEIGHT * 9/10,
1019 on_visibility_change => sub {
1020 my ($self, $visible) = @_;
1021 $refresh->() if $visible;
1022 };
1023
1024 $BIND_WINDOW->add (my $vb = new CFClient::UI::VBox); 1085 my $vb = new CFClient::UI::VBox;
1025 $vb->add ($binding_list); 1086 $vb->add ($binding_list);
1026 $vb->add (my $hb = new CFClient::UI::HBox); 1087 $vb->add (my $hb = new CFClient::UI::HBox);
1088
1027 $hb->add (new CFClient::UI::Button 1089 $hb->add (new CFClient::UI::Button
1028 text => "record new", 1090 text => "record new",
1029 expand => 1, 1091 expand => 1,
1030 tooltip => "This button opens the binding editor with an empty binding.", 1092 tooltip => "This button opens the binding editor with an empty binding.",
1031 on_activate => sub { 1093 on_activate => sub {
1032 $::BIND_EDITOR->set_binding (undef, undef, [], 1094 $::BIND_EDITOR->set_binding (undef, undef, [],
1033 sub { 1095 sub {
1034 my ($mod, $sym, $cmds) = @_; 1096 my ($mod, $sym, $cmds) = @_;
1035 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1097 $::CFG->{bindings}->{$mod}->{$sym} = $cmds;
1036 $refresh->(); 1098 $refresh->();
1037 $::BIND_WINDOW->show; 1099 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1100 $SETUP_DIALOG->show;
1038 }, 1101 },
1039 sub { 1102 sub {
1040 $::BIND_WINDOW->show; 1103 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1104 $SETUP_DIALOG->show;
1041 }); 1105 },
1042 $::BIND_WINDOW->hide; 1106 );
1107 $SETUP_DIALOG->hide;
1043 $::BIND_EDITOR->show; 1108 $::BIND_EDITOR->show;
1044 }, 1109 },
1045 ); 1110 );
1111
1046 $hb->add (new CFClient::UI::Button 1112 $hb->add (new CFClient::UI::Button
1047 text => "close", 1113 text => "close",
1048 tooltip => "Closes the binding window", 1114 tooltip => "Closes the binding window",
1049 expand => 1, 1115 expand => 1,
1050 on_activate => sub { 1116 on_activate => sub {
1051 $::BIND_WINDOW->hide; 1117 $SETUP_DIALOG->hide;
1052 } 1118 }
1053 ); 1119 );
1054 1120
1055 $refresh->(); 1121 $refresh->();
1056 $BIND_WINDOW 1122
1123 $vb
1057} 1124}
1058 1125
1059sub make_help_window { 1126sub make_help_window {
1060 my $win = new CFClient::UI::FancyFrame 1127 my $win = new CFClient::UI::FancyFrame
1128 x => 'center',
1129 y => 'center',
1130 z => 2,
1131 name => 'doc_browser',
1061 def_w => int $WIDTH * 7/8, 1132 force_w => int $WIDTH * 7/8,
1062 def_h => int $HEIGHT * 7/8, 1133 force_h => int $HEIGHT * 7/8,
1063 title => "Documentation"; 1134 title => "Documentation";
1064 1135
1065 $win->add (my $vbox = new CFClient::UI::VBox); 1136 $win->add (my $vbox = new CFClient::UI::VBox);
1066 1137
1067 $vbox->add (my $buttons = new CFClient::UI::HBox); 1138 $vbox->add (my $buttons = new CFClient::UI::HBox);
1068 $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8); 1139 $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8);
1076 my ($pod, $label) = @$_; 1147 my ($pod, $label) = @$_;
1077 1148
1078 $buttons->add (new CFClient::UI::Button 1149 $buttons->add (new CFClient::UI::Button
1079 text => $label, 1150 text => $label,
1080 on_activate => sub { 1151 on_activate => sub {
1081 my $parser = new Pod::POM;
1082 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod"); 1152 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod";
1083 1153
1084 $viewer->clear; 1154 $viewer->clear;
1085 1155
1086 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1156 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1087 for @{ CFClient::pod_to_pango_list $pom }; 1157 for @{ CFClient::pod_to_pango_list $pom };
1139 $DEBUG_STATUS->show; 1209 $DEBUG_STATUS->show;
1140 1210
1141 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0); 1211 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0);
1142 1212
1143 $STATUSBOX = new CFClient::UI::Statusbox; 1213 $STATUSBOX = new CFClient::UI::Statusbox;
1144 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", pri => -100, color => [1, 1, 1, 0.8]); 1214 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1145 1215
1146 (new CFClient::UI::Frame 1216 (new CFClient::UI::Frame
1147 bg => [0, 0, 0, 0.4], 1217 bg => [0, 0, 0, 0.4],
1148 force_x => 0, 1218 force_x => 0,
1149 force_y => "max", 1219 force_y => "max",
1150 child => $STATUSBOX, 1220 child => $STATUSBOX,
1151 )->show; 1221 )->show;
1152 1222
1153 CFClient::UI::FancyFrame->new ( 1223 CFClient::UI::FancyFrame->new (
1224 title => "Map",
1225 name => "mapmap",
1154 x => 0, 1226 x => 0,
1155 y => $FONTSIZE + 8, 1227 y => $FONTSIZE + 8,
1156 border_bg => [1, 1, 1, 192/255], 1228 border_bg => [1, 1, 1, 192/255],
1157 bg => [1, 1, 1, 0], 1229 bg => [1, 1, 1, 0],
1158 child => ($MAPMAP = new CFClient::MapWidget::MapMap 1230 child => ($MAPMAP = new CFClient::MapWidget::MapMap
1183 can_hover => 1, 1255 can_hover => 1,
1184 can_events => 1, 1256 can_events => 1,
1185 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.", 1257 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.",
1186 ; 1258 ;
1187 1259
1260 $SETUP_DIALOG = new CFClient::UI::FancyFrame
1261 title => "Setup",
1262 name => "setup_dialog",
1263 x => 'center',
1264 y => 'center',
1265 z => 2,
1266 force_w => $::WIDTH * 0.6,
1267 force_h => $::HEIGHT * 0.6,
1268 ;
1269
1270 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1271 filter => new CFClient::UI::ScrolledWindow xxx => 1, expand => 1, scroll_y => 1);
1272
1273 $SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup,
1274 "Configure the server to play on, your username, password and other server-related options.");
1275 $SETUP_NOTEBOOK->add (Pickup => autopickup_setup,
1276 "Configure autopicking stetings, i.e. which items you will pick up automatically when walking over them.");
1277 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1278 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1279 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1280 "Configure the use of audio, sound effects and background music.");
1281 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1282 "Lets you define, edit and delete bindings."
1283 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor "
1284 . "with nothing set and the recording started. After doing the actions you "
1285 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1286 . "After pressing the combo the binding will be saved automatically and the "
1287 . "binding editor closes");
1288 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1289 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1290
1188 $BUTTONBAR = new CFClient::UI::HBox x => 0, y => 0; 1291 $BUTTONBAR = new CFClient::UI::HBox x => 0, y => 0;
1189 1292
1190 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Client Setup", other => client_setup, 1293 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1191 tooltip => "Toggles a dialog where you can configure various aspects of the client, such as graphics mode, performance, and audio options."); 1294 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1192 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Server Setup", other => server_setup, 1295
1193 tooltip => "Toggles a dialog where you can configure the server to play on, your username, password and other server-related options.");
1194 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window, 1296 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window,
1195 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 1297 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
1196 1298
1197 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 1299 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
1198 1300
1199 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window, 1301 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window,
1200 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times."); 1302 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times.");
1201 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window, 1303 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window,
1202 tooltip => "Toggles the inventory window, where you can manage your loot (or treaures :)." 1304 tooltip => "Toggles the inventory window, where you can manage your loot (or treasures :). "
1203 ."You can also hit the Tab-key to show/hide the Inventory."); 1305 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory.");
1204 1306
1205 $BUTTONBAR->add (new CFClient::UI::Button 1307 $BUTTONBAR->add (new CFClient::UI::Button
1206 text => "Save Config", 1308 text => "Save Config",
1207 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1309 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1208 on_activate => sub { 1310 on_activate => sub {
1212 }, 1314 },
1213 ); 1315 );
1214 1316
1215 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, 1317 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window,
1216 tooltip => "View Documentation"); 1318 tooltip => "View Documentation");
1217
1218 $BUTTONBAR->add (new CFClient::UI::Flopper
1219 text => "Bindings",
1220 other => make_binding_window,
1221 tooltip =>
1222 "Lets you define, edit and delete bindings."
1223 ."There is a shortcut for making bindings: LCTRL+Insert opens the binding editor "
1224 ."with nothing set and the recording started. After doing the actions you "
1225 ."want to record press Insert and you will be asked to press a key-combo."
1226 ."After pressing the combo the binding will be saved automatically and the "
1227 ."binding editor closes");
1228
1229 $BUTTONBAR->add (new CFClient::UI::Flopper
1230 text => "Spells",
1231 other => make_spell_list,
1232 tooltip => "The spell list");
1233 1319
1234 $BUTTONBAR->add (new CFClient::UI::Button 1320 $BUTTONBAR->add (new CFClient::UI::Button
1235 text => "Quit", 1321 text => "Quit",
1236 tooltip => "Terminates the program", 1322 tooltip => "Terminates the program",
1237 on_activate => sub { 1323 on_activate => sub {
1242 } 1328 }
1243 }, 1329 },
1244 ); 1330 );
1245 1331
1246 $BUTTONBAR->show; 1332 $BUTTONBAR->show;
1247 $SERVER_SETUP->show; 1333 $SETUP_DIALOG->show;
1334 }
1248 1335
1249 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1336 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1250 }
1251} 1337}
1252 1338
1253sub video_shutdown { 1339sub video_shutdown {
1254 undef $SDL_ACTIVE; 1340 undef $SDL_ACTIVE;
1255} 1341}
1387}; 1473};
1388 1474
1389 CFClient::SDL_GL_SwapBuffers; 1475 CFClient::SDL_GL_SwapBuffers;
1390} 1476}
1391 1477
1392my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub { 1478my $refresh_watcher = Event->timer (after => 0, hard => 0, interval => 1 / $MAX_FPS, cb => sub {
1393 $NOW = time; 1479 $NOW = time;
1394 1480
1395 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 1481 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
1396 for CFClient::SDL_PollEvent; 1482 for CFClient::SDL_PollEvent;
1397 1483
1464############################################################################# 1550#############################################################################
1465 1551
1466$SIG{INT} = $SIG{TERM} = sub { exit }; 1552$SIG{INT} = $SIG{TERM} = sub { exit };
1467 1553
1468{ 1554{
1469 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] if defined $^S && !$^S }; 1555 local $SIG{__DIE__} = sub {
1556 return unless defined $^S && !$^S;
1557 Carp::confess $_[1];#d#TODO: remove when stable
1558 CFClient::fatal $_[0];
1559 };
1470 1560
1471 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1561 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1472 CFClient::UI::set_layout ($::CFG->{layout}); 1562 CFClient::UI::set_layout ($::CFG->{layout});
1473 1563
1474 my %DEF_CFG = ( 1564 my %DEF_CFG = (

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines