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.72 by elmex, Tue Jun 13 18:14:03 2006 UTC vs.
Revision 1.81 by elmex, Wed Jun 28 09:42:40 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 {
115our $INV; 116our $INV;
116our $INVR; 117our $INVR;
117our $INV_RIGHT_HB; 118our $INV_RIGHT_HB;
118 119
119our $BIND_EDITOR; 120our $BIND_EDITOR;
121our $BIND_UPD_CB;
120 122
121our $PICKUP_CFG; 123our $PICKUP_CFG;
122 124
123sub status { 125sub status {
124 $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]);
155 $hbox->add (new CFClient::UI::Button 157 $hbox->add (new CFClient::UI::Button
156 text => "No", 158 text => "No",
157 on_activate => sub { 159 on_activate => sub {
158 $conn->send ("reply n"); 160 $conn->send ("reply n");
159 $dialog->destroy; 161 $dialog->destroy;
162 0
160 } 163 }
161 ); 164 );
162 $hbox->add (new CFClient::UI::Button 165 $hbox->add (new CFClient::UI::Button
163 text => "Yes", 166 text => "Yes",
164 on_activate => sub { 167 on_activate => sub {
165 $conn->send ("reply y"); 168 $conn->send ("reply y");
166 destroy_query_dialog $conn; 169 destroy_query_dialog $conn;
170 0
167 }, 171 },
168 ); 172 );
169 173
170 $dialog->focus_in; 174 $dialog->grab_focus;
171 175
172 } elsif ($flags & CS_QUERY_SINGLECHAR) { 176 } elsif ($flags & CS_QUERY_SINGLECHAR) {
173 $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)";
174 178
175 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) {
185 $table->add (0, 0, new CFClient::UI::Button 189 $table->add (0, 0, new CFClient::UI::Button
186 text => "Next Race", 190 text => "Next Race",
187 on_activate => sub { 191 on_activate => sub {
188 $conn->send ("reply n"); 192 $conn->send ("reply n");
189 destroy_query_dialog $conn; 193 destroy_query_dialog $conn;
194 0
190 }, 195 },
191 ); 196 );
192 $table->add (2, 0, new CFClient::UI::Button 197 $table->add (2, 0, new CFClient::UI::Button
193 text => "Accept", 198 text => "Accept",
194 on_activate => sub { 199 on_activate => sub {
195 $conn->send ("reply d"); 200 $conn->send ("reply d");
196 destroy_query_dialog $conn; 201 destroy_query_dialog $conn;
202 0
197 }, 203 },
198 ); 204 );
199 205
200 unshift @dialog, new CFClient::UI::Label 206 unshift @dialog, new CFClient::UI::Label
201 max_w => $::WIDTH * 0.4, 207 max_w => $::WIDTH * 0.4,
231 $table->add (0, 0, new CFClient::UI::Button 237 $table->add (0, 0, new CFClient::UI::Button
232 text => "Roll Again", 238 text => "Roll Again",
233 on_activate => sub { 239 on_activate => sub {
234 $conn->send ("reply y"); 240 $conn->send ("reply y");
235 destroy_query_dialog $conn; 241 destroy_query_dialog $conn;
242 0
236 }, 243 },
237 ); 244 );
238 245
239 # center: swap stats 246 # center: swap stats
240 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox 247 my ($sw1, $sw2) = map +(new CFClient::UI::Combobox
254 text => "Swap Stats", 261 text => "Swap Stats",
255 on_activate => sub { 262 on_activate => sub {
256 $conn->{stat_change_with} = $sw2->{value}; 263 $conn->{stat_change_with} = $sw2->{value};
257 $conn->send ("reply $sw1->{value}"); 264 $conn->send ("reply $sw1->{value}");
258 destroy_query_dialog $conn; 265 destroy_query_dialog $conn;
266 0
259 }, 267 },
260 ); 268 );
261 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]); 269 $table->add (2, 1, new CFClient::UI::HBox children => [$sw1, $sw2]);
262 270
263 # right: accept 271 # right: accept
265 text => "Accept", 273 text => "Accept",
266 on_activate => sub { 274 on_activate => sub {
267 $conn->send ("reply n"); 275 $conn->send ("reply n");
268 $STATS_WINDOW->hide; 276 $STATS_WINDOW->hide;
269 destroy_query_dialog $conn; 277 destroy_query_dialog $conn;
278 0
270 }, 279 },
271 ); 280 );
272 281
273 unshift @dialog, new CFClient::UI::Label 282 unshift @dialog, new CFClient::UI::Label
274 max_w => $::WIDTH * 0.4, 283 max_w => $::WIDTH * 0.4,
284 293
285 push @dialog, my $entry = new CFClient::UI::Entry 294 push @dialog, my $entry = new CFClient::UI::Entry
286 on_changed => sub { 295 on_changed => sub {
287 $conn->send ("reply $_[1]"); 296 $conn->send ("reply $_[1]");
288 destroy_query_dialog $conn; 297 destroy_query_dialog $conn;
298 0
289 }, 299 },
290 ; 300 ;
291 301
292 $entry->focus_in; 302 $entry->grab_focus;
293 303
294 } else { 304 } else {
295 $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)";
296 306
297 push @dialog, my $entry = new CFClient::UI::Entry 307 push @dialog, my $entry = new CFClient::UI::Entry
298 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (), 308 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
299 on_activate => sub { 309 on_activate => sub {
300 $conn->send ("reply $_[1]"); 310 $conn->send ("reply $_[1]");
301 destroy_query_dialog $conn; 311 destroy_query_dialog $conn;
312 0
302 }, 313 },
303 ; 314 ;
304 315
305 $entry->focus_in; 316 $entry->grab_focus;
306 } 317 }
307 318
308 $vbox->add (@dialog); 319 $vbox->add (@dialog);
309 $dialog->show; 320 $dialog->show;
310} 321}
315 $LOGIN_BUTTON->set_text ("Logout"); 326 $LOGIN_BUTTON->set_text ("Logout");
316 $SETUP_DIALOG->hide; 327 $SETUP_DIALOG->hide;
317 328
318 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;
319 330
320 my ($host, $port) = split /:/, $CFG->{host}; 331 my ($host, $port) = split /:/, $CFG->{profile}{default}{host};
321 332
322 $MAP = new CFClient::Map $mapsize, $mapsize; 333 $MAP = new CFClient::Map $mapsize, $mapsize;
323 334
324 $CONN = eval { 335 $CONN = eval {
325 new CFClient::Protocol 336 new CFClient::Protocol
326 host => $host, 337 host => $host,
327 port => $port || 13327, 338 port => $port || 13327,
328 user => $CFG->{user}, 339 user => $CFG->{profile}{default}{user},
329 pass => $CFG->{password}, 340 pass => $CFG->{profile}{default}{password},
330 mapw => $mapsize, 341 mapw => $mapsize,
331 maph => $mapsize, 342 maph => $mapsize,
332 343
333 map_widget => $MAPWIDGET, 344 map_widget => $MAPWIDGET,
334 logview => $LOGVIEW, 345 logview => $LOGVIEW,
372 status "connection closed"; 383 status "connection closed";
373 384
374 destroy_query_dialog $CONN; 385 destroy_query_dialog $CONN;
375 $CONN->destroy; 386 $CONN->destroy;
376 $CONN = 0; # false, does not autovivify 387 $CONN = 0; # false, does not autovivify
388
389 undef $MAP;
377} 390}
378 391
379sub graphics_setup { 392sub graphics_setup {
380 my $vbox = new CFClient::UI::VBox; 393 my $vbox = new CFClient::UI::VBox;
381 394
399 412
400 $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");
401 $table->add (1, $row++, new CFClient::UI::CheckBox 414 $table->add (1, $row++, new CFClient::UI::CheckBox
402 state => $CFG->{fullscreen}, 415 state => $CFG->{fullscreen},
403 tooltip => "Bring the client into fullscreen mode.", 416 tooltip => "Bring the client into fullscreen mode.",
404 on_changed => sub { 417 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
405 my ($self, $value) = @_;
406 $CFG->{fullscreen} = $value;
407 }
408 ); 418 );
409 419
410 $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");
411 $table->add (1, $row++, new CFClient::UI::CheckBox 421 $table->add (1, $row++, new CFClient::UI::CheckBox
412 state => $CFG->{fast}, 422 state => $CFG->{fast},
413 tooltip => "Lower the visual quality considerably to speed up rendering.", 423 tooltip => "Lower the visual quality considerably to speed up rendering.",
414 on_changed => sub { 424 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
415 my ($self, $value) = @_;
416 $CFG->{fast} = $value;
417 }
418 ); 425 );
419 426
420 $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");
421 $table->add (1, $row++, new CFClient::UI::Slider 428 $table->add (1, $row++, new CFClient::UI::Slider
422 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 429 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
423 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 430 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
424 on_changed => sub { 431 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
425 my ($self, $value) = @_;
426 $CFG->{map_scale} = 2 ** $value;
427 }
428 ); 432 );
429 433
430 $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");
431 $table->add (1, $row++, new CFClient::UI::CheckBox 435 $table->add (1, $row++, new CFClient::UI::CheckBox
432 state => $CFG->{fow_enable}, 436 state => $CFG->{fow_enable},
433 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.",
434 on_changed => sub { 438 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
435 my ($self, $value) = @_;
436 $CFG->{fow_enable} = $value;
437 }
438 ); 439 );
439 440
440 $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");
441 $table->add (1, $row++, new CFClient::UI::Slider 442 $table->add (1, $row++, new CFClient::UI::Slider
442 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 443 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
443 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.",
444 on_changed => sub { 445 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 }
445 my ($self, $value) = @_;
446 $CFG->{fow_intensity} = $value;
447 }
448 ); 446 );
449 447
450 $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");
451 $table->add (1, $row++, new CFClient::UI::CheckBox 449 $table->add (1, $row++, new CFClient::UI::CheckBox
452 state => $CFG->{fow_smooth}, 450 state => $CFG->{fow_smooth},
453 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.",
454 on_changed => sub { 452 on_changed => sub {
455 my ($self, $value) = @_; 453 my ($self, $value) = @_;
456 $CFG->{fow_smooth} = $value; 454 $CFG->{fow_smooth} = $value;
457 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
458 } 457 }
459 ); 458 );
460 459
461 $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");
462 $table->add (1, $row++, new CFClient::UI::Slider 461 $table->add (1, $row++, new CFClient::UI::Slider
463 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 462 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
464 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.",
465 on_changed => sub { $CFG->{gui_fontsize} = $_[1] }, 464 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 },
466 ); 465 );
467 466
468 $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");
469 $table->add (1, $row++, new CFClient::UI::Slider 468 $table->add (1, $row++, new CFClient::UI::Slider
470 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 469 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
471 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.",
472 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]) }, 471 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
473 ); 472 );
474 473
475 $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");
476 475
477 $table->add (1, $row++, new CFClient::UI::Slider 476 $table->add (1, $row++, new CFClient::UI::Slider
478 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1], 477 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1],
479 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.",
480 on_changed => sub { 479 on_changed => sub {
481 $CFG->{stat_fontsize} = $_[1]; 480 $CFG->{stat_fontsize} = $_[1];
482 &set_stats_window_fontsize; 481 &set_stats_window_fontsize;
482 0
483 } 483 }
484 ); 484 );
485 485
486 $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");
487 $table->add (1, $row++, new CFClient::UI::Slider 487 $table->add (1, $row++, new CFClient::UI::Slider
488 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 488 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
489 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.",
490 on_changed => sub { 490 on_changed => sub {
491 $CFG->{gauge_fontsize} = $_[1]; 491 $CFG->{gauge_fontsize} = $_[1];
492 &set_gauge_window_fontsize; 492 &set_gauge_window_fontsize;
493 0
493 } 494 }
494 ); 495 );
495 496
496 $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");
497 $table->add (1, $row++, new CFClient::UI::Slider 498 $table->add (1, $row++, new CFClient::UI::Slider
498 range => [$CFG->{gauge_size}, 0.2, 0.8], 499 range => [$CFG->{gauge_size}, 0.2, 0.8],
499 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.",
500 on_changed => sub { 501 on_changed => sub {
501 $CFG->{gauge_size} = $_[1]; 502 $CFG->{gauge_size} = $_[1];
502 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 503 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
504 0
503 } 505 }
504 ); 506 );
505 507
506 $table->add (1, $row++, new CFClient::UI::Button 508 $table->add (1, $row++, new CFClient::UI::Button
507 expand => 1, align => 0, text => "Apply", 509 expand => 1, align => 0, text => "Apply",
508 tooltip => "Apply the video settings", 510 tooltip => "Apply the video settings",
509 on_activate => sub { 511 on_activate => sub {
510 video_shutdown (); 512 video_shutdown ();
511 video_init (); 513 video_init ();
514 0
512 } 515 }
513 ); 516 );
514 517
515 $vbox 518 $vbox
516} 519}
524 527
525 $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");
526 $table->add (1, $row++, new CFClient::UI::CheckBox 529 $table->add (1, $row++, new CFClient::UI::CheckBox
527 state => $CFG->{audio_enable}, 530 state => $CFG->{audio_enable},
528 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.",
529 on_changed => sub { 532 on_changed => sub { $CFG->{audio_enable} = $_[1]; 0 }
530 $CFG->{audio_enable} = $_[1];
531 }
532 ); 533 );
533# $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");
534# $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 {
535# $CFG->{effects_volume} = $_[1]; 536# $CFG->{effects_volume} = $_[1];
536# }); 537# });
537 $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");
538 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox); 539 $table->add (1, $row++, my $hbox = new CFClient::UI::HBox);
539 $hbox->add (new CFClient::UI::CheckBox 540 $hbox->add (new CFClient::UI::CheckBox
540 expand => 1, state => $CFG->{bgm_enable}, 541 expand => 1, state => $CFG->{bgm_enable},
541 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.",
542 on_changed => sub { 543 on_changed => sub { $CFG->{bgm_enable} = $_[1]; 0 }
543 $CFG->{bgm_enable} = $_[1];
544 }
545 ); 544 );
546 $hbox->add (new CFClient::UI::Slider 545 $hbox->add (new CFClient::UI::Slider
547 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 546 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
548 tooltip => "The volume of the background music. Changes are instant.", 547 tooltip => "The volume of the background music. Changes are instant.",
549 on_changed => sub { 548 on_changed => sub { $CFG->{bgm_volume} = $_[1]; CFClient::MixMusic::volume $_[1] * 128; 0 }
550 $CFG->{bgm_volume} = $_[1];
551 CFClient::MixMusic::volume $_[1] * 128;
552 }
553 ); 549 );
554 550
555 $table->add (1, $row++, new CFClient::UI::Button 551 $table->add (1, $row++, new CFClient::UI::Button
556 expand => 1, align => 0, text => "Apply", 552 expand => 1, align => 0, text => "Apply",
557 tooltip => "Apply the audio settings", 553 tooltip => "Apply the audio settings",
558 on_activate => sub { 554 on_activate => sub {
559 audio_shutdown (); 555 audio_shutdown ();
560 audio_init (); 556 audio_init ();
557 0
561 } 558 }
562 ); 559 );
563 560
564 $vbox 561 $vbox
565} 562}
631 628
632sub debug_setup { 629sub debug_setup {
633 my $table = new CFClient::UI::Table; 630 my $table = new CFClient::UI::Table;
634 631
635 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders"); 632 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders");
636 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1 }); 633 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 });
637 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info"); 634 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info");
638 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2 }); 635 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
639 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS"); 636 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS");
640 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4 }); 637 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
641 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips"); 638 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips");
642 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8 }); 639 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
643 640
644 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05); 641 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
645 642
646 for my $x (0..2) { 643 for my $x (0..2) {
647 for my $y (0 .. 2) { 644 for my $y (0 .. 2) {
660sub stats_window { 657sub stats_window {
661 my $tgw = new CFClient::UI::FancyFrame 658 my $tgw = new CFClient::UI::FancyFrame
662 y => $HEIGHT * (2/8), 659 y => $HEIGHT * (2/8),
663 x => "max", 660 x => "max",
664 title => "Stats", 661 title => "Stats",
665 name => "stats_window"; 662 name => "stats_window",
663 has_close_button => 1;
666 664
667 $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);
668 $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,
669 can_hover => 1, can_events => 1, 667 can_hover => 1, can_events => 1,
670 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.");
752 ); 750 );
753 $tbl2->add ($col + 1, $row, new CFClient::UI::Image 751 $tbl2->add ($col + 1, $row, new CFClient::UI::Image
754 font => $FONT_FIXED, 752 font => $FONT_FIXED,
755 can_hover => 1, 753 can_hover => 1,
756 can_events => 1, 754 can_events => 1,
757 image => "ui/resist/resist_$_.png", 755 path => "ui/resist/resist_$_.png",
758 tooltip => $resist_names{$_}, 756 tooltip => $resist_names{$_},
759 ); 757 );
760 758
761 $row++; 759 $row++;
762 if ($row % 6 == 0) { 760 if ($row % 6 == 0) {
844} 842}
845 843
846my $METASERVER_ATIME; 844my $METASERVER_ATIME;
847 845
848sub update_metaserver { 846sub update_metaserver {
847 my ($metaserver_dialog) = @_;
848
849 $METASERVER = $metaserver_dialog
850 if defined $metaserver_dialog;
851
849 return if $METASERVER_ATIME > time; 852 return if $METASERVER_ATIME > time;
850 $METASERVER_ATIME = time + 60; 853 $METASERVER_ATIME = time + 60;
851 854
852 my $table = $METASERVER->{table}; 855 my $table = $METASERVER->{table};
853 $table->clear; 856 $table->clear;
918 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [ 921 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [
919 (new CFClient::UI::Button 922 (new CFClient::UI::Button
920 text => "Use", 923 text => "Use",
921 tooltip => "Put this server into the <b>Host:Port</b> field", 924 tooltip => "Put this server into the <b>Host:Port</b> field",
922 on_activate => sub { 925 on_activate => sub {
923 $HOST_ENTRY->set_text ($CFG->{host} = $host); 926 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host);
924 $METASERVER->hide; 927 $METASERVER->hide;
928 0
925 }, 929 },
926 ), 930 ),
927 (new CFClient::UI::Empty expand => 1), 931 (new CFClient::UI::Empty expand => 1),
928 ]); 932 ]);
929 933
940 } 944 }
941 }); 945 });
942} 946}
943 947
944sub metaserver_dialog { 948sub metaserver_dialog {
949 my $vbox = new CFClient::UI::VBox;
950 my $table = new CFClient::UI::Table;
951 $vbox->add (new CFClient::UI::ScrolledWindow expand => 1, child => $table);
952
945 my $dialog = new CFClient::UI::FancyFrame 953 my $dialog = new CFClient::UI::FancyFrame
946 title => "Server List", 954 title => "Server List",
947 name => 'metaserver_dialog', 955 name => 'metaserver_dialog',
948 x => 'center', 956 x => 'center',
949 y => 'center', 957 y => 'center',
950 z => 3, 958 z => 3,
951 force_h => $::HEIGHT * 0.4, 959 force_h => $::HEIGHT * 0.4,
952 child => (my $vbox = new CFClient::UI::VBox), 960 child => $vbox,
961 has_close_button => 1,
962 table => $table,
953 on_visibility_change => sub { 963 on_visibility_change => sub {
954 update_metaserver if $_[1]; 964 update_metaserver ($_[0]) if $_[1];
965 0
955 }, 966 },
956 ; 967 ;
957
958 $dialog->{table} = new CFClient::UI::Table;
959
960 $vbox->add (new CFClient::UI::ScrolledWindow expand => 1, child => $dialog->{table});
961 968
962 $dialog 969 $dialog
963} 970}
964 971
965sub server_setup { 972sub server_setup {
972 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 979 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
973 980
974 $vbox->add ( 981 $vbox->add (
975 $HOST_ENTRY = new CFClient::UI::Entry 982 $HOST_ENTRY = new CFClient::UI::Entry
976 expand => 1, 983 expand => 1,
977 text => $CFG->{host}, 984 text => $CFG->{profile}{default}{host},
978 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to", 985 tooltip => "The hostname or ip address of the Crossfire(+) server to connect to",
979 on_changed => sub { 986 on_changed => sub {
980 my ($self, $value) = @_; 987 my ($self, $value) = @_;
981 $CFG->{host} = $value; 988 $CFG->{profile}{default}{host} = $value;
989 0
982 } 990 }
983 ); 991 );
984
985 $METASERVER = metaserver_dialog;
986 992
987 $vbox->add (new CFClient::UI::Button 993 $vbox->add (new CFClient::UI::Button
988 expand => 1, 994 expand => 1,
989 text => "Server List", 995 text => "Server List",
990 other => $METASERVER, 996 other => $METASERVER,
991 tooltip => "Show a list of available crossfire servers", 997 tooltip => "Show a list of available crossfire servers",
992 on_activate => sub { $METASERVER->toggle_visibility }, 998 on_activate => sub { $METASERVER->toggle_visibility; 0 },
993 on_visibility_change => sub { $METASERVER->hide unless $_[1] }, 999 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 0 },
994 ); 1000 );
995 } 1001 }
996 1002
997 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username"); 1003 $table->add (0, 4, new CFClient::UI::Label valign => 0, align => 1, text => "Username");
998 $table->add (1, 4, new CFClient::UI::Entry 1004 $table->add (1, 4, new CFClient::UI::Entry
999 text => $CFG->{user}, 1005 text => $CFG->{profile}{default}{user},
1000 tooltip => "The name of your character on the server", 1006 tooltip => "The name of your character on the server",
1001 on_changed => sub { 1007 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value }
1002 my ($self, $value) = @_;
1003 $CFG->{user} = $value;
1004 }
1005 ); 1008 );
1006 1009
1007 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password"); 1010 $table->add (0, 5, new CFClient::UI::Label valign => 0, align => 1, text => "Password");
1008 $table->add (1, 5, new CFClient::UI::Entry 1011 $table->add (1, 5, new CFClient::UI::Entry
1009 text => $CFG->{password}, 1012 text => $CFG->{profile}{default}{password},
1010 hidden => 1, 1013 hidden => 1,
1011 tooltip => "The password for your character", 1014 tooltip => "The password for your character",
1012 on_changed => sub { 1015 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value }
1013 my ($self, $value) = @_;
1014 $CFG->{password} = $value;
1015 }
1016 ); 1016 );
1017 1017
1018 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size"); 1018 $table->add (0, 7, new CFClient::UI::Label valign => 0, align => 1, text => "Map Size");
1019 $table->add (1, 7, new CFClient::UI::Slider 1019 $table->add (1, 7, new CFClient::UI::Slider
1020 force_w => 100, 1020 force_w => 100,
1021 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1021 range => [$CFG->{mapsize}, 10, 100, 0, 1],
1022 tooltip => "This is the size of the portion of the map update the server sends you. " 1022 tooltip => "This is the size of the portion of the map update the server sends you. "
1023 . "If you set this to a high value you will be able to see further, " 1023 . "If you set this to a high value you will be able to see further, "
1024 . "but you also increase bandwidth requirements and latency. " 1024 . "but you also increase bandwidth requirements and latency. "
1025 . "This option is only used once at log-in.", 1025 . "This option is only used once at log-in.",
1026 on_changed => sub { 1026 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 0 },
1027 my ($self, $value) = @_;
1028
1029 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
1030 },
1031 ); 1027 );
1032 1028
1033 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch"); 1029 $table->add (0, 8, new CFClient::UI::Label valign => 0, align => 1, text => "Face Prefetch");
1034 $table->add (1, 8, new CFClient::UI::CheckBox 1030 $table->add (1, 8, new CFClient::UI::CheckBox
1035 state => $CFG->{face_prefetch}, 1031 state => $CFG->{face_prefetch},
1038 . "This might increase or create lag, but increases the chances " 1034 . "This might increase or create lag, but increases the chances "
1039 . "of faces being ready for display when you encounter them. " 1035 . "of faces being ready for display when you encounter them. "
1040 . "It also uses up server bandwidth on every connect, " 1036 . "It also uses up server bandwidth on every connect, "
1041 . "so only set it if you really need to prefetch images. " 1037 . "so only set it if you really need to prefetch images. "
1042 . "This option can be set and unset any time.", 1038 . "This option can be set and unset any time.",
1043 on_changed => sub { $CFG->{face_prefetch} = $_[1] }, 1039 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 },
1044 ); 1040 );
1045 1041
1046 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count"); 1042 $table->add (0, 9, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Count");
1047 $table->add (1, 9, new CFClient::UI::Entry 1043 $table->add (1, 9, new CFClient::UI::Entry
1048 text => $CFG->{output_count}, 1044 text => $CFG->{output_count},
1049 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.",
1050 on_changed => sub { $CFG->{output_count} = $_[1] }, 1046 on_changed => sub { $CFG->{output_count} = $_[1]; 0 },
1051 ); 1047 );
1052 1048
1053 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync"); 1049 $table->add (0, 10, new CFClient::UI::Label valign => 0, align => 1, text => "Output-Sync");
1054 $table->add (1, 10, new CFClient::UI::Entry 1050 $table->add (1, 10, new CFClient::UI::Entry
1055 text => $CFG->{output_sync}, 1051 text => $CFG->{output_sync},
1056 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.", 1052 tooltip => "Should be set to 1 unless you know what you are doing. This option is only used once at log-in.",
1057 on_changed => sub { $CFG->{output_sync} = $_[1] }, 1053 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 },
1058 ); 1054 );
1059 1055
1060 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 1056 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
1061 expand => 1, 1057 expand => 1,
1062 align => 0, 1058 align => 0,
1063 text => "Login", 1059 text => "Login",
1064 on_activate => sub { 1060 on_activate => sub {
1065 $CONN ? stop_game 1061 $CONN ? stop_game
1066 : start_game; 1062 : start_game;
1063 0
1067 }, 1064 },
1068 ); 1065 );
1069 1066
1070 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command"); 1067 $table->add (0, 12, new CFClient::UI::Label valign => 0, align => 1, text => "Chat Command");
1071 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry 1068 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
1074 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1071 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1075 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1072 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1076 on_changed => sub { 1073 on_changed => sub {
1077 my ($self, $value) = @_; 1074 my ($self, $value) = @_;
1078 $CFG->{say_command} = $value; 1075 $CFG->{say_command} = $value;
1076 0
1079 } 1077 }
1080 ); 1078 );
1081 1079
1082 $vbox->add (new CFClient::UI::Label 1080 $vbox->add (new CFClient::UI::Label
1083 text => "Server Info", 1081 text => "Server Info",
1099 bg => [0, 0, 0, 0.75], 1097 bg => [0, 0, 0, 0.75],
1100 x => "max", 1098 x => "max",
1101 y => 0, 1099 y => 0,
1102 force_w => $::WIDTH * 0.4, 1100 force_w => $::WIDTH * 0.4,
1103 force_h => $::HEIGHT * 0.5, 1101 force_h => $::HEIGHT * 0.5,
1104 child => (my $vbox = new CFClient::UI::VBox); 1102 child => (my $vbox = new CFClient::UI::VBox),
1103 has_close_button => 1;
1105 1104
1106 $vbox->add ($LOGVIEW); 1105 $vbox->add ($LOGVIEW);
1107 1106
1108 $vbox->add (my $input = new CFClient::UI::Entry 1107 $vbox->add (my $input = new CFClient::UI::Entry
1109 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> " 1108 tooltip => "<b>Chat Box</b>. If you enter a text and press return/enter here, the current <i>communication command</i> "
1117 1116
1118 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 1117 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
1119 $input->{refocus_map} = 1; 1118 $input->{refocus_map} = 1;
1120 } 1119 }
1121 delete $input->{auto_activated}; 1120 delete $input->{auto_activated};
1121
1122 0
1122 }, 1123 },
1123 on_activate => sub { 1124 on_activate => sub {
1124 my ($input, $text) = @_; 1125 my ($input, $text) = @_;
1125 $input->set_text (''); 1126 $input->set_text ('');
1126 1127
1132 } 1133 }
1133 if ($input->{refocus_map}) { 1134 if ($input->{refocus_map}) {
1134 delete $input->{refocus_map}; 1135 delete $input->{refocus_map};
1135 $MAPWIDGET->focus_in 1136 $MAPWIDGET->focus_in
1136 } 1137 }
1138
1139 0
1137 }, 1140 },
1138 on_escape => sub { 1141 on_escape => sub {
1139 $MAPWIDGET->focus_in 1142 $MAPWIDGET->grab_focus;
1143
1144 0
1140 }, 1145 },
1141 ); 1146 );
1142 1147
1143 $CONSOLE = { 1148 $CONSOLE = {
1144 window => $window, 1149 window => $window,
1166 ); 1171 );
1167 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 1172 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
1168 $hb->add (new CFClient::UI::Button 1173 $hb->add (new CFClient::UI::Button
1169 text => "Ok", 1174 text => "Ok",
1170 expand => 1, 1175 expand => 1,
1171 on_activate => sub { $QUIT_DIALOG->hide }, 1176 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1172 ); 1177 );
1173 $hb->add (new CFClient::UI::Button 1178 $hb->add (new CFClient::UI::Button
1174 text => "Quit anyway", 1179 text => "Quit anyway",
1175 expand => 1, 1180 expand => 1,
1176 on_activate => sub { exit }, 1181 on_activate => sub { exit },
1243 $::CFG->{pickup} &= ~$mask; 1248 $::CFG->{pickup} &= ~$mask;
1244 } 1249 }
1245 1250
1246 $::CONN->send_command ("pickup $::CFG->{pickup}") 1251 $::CONN->send_command ("pickup $::CFG->{pickup}")
1247 if defined $::CONN; 1252 if defined $::CONN;
1253
1254 0
1248 }); 1255 });
1249 } 1256 }
1250 } 1257 }
1251 1258
1252 $table->add (2, 18, new CFClient::UI::ValSlider 1259 $table->add (2, 18, new CFClient::UI::ValSlider
1263 $table->add (3, 18, new CFClient::UI::Button 1270 $table->add (3, 18, new CFClient::UI::Button
1264 text => "set", 1271 text => "set",
1265 on_activate => sub { 1272 on_activate => sub {
1266 $::CONN->send_command ("pickup $::CFG->{pickup}") 1273 $::CONN->send_command ("pickup $::CFG->{pickup}")
1267 if defined $::CONN; 1274 if defined $::CONN;
1268 1; 1275 0
1269 }); 1276 });
1270 1277
1271 $table 1278 $table
1272} 1279}
1273 1280
1276 x => "center", 1283 x => "center",
1277 y => "center", 1284 y => "center",
1278 force_w => $WIDTH * 9/10, 1285 force_w => $WIDTH * 9/10,
1279 force_h => $HEIGHT * 9/10, 1286 force_h => $HEIGHT * 9/10,
1280 title => "Inventory", 1287 title => "Inventory",
1288 name => "inventory_window",
1289 has_close_button => 1,
1281 ; 1290 ;
1282 1291
1283 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); 1292 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
1284 1293
1285 $hb->add (my $vb1 = new CFClient::UI::VBox); 1294 $hb->add (my $vb1 = new CFClient::UI::VBox);
1300 1309
1301sub spell_setup { 1310sub spell_setup {
1302 new CFClient::UI::SpellList 1311 new CFClient::UI::SpellList
1303} 1312}
1304 1313
1314sub update_bindings {
1315 $BIND_UPD_CB->() if $BIND_UPD_CB;
1316}
1317
1305sub keyboard_setup { 1318sub keyboard_setup {
1306 my $binding_list = new CFClient::UI::VBox; 1319 my $binding_list = new CFClient::UI::VBox;
1307 1320
1308 my $refresh; 1321 my $refresh;
1309 $refresh = sub { 1322 $refresh = $BIND_UPD_CB = sub {
1310 $binding_list->clear (); 1323 $binding_list->clear ();
1311 1324
1312 for my $mod (keys %{$::CFG->{bindings}}) { 1325 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) {
1313 for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { 1326 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) {
1314 my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; 1327 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1315 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1328 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1316 1329
1317 my $lbl = join "; ", @$cmds; 1330 my $lbl = join "; ", @$cmds;
1318 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); 1331 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym);
1319 $binding_list->add (my $hb = new CFClient::UI::HBox); 1332 $binding_list->add (my $hb = new CFClient::UI::HBox);
1320 $hb->add (new CFClient::UI::Button 1333 $hb->add (new CFClient::UI::Button
1321 text => "delete", 1334 text => "delete",
1322 tooltip => "Deletes the binding", 1335 tooltip => "Deletes the binding",
1323 on_activate => sub { 1336 on_activate => sub {
1324 $binding_list->remove ($hb); 1337 $binding_list->remove ($hb);
1325 delete $::CFG->{bindings}->{$mod}->{$sym}; 1338 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1339 0
1326 }); 1340 });
1327 1341
1328 $hb->add (new CFClient::UI::Button 1342 $hb->add (new CFClient::UI::Button
1329 text => "edit", 1343 text => "edit",
1330 tooltip => "Edits the binding", 1344 tooltip => "Edits the binding",
1331 on_activate => sub { 1345 on_activate => sub {
1332 $::BIND_EDITOR->set_binding ( 1346 $::BIND_EDITOR->set_binding (
1333 $mod, $sym, $::CFG->{bindings}->{$mod}->{$sym}, 1347 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym},
1334 sub { 1348 sub {
1335 my ($nmod, $nsym, $ncmds) = @_; 1349 my ($nmod, $nsym, $ncmds) = @_;
1336 delete $::CFG->{bindings}->{$mod}->{$sym}; 1350 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1337 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1351 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1338 $refresh->(); 1352 $refresh->();
1339 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1353 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1340 $SETUP_DIALOG->show; 1354 $SETUP_DIALOG->show;
1341 }, 1355 },
1342 sub { 1356 sub {
1343 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1357 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1344 $SETUP_DIALOG->show; 1358 $SETUP_DIALOG->show;
1345 }); 1359 });
1346 $::BIND_EDITOR->show; 1360 $::BIND_EDITOR->show;
1347 $SETUP_DIALOG->hide; 1361 $SETUP_DIALOG->hide;
1362 0
1348 }); 1363 });
1349 1364
1350 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1365 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1351 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1366 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1352 } 1367 }
1361 state => $CFG->{shift_fire_stop}, 1376 state => $CFG->{shift_fire_stop},
1362 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift", 1377 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift",
1363 on_changed => sub { 1378 on_changed => sub {
1364 my ($cbox, $value) = @_; 1379 my ($cbox, $value) = @_;
1365 $CFG->{shift_fire_stop} = $value; 1380 $CFG->{shift_fire_stop} = $value;
1381 0
1366 }); 1382 });
1367 1383
1368 $vb->add ($binding_list); 1384 $vb->add ($binding_list);
1369 $vb->add (my $hb = new CFClient::UI::HBox); 1385 $vb->add (my $hb = new CFClient::UI::HBox);
1370 1386
1374 tooltip => "This button opens the binding editor with an empty binding.", 1390 tooltip => "This button opens the binding editor with an empty binding.",
1375 on_activate => sub { 1391 on_activate => sub {
1376 $::BIND_EDITOR->set_binding (undef, undef, [], 1392 $::BIND_EDITOR->set_binding (undef, undef, [],
1377 sub { 1393 sub {
1378 my ($mod, $sym, $cmds) = @_; 1394 my ($mod, $sym, $cmds) = @_;
1379 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1395 $::BIND_EDITOR->cfg_bind ($mod, $sym, $cmds);
1380 $refresh->(); 1396 $refresh->();
1381 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1397 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1382 $SETUP_DIALOG->show; 1398 $SETUP_DIALOG->show;
1383 }, 1399 },
1384 sub { 1400 sub {
1386 $SETUP_DIALOG->show; 1402 $SETUP_DIALOG->show;
1387 }, 1403 },
1388 ); 1404 );
1389 $SETUP_DIALOG->hide; 1405 $SETUP_DIALOG->hide;
1390 $::BIND_EDITOR->show; 1406 $::BIND_EDITOR->show;
1407 0
1391 }, 1408 },
1392 ); 1409 );
1393 1410
1394 $hb->add (new CFClient::UI::Button 1411 $hb->add (new CFClient::UI::Button
1395 text => "close", 1412 text => "close",
1396 tooltip => "Closes the binding window", 1413 tooltip => "Closes the binding window",
1397 expand => 1, 1414 expand => 1,
1398 on_activate => sub { 1415 on_activate => sub {
1399 $SETUP_DIALOG->hide; 1416 $SETUP_DIALOG->hide;
1417 0
1400 } 1418 }
1401 ); 1419 );
1402 1420
1403 $refresh->(); 1421 $refresh->();
1404 1422
1424 $buttons->add (new CFClient::UI::Label text => "Choose a document to display: "); 1442 $buttons->add (new CFClient::UI::Label text => "Choose a document to display: ");
1425 $buttons->add (my $combo = new CFClient::UI::Combobox 1443 $buttons->add (my $combo = new CFClient::UI::Combobox
1426 value => undef, 1444 value => undef,
1427 options => [ 1445 options => [
1428 [intro => "Introduction"], 1446 [intro => "Introduction"],
1429 [manual => "Manual"], 1447 [manual => "Main Manual"],
1430 [skill_help => "Skills"], 1448 [skill_help => "Skill Reference"],
1431 [command_help => "Commands"], 1449 [command_help => "Command Reference"],
1432 [dmcommand_help => "DM Commands"], 1450 [dmcommand_help => "DM Commands"],
1433 [COPYING => "License Terms"], 1451 [COPYING => "License Terms"],
1434 ], 1452 ],
1435 on_changed => sub { 1453 on_changed => sub {
1436 my ($self, $pod) = @_; 1454 my ($self, $pod) = @_;
1437 1455
1438 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", 1456 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1439 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; 1457 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1440 1458
1441 $viewer->clear; 1459 $viewer->clear;
1460
1461# $viewer->add_paragraph ([1, 1, 1, 1], ["<big>Test</big>\n\n \x{fffc} \x{fffc}\n",
1462# (new CFClient::UI::Image path => "x.png", can_hover => 1, can_events => 1),
1463# (new CFClient::UI::Label text => "üüüü", can_hover => 1, can_events => 1, tooltip => "??"),
1464# ]);#d#
1442 1465
1443 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1466 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1444 for @$pom; 1467 for @$pom;
1445 1468
1446 $viewer->set_offset (0); 1469 $viewer->set_offset (0);
1470
1471 0
1447 }, 1472 },
1448 on_visibility_change => sub { 1473 on_visibility_change => sub {
1449 my ($self, $visible) = @_; 1474 my ($self, $visible) = @_;
1450 return unless $visible; 1475 return unless $visible;
1451 return if $self->{value}; 1476 return if $self->{value};
1452 $self->set_value ("intro"); 1477 $self->set_value ("intro");
1478 0
1453 }, 1479 },
1454 ); 1480 );
1455 1481
1456 $win 1482 $win
1457} 1483}
1496 z => 100, 1522 z => 100,
1497 force_x => "max", 1523 force_x => "max",
1498 force_y => 0; 1524 force_y => 0;
1499 $DEBUG_STATUS->show; 1525 $DEBUG_STATUS->show;
1500 1526
1501 $BIND_EDITOR = new CFClient::UI::BindEditor (x => "max", y => 0); 1527 $BIND_EDITOR = new CFClient::BindingEditor (x => "max", y => 0);
1502 1528
1503 $STATUSBOX = new CFClient::UI::Statusbox; 1529 $STATUSBOX = new CFClient::UI::Statusbox;
1504 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]); 1530 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
1505 1531
1506 (new CFClient::UI::Frame 1532 (new CFClient::UI::Frame
1515 name => "mapmap", 1541 name => "mapmap",
1516 x => 0, 1542 x => 0,
1517 y => $FONTSIZE + 8, 1543 y => $FONTSIZE + 8,
1518 border_bg => [1, 1, 1, 192/255], 1544 border_bg => [1, 1, 1, 192/255],
1519 bg => [1, 1, 1, 0], 1545 bg => [1, 1, 1, 0],
1520 no_close_button => 1,
1521 child => ($MAPMAP = new CFClient::MapWidget::MapMap 1546 child => ($MAPMAP = new CFClient::MapWidget::MapMap
1522 tooltip => "<b>Map</b>. On servers that support this feature, this will display an overview of the surrounding areas.", 1547 tooltip => "<b>Map</b>. On servers that support this feature, this will display an overview of the surrounding areas.",
1523 ), 1548 ),
1524 )->show; 1549 )->show;
1525 1550
1527 $MAPWIDGET->connect (activate_console => sub { 1552 $MAPWIDGET->connect (activate_console => sub {
1528 my ($mapwidget, $preset) = @_; 1553 my ($mapwidget, $preset) = @_;
1529 1554
1530 if ($CONSOLE) { 1555 if ($CONSOLE) {
1531 $CONSOLE->{input}->{auto_activated} = 1; 1556 $CONSOLE->{input}->{auto_activated} = 1;
1532 $CONSOLE->{input}->focus_in; 1557 $CONSOLE->{input}->grab_focus;
1533 1558
1534 if ($preset && $CONSOLE->{input}->get_text eq '') { 1559 if ($preset && $CONSOLE->{input}->get_text eq '') {
1535 $CONSOLE->{input}->set_text ($preset); 1560 $CONSOLE->{input}->set_text ($preset);
1536 } 1561 }
1537 } 1562 }
1538 }); 1563 });
1539 $MAPWIDGET->show; 1564 $MAPWIDGET->show;
1540 $MAPWIDGET->focus_in; 1565 $MAPWIDGET->grab_focus;
1541 1566
1542 $LOGVIEW = new CFClient::UI::TextScroller 1567 $LOGVIEW = new CFClient::UI::TextScroller
1543 expand => 1, 1568 expand => 1,
1544 font => $FONT_FIXED, 1569 font => $FONT_FIXED,
1545 fontsize => $::CFG->{log_fontsize}, 1570 fontsize => $::CFG->{log_fontsize},
1555 x => 'center', 1580 x => 'center',
1556 y => 'center', 1581 y => 'center',
1557 z => 2, 1582 z => 2,
1558 force_w => $::WIDTH * 0.6, 1583 force_w => $::WIDTH * 0.6,
1559 force_h => $::HEIGHT * 0.6, 1584 force_h => $::HEIGHT * 0.6,
1585 has_close_button => 1,
1560 ; 1586 ;
1587
1588 $METASERVER = metaserver_dialog;
1561 1589
1562 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1, 1590 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFClient::UI::Notebook expand => 1, debug => 1,
1563 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); 1591 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1564 1592
1565 $SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup, 1593 $SETUP_NOTEBOOK->add (Server => $SETUP_SERVER = server_setup,
1569 $SETUP_NOTEBOOK->add (Graphics => graphics_setup, 1597 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1570 "Configure the video mode, performance, fonts and other graphical aspects of the game."); 1598 "Configure the video mode, performance, fonts and other graphical aspects of the game.");
1571 $SETUP_NOTEBOOK->add (Audio => audio_setup, 1599 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1572 "Configure the use of audio, sound effects and background music."); 1600 "Configure the use of audio, sound effects and background music.");
1573 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, 1601 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1574 "Lets you define, edit and delete bindings." 1602 "Lets you define, edit and delete key bindings."
1575 . "There is a shortcut for making bindings: <b>Left Control + Insert</b> opens the binding editor " 1603 . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor "
1576 . "with nothing set and the recording started. After doing the actions you " 1604 . "with nothing set and the recording started. After doing the actions you "
1577 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " 1605 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1578 . "After pressing the combo the binding will be saved automatically and the " 1606 . "After pressing the combo the binding will be saved automatically and the "
1579 . "binding editor closes"); 1607 . "binding editor closes");
1580 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, 1608 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1581 "Displays all spells you have and lets you edit keyboard shortcuts for them."); 1609 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1582 $SETUP_NOTEBOOK->add (Debug => debug_setup, 1610 $SETUP_NOTEBOOK->add (Debug => debug_setup,
1583 "Some debuggign options. Do not ask."); 1611 "Some debuggin' options. Do not ask.");
1584 1612
1585 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 1613 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1586 1614
1587 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 1615 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1588 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 1616 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
1603 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1631 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1604 on_activate => sub { 1632 on_activate => sub {
1605 $::CFG->{layout} = CFClient::UI::get_layout; 1633 $::CFG->{layout} = CFClient::UI::get_layout;
1606 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc"; 1634 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc";
1607 status "Configuration Saved"; 1635 status "Configuration Saved";
1636 0
1608 }, 1637 },
1609 ); 1638 );
1610 1639
1611 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window, 1640 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window,
1612 tooltip => "View Documentation"); 1641 tooltip => "View Documentation");
1618 if ($CONN) { 1647 if ($CONN) {
1619 open_quit_dialog; 1648 open_quit_dialog;
1620 } else { 1649 } else {
1621 exit; 1650 exit;
1622 } 1651 }
1652 0
1623 }, 1653 },
1624 ); 1654 );
1625 1655
1626 $BUTTONBAR->show; 1656 $BUTTONBAR->show;
1627 $SETUP_DIALOG->show; 1657 $SETUP_DIALOG->show;
1629 1659
1630 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 1660 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
1631} 1661}
1632 1662
1633sub video_shutdown { 1663sub video_shutdown {
1664 CFClient::OpenGL::shutdown;
1665
1634 undef $SDL_ACTIVE; 1666 undef $SDL_ACTIVE;
1635} 1667}
1636 1668
1637my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d# 1669my @bgmusic = qw(game1.ogg game2.ogg game3.ogg game5.ogg game6.ogg ross1.ogg ross2.ogg ross3.ogg ross4.ogg ross5.ogg); #d#
1638my $bgmusic;#TODO#hack#d# 1670my $bgmusic;#TODO#hack#d#
1854 1886
1855 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1887 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1856 CFClient::UI::set_layout ($::CFG->{layout}); 1888 CFClient::UI::set_layout ($::CFG->{layout});
1857 1889
1858 my %DEF_CFG = ( 1890 my %DEF_CFG = (
1859 sdl_mode => 0, 1891 sdl_mode => 0,
1860 width => 640, 1892 width => 640,
1861 height => 480, 1893 height => 480,
1862 fullscreen => 0, 1894 fullscreen => 0,
1863 fast => 0, 1895 fast => 0,
1864 map_scale => 1, 1896 map_scale => 1,
1865 fow_enable => 1, 1897 fow_enable => 1,
1866 fow_intensity => 0.45, 1898 fow_intensity => 0.45,
1867 fow_smooth => 0, 1899 fow_smooth => 0,
1868 gui_fontsize => 1, 1900 gui_fontsize => 1,
1869 log_fontsize => 0.7, 1901 log_fontsize => 0.7,
1870 gauge_fontsize=> 1, 1902 gauge_fontsize => 1,
1871 gauge_size => 0.35, 1903 gauge_size => 0.35,
1872 stat_fontsize => 0.7, 1904 stat_fontsize => 0.7,
1873 mapsize => 100, 1905 mapsize => 100,
1874 host => "crossfire.schmorp.de",
1875 say_command => 'say', 1906 say_command => 'say',
1876 audio_enable => 1, 1907 audio_enable => 1,
1877 bgm_enable => 1, 1908 bgm_enable => 1,
1878 bgm_volume => 0.25, 1909 bgm_volume => 0.25,
1879 face_prefetch => 0, 1910 face_prefetch => 0,
1880 output_sync => 1, 1911 output_sync => 1,
1881 output_count => 1, 1912 output_count => 1,
1882 pickup => 0, 1913 pickup => 0,
1914 default => "profile", # default profile
1915 );
1883 ); 1916
1884
1885 while (my ($k, $v) = each %DEF_CFG) { 1917 while (my ($k, $v) = each %DEF_CFG) {
1886 $CFG->{$k} = $v unless exists $CFG->{$k}; 1918 $CFG->{$k} = $v unless exists $CFG->{$k};
1887 } 1919 }
1920
1921 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de";
1888 1922
1889 sdl_init; 1923 sdl_init;
1890 1924
1891 @SDL_MODES = reverse 1925 @SDL_MODES = reverse
1892 grep $_->[0] >= 640 && $_->[1] >= 480, 1926 grep $_->[0] >= 640 && $_->[1] >= 480,

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines