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.61 by root, Tue Jun 6 03:05:16 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
240 value => $_, 246 value => $_,
241 options => [ 247 options => [
242 [Str => 1, "Strength ($conn->{stat}{+CS_STAT_STR})"], 248 [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"],
243 [Dex => 2, "Dexterity ($conn->{stat}{+CS_STAT_DEX})"], 249 [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"],
244 [Con => 3, "Constitution ($conn->{stat}{+CS_STAT_CON})"], 250 [3 => "Con", "Constitution ($conn->{stat}{+CS_STAT_CON})"],
245 [Int => 4, "Intelligence ($conn->{stat}{+CS_STAT_INT})"], 251 [4 => "Int", "Intelligence ($conn->{stat}{+CS_STAT_INT})"],
246 [Wis => 5, "Wisdom ($conn->{stat}{+CS_STAT_WIS})"], 252 [5 => "Wis", "Wisdom ($conn->{stat}{+CS_STAT_WIS})"],
247 [Pow => 6, "Power ($conn->{stat}{+CS_STAT_POW})"], 253 [6 => "Pow", "Power ($conn->{stat}{+CS_STAT_POW})"],
248 [Cha => 7, "Charisma ($conn->{stat}{+CS_STAT_CHA})"], 254 [7 => "Cha", "Charisma ($conn->{stat}{+CS_STAT_CHA})"],
249 ], 255 ],
250 ), 1 .. 2; 256 ), 1 .. 2;
251 257
252 $table->add (2, 0, new CFClient::UI::Button 258 $table->add (2, 0, new CFClient::UI::Button
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}
625 &set_gauge_window_fontsize; 622 &set_gauge_window_fontsize;
626 623
627 $win 624 $win
628} 625}
629 626
627sub debug_setup {
628 my $table = new CFClient::UI::Table;
629
630 $table->add (0, 0, new CFClient::UI::Label text => "Widget Borders");
631 $table->add (1, 0, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 });
632 $table->add (0, 1, new CFClient::UI::Label text => "Tooltip Widget Info");
633 $table->add (1, 1, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
634 $table->add (0, 2, new CFClient::UI::Label text => "Show FPS");
635 $table->add (1, 2, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
636 $table->add (0, 3, new CFClient::UI::Label text => "Suppress Tooltips");
637 $table->add (1, 3, new CFClient::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
638
639 my @default_smooth = (0.05, 0.13, 0.05, 0.13, 0.30, 0.13, 0.05, 0.13, 0.05);
640
641 for my $x (0..2) {
642 for my $y (0 .. 2) {
643 $table->add ($x + 3, $y,
644 new CFClient::UI::Entry
645 text => $default_smooth[$x * 3 + $y],
646 on_changed => sub { $MAP->{smooth_matrix}[$x * 3 + $y] = $_[1] if $MAP; 0 },
647 );
648 }
649 }
650
651
652 $table
653}
630 654
631sub stats_window { 655sub stats_window {
632 my $tgw = new CFClient::UI::FancyFrame 656 my $tgw = new CFClient::UI::FancyFrame
633 y => $HEIGHT * (2/8), 657 y => $HEIGHT * (2/8),
634 x => "max", 658 x => "max",
635 title => "Stats", 659 title => "Stats",
636 name => "stats_window"; 660 name => "stats_window",
661 has_close_button => 1;
637 662
638 $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);
639 $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,
640 can_hover => 1, can_events => 1, 665 can_hover => 1, can_events => 1,
641 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 666 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
787 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED}); 812 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED});
788 $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});
789 814
790 $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);
791 816
792 # TODO: replace by CS_STAT_RES_xxx constants
793 my %tbl = ( 817 my %tbl = (
794 phys => 100, 818 phys => CS_STAT_RES_PHYS,
795 magic => 101, 819 magic => CS_STAT_RES_MAG,
796 fire => 102, 820 fire => CS_STAT_RES_FIRE,
797 elec => 103, 821 elec => CS_STAT_RES_ELEC,
798 cold => 104, 822 cold => CS_STAT_RES_COLD,
799 conf => 105, 823 conf => CS_STAT_RES_CONF,
800 acid => 106, 824 acid => CS_STAT_RES_ACID,
801 drain => 107, 825 drain => CS_STAT_RES_DRAIN,
802 ghit => 108, 826 ghit => CS_STAT_RES_GHOSTHIT,
803 pois => 109, 827 pois => CS_STAT_RES_POISON,
804 slow => 110, 828 slow => CS_STAT_RES_SLOW,
805 para => 111, 829 para => CS_STAT_RES_PARA,
806 tund => 112, 830 tund => CS_STAT_TURN_UNDEAD,
807 fear => 113, 831 fear => CS_STAT_RES_FEAR,
808 depl => 113, 832 depl => CS_STAT_RES_DEPLETE,
809 deat => 115, 833 deat => CS_STAT_RES_DEATH,
810 holyw => 116, 834 holyw => CS_STAT_RES_HOLYWORD,
811 blind => 117, 835 blind => CS_STAT_RES_BLIND,
812 ); 836 );
813 837
814 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}) 838 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
815 for keys %tbl; 839 for keys %tbl;
816} 840}
846 870
847 utf8::decode $buf if utf8::valid $buf; 871 utf8::decode $buf if utf8::valid $buf;
848 872
849 $table->clear; 873 $table->clear;
850 874
875 my @tip = (
876 "The current number of users logged in on the server.",
877 "The hostname of the server.",
878 "The time this server has been running without being restarted.",
879 "The server software version - a '+' indicates a Crossfire+ server.",
880 "Short information about this server provided by its admins.",
881 );
851 my @col = qw(Use #Users Host Uptime Version Description); 882 my @col = qw(#Users Host Uptime Version Description);
852 $table->add ($_, 0, new CFClient::UI::Label align => 0, fg => [1, 1, 0], text => $col[$_]) 883 $table->add ($_, 0, new CFClient::UI::Label
884 can_hover => 1, can_events => 1,
885 align => 0, fg => [1, 1, 0],
886 text => $col[$_], tooltip => $tip[$_])
853 for 0 .. $#col; 887 for 0 .. $#col;
854 888
855 my @align = qw(1 0 1 1 -1); 889 my @align = qw(1 0 1 1 -1);
856 890
857 my $y = 0; 891 my $y = 0;
858 for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) { 892 for my $m (sort { $b->[3] <=> $a->[3] } map [split /\|/], split /\015?\012/, $buf) {
875 909
876 $m = [$users, $host, $uptime, $version, $desc]; 910 $m = [$users, $host, $uptime, $version, $desc];
877 911
878 $y++; 912 $y++;
879 913
880 $table->add (0, $y, new CFClient::UI::VBox children => [ 914 $table->add (scalar @$m, $y, new CFClient::UI::VBox children => [
881 (new CFClient::UI::Button text => "Use", on_activate => sub { 915 (new CFClient::UI::Button
916 text => "Use",
917 tooltip => "Put this server into the <b>Host:Port</b> field",
918 on_activate => sub {
882 $HOST_ENTRY->set_text ($CFG->{host} = $host); 919 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host);
883 $METASERVER->toggle_visibility; 920 $METASERVER->hide;
921 0
922 },
884 }), 923 ),
885 (new CFClient::UI::Empty expand => 1), 924 (new CFClient::UI::Empty expand => 1),
886 ]); 925 ]);
887 926
888 $table->add ($_ + 1, $y, new CFClient::UI::Label 927 $table->add ($_, $y, new CFClient::UI::Label
889 ellipsise => 0, align => $align[$_], text => $m->[$_], fontsize => 0.8) 928 ellipsise => 0,
929 align => $align[$_],
930 text => $m->[$_],
931 tooltip => $tip[$_],
932 can_hover => 1,
933 can_events => 1,
934 fontsize => 0.8)
890 for 0 .. $#$m; 935 for 0 .. $#$m;
891 } 936 }
892 } 937 }
893 }); 938 });
894} 939}
895 940
896sub metaserver_dialog { 941sub metaserver_dialog {
897 my $dialog = new CFClient::UI::FancyFrame 942 my $dialog = new CFClient::UI::FancyFrame
898 title => "Server List", 943 title => "Server List",
899 name => 'metaserver_dialog', 944 name => 'metaserver_dialog',
900 x => 'center', 945 x => 'center',
901 y => 'center', 946 y => 'center',
902 z => 3, 947 z => 3,
948 force_h => $::HEIGHT * 0.4,
903 child => (my $vbox = new CFClient::UI::VBox), 949 child => (my $vbox = new CFClient::UI::VBox),
904 on_visibility_change => sub { 950 on_visibility_change => sub {
905 update_metaserver if $_[1]; 951 update_metaserver if $_[1];
952 0
906 }, 953 },
907 ; 954 ;
908 955
909 $vbox->add ($dialog->{table} = new CFClient::UI::Table); 956 $dialog->{table} = new CFClient::UI::Table;
957
958 $vbox->add (new CFClient::UI::ScrolledWindow expand => 1, child => $dialog->{table});
910 959
911 $dialog 960 $dialog
912} 961}
913 962
914sub server_setup { 963sub server_setup {
921 $table->add (1, 2, my $vbox = new CFClient::UI::VBox); 970 $table->add (1, 2, my $vbox = new CFClient::UI::VBox);
922 971
923 $vbox->add ( 972 $vbox->add (
924 $HOST_ENTRY = new CFClient::UI::Entry 973 $HOST_ENTRY = new CFClient::UI::Entry
925 expand => 1, 974 expand => 1,
926 text => $CFG->{host}, 975 text => $CFG->{profile}{default}{host},
927 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",
928 on_changed => sub { 977 on_changed => sub {
929 my ($self, $value) = @_; 978 my ($self, $value) = @_;
930 $CFG->{host} = $value; 979 $CFG->{profile}{default}{host} = $value;
980 0
931 } 981 }
932 ); 982 );
933 983
934 $METASERVER = metaserver_dialog; 984 $METASERVER = metaserver_dialog;
935 985
936 $vbox->add (new CFClient::UI::Button 986 $vbox->add (new CFClient::UI::Button
937 expand => 1, 987 expand => 1,
938 text => "Server List", 988 text => "Server List",
939 other => $METASERVER, 989 other => $METASERVER,
940 tooltip => "Show a list of available crossfire servers", 990 tooltip => "Show a list of available crossfire servers",
941 on_activate => sub { $METASERVER->toggle_visibility }, 991 on_activate => sub { $METASERVER->toggle_visibility; 0 },
992 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 0 },
942 ); 993 );
943 } 994 }
944 995
945 $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");
946 $table->add (1, 4, new CFClient::UI::Entry 997 $table->add (1, 4, new CFClient::UI::Entry
947 text => $CFG->{user}, 998 text => $CFG->{profile}{default}{user},
948 tooltip => "The name of your character on the server", 999 tooltip => "The name of your character on the server",
949 on_changed => sub { 1000 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value }
950 my ($self, $value) = @_;
951 $CFG->{user} = $value;
952 }
953 ); 1001 );
954 1002
955 $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");
956 $table->add (1, 5, new CFClient::UI::Entry 1004 $table->add (1, 5, new CFClient::UI::Entry
957 text => $CFG->{password}, 1005 text => $CFG->{profile}{default}{password},
958 hidden => 1, 1006 hidden => 1,
959 tooltip => "The password for your character", 1007 tooltip => "The password for your character",
960 on_changed => sub { 1008 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value }
961 my ($self, $value) = @_;
962 $CFG->{password} = $value;
963 }
964 ); 1009 );
965 1010
966 $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");
967 $table->add (1, 7, new CFClient::UI::Slider 1012 $table->add (1, 7, new CFClient::UI::Slider
968 force_w => 100, 1013 force_w => 100,
969 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1014 range => [$CFG->{mapsize}, 10, 100, 0, 1],
970 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. "
971 . "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, "
972 . "but you also increase bandwidth requirements and latency. " 1017 . "but you also increase bandwidth requirements and latency. "
973 . "This option is only used once at log-in.", 1018 . "This option is only used once at log-in.",
974 on_changed => sub { 1019 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 0 },
975 my ($self, $value) = @_;
976
977 $CFG->{mapsize} = $self->{range}[0] = $value = int $value;
978 },
979 ); 1020 );
980 1021
981 $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");
982 $table->add (1, 8, new CFClient::UI::CheckBox 1023 $table->add (1, 8, new CFClient::UI::CheckBox
983 state => $CFG->{face_prefetch}, 1024 state => $CFG->{face_prefetch},
986 . "This might increase or create lag, but increases the chances " 1027 . "This might increase or create lag, but increases the chances "
987 . "of faces being ready for display when you encounter them. " 1028 . "of faces being ready for display when you encounter them. "
988 . "It also uses up server bandwidth on every connect, " 1029 . "It also uses up server bandwidth on every connect, "
989 . "so only set it if you really need to prefetch images. " 1030 . "so only set it if you really need to prefetch images. "
990 . "This option can be set and unset any time.", 1031 . "This option can be set and unset any time.",
991 on_changed => sub { $CFG->{face_prefetch} = $_[1] }, 1032 on_changed => sub { $CFG->{face_prefetch} = $_[1]; 0 },
992 ); 1033 );
993 1034
994 $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");
995 $table->add (1, 9, new CFClient::UI::Entry 1036 $table->add (1, 9, new CFClient::UI::Entry
996 text => $CFG->{output_count}, 1037 text => $CFG->{output_count},
997 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.",
998 on_changed => sub { $CFG->{output_count} = $_[1] }, 1039 on_changed => sub { $CFG->{output_count} = $_[1]; 0 },
999 ); 1040 );
1000 1041
1001 $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");
1002 $table->add (1, 10, new CFClient::UI::Entry 1043 $table->add (1, 10, new CFClient::UI::Entry
1003 text => $CFG->{output_sync}, 1044 text => $CFG->{output_sync},
1004 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.",
1005 on_changed => sub { $CFG->{output_sync} = $_[1] }, 1046 on_changed => sub { $CFG->{output_sync} = $_[1]; 0 },
1006 ); 1047 );
1007 1048
1008 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button 1049 $table->add (1, 11, $LOGIN_BUTTON = new CFClient::UI::Button
1009 expand => 1, 1050 expand => 1,
1010 align => 0, 1051 align => 0,
1011 text => "Login", 1052 text => "Login",
1012 on_activate => sub { 1053 on_activate => sub {
1013 $CONN ? stop_game 1054 $CONN ? stop_game
1014 : start_game; 1055 : start_game;
1056 0
1015 }, 1057 },
1016 ); 1058 );
1017 1059
1018 $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");
1019 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry 1061 $table->add (1, 12, my $saycmd = new CFClient::UI::Entry
1022 . "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. "
1023 . "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.",
1024 on_changed => sub { 1066 on_changed => sub {
1025 my ($self, $value) = @_; 1067 my ($self, $value) = @_;
1026 $CFG->{say_command} = $value; 1068 $CFG->{say_command} = $value;
1069 0
1027 } 1070 }
1028 ); 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);
1029 1081
1030 $vbox 1082 $vbox
1031} 1083}
1032 1084
1033sub message_window { 1085sub message_window {
1038 bg => [0, 0, 0, 0.75], 1090 bg => [0, 0, 0, 0.75],
1039 x => "max", 1091 x => "max",
1040 y => 0, 1092 y => 0,
1041 force_w => $::WIDTH * 0.4, 1093 force_w => $::WIDTH * 0.4,
1042 force_h => $::HEIGHT * 0.5, 1094 force_h => $::HEIGHT * 0.5,
1043 child => (my $vbox = new CFClient::UI::VBox); 1095 child => (my $vbox = new CFClient::UI::VBox),
1096 has_close_button => 1;
1044 1097
1045 $vbox->add ($LOGVIEW); 1098 $vbox->add ($LOGVIEW);
1046 1099
1047 $vbox->add (my $input = new CFClient::UI::Entry 1100 $vbox->add (my $input = new CFClient::UI::Entry
1048 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> "
1056 1109
1057 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) { 1110 if ($prev_focus == $MAPWIDGET && $input->{auto_activated}) {
1058 $input->{refocus_map} = 1; 1111 $input->{refocus_map} = 1;
1059 } 1112 }
1060 delete $input->{auto_activated}; 1113 delete $input->{auto_activated};
1114
1115 0
1061 }, 1116 },
1062 on_activate => sub { 1117 on_activate => sub {
1063 my ($input, $text) = @_; 1118 my ($input, $text) = @_;
1064 $input->set_text (''); 1119 $input->set_text ('');
1065 1120
1071 } 1126 }
1072 if ($input->{refocus_map}) { 1127 if ($input->{refocus_map}) {
1073 delete $input->{refocus_map}; 1128 delete $input->{refocus_map};
1074 $MAPWIDGET->focus_in 1129 $MAPWIDGET->focus_in
1075 } 1130 }
1131
1132 0
1076 }, 1133 },
1077 on_escape => sub { 1134 on_escape => sub {
1078 $MAPWIDGET->focus_in 1135 $MAPWIDGET->grab_focus;
1136
1137 0
1079 }, 1138 },
1080 ); 1139 );
1081 1140
1082 $CONSOLE = { 1141 $CONSOLE = {
1083 window => $window, 1142 window => $window,
1105 ); 1164 );
1106 $vb->add (my $hb = new CFClient::UI::HBox expand => 1); 1165 $vb->add (my $hb = new CFClient::UI::HBox expand => 1);
1107 $hb->add (new CFClient::UI::Button 1166 $hb->add (new CFClient::UI::Button
1108 text => "Ok", 1167 text => "Ok",
1109 expand => 1, 1168 expand => 1,
1110 on_activate => sub { $QUIT_DIALOG->hide }, 1169 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1111 ); 1170 );
1112 $hb->add (new CFClient::UI::Button 1171 $hb->add (new CFClient::UI::Button
1113 text => "Quit anyway", 1172 text => "Quit anyway",
1114 expand => 1, 1173 expand => 1,
1115 on_activate => sub { exit }, 1174 on_activate => sub { exit },
1158 ["Potions" => PICKUP_POTION], 1217 ["Potions" => PICKUP_POTION],
1159 ["Magic Devices" => PICKUP_MAGIC_DEVICE], 1218 ["Magic Devices" => PICKUP_MAGIC_DEVICE],
1160 ["Ignore cursed" => PICKUP_NOT_CURSED], 1219 ["Ignore cursed" => PICKUP_NOT_CURSED],
1161 ["Jewelery" => PICKUP_JEWELS], 1220 ["Jewelery" => PICKUP_JEWELS],
1162 ], 1221 ],
1222 ["Weight/Value ratio", 2, 17]
1163 ) 1223 )
1164 { 1224 {
1165 my ($title, $x, $y, @bits) = @$_; 1225 my ($title, $x, $y, @bits) = @$_;
1166 $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]);
1167 1227
1172 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1); 1232 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1);
1173 $table->add ($x+1, $y, new CFClient::UI::CheckBox 1233 $table->add ($x+1, $y, new CFClient::UI::CheckBox
1174 state => $CFG->{pickup} & $mask, 1234 state => $CFG->{pickup} & $mask,
1175 on_changed => sub { 1235 on_changed => sub {
1176 my ($box, $value) = @_; 1236 my ($box, $value) = @_;
1237
1177 if ($value) { 1238 if ($value) {
1178 $::CFG->{pickup} |= $mask; 1239 $::CFG->{pickup} |= $mask;
1179 } else { 1240 } else {
1180 $::CFG->{pickup} = $::CFG->{pickup} & ~$mask; 1241 $::CFG->{pickup} &= ~$mask;
1181 } 1242 }
1243
1182 $::CONN->send (sprintf "command pickup %u", $::CFG->{pickup}) 1244 $::CONN->send_command ("pickup $::CFG->{pickup}")
1183 if defined $::CONN; 1245 if defined $::CONN;
1246
1247 0
1184 }); 1248 });
1185 } 1249 }
1186 } 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 });
1187 1270
1188 $table 1271 $table
1189} 1272}
1190 1273
1191sub inventory_window { 1274sub inventory_window {
1193 x => "center", 1276 x => "center",
1194 y => "center", 1277 y => "center",
1195 force_w => $WIDTH * 9/10, 1278 force_w => $WIDTH * 9/10,
1196 force_h => $HEIGHT * 9/10, 1279 force_h => $HEIGHT * 9/10,
1197 title => "Inventory", 1280 title => "Inventory",
1281 has_close_button => 1,
1198 ; 1282 ;
1199 1283
1200 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); 1284 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1);
1201 1285
1202 $hb->add (my $vb1 = new CFClient::UI::VBox); 1286 $hb->add (my $vb1 = new CFClient::UI::VBox);
1224 1308
1225 my $refresh; 1309 my $refresh;
1226 $refresh = sub { 1310 $refresh = sub {
1227 $binding_list->clear (); 1311 $binding_list->clear ();
1228 1312
1229 for my $mod (keys %{$::CFG->{bindings}}) { 1313 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) {
1230 for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { 1314 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) {
1231 my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; 1315 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1232 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1316 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1233 1317
1234 my $lbl = join "; ", @$cmds; 1318 my $lbl = join "; ", @$cmds;
1235 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym); 1319 my $nam = CFClient::Binder::keycombo_to_name ($mod, $sym);
1236 $binding_list->add (my $hb = new CFClient::UI::HBox); 1320 $binding_list->add (my $hb = new CFClient::UI::HBox);
1237 $hb->add (new CFClient::UI::Button 1321 $hb->add (new CFClient::UI::Button
1238 text => "delete", 1322 text => "delete",
1239 tooltip => "Deletes the binding", 1323 tooltip => "Deletes the binding",
1240 on_activate => sub { 1324 on_activate => sub {
1241 $binding_list->remove ($hb); 1325 $binding_list->remove ($hb);
1242 delete $::CFG->{bindings}->{$mod}->{$sym}; 1326 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1327 0
1243 }); 1328 });
1244 1329
1245 $hb->add (new CFClient::UI::Button 1330 $hb->add (new CFClient::UI::Button
1246 text => "edit", 1331 text => "edit",
1247 tooltip => "Edits the binding", 1332 tooltip => "Edits the binding",
1248 on_activate => sub { 1333 on_activate => sub {
1249 $::BIND_EDITOR->set_binding ( 1334 $::BIND_EDITOR->set_binding (
1250 $mod, $sym, $::CFG->{bindings}->{$mod}->{$sym}, 1335 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym},
1251 sub { 1336 sub {
1252 my ($nmod, $nsym, $ncmds) = @_; 1337 my ($nmod, $nsym, $ncmds) = @_;
1253 delete $::CFG->{bindings}->{$mod}->{$sym}; 1338 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
1254 $::CFG->{bindings}->{$nmod}->{$nsym} = $ncmds; 1339 $::CFG->{profile}{default}{bindings}{$nmod}{$nsym} = $ncmds;
1255 $refresh->(); 1340 $refresh->();
1256 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1341 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1257 $SETUP_DIALOG->show; 1342 $SETUP_DIALOG->show;
1258 }, 1343 },
1259 sub { 1344 sub {
1260 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1345 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1261 $SETUP_DIALOG->show; 1346 $SETUP_DIALOG->show;
1262 }); 1347 });
1263 $::BIND_EDITOR->show; 1348 $::BIND_EDITOR->show;
1264 $SETUP_DIALOG->hide; 1349 $SETUP_DIALOG->hide;
1350 0
1265 }); 1351 });
1266 1352
1267 $hb->add (new CFClient::UI::Label text => "(Key: $nam)"); 1353 $hb->add (new CFClient::UI::Label text => "(Key: $nam)");
1268 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); 1354 $hb->add (new CFClient::UI::Label text => $lbl, expand => 1);
1269 } 1355 }
1270 } 1356 }
1271 }; 1357 };
1272 1358
1273 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
1274 $vb->add ($binding_list); 1372 $vb->add ($binding_list);
1275 $vb->add (my $hb = new CFClient::UI::HBox); 1373 $vb->add (my $hb = new CFClient::UI::HBox);
1276 1374
1277 $hb->add (new CFClient::UI::Button 1375 $hb->add (new CFClient::UI::Button
1278 text => "record new", 1376 text => "record new",
1280 tooltip => "This button opens the binding editor with an empty binding.", 1378 tooltip => "This button opens the binding editor with an empty binding.",
1281 on_activate => sub { 1379 on_activate => sub {
1282 $::BIND_EDITOR->set_binding (undef, undef, [], 1380 $::BIND_EDITOR->set_binding (undef, undef, [],
1283 sub { 1381 sub {
1284 my ($mod, $sym, $cmds) = @_; 1382 my ($mod, $sym, $cmds) = @_;
1285 $::CFG->{bindings}->{$mod}->{$sym} = $cmds; 1383 $::CFG->{profile}{default}{bindings}{$mod}{$sym} = $cmds;
1286 $refresh->(); 1384 $refresh->();
1287 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD); 1385 $SETUP_NOTEBOOK->set_current_page ($SETUP_KEYBOARD);
1288 $SETUP_DIALOG->show; 1386 $SETUP_DIALOG->show;
1289 }, 1387 },
1290 sub { 1388 sub {
1292 $SETUP_DIALOG->show; 1390 $SETUP_DIALOG->show;
1293 }, 1391 },
1294 ); 1392 );
1295 $SETUP_DIALOG->hide; 1393 $SETUP_DIALOG->hide;
1296 $::BIND_EDITOR->show; 1394 $::BIND_EDITOR->show;
1395 0
1297 }, 1396 },
1298 ); 1397 );
1299 1398
1300 $hb->add (new CFClient::UI::Button 1399 $hb->add (new CFClient::UI::Button
1301 text => "close", 1400 text => "close",
1302 tooltip => "Closes the binding window", 1401 tooltip => "Closes the binding window",
1303 expand => 1, 1402 expand => 1,
1304 on_activate => sub { 1403 on_activate => sub {
1305 $SETUP_DIALOG->hide; 1404 $SETUP_DIALOG->hide;
1405 0
1306 } 1406 }
1307 ); 1407 );
1308 1408
1309 $refresh->(); 1409 $refresh->();
1310 1410
1311 $vb 1411 $vb
1312} 1412}
1313 1413
1314sub make_help_window { 1414sub help_window {
1315 my $win = new CFClient::UI::FancyFrame 1415 my $win = new CFClient::UI::FancyFrame
1316 x => 'center', 1416 x => 'center',
1317 y => 'center', 1417 y => 'center',
1318 z => 2, 1418 z => 2,
1319 name => 'doc_browser', 1419 name => 'doc_browser',
1322 title => "Documentation"; 1422 title => "Documentation";
1323 1423
1324 $win->add (my $vbox = new CFClient::UI::VBox); 1424 $win->add (my $vbox = new CFClient::UI::VBox);
1325 1425
1326 $vbox->add (my $buttons = new CFClient::UI::HBox); 1426 $vbox->add (my $buttons = new CFClient::UI::HBox);
1327 $vbox->add (my $viewer = new CFClient::UI::TextView expand => 1, fontsize => 0.8); 1427 $vbox->add (my $viewer = new CFClient::UI::TextScroller
1428 expand => 1, fontsize => 0.8, padding_x => 4);
1328 1429
1329 for ( 1430 $buttons->add (new CFClient::UI::Label text => "Choose a document to display: ");
1431 $buttons->add (my $combo = new CFClient::UI::Combobox
1432 value => undef,
1433 options => [
1330 [intro => "Introduction"], 1434 [intro => "Introduction"],
1331 [manual => "Manual"], 1435 [manual => "Manual"],
1436 [skill_help => "Skills"],
1332 [command_help => "Commands"], 1437 [command_help => "Commands"],
1333 [skill_help => "Skills"], 1438 [dmcommand_help => "DM Commands"],
1334 ) { 1439 [COPYING => "License Terms"],
1335 my ($pod, $label) = @$_; 1440 ],
1441 on_changed => sub {
1442 my ($self, $pod) = @_;
1336 1443
1337 $buttons->add (new CFClient::UI::Button
1338 text => $label,
1339 on_activate => sub {
1340 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", 1444 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1341 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; 1445 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1342 1446
1343 $viewer->clear; 1447 $viewer->clear;
1344 1448
1345 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0]) 1449 $viewer->add_paragraph ([1, 1, 1, 1], $_->[1], $_->[0])
1346 for @$pom; 1450 for @$pom;
1347 1451
1348 $viewer->set_offset (0); 1452 $viewer->set_offset (0);
1349 }, 1453 0
1454 },
1455 on_visibility_change => sub {
1456 my ($self, $visible) = @_;
1457 return unless $visible;
1458 return if $self->{value};
1459 $self->set_value ("intro");
1460 0
1461 },
1350 ); 1462 );
1351 }
1352
1353 $viewer->add_paragraph ([1, 1, 0, 1], "<big>Use one of the buttons above to display a document.</big>");
1354 1463
1355 $win 1464 $win
1356} 1465}
1357 1466
1358sub sdl_init { 1467sub sdl_init {
1425 $MAPWIDGET->connect (activate_console => sub { 1534 $MAPWIDGET->connect (activate_console => sub {
1426 my ($mapwidget, $preset) = @_; 1535 my ($mapwidget, $preset) = @_;
1427 1536
1428 if ($CONSOLE) { 1537 if ($CONSOLE) {
1429 $CONSOLE->{input}->{auto_activated} = 1; 1538 $CONSOLE->{input}->{auto_activated} = 1;
1430 $CONSOLE->{input}->focus_in; 1539 $CONSOLE->{input}->grab_focus;
1431 1540
1432 if ($preset && $CONSOLE->{input}->get_text eq '') { 1541 if ($preset && $CONSOLE->{input}->get_text eq '') {
1433 $CONSOLE->{input}->set_text ($preset); 1542 $CONSOLE->{input}->set_text ($preset);
1434 } 1543 }
1435 } 1544 }
1436 }); 1545 });
1437 $MAPWIDGET->show; 1546 $MAPWIDGET->show;
1438 $MAPWIDGET->focus_in; 1547 $MAPWIDGET->grab_focus;
1439 1548
1440 $LOGVIEW = new CFClient::UI::TextView 1549 $LOGVIEW = new CFClient::UI::TextScroller
1441 expand => 1, 1550 expand => 1,
1442 font => $FONT_FIXED, 1551 font => $FONT_FIXED,
1443 fontsize => $::CFG->{log_fontsize}, 1552 fontsize => $::CFG->{log_fontsize},
1444 indent => -4, 1553 indent => -4,
1445 can_hover => 1, 1554 can_hover => 1,
1453 x => 'center', 1562 x => 'center',
1454 y => 'center', 1563 y => 'center',
1455 z => 2, 1564 z => 2,
1456 force_w => $::WIDTH * 0.6, 1565 force_w => $::WIDTH * 0.6,
1457 force_h => $::HEIGHT * 0.6, 1566 force_h => $::HEIGHT * 0.6,
1567 has_close_button => 1,
1458 ; 1568 ;
1459 1569
1460 $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,
1461 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); 1571 filter => new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1462 1572
1467 $SETUP_NOTEBOOK->add (Graphics => graphics_setup, 1577 $SETUP_NOTEBOOK->add (Graphics => graphics_setup,
1468 "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.");
1469 $SETUP_NOTEBOOK->add (Audio => audio_setup, 1579 $SETUP_NOTEBOOK->add (Audio => audio_setup,
1470 "Configure the use of audio, sound effects and background music."); 1580 "Configure the use of audio, sound effects and background music.");
1471 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup, 1581 $SETUP_NOTEBOOK->add (Keyboard => $SETUP_KEYBOARD = keyboard_setup,
1472 "Lets you define, edit and delete bindings." 1582 "Lets you define, edit and delete key bindings."
1473 . "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 "
1474 . "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 "
1475 . "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. "
1476 . "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 "
1477 . "binding editor closes"); 1587 . "binding editor closes");
1478 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup, 1588 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1479 "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.");
1590 $SETUP_NOTEBOOK->add (Debug => debug_setup,
1591 "Some debuggin' options. Do not ask.");
1480 1592
1481 $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
1482 1594
1483 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 1595 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
1484 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.");
1499 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.",
1500 on_activate => sub { 1612 on_activate => sub {
1501 $::CFG->{layout} = CFClient::UI::get_layout; 1613 $::CFG->{layout} = CFClient::UI::get_layout;
1502 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc"; 1614 CFClient::write_cfg "$Crossfire::VARDIR/cfplusrc";
1503 status "Configuration Saved"; 1615 status "Configuration Saved";
1616 0
1504 }, 1617 },
1505 ); 1618 );
1506 1619
1507 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, 1620 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window,
1508 tooltip => "View Documentation"); 1621 tooltip => "View Documentation");
1509 1622
1510 $BUTTONBAR->add (new CFClient::UI::Button 1623 $BUTTONBAR->add (new CFClient::UI::Button
1511 text => "Quit", 1624 text => "Quit",
1512 tooltip => "Terminates the program", 1625 tooltip => "Terminates the program",
1514 if ($CONN) { 1627 if ($CONN) {
1515 open_quit_dialog; 1628 open_quit_dialog;
1516 } else { 1629 } else {
1517 exit; 1630 exit;
1518 } 1631 }
1632 0
1519 }, 1633 },
1520 ); 1634 );
1521 1635
1522 $BUTTONBAR->show; 1636 $BUTTONBAR->show;
1523 $SETUP_DIALOG->show; 1637 $SETUP_DIALOG->show;
1525 1639
1526 $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]);
1527} 1641}
1528 1642
1529sub video_shutdown { 1643sub video_shutdown {
1644 CFClient::OpenGL::shutdown;
1645
1530 undef $SDL_ACTIVE; 1646 undef $SDL_ACTIVE;
1531} 1647}
1532 1648
1533my @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#
1534my $bgmusic;#TODO#hack#d# 1650my $bgmusic;#TODO#hack#d#
1750 1866
1751 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1867 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1752 CFClient::UI::set_layout ($::CFG->{layout}); 1868 CFClient::UI::set_layout ($::CFG->{layout});
1753 1869
1754 my %DEF_CFG = ( 1870 my %DEF_CFG = (
1755 sdl_mode => 0, 1871 sdl_mode => 0,
1756 width => 640, 1872 width => 640,
1757 height => 480, 1873 height => 480,
1758 fullscreen => 0, 1874 fullscreen => 0,
1759 fast => 0, 1875 fast => 0,
1760 map_scale => 1, 1876 map_scale => 1,
1761 fow_enable => 1, 1877 fow_enable => 1,
1762 fow_intensity => 0.45, 1878 fow_intensity => 0.45,
1763 fow_smooth => 0, 1879 fow_smooth => 0,
1764 gui_fontsize => 1, 1880 gui_fontsize => 1,
1765 log_fontsize => 0.7, 1881 log_fontsize => 0.7,
1766 gauge_fontsize=> 1, 1882 gauge_fontsize => 1,
1767 gauge_size => 0.35, 1883 gauge_size => 0.35,
1768 stat_fontsize => 0.7, 1884 stat_fontsize => 0.7,
1769 mapsize => 100, 1885 mapsize => 100,
1770 host => "crossfire.schmorp.de",
1771 say_command => 'say', 1886 say_command => 'say',
1772 audio_enable => 1, 1887 audio_enable => 1,
1773 bgm_enable => 1, 1888 bgm_enable => 1,
1774 bgm_volume => 0.25, 1889 bgm_volume => 0.25,
1775 face_prefetch => 0, 1890 face_prefetch => 0,
1776 output_sync => 1, 1891 output_sync => 1,
1777 output_count => 1, 1892 output_count => 1,
1893 pickup => 0,
1894 default => "profile", # default profile
1895 );
1778 ); 1896
1779
1780 while (my ($k, $v) = each %DEF_CFG) { 1897 while (my ($k, $v) = each %DEF_CFG) {
1781 $CFG->{$k} = $v unless exists $CFG->{$k}; 1898 $CFG->{$k} = $v unless exists $CFG->{$k};
1782 } 1899 }
1900
1901 $CFG->{profile}{default}{host} ||= "crossfire.schmorp.de";
1783 1902
1784 sdl_init; 1903 sdl_init;
1785 1904
1786 @SDL_MODES = reverse 1905 @SDL_MODES = reverse
1787 grep $_->[0] >= 640 && $_->[1] >= 480, 1906 grep $_->[0] >= 640 && $_->[1] >= 480,
1829 video_init; 1948 video_init;
1830 audio_init; 1949 audio_init;
1831} 1950}
1832 1951
1833Event::loop; 1952Event::loop;
1953#CFClient::SDL_Quit;
1954#CFClient::_exit 0;
1834 1955
1835END { CFClient::SDL_Quit } 1956END { CFClient::SDL_Quit }
1836 1957
1837=head1 NAME 1958=head1 NAME
1838 1959

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines