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.64 by root, Wed Jun 7 06:28:30 2006 UTC vs.
Revision 1.80 by root, Mon Jun 26 21:59:04 2006 UTC

36 36
37use CFClient; 37use CFClient;
38use CFClient::OpenGL (); 38use CFClient::OpenGL ();
39use CFClient::Protocol; 39use CFClient::Protocol;
40use CFClient::UI; 40use CFClient::UI;
41use CFClient::BindingEditor;
41use CFClient::MapWidget; 42use CFClient::MapWidget;
42 43
43$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 44$SIG{QUIT} = sub { Carp::cluck "QUIT" };
44 45
45$Event::DIED = sub { 46$Event::DIED = sub {
84our $CONSOLE; 85our $CONSOLE;
85our $METASERVER; 86our $METASERVER;
86our $LOGIN_BUTTON; 87our $LOGIN_BUTTON;
87our $QUIT_DIALOG; 88our $QUIT_DIALOG;
88our $HOST_ENTRY; 89our $HOST_ENTRY;
90our $SERVER_INFO;
89 91
90our $SETUP_DIALOG; 92our $SETUP_DIALOG;
91our $SETUP_NOTEBOOK; 93our $SETUP_NOTEBOOK;
92our $SETUP_SERVER; 94our $SETUP_SERVER;
93our $SETUP_KEYBOARD; 95our $SETUP_KEYBOARD;
114our $INV; 116our $INV;
115our $INVR; 117our $INVR;
116our $INV_RIGHT_HB; 118our $INV_RIGHT_HB;
117 119
118our $BIND_EDITOR; 120our $BIND_EDITOR;
121our $BIND_UPD_CB;
119 122
120our $PICKUP_CFG; 123our $PICKUP_CFG;
121 124
122sub status { 125sub status {
123 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 126 $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
154 $hbox->add (new CFClient::UI::Button 157 $hbox->add (new CFClient::UI::Button
155 text => "No", 158 text => "No",
156 on_activate => sub { 159 on_activate => sub {
157 $conn->send ("reply n"); 160 $conn->send ("reply n");
158 $dialog->destroy; 161 $dialog->destroy;
162 0
159 } 163 }
160 ); 164 );
161 $hbox->add (new CFClient::UI::Button 165 $hbox->add (new CFClient::UI::Button
162 text => "Yes", 166 text => "Yes",
163 on_activate => sub { 167 on_activate => sub {
164 $conn->send ("reply y"); 168 $conn->send ("reply y");
165 destroy_query_dialog $conn; 169 destroy_query_dialog $conn;
170 0
166 }, 171 },
167 ); 172 );
168 173
169 $dialog->focus_in; 174 $dialog->grab_focus;
170 175
171 } elsif ($flags & CS_QUERY_SINGLECHAR) { 176 } elsif ($flags & CS_QUERY_SINGLECHAR) {
172 $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)"; 177 $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)";
173 178
174 if ($prompt =~ /Now choose a character|Press any key for the next race/i) { 179 if ($prompt =~ /Now choose a character|Press any key for the next race/i) {
184 $table->add (0, 0, new CFClient::UI::Button 189 $table->add (0, 0, new CFClient::UI::Button
185 text => "Next Race", 190 text => "Next Race",
186 on_activate => sub { 191 on_activate => sub {
187 $conn->send ("reply n"); 192 $conn->send ("reply n");
188 destroy_query_dialog $conn; 193 destroy_query_dialog $conn;
194 0
189 }, 195 },
190 ); 196 );
191 $table->add (2, 0, new CFClient::UI::Button 197 $table->add (2, 0, new CFClient::UI::Button
192 text => "Accept", 198 text => "Accept",
193 on_activate => sub { 199 on_activate => sub {
194 $conn->send ("reply d"); 200 $conn->send ("reply d");
195 destroy_query_dialog $conn; 201 destroy_query_dialog $conn;
202 0
196 }, 203 },
197 ); 204 );
198 205
199 unshift @dialog, new CFClient::UI::Label 206 unshift @dialog, new CFClient::UI::Label
200 max_w => $::WIDTH * 0.4, 207 max_w => $::WIDTH * 0.4,
230 $table->add (0, 0, new CFClient::UI::Button 237 $table->add (0, 0, new CFClient::UI::Button
231 text => "Roll Again", 238 text => "Roll Again",
232 on_activate => sub { 239 on_activate => sub {
233 $conn->send ("reply y"); 240 $conn->send ("reply y");
234 destroy_query_dialog $conn; 241 destroy_query_dialog $conn;
242 0
235 }, 243 },
236 ); 244 );
237 245
238 # center: swap stats 246 # center: swap stats
239 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox 247 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
253 text => "Swap Stats", 261 text => "Swap Stats",
254 on_activate => sub { 262 on_activate => sub {
255 $conn->{stat_change_with} = $sw2->{value}; 263 $conn->{stat_change_with} = $sw2->{value};
256 $conn->send ("reply $sw1->{value}"); 264 $conn->send ("reply $sw1->{value}");
257 destroy_query_dialog $conn; 265 destroy_query_dialog $conn;
266 0
258 }, 267 },
259 ); 268 );
260 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]); 269 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]);
261 270
262 # right: accept 271 # right: accept
264 text => "Accept", 273 text => "Accept",
265 on_activate => sub { 274 on_activate => sub {
266 $conn->send ("reply n"); 275 $conn->send ("reply n");
267 $STATS_WINDOW->hide; 276 $STATS_WINDOW->hide;
268 destroy_query_dialog $conn; 277 destroy_query_dialog $conn;
278 0
269 }, 279 },
270 ); 280 );
271 281
272 unshift @dialog, new CFClient::UI::Label 282 unshift @dialog, new CFClient::UI::Label
273 max_w => $::WIDTH * 0.4, 283 max_w => $::WIDTH * 0.4,
283 293
284 push @dialog, my $entry = new CFClient::UI::Entry 294 push @dialog, my $entry = new CFClient::UI::Entry
285 on_changed => sub { 295 on_changed => sub {
286 $conn->send ("reply $_[1]"); 296 $conn->send ("reply $_[1]");
287 destroy_query_dialog $conn; 297 destroy_query_dialog $conn;
298 0
288 }, 299 },
289 ; 300 ;
290 301
291 $entry->focus_in; 302 $entry->grab_focus;
292 303
293 } else { 304 } else {
294 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)"; 305 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)";
295 306
296 push @dialog, my $entry = new CFClient::UI::Entry 307 push @dialog, my $entry = new CFClient::UI::Entry
297 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (), 308 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
298 on_activate => sub { 309 on_activate => sub {
299 $conn->send ("reply $_[1]"); 310 $conn->send ("reply $_[1]");
300 destroy_query_dialog $conn; 311 destroy_query_dialog $conn;
312 0
301 }, 313 },
302 ; 314 ;
303 315
304 $entry->focus_in; 316 $entry->grab_focus;
305 } 317 }
306 318
307 $vbox->add (@dialog); 319 $vbox->add (@dialog);
308 $dialog->show; 320 $dialog->show;
309} 321}
314 $LOGIN_BUTTON->set_text ("Logout"); 326 $LOGIN_BUTTON->set_text ("Logout");
315 $SETUP_DIALOG->hide; 327 $SETUP_DIALOG->hide;
316 328
317 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 329 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
318 330
319 my ($host, $port) = split /:/, $CFG->{host}; 331 my ($host, $port) = split /:/, $CFG->{profile}{default}{host};
320 332
321 $MAP = new CFClient::Map $mapsize, $mapsize; 333 $MAP = new CFClient::Map $mapsize, $mapsize;
322 334
323 $CONN = eval { 335 $CONN = eval {
324 new CFClient::Protocol 336 new CFClient::Protocol
325 host => $host, 337 host => $host,
326 port => $port || 13327, 338 port => $port || 13327,
327 user => $CFG->{user}, 339 user => $CFG->{profile}{default}{user},
328 pass => $CFG->{password}, 340 pass => $CFG->{profile}{default}{password},
329 mapw => $mapsize, 341 mapw => $mapsize,
330 maph => $mapsize, 342 maph => $mapsize,
331 343
332 map_widget => $MAPWIDGET, 344 map_widget => $MAPWIDGET,
333 logview => $LOGVIEW, 345 logview => $LOGVIEW,
362sub stop_game { 374sub stop_game {
363 $LOGIN_BUTTON->set_text ("Login"); 375 $LOGIN_BUTTON->set_text ("Login");
364 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER); 376 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
365 $SETUP_DIALOG->show; 377 $SETUP_DIALOG->show;
366 $INV_WINDOW->hide; 378 $INV_WINDOW->hide;
379 $SETUP_SPELLS->clear_spells;
367 380
368 return unless $CONN; 381 return unless $CONN;
369 382
370 status "connection closed"; 383 status "connection closed";
371 384
372 destroy_query_dialog $CONN; 385 destroy_query_dialog $CONN;
373 $CONN->destroy; 386 $CONN->destroy;
374 $CONN = 0; # false, does not autovivify 387 $CONN = 0; # false, does not autovivify
388
389 undef $MAP;
375} 390}
376 391
377sub graphics_setup { 392sub graphics_setup {
378 my $vbox = new CFClient::UI::VBox; 393 my $vbox = new CFClient::UI::VBox;
379 394
397 412
398 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen"); 413 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen");
399 $table->add (1, $row++, new CFClient::UI::CheckBox 414 $table->add (1, $row++, new CFClient::UI::CheckBox
400 state => $CFG->{fullscreen}, 415 state => $CFG->{fullscreen},
401 tooltip => "Bring the client into fullscreen mode.", 416 tooltip => "Bring the client into fullscreen mode.",
402 on_changed => sub { 417 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
403 my ($self, $value) = @_;
404 $CFG->{fullscreen} = $value;
405 }
406 ); 418 );
407 419
408 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 420 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly");
409 $table->add (1, $row++, new CFClient::UI::CheckBox 421 $table->add (1, $row++, new CFClient::UI::CheckBox
410 state => $CFG->{fast}, 422 state => $CFG->{fast},
411 tooltip => "Lower the visual quality considerably to speed up rendering.", 423 tooltip => "Lower the visual quality considerably to speed up rendering.",
412 on_changed => sub { 424 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
413 my ($self, $value) = @_;
414 $CFG->{fast} = $value;
415 }
416 ); 425 );
417 426
418 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); 427 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale");
419 $table->add (1, $row++, new CFClient::UI::Slider 428 $table->add (1, $row++, new CFClient::UI::Slider
420 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 429 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
421 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 430 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
422 on_changed => sub { 431 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
423 my ($self, $value) = @_;
424 $CFG->{map_scale} = 2 ** $value;
425 }
426 ); 432 );
427 433
428 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War"); 434 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War");
429 $table->add (1, $row++, new CFClient::UI::CheckBox 435 $table->add (1, $row++, new CFClient::UI::CheckBox
430 state => $CFG->{fow_enable}, 436 state => $CFG->{fow_enable},
431 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 437 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
432 on_changed => sub { 438 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
433 my ($self, $value) = @_;
434 $CFG->{fow_enable} = $value;
435 }
436 ); 439 );
437 440
438 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity"); 441 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity");
439 $table->add (1, $row++, new CFClient::UI::Slider 442 $table->add (1, $row++, new CFClient::UI::Slider
440 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 443 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
441 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", 444 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.",
442 on_changed => sub { 445 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 }
443 my ($self, $value) = @_;
444 $CFG->{fow_intensity} = $value;
445 }
446 ); 446 );
447 447
448 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth"); 448 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth");
449 $table->add (1, $row++, new CFClient::UI::CheckBox 449 $table->add (1, $row++, new CFClient::UI::CheckBox
450 state => $CFG->{fow_smooth}, 450 state => $CFG->{fow_smooth},
451 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.", 451 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.",
452 on_changed => sub { 452 on_changed => sub {
453 my ($self, $value) = @_; 453 my ($self, $value) = @_;
454 $CFG->{fow_smooth} = $value; 454 $CFG->{fow_smooth} = $value;
455 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2; 455 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2;
456 0
456 } 457 }
457 ); 458 );
458 459
459 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 460 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize");
460 $table->add (1, $row++, new CFClient::UI::Slider 461 $table->add (1, $row++, new CFClient::UI::Slider
461 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 462 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
462 tooltip => "The base font size used by most GUI elements that do not have their own setting.", 463 tooltip => "The base font size used by most GUI elements that do not have their own setting.",
463 on_changed => sub { $CFG->{gui_fontsize} = $_[1] }, 464 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 },
464 ); 465 );
465 466
466 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 467 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize");
467 $table->add (1, $row++, new CFClient::UI::Slider 468 $table->add (1, $row++, new CFClient::UI::Slider
468 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 469 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
469 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.", 470 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.",
470 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) }, 471 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
471 ); 472 );
472 473
473 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); 474 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
474 475
475 $table->add (1, $row++, new CFClient::UI::Slider 476 $table->add (1, $row++, new CFClient::UI::Slider
476 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1], 477 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1],
477 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.", 478 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.",
478 on_changed => sub { 479 on_changed => sub {
479 $CFG->{stat_fontsize} = $_[1]; 480 $CFG->{stat_fontsize} = $_[1];
480 &set_stats_window_fontsize; 481 &set_stats_window_fontsize;
482 0
481 } 483 }
482 ); 484 );
483 485
484 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 486 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
485 $table->add (1, $row++, new CFClient::UI::Slider 487 $table->add (1, $row++, new CFClient::UI::Slider
486 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 488 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
487 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", 489 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
488 on_changed => sub { 490 on_changed => sub {
489 $CFG->{gauge_fontsize} = $_[1]; 491 $CFG->{gauge_fontsize} = $_[1];
490 &set_gauge_window_fontsize; 492 &set_gauge_window_fontsize;
493 0
491 } 494 }
492 ); 495 );
493 496
494 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size"); 497 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size");
495 $table->add (1, $row++, new CFClient::UI::Slider 498 $table->add (1, $row++, new CFClient::UI::Slider
496 range => [$CFG->{gauge_size}, 0.2, 0.8], 499 range => [$CFG->{gauge_size}, 0.2, 0.8],
497 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", 500 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.",
498 on_changed => sub { 501 on_changed => sub {
499 $CFG->{gauge_size} = $_[1]; 502 $CFG->{gauge_size} = $_[1];
500 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 503 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
504 0
501 } 505 }
502 ); 506 );
503 507
504 $table->add (1, $row++, new CFClient::UI::Button 508 $table->add (1, $row++, new CFClient::UI::Button
505 expand => 1, align => 0, text => "Apply", 509 expand => 1, align => 0, text => "Apply",
506 tooltip => "Apply the video settings", 510 tooltip => "Apply the video settings",
507 on_activate => sub { 511 on_activate => sub {
508 video_shutdown (); 512 video_shutdown ();
509 video_init (); 513 video_init ();
514 0
510 } 515 }
511 ); 516 );
512 517
513 $vbox 518 $vbox
514} 519}
522 527
523 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable"); 528 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable");
524 $table->add (1, $row++, new CFClient::UI::CheckBox 529 $table->add (1, $row++, new CFClient::UI::CheckBox
525 state => $CFG->{audio_enable}, 530 state => $CFG->{audio_enable},
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.", 531 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.",
527 on_changed => sub { 532 on_changed => sub { $CFG->{audio_enable} = $_[1]; 0 }
528 $CFG->{audio_enable} = $_[1];
529 }
530 ); 533 );
531# $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Effects Volume"); 534# $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Effects Volume");
532# $table->add (1, 8, new CFClient::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub { 535# $table->add (1, 8, new CFClient::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
533# $CFG->{effects_volume} = $_[1]; 536# $CFG->{effects_volume} = $_[1];
534# }); 537# });
535 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Background Music"); 538 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Background Music");
536 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox); 539 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox);
537 $hbox->add (new CFClient::UI::CheckBox 540 $hbox->add (new CFClient::UI::CheckBox
538 expand => 1, state => $CFG->{bgm_enable}, 541 expand => 1, state => $CFG->{bgm_enable},
539 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 542 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
540 on_changed => sub { 543 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 }
541 $CFG->{bgm_enable} = $_[1];
542 }
543 ); 544 );
544 $hbox->add (new CFClient::UI::Slider 545 $hbox->add (new CFClient::UI::Slider
545 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 546 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
546 tooltip => "The volume of the background music. Changes are instant.", 547 tooltip => "The volume of the background music. Changes are instant.",
547 on_changed => sub { 548 on_changed => sub { $CFG->{bgm_volume} = $_[1]; CFClient::MixMusic::volume $_[1] * 128; 0 }
548 $CFG->{bgm_volume} = $_[1];
549 CFClient::MixMusic::volume $_[1] * 128;
550 }
551 ); 549 );
552 550
553 $table->add (1, $row++, new CFClient::UI::Button 551 $table->add (1, $row++, new CFClient::UI::Button
554 expand => 1, align => 0, text => "Apply", 552 expand => 1, align => 0, text => "Apply",
555 tooltip => "Apply the audio settings", 553 tooltip => "Apply the audio settings",
556 on_activate => sub { 554 on_activate => sub {
557 audio_shutdown (); 555 audio_shutdown ();
558 audio_init (); 556 audio_init ();
557 0
559 } 558 }
560 ); 559 );
561 560
562 $vbox 561 $vbox
563} 562}
625 &set_gauge_window_fontsize; 624 &set_gauge_window_fontsize;
626 625
627 $win 626 $win
628} 627}
629 628
629sub debug_setup {
630 my $table = new CFClient::UI::Table;
631
632 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders");
633 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 });
634 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info");
635 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
636 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS");
637 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
638 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips");
639 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
640
641 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
642
643 for my $x (0..2) {
644 for my $y (0 .. 2) {
645 $table->add ($x + 3, $y,
646 new CFClient::UI::Entry
647 text => $default_smooth[$x * 3 + $y],
648 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 },
649 );
650 }
651 }
652
653
654 $table
655}
630 656
631sub stats_window { 657sub stats_window {
632 my $tgw = new CFClient::UI::FancyFrame 658 my $tgw = new CFClient::UI::FancyFrame
633 y => $HEIGHT * (2/8), 659 y => $HEIGHT * (2/8),
634 x => "max", 660 x => "max",
635 title => "Stats", 661 title => "Stats",
636 name => "stats_window"; 662 name => "stats_window",
663 has_close_button => 1;
637 664
638 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox); 665 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox);
639 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 666 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
640 can_hover => 1, can_events => 1, 667 can_hover => 1, can_events => 1,
641 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 668 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
723 ); 750 );
724 $tbl2->add ($col + 1, $row, new CFClient::UI::Image 751 $tbl2->add ($col + 1, $row, new CFClient::UI::Image
725 font => $FONT_FIXED, 752 font => $FONT_FIXED,
726 can_hover => 1, 753 can_hover => 1,
727 can_events => 1, 754 can_events => 1,
728 image => "ui/resist/resist_$_.png", 755 path => "ui/resist/resist_$_.png",
729 tooltip => $resist_names{$_}, 756 tooltip => $resist_names{$_},
730 ); 757 );
731 758
732 $row++; 759 $row++;
733 if ($row % 6 == 0) { 760 if ($row % 6 == 0) {
787 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED}); 814 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED});
788 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP}); 815 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP});
789 816
790 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000); 817 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000);
791 818
792 # TODO: replace by CS_STAT_RES_xxx constants
793 my %tbl = ( 819 my %tbl = (
794 phys => 100, 820 phys => CS_STAT_RES_PHYS,
795 magic => 101, 821 magic => CS_STAT_RES_MAG,
796 fire => 102, 822 fire => CS_STAT_RES_FIRE,
797 elec => 103, 823 elec => CS_STAT_RES_ELEC,
798 cold => 104, 824 cold => CS_STAT_RES_COLD,
799 conf => 105, 825 conf => CS_STAT_RES_CONF,
800 acid => 106, 826 acid => CS_STAT_RES_ACID,
801 drain => 107, 827 drain => CS_STAT_RES_DRAIN,
802 ghit => 108, 828 ghit => CS_STAT_RES_GHOSTHIT,
803 pois => 109, 829 pois => CS_STAT_RES_POISON,
804 slow => 110, 830 slow => CS_STAT_RES_SLOW,
805 para => 111, 831 para => CS_STAT_RES_PARA,
806 tund => 112, 832 tund => CS_STAT_TURN_UNDEAD,
807 fear => 113, 833 fear => CS_STAT_RES_FEAR,
808 depl => 113, 834 depl => CS_STAT_RES_DEPLETE,
809 deat => 115, 835 deat => CS_STAT_RES_DEATH,
810 holyw => 116, 836 holyw => CS_STAT_RES_HOLYWORD,
811 blind => 117, 837 blind => CS_STAT_RES_BLIND,
812 ); 838 );
813 839
814 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}) 840 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
815 for keys %tbl; 841 for keys %tbl;
816} 842}
890 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [ 916 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [
891 (new CFClient::UI::Button 917 (new CFClient::UI::Button
892 text => "Use", 918 text => "Use",
893 tooltip => "Put this server into the <b>Host:Port</b> field", 919 tooltip => "Put this server into the <b>Host:Port</b> field",
894 on_activate => sub { 920 on_activate => sub {
895 $HOST_ENTRY->set_text ($CFG->{host} = $host); 921 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host);
896 $METASERVER->hide; 922 $METASERVER->hide;
923 0
897 }, 924 },
898 ), 925 ),
899 (new CFClient::UI::Empty expand => 1), 926 (new CFClient::UI::Empty expand => 1),
900 ]); 927 ]);
901 928
920 x => 'center', 947 x => 'center',
921 y => 'center', 948 y => 'center',
922 z => 3, 949 z => 3,
923 force_h => $::HEIGHT * 0.4, 950 force_h => $::HEIGHT * 0.4,
924 child => (my $vbox = new CFClient::UI::VBox), 951 child => (my $vbox = new CFClient::UI::VBox),
952 has_close_button => 1,
925 on_visibility_change => sub { 953 on_visibility_change => sub {
926 update_metaserver if $_[1]; 954 update_metaserver if $_[1];
955 0
927 }, 956 },
928 ; 957 ;
929 958
930 $dialog->{table} = new CFClient::UI::Table; 959 $dialog->{table} = new CFClient::UI::Table;
931 960
944 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 973 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
945 974
946 $vbox->add ( 975 $vbox->add (
947 $HOST_ENTRY = new CFClient::UI::Entry 976 $HOST_ENTRY = new CFClient::UI::Entry
948 expand => 1, 977 expand => 1,
949 text => $CFG->{host}, 978 text => $CFG->{profile}{default}{host},
950 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", 979 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to",
951 on_changed => sub { 980 on_changed => sub {
952 my ($self, $value) = @_; 981 my ($self, $value) = @_;
953 $CFG->{host} = $value; 982 $CFG->{profile}{default}{host} = $value;
983 0
954 } 984 }
955 ); 985 );
956 986
957 $METASERVER = metaserver_dialog; 987 $METASERVER = metaserver_dialog;
958 988
959 $vbox->add (new CFClient::UI::Button 989 $vbox->add (new CFClient::UI::Button
960 expand => 1, 990 expand => 1,
961 text => "Server List", 991 text => "Server List",
962 other => $METASERVER, 992 other => $METASERVER,
963 tooltip => "Show a list of available crossfire servers", 993 tooltip => "Show a list of available crossfire servers",
964 on_activate => sub { $METASERVER->toggle_visibility }, 994 on_activate => sub { $METASERVER->toggle_visibility; 0 },
965 on_visibility_change => sub { $METASERVER->hide unless $_[1] }, 995 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 0 },
966 ); 996 );
967 } 997 }
968 998
969 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); 999 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username");
970 $table->add (1, 4, new CFClient::UI::Entry 1000 $table->add (1, 4, new CFClient::UI::Entry
971 text => $CFG->{user}, 1001 text => $CFG->{profile}{default}{user},
972 tooltip => "The name of your character on the server", 1002 tooltip => "The name of your character on the server",
973 on_changed => sub { 1003 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value }
974 my ($self, $value) = @_;
975 $CFG->{user} = $value;
976 }
977 ); 1004 );
978 1005
979 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); 1006 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password");
980 $table->add (1, 5, new CFClient::UI::Entry 1007 $table->add (1, 5, new CFClient::UI::Entry
981 text => $CFG->{password}, 1008 text => $CFG->{profile}{default}{password},
982 hidden => 1, 1009 hidden => 1,
983 tooltip => "The password for your character", 1010 tooltip => "The password for your character",
984 on_changed => sub { 1011 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value }
985 my ($self, $value) = @_;
986 $CFG->{password} = $value;
987 }
988 ); 1012 );
989 1013
990 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); 1014 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size");
991 $table->add (1, 7, new CFClient::UI::Slider 1015 $table->add (1, 7, new CFClient::UI::Slider
992 force_w => 100, 1016 force_w => 100,
993 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1017 range => [$CFG->{mapsize}, 10, 100, 0, 1],
994 tooltip => "This is the size of the portion of the map update the server sends you. " 1018 tooltip => "This is the size of the portion of the map update the server sends you. "
995 . "If you set this to a high value you will be able to see further, " 1019 . "If you set this to a high value you will be able to see further, "
996 . "but you also increase bandwidth requirements and latency. " 1020 . "but you also increase bandwidth requirements and latency. "
997 . "This option is only used once at log-in.", 1021 . "This option is only used once at log-in.",
998 on_changed => sub { 1022 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 0 },
999 my ($self, $value) = @_;
1000
1001 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
1002 },
1003 ); 1023 );
1004 1024
1005 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch"); 1025 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch");
1006 $table->add (1, 8, new CFClient::UI::CheckBox 1026 $table->add (1, 8, new CFClient::UI::CheckBox
1007 state => $CFG->{face_prefetch}, 1027 state => $CFG->{face_prefetch},
1010 . "This might increase or create lag, but increases the chances " 1030 . "This might increase or create lag, but increases the chances "
1011 . "of faces being ready for display when you encounter them. " 1031 . "of faces being ready for display when you encounter them. "
1012 . "It also uses up server bandwidth on every connect, " 1032 . "It also uses up server bandwidth on every connect, "
1013 . "so only set it if you really need to prefetch images. " 1033 . "so only set it if you really need to prefetch images. "
1014 . "This option can be set and unset any time.", 1034 . "This option can be set and unset any time.",
1015 on_changed => sub { $CFG->{face_prefetch} = $_[1] }, 1035 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 },
1016 ); 1036 );
1017 1037
1018 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count"); 1038 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count");
1019 $table->add (1, 9, new CFClient::UI::Entry 1039 $table->add (1, 9, new CFClient::UI::Entry
1020 text => $CFG->{output_count}, 1040 text => $CFG->{output_count},
1021 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1041 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1022 on_changed => sub { $CFG->{output_count} = $_[1] }, 1042 on_changed => sub { $CFG->{output_count} = $_[1]; 0 },
1023 ); 1043 );
1024 1044
1025 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync"); 1045 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync");
1026 $table->add (1, 10, new CFClient::UI::Entry 1046 $table->add (1, 10, new CFClient::UI::Entry
1027 text => $CFG->{output_sync}, 1047 text => $CFG->{output_sync},
1028 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1048 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1029 on_changed => sub { $CFG->{output_sync} = $_[1] }, 1049 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 },
1030 ); 1050 );
1031 1051
1032 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 1052 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
1033 expand => 1, 1053 expand => 1,
1034 align => 0, 1054 align => 0,
1035 text => "Login", 1055 text => "Login",
1036 on_activate => sub { 1056 on_activate => sub {
1037 $CONN ? stop_game 1057 $CONN ? stop_game
1038 : start_game; 1058 : start_game;
1059 0
1039 }, 1060 },
1040 ); 1061 );
1041 1062
1042 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 1063 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
1043 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry 1064 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
1046 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1067 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1047 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1068 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1048 on_changed => sub { 1069 on_changed => sub {
1049 my ($self, $value) = @_; 1070 my ($self, $value) = @_;
1050 $CFG->{say_command} = $value; 1071 $CFG->{say_command} = $value;
1072 0
1051 } 1073 }
1052 ); 1074 );
1075
1076 $vbox->add (new CFClient::UI::Label
1077 text => "Server Info",
1078 fontsize => 1.2,
1079 padding_y => 8,
1080 fg => [1, 1, 0, 1],
1081 );
1082
1083 $vbox->add ($SERVER_INFO = new CFClient::UI::Label ellipsise => 0);
1053 1084
1054 $vbox 1085 $vbox
1055} 1086}
1056 1087
1057sub message_window { 1088sub message_window {
1062 bg => [0, 0, 0, 0.75], 1093 bg => [0, 0, 0, 0.75],
1063 x => "max", 1094 x => "max",
1064 y => 0, 1095 y => 0,
1065 force_w => $::WIDTH * 0.4, 1096 force_w => $::WIDTH * 0.4,
1066 force_h => $::HEIGHT * 0.5, 1097 force_h => $::HEIGHT * 0.5,
1067 child => (my $vbox = new CFClient::UI::VBox); 1098 child => (my $vbox = new CFClient::UI::VBox),
1099 has_close_button => 1;
1068 1100
1069 $vbox->add ($LOGVIEW); 1101 $vbox->add ($LOGVIEW);
1070 1102
1071 $vbox->add (my $input = new CFClient::UI::Entry 1103 $vbox->add (my $input = new CFClient::UI::Entry
1072 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> " 1104 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> "
1080 1112
1081 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 1113 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
1082 $input->{refocus_map} = 1; 1114 $input->{refocus_map} = 1;
1083 } 1115 }
1084 delete $input->{auto_activated}; 1116 delete $input->{auto_activated};
1117
1118 0
1085 }, 1119 },
1086 on_activate => sub { 1120 on_activate => sub {
1087 my ($input, $text) = @_; 1121 my ($input, $text) = @_;
1088 $input->set_text (''); 1122 $input->set_text ('');
1089 1123
1095 } 1129 }
1096 if ($input->{refocus_map}) { 1130 if ($input->{refocus_map}) {
1097 delete $input->{refocus_map}; 1131 delete $input->{refocus_map};
1098 $MAPWIDGET->focus_in 1132 $MAPWIDGET->focus_in
1099 } 1133 }
1134
1135 0
1100 }, 1136 },
1101 on_escape => sub { 1137 on_escape => sub {
1102 $MAPWIDGET->focus_in 1138 $MAPWIDGET->grab_focus;
1139
1140 0
1103 }, 1141 },
1104 ); 1142 );
1105 1143
1106 $CONSOLE = { 1144 $CONSOLE = {
1107 window => $window, 1145 window => $window,
1129 ); 1167 );
1130 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 1168 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
1131 $hb->add (new CFClient::UI::Button 1169 $hb->add (new CFClient::UI::Button
1132 text => "Ok", 1170 text => "Ok",
1133 expand => 1, 1171 expand => 1,
1134 on_activate => sub { $QUIT_DIALOG->hide }, 1172 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1135 ); 1173 );
1136 $hb->add (new CFClient::UI::Button 1174 $hb->add (new CFClient::UI::Button
1137 text => "Quit anyway", 1175 text => "Quit anyway",
1138 expand => 1, 1176 expand => 1,
1139 on_activate => sub { exit }, 1177 on_activate => sub { exit },
1182 ["Potions" => PICKUP_POTION], 1220 ["Potions" => PICKUP_POTION],
1183 ["Magic Devices" => PICKUP_MAGIC_DEVICE], 1221 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1184 ["Ignore cursed" => PICKUP_NOT_CURSED], 1222 ["Ignore cursed" => PICKUP_NOT_CURSED],
1185 ["Jewelery" => PICKUP_JEWELS], 1223 ["Jewelery" => PICKUP_JEWELS],
1186 ], 1224 ],
1225 ["Weight/Value ratio", 2, 17]
1187 ) 1226 )
1188 { 1227 {
1189 my ($title, $x, $y, @bits) = @$_; 1228 my ($title, $x, $y, @bits) = @$_;
1190 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]); 1229 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
1191 1230
1205 $::CFG->{pickup} &= ~$mask; 1244 $::CFG->{pickup} &= ~$mask;
1206 } 1245 }
1207 1246
1208 $::CONN->send_command ("pickup $::CFG->{pickup}") 1247 $::CONN->send_command ("pickup $::CFG->{pickup}")
1209 if defined $::CONN; 1248 if defined $::CONN;
1249
1250 0
1210 }); 1251 });
1211 } 1252 }
1212 } 1253 }
1254
1255 $table->add (2, 18, new CFClient::UI::ValSlider
1256 range => [0, 0, 16, 1, 1],
1257 to_value => sub { ">= " . 5 * $_[0] },
1258 on_changed => sub {
1259 my ($slider, $value) = @_;
1260
1261 $::CFG->{pickup} &= ~0x7;
1262 $::CFG->{pickup} |= int $value
1263 if $value;
1264 1;
1265 });
1266 $table->add (3, 18, new CFClient::UI::Button
1267 text => "set",
1268 on_activate => sub {
1269 $::CONN->send_command ("pickup $::CFG->{pickup}")
1270 if defined $::CONN;
1271 0
1272 });
1213 1273
1214 $table 1274 $table
1215} 1275}
1216 1276
1217sub inventory_window { 1277sub inventory_window {
1219 x => "center", 1279 x => "center",
1220 y => "center", 1280 y => "center",
1221 force_w => $WIDTH * 9/10, 1281 force_w => $WIDTH * 9/10,
1222 force_h => $HEIGHT * 9/10, 1282 force_h => $HEIGHT * 9/10,
1223 title => "Inventory", 1283 title => "Inventory",
1284 has_close_button => 1,
1224 ; 1285 ;
1225 1286
1226 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); 1287 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
1227 1288
1228 $hb->add (my $vb1 = new CFClient::UI::VBox); 1289 $hb->add (my $vb1 = new CFClient::UI::VBox);
1243 1304
1244sub spell_setup { 1305sub spell_setup {
1245 new CFClient::UI::SpellList 1306 new CFClient::UI::SpellList
1246} 1307}
1247 1308
1309sub update_bindings {
1310 $BIND_UPD_CB->() if $BIND_UPD_CB;
1311}
1312
1248sub keyboard_setup { 1313sub keyboard_setup {
1249 my $binding_list = new CFClient::UI::VBox; 1314 my $binding_list = new CFClient::UI::VBox;
1250 1315
1251 my $refresh; 1316 my $refresh;
1252 $refresh = sub { 1317 $refresh = $BIND_UPD_CB = sub {
1253 $binding_list->clear (); 1318 $binding_list->clear ();
1254 1319
1255 for my $mod (keys %{$::CFG->{bindings}}) { 1320 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) {
1256 for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { 1321 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) {
1257 my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; 1322 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1258 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1323 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1259 1324
1260 my $lbl = join "; ", @$cmds; 1325 my $lbl = join "; ", @$cmds;
1261 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); 1326 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym);
1262 $binding_list->add (my $hb = new CFClient::UI::HBox); 1327 $binding_list->add (my $hb = new CFClient::UI::HBox);
1263 $hb->add (new CFClient::UI::Button 1328 $hb->add (new CFClient::UI::Button
1264 text => "delete", 1329 text => "delete",
1265 tooltip => "Deletes the binding", 1330 tooltip => "Deletes the binding",
1266 on_activate => sub { 1331 on_activate => sub {
1267 $binding_list->remove ($hb); 1332 $binding_list->remove ($hb);
1268 delete $::CFG->{bindings}->{$mod}->{$sym}; 1333 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1334 0
1269 }); 1335 });
1270 1336
1271 $hb->add (new CFClient::UI::Button 1337 $hb->add (new CFClient::UI::Button
1272 text => "edit", 1338 text => "edit",
1273 tooltip => "Edits the binding", 1339 tooltip => "Edits the binding",
1274 on_activate => sub { 1340 on_activate => sub {
1275 $::BIND_EDITOR->set_binding ( 1341 $::BIND_EDITOR->set_binding (
1276 $mod, $sym, $::CFG->{bindings}->{$mod}->{$sym}, 1342 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym},
1277 sub { 1343 sub {
1278 my ($nmod, $nsym, $ncmds) = @_; 1344 my ($nmod, $nsym, $ncmds) = @_;
1279 delete $::CFG->{bindings}->{$mod}->{$sym}; 1345 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1280 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1346 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1281 $refresh->(); 1347 $refresh->();
1282 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1348 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1283 $SETUP_DIALOG->show; 1349 $SETUP_DIALOG->show;
1284 }, 1350 },
1285 sub { 1351 sub {
1286 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1352 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1287 $SETUP_DIALOG->show; 1353 $SETUP_DIALOG->show;
1288 }); 1354 });
1289 $::BIND_EDITOR->show; 1355 $::BIND_EDITOR->show;
1290 $SETUP_DIALOG->hide; 1356 $SETUP_DIALOG->hide;
1357 0
1291 }); 1358 });
1292 1359
1293 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1360 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1294 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1361 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1295 } 1362 }
1296 } 1363 }
1297 }; 1364 };
1298 1365
1299 my $vb = new CFClient::UI::VBox; 1366 my $vb = new CFClient::UI::VBox;
1367 $vb->add (my $hb = new CFClient::UI::HBox);
1368 $hb->add (new CFClient::UI::Label text => "only shift-up stops fire");
1369 $hb->add (new CFClient::UI::CheckBox
1370 expand => 1,
1371 state => $CFG->{shift_fire_stop},
1372 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift",
1373 on_changed => sub {
1374 my ($cbox, $value) = @_;
1375 $CFG->{shift_fire_stop} = $value;
1376 0
1377 });
1378
1300 $vb->add ($binding_list); 1379 $vb->add ($binding_list);
1301 $vb->add (my $hb = new CFClient::UI::HBox); 1380 $vb->add (my $hb = new CFClient::UI::HBox);
1302 1381
1303 $hb->add (new CFClient::UI::Button 1382 $hb->add (new CFClient::UI::Button
1304 text => "record new", 1383 text => "record new",
1306 tooltip => "This button opens the binding editor with an empty binding.", 1385 tooltip => "This button opens the binding editor with an empty binding.",
1307 on_activate => sub { 1386 on_activate => sub {
1308 $::BIND_EDITOR->set_binding (undef, undef, [], 1387 $::BIND_EDITOR->set_binding (undef, undef, [],
1309 sub { 1388 sub {
1310 my ($mod, $sym, $cmds) = @_; 1389 my ($mod, $sym, $cmds) = @_;
1311 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1390 $::BIND_EDITOR->cfg_bind ($mod, $sym, $cmds);
1312 $refresh->(); 1391 $refresh->();
1313 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1392 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1314 $SETUP_DIALOG->show; 1393 $SETUP_DIALOG->show;
1315 }, 1394 },
1316 sub { 1395 sub {
1318 $SETUP_DIALOG->show; 1397 $SETUP_DIALOG->show;
1319 }, 1398 },
1320 ); 1399 );
1321 $SETUP_DIALOG->hide; 1400 $SETUP_DIALOG->hide;
1322 $::BIND_EDITOR->show; 1401 $::BIND_EDITOR->show;
1402 0
1323 }, 1403 },
1324 ); 1404 );
1325 1405
1326 $hb->add (new CFClient::UI::Button 1406 $hb->add (new CFClient::UI::Button
1327 text => "close", 1407 text => "close",
1328 tooltip => "Closes the binding window", 1408 tooltip => "Closes the binding window",
1329 expand => 1, 1409 expand => 1,
1330 on_activate => sub { 1410 on_activate => sub {
1331 $SETUP_DIALOG->hide; 1411 $SETUP_DIALOG->hide;
1412 0
1332 } 1413 }
1333 ); 1414 );
1334 1415
1335 $refresh->(); 1416 $refresh->();
1336 1417
1356 $buttons->add (new CFClient::UI::Label text => "Choose a document to display: "); 1437 $buttons->add (new CFClient::UI::Label text => "Choose a document to display: ");
1357 $buttons->add (my $combo = new CFClient::UI::Combobox 1438 $buttons->add (my $combo = new CFClient::UI::Combobox
1358 value => undef, 1439 value => undef,
1359 options => [ 1440 options => [
1360 [intro => "Introduction"], 1441 [intro => "Introduction"],
1361 [manual => "Manual"], 1442 [manual => "Main Manual"],
1362 [skill_help => "Skills"], 1443 [skill_help => "Skill Reference"],
1363 [command_help => "Commands"], 1444 [command_help => "Command Reference"],
1364 [dmcommand_help => "DM Commands"], 1445 [dmcommand_help => "DM Commands"],
1365 [COPYING => "License Terms"], 1446 [COPYING => "License Terms"],
1366 ], 1447 ],
1367 on_changed => sub { 1448 on_changed => sub {
1368 my ($self, $pod) = @_; 1449 my ($self, $pod) = @_;
1369 1450
1370 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", 1451 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1371 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; 1452 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1372 1453
1373 $viewer->clear; 1454 $viewer->clear;
1455
1456# $viewer->add_paragraph ([1, 1, 1, 1], ["<big>Test</big>\n\n \x{fffc} \x{fffc}\n",
1457# (new CFClient::UI::Image path => "x.png", can_hover => 1, can_events => 1),
1458# (new CFClient::UI::Label text => "üüüü", can_hover => 1, can_events => 1, tooltip => "??"),
1459# ]);#d#
1374 1460
1375 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1461 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1376 for @$pom; 1462 for @$pom;
1377 1463
1378 $viewer->set_offset (0); 1464 $viewer->set_offset (0);
1465
1466 0
1379 }, 1467 },
1380 on_visibility_change => sub { 1468 on_visibility_change => sub {
1381 my ($self, $visible) = @_; 1469 my ($self, $visible) = @_;
1382 return unless $visible; 1470 return unless $visible;
1383 return if $self->{value}; 1471 return if $self->{value};
1384 $self->set_value ("intro"); 1472 $self->set_value ("intro");
1473 0
1385 }, 1474 },
1386 ); 1475 );
1387 1476
1388 $win 1477 $win
1389} 1478}
1428 z => 100, 1517 z => 100,
1429 force_x => "max", 1518 force_x => "max",
1430 force_y => 0; 1519 force_y => 0;
1431 $DEBUG_STATUS->show; 1520 $DEBUG_STATUS->show;
1432 1521
1433 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0); 1522 $BIND_EDITOR = new CFClient::BindingEditor (x => "max", y => 0);
1434 1523
1435 $STATUSBOX = new CFClient::UI::Statusbox; 1524 $STATUSBOX = new CFClient::UI::Statusbox;
1436 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]); 1525 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1437 1526
1438 (new CFClient::UI::Frame 1527 (new CFClient::UI::Frame
1458 $MAPWIDGET->connect (activate_console => sub { 1547 $MAPWIDGET->connect (activate_console => sub {
1459 my ($mapwidget, $preset) = @_; 1548 my ($mapwidget, $preset) = @_;
1460 1549
1461 if ($CONSOLE) { 1550 if ($CONSOLE) {
1462 $CONSOLE->{input}->{auto_activated} = 1; 1551 $CONSOLE->{input}->{auto_activated} = 1;
1463 $CONSOLE->{input}->focus_in; 1552 $CONSOLE->{input}->grab_focus;
1464 1553
1465 if ($preset && $CONSOLE->{input}->get_text eq '') { 1554 if ($preset && $CONSOLE->{input}->get_text eq '') {
1466 $CONSOLE->{input}->set_text ($preset); 1555 $CONSOLE->{input}->set_text ($preset);
1467 } 1556 }
1468 } 1557 }
1469 }); 1558 });
1470 $MAPWIDGET->show; 1559 $MAPWIDGET->show;
1471 $MAPWIDGET->focus_in; 1560 $MAPWIDGET->grab_focus;
1472 1561
1473 $LOGVIEW = new CFClient::UI::TextScroller 1562 $LOGVIEW = new CFClient::UI::TextScroller
1474 expand => 1, 1563 expand => 1,
1475 font => $FONT_FIXED, 1564 font => $FONT_FIXED,
1476 fontsize => $::CFG->{log_fontsize}, 1565 fontsize => $::CFG->{log_fontsize},
1486 x => 'center', 1575 x => 'center',
1487 y => 'center', 1576 y => 'center',
1488 z => 2, 1577 z => 2,
1489 force_w => $::WIDTH * 0.6, 1578 force_w => $::WIDTH * 0.6,
1490 force_h => $::HEIGHT * 0.6, 1579 force_h => $::HEIGHT * 0.6,
1580 has_close_button => 1,
1491 ; 1581 ;
1492 1582
1493 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1, 1583 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1494 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); 1584 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1495 1585
1500 $SETUP_NOTEBOOK->add (Graphics => graphics_setup, 1590 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1501 "Configure the video mode, performance, fonts and other graphical aspects of the game."); 1591 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1502 $SETUP_NOTEBOOK->add (Audio => audio_setup, 1592 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1503 "Configure the use of audio, sound effects and background music."); 1593 "Configure the use of audio, sound effects and background music.");
1504 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, 1594 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1505 "Lets you define, edit and delete bindings." 1595 "Lets you define, edit and delete key bindings."
1506 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor " 1596 . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor "
1507 . "with nothing set and the recording started. After doing the actions you " 1597 . "with nothing set and the recording started. After doing the actions you "
1508 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " 1598 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1509 . "After pressing the combo the binding will be saved automatically and the " 1599 . "After pressing the combo the binding will be saved automatically and the "
1510 . "binding editor closes"); 1600 . "binding editor closes");
1511 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, 1601 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1512 "Displays all spells you have and lets you edit keyboard shortcuts for them."); 1602 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1603 $SETUP_NOTEBOOK->add (Debug => debug_setup,
1604 "Some debuggin' options. Do not ask.");
1513 1605
1514 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 1606 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1515 1607
1516 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 1608 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1517 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 1609 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1532 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1624 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1533 on_activate => sub { 1625 on_activate => sub {
1534 $::CFG->{layout} = CFClient::UI::get_layout; 1626 $::CFG->{layout} = CFClient::UI::get_layout;
1535 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc"; 1627 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc";
1536 status "Configuration Saved"; 1628 status "Configuration Saved";
1629 0
1537 }, 1630 },
1538 ); 1631 );
1539 1632
1540 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window, 1633 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window,
1541 tooltip => "View Documentation"); 1634 tooltip => "View Documentation");
1547 if ($CONN) { 1640 if ($CONN) {
1548 open_quit_dialog; 1641 open_quit_dialog;
1549 } else { 1642 } else {
1550 exit; 1643 exit;
1551 } 1644 }
1645 0
1552 }, 1646 },
1553 ); 1647 );
1554 1648
1555 $BUTTONBAR->show; 1649 $BUTTONBAR->show;
1556 $SETUP_DIALOG->show; 1650 $SETUP_DIALOG->show;
1558 1652
1559 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1653 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1560} 1654}
1561 1655
1562sub video_shutdown { 1656sub video_shutdown {
1657 CFClient::OpenGL::shutdown;
1658
1563 undef $SDL_ACTIVE; 1659 undef $SDL_ACTIVE;
1564} 1660}
1565 1661
1566my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d# 1662my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d#
1567my $bgmusic;#TODO#hack#d# 1663my $bgmusic;#TODO#hack#d#
1783 1879
1784 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1880 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1785 CFClient::UI::set_layout ($::CFG->{layout}); 1881 CFClient::UI::set_layout ($::CFG->{layout});
1786 1882
1787 my %DEF_CFG = ( 1883 my %DEF_CFG = (
1788 sdl_mode => 0, 1884 sdl_mode => 0,
1789 width => 640, 1885 width => 640,
1790 height => 480, 1886 height => 480,
1791 fullscreen => 0, 1887 fullscreen => 0,
1792 fast => 0, 1888 fast => 0,
1793 map_scale => 1, 1889 map_scale => 1,
1794 fow_enable => 1, 1890 fow_enable => 1,
1795 fow_intensity => 0.45, 1891 fow_intensity => 0.45,
1796 fow_smooth => 0, 1892 fow_smooth => 0,
1797 gui_fontsize => 1, 1893 gui_fontsize => 1,
1798 log_fontsize => 0.7, 1894 log_fontsize => 0.7,
1799 gauge_fontsize=> 1, 1895 gauge_fontsize => 1,
1800 gauge_size => 0.35, 1896 gauge_size => 0.35,
1801 stat_fontsize => 0.7, 1897 stat_fontsize => 0.7,
1802 mapsize => 100, 1898 mapsize => 100,
1803 host => "crossfire.schmorp.de",
1804 say_command => 'say', 1899 say_command => 'say',
1805 audio_enable => 1, 1900 audio_enable => 1,
1806 bgm_enable => 1, 1901 bgm_enable => 1,
1807 bgm_volume => 0.25, 1902 bgm_volume => 0.25,
1808 face_prefetch => 0, 1903 face_prefetch => 0,
1809 output_sync => 1, 1904 output_sync => 1,
1810 output_count => 1, 1905 output_count => 1,
1811 pickup => 0, 1906 pickup => 0,
1907 default => "profile", # default profile
1908 );
1812 ); 1909
1813
1814 while (my ($k, $v) = each %DEF_CFG) { 1910 while (my ($k, $v) = each %DEF_CFG) {
1815 $CFG->{$k} = $v unless exists $CFG->{$k}; 1911 $CFG->{$k} = $v unless exists $CFG->{$k};
1816 } 1912 }
1913
1914 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de";
1817 1915
1818 sdl_init; 1916 sdl_init;
1819 1917
1820 @SDL_MODES = reverse 1918 @SDL_MODES = reverse
1821 grep $_->[0] >= 640 && $_->[1] >= 480, 1919 grep $_->[0] >= 640 && $_->[1] >= 480,
1863 video_init; 1961 video_init;
1864 audio_init; 1962 audio_init;
1865} 1963}
1866 1964
1867Event::loop; 1965Event::loop;
1966#CFClient::SDL_Quit;
1967#CFClient::_exit 0;
1868 1968
1869END { CFClient::SDL_Quit } 1969END { CFClient::SDL_Quit }
1870 1970
1871=head1 NAME 1971=head1 NAME
1872 1972

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines