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.65 by root, Thu Jun 8 01:51:32 2006 UTC vs.
Revision 1.76 by root, Tue Jun 20 08:49:40 2006 UTC

84our $CONSOLE; 84our $CONSOLE;
85our $METASERVER; 85our $METASERVER;
86our $LOGIN_BUTTON; 86our $LOGIN_BUTTON;
87our $QUIT_DIALOG; 87our $QUIT_DIALOG;
88our $HOST_ENTRY; 88our $HOST_ENTRY;
89our $SERVER_INFO;
89 90
90our $SETUP_DIALOG; 91our $SETUP_DIALOG;
91our $SETUP_NOTEBOOK; 92our $SETUP_NOTEBOOK;
92our $SETUP_SERVER; 93our $SETUP_SERVER;
93our $SETUP_KEYBOARD; 94our $SETUP_KEYBOARD;
154 $hbox->add (new CFClient::UI::Button 155 $hbox->add (new CFClient::UI::Button
155 text => "No", 156 text => "No",
156 on_activate => sub { 157 on_activate => sub {
157 $conn->send ("reply n"); 158 $conn->send ("reply n");
158 $dialog->destroy; 159 $dialog->destroy;
160 0
159 } 161 }
160 ); 162 );
161 $hbox->add (new CFClient::UI::Button 163 $hbox->add (new CFClient::UI::Button
162 text => "Yes", 164 text => "Yes",
163 on_activate => sub { 165 on_activate => sub {
164 $conn->send ("reply y"); 166 $conn->send ("reply y");
165 destroy_query_dialog $conn; 167 destroy_query_dialog $conn;
168 0
166 }, 169 },
167 ); 170 );
168 171
169 $dialog->focus_in; 172 $dialog->grab_focus;
170 173
171 } elsif ($flags & CS_QUERY_SINGLECHAR) { 174 } elsif ($flags & CS_QUERY_SINGLECHAR) {
172 $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)"; 175 $dialog->{tooltip} = "Press a key (click on the entry to make sure it has keyboard focus)";
173 176
174 if ($prompt =~ /Now choose a character|Press any key for the next race/i) { 177 if ($prompt =~ /Now choose a character|Press any key for the next race/i) {
184 $table->add (0, 0, new CFClient::UI::Button 187 $table->add (0, 0, new CFClient::UI::Button
185 text => "Next Race", 188 text => "Next Race",
186 on_activate => sub { 189 on_activate => sub {
187 $conn->send ("reply n"); 190 $conn->send ("reply n");
188 destroy_query_dialog $conn; 191 destroy_query_dialog $conn;
192 0
189 }, 193 },
190 ); 194 );
191 $table->add (2, 0, new CFClient::UI::Button 195 $table->add (2, 0, new CFClient::UI::Button
192 text => "Accept", 196 text => "Accept",
193 on_activate => sub { 197 on_activate => sub {
194 $conn->send ("reply d"); 198 $conn->send ("reply d");
195 destroy_query_dialog $conn; 199 destroy_query_dialog $conn;
200 0
196 }, 201 },
197 ); 202 );
198 203
199 unshift @dialog, new CFClient::UI::Label 204 unshift @dialog, new CFClient::UI::Label
200 max_w => $::WIDTH * 0.4, 205 max_w => $::WIDTH * 0.4,
230 $table->add (0, 0, new CFClient::UI::Button 235 $table->add (0, 0, new CFClient::UI::Button
231 text => "Roll Again", 236 text => "Roll Again",
232 on_activate => sub { 237 on_activate => sub {
233 $conn->send ("reply y"); 238 $conn->send ("reply y");
234 destroy_query_dialog $conn; 239 destroy_query_dialog $conn;
240 0
235 }, 241 },
236 ); 242 );
237 243
238 # center: swap stats 244 # center: swap stats
239 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox 245 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
253 text => "Swap Stats", 259 text => "Swap Stats",
254 on_activate => sub { 260 on_activate => sub {
255 $conn->{stat_change_with} = $sw2->{value}; 261 $conn->{stat_change_with} = $sw2->{value};
256 $conn->send ("reply $sw1->{value}"); 262 $conn->send ("reply $sw1->{value}");
257 destroy_query_dialog $conn; 263 destroy_query_dialog $conn;
264 0
258 }, 265 },
259 ); 266 );
260 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]); 267 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]);
261 268
262 # right: accept 269 # right: accept
264 text => "Accept", 271 text => "Accept",
265 on_activate => sub { 272 on_activate => sub {
266 $conn->send ("reply n"); 273 $conn->send ("reply n");
267 $STATS_WINDOW->hide; 274 $STATS_WINDOW->hide;
268 destroy_query_dialog $conn; 275 destroy_query_dialog $conn;
276 0
269 }, 277 },
270 ); 278 );
271 279
272 unshift @dialog, new CFClient::UI::Label 280 unshift @dialog, new CFClient::UI::Label
273 max_w => $::WIDTH * 0.4, 281 max_w => $::WIDTH * 0.4,
283 291
284 push @dialog, my $entry = new CFClient::UI::Entry 292 push @dialog, my $entry = new CFClient::UI::Entry
285 on_changed => sub { 293 on_changed => sub {
286 $conn->send ("reply $_[1]"); 294 $conn->send ("reply $_[1]");
287 destroy_query_dialog $conn; 295 destroy_query_dialog $conn;
296 0
288 }, 297 },
289 ; 298 ;
290 299
291 $entry->focus_in; 300 $entry->grab_focus;
292 301
293 } else { 302 } else {
294 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)"; 303 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)";
295 304
296 push @dialog, my $entry = new CFClient::UI::Entry 305 push @dialog, my $entry = new CFClient::UI::Entry
297 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (), 306 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
298 on_activate => sub { 307 on_activate => sub {
299 $conn->send ("reply $_[1]"); 308 $conn->send ("reply $_[1]");
300 destroy_query_dialog $conn; 309 destroy_query_dialog $conn;
310 0
301 }, 311 },
302 ; 312 ;
303 313
304 $entry->focus_in; 314 $entry->grab_focus;
305 } 315 }
306 316
307 $vbox->add (@dialog); 317 $vbox->add (@dialog);
308 $dialog->show; 318 $dialog->show;
309} 319}
314 $LOGIN_BUTTON->set_text ("Logout"); 324 $LOGIN_BUTTON->set_text ("Logout");
315 $SETUP_DIALOG->hide; 325 $SETUP_DIALOG->hide;
316 326
317 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 327 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
318 328
319 my ($host, $port) = split /:/, $CFG->{host}; 329 my ($host, $port) = split /:/, $CFG->{profile}{default}{host};
320 330
321 $MAP = new CFClient::Map $mapsize, $mapsize; 331 $MAP = new CFClient::Map $mapsize, $mapsize;
322 332
323 $CONN = eval { 333 $CONN = eval {
324 new CFClient::Protocol 334 new CFClient::Protocol
325 host => $host, 335 host => $host,
326 port => $port || 13327, 336 port => $port || 13327,
327 user => $CFG->{user}, 337 user => $CFG->{profile}{default}{user},
328 pass => $CFG->{password}, 338 pass => $CFG->{profile}{default}{password},
329 mapw => $mapsize, 339 mapw => $mapsize,
330 maph => $mapsize, 340 maph => $mapsize,
331 341
332 map_widget => $MAPWIDGET, 342 map_widget => $MAPWIDGET,
333 logview => $LOGVIEW, 343 logview => $LOGVIEW,
362sub stop_game { 372sub stop_game {
363 $LOGIN_BUTTON->set_text ("Login"); 373 $LOGIN_BUTTON->set_text ("Login");
364 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER); 374 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
365 $SETUP_DIALOG->show; 375 $SETUP_DIALOG->show;
366 $INV_WINDOW->hide; 376 $INV_WINDOW->hide;
377 $SETUP_SPELLS->clear_spells;
367 378
368 return unless $CONN; 379 return unless $CONN;
369 380
370 status "connection closed"; 381 status "connection closed";
371 382
372 destroy_query_dialog $CONN; 383 destroy_query_dialog $CONN;
373 $CONN->destroy; 384 $CONN->destroy;
374 $CONN = 0; # false, does not autovivify 385 $CONN = 0; # false, does not autovivify
386
387 undef $MAP;
375} 388}
376 389
377sub graphics_setup { 390sub graphics_setup {
378 my $vbox = new CFClient::UI::VBox; 391 my $vbox = new CFClient::UI::VBox;
379 392
397 410
398 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen"); 411 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen");
399 $table->add (1, $row++, new CFClient::UI::CheckBox 412 $table->add (1, $row++, new CFClient::UI::CheckBox
400 state => $CFG->{fullscreen}, 413 state => $CFG->{fullscreen},
401 tooltip => "Bring the client into fullscreen mode.", 414 tooltip => "Bring the client into fullscreen mode.",
402 on_changed => sub { 415 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
403 my ($self, $value) = @_;
404 $CFG->{fullscreen} = $value;
405 }
406 ); 416 );
407 417
408 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 418 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fast & Ugly");
409 $table->add (1, $row++, new CFClient::UI::CheckBox 419 $table->add (1, $row++, new CFClient::UI::CheckBox
410 state => $CFG->{fast}, 420 state => $CFG->{fast},
411 tooltip => "Lower the visual quality considerably to speed up rendering.", 421 tooltip => "Lower the visual quality considerably to speed up rendering.",
412 on_changed => sub { 422 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
413 my ($self, $value) = @_;
414 $CFG->{fast} = $value;
415 }
416 ); 423 );
417 424
418 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale"); 425 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Map Scale");
419 $table->add (1, $row++, new CFClient::UI::Slider 426 $table->add (1, $row++, new CFClient::UI::Slider
420 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 427 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
421 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 428 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
422 on_changed => sub { 429 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
423 my ($self, $value) = @_;
424 $CFG->{map_scale} = 2 ** $value;
425 }
426 ); 430 );
427 431
428 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fog of War"); 432 $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 433 $table->add (1, $row++, new CFClient::UI::CheckBox
430 state => $CFG->{fow_enable}, 434 state => $CFG->{fow_enable},
431 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 435 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
432 on_changed => sub { 436 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
433 my ($self, $value) = @_;
434 $CFG->{fow_enable} = $value;
435 }
436 ); 437 );
437 438
438 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity"); 439 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Intensity");
439 $table->add (1, $row++, new CFClient::UI::Slider 440 $table->add (1, $row++, new CFClient::UI::Slider
440 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 441 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.", 442 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 { 443 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 }
443 my ($self, $value) = @_;
444 $CFG->{fow_intensity} = $value;
445 }
446 ); 444 );
447 445
448 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth"); 446 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "FoW Smooth");
449 $table->add (1, $row++, new CFClient::UI::CheckBox 447 $table->add (1, $row++, new CFClient::UI::CheckBox
450 state => $CFG->{fow_smooth}, 448 state => $CFG->{fow_smooth},
451 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.", 449 tooltip => "Smooth the Fog-of-War a bit to make it more realistic. Changes are instant.",
452 on_changed => sub { 450 on_changed => sub {
453 my ($self, $value) = @_; 451 my ($self, $value) = @_;
454 $CFG->{fow_smooth} = $value; 452 $CFG->{fow_smooth} = $value;
455 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2; 453 status "Fog of War smoothing requires OpenGL 1.2 or higher" if $CFClient::OpenGL::GL_VERSION < 1.2;
454 0
456 } 455 }
457 ); 456 );
458 457
459 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 458 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "GUI Fontsize");
460 $table->add (1, $row++, new CFClient::UI::Slider 459 $table->add (1, $row++, new CFClient::UI::Slider
461 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 460 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.", 461 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] }, 462 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 },
464 ); 463 );
465 464
466 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 465 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Message Fontsize");
467 $table->add (1, $row++, new CFClient::UI::Slider 466 $table->add (1, $row++, new CFClient::UI::Slider
468 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 467 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.", 468 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]) }, 469 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
471 ); 470 );
472 471
473 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize"); 472 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
474 473
475 $table->add (1, $row++, new CFClient::UI::Slider 474 $table->add (1, $row++, new CFClient::UI::Slider
476 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1], 475 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.", 476 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.",
478 on_changed => sub { 477 on_changed => sub {
479 $CFG->{stat_fontsize} = $_[1]; 478 $CFG->{stat_fontsize} = $_[1];
480 &set_stats_window_fontsize; 479 &set_stats_window_fontsize;
480 0
481 } 481 }
482 ); 482 );
483 483
484 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 484 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
485 $table->add (1, $row++, new CFClient::UI::Slider 485 $table->add (1, $row++, new CFClient::UI::Slider
486 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 486 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.", 487 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
488 on_changed => sub { 488 on_changed => sub {
489 $CFG->{gauge_fontsize} = $_[1]; 489 $CFG->{gauge_fontsize} = $_[1];
490 &set_gauge_window_fontsize; 490 &set_gauge_window_fontsize;
491 0
491 } 492 }
492 ); 493 );
493 494
494 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size"); 495 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge size");
495 $table->add (1, $row++, new CFClient::UI::Slider 496 $table->add (1, $row++, new CFClient::UI::Slider
496 range => [$CFG->{gauge_size}, 0.2, 0.8], 497 range => [$CFG->{gauge_size}, 0.2, 0.8],
497 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", 498 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.",
498 on_changed => sub { 499 on_changed => sub {
499 $CFG->{gauge_size} = $_[1]; 500 $CFG->{gauge_size} = $_[1];
500 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 501 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
502 0
501 } 503 }
502 ); 504 );
503 505
504 $table->add (1, $row++, new CFClient::UI::Button 506 $table->add (1, $row++, new CFClient::UI::Button
505 expand => 1, align => 0, text => "Apply", 507 expand => 1, align => 0, text => "Apply",
506 tooltip => "Apply the video settings", 508 tooltip => "Apply the video settings",
507 on_activate => sub { 509 on_activate => sub {
508 video_shutdown (); 510 video_shutdown ();
509 video_init (); 511 video_init ();
512 0
510 } 513 }
511 ); 514 );
512 515
513 $vbox 516 $vbox
514} 517}
522 525
523 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable"); 526 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Audio Enable");
524 $table->add (1, $row++, new CFClient::UI::CheckBox 527 $table->add (1, $row++, new CFClient::UI::CheckBox
525 state => $CFG->{audio_enable}, 528 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.", 529 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 { 530 on_changed => sub { $CFG->{audio_enable} = $_[1]; 0 }
528 $CFG->{audio_enable} = $_[1];
529 }
530 ); 531 );
531# $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Effects Volume"); 532# $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 { 533# $table->add (1, 8, new CFClient::UI::Slider range => [$CFG->{effects_volume}, 0, 128, 1], on_changed => sub {
533# $CFG->{effects_volume} = $_[1]; 534# $CFG->{effects_volume} = $_[1];
534# }); 535# });
535 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Background Music"); 536 $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); 537 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox);
537 $hbox->add (new CFClient::UI::CheckBox 538 $hbox->add (new CFClient::UI::CheckBox
538 expand => 1, state => $CFG->{bgm_enable}, 539 expand => 1, state => $CFG->{bgm_enable},
539 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 540 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
540 on_changed => sub { 541 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 }
541 $CFG->{bgm_enable} = $_[1];
542 }
543 ); 542 );
544 $hbox->add (new CFClient::UI::Slider 543 $hbox->add (new CFClient::UI::Slider
545 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 544 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
546 tooltip => "The volume of the background music. Changes are instant.", 545 tooltip => "The volume of the background music. Changes are instant.",
547 on_changed => sub { 546 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 ); 547 );
552 548
553 $table->add (1, $row++, new CFClient::UI::Button 549 $table->add (1, $row++, new CFClient::UI::Button
554 expand => 1, align => 0, text => "Apply", 550 expand => 1, align => 0, text => "Apply",
555 tooltip => "Apply the audio settings", 551 tooltip => "Apply the audio settings",
556 on_activate => sub { 552 on_activate => sub {
557 audio_shutdown (); 553 audio_shutdown ();
558 audio_init (); 554 audio_init ();
555 0
559 } 556 }
560 ); 557 );
561 558
562 $vbox 559 $vbox
563} 560}
629 626
630sub debug_setup { 627sub debug_setup {
631 my $table = new CFClient::UI::Table; 628 my $table = new CFClient::UI::Table;
632 629
633 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders"); 630 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders");
634 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1 }); 631 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 });
635 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info"); 632 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info");
636 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2 }); 633 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
637 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS"); 634 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS");
638 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4 }); 635 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
639 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips"); 636 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips");
640 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8 }); 637 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
641 638
642 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05); 639 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
643 640
644 for my $x (0..2) { 641 for my $x (0..2) {
645 for my $y (0 .. 2) { 642 for my $y (0 .. 2) {
658sub stats_window { 655sub stats_window {
659 my $tgw = new CFClient::UI::FancyFrame 656 my $tgw = new CFClient::UI::FancyFrame
660 y => $HEIGHT * (2/8), 657 y => $HEIGHT * (2/8),
661 x => "max", 658 x => "max",
662 title => "Stats", 659 title => "Stats",
663 name => "stats_window"; 660 name => "stats_window",
661 has_close_button => 1;
664 662
665 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox); 663 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox);
666 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 664 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
667 can_hover => 1, can_events => 1, 665 can_hover => 1, can_events => 1,
668 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 666 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
814 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED}); 812 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED});
815 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP}); 813 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP});
816 814
817 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000); 815 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000);
818 816
819 # TODO: replace by CS_STAT_RES_xxx constants
820 my %tbl = ( 817 my %tbl = (
821 phys => 100, 818 phys => CS_STAT_RES_PHYS,
822 magic => 101, 819 magic => CS_STAT_RES_MAG,
823 fire => 102, 820 fire => CS_STAT_RES_FIRE,
824 elec => 103, 821 elec => CS_STAT_RES_ELEC,
825 cold => 104, 822 cold => CS_STAT_RES_COLD,
826 conf => 105, 823 conf => CS_STAT_RES_CONF,
827 acid => 106, 824 acid => CS_STAT_RES_ACID,
828 drain => 107, 825 drain => CS_STAT_RES_DRAIN,
829 ghit => 108, 826 ghit => CS_STAT_RES_GHOSTHIT,
830 pois => 109, 827 pois => CS_STAT_RES_POISON,
831 slow => 110, 828 slow => CS_STAT_RES_SLOW,
832 para => 111, 829 para => CS_STAT_RES_PARA,
833 tund => 112, 830 tund => CS_STAT_TURN_UNDEAD,
834 fear => 113, 831 fear => CS_STAT_RES_FEAR,
835 depl => 113, 832 depl => CS_STAT_RES_DEPLETE,
836 deat => 115, 833 deat => CS_STAT_RES_DEATH,
837 holyw => 116, 834 holyw => CS_STAT_RES_HOLYWORD,
838 blind => 117, 835 blind => CS_STAT_RES_BLIND,
839 ); 836 );
840 837
841 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}) 838 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
842 for keys %tbl; 839 for keys %tbl;
843} 840}
917 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [ 914 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [
918 (new CFClient::UI::Button 915 (new CFClient::UI::Button
919 text => "Use", 916 text => "Use",
920 tooltip => "Put this server into the <b>Host:Port</b> field", 917 tooltip => "Put this server into the <b>Host:Port</b> field",
921 on_activate => sub { 918 on_activate => sub {
922 $HOST_ENTRY->set_text ($CFG->{host} = $host); 919 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host);
923 $METASERVER->hide; 920 $METASERVER->hide;
921 0
924 }, 922 },
925 ), 923 ),
926 (new CFClient::UI::Empty expand => 1), 924 (new CFClient::UI::Empty expand => 1),
927 ]); 925 ]);
928 926
949 z => 3, 947 z => 3,
950 force_h => $::HEIGHT * 0.4, 948 force_h => $::HEIGHT * 0.4,
951 child => (my $vbox = new CFClient::UI::VBox), 949 child => (my $vbox = new CFClient::UI::VBox),
952 on_visibility_change => sub { 950 on_visibility_change => sub {
953 update_metaserver if $_[1]; 951 update_metaserver if $_[1];
952 0
954 }, 953 },
955 ; 954 ;
956 955
957 $dialog->{table} = new CFClient::UI::Table; 956 $dialog->{table} = new CFClient::UI::Table;
958 957
971 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 970 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
972 971
973 $vbox->add ( 972 $vbox->add (
974 $HOST_ENTRY = new CFClient::UI::Entry 973 $HOST_ENTRY = new CFClient::UI::Entry
975 expand => 1, 974 expand => 1,
976 text => $CFG->{host}, 975 text => $CFG->{profile}{default}{host},
977 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", 976 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to",
978 on_changed => sub { 977 on_changed => sub {
979 my ($self, $value) = @_; 978 my ($self, $value) = @_;
980 $CFG->{host} = $value; 979 $CFG->{profile}{default}{host} = $value;
980 0
981 } 981 }
982 ); 982 );
983 983
984 $METASERVER = metaserver_dialog; 984 $METASERVER = metaserver_dialog;
985 985
986 $vbox->add (new CFClient::UI::Button 986 $vbox->add (new CFClient::UI::Button
987 expand => 1, 987 expand => 1,
988 text => "Server List", 988 text => "Server List",
989 other => $METASERVER, 989 other => $METASERVER,
990 tooltip => "Show a list of available crossfire servers", 990 tooltip => "Show a list of available crossfire servers",
991 on_activate => sub { $METASERVER->toggle_visibility }, 991 on_activate => sub { $METASERVER->toggle_visibility; 0 },
992 on_visibility_change => sub { $METASERVER->hide unless $_[1] }, 992 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 0 },
993 ); 993 );
994 } 994 }
995 995
996 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); 996 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username");
997 $table->add (1, 4, new CFClient::UI::Entry 997 $table->add (1, 4, new CFClient::UI::Entry
998 text => $CFG->{user}, 998 text => $CFG->{profile}{default}{user},
999 tooltip => "The name of your character on the server", 999 tooltip => "The name of your character on the server",
1000 on_changed => sub { 1000 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value }
1001 my ($self, $value) = @_;
1002 $CFG->{user} = $value;
1003 }
1004 ); 1001 );
1005 1002
1006 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); 1003 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password");
1007 $table->add (1, 5, new CFClient::UI::Entry 1004 $table->add (1, 5, new CFClient::UI::Entry
1008 text => $CFG->{password}, 1005 text => $CFG->{profile}{default}{password},
1009 hidden => 1, 1006 hidden => 1,
1010 tooltip => "The password for your character", 1007 tooltip => "The password for your character",
1011 on_changed => sub { 1008 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value }
1012 my ($self, $value) = @_;
1013 $CFG->{password} = $value;
1014 }
1015 ); 1009 );
1016 1010
1017 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); 1011 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size");
1018 $table->add (1, 7, new CFClient::UI::Slider 1012 $table->add (1, 7, new CFClient::UI::Slider
1019 force_w => 100, 1013 force_w => 100,
1020 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1014 range => [$CFG->{mapsize}, 10, 100, 0, 1],
1021 tooltip => "This is the size of the portion of the map update the server sends you. " 1015 tooltip => "This is the size of the portion of the map update the server sends you. "
1022 . "If you set this to a high value you will be able to see further, " 1016 . "If you set this to a high value you will be able to see further, "
1023 . "but you also increase bandwidth requirements and latency. " 1017 . "but you also increase bandwidth requirements and latency. "
1024 . "This option is only used once at log-in.", 1018 . "This option is only used once at log-in.",
1025 on_changed => sub { 1019 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 0 },
1026 my ($self, $value) = @_;
1027
1028 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
1029 },
1030 ); 1020 );
1031 1021
1032 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch"); 1022 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch");
1033 $table->add (1, 8, new CFClient::UI::CheckBox 1023 $table->add (1, 8, new CFClient::UI::CheckBox
1034 state => $CFG->{face_prefetch}, 1024 state => $CFG->{face_prefetch},
1037 . "This might increase or create lag, but increases the chances " 1027 . "This might increase or create lag, but increases the chances "
1038 . "of faces being ready for display when you encounter them. " 1028 . "of faces being ready for display when you encounter them. "
1039 . "It also uses up server bandwidth on every connect, " 1029 . "It also uses up server bandwidth on every connect, "
1040 . "so only set it if you really need to prefetch images. " 1030 . "so only set it if you really need to prefetch images. "
1041 . "This option can be set and unset any time.", 1031 . "This option can be set and unset any time.",
1042 on_changed => sub { $CFG->{face_prefetch} = $_[1] }, 1032 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 },
1043 ); 1033 );
1044 1034
1045 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count"); 1035 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count");
1046 $table->add (1, 9, new CFClient::UI::Entry 1036 $table->add (1, 9, new CFClient::UI::Entry
1047 text => $CFG->{output_count}, 1037 text => $CFG->{output_count},
1048 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1038 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1049 on_changed => sub { $CFG->{output_count} = $_[1] }, 1039 on_changed => sub { $CFG->{output_count} = $_[1]; 0 },
1050 ); 1040 );
1051 1041
1052 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync"); 1042 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync");
1053 $table->add (1, 10, new CFClient::UI::Entry 1043 $table->add (1, 10, new CFClient::UI::Entry
1054 text => $CFG->{output_sync}, 1044 text => $CFG->{output_sync},
1055 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1045 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1056 on_changed => sub { $CFG->{output_sync} = $_[1] }, 1046 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 },
1057 ); 1047 );
1058 1048
1059 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 1049 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
1060 expand => 1, 1050 expand => 1,
1061 align => 0, 1051 align => 0,
1062 text => "Login", 1052 text => "Login",
1063 on_activate => sub { 1053 on_activate => sub {
1064 $CONN ? stop_game 1054 $CONN ? stop_game
1065 : start_game; 1055 : start_game;
1056 0
1066 }, 1057 },
1067 ); 1058 );
1068 1059
1069 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 1060 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
1070 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry 1061 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
1073 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1064 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1074 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1065 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1075 on_changed => sub { 1066 on_changed => sub {
1076 my ($self, $value) = @_; 1067 my ($self, $value) = @_;
1077 $CFG->{say_command} = $value; 1068 $CFG->{say_command} = $value;
1069 0
1078 } 1070 }
1079 ); 1071 );
1072
1073 $vbox->add (new CFClient::UI::Label
1074 text => "Server Info",
1075 fontsize => 1.2,
1076 padding_y => 8,
1077 fg => [1, 1, 0, 1],
1078 );
1079
1080 $vbox->add ($SERVER_INFO = new CFClient::UI::Label ellipsise => 0);
1080 1081
1081 $vbox 1082 $vbox
1082} 1083}
1083 1084
1084sub message_window { 1085sub message_window {
1089 bg => [0, 0, 0, 0.75], 1090 bg => [0, 0, 0, 0.75],
1090 x => "max", 1091 x => "max",
1091 y => 0, 1092 y => 0,
1092 force_w => $::WIDTH * 0.4, 1093 force_w => $::WIDTH * 0.4,
1093 force_h => $::HEIGHT * 0.5, 1094 force_h => $::HEIGHT * 0.5,
1094 child => (my $vbox = new CFClient::UI::VBox); 1095 child => (my $vbox = new CFClient::UI::VBox),
1096 has_close_button => 1;
1095 1097
1096 $vbox->add ($LOGVIEW); 1098 $vbox->add ($LOGVIEW);
1097 1099
1098 $vbox->add (my $input = new CFClient::UI::Entry 1100 $vbox->add (my $input = new CFClient::UI::Entry
1099 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> " 1101 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> "
1107 1109
1108 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 1110 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
1109 $input->{refocus_map} = 1; 1111 $input->{refocus_map} = 1;
1110 } 1112 }
1111 delete $input->{auto_activated}; 1113 delete $input->{auto_activated};
1114
1115 0
1112 }, 1116 },
1113 on_activate => sub { 1117 on_activate => sub {
1114 my ($input, $text) = @_; 1118 my ($input, $text) = @_;
1115 $input->set_text (''); 1119 $input->set_text ('');
1116 1120
1122 } 1126 }
1123 if ($input->{refocus_map}) { 1127 if ($input->{refocus_map}) {
1124 delete $input->{refocus_map}; 1128 delete $input->{refocus_map};
1125 $MAPWIDGET->focus_in 1129 $MAPWIDGET->focus_in
1126 } 1130 }
1131
1132 0
1127 }, 1133 },
1128 on_escape => sub { 1134 on_escape => sub {
1129 $MAPWIDGET->focus_in 1135 $MAPWIDGET->grab_focus;
1136
1137 0
1130 }, 1138 },
1131 ); 1139 );
1132 1140
1133 $CONSOLE = { 1141 $CONSOLE = {
1134 window => $window, 1142 window => $window,
1156 ); 1164 );
1157 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 1165 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
1158 $hb->add (new CFClient::UI::Button 1166 $hb->add (new CFClient::UI::Button
1159 text => "Ok", 1167 text => "Ok",
1160 expand => 1, 1168 expand => 1,
1161 on_activate => sub { $QUIT_DIALOG->hide }, 1169 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1162 ); 1170 );
1163 $hb->add (new CFClient::UI::Button 1171 $hb->add (new CFClient::UI::Button
1164 text => "Quit anyway", 1172 text => "Quit anyway",
1165 expand => 1, 1173 expand => 1,
1166 on_activate => sub { exit }, 1174 on_activate => sub { exit },
1209 ["Potions" => PICKUP_POTION], 1217 ["Potions" => PICKUP_POTION],
1210 ["Magic Devices" => PICKUP_MAGIC_DEVICE], 1218 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1211 ["Ignore cursed" => PICKUP_NOT_CURSED], 1219 ["Ignore cursed" => PICKUP_NOT_CURSED],
1212 ["Jewelery" => PICKUP_JEWELS], 1220 ["Jewelery" => PICKUP_JEWELS],
1213 ], 1221 ],
1222 ["Weight/Value ratio", 2, 17]
1214 ) 1223 )
1215 { 1224 {
1216 my ($title, $x, $y, @bits) = @$_; 1225 my ($title, $x, $y, @bits) = @$_;
1217 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]); 1226 $table->add ($x, $y, new CFClient::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
1218 1227
1232 $::CFG->{pickup} &= ~$mask; 1241 $::CFG->{pickup} &= ~$mask;
1233 } 1242 }
1234 1243
1235 $::CONN->send_command ("pickup $::CFG->{pickup}") 1244 $::CONN->send_command ("pickup $::CFG->{pickup}")
1236 if defined $::CONN; 1245 if defined $::CONN;
1246
1247 0
1237 }); 1248 });
1238 } 1249 }
1239 } 1250 }
1251
1252 $table->add (2, 18, new CFClient::UI::ValSlider
1253 range => [0, 0, 16, 1, 1],
1254 to_value => sub { ">= " . 5 * $_[0] },
1255 on_changed => sub {
1256 my ($slider, $value) = @_;
1257
1258 $::CFG->{pickup} &= ~0x7;
1259 $::CFG->{pickup} |= int $value
1260 if $value;
1261 1;
1262 });
1263 $table->add (3, 18, new CFClient::UI::Button
1264 text => "set",
1265 on_activate => sub {
1266 $::CONN->send_command ("pickup $::CFG->{pickup}")
1267 if defined $::CONN;
1268 0
1269 });
1240 1270
1241 $table 1271 $table
1242} 1272}
1243 1273
1244sub inventory_window { 1274sub inventory_window {
1246 x => "center", 1276 x => "center",
1247 y => "center", 1277 y => "center",
1248 force_w => $WIDTH * 9/10, 1278 force_w => $WIDTH * 9/10,
1249 force_h => $HEIGHT * 9/10, 1279 force_h => $HEIGHT * 9/10,
1250 title => "Inventory", 1280 title => "Inventory",
1281 has_close_button => 1,
1251 ; 1282 ;
1252 1283
1253 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); 1284 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
1254 1285
1255 $hb->add (my $vb1 = new CFClient::UI::VBox); 1286 $hb->add (my $vb1 = new CFClient::UI::VBox);
1277 1308
1278 my $refresh; 1309 my $refresh;
1279 $refresh = sub { 1310 $refresh = sub {
1280 $binding_list->clear (); 1311 $binding_list->clear ();
1281 1312
1282 for my $mod (keys %{$::CFG->{bindings}}) { 1313 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) {
1283 for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { 1314 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) {
1284 my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; 1315 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1285 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1316 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1286 1317
1287 my $lbl = join "; ", @$cmds; 1318 my $lbl = join "; ", @$cmds;
1288 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); 1319 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym);
1289 $binding_list->add (my $hb = new CFClient::UI::HBox); 1320 $binding_list->add (my $hb = new CFClient::UI::HBox);
1290 $hb->add (new CFClient::UI::Button 1321 $hb->add (new CFClient::UI::Button
1291 text => "delete", 1322 text => "delete",
1292 tooltip => "Deletes the binding", 1323 tooltip => "Deletes the binding",
1293 on_activate => sub { 1324 on_activate => sub {
1294 $binding_list->remove ($hb); 1325 $binding_list->remove ($hb);
1295 delete $::CFG->{bindings}->{$mod}->{$sym}; 1326 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1327 0
1296 }); 1328 });
1297 1329
1298 $hb->add (new CFClient::UI::Button 1330 $hb->add (new CFClient::UI::Button
1299 text => "edit", 1331 text => "edit",
1300 tooltip => "Edits the binding", 1332 tooltip => "Edits the binding",
1301 on_activate => sub { 1333 on_activate => sub {
1302 $::BIND_EDITOR->set_binding ( 1334 $::BIND_EDITOR->set_binding (
1303 $mod, $sym, $::CFG->{bindings}->{$mod}->{$sym}, 1335 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym},
1304 sub { 1336 sub {
1305 my ($nmod, $nsym, $ncmds) = @_; 1337 my ($nmod, $nsym, $ncmds) = @_;
1306 delete $::CFG->{bindings}->{$mod}->{$sym}; 1338 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1307 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1339 $::CFG->{profile}{default}{bindings}{$nmod}{$nsym} = $ncmds;
1308 $refresh->(); 1340 $refresh->();
1309 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1341 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1310 $SETUP_DIALOG->show; 1342 $SETUP_DIALOG->show;
1311 }, 1343 },
1312 sub { 1344 sub {
1313 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1345 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1314 $SETUP_DIALOG->show; 1346 $SETUP_DIALOG->show;
1315 }); 1347 });
1316 $::BIND_EDITOR->show; 1348 $::BIND_EDITOR->show;
1317 $SETUP_DIALOG->hide; 1349 $SETUP_DIALOG->hide;
1350 0
1318 }); 1351 });
1319 1352
1320 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1353 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1321 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1354 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1322 } 1355 }
1323 } 1356 }
1324 }; 1357 };
1325 1358
1326 my $vb = new CFClient::UI::VBox; 1359 my $vb = new CFClient::UI::VBox;
1360 $vb->add (my $hb = new CFClient::UI::HBox);
1361 $hb->add (new CFClient::UI::Label text => "only shift-up stops fire");
1362 $hb->add (new CFClient::UI::CheckBox
1363 expand => 1,
1364 state => $CFG->{shift_fire_stop},
1365 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift",
1366 on_changed => sub {
1367 my ($cbox, $value) = @_;
1368 $CFG->{shift_fire_stop} = $value;
1369 0
1370 });
1371
1327 $vb->add ($binding_list); 1372 $vb->add ($binding_list);
1328 $vb->add (my $hb = new CFClient::UI::HBox); 1373 $vb->add (my $hb = new CFClient::UI::HBox);
1329 1374
1330 $hb->add (new CFClient::UI::Button 1375 $hb->add (new CFClient::UI::Button
1331 text => "record new", 1376 text => "record new",
1333 tooltip => "This button opens the binding editor with an empty binding.", 1378 tooltip => "This button opens the binding editor with an empty binding.",
1334 on_activate => sub { 1379 on_activate => sub {
1335 $::BIND_EDITOR->set_binding (undef, undef, [], 1380 $::BIND_EDITOR->set_binding (undef, undef, [],
1336 sub { 1381 sub {
1337 my ($mod, $sym, $cmds) = @_; 1382 my ($mod, $sym, $cmds) = @_;
1338 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1383 $::CFG->{profile}{default}{bindings}{$mod}{$sym} = $cmds;
1339 $refresh->(); 1384 $refresh->();
1340 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1385 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1341 $SETUP_DIALOG->show; 1386 $SETUP_DIALOG->show;
1342 }, 1387 },
1343 sub { 1388 sub {
1345 $SETUP_DIALOG->show; 1390 $SETUP_DIALOG->show;
1346 }, 1391 },
1347 ); 1392 );
1348 $SETUP_DIALOG->hide; 1393 $SETUP_DIALOG->hide;
1349 $::BIND_EDITOR->show; 1394 $::BIND_EDITOR->show;
1395 0
1350 }, 1396 },
1351 ); 1397 );
1352 1398
1353 $hb->add (new CFClient::UI::Button 1399 $hb->add (new CFClient::UI::Button
1354 text => "close", 1400 text => "close",
1355 tooltip => "Closes the binding window", 1401 tooltip => "Closes the binding window",
1356 expand => 1, 1402 expand => 1,
1357 on_activate => sub { 1403 on_activate => sub {
1358 $SETUP_DIALOG->hide; 1404 $SETUP_DIALOG->hide;
1405 0
1359 } 1406 }
1360 ); 1407 );
1361 1408
1362 $refresh->(); 1409 $refresh->();
1363 1410
1401 1448
1402 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1449 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1403 for @$pom; 1450 for @$pom;
1404 1451
1405 $viewer->set_offset (0); 1452 $viewer->set_offset (0);
1453 0
1406 }, 1454 },
1407 on_visibility_change => sub { 1455 on_visibility_change => sub {
1408 my ($self, $visible) = @_; 1456 my ($self, $visible) = @_;
1409 return unless $visible; 1457 return unless $visible;
1410 return if $self->{value}; 1458 return if $self->{value};
1411 $self->set_value ("intro"); 1459 $self->set_value ("intro");
1460 0
1412 }, 1461 },
1413 ); 1462 );
1414 1463
1415 $win 1464 $win
1416} 1465}
1485 $MAPWIDGET->connect (activate_console => sub { 1534 $MAPWIDGET->connect (activate_console => sub {
1486 my ($mapwidget, $preset) = @_; 1535 my ($mapwidget, $preset) = @_;
1487 1536
1488 if ($CONSOLE) { 1537 if ($CONSOLE) {
1489 $CONSOLE->{input}->{auto_activated} = 1; 1538 $CONSOLE->{input}->{auto_activated} = 1;
1490 $CONSOLE->{input}->focus_in; 1539 $CONSOLE->{input}->grab_focus;
1491 1540
1492 if ($preset && $CONSOLE->{input}->get_text eq '') { 1541 if ($preset && $CONSOLE->{input}->get_text eq '') {
1493 $CONSOLE->{input}->set_text ($preset); 1542 $CONSOLE->{input}->set_text ($preset);
1494 } 1543 }
1495 } 1544 }
1496 }); 1545 });
1497 $MAPWIDGET->show; 1546 $MAPWIDGET->show;
1498 $MAPWIDGET->focus_in; 1547 $MAPWIDGET->grab_focus;
1499 1548
1500 $LOGVIEW = new CFClient::UI::TextScroller 1549 $LOGVIEW = new CFClient::UI::TextScroller
1501 expand => 1, 1550 expand => 1,
1502 font => $FONT_FIXED, 1551 font => $FONT_FIXED,
1503 fontsize => $::CFG->{log_fontsize}, 1552 fontsize => $::CFG->{log_fontsize},
1513 x => 'center', 1562 x => 'center',
1514 y => 'center', 1563 y => 'center',
1515 z => 2, 1564 z => 2,
1516 force_w => $::WIDTH * 0.6, 1565 force_w => $::WIDTH * 0.6,
1517 force_h => $::HEIGHT * 0.6, 1566 force_h => $::HEIGHT * 0.6,
1567 has_close_button => 1,
1518 ; 1568 ;
1519 1569
1520 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1, 1570 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1521 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); 1571 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1522 1572
1527 $SETUP_NOTEBOOK->add (Graphics => graphics_setup, 1577 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1528 "Configure the video mode, performance, fonts and other graphical aspects of the game."); 1578 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1529 $SETUP_NOTEBOOK->add (Audio => audio_setup, 1579 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1530 "Configure the use of audio, sound effects and background music."); 1580 "Configure the use of audio, sound effects and background music.");
1531 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, 1581 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1532 "Lets you define, edit and delete bindings." 1582 "Lets you define, edit and delete key bindings."
1533 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor " 1583 . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor "
1534 . "with nothing set and the recording started. After doing the actions you " 1584 . "with nothing set and the recording started. After doing the actions you "
1535 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " 1585 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1536 . "After pressing the combo the binding will be saved automatically and the " 1586 . "After pressing the combo the binding will be saved automatically and the "
1537 . "binding editor closes"); 1587 . "binding editor closes");
1538 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, 1588 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1539 "Displays all spells you have and lets you edit keyboard shortcuts for them."); 1589 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1540 $SETUP_NOTEBOOK->add (Debug => debug_setup, 1590 $SETUP_NOTEBOOK->add (Debug => debug_setup,
1541 "Some debuggign options. Do not ask."); 1591 "Some debuggin' options. Do not ask.");
1542 1592
1543 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 1593 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1544 1594
1545 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 1595 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1546 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 1596 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1561 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1611 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1562 on_activate => sub { 1612 on_activate => sub {
1563 $::CFG->{layout} = CFClient::UI::get_layout; 1613 $::CFG->{layout} = CFClient::UI::get_layout;
1564 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc"; 1614 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc";
1565 status "Configuration Saved"; 1615 status "Configuration Saved";
1616 0
1566 }, 1617 },
1567 ); 1618 );
1568 1619
1569 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window, 1620 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window,
1570 tooltip => "View Documentation"); 1621 tooltip => "View Documentation");
1576 if ($CONN) { 1627 if ($CONN) {
1577 open_quit_dialog; 1628 open_quit_dialog;
1578 } else { 1629 } else {
1579 exit; 1630 exit;
1580 } 1631 }
1632 0
1581 }, 1633 },
1582 ); 1634 );
1583 1635
1584 $BUTTONBAR->show; 1636 $BUTTONBAR->show;
1585 $SETUP_DIALOG->show; 1637 $SETUP_DIALOG->show;
1587 1639
1588 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1640 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1589} 1641}
1590 1642
1591sub video_shutdown { 1643sub video_shutdown {
1644 CFClient::OpenGL::shutdown;
1645
1592 undef $SDL_ACTIVE; 1646 undef $SDL_ACTIVE;
1593} 1647}
1594 1648
1595my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d# 1649my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d#
1596my $bgmusic;#TODO#hack#d# 1650my $bgmusic;#TODO#hack#d#
1812 1866
1813 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1867 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1814 CFClient::UI::set_layout ($::CFG->{layout}); 1868 CFClient::UI::set_layout ($::CFG->{layout});
1815 1869
1816 my %DEF_CFG = ( 1870 my %DEF_CFG = (
1817 sdl_mode => 0, 1871 sdl_mode => 0,
1818 width => 640, 1872 width => 640,
1819 height => 480, 1873 height => 480,
1820 fullscreen => 0, 1874 fullscreen => 0,
1821 fast => 0, 1875 fast => 0,
1822 map_scale => 1, 1876 map_scale => 1,
1823 fow_enable => 1, 1877 fow_enable => 1,
1824 fow_intensity => 0.45, 1878 fow_intensity => 0.45,
1825 fow_smooth => 0, 1879 fow_smooth => 0,
1826 gui_fontsize => 1, 1880 gui_fontsize => 1,
1827 log_fontsize => 0.7, 1881 log_fontsize => 0.7,
1828 gauge_fontsize=> 1, 1882 gauge_fontsize => 1,
1829 gauge_size => 0.35, 1883 gauge_size => 0.35,
1830 stat_fontsize => 0.7, 1884 stat_fontsize => 0.7,
1831 mapsize => 100, 1885 mapsize => 100,
1832 host => "crossfire.schmorp.de",
1833 say_command => 'say', 1886 say_command => 'say',
1834 audio_enable => 1, 1887 audio_enable => 1,
1835 bgm_enable => 1, 1888 bgm_enable => 1,
1836 bgm_volume => 0.25, 1889 bgm_volume => 0.25,
1837 face_prefetch => 0, 1890 face_prefetch => 0,
1838 output_sync => 1, 1891 output_sync => 1,
1839 output_count => 1, 1892 output_count => 1,
1840 pickup => 0, 1893 pickup => 0,
1894 default => "profile", # default profile
1895 );
1841 ); 1896
1842
1843 while (my ($k, $v) = each %DEF_CFG) { 1897 while (my ($k, $v) = each %DEF_CFG) {
1844 $CFG->{$k} = $v unless exists $CFG->{$k}; 1898 $CFG->{$k} = $v unless exists $CFG->{$k};
1845 } 1899 }
1900
1901 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de";
1846 1902
1847 sdl_init; 1903 sdl_init;
1848 1904
1849 @SDL_MODES = reverse 1905 @SDL_MODES = reverse
1850 grep $_->[0] >= 640 && $_->[1] >= 480, 1906 grep $_->[0] >= 640 && $_->[1] >= 480,
1892 video_init; 1948 video_init;
1893 audio_init; 1949 audio_init;
1894} 1950}
1895 1951
1896Event::loop; 1952Event::loop;
1953#CFClient::SDL_Quit;
1954#CFClient::_exit 0;
1897 1955
1898END { CFClient::SDL_Quit } 1956END { CFClient::SDL_Quit }
1899 1957
1900=head1 NAME 1958=head1 NAME
1901 1959

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines