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.41 by root, Fri Jun 2 02:21:48 2006 UTC vs.
Revision 1.60 by root, Tue Jun 6 02:55:50 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;
88 89
90our $SETUP_DIALOG;
91our $SETUP_NOTEBOOK;
92our $SETUP_SERVER;
93our $SETUP_KEYBOARD;
94our $SETUP_SPELLS;
95
96our $STATS_WINDOW;
97our $MESSAGE_WINDOW;
89our $FLOORBOX; 98our $FLOORBOX;
90our $GAUGES; 99our $GAUGES;
91our $STATWIDS; 100our $STATWIDS;
92 101
93our $SDL_ACTIVE; 102our $SDL_ACTIVE;
104our $INV_WINDOW; 113our $INV_WINDOW;
105our $INV; 114our $INV;
106our $INVR; 115our $INVR;
107our $INV_RIGHT_HB; 116our $INV_RIGHT_HB;
108 117
109our $BIND_WINDOW;
110our $BIND_EDITOR; 118our $BIND_EDITOR;
111 119
112our $SPELL_LIST; 120our $PICKUP_CFG;
113 121
114sub status { 122sub status {
115 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 123 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
116} 124}
117 125
118sub debug { 126sub debug {
119 $DEBUG_STATUS->set_text ($_[0]); 127 $DEBUG_STATUS->set_text ($_[0]);
120} 128}
121 129
130sub destroy_query_dialog {
131 (delete $_[0]{query_dialog})->destroy
132 if $_[0]{query_dialog};
133}
134
135# server query dialog
136sub server_query {
137 my ($conn, $flags, $prompt) = @_;
138
139 $conn->{query_dialog} = my $dialog = new CFClient::UI::FancyFrame
140 x => "center",
141 y => "center",
142 title => "Server Query",
143 child => my $vbox = new CFClient::UI::VBox,
144 ;
145
146 my @dialog = my $label = new CFClient::UI::Label
147 max_w => $::WIDTH * 0.4,
148 ellipsise => 0,
149 text => $prompt;
150
151 if ($flags & CS_QUERY_YESNO) {
152 push @dialog, my $hbox = new CFClient::UI::HBox;
153
154 $hbox->add (new CFClient::UI::Button
155 text => "No",
156 on_activate => sub {
157 $conn->send ("reply n");
158 $dialog->destroy;
159 }
160 );
161 $hbox->add (new CFClient::UI::Button
162 text => "Yes",
163 on_activate => sub {
164 $conn->send ("reply y");
165 destroy_query_dialog $conn;
166 },
167 );
168
169 $dialog->focus_in;
170
171 } elsif ($flags & CS_QUERY_SINGLECHAR) {
172 $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)";
173
174 if ($prompt =~ /Now choose a character|Press any key for the next race/i) {
175 $MESSAGE_WINDOW->show;
176
177 unshift @dialog, new CFClient::UI::Label
178 max_w => $::WIDTH * 0.4,
179 ellipsise => 0,
180 markup => "\nOr use your keyboard:\n";
181
182 unshift @dialog, my $table = new CFClient::UI::Table;
183
184 $table->add (0, 0, new CFClient::UI::Button
185 text => "Next Race",
186 on_activate => sub {
187 $conn->send ("reply n");
188 destroy_query_dialog $conn;
189 },
190 );
191 $table->add (2, 0, new CFClient::UI::Button
192 text => "Accept",
193 on_activate => sub {
194 $conn->send ("reply d");
195 destroy_query_dialog $conn;
196 },
197 );
198
199 unshift @dialog, new CFClient::UI::Label
200 max_w => $::WIDTH * 0.4,
201 ellipsise => 0,
202 markup =>
203 "<big><b>Character Creation: Race</b></big>\n\n"
204 . "Look at the <b>Messages</b> window to see a description of this race "
205 . "(<small>or hover with your mouse over the bottommost entry in the status area in the lower left area of the screen</small>) "
206 . "and the center of the screen to see how this race looks like "
207 . "(<small>this is below this dialog window, you may need to click on the display area to make it visible</small>).\n\n"
208 . "You can look at another race, or accept this race (you will come back to this race eventually, "
209 . "so you can take your time making this important choice."
210 ;
211
212 } elsif ($prompt =~ /roll new stats/) {
213 if (my $stat = delete $conn->{stat_change_with}) {
214 $conn->send ("reply $stat");
215 destroy_query_dialog $conn;
216 return;
217 }
218
219 $STATS_WINDOW->show;
220 $MESSAGE_WINDOW->hide;
221
222 unshift @dialog, new CFClient::UI::Label
223 max_w => $::WIDTH * 0.4,
224 ellipsise => 0,
225 markup => "\nOr use your keyboard:\n";
226
227 unshift @dialog, my $table = new CFClient::UI::Table;
228
229 # left: re-roll
230 $table->add (0, 0, new CFClient::UI::Button
231 text => "Roll Again",
232 on_activate => sub {
233 $conn->send ("reply y");
234 destroy_query_dialog $conn;
235 },
236 );
237
238 # center: swap stats
239 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
240 value => $_,
241 options => [
242 [Str => 1, "Strength ($conn->{stat}{+CS_STAT_STR})"],
243 [Dex => 2, "Dexterity ($conn->{stat}{+CS_STAT_DEX})"],
244 [Con => 3, "Constitution ($conn->{stat}{+CS_STAT_CON})"],
245 [Int => 4, "Intelligence ($conn->{stat}{+CS_STAT_INT})"],
246 [Wis => 5, "Wisdom ($conn->{stat}{+CS_STAT_WIS})"],
247 [Pow => 6, "Power ($conn->{stat}{+CS_STAT_POW})"],
248 [Cha => 7, "Charisma ($conn->{stat}{+CS_STAT_CHA})"],
249 ],
250 ), 1 .. 2;
251
252 $table->add (2, 0, new CFClient::UI::Button
253 text => "Swap Stats",
254 on_activate => sub {
255 $conn->{stat_change_with} = $sw2->{value};
256 $conn->send ("reply $sw1->{value}");
257 destroy_query_dialog $conn;
258 },
259 );
260 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]);
261
262 # right: accept
263 $table->add (4, 0, new CFClient::UI::Button
264 text => "Accept",
265 on_activate => sub {
266 $conn->send ("reply n");
267 $STATS_WINDOW->hide;
268 destroy_query_dialog $conn;
269 },
270 );
271
272 unshift @dialog, new CFClient::UI::Label
273 max_w => $::WIDTH * 0.4,
274 ellipsise => 0,
275 markup =>
276 "<big><b>Character Creation: Stats</b></big>\n\n"
277 . "Look at the <b>Stats</b> window to see your basic stats "
278 . "(first column: 1 strength, 2 dexterity, 3 constitution, 4 intelligence, 5 wisdom, 6 power and 7 charisma).\n\n"
279 . "You can create another set of stats, swap two stat values with each other or accept the stats as they are now and continue. "
280 . "Race selection will influence those values later on."
281 ;
282 }
283
284 push @dialog, my $entry = new CFClient::UI::Entry
285 on_changed => sub {
286 $conn->send ("reply $_[1]");
287 destroy_query_dialog $conn;
288 },
289 ;
290
291 $entry->focus_in;
292
293 } else {
294 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)";
295
296 push @dialog, my $entry = new CFClient::UI::Entry
297 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
298 on_activate => sub {
299 $conn->send ("reply $_[1]");
300 destroy_query_dialog $conn;
301 },
302 ;
303
304 $entry->focus_in;
305 }
306
307 $vbox->add (@dialog);
308 $dialog->show;
309}
310
122sub start_game { 311sub start_game {
123 status "logging in..."; 312 status "logging in...";
124 313
125 $LOGIN_BUTTON->set_text ("Logout"); 314 $LOGIN_BUTTON->set_text ("Logout");
126 $SERVER_SETUP->hide; 315 $SETUP_DIALOG->hide;
127 316
128 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 317 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
129 318
130 my ($host, $port) = split /:/, $CFG->{host}; 319 my ($host, $port) = split /:/, $CFG->{host};
131 320
143 map_widget => $MAPWIDGET, 332 map_widget => $MAPWIDGET,
144 logview => $LOGVIEW, 333 logview => $LOGVIEW,
145 statusbox => $STATUSBOX, 334 statusbox => $STATUSBOX,
146 map => $MAP, 335 map => $MAP,
147 mapmap => $MAPMAP, 336 mapmap => $MAPMAP,
337 query => \&server_query,
148 338
149 sound_play => sub { 339 sound_play => sub {
150 my ($x, $y, $soundnum, $type) = @_; 340 my ($x, $y, $soundnum, $type) = @_;
151 341
152 $SDL_MIXER 342 $SDL_MIXER
169 } 359 }
170} 360}
171 361
172sub stop_game { 362sub stop_game {
173 $LOGIN_BUTTON->set_text ("Login"); 363 $LOGIN_BUTTON->set_text ("Login");
174 $SERVER_SETUP->show; 364 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
365 $SETUP_DIALOG->show;
175 $INV_WINDOW->hide; 366 $INV_WINDOW->hide;
176 $LOGVIEW->hide;
177 367
178 return unless $CONN; 368 return unless $CONN;
179 369
180 status "connection closed"; 370 status "connection closed";
181 371
372 destroy_query_dialog $CONN;
182 $CONN->destroy; 373 $CONN->destroy;
183 $CONN = 0; # false, does not autovivify 374 $CONN = 0; # false, does not autovivify
184} 375}
185 376
186sub client_setup { 377sub 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); 378 my $vbox = new CFClient::UI::VBox;
193 379
194 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 380 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
195 381
196 $table->add (0, 0, new CFClient::UI::Label valign => 0, align => 1, text => "Video Mode"); 382 $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); 383 $table->add (1, 0, my $hbox = new CFClient::UI::HBox);
321 on_activate => sub { 507 on_activate => sub {
322 video_shutdown (); 508 video_shutdown ();
323 video_init (); 509 video_init ();
324 } 510 }
325 ); 511 );
512
513 $vbox
514}
515
516sub audio_setup {
517 my $vbox = new CFClient::UI::VBox;
518
519 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]);
520
521 my $row = 0;
326 522
327 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable"); 523 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable");
328 $table->add (1, $row++, new CFClient::UI::CheckBox 524 $table->add (1, $row++, new CFClient::UI::CheckBox
329 state => $CFG->{audio_enable}, 525 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.", 526 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 (); 557 audio_shutdown ();
362 audio_init (); 558 audio_init ();
363 } 559 }
364 ); 560 );
365 561
366 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 562 $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} 563}
380 564
381sub set_stats_window_fontsize { 565sub set_stats_window_fontsize {
382 for (values %{$STATWIDS}) { 566 for (values %{$STATWIDS}) {
383 $_->set_fontsize ($::CFG->{stat_fontsize}); 567 $_->set_fontsize ($::CFG->{stat_fontsize});
442 626
443 $win 627 $win
444} 628}
445 629
446 630
447sub make_stats_window { 631sub stats_window {
448 my $tgw = new CFClient::UI::FancyFrame 632 my $tgw = new CFClient::UI::FancyFrame
449 y => $HEIGHT * (2/8), 633 y => $HEIGHT * (2/8),
450 x => "max", 634 x => "max",
451 title => "Stats", 635 title => "Stats",
452 name => "stats_window"; 636 name => "stats_window";
556 update_stats_window ({}); 740 update_stats_window ({});
557 741
558 $tgw 742 $tgw
559} 743}
560 744
561sub formsep { 745sub formsep($) {
562 reverse join ",", grep length, split /(...)/, reverse $_[0] * 1 746 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
563} 747}
564 748
565sub update_stats_window { 749sub update_stats_window {
566 my ($stats) = @_; 750 my ($stats) = @_;
567 751
713 my $dialog = new CFClient::UI::FancyFrame 897 my $dialog = new CFClient::UI::FancyFrame
714 title => "Server List", 898 title => "Server List",
715 name => 'metaserver_dialog', 899 name => 'metaserver_dialog',
716 x => 'center', 900 x => 'center',
717 y => 'center', 901 y => 'center',
902 z => 3,
718 child => (my $vbox = new CFClient::UI::VBox), 903 child => (my $vbox = new CFClient::UI::VBox),
719 on_visibility_change => sub { 904 on_visibility_change => sub {
720 update_metaserver if $_[1]; 905 update_metaserver if $_[1];
721 }, 906 },
722 ; 907 ;
725 910
726 $dialog 911 $dialog
727} 912}
728 913
729sub server_setup { 914sub 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), 915 my $vbox = new CFClient::UI::VBox;
736 ;
737 916
738 $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); 917 $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"); 918 $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port");
740 919
741 { 920 {
834 $CONN ? stop_game 1013 $CONN ? stop_game
835 : start_game; 1014 : start_game;
836 }, 1015 },
837 ); 1016 );
838 1017
839 $dialog 1018 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
1019 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
1020 text => $CFG->{say_command},
1021 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. "
1022 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1023 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1024 on_changed => sub {
1025 my ($self, $value) = @_;
1026 $CFG->{say_command} = $value;
1027 }
1028 );
1029
1030 $vbox
840} 1031}
841 1032
842sub message_window { 1033sub message_window {
843 my $window = new CFClient::UI::FancyFrame 1034 my $window = new CFClient::UI::FancyFrame
844 name => "message_window", 1035 name => "message_window",
845 title => "Messages", 1036 title => "Messages",
846 border_bg => [1, 1, 1, 1], 1037 border_bg => [1, 1, 1, 1],
847 bg => [0, 0, 0, 0.75], 1038 bg => [0, 0, 0, 0.75],
848 x => "max", 1039 x => "max",
849 y => 0, 1040 y => 0,
850 force_w => $::WIDTH / 3, 1041 force_w => $::WIDTH * 0.4,
851 force_h => $::HEIGHT / 5, 1042 force_h => $::HEIGHT * 0.5,
852 child => (my $vbox = new CFClient::UI::VBox); 1043 child => (my $vbox = new CFClient::UI::VBox);
853 1044
854 $vbox->add ($LOGVIEW); 1045 $vbox->add ($LOGVIEW);
855 1046
856 $vbox->add (my $input = new CFClient::UI::Entry 1047 $vbox->add (my $input = new CFClient::UI::Entry
870 }, 1061 },
871 on_activate => sub { 1062 on_activate => sub {
872 my ($input, $text) = @_; 1063 my ($input, $text) = @_;
873 $input->set_text (''); 1064 $input->set_text ('');
874 1065
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 =~ /^\/(.*)/) { 1066 if ($text =~ /^\/(.*)/) {
881 $::CONN->user_send ($1); 1067 $::CONN->user_send ($1);
882 } else { 1068 } else {
883 my $say_cmd = $::CFG->{say_command} || 'say'; 1069 my $say_cmd = $::CFG->{say_command} || 'say';
884 $::CONN->user_send ("$say_cmd $text"); 1070 $::CONN->user_send ("$say_cmd $text");
885 } 1071 }
904sub open_quit_dialog { 1090sub open_quit_dialog {
905 unless ($QUIT_DIALOG) { 1091 unless ($QUIT_DIALOG) {
906 $QUIT_DIALOG = new CFClient::UI::FancyFrame 1092 $QUIT_DIALOG = new CFClient::UI::FancyFrame
907 x => "center", 1093 x => "center",
908 y => "center", 1094 y => "center",
1095 z => 50,
909 title => "Really Quit?", 1096 title => "Really Quit?",
910 ; 1097 ;
911 1098
912 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); 1099 $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1);
913 1100
930 } 1117 }
931 1118
932 $QUIT_DIALOG->show; 1119 $QUIT_DIALOG->show;
933} 1120}
934 1121
1122sub autopickup_setup {
1123 my $table = new CFClient::UI::Table;
1124
1125 for (
1126 ["General", 0, 0,
1127 ["Enable autopickup" => PICKUP_NEWMODE],
1128 ["Inhibit autopickup" => PICKUP_INHIBIT],
1129 ["Stop before pickup" => PICKUP_STOP],
1130 ["Debug autopickup" => PICKUP_DEBUG],
1131 ],
1132 ["Weapons", 0, 6,
1133 ["All weapons" => PICKUP_ALLWEAPON],
1134 ["Missile weapons" => PICKUP_MISSILEWEAPON],
1135 ["Bows" => PICKUP_BOW],
1136 ["Arrows" => PICKUP_ARROW],
1137 ],
1138 ["Armour", 0, 12,
1139 ["Helmets" => PICKUP_HELMET],
1140 ["Shields" => PICKUP_SHIELD],
1141 ["Body Armour" => PICKUP_ARMOUR],
1142 ["Boots" => PICKUP_BOOTS],
1143 ["Gloves" => PICKUP_GLOVES],
1144 ["Cloaks" => PICKUP_CLOAK],
1145 ],
1146
1147 ["Readables", 2, 2,
1148 ["Spellbooks" => PICKUP_SPELLBOOK],
1149 ["Skillscrolls" => PICKUP_SKILLSCROLL],
1150 ["Normal Books/Scrolls" => PICKUP_READABLES],
1151 ],
1152 ["Misc", 2, 7,
1153 ["Food" => PICKUP_FOOD],
1154 ["Drinks" => PICKUP_DRINK],
1155 ["Valuables (Money, Gems)" => PICKUP_VALUABLES],
1156 ["Keys" => PICKUP_KEY],
1157 ["Magical Items" => PICKUP_MAGICAL],
1158 ["Potions" => PICKUP_POTION],
1159 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1160 ["Ignore cursed" => PICKUP_NOT_CURSED],
1161 ["Jewelery" => PICKUP_JEWELS],
1162 ],
1163 )
1164 {
1165 my ($title, $x, $y, @bits) = @$_;
1166 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
1167
1168 for (@bits) {
1169 ++$y;
1170
1171 my $mask = $_->[1];
1172 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1);
1173 $table->add ($x+1, $y, new CFClient::UI::CheckBox
1174 state => $CFG->{pickup} & $mask,
1175 on_changed => sub {
1176 my ($box, $value) = @_;
1177 if ($value) {
1178 $::CFG->{pickup} |= $mask;
1179 } else {
1180 $::CFG->{pickup} = $::CFG->{pickup} & ~$mask;
1181 }
1182 $::CONN->send (sprintf "command pickup %u", $::CFG->{pickup})
1183 if defined $::CONN;
1184 });
1185 }
1186 }
1187
1188 $table
1189}
1190
935sub make_inventory_window { 1191sub inventory_window {
936 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame 1192 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame
937 x => "center", 1193 x => "center",
938 y => "center", 1194 y => "center",
939 force_w => $WIDTH * 9/10, 1195 force_w => $WIDTH * 9/10,
940 force_h => $HEIGHT * 9/10, 1196 force_h => $HEIGHT * 9/10,
957 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); 1213 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
958 1214
959 $invwin 1215 $invwin
960} 1216}
961 1217
962sub make_spell_list { 1218sub spell_setup {
963 $SPELL_LIST = new CFClient::UI::SpellList 1219 new CFClient::UI::SpellList
964 force_w => $WIDTH * (9/10),
965 force_h => $HEIGHT * (9/10);
966 $SPELL_LIST
967} 1220}
968 1221
969sub make_binding_window { 1222sub keyboard_setup {
970 my $binding_list = new CFClient::UI::VBox; 1223 my $binding_list = new CFClient::UI::VBox;
971 1224
972 my $refresh; 1225 my $refresh;
973 $refresh = sub { 1226 $refresh = sub {
974 $binding_list->clear (); 1227 $binding_list->clear ();
998 sub { 1251 sub {
999 my ($nmod, $nsym, $ncmds) = @_; 1252 my ($nmod, $nsym, $ncmds) = @_;
1000 delete $::CFG->{bindings}->{$mod}->{$sym}; 1253 delete $::CFG->{bindings}->{$mod}->{$sym};
1001 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1254 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds;
1002 $refresh->(); 1255 $refresh->();
1256 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1003 $::BIND_WINDOW->show; 1257 $SETUP_DIALOG->show;
1004 }, 1258 },
1005 sub { 1259 sub {
1260 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1006 $::BIND_WINDOW->show; 1261 $SETUP_DIALOG->show;
1007 }); 1262 });
1008 $::BIND_EDITOR->show; 1263 $::BIND_EDITOR->show;
1009 $::BIND_WINDOW->hide; 1264 $SETUP_DIALOG->hide;
1010 }); 1265 });
1011 1266
1012 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1267 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1013 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1268 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1014 } 1269 }
1015 } 1270 }
1016 }; 1271 };
1017 1272
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); 1273 my $vb = new CFClient::UI::VBox;
1030 $vb->add ($binding_list); 1274 $vb->add ($binding_list);
1031 $vb->add (my $hb = new CFClient::UI::HBox); 1275 $vb->add (my $hb = new CFClient::UI::HBox);
1276
1032 $hb->add (new CFClient::UI::Button 1277 $hb->add (new CFClient::UI::Button
1033 text => "record new", 1278 text => "record new",
1034 expand => 1, 1279 expand => 1,
1035 tooltip => "This button opens the binding editor with an empty binding.", 1280 tooltip => "This button opens the binding editor with an empty binding.",
1036 on_activate => sub { 1281 on_activate => sub {
1037 $::BIND_EDITOR->set_binding (undef, undef, [], 1282 $::BIND_EDITOR->set_binding (undef, undef, [],
1038 sub { 1283 sub {
1039 my ($mod, $sym, $cmds) = @_; 1284 my ($mod, $sym, $cmds) = @_;
1040 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1285 $::CFG->{bindings}->{$mod}->{$sym} = $cmds;
1041 $refresh->(); 1286 $refresh->();
1042 $::BIND_WINDOW->show; 1287 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1288 $SETUP_DIALOG->show;
1043 }, 1289 },
1044 sub { 1290 sub {
1045 $::BIND_WINDOW->show; 1291 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1292 $SETUP_DIALOG->show;
1046 }); 1293 },
1047 $::BIND_WINDOW->hide; 1294 );
1295 $SETUP_DIALOG->hide;
1048 $::BIND_EDITOR->show; 1296 $::BIND_EDITOR->show;
1049 }, 1297 },
1050 ); 1298 );
1299
1051 $hb->add (new CFClient::UI::Button 1300 $hb->add (new CFClient::UI::Button
1052 text => "close", 1301 text => "close",
1053 tooltip => "Closes the binding window", 1302 tooltip => "Closes the binding window",
1054 expand => 1, 1303 expand => 1,
1055 on_activate => sub { 1304 on_activate => sub {
1056 $::BIND_WINDOW->hide; 1305 $SETUP_DIALOG->hide;
1057 } 1306 }
1058 ); 1307 );
1059 1308
1060 $refresh->(); 1309 $refresh->();
1061 $BIND_WINDOW 1310
1311 $vb
1062} 1312}
1063 1313
1064sub make_help_window { 1314sub make_help_window {
1065 my $win = new CFClient::UI::FancyFrame 1315 my $win = new CFClient::UI::FancyFrame
1066 x => 'center', 1316 x => 'center',
1067 y => 'center', 1317 y => 'center',
1318 z => 2,
1068 name => 'doc_browser', 1319 name => 'doc_browser',
1069 force_w => int $WIDTH * 7/8, 1320 force_w => int $WIDTH * 7/8,
1070 force_h => int $HEIGHT * 7/8, 1321 force_h => int $HEIGHT * 7/8,
1071 title => "Documentation"; 1322 title => "Documentation";
1072 1323
1084 my ($pod, $label) = @$_; 1335 my ($pod, $label) = @$_;
1085 1336
1086 $buttons->add (new CFClient::UI::Button 1337 $buttons->add (new CFClient::UI::Button
1087 text => $label, 1338 text => $label,
1088 on_activate => sub { 1339 on_activate => sub {
1089 my $parser = new Pod::POM; 1340 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1090 my $pom = $parser->parse_file (CFClient::find_rcfile "pod/$pod.pod"); 1341 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1091 1342
1092 $viewer->clear; 1343 $viewer->clear;
1093 1344
1094 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1345 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1095 for @{ CFClient::pod_to_pango_list $pom }; 1346 for @$pom;
1096 1347
1097 $viewer->set_offset (0); 1348 $viewer->set_offset (0);
1098 }, 1349 },
1099 ); 1350 );
1100 } 1351 }
1147 $DEBUG_STATUS->show; 1398 $DEBUG_STATUS->show;
1148 1399
1149 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0); 1400 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0);
1150 1401
1151 $STATUSBOX = new CFClient::UI::Statusbox; 1402 $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]); 1403 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1153 1404
1154 (new CFClient::UI::Frame 1405 (new CFClient::UI::Frame
1155 bg => [0, 0, 0, 0.4], 1406 bg => [0, 0, 0, 0.4],
1156 force_x => 0, 1407 force_x => 0,
1157 force_y => "max", 1408 force_y => "max",
1158 child => $STATUSBOX, 1409 child => $STATUSBOX,
1159 )->show; 1410 )->show;
1160 1411
1161 CFClient::UI::FancyFrame->new ( 1412 CFClient::UI::FancyFrame->new (
1413 title => "Map",
1414 name => "mapmap",
1162 x => 0, 1415 x => 0,
1163 y => $FONTSIZE + 8, 1416 y => $FONTSIZE + 8,
1164 border_bg => [1, 1, 1, 192/255], 1417 border_bg => [1, 1, 1, 192/255],
1165 bg => [1, 1, 1, 0], 1418 bg => [1, 1, 1, 0],
1166 child => ($MAPMAP = new CFClient::MapWidget::MapMap 1419 child => ($MAPMAP = new CFClient::MapWidget::MapMap
1191 can_hover => 1, 1444 can_hover => 1,
1192 can_events => 1, 1445 can_events => 1,
1193 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.", 1446 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.",
1194 ; 1447 ;
1195 1448
1449 $SETUP_DIALOG = new CFClient::UI::FancyFrame
1450 title => "Setup",
1451 name => "setup_dialog",
1452 x => 'center',
1453 y => 'center',
1454 z => 2,
1455 force_w => $::WIDTH * 0.6,
1456 force_h => $::HEIGHT * 0.6,
1457 ;
1458
1459 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1460 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1461
1462 $SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup,
1463 "Configure the server to play on, your username, password and other server-related options.");
1464 $SETUP_NOTEBOOK->add (Pickup => autopickup_setup,
1465 "Configure autopickup settings, i.e. which items you will pick up automatically when walking (or running) over them.");
1466 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1467 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1468 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1469 "Configure the use of audio, sound effects and background music.");
1470 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1471 "Lets you define, edit and delete bindings."
1472 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor "
1473 . "with nothing set and the recording started. After doing the actions you "
1474 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1475 . "After pressing the combo the binding will be saved automatically and the "
1476 . "binding editor closes");
1477 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1478 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1479
1196 $BUTTONBAR = new CFClient::UI::HBox x => 0, y => 0; 1480 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1197 1481
1198 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Client Setup", other => client_setup, 1482 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1199 tooltip => "Toggles a dialog where you can configure various aspects of the client, such as graphics mode, performance, and audio options."); 1483 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1200 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Server Setup", other => server_setup, 1484
1201 tooltip => "Toggles a dialog where you can configure the server to play on, your username, password and other server-related options.");
1202 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => message_window, 1485 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW = message_window,
1203 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 1486 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
1204 1487
1205 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 1488 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
1206 1489
1207 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => make_stats_window, 1490 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => $STATS_WINDOW = stats_window,
1208 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times."); 1491 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times.");
1209 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => make_inventory_window, 1492 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => inventory_window,
1210 tooltip => "Toggles the inventory window, where you can manage your loot (or treaures :)." 1493 tooltip => "Toggles the inventory window, where you can manage your loot (or treasures :). "
1211 ."You can also hit the Tab-key to show/hide the Inventory."); 1494 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory.");
1212 1495
1213 $BUTTONBAR->add (new CFClient::UI::Button 1496 $BUTTONBAR->add (new CFClient::UI::Button
1214 text => "Save Config", 1497 text => "Save Config",
1215 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1498 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1216 on_activate => sub { 1499 on_activate => sub {
1220 }, 1503 },
1221 ); 1504 );
1222 1505
1223 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, 1506 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window,
1224 tooltip => "View Documentation"); 1507 tooltip => "View Documentation");
1225
1226 $BUTTONBAR->add (new CFClient::UI::Flopper
1227 text => "Bindings",
1228 other => make_binding_window,
1229 tooltip =>
1230 "Lets you define, edit and delete bindings."
1231 ."There is a shortcut for making bindings: LCTRL+Insert opens the binding editor "
1232 ."with nothing set and the recording started. After doing the actions you "
1233 ."want to record press Insert and you will be asked to press a key-combo."
1234 ."After pressing the combo the binding will be saved automatically and the "
1235 ."binding editor closes");
1236
1237 $BUTTONBAR->add (new CFClient::UI::Flopper
1238 text => "Spells",
1239 other => make_spell_list,
1240 tooltip => "The spell list");
1241 1508
1242 $BUTTONBAR->add (new CFClient::UI::Button 1509 $BUTTONBAR->add (new CFClient::UI::Button
1243 text => "Quit", 1510 text => "Quit",
1244 tooltip => "Terminates the program", 1511 tooltip => "Terminates the program",
1245 on_activate => sub { 1512 on_activate => sub {
1250 } 1517 }
1251 }, 1518 },
1252 ); 1519 );
1253 1520
1254 $BUTTONBAR->show; 1521 $BUTTONBAR->show;
1255 $SERVER_SETUP->show; 1522 $SETUP_DIALOG->show;
1256
1257 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1258 } 1523 }
1524
1525 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1259} 1526}
1260 1527
1261sub video_shutdown { 1528sub video_shutdown {
1262 undef $SDL_ACTIVE; 1529 undef $SDL_ACTIVE;
1263} 1530}
1395}; 1662};
1396 1663
1397 CFClient::SDL_GL_SwapBuffers; 1664 CFClient::SDL_GL_SwapBuffers;
1398} 1665}
1399 1666
1400my $refresh_watcher = Event->timer (after => 0, hard => 1, interval => 1 / $MAX_FPS, cb => sub { 1667my $refresh_watcher = Event->timer (after => 0, hard => 0, interval => 1 / $MAX_FPS, cb => sub {
1401 $NOW = time; 1668 $NOW = time;
1402 1669
1403 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 1670 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
1404 for CFClient::SDL_PollEvent; 1671 for CFClient::SDL_PollEvent;
1405 1672
1472############################################################################# 1739#############################################################################
1473 1740
1474$SIG{INT} = $SIG{TERM} = sub { exit }; 1741$SIG{INT} = $SIG{TERM} = sub { exit };
1475 1742
1476{ 1743{
1477 local $SIG{__DIE__} = sub { CFClient::fatal $_[0] if defined $^S && !$^S }; 1744 local $SIG{__DIE__} = sub {
1745 return unless defined $^S && !$^S;
1746 Carp::confess $_[1];#d#TODO: remove when stable
1747 CFClient::fatal $_[0];
1748 };
1478 1749
1479 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1750 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1480 CFClient::UI::set_layout ($::CFG->{layout}); 1751 CFClient::UI::set_layout ($::CFG->{layout});
1481 1752
1482 my %DEF_CFG = ( 1753 my %DEF_CFG = (
1488 map_scale => 1, 1759 map_scale => 1,
1489 fow_enable => 1, 1760 fow_enable => 1,
1490 fow_intensity => 0.45, 1761 fow_intensity => 0.45,
1491 fow_smooth => 0, 1762 fow_smooth => 0,
1492 gui_fontsize => 1, 1763 gui_fontsize => 1,
1493 log_fontsize => 1, 1764 log_fontsize => 0.7,
1494 gauge_fontsize=> 1, 1765 gauge_fontsize=> 1,
1495 gauge_size => 0.35, 1766 gauge_size => 0.35,
1496 stat_fontsize => 1, 1767 stat_fontsize => 0.7,
1497 mapsize => 100, 1768 mapsize => 100,
1498 host => "crossfire.schmorp.de", 1769 host => "crossfire.schmorp.de",
1499 say_command => 'say', 1770 say_command => 'say',
1500 audio_enable => 1, 1771 audio_enable => 1,
1501 bgm_enable => 1, 1772 bgm_enable => 1,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines