ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/deliantra
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/deliantra (file contents):
Revision 1.11 by root, Sat Dec 22 06:53:16 2007 UTC vs.
Revision 1.29 by root, Mon Mar 24 00:24:47 2008 UTC

75 75
76 unshift @INC, $root; 76 unshift @INC, $root;
77 } 77 }
78} 78}
79 79
80# prepend private library directory
81BEGIN {
82 for (grep !ref, @INC) {
83 my $path = "$_/Deliantra/Client/private";
84 if (-d $path) {
85 unshift @INC, $path;
86 last;
87 }
88 }
89}
90
80# need to do it again because that pile of garbage called PAR nukes it before main 91# need to do it again because that pile of garbage called PAR nukes it before main
81unshift @INC, $ENV{PAR_TEMP} 92unshift @INC, $ENV{PAR_TEMP}
82 if %PAR::LibCache; 93 if %PAR::LibCache;
83 94
84use Time::HiRes 'time'; 95use Time::HiRes 'time';
85use EV; 96use EV;
86use List::Util qw(max min); 97use List::Util qw(max min);
87 98
88use Crossfire; 99use Deliantra;
89use Crossfire::Protocol::Constants; 100use Deliantra::Protocol::Constants;
90 101
91use Compress::LZF; 102use Compress::LZF;
92 103
93use CFPlus; 104use DC;
94use CFPlus::OpenGL (); 105use DC::OpenGL ();
95use CFPlus::Protocol; 106use DC::Protocol;
96use CFPlus::DB; 107use DC::DB;
97use CFPlus::UI; 108use DC::UI;
98use CFPlus::UI::Canvas; 109use DC::UI::Canvas;
99use CFPlus::UI::Inventory; 110use DC::UI::Inventory;
100use CFPlus::UI::SpellList; 111use DC::UI::SpellList;
101use CFPlus::UI::Dockable; 112use DC::UI::Dockable;
113use DC::UI::Dockbar;
102use CFPlus::UI::MessageWindow; 114use DC::UI::MessageWindow;
103use CFPlus::UI::ChatView; 115use DC::UI::ChatView;
116use DC::MessageDistributor;
104use CFPlus::Pod; 117use DC::Pod;
105use CFPlus::MapWidget; 118use DC::MapWidget;
106use CFPlus::Macro; 119use DC::Macro;
107 120
108$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 121$SIG{QUIT} = sub { Carp::cluck "QUIT" };
109$SIG{PIPE} = 'IGNORE'; 122$SIG{PIPE} = 'IGNORE';
110 123
111$EV::DIED = sub { 124$EV::DIED = sub {
112 CFPlus::fatal Carp::longmess $@; 125 DC::fatal Carp::longmess $@;
113}; 126};
114 127
115my $MAX_FPS = 60; 128my $MAX_FPS = 60;
116my $MIN_FPS = 5; # unused as of yet
117 129
118our $META_SERVER = "http://metaserver.schmorp.de/current.json"; 130our $META_SERVER = "http://metaserver.schmorp.de/current.json";
119 131
120our $LAST_REFRESH; 132our $LAST_REFRESH;
121our $NOW; 133our $NOW;
168our $SPELL_PAGE; 180our $SPELL_PAGE;
169our $SPELL_LIST; 181our $SPELL_LIST;
170 182
171our $HELP_WINDOW; 183our $HELP_WINDOW;
172our $MESSAGE_WINDOW; 184our $MESSAGE_WINDOW;
185our $MESSAGE_DIST;
173our $FLOORBOX; 186our $FLOORBOX;
174our $GAUGES; 187our $GAUGES;
175our $STATWIDS; 188our $STATWIDS;
176 189
177our $SDL_ACTIVE; 190our $SDL_ACTIVE;
178our %SDL_CB; 191our %SDL_CB;
179 192
180our $ALT_ENTER_MESSAGE; 193our $ALT_ENTER_MESSAGE;
181our $STATUSBOX; 194our $STATUSBOX;
195our $MODBOX;
182our $DEBUG_STATUS; 196our $DEBUG_STATUS;
183 197
184our $INV; 198our $INV;
185our $INVR; 199our $INVR;
186our $INVR_HB; 200our $INVR_HB;
187 201
188############################################################################# 202#############################################################################
189 203
190sub status { 204sub status {
191 $STATUSBOX->add (CFPlus::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); 205 $STATUSBOX->add (DC::asxml $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]);
192} 206}
193 207
194sub debug { 208sub debug {
195 $DEBUG_STATUS->set_text ($_[0]); 209 $DEBUG_STATUS->set_text ($_[0]);
196} 210}
197 211
198sub message { 212sub message {
199 $MESSAGE_WINDOW->message (@_); 213 $MESSAGE_DIST->message (@_);
214}
215
216sub update_modbox {
217 my $mod = DC::SDL_GetModState;
218
219 my $markup;
220
221 $markup .= $mod & DC::KMOD_CTRL
222 ? ($MAPWIDGET->{ctrl} ? "[REPEAT]" : "[<span foreground='#888'>REPEAT</span>]")
223 : "[<span foreground='#888'> once </span>]";
224
225 $markup .= $mod & DC::KMOD_SHIFT
226 ? ($MAPWIDGET->{shft} ? "[FIRE]" : "[<span foreground='#888'>FIRE</span>]")
227 : "[<span foreground='#888'>move</span>]";
228
229 $markup .= $mod & (DC::KMOD_ALT | DC::KMOD_META)
230 ? "[ALT]"
231 : "[<span foreground='#888'>alt</span>]";
232
233 $markup .= $mod & DC::KMOD_NUM
234 ? "[NUM]"
235 : "[<span foreground='#888'>num</span>]";
236
237 $MODBOX->set_markup ($markup);
200} 238}
201 239
202############################################################################# 240#############################################################################
203#TODO: maybe move into own audio module... 241#TODO: maybe move into own audio module...
204 242
234 272
235 if (my $chunk = $AUDIO_CHUNK{$face}) { 273 if (my $chunk = $AUDIO_CHUNK{$face}) {
236 for (grep $_->[0] >= EV::now, @{(delete $AUDIO_PLAY{$face}) || []}) { 274 for (grep $_->[0] >= EV::now, @{(delete $AUDIO_PLAY{$face}) || []}) {
237 my (undef, $dx, $dy, $vol) = @$_; 275 my (undef, $dx, $dy, $vol) = @$_;
238 276
239 my $channel = CFPlus::Channel::find; 277 my $channel = DC::Channel::find;
240 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255); 278 $channel->volume ($vol * $CFG->{effects_volume} * 128 / 255);
241 $channel->set_position_r ($dx, $dy, 20); 279 $channel->set_position_r ($dx, $dy, 20);
242 $chunk->play ($channel); 280 $chunk->play ($channel);
243 } 281 }
244 } else { 282 } else {
255 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue 293 push @MUSIC_JINGLE, $meta; # push it oto the music/jingle queue
256 &audio_music_push ($face); 294 &audio_music_push ($face);
257 } 295 }
258 } else { 296 } else {
259 # fetch from database 297 # fetch from database
260 CFPlus::DB::get res_data => $meta->{name}, sub { 298 DC::DB::get res_data => $meta->{name}, sub {
261 my $rwops = new CFPlus::RW $_[0]; 299 my $rwops = new DC::RW $_[0];
262 my $chunk = new CFPlus::MixChunk $rwops 300 my $chunk = new DC::MixChunk $rwops
263 or Carp::confess "sound face " . (JSON::XS::encode_json $meta) . " unloadable: " . CFPlus::Mix_GetError; 301 or Carp::confess "sound face " . (JSON::XS::encode_json $meta) . " unloadable: " . DC::Mix_GetError;
264 $chunk->volume (($meta->{data}{volume} || 1) * 128); 302 $chunk->volume (($meta->{data}{volume} || 1) * 128);
265 $AUDIO_CHUNK{$face} = $chunk; 303 $AUDIO_CHUNK{$face} = $chunk;
266 304
267 audio_sound_push ($face); 305 audio_sound_push ($face);
268 }; 306 };
287sub audio_music_set_meta { 325sub audio_music_set_meta {
288 my ($meta) = @_; 326 my ($meta) = @_;
289 327
290 $MUSIC_PLAYING_META = $meta; 328 $MUSIC_PLAYING_META = $meta;
291 $MUSIC_PLAYING_WIDGET->set_markup ( 329 $MUSIC_PLAYING_WIDGET->set_markup (
292 "<b>Name</b>: " . (CFPlus::asxml $meta->{data}{name}) . "\n" 330 "<b>Name</b>: " . (DC::asxml $meta->{data}{name}) . "\n"
293 . "<b>Author</b>: " . (CFPlus::asxml $meta->{data}{author}) . "\n" 331 . "<b>Author</b>: " . (DC::asxml $meta->{data}{author}) . "\n"
294 . "<b>Source</b>: " . (CFPlus::asxml $meta->{data}{source}) . "\n" 332 . "<b>Source</b>: " . (DC::asxml $meta->{data}{source}) . "\n"
295 . "<b>License</b>: " . (CFPlus::asxml $meta->{data}{license}) 333 . "<b>License</b>: " . (DC::asxml $meta->{data}{license})
296 ); 334 );
297} 335}
298 336
299sub audio_music_update_volume { 337sub audio_music_update_volume {
300 return unless $MUSIC_PLAYING_META; 338 return unless $MUSIC_PLAYING_META;
301 my $volume = $MUSIC_PLAYING_META->{data}{volume} || 1; 339 my $volume = $MUSIC_PLAYING_META->{data}{volume} || 1;
302 my $base = $MUSIC_PLAYING_META->{data}{jingle} ? 1 : $CFG->{bgm_volume}; 340 my $base = $MUSIC_PLAYING_META->{data}{jingle} ? 1 : $CFG->{bgm_volume};
303 CFPlus::MixMusic::volume $base * $volume * 128; 341 DC::MixMusic::volume $base * $volume * 128;
304} 342}
305 343
306sub audio_music_start { 344sub audio_music_start {
307 my $meta = $MUSIC_PLAYING_META; 345 my $meta = $MUSIC_PLAYING_META;
308 346
309 CFPlus::DB::get res_data => $meta->{name}, sub { 347 DC::DB::get res_data => $meta->{name}, sub {
310 return unless $SDL_MIXER; 348 return unless $SDL_MIXER;
311 349
312 # music might have changed... 350 # music might have changed...
313 $meta eq $MUSIC_PLAYING_META 351 $meta eq $MUSIC_PLAYING_META
314 or return &audio_music_start (); 352 or return &audio_music_start ();
316 audio_music_update_volume; 354 audio_music_update_volume;
317 355
318 $MUSIC_PLAYING_DATA = \$_[0]; 356 $MUSIC_PLAYING_DATA = \$_[0];
319 357
320 my $rwops = $meta->{path} 358 my $rwops = $meta->{path}
321 ? new_from_file CFPlus::RW $meta->{path} 359 ? new_from_file DC::RW $meta->{path}
322 : new CFPlus::RW $$MUSIC_PLAYING_DATA; 360 : new DC::RW $$MUSIC_PLAYING_DATA;
323 361
324 $MUSIC_PLAYER = new CFPlus::MixMusic $rwops 362 $MUSIC_PLAYER = new DC::MixMusic $rwops
325 or Carp::confess "music face $meta->{face} unloadable: " . CFPlus::Mix_GetError; 363 or Carp::confess "music face $meta->{face} unloadable: " . DC::Mix_GetError;
326 364
327 my $NOW = time; 365 my $NOW = time;
328 366
329 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) { 367 if ($MUSIC_PLAYING_META->{stop_time} > $NOW - $MUSIC_RESUME) {
330 my $pos = $MUSIC_PLAYING_META->{stop_pos}; 368 my $pos = $MUSIC_PLAYING_META->{stop_pos};
361 399
362 # randomize music a bit so that the order is not always the same 400 # randomize music a bit so that the order is not always the same
363 $_->{stop_time} ||= rand for @MUSIC_HAVE; 401 $_->{stop_time} ||= rand for @MUSIC_HAVE;
364 402
365 # default MUSIC_HAVE == MUSIC_DEFAULT 403 # default MUSIC_HAVE == MUSIC_DEFAULT
366 @MUSIC_HAVE = { path => CFPlus::find_rcfile "music/$MUSIC_DEFAULT" } 404 @MUSIC_HAVE = { path => DC::find_rcfile "music/$MUSIC_DEFAULT" }
367 unless @MUSIC_HAVE; 405 unless @MUSIC_HAVE;
368 } 406 }
369 407
370 # if the currently playing song is acceptable, let it continue 408 # if the currently playing song is acceptable, let it continue
371 return if grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE; 409 return if grep $MUSIC_PLAYING_META == $_, @MUSIC_HAVE;
373 my $NOW = time; 411 my $NOW = time;
374 412
375 if ($MUSIC_PLAYING_META) { 413 if ($MUSIC_PLAYING_META) {
376 $MUSIC_PLAYING_META->{stop_time} = $NOW; 414 $MUSIC_PLAYING_META->{stop_time} = $NOW;
377 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START; 415 $MUSIC_PLAYING_META->{stop_pos} = $NOW - $MUSIC_START;
378 CFPlus::MixMusic::fade_out $fade_out; 416 DC::MixMusic::fade_out $fade_out;
379 } else { 417 } else {
380 # sort by stop time, oldest first 418 # sort by stop time, oldest first
381 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE; 419 @MUSIC_HAVE = sort { $a->{stop_time} <=> $b->{stop_time} } @MUSIC_HAVE;
382 420
383 # if the most recently-played piece played very recently, 421 # if the most recently-played piece played very recently,
417} 455}
418 456
419sub audio_init { 457sub audio_init {
420 if ($CFG->{audio_enable}) { 458 if ($CFG->{audio_enable}) {
421 $ENV{MIX_EFFECTSMAXSPEED} = 1; 459 $ENV{MIX_EFFECTSMAXSPEED} = 1;
422 $SDL_MIXER = !CFPlus::Mix_OpenAudio 460 $SDL_MIXER = !DC::Mix_OpenAudio
423 $CFG->{audio_hw_frequency}, 461 $CFG->{audio_hw_frequency},
424 CFPlus::MIX_DEFAULT_FORMAT, 462 DC::MIX_DEFAULT_FORMAT,
425 $CFG->{audio_hw_channels}, 463 $CFG->{audio_hw_channels},
426 $CFG->{audio_hw_chunksize}; 464 $CFG->{audio_hw_chunksize};
427 465
428 if ($SDL_MIXER) { 466 if ($SDL_MIXER) {
429 CFPlus::Mix_AllocateChannels $CFG->{audio_mix_channels}; 467 DC::Mix_AllocateChannels $CFG->{audio_mix_channels};
430 468
431 audio_music_finished; 469 audio_music_finished;
432 } else { 470 } else {
433 status "Unable to open sound device: there will be no sound"; 471 status "Unable to open sound device: there will be no sound";
434 } 472 }
448 $MUSIC_WANT = []; 486 $MUSIC_WANT = [];
449 @MUSIC_JINGLE = (); 487 @MUSIC_JINGLE = ();
450 %AUDIO_PLAY = (); 488 %AUDIO_PLAY = ();
451 %AUDIO_CHUNK = (); 489 %AUDIO_CHUNK = ();
452 490
453 CFPlus::Mix_CloseAudio if $SDL_MIXER; 491 DC::Mix_CloseAudio if $SDL_MIXER;
454 undef $SDL_MIXER; 492 undef $SDL_MIXER;
455} 493}
456 494
457############################################################################# 495#############################################################################
458 496
478 516
479 return; 517 return;
480 } 518 }
481 } 519 }
482 520
483 $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel 521 $conn->{query_dialog} = my $dialog = new DC::UI::Toplevel
484 x => "center", 522 x => "center",
485 y => "center", 523 y => "center",
486 title => "Server Query", 524 title => "Server Query",
487 child => my $vbox = new CFPlus::UI::VBox, 525 child => my $vbox = new DC::UI::VBox,
488 ; 526 ;
489 527
490 my @dialog = my $label = new CFPlus::UI::Label 528 my @dialog = my $label = new DC::UI::Label
491 max_w => $::WIDTH * 0.8, 529 max_w => $::WIDTH * 0.8,
492 ellipsise => 0, 530 ellipsise => 0,
493 text => $prompt; 531 text => $prompt;
494 532
495 if ($flags & CS_QUERY_YESNO) { 533 if ($flags & CS_QUERY_YESNO) {
496 push @dialog, my $hbox = new CFPlus::UI::HBox; 534 push @dialog, my $hbox = new DC::UI::HBox;
497 535
498 $hbox->add (new CFPlus::UI::Button 536 $hbox->add (new DC::UI::Button
499 text => "No", 537 text => "No",
500 on_activate => sub { 538 on_activate => sub {
501 $conn->send ("reply n"); 539 $conn->send ("reply n");
502 $dialog->destroy; 540 $dialog->destroy;
503 0 541 0
504 } 542 }
505 ); 543 );
506 $hbox->add (new CFPlus::UI::Button 544 $hbox->add (new DC::UI::Button
507 text => "Yes", 545 text => "Yes",
508 on_activate => sub { 546 on_activate => sub {
509 $conn->send ("reply y"); 547 $conn->send ("reply y");
510 destroy_query_dialog $conn; 548 destroy_query_dialog $conn;
511 0 549 0
516 554
517 } elsif ($flags & CS_QUERY_SINGLECHAR) { 555 } elsif ($flags & CS_QUERY_SINGLECHAR) {
518 if ($prompt =~ /Now choose a character|Press any key for the next race/i) { 556 if ($prompt =~ /Now choose a character|Press any key for the next race/i) {
519 $dialog->{tooltip} = "#charcreation_focus"; 557 $dialog->{tooltip} = "#charcreation_focus";
520 558
521 unshift @dialog, new CFPlus::UI::Label 559 unshift @dialog, new DC::UI::Label
522 max_w => $::WIDTH * 0.8, 560 max_w => $::WIDTH * 0.8,
523 ellipsise => 0, 561 ellipsise => 0,
524 markup => "\nOr use your keyboard and the text entry below:\n"; 562 markup => "\nOr use your keyboard and the text entry below:\n";
525 563
526 unshift @dialog, my $table = new CFPlus::UI::Table; 564 unshift @dialog, my $table = new DC::UI::Table;
527 565
528 $table->add_at (0, 0, new CFPlus::UI::Button 566 $table->add_at (0, 0, new DC::UI::Button
529 text => "Next Race", 567 text => "Next Race",
530 on_activate => sub { 568 on_activate => sub {
531 $conn->send ("reply n"); 569 $conn->send ("reply n");
532 destroy_query_dialog $conn; 570 destroy_query_dialog $conn;
533 0 571 0
534 }, 572 },
535 ); 573 );
536 $table->add_at (2, 0, new CFPlus::UI::Button 574 $table->add_at (2, 0, new DC::UI::Button
537 text => "Accept", 575 text => "Accept",
538 on_activate => sub { 576 on_activate => sub {
539 $conn->send ("reply d"); 577 $conn->send ("reply d");
540 destroy_query_dialog $conn; 578 destroy_query_dialog $conn;
541 0 579 0
542 }, 580 },
543 ); 581 );
544 582
545 if ($conn->{chargen_race_description}) { 583 if ($conn->{chargen_race_description}) {
546 unshift @dialog, new CFPlus::UI::Label 584 unshift @dialog, new DC::UI::Label
547 max_w => $::WIDTH * 0.8, 585 max_w => $::WIDTH * 0.8,
548 ellipsise => 0, 586 ellipsise => 0,
549 markup => "<span foreground='#ccccff'>$conn->{chargen_race_description}</span>", 587 markup => "<span foreground='#ccccff'>$conn->{chargen_race_description}</span>",
550 ; 588 ;
551 } 589 }
552 590
553 unshift @dialog, new CFPlus::UI::Face 591 unshift @dialog, new DC::UI::Face
554 face => $conn->{player}{face}, 592 face => $conn->{player}{face},
555 bg => [.2, .2, .2, 1], 593 bg => [.2, .2, .2, 1],
556 min_w => 64, 594 min_w => 64,
557 min_h => 64, 595 min_h => 64,
558 ; 596 ;
559 597
560 if ($conn->{chargen_race_title}) { 598 if ($conn->{chargen_race_title}) {
561 unshift @dialog, new CFPlus::UI::Label 599 unshift @dialog, new DC::UI::Label
562 allign => 1, 600 allign => 1,
563 ellipsise => 0, 601 ellipsise => 0,
564 markup => "<span foreground='#ccccff' size='large'>Race: $conn->{chargen_race_title}</span>", 602 markup => "<span foreground='#ccccff' size='large'>Race: $conn->{chargen_race_title}</span>",
565 ; 603 ;
566 } 604 }
567 605
568 unshift @dialog, new CFPlus::UI::Label 606 unshift @dialog, new DC::UI::Label
569 max_w => $::WIDTH * 0.4, 607 max_w => $::WIDTH * 0.4,
570 ellipsise => 0, 608 ellipsise => 0,
571 markup => (CFPlus::Pod::section_label ui => "chargen_race"), 609 markup => (DC::Pod::section_label ui => "chargen_race"),
572 ; 610 ;
573 611
574 } elsif ($prompt =~ /roll new stats/) { 612 } elsif ($prompt =~ /roll new stats/) {
575 if (my $stat = delete $conn->{stat_change_with}) { 613 if (my $stat = delete $conn->{stat_change_with}) {
576 $conn->send ("reply $stat"); 614 $conn->send ("reply $stat");
577 destroy_query_dialog $conn; 615 destroy_query_dialog $conn;
578 return; 616 return;
579 } 617 }
580 618
581 unshift @dialog, new CFPlus::UI::Label 619 unshift @dialog, new DC::UI::Label
582 max_w => $::WIDTH * 0.4, 620 max_w => $::WIDTH * 0.4,
583 ellipsise => 0, 621 ellipsise => 0,
584 markup => "\nOr use your keyboard and the text entry below:\n"; 622 markup => "\nOr use your keyboard and the text entry below:\n";
585 623
586 unshift @dialog, my $table = new CFPlus::UI::Table; 624 unshift @dialog, my $table = new DC::UI::Table;
587 625
588 # left: re-roll 626 # left: re-roll
589 $table->add_at (0, 0, new CFPlus::UI::Button 627 $table->add_at (0, 0, new DC::UI::Button
590 text => "Roll Again", 628 text => "Roll Again",
591 on_activate => sub { 629 on_activate => sub {
592 $conn->send ("reply y"); 630 $conn->send ("reply y");
593 destroy_query_dialog $conn; 631 destroy_query_dialog $conn;
594 0 632 0
595 }, 633 },
596 ); 634 );
597 635
598 # center: swap stats 636 # center: swap stats
599 my ($sw1, $sw2) = map +(new CFPlus::UI::Selector 637 my ($sw1, $sw2) = map +(new DC::UI::Selector
600 expand => 1, 638 expand => 1,
601 value => $_, 639 value => $_,
602 options => [ 640 options => [
603 [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"], 641 [1 => "Str", "Strength ($conn->{stat}{+CS_STAT_STR})"],
604 [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"], 642 [2 => "Dex", "Dexterity ($conn->{stat}{+CS_STAT_DEX})"],
608 [6 => "Pow", "Power ($conn->{stat}{+CS_STAT_POW})"], 646 [6 => "Pow", "Power ($conn->{stat}{+CS_STAT_POW})"],
609 [7 => "Cha", "Charisma ($conn->{stat}{+CS_STAT_CHA})"], 647 [7 => "Cha", "Charisma ($conn->{stat}{+CS_STAT_CHA})"],
610 ], 648 ],
611 ), 1 .. 2; 649 ), 1 .. 2;
612 650
613 $table->add_at (2, 0, new CFPlus::UI::Button 651 $table->add_at (2, 0, new DC::UI::Button
614 text => "Swap Stats", 652 text => "Swap Stats",
615 on_activate => sub { 653 on_activate => sub {
616 $conn->{stat_change_with} = $sw2->{value}; 654 $conn->{stat_change_with} = $sw2->{value};
617 $conn->send ("reply $sw1->{value}"); 655 $conn->send ("reply $sw1->{value}");
618 destroy_query_dialog $conn; 656 destroy_query_dialog $conn;
619 0 657 0
620 }, 658 },
621 ); 659 );
622 $table->add_at (2, 1, new CFPlus::UI::HBox children => [$sw1, $sw2]); 660 $table->add_at (2, 1, new DC::UI::HBox children => [$sw1, $sw2]);
623 661
624 # right: accept 662 # right: accept
625 $table->add_at (4, 0, new CFPlus::UI::Button 663 $table->add_at (4, 0, new DC::UI::Button
626 text => "Accept", 664 text => "Accept",
627 on_activate => sub { 665 on_activate => sub {
628 $conn->send ("reply n"); 666 $conn->send ("reply n");
629 $STATS_PAGE->hide; 667 $STATS_PAGE->hide;
630 destroy_query_dialog $conn; 668 destroy_query_dialog $conn;
631 0 669 0
632 }, 670 },
633 ); 671 );
634 672
635 unshift @dialog, my $hbox = new CFPlus::UI::HBox; 673 unshift @dialog, my $hbox = new DC::UI::HBox;
636 for ( 674 for (
637 [Str => CS_STAT_STR], 675 [Str => CS_STAT_STR],
638 [Dex => CS_STAT_DEX], 676 [Dex => CS_STAT_DEX],
639 [Con => CS_STAT_CON], 677 [Con => CS_STAT_CON],
640 [Int => CS_STAT_INT], 678 [Int => CS_STAT_INT],
641 [Wis => CS_STAT_WIS], 679 [Wis => CS_STAT_WIS],
642 [Pow => CS_STAT_POW], 680 [Pow => CS_STAT_POW],
643 [Cha => CS_STAT_CHA], 681 [Cha => CS_STAT_CHA],
644 ) { 682 ) {
645 my ($name, $id) = @$_; 683 my ($name, $id) = @$_;
646 $hbox->add (new CFPlus::UI::Label 684 $hbox->add (new DC::UI::Label
647 markup => "$conn->{stat}{$id} <span foreground='yellow'>$name</span>", 685 markup => "$conn->{stat}{$id} <span foreground='yellow'>$name</span>",
648 align => 0,
649 expand => 1, 686 expand => 1,
650 can_events => 1, 687 can_events => 1,
651 can_hover => 1, 688 can_hover => 1,
652 tooltip => "#stat_$name", 689 tooltip => "#stat_$name",
653 ); 690 );
654 } 691 }
655 692
656 unshift @dialog, new CFPlus::UI::Label 693 unshift @dialog, new DC::UI::Label
657 max_w => $::WIDTH * 0.4, 694 max_w => $::WIDTH * 0.4,
658 ellipsise => 0, 695 ellipsise => 0,
659 markup => (CFPlus::Pod::section_label ui => "chargen_stats"), 696 markup => (DC::Pod::section_label ui => "chargen_stats"),
660 ; 697 ;
661 } 698 }
662 699
663 push @dialog, my $entry = new CFPlus::UI::Entry 700 push @dialog, my $entry = new DC::UI::Entry
664 on_changed => sub { 701 on_changed => sub {
665 $conn->send ("reply $_[1]"); 702 $conn->send ("reply $_[1]");
666 destroy_query_dialog $conn; 703 destroy_query_dialog $conn;
667 0 704 0
668 }, 705 },
671 $entry->grab_focus; 708 $entry->grab_focus;
672 709
673 } else { 710 } else {
674 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)"; 711 $dialog->{tooltip} = "Enter the reply and press return (click on the entry to make sure it has keyboard focus)";
675 712
676 push @dialog, my $entry = new CFPlus::UI::Entry 713 push @dialog, my $entry = new DC::UI::Entry
677 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (), 714 $flags & CS_QUERY_HIDEINPUT ? (hidden => "*") : (),
678 on_activate => sub { 715 on_activate => sub {
679 $conn->send ("reply $_[1]"); 716 $conn->send ("reply $_[1]");
680 destroy_query_dialog $conn; 717 destroy_query_dialog $conn;
681 0 718 0
697 734
698 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 735 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
699 736
700 my ($host, $port) = split /:/, $PROFILE->{host}; 737 my ($host, $port) = split /:/, $PROFILE->{host};
701 738
702 $MAP = new CFPlus::Map; 739 $MAP = new DC::Map;
703 740
704 $CONN = eval { 741 $CONN = eval {
705 new CFPlus::Protocol 742 new DC::Protocol
706 host => $host, 743 host => $host,
707 port => $port || 13327, 744 port => $port || 13327,
708 user => $PROFILE->{user}, 745 user => $PROFILE->{user},
709 pass => $PROFILE->{password}, 746 pass => $PROFILE->{password},
710 mapw => $mapsize, 747 mapw => $mapsize,
711 maph => $mapsize, 748 maph => $mapsize,
712 749
713 client => "cfplus $CFPlus::VERSION $] $^O", 750 client => "$DC::VERSION $] $^O",
714 751
715 map_widget => $MAPWIDGET, 752 map_widget => $MAPWIDGET,
716 statusbox => $STATUSBOX, 753 statusbox => $STATUSBOX,
717 map => $MAP, 754 map => $MAP,
718 mapmap => $MAPMAP, 755 mapmap => $MAPMAP,
722 smoothing => $CFG->{map_smoothing}*1, 759 smoothing => $CFG->{map_smoothing}*1,
723 }, 760 },
724 }; 761 };
725 762
726 if ($CONN) { 763 if ($CONN) {
727 CFPlus::lowdelay fileno $CONN->{fh}; 764 DC::lowdelay fileno $CONN->{fh};
728 765
729 status "login successful"; 766 status "login successful";
730 } else { 767 } else {
731 status "unable to connect"; 768 status "unable to connect";
732 stop_game(); 769 stop_game();
737 $LOGIN_BUTTON->set_text ("Login / Register"); 774 $LOGIN_BUTTON->set_text ("Login / Register");
738 $SETUP_NOTEBOOK->set_current_page ($SETUP_LOGIN); 775 $SETUP_NOTEBOOK->set_current_page ($SETUP_LOGIN);
739 $SETUP_DIALOG->show; 776 $SETUP_DIALOG->show;
740 $PL_WINDOW->hide; 777 $PL_WINDOW->hide;
741 $SPELL_LIST->clear_spells; 778 $SPELL_LIST->clear_spells;
742 $CFPlus::UI::ROOT->emit (stop_game => ! ! $CONN); 779 $DC::UI::ROOT->emit (stop_game => ! ! $CONN);
743 780
744 &audio_music_set_ambient ([]); 781 &audio_music_set_ambient ([]);
745 782
746 return unless $CONN; 783 return unless $CONN;
747 784
753 790
754 undef $MAP; 791 undef $MAP;
755} 792}
756 793
757sub graphics_setup { 794sub graphics_setup {
758 my $vbox = new CFPlus::UI::VBox; 795 my $vbox = new DC::UI::VBox;
759 796
760 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]); 797 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]);
761 798
762 my $row = 0; 799 my $row = 0;
763 800
764 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "OpenGL Info"); 801 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "OpenGL Info");
765 $table->add_at (1, $row++, new CFPlus::UI::Label valign => 0, fontsize => 0.8, text => CFPlus::OpenGL::gl_vendor . ", " . CFPlus::OpenGL::gl_version, 802 $table->add_at (1, $row++, new DC::UI::Label fontsize => 0.8, text => DC::OpenGL::gl_vendor . ", " . DC::OpenGL::gl_version,
766 can_events => 1, 803 can_events => 1,
767 tooltip => "<tt><span size='8192'>" . (CFPlus::OpenGL::gl_extensions) . "</span></tt>"); 804 tooltip => "<tt><span size='8192'>" . (DC::OpenGL::gl_extensions) . "</span></tt>");
768 805
769 my $vidmode_tooltip = 806 my $vidmode_tooltip =
770 "<b>Video Mode.</b> The video mode to use for fullscreen (and the window size for windowed operation). " 807 "<b>Video Mode.</b> The video mode to use for fullscreen (and the window size for windowed operation). "
771 . "The format is <i>width</i> x <i>height</i> \@ <i>depth-per-channel</i> + <i>alpha-channel</i>."; 808 . "The format is <i>width</i> x <i>height</i> \@ <i>depth-per-channel</i> + <i>alpha-channel</i>.";
772 809
773 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Video Mode"); 810 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Video Mode");
774 $table->add_at (1, $row++, my $hbox = new CFPlus::UI::HBox); 811 $table->add_at (1, $row++, my $hbox = new DC::UI::HBox);
775 812
776 $hbox->add (my $mode_slider = new CFPlus::UI::Slider 813 $hbox->add (my $mode_slider = new DC::UI::Slider
777 force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1], 814 force_w => $WIDTH * 0.1, expand => 1, range => [$CFG->{sdl_mode}, 0, $#SDL_MODES, 0, 1],
778 tooltip => $vidmode_tooltip); 815 tooltip => $vidmode_tooltip);
779 $hbox->add (my $mode_label = new CFPlus::UI::Label 816 $hbox->add (my $mode_label = new DC::UI::Label
780 align => 0, valign => 0, height => 0.8, template => "9999x9999@9+9", 817 height => 0.8, template => "9999x9999@9+9",
781 can_events => 1, tooltip => $vidmode_tooltip); 818 can_events => 1, tooltip => $vidmode_tooltip);
782 819
783 $mode_slider->connect (changed => sub { 820 $mode_slider->connect (changed => sub {
784 my ($self, $value) = @_; 821 my ($self, $value) = @_;
785 822
786 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value; 823 $CFG->{sdl_mode} = $self->{range}[0] = $value = int $value;
787 $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]}); 824 $mode_label->set_text (sprintf '%dx%d@%d+%d', @{$SDL_MODES[$value]});
788 }); 825 });
789 $mode_slider->emit (changed => $mode_slider->{range}[0]); 826 $mode_slider->emit (changed => $mode_slider->{range}[0]);
790 827
791 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fullscreen"); 828 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fullscreen");
792 $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new CFPlus::UI::CheckBox 829 $table->add_at (1, $row++, $FULLSCREEN_ENABLE = new DC::UI::CheckBox
793 state => $CFG->{fullscreen}, 830 state => $CFG->{fullscreen},
794 tooltip => "Bring the client into fullscreen mode.", 831 tooltip => "Bring the client into fullscreen mode.",
795 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } 832 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
796 ); 833 );
797 834
798 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Force OpenGL 1.1"); 835 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Force OpenGL 1.1");
799 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 836 $table->add_at (1, $row++, new DC::UI::CheckBox
800 state => $CFG->{force_opengl11}, 837 state => $CFG->{force_opengl11},
801 tooltip => "Limit CFPlus to use OpenGL 1.1 features only. This will normally result in " 838 tooltip => "Limit Deliantra to use OpenGL 1.1 features only. This will normally result in "
802 . "higher memory usage and slower performance. It will, however, help tremendously on " 839 . "higher memory usage and slower performance. It will, however, help tremendously on "
803 . "cards that claim to support a feature but fall back to software rendering. " 840 . "cards that claim to support a feature but fall back to software rendering. "
804 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, " 841 . "Nvidia Geforce FX cards are known to claim features the hardware doesn't support, "
805 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you " 842 . "but cards and drivers from other vendors (ATI) are often just as bad. <b>If you "
806 . "experience extremely low framerates and your card should do better, try this option.</b>", 843 . "experience extremely low framerates and your card should do better, try this option.</b>",
807 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 } 844 on_changed => sub { my ($self, $value) = @_; $CFG->{force_opengl11} = $value; 0 }
808 ); 845 );
809 846
810 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Compress Textures"); 847 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Compress Textures");
811 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 848 $table->add_at (1, $row++, new DC::UI::CheckBox
812 state => $CFG->{texture_compression}, 849 state => $CFG->{texture_compression},
813 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but " 850 tooltip => "Use texture compression. Normally this will not reduce visual quality noticable but "
814 . "will save a lot of memory and increase performance. The compression algorithm " 851 . "will save a lot of memory and increase performance. The compression algorithm "
815 . "can differ form card to card, so your mileage may vary. This setting is ignored in " 852 . "can differ form card to card, so your mileage may vary. This setting is ignored in "
816 . "forced OpenGL 1.1 mode.", 853 . "forced OpenGL 1.1 mode.",
817 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 } 854 on_changed => sub { my ($self, $value) = @_; $CFG->{texture_compression} = $value; 0 }
818 ); 855 );
819 856
820 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fast & Ugly"); 857 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fast & Ugly");
821 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 858 $table->add_at (1, $row++, new DC::UI::CheckBox
822 state => $CFG->{fast}, 859 state => $CFG->{fast},
823 tooltip => "Lower the visual quality considerably to speed up rendering.", 860 tooltip => "Lower the visual quality considerably to speed up rendering.",
824 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 } 861 on_changed => sub { my ($self, $value) = @_; $CFG->{fast} = $value; 0 }
825 ); 862 );
826 863
827 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "GUI Fontsize"); 864 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "GUI Fontsize");
828 $table->add_at (1, $row++, new CFPlus::UI::Slider 865 $table->add_at (1, $row++, new DC::UI::Slider
829 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1], 866 range => [$CFG->{gui_fontsize}, 0.5, 2, 0, 0.1],
830 tooltip => "The base font size used by most GUI elements that do not have their own setting.", 867 tooltip => "The base font size used by most GUI elements that do not have their own setting.",
831 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 }, 868 on_changed => sub { $CFG->{gui_fontsize} = $_[1]; 0 },
832 ); 869 );
833 870
834 $table->add_at (1, $row++, new CFPlus::UI::Button 871 $table->add_at (1, $row++, new DC::UI::Button
835 expand => 1, align => 0, text => "Apply", 872 expand => 1, text => "Apply",
836 tooltip => "Apply the video settings above.", 873 tooltip => "Apply the video settings above.",
837 on_activate => sub { 874 on_activate => sub {
838 video_shutdown (); 875 video_shutdown ();
839 video_init (); 876 video_init ();
840 0 877 0
841 } 878 }
842 ); 879 );
843 880
844 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Scale"); 881 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Scale");
845 $table->add_at (1, $row++, new CFPlus::UI::Slider 882 $table->add_at (1, $row++, new DC::UI::Slider
846 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1], 883 range => [(log $CFG->{map_scale}) / (log 2), -3, 1, 0, 1],
847 tooltip => "Enlarge or shrink the displayed map. Changes are instant.", 884 tooltip => "Enlarge or shrink the displayed map. Changes are instant.",
848 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 } 885 on_changed => sub { my ($self, $value) = @_; $CFG->{map_scale} = 2 ** $value; 0 }
849 ); 886 );
850 887
851 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Smoothing"); 888 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Map Smoothing");
852 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 889 $table->add_at (1, $row++, new DC::UI::CheckBox
853 state => $CFG->{map_smoothing}, 890 state => $CFG->{map_smoothing},
854 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. " 891 tooltip => "<b>Map Smoothing</b> tries to make tile borders less square. "
855 . "This increases load on the graphics subsystem and works only with TRT servers. " 892 . "This increases load on the graphics subsystem and works only with TRT servers. "
856 . "Changes take effect at next login only.", 893 . "Changes take effect at next login only.",
857 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 } 894 on_changed => sub { my ($self, $value) = @_; $CFG->{map_smoothing} = $value; 0 }
858 ); 895 );
859 896
860 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Fog of War"); 897 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Fog of War");
861 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 898 $table->add_at (1, $row++, new DC::UI::CheckBox
862 state => $CFG->{fow_enable}, 899 state => $CFG->{fow_enable},
863 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.", 900 tooltip => "<b>Fog-of-War</b> marks areas that cannot be seen by the player. Changes are instant.",
864 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 } 901 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_enable} = $value; 0 }
865 ); 902 );
866 903
867 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "FoW Intensity"); 904 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "FoW Intensity");
868 $table->add_at (1, $row++, new CFPlus::UI::Slider 905 $table->add_at (1, $row++, new DC::UI::Slider
869 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256], 906 range => [$CFG->{fow_intensity}, 0, 1, 0, 1 / 256],
870 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.", 907 tooltip => "<b>Fog of War Lightness.</b> The higher the intensity, the lighter the Fog-of-War color. Changes are instant.",
871 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 } 908 on_changed => sub { my ($self, $value) = @_; $CFG->{fow_intensity} = $value; 0 }
872 ); 909 );
873 910
874 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Message Fontsize"); 911 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Message Fontsize");
875 $table->add_at (1, $row++, new CFPlus::UI::Slider 912 $table->add_at (1, $row++, new DC::UI::Slider
876 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 913 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
877 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, " 914 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant, "
878 . "but you still need to press apply to correctly re-layout the widget.", 915 . "but you still need to press apply to correctly re-layout the widget.",
879 on_changed => sub { $MESSAGE_WINDOW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, 916 on_changed => sub { $MESSAGE_DIST->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
880 ); 917 );
881 918
882 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 919 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge fontsize");
883 $table->add_at (1, $row++, new CFPlus::UI::Slider 920 $table->add_at (1, $row++, new DC::UI::Slider
884 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 921 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
885 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", 922 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
886 on_changed => sub { 923 on_changed => sub {
887 $CFG->{gauge_fontsize} = $_[1]; 924 $CFG->{gauge_fontsize} = $_[1];
888 &set_gauge_window_fontsize; 925 &set_gauge_window_fontsize;
889 0 926 0
890 } 927 }
891 ); 928 );
892 929
893 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Gauge size"); 930 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Gauge size");
894 $table->add_at (1, $row++, new CFPlus::UI::Slider 931 $table->add_at (1, $row++, new DC::UI::Slider
895 range => [$CFG->{gauge_size}, 0.2, 0.8], 932 range => [$CFG->{gauge_size}, 0.2, 0.8],
896 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.", 933 tooltip => "Adjust the size of the stats gauges at the bottom right. Changes are instant.",
897 on_changed => sub { 934 on_changed => sub {
898 $CFG->{gauge_size} = $_[1]; 935 $CFG->{gauge_size} = $_[1];
899 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size}); 936 $GAUGES->{win}->set_size ($WIDTH, int $HEIGHT * $CFG->{gauge_size});
906 943
907our $AUDIO_HW_CHUNKSIZE; 944our $AUDIO_HW_CHUNKSIZE;
908our $AUDIO_INFO; 945our $AUDIO_INFO;
909 946
910sub audio_tab_update { 947sub audio_tab_update {
911 my ($freq, $format, $chans) = CFPlus::Mix_QuerySpec; 948 my ($freq, $format, $chans) = DC::Mix_QuerySpec;
912 949
913 $AUDIO_HW_CHUNKSIZE->set_options ([ 950 $AUDIO_HW_CHUNKSIZE->set_options ([
914 [0, "default", "Use System Default"], 951 [0, "default", "Use System Default"],
915 map { 952 map {
916 my $ms = sprintf "%dms", 1000 * $_ / ($CFG->{audio_hw_frequency} || 22050); 953 my $ms = sprintf "%dms", 1000 * $_ / ($CFG->{audio_hw_frequency} || 22050);
926 963
927 $AUDIO_INFO->set_text ($text); 964 $AUDIO_INFO->set_text ($text);
928} 965}
929 966
930sub audio_setup { 967sub audio_setup {
931 my $vbox = new CFPlus::UI::VBox; 968 my $vbox = new DC::UI::VBox;
932 969
933 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1]); 970 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]);
934 971
935 my $row = 0; 972 my $row = 0;
936 973
937 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Audio Enable"); 974 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable");
938 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 975 $table->add_at (1, $row++, new DC::UI::CheckBox
939 state => $CFG->{audio_enable}, 976 state => $CFG->{audio_enable},
940 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.", 977 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.",
941 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 } 978 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 }
942 ); 979 );
943 980
944 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Sound Effects"); 981 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects");
945 $table->add_at (1, $row, new CFPlus::UI::CheckBox 982 $table->add_at (1, $row, new DC::UI::CheckBox
946 expand => 1, state => $CFG->{effects_enable}, 983 expand => 1, state => $CFG->{effects_enable},
947 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.", 984 tooltip => "If enabled, sound effects are enabled. If disabled, no sound effects will be played.",
948 on_changed => sub { 985 on_changed => sub {
949 $CFG->{effects_enable} = $_[1]; 986 $CFG->{effects_enable} = $_[1];
950 $CONN->update_fx_want if $CONN; 987 $CONN->update_fx_want if $CONN;
951 1 988 1
952 } 989 }
953 ); 990 );
954 $table->add_at (2, $row++, new CFPlus::UI::Slider 991 $table->add_at (2, $row++, new DC::UI::Slider
955 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128], 992 expand => 1, range => [$CFG->{effects_volume}, 0, 1, 0, 1/128],
956 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this " 993 tooltip => "The relative volume of sound effects. Best audio quality is achieved if this "
957 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.", 994 . "is set highest (rightmost) and you use your operating system volume setting. Changes are instant.",
958 on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 } 995 on_changed => sub { $CFG->{effects_volume} = $_[1]; 1 }
959 ); 996 );
960 997
961 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Background Music"); 998 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music");
962 $table->add_at (1, $row, new CFPlus::UI::CheckBox 999 $table->add_at (1, $row, new DC::UI::CheckBox
963 expand => 1, state => $CFG->{bgm_enable}, 1000 expand => 1, state => $CFG->{bgm_enable},
964 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 1001 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.",
965 on_changed => sub { 1002 on_changed => sub {
966 $CFG->{bgm_enable} = $_[1]; 1003 $CFG->{bgm_enable} = $_[1];
967 $CONN->update_fx_want if $CONN; 1004 $CONN->update_fx_want if $CONN;
968 audio_music_push; 1005 audio_music_push;
969 1 1006 1
970 } 1007 }
971 ); 1008 );
972 $table->add_at (2, $row++, new CFPlus::UI::Slider 1009 $table->add_at (2, $row++, new DC::UI::Slider
973 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128], 1010 expand => 1, range => [$CFG->{bgm_volume}, 0, 1, 0, 1/128],
974 tooltip => "The volume of the background music. Changes are instant.", 1011 tooltip => "The volume of the background music. Changes are instant.",
975 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 } 1012 on_changed => sub { $CFG->{bgm_volume} = $_[1]; audio_music_update_volume; 0 }
976 ); 1013 );
977 1014
978 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Frequency"); 1015 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Frequency");
979 $table->add_at (1, $row++, new CFPlus::UI::Selector 1016 $table->add_at (1, $row++, new DC::UI::Selector
980 c_colspan => 2, expand => 1, 1017 c_colspan => 2, expand => 1,
981 value => $CFG->{audio_hw_frequency}, 1018 value => $CFG->{audio_hw_frequency},
982 options => [ 1019 options => [
983 [ 0, "default" , "Use System Default"], 1020 [ 0, "default" , "Use System Default"],
984 [11025, "11 kHz" , "11kHz (low quality)"], 1021 [11025, "11 kHz" , "11kHz (low quality)"],
992 audio_tab_update; 1029 audio_tab_update;
993 1 1030 1
994 } 1031 }
995 ); 1032 );
996 1033
997 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Channels"); 1034 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Channels");
998 $table->add_at (1, $row++, new CFPlus::UI::Selector 1035 $table->add_at (1, $row++, new DC::UI::Selector
999 c_colspan => 2, expand => 1, 1036 c_colspan => 2, expand => 1,
1000 value => $CFG->{audio_hw_channels}, 1037 value => $CFG->{audio_hw_channels},
1001 options => [ 1038 options => [
1002 [0, "default" , "Use System Default"], 1039 [0, "default" , "Use System Default"],
1003 [1, "Mono" , "Mono (single channel, low quality)"], 1040 [1, "Mono" , "Mono (single channel, low quality)"],
1011 audio_tab_update; 1048 audio_tab_update;
1012 1 1049 1
1013 } 1050 }
1014 ); 1051 );
1015 1052
1016 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Latency"); 1053 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency");
1017 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new CFPlus::UI::Selector 1054 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector
1018 c_colspan => 2, expand => 1, 1055 c_colspan => 2, expand => 1,
1019 value => $CFG->{audio_hw_chunksize}, 1056 value => $CFG->{audio_hw_chunksize},
1020 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback " 1057 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback "
1021 . "is stuttering, increase this value. Values of 50-100ms are optimal.", 1058 . "is stuttering, increase this value. Values of 50-100ms are optimal.",
1022 on_changed => sub { 1059 on_changed => sub {
1025 1 1062 1
1026 } 1063 }
1027 ); 1064 );
1028 1065
1029 # should really be a slider 1066 # should really be a slider
1030 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Mixer Voices"); 1067 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Mixer Voices");
1031 $table->add_at (1, $row++, new CFPlus::UI::ValSlider 1068 $table->add_at (1, $row++, new DC::UI::ValSlider
1032 c_colspan => 2, expand => 1, 1069 c_colspan => 2, expand => 1,
1033 tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.", 1070 tooltip => "The number of simultaneous sound effects possible. Higher is better, but also more cpu-intensive and might cause stuttering.",
1034 range => [$::CFG->{audio_mix_channels}, 4, 32, 0, 1], 1071 range => [$::CFG->{audio_mix_channels}, 4, 32, 0, 1],
1035 template => ">= 99", 1072 template => ">= 99",
1036 on_changed => sub { 1073 on_changed => sub {
1040 if $value; 1077 if $value;
1041 1; 1078 1;
1042 } 1079 }
1043 ); 1080 );
1044 1081
1045 $table->add_at (1, $row++, new CFPlus::UI::Button 1082 $table->add_at (1, $row++, new DC::UI::Button
1046 c_colspan => 2, expand => 1, align => 0, text => "Apply", 1083 c_colspan => 2, expand => 1, text => "Apply",
1047 tooltip => "Apply the audio settings", 1084 tooltip => "Apply the audio settings",
1048 on_activate => sub { 1085 on_activate => sub {
1049 audio_shutdown (); 1086 audio_shutdown ();
1050 audio_init (); 1087 audio_init ();
1051 0 1088 0
1052 } 1089 }
1053 ); 1090 );
1054 1091
1055 $vbox->add (new CFPlus::UI::FancyFrame 1092 $vbox->add (new DC::UI::FancyFrame
1056 expand => 1, 1093 expand => 1,
1057 label => "Audio Info", 1094 label => "Audio Info",
1058 child => ($AUDIO_INFO = new CFPlus::UI::Label ellipsise => 0), 1095 child => ($AUDIO_INFO = new DC::UI::Label ellipsise => 0),
1059 ); 1096 );
1060 1097
1061 audio_tab_update; 1098 audio_tab_update;
1062 1099
1063 $vbox 1100 $vbox
1070} 1107}
1071 1108
1072sub make_gauge_window { 1109sub make_gauge_window {
1073 my $gh = int $HEIGHT * $CFG->{gauge_size}; 1110 my $gh = int $HEIGHT * $CFG->{gauge_size};
1074 1111
1075 my $win = new CFPlus::UI::Frame ( 1112 my $win = new DC::UI::Frame (
1076 force_x => 0, 1113 force_x => 0,
1077 force_y => "max", 1114 force_y => "max",
1078 force_w => $WIDTH, 1115 force_w => $WIDTH,
1079 force_h => $gh, 1116 force_h => $gh,
1080 ); 1117 );
1081 1118
1082 $win->add (my $hbox = new CFPlus::UI::HBox 1119 $win->add (my $hbox = new DC::UI::HBox
1083 children => [ 1120 children => [
1084 (new CFPlus::UI::HBox expand => 1), 1121 (new DC::UI::HBox expand => 1),
1085 (new CFPlus::UI::VBox children => [ 1122 (new DC::UI::VBox children => [
1086 (new CFPlus::UI::Empty expand => 1), 1123 (new DC::UI::Empty expand => 1),
1087 (new CFPlus::UI::Frame bg => [0, 0, 0, 0.4], child => ($FLOORBOX = new CFPlus::UI::Table)), 1124 (new DC::UI::Frame bg => [0, 0, 0, 0.4], child => ($FLOORBOX = new DC::UI::Table)),
1088 ]), 1125 ]),
1089 (my $vbox = new CFPlus::UI::VBox), 1126 (my $vbox = new DC::UI::VBox),
1090 ], 1127 ],
1091 ); 1128 );
1092 1129
1093 $vbox->add (new CFPlus::UI::HBox 1130 $vbox->add (new DC::UI::HBox
1094 expand => 1, 1131 expand => 1,
1095 children => [ 1132 children => [
1096 (new CFPlus::UI::Empty expand => 1), 1133 (new DC::UI::Empty expand => 1),
1097 (my $hb = new CFPlus::UI::HBox), 1134 (my $hb = new DC::UI::HBox),
1098 ], 1135 ],
1099 ); 1136 );
1100 1137
1101 $hb->add (my $hg = new CFPlus::UI::Gauge type => 'hp', tooltip => "#stat_health"); 1138 $hb->add (my $hg = new DC::UI::Gauge type => 'hp', tooltip => "#stat_health");
1102 $hb->add (my $mg = new CFPlus::UI::Gauge type => 'mana', tooltip => "#stat_mana"); 1139 $hb->add (my $mg = new DC::UI::Gauge type => 'mana', tooltip => "#stat_mana");
1103 $hb->add (my $gg = new CFPlus::UI::Gauge type => 'grace', tooltip => "#stat_grace"); 1140 $hb->add (my $gg = new DC::UI::Gauge type => 'grace', tooltip => "#stat_grace");
1104 $hb->add (my $fg = new CFPlus::UI::Gauge type => 'food', tooltip => "#stat_food"); 1141 $hb->add (my $fg = new DC::UI::Gauge type => 'food', tooltip => "#stat_food");
1105 1142
1106 $vbox->add (my $exp = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp"); 1143 $vbox->add (my $exp = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_exp");
1107 $vbox->add (my $prg = new CFPlus::UI::ExperienceProgress); 1144 $vbox->add (my $prg = new DC::UI::ExperienceProgress);
1108 $vbox->add (my $sklprg = new CFPlus::UI::ExperienceProgress); 1145 $vbox->add (my $sklprg = new DC::UI::ExperienceProgress);
1109 $vbox->add (my $rng = new CFPlus::UI::Label valign => 0, align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged"); 1146 $vbox->add (my $rng = new DC::UI::Label align => 1, can_hover => 1, can_events => 1, tooltip => "#stat_ranged");
1110 1147
1111 $GAUGES = { 1148 $GAUGES = {
1112 exp => $exp, prg => $prg, sklprg => $sklprg, 1149 exp => $exp, prg => $prg, sklprg => $sklprg,
1113 win => $win, range => $rng, 1150 win => $win, range => $rng,
1114 hp => $hg, mana => $mg, grace => $gg, food => $fg, 1151 hp => $hg, mana => $mg, grace => $gg, food => $fg,
1118 1155
1119 $win 1156 $win
1120} 1157}
1121 1158
1122sub debug_setup { 1159sub debug_setup {
1123 my $table = new CFPlus::UI::Table; 1160 my $table = new DC::UI::Table;
1124 1161
1125 $table->add_at (0, 0, new CFPlus::UI::Label text => "Widget Borders"); 1162 $table->add_at (0, 0, new DC::UI::Label text => "Widget Borders");
1126 $table->add_at (1, 0, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 }); 1163 $table->add_at (1, 0, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 });
1127 $table->add_at (0, 1, new CFPlus::UI::Label text => "Tooltip Widget Info"); 1164 $table->add_at (0, 1, new DC::UI::Label text => "Tooltip Widget Info");
1128 $table->add_at (1, 1, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 }); 1165 $table->add_at (1, 1, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 });
1129 $table->add_at (0, 2, new CFPlus::UI::Label text => "Show FPS"); 1166 $table->add_at (0, 2, new DC::UI::Label text => "Show FPS");
1130 $table->add_at (1, 2, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 1167 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 });
1131 $table->add_at (0, 3, new CFPlus::UI::Label text => "Suppress Tooltips"); 1168 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips");
1132 $table->add_at (1, 3, new CFPlus::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 1169 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 });
1133 $table->add_at (0, 4, new CFPlus::UI::Button text => "die on click(tm)", on_activate => sub { &CFPlus::debug() } ); 1170 $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } );
1134 1171
1135 $table->add_at (0, 5, new CFPlus::UI::TextEdit text => "line1\0152\0153");#d# 1172 $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d#
1136 1173
1137 $table->add_at (7,7, my $t = new CFPlus::UI::Table expand => 0); 1174 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0);
1138 $t->add_at (0,0, new CFPlus::UI::Label text => "a a a a", c_rowspan => 1, c_colspan => 2); 1175 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2);
1139 $t->add_at (2,0, new CFPlus::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1); 1176 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1140 $t->add_at (1,2, new CFPlus::UI::Label text => "c c c c", c_rowspan => 1, c_colspan => 2); 1177 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2);
1141 $t->add_at (0,1, new CFPlus::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1); 1178 $t->add_at (0,1, new DC::UI::Label text => "d\nd", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1142 $t->add_at (1,1, new CFPlus::UI::Label text => "e"); 1179 $t->add_at (1,1, new DC::UI::Label text => "e");
1143 1180
1144 $table->add_at (7, 6, my $c = new CFPlus::UI::Canvas); 1181 $table->add_at (7, 6, my $c = new DC::UI::Canvas);
1145 1182
1146 $c->add_items ({ 1183 $c->add_items ({
1147 type => "line_loop", 1184 type => "line_loop",
1148 color => [0, 1, 0], 1185 color => [0, 1, 0],
1149 width => 9, 1186 width => 9,
1169 1206
1170 $table 1207 $table
1171} 1208}
1172 1209
1173sub stats_window { 1210sub stats_window {
1174 my $r = new CFPlus::UI::ScrolledWindow ( 1211 my $r = new DC::UI::ScrolledWindow (
1175 expand => 1, 1212 expand => 1,
1176 scroll_y => 1 1213 scroll_y => 1
1177 ); 1214 );
1178 $r->add (my $vb = new CFPlus::UI::VBox); 1215 $r->add (my $vb = new DC::UI::VBox);
1179 1216
1180 $vb->add (new CFPlus::UI::FancyFrame 1217 $vb->add (new DC::UI::FancyFrame
1181 label => "Player", 1218 label => "Player",
1182 child => (my $pi = new CFPlus::UI::VBox), 1219 child => (my $pi = new DC::UI::VBox),
1183 ); 1220 );
1184 1221
1185 $pi->add ($STATWIDS->{title} = new CFPlus::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 1222 $pi->add ($STATWIDS->{title} = new DC::UI::Label text => "Title:", expand => 1, align => 0,
1186 can_hover => 1, can_events => 1, 1223 can_hover => 1, can_events => 1,
1187 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 1224 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
1188 $pi->add ($STATWIDS->{map} = new CFPlus::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, 1225 $pi->add ($STATWIDS->{map} = new DC::UI::Label align => 0, text => "Map:", expand => 1,
1189 can_hover => 1, can_events => 1, 1226 can_hover => 1, can_events => 1,
1190 tooltip => "The map you are currently on (if supported by the server)."); 1227 tooltip => "The map you are currently on (if supported by the server).");
1191 1228
1192 $pi->add (my $hb0 = new CFPlus::UI::HBox); 1229 $pi->add (my $hb0 = new DC::UI::HBox);
1193 $hb0->add ($STATWIDS->{weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1, 1230 $hb0->add ($STATWIDS->{weight} = new DC::UI::Label text => "Weight:", expand => 1, align => 0,
1194 can_hover => 1, can_events => 1, 1231 can_hover => 1, can_events => 1,
1195 tooltip => "The weight of the player including all inventory items."); 1232 tooltip => "The weight of the player including all inventory items.");
1196 $hb0->add ($STATWIDS->{m_weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1, 1233 $hb0->add ($STATWIDS->{m_weight} = new DC::UI::Label align => 0, text => "Max weight:", expand => 1,
1197 can_hover => 1, can_events => 1, 1234 can_hover => 1, can_events => 1,
1198 tooltip => "The weight limit: you cannot carry more than this."); 1235 tooltip => "The weight limit: you cannot carry more than this.");
1199 1236
1200 $vb->add (new CFPlus::UI::FancyFrame 1237 $vb->add (new DC::UI::FancyFrame
1201 label => "Primary/Secondary Statistics", 1238 label => "Primary/Secondary Statistics",
1202 child => (my $hb = new CFPlus::UI::HBox expand => 1), 1239 child => (my $hb = new DC::UI::HBox expand => 1),
1203 ); 1240 );
1204 $hb->add (my $tbl = new CFPlus::UI::Table expand => 1); 1241 $hb->add (my $tbl = new DC::UI::Table expand => 1);
1205 1242
1206 my $color2 = [1, 1, 0]; 1243 my $color2 = [1, 1, 0];
1207 1244
1208 for ( 1245 for (
1209 [0, 0, st_str => "Str", 30], 1246 [0, 0, st_str => "Str", 30],
1221 [2, 4, st_spd => "Spd", 10.54], 1258 [2, 4, st_spd => "Spd", 10.54],
1222 [2, 5, st_wspd => "WSp", 10.54], 1259 [2, 5, st_wspd => "WSp", 10.54],
1223 ) { 1260 ) {
1224 my ($col, $row, $id, $label, $template) = @$_; 1261 my ($col, $row, $id, $label, $template) = @$_;
1225 1262
1226 $tbl->add_at ($col , $row, $STATWIDS->{$id} = new CFPlus::UI::Label 1263 $tbl->add_at ($col , $row, $STATWIDS->{$id} = new DC::UI::Label
1227 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, 1264 font => $FONT_FIXED, can_hover => 1, can_events => 1,
1228 align => +1, template => $template, tooltip => "#stat_$label"); 1265 align => 1, template => $template, tooltip => "#stat_$label");
1229 $tbl->add_at ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFPlus::UI::Label 1266 $tbl->add_at ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new DC::UI::Label
1230 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, 1267 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2,
1231 align => -1, text => $label, tooltip => "#stat_$label"); 1268 align => 0, text => $label, tooltip => "#stat_$label");
1232 } 1269 }
1233 1270
1234 $vb->add (new CFPlus::UI::FancyFrame 1271 $vb->add (new DC::UI::FancyFrame
1235 label => "Resistancies", 1272 label => "Resistancies",
1236 child => (my $tbl2 = new CFPlus::UI::Table expand => 1), 1273 child => (my $tbl2 = new DC::UI::Table expand => 1, col_expand => [1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0]),
1237 ); 1274 );
1238 1275
1239 my $row = 0; 1276 my $row = 0;
1240 my $col = 0; 1277 my $col = 0;
1241 1278
1280 1317
1281 for (qw/slow holyw conf fire depl magic 1318 for (qw/slow holyw conf fire depl magic
1282 drain acid pois para deat phys 1319 drain acid pois para deat phys
1283 blind fear tund elec cold ghit/) 1320 blind fear tund elec cold ghit/)
1284 { 1321 {
1285 $tbl2->add_at ($col, $row, 1322 $tbl2->add_at ($col + 2, $row,
1286 $STATWIDS->{"res_$_"} = 1323 $STATWIDS->{"res_$_"} =
1287 new CFPlus::UI::Label 1324 new DC::UI::Label
1288 font => $FONT_FIXED, 1325 font => $FONT_FIXED,
1289 template => "-100%", 1326 template => "-100%",
1290 align => +1, 1327 align => 1,
1291 valign => 0,
1292 can_events => 1, 1328 can_events => 1,
1293 can_hover => 1, 1329 can_hover => 1,
1294 tooltip => $resist_names{$_}->[1], 1330 tooltip => $resist_names{$_}->[1],
1295 ); 1331 );
1296 $tbl2->add_at ($col + 1, $row, new CFPlus::UI::Image 1332 $tbl2->add_at ($col + 1, $row, new DC::UI::Image
1297 font => $FONT_FIXED, 1333 font => $FONT_FIXED,
1298 can_hover => 1, 1334 can_hover => 1,
1299 can_events => 1, 1335 can_events => 1,
1300 path => "ui/resist/resist_$_.png", 1336 path => "ui/resist/resist_$_.png",
1301 tooltip => $resist_names{$_}->[1], 1337 tooltip => $resist_names{$_}->[1],
1302 ); 1338 );
1303 $tbl2->add_at ($col + 2, $row, new CFPlus::UI::Label 1339 $tbl2->add_at ($col + 0, $row, new DC::UI::Label
1304 text => $resist_names{$_}->[0], 1340 text => $resist_names{$_}->[0],
1305 font => $FONT_FIXED, 1341 font => $FONT_FIXED,
1342 align => 1,
1306 can_hover => 1, 1343 can_hover => 1,
1307 can_events => 1, 1344 can_events => 1,
1308 tooltip => $resist_names{$_}->[1], 1345 tooltip => $resist_names{$_}->[1],
1309 ); 1346 );
1310 1347
1311 $row++; 1348 $row++;
1312 if ($row % 6 == 0) { 1349 if ($row % 6 == 0) {
1313 $col += 3; 1350 $col += 4;
1314 $row = 0; 1351 $row = 0;
1315 } 1352 }
1316 } 1353 }
1317 1354
1318 #update_stats_window ({}); 1355 #update_stats_window ({});
1319 1356
1320 $r 1357 $r
1321} 1358}
1322 1359
1323sub skill_window { 1360sub skill_window {
1324 my $sw = new CFPlus::UI::ScrolledWindow (expand => 1); 1361 my $sw = new DC::UI::ScrolledWindow (expand => 1);
1325 1362
1326 $sw->add ($STATWIDS->{skill_tbl} = new CFPlus::UI::Table expand => 1, col_expand => [0, 0, 1, .1, 0, 0, 1, .1]); 1363 $sw->add ($STATWIDS->{skill_tbl} = new DC::UI::Table expand => 1, col_expand => [0, 0, 1, .1, 0, 0, 1, .1]);
1327 1364
1328 $sw 1365 $sw
1329} 1366}
1330 1367
1331sub formsep($) { 1368sub formsep($) {
1343 return if $METASERVER_ATIME > time; 1380 return if $METASERVER_ATIME > time;
1344 $METASERVER_ATIME = time + 60; 1381 $METASERVER_ATIME = time + 60;
1345 1382
1346 my $table = $METASERVER->{table}; 1383 my $table = $METASERVER->{table};
1347 $table->clear; 1384 $table->clear;
1348 $table->add_at (0, 0, my $label = new CFPlus::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list..."); 1385 $table->add_at (0, 0, my $label = new DC::UI::Label max_w => $WIDTH * 0.8, text => "fetching server list...");
1349 1386
1350 my $ok = 0; 1387 my $ok = 0;
1351 1388
1352 CFPlus::background { 1389 DC::background {
1353 my $ua = CFPlus::lwp_useragent; 1390 my $ua = DC::lwp_useragent;
1354 1391
1355 CFPlus::background_msg CFPlus::decode_json +(CFPlus::lwp_check $ua->get ($META_SERVER))->decoded_content; 1392 DC::background_msg DC::decode_json +(DC::lwp_check $ua->get ($META_SERVER))->decoded_content;
1356 } sub { 1393 } sub {
1357 my ($msg) = @_; 1394 my ($msg) = @_;
1358 if ($msg) { 1395 if ($msg) {
1359 $table->clear; 1396 $table->clear;
1360 1397
1363 "The hostname of the server.", 1400 "The hostname of the server.",
1364 "The time this server has been running without being restarted.", 1401 "The time this server has been running without being restarted.",
1365 "Short information about this server provided by its admins.", 1402 "Short information about this server provided by its admins.",
1366 ); 1403 );
1367 my @col = qw(#Users Host Uptime Version Description); 1404 my @col = qw(#Users Host Uptime Version Description);
1368 $table->add_at ($_, 0, new CFPlus::UI::Label 1405 $table->add_at ($_, 0, new DC::UI::Label
1369 can_hover => 1, can_events => 1, 1406 can_hover => 1, can_events => 1, fg => [1, 1, 0],
1370 align => 0, fg => [1, 1, 0],
1371 text => $col[$_], tooltip => $tip[$_]) 1407 text => $col[$_], tooltip => $tip[$_])
1372 for 0 .. $#col; 1408 for 0 .. $#col;
1373 1409
1374 my @align = qw(1 0 1 1 -1); 1410 my @align = qw(1 0.5 1 1 0);
1375 1411
1376 my $y = 0; 1412 my $y = 0;
1377 for my $m (@{ $msg->{servers} }) { 1413 for my $m (@{ $msg->{servers} }) {
1378 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime, $highlight) = 1414 my ($ip, $last, $host, $users, $version, $desc, $ibytes, $obytes, $uptime, $highlight) =
1379 @$m{qw(ip age hostname users version description ibytes obytes uptime highlight)}; 1415 @$m{qw(ip age hostname users version description ibytes obytes uptime highlight)};
1395 1431
1396 $m = [$users, $host, $uptime, $version, $desc]; 1432 $m = [$users, $host, $uptime, $version, $desc];
1397 1433
1398 $y++; 1434 $y++;
1399 1435
1400 $table->add_at (scalar @$m, $y, new CFPlus::UI::VBox children => [ 1436 $table->add_at (scalar @$m, $y, new DC::UI::VBox children => [
1401 (new CFPlus::UI::Button 1437 (new DC::UI::Button
1402 text => "Use", 1438 text => "Use",
1403 tooltip => "Put this server into the <b>Host:Port</b> field", 1439 tooltip => "Put this server into the <b>Host:Port</b> field",
1404 on_activate => sub { 1440 on_activate => sub {
1405 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host); 1441 $HOST_ENTRY->set_text ($CFG->{profile}{default}{host} = $host);
1406 $METASERVER->hide; 1442 $METASERVER->hide;
1407 0 1443 0
1408 }, 1444 },
1409 ), 1445 ),
1410 (new CFPlus::UI::Empty expand => 1), 1446 (new DC::UI::Empty expand => 1),
1411 ]); 1447 ]);
1412 1448
1413 $table->add_at ($_, $y, new CFPlus::UI::Label 1449 $table->add_at ($_, $y, new DC::UI::Label
1414 max_w => $::WIDTH * 0.4, 1450 max_w => $::WIDTH * 0.4,
1415 ellipsise => 0, 1451 ellipsise => 0,
1416 align => $align[$_], 1452 align => $align[$_],
1417 text => $m->[$_], 1453 text => $m->[$_],
1418 tooltip => $tip[$_], 1454 tooltip => $tip[$_],
1428 }; 1464 };
1429 1465
1430} 1466}
1431 1467
1432sub metaserver_dialog { 1468sub metaserver_dialog {
1433 my $vbox = new CFPlus::UI::VBox; 1469 my $vbox = new DC::UI::VBox;
1434 my $table = new CFPlus::UI::Table; 1470 my $table = new DC::UI::Table;
1435 $vbox->add (new CFPlus::UI::ScrolledWindow expand => 1, child => $table); 1471 $vbox->add (new DC::UI::ScrolledWindow expand => 1, child => $table);
1436 1472
1437 my $dialog = new CFPlus::UI::Toplevel 1473 my $dialog = new DC::UI::Toplevel
1438 title => "Server List", 1474 title => "Server List",
1439 name => 'metaserver_dialog', 1475 name => 'metaserver_dialog',
1440 x => 'center', 1476 x => 'center',
1441 y => 'center', 1477 y => 'center',
1442 z => 3, 1478 z => 3,
1453 1489
1454 $dialog 1490 $dialog
1455} 1491}
1456 1492
1457sub login_setup { 1493sub login_setup {
1458 my $vbox = new CFPlus::UI::VBox; 1494 my $vbox = new DC::UI::VBox;
1459 1495
1460 $vbox->add (new CFPlus::UI::FancyFrame 1496 $vbox->add (new DC::UI::FancyFrame
1461 label => "Login Settings", 1497 label => "Login Settings",
1462 child => (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]), 1498 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1463 ); 1499 );
1464 1500
1465 $table->add_at (0, 4, new CFPlus::UI::Label valign => 0, align => 1, text => "Username"); 1501 $table->add_at (0, 4, new DC::UI::Label align => 1, text => "Username");
1466 $table->add_at (1, 4, new CFPlus::UI::Entry 1502 $table->add_at (1, 4, new DC::UI::Entry
1467 text => $CFG->{profile}{default}{user}, 1503 text => $CFG->{profile}{default}{user},
1468 tooltip => "The name of your character on the server.", 1504 tooltip => "The name of your character on the server.",
1469 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 } 1505 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{user} = $value; 1 }
1470 ); 1506 );
1471 1507
1472 $table->add_at (0, 5, new CFPlus::UI::Label valign => 0, align => 1, text => "Password"); 1508 $table->add_at (0, 5, new DC::UI::Label align => 1, text => "Password");
1473 $table->add_at (1, 5, new CFPlus::UI::Entry 1509 $table->add_at (1, 5, new DC::UI::Entry
1474 text => $CFG->{profile}{default}{password}, 1510 text => $CFG->{profile}{default}{password},
1475 hidden => 1, 1511 hidden => 1,
1476 tooltip => "The password for your character.", 1512 tooltip => "The password for your character.",
1477 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 } 1513 on_changed => sub { my ($self, $value) = @_; $CFG->{profile}{default}{password} = $value; 1 }
1478 ); 1514 );
1479 1515
1480 $table->add_at (1, 11, $LOGIN_BUTTON = new CFPlus::UI::Button 1516 $table->add_at (1, 11, $LOGIN_BUTTON = new DC::UI::Button
1481 expand => 1, 1517 expand => 1,
1482 align => 0,
1483 text => "Login / Register", 1518 text => "Login / Register",
1484 tooltip => "This button will either login to the account configured above or register a new account.", 1519 tooltip => "This button will either login to the account configured above or register a new account.",
1485 on_activate => sub { 1520 on_activate => sub {
1486 $CONN ? stop_game 1521 $CONN ? stop_game
1487 : start_game; 1522 : start_game;
1488 1 1523 1
1489 }, 1524 },
1490 ); 1525 );
1491 1526
1492 $vbox->add (new CFPlus::UI::FancyFrame 1527 $vbox->add (new DC::UI::FancyFrame
1493 label => "Registering", 1528 label => "Registering",
1494 min_h => 200, 1529 min_h => 200,
1495 child => (new CFPlus::UI::Label valign => -1, ellipsise => 0, 1530 child => (new DC::UI::Label valign => 0, ellipsise => 0,
1496 markup => 1531 markup =>
1497 "To register a new account, choose a username that hasn't been taken yet and " 1532 "To register a new account, choose a username that hasn't been taken yet and "
1498 . "try to log-in. Follow the instructions in the Log tab in the message window.", 1533 . "try to log-in. Follow the instructions in the Log tab in the message window.",
1499 ), 1534 ),
1500 ); 1535 );
1501 1536
1502 $vbox 1537 $vbox
1503} 1538}
1504 1539
1505sub server_setup { 1540sub server_setup {
1506 my $vbox = new CFPlus::UI::VBox; 1541 my $vbox = new DC::UI::VBox;
1507 1542
1508 $vbox->add (new CFPlus::UI::FancyFrame 1543 $vbox->add (new DC::UI::FancyFrame
1509 label => "Connection Settings", 1544 label => "Connection Settings",
1510 child => (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]), 1545 child => (my $table = new DC::UI::Table expand => 1, col_expand => [0, 1]),
1511 ); 1546 );
1512 1547
1513 my $row = 0; 1548 my $row = 0;
1514 1549
1515 $table->add_at (0, ++$row, new CFPlus::UI::Label valign => 0, align => 1, text => "Host:Port"); 1550 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Host:Port");
1516 { 1551 {
1517 $table->add_at (1, $row, my $vbox = new CFPlus::UI::VBox); 1552 $table->add_at (1, $row, my $vbox = new DC::UI::VBox);
1518 1553
1519 $vbox->add ( 1554 $vbox->add (
1520 $HOST_ENTRY = new CFPlus::UI::Entry 1555 $HOST_ENTRY = new DC::UI::Entry
1521 expand => 1, 1556 expand => 1,
1522 text => $CFG->{profile}{default}{host}, 1557 text => $CFG->{profile}{default}{host},
1523 tooltip => "The hostname or ip address of the Deliantra server to connect to", 1558 tooltip => "The hostname or ip address of the Deliantra server to connect to (e.g. <b>gameserver.deliantra.net</b>)",
1524 on_changed => sub { 1559 on_changed => sub {
1525 my ($self, $value) = @_; 1560 my ($self, $value) = @_;
1526 $CFG->{profile}{default}{host} = $value; 1561 $CFG->{profile}{default}{host} = $value;
1527 1 1562 1
1528 } 1563 }
1529 ); 1564 );
1530 1565
1531 if (0) { #d# disabled 1566 if (0) { #d# disabled
1532 $vbox->add (new CFPlus::UI::Button 1567 $vbox->add (new DC::UI::Button
1533 expand => 1, 1568 expand => 1,
1534 text => "Server List", 1569 text => "Server List",
1535 other => $METASERVER, 1570 other => $METASERVER,
1536 tooltip => "Show a list of available crossfire servers", 1571 tooltip => "Show a list of available Deliantra servers",
1537 on_activate => sub { $METASERVER->toggle_visibility; 0 }, 1572 on_activate => sub { $METASERVER->toggle_visibility; 0 },
1538 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 1 }, 1573 on_visibility_change => sub { $METASERVER->hide unless $_[1]; 1 },
1539 ); 1574 );
1540 }#d# 1575 }#d#
1541 } 1576 }
1542 1577
1543 $table->add_at (0, ++$row, new CFPlus::UI::Label valign => 0, align => 1, text => "Map Size"); 1578 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Map Size");
1544 $table->add_at (1, $row, new CFPlus::UI::Slider 1579 $table->add_at (1, $row, new DC::UI::Slider
1545 force_w => 100, 1580 force_w => 100,
1546 range => [$CFG->{mapsize}, 10, 100, 0, 1], 1581 range => [$CFG->{mapsize}, 10, 100, 0, 1],
1547 tooltip => "This is the size of the portion of the map update the server sends you. " 1582 tooltip => "This is the size of the portion of the map update the server sends you. "
1548 . "If you set this to a high value you will be able to see further, " 1583 . "If you set this to a high value you will be able to see further, "
1549 . "but you also increase bandwidth requirements and latency. " 1584 . "but you also increase bandwidth requirements and latency. "
1550 . "This option is only used once at log-in.", 1585 . "This option is only used once at log-in.",
1551 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 1 }, 1586 on_changed => sub { my ($self, $value) = @_; $CFG->{mapsize} = $self->{range}[0] = $value = int $value; 1 },
1552 ); 1587 );
1553 1588
1554 $table->add_at (0, ++$row, new CFPlus::UI::Label valign => 0, align => 1, text => "Output-Rate"); 1589 $table->add_at (0, ++$row, new DC::UI::Label align => 1, text => "Output-Rate");
1555 $table->add_at (1, $row, new CFPlus::UI::Entry 1590 $table->add_at (1, $row, new DC::UI::Entry
1556 text => $CFG->{output_rate}, 1591 text => $CFG->{output_rate},
1557 tooltip => "The maximum bandwidth in bytes per second that the server should not exceed " 1592 tooltip => "The maximum bandwidth in bytes per second that the server should not exceed "
1558 . "when sending data. When 0 or unset, the server " 1593 . "when sending data. When 0 or unset, the server "
1559 . "default will be used, which is usually around 100kb/s. Most servers will " 1594 . "default will be used, which is usually around 100kb/s. Most servers will "
1560 . "dynamically find an optimal rate, so adjust this only when necessary.", 1595 . "dynamically find an optimal rate, so adjust this only when necessary.",
1561 on_changed => sub { $CFG->{output_rate} = $_[1]; 1 }, 1596 on_changed => sub { $CFG->{output_rate} = $_[1]; 1 },
1562 ); 1597 );
1563 1598
1564 $vbox->add (new CFPlus::UI::FancyFrame 1599 $vbox->add (new DC::UI::FancyFrame
1565 label => "Server Info", 1600 label => "Server Info",
1566 child => ($SERVER_INFO = new CFPlus::UI::Label ellipsise => 0), 1601 child => ($SERVER_INFO = new DC::UI::Label ellipsise => 0),
1567 ); 1602 );
1568 1603
1569 $vbox 1604 $vbox
1570} 1605}
1571 1606
1572sub client_setup { 1607sub client_setup {
1573 my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]; 1608 my $table = new DC::UI::Table expand => 1, col_expand => [0, 1];
1574 1609
1575 my $row = 0; 1610 my $row = 0;
1576 1611
1577 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Tip of the day"); 1612 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Tip of the day");
1578 $table->add_at (1, $row++, new CFPlus::UI::CheckBox 1613 $table->add_at (1, $row++, new DC::UI::CheckBox
1579 state => $CFG->{show_tips}, 1614 state => $CFG->{show_tips},
1580 tooltip => "Show the <b>Tip of the day</b> window at startup?", 1615 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1581 on_changed => sub { 1616 on_changed => sub {
1582 my ($self, $value) = @_; 1617 my ($self, $value) = @_;
1583 $CFG->{show_tips} = $value; 1618 $CFG->{show_tips} = $value;
1584 0 1619 0
1585 } 1620 }
1586 ); 1621 );
1587 1622
1588 $table->add_at (0, $row, new CFPlus::UI::Label valign => 0, align => 1, text => "Messages Window Size"); 1623 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Messages Window Size");
1589 $table->add_at (1, $row++, my $saycmd = new CFPlus::UI::Entry 1624 $table->add_at (1, $row++, my $saycmd = new DC::UI::Entry
1590 text => $CFG->{logview_max_par}, 1625 text => $CFG->{logview_max_par},
1591 tooltip => "This is maximum number of messages remembered in the <b>Messages</b> window. If the server " 1626 tooltip => "This is maximum number of messages remembered in the <b>Messages</b> window. If the server "
1592 . "sends more messages than this number, older messages get removed to save memory and " 1627 . "sends more messages than this number, older messages get removed to save memory and "
1593 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.", 1628 . "computing time. A value of <b>0</b> disables this feature, but that is not recommended.",
1594 on_changed => sub { 1629 on_changed => sub {
1595 my ($self, $value) = @_; 1630 my ($self, $value) = @_;
1596 $MESSAGE_WINDOW->set_max_para ($CFG->{logview_max_par} = $value*1); 1631 $MESSAGE_DIST->set_max_par ($CFG->{logview_max_par} = $value*1);
1597 0 1632 0
1598 }, 1633 },
1599 ); 1634 );
1600 1635
1601 $table 1636 $table
1602} 1637}
1603 1638
1604sub autopickup_setup { 1639sub autopickup_setup {
1605 my $r = new CFPlus::UI::ScrolledWindow ( 1640 my $r = new DC::UI::ScrolledWindow (
1606 expand => 1, 1641 expand => 1,
1607 scroll_y => 1 1642 scroll_y => 1
1608 ); 1643 );
1609 $r->add (my $table = new CFPlus::UI::Table 1644 $r->add (my $table = new DC::UI::Table
1610 row_expand => [0], 1645 row_expand => [0],
1611 col_expand => [0, 1, 0, 1], 1646 col_expand => [0, 1, 0, 1],
1612 ); 1647 );
1613 1648
1614 for ( 1649 for (
1652 ], 1687 ],
1653 ["Weight/Value ratio", 2, 17] 1688 ["Weight/Value ratio", 2, 17]
1654 ) 1689 )
1655 { 1690 {
1656 my ($title, $x, $y, @bits) = @$_; 1691 my ($title, $x, $y, @bits) = @$_;
1657 $table->add_at ($x, $y, new CFPlus::UI::Label text => $title, align => 1, fg => [1, 1, 0]); 1692 $table->add_at ($x, $y, new DC::UI::Label text => $title, align => 1, fg => [1, 1, 0]);
1658 1693
1659 for (@bits) { 1694 for (@bits) {
1660 ++$y; 1695 ++$y;
1661 1696
1662 my $mask = $_->[1]; 1697 my $mask = $_->[1];
1663 $table->add_at ($x , $y, new CFPlus::UI::Label text => $_->[0], align => 1, expand => 1); 1698 $table->add_at ($x , $y, new DC::UI::Label text => $_->[0], align => 1, expand => 1);
1664 $table->add_at ($x+1, $y, my $checkbox = new CFPlus::UI::CheckBox 1699 $table->add_at ($x+1, $y, my $checkbox = new DC::UI::CheckBox
1665 state => $::CFG->{pickup} & $mask, 1700 state => $::CFG->{pickup} & $mask,
1666 on_changed => sub { 1701 on_changed => sub {
1667 my ($box, $value) = @_; 1702 my ($box, $value) = @_;
1668 1703
1669 if ($value) { 1704 if ($value) {
1680 1715
1681 ${$_->[2]} = $checkbox if $_->[2]; 1716 ${$_->[2]} = $checkbox if $_->[2];
1682 } 1717 }
1683 } 1718 }
1684 1719
1685 $table->add_at (2, 18, new CFPlus::UI::ValSlider 1720 $table->add_at (2, 18, new DC::UI::ValSlider
1686 range => [$::CFG->{pickup} & 0xF, 0, 16, 1, 1], 1721 range => [$::CFG->{pickup} & 0xF, 0, 16, 1, 1],
1687 template => ">= 99", 1722 template => ">= 99",
1688 to_value => sub { ">= " . 5 * $_[0] }, 1723 to_value => sub { ">= " . 5 * $_[0] },
1689 on_changed => sub { 1724 on_changed => sub {
1690 my ($slider, $value) = @_; 1725 my ($slider, $value) = @_;
1693 $::CFG->{pickup} |= int $value 1728 $::CFG->{pickup} |= int $value
1694 if $value; 1729 if $value;
1695 1; 1730 1;
1696 }); 1731 });
1697 1732
1698 $table->add_at (3, 18, new CFPlus::UI::Button 1733 $table->add_at (3, 18, new DC::UI::Button
1699 text => "set", 1734 text => "set",
1700 on_activate => sub { 1735 on_activate => sub {
1701 $::CONN->send_command ("pickup $::CFG->{pickup}") 1736 $::CONN->send_command ("pickup $::CFG->{pickup}")
1702 if defined $::CONN; 1737 if defined $::CONN;
1703 0 1738 0
1724 or $a->{type} <=> $b->{type} 1759 or $a->{type} <=> $b->{type}
1725 } @_ }, 1760 } @_ },
1726); 1761);
1727 1762
1728sub inventory_widget { 1763sub inventory_widget {
1729 my $hb = new CFPlus::UI::HBox homogeneous => 1; 1764 my $hb = new DC::UI::HBox homogeneous => 1;
1730 1765
1731 $hb->add (my $vb1 = new CFPlus::UI::VBox); 1766 $hb->add (my $vb1 = new DC::UI::VBox);
1732 $vb1->add (new CFPlus::UI::Label align => 0, text => "Player"); 1767 $vb1->add (new DC::UI::Label text => "Player");
1733 1768
1734 $vb1->add (my $hb1 = new CFPlus::UI::HBox); 1769 $vb1->add (my $hb1 = new DC::UI::HBox);
1735 1770
1736 use sort 'stable'; 1771 use sort 'stable';
1737 1772
1738 $hb1->add (new CFPlus::UI::Selector 1773 $hb1->add (new DC::UI::Selector
1739 value => $::CFG->{inv_sort}, 1774 value => $::CFG->{inv_sort},
1740 options => [ 1775 options => [
1741 [type => "Type/Name"], 1776 [type => "Type/Name"],
1742 [mtime => "Recent/Normal/Locked"], 1777 [mtime => "Recent/Normal/Locked"],
1743 [weight => "Weight/Type"], 1778 [weight => "Weight/Type"],
1745 on_changed => sub { 1780 on_changed => sub {
1746 $::CFG->{inv_sort} = $_[1]; 1781 $::CFG->{inv_sort} = $_[1];
1747 $INV->set_sort_order ($SORT_ORDER{$_[1]}); 1782 $INV->set_sort_order ($SORT_ORDER{$_[1]});
1748 }, 1783 },
1749 ); 1784 );
1750 $hb1->add (new CFPlus::UI::Label text => "Weight: ", align => 1, expand => 1); 1785 $hb1->add (new DC::UI::Label text => "Weight: ", align => 1, expand => 1);
1751 #TODO# update to weigh/maxweight 1786 #TODO# update to weigh/maxweight
1752 $hb1->add ($STATWIDS->{i_weight} = new CFPlus::UI::Label align => -1); 1787 $hb1->add ($STATWIDS->{i_weight} = new DC::UI::Label align => 0);
1753 1788
1754 $vb1->add (my $sw1 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1789 $vb1->add (my $sw1 = new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
1755 $sw1->add ($INV = new CFPlus::UI::Inventory); 1790 $sw1->add ($INV = new DC::UI::Inventory);
1756 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}}); 1791 $INV->set_sort_order ($SORT_ORDER{$::CFG->{inv_sort}});
1757 1792
1758 $hb->add (my $vb2 = new CFPlus::UI::VBox); 1793 $hb->add (my $vb2 = new DC::UI::VBox);
1759 1794
1760 $vb2->add ($INVR_HB = new CFPlus::UI::HBox); 1795 $vb2->add ($INVR_HB = new DC::UI::HBox);
1761 1796
1762 $vb2->add (my $sw2 = new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 1797 $vb2->add (my $sw2 = new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
1763 $sw2->add ($INVR = new CFPlus::UI::Inventory); 1798 $sw2->add ($INVR = new DC::UI::Inventory);
1764 1799
1765 # XXX: Call after $INVR = ... because set_opencont sets the items 1800 # XXX: Call after $INVR = ... because set_opencont sets the items
1766 CFPlus::Protocol::set_opencont ($::CONN, 0, "Floor"); 1801 DC::Protocol::set_opencont ($::CONN, 0, "Floor");
1767 1802
1768 $hb 1803 $hb
1769} 1804}
1770 1805
1771sub media_window { 1806sub media_window {
1772 my $vb = new CFPlus::UI::VBox; 1807 my $vb = new DC::UI::VBox;
1773 1808
1774 $vb->add (new CFPlus::UI::FancyFrame 1809 $vb->add (new DC::UI::FancyFrame
1775 label => "Currently playing music", 1810 label => "Currently playing music",
1776 child => new CFPlus::UI::ScrolledWindow scroll_x => 1, scroll_y => 0, 1811 child => new DC::UI::ScrolledWindow scroll_x => 1, scroll_y => 0,
1777 child => ($MUSIC_PLAYING_WIDGET = new CFPlus::UI::Label ellipsise => 0, fontsize => 0.8), 1812 child => ($MUSIC_PLAYING_WIDGET = new DC::UI::Label ellipsise => 0, fontsize => 0.8),
1778 ); 1813 );
1779 1814
1780 $vb->add (new CFPlus::UI::FancyFrame 1815 $vb->add (new DC::UI::FancyFrame
1781 label => "Other media used in this session", 1816 label => "Other media used in this session",
1782 expand => 1, 1817 expand => 1,
1783 child => ($LICENSE_WIDGET = new CFPlus::UI::TextScroller 1818 child => ($LICENSE_WIDGET = new DC::UI::TextScroller
1784 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4), 1819 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4),
1785 ); 1820 );
1786 1821
1787 $vb 1822 $vb
1788} 1823}
1797 or return; 1832 or return;
1798 1833
1799 $LICENSE_WIDGET->add_paragraph ({ 1834 $LICENSE_WIDGET->add_paragraph ({
1800 fg => [1, 1, 1, 1], 1835 fg => [1, 1, 1, 1],
1801 markup => "<small>" 1836 markup => "<small>"
1802 . "<b>Name:</b> " . (CFPlus::asxml $meta->{name}) . "\n" 1837 . "<b>Name:</b> " . (DC::asxml $meta->{name}) . "\n"
1803 . "<b>Author:</b> " . (CFPlus::asxml $meta->{author}) . "\n" 1838 . "<b>Author:</b> " . (DC::asxml $meta->{author}) . "\n"
1804 . "<b>Source:</b> " . (CFPlus::asxml $meta->{source}) . "\n" 1839 . "<b>Source:</b> " . (DC::asxml $meta->{source}) . "\n"
1805 . "<b>License:</b> " . (CFPlus::asxml $meta->{license}) . "\n" 1840 . "<b>License:</b> " . (DC::asxml $meta->{license}) . "\n"
1806 . "</small>", 1841 . "</small>",
1807 }); 1842 });
1808 $LICENSE_WIDGET->scroll_to_bottom; 1843 $LICENSE_WIDGET->scroll_to_bottom;
1809} 1844}
1810 1845
1818 $PL_WINDOW->show; 1853 $PL_WINDOW->show;
1819 } 1854 }
1820} 1855}
1821 1856
1822sub player_window { 1857sub player_window {
1823 my $plwin = $PL_WINDOW = new CFPlus::UI::Toplevel 1858 my $plwin = $PL_WINDOW = new DC::UI::Toplevel
1824 x => "center", 1859 x => "center",
1825 y => "center", 1860 y => "center",
1826 force_w => $WIDTH * 9/10, 1861 force_w => $WIDTH * 9/10,
1827 force_h => $HEIGHT * 9/10, 1862 force_h => $HEIGHT * 9/10,
1828 title => "Player", 1863 title => "Player",
1830 has_close_button => 1 1865 has_close_button => 1
1831 ; 1866 ;
1832 1867
1833 my $ntb = 1868 my $ntb =
1834 $PL_NOTEBOOK = 1869 $PL_NOTEBOOK =
1835 new CFPlus::UI::Notebook expand => 1; 1870 new DC::UI::Notebook expand => 1;
1836 1871
1837 $ntb->add_tab ( 1872 $ntb->add_tab (
1838 "Statistics (F2)" => $STATS_PAGE = stats_window, 1873 "Statistics (F2)" => $STATS_PAGE = stats_window,
1839 "Shows statistics, where all your Stats and Resistances are shown." 1874 "Shows statistics, where all your Stats and Resistances are shown."
1840 ); 1875 );
1841 $ntb->add_tab ( 1876 $ntb->add_tab (
1842 "Skills (F3)" => $SKILL_PAGE = skill_window, 1877 "Skills (F3)" => $SKILL_PAGE = skill_window,
1843 "Shows all your Skills." 1878 "Shows all your Skills."
1844 ); 1879 );
1845 1880
1846 my $spellsw = $SPELL_PAGE = new CFPlus::UI::ScrolledWindow (expand => 1, scroll_y => 1); 1881 my $spellsw = $SPELL_PAGE = new DC::UI::ScrolledWindow (expand => 1, scroll_y => 1);
1847 $spellsw->add ($SPELL_LIST = new CFPlus::UI::SpellList); 1882 $spellsw->add ($SPELL_LIST = new DC::UI::SpellList);
1848 $ntb->add_tab ( 1883 $ntb->add_tab (
1849 "Spellbook (F4)" => $spellsw, 1884 "Spellbook (F4)" => $spellsw,
1850 "Displays all spells you have and lets you edit keyboard shortcuts for them." 1885 "Displays all spells you have and lets you edit keyboard shortcuts for them."
1851 ); 1886 );
1852 $ntb->add_tab ( 1887 $ntb->add_tab (
1865 $plwin->add ($ntb); 1900 $plwin->add ($ntb);
1866 $plwin 1901 $plwin
1867} 1902}
1868 1903
1869sub keyboard_setup { 1904sub keyboard_setup {
1870 CFPlus::Macro::keyboard_setup 1905 DC::Macro::keyboard_setup
1871} 1906}
1872 1907
1873sub help_window { 1908sub help_window {
1874 my $win = new CFPlus::UI::Toplevel 1909 my $win = new DC::UI::Toplevel
1875 x => 'center', 1910 x => 'center',
1876 y => 'center', 1911 y => 'center',
1877 z => 4, 1912 z => 4,
1878 name => 'doc_browser', 1913 name => 'doc_browser',
1879 force_w => int $WIDTH * 7/8, 1914 force_w => int $WIDTH * 7/8,
1880 force_h => int $HEIGHT * 7/8, 1915 force_h => int $HEIGHT * 7/8,
1881 title => "Help Browser", 1916 title => "Help Browser",
1882 has_close_button => 1; 1917 has_close_button => 1;
1883 1918
1884 $win->add (my $vbox = new CFPlus::UI::VBox); 1919 $win->add (my $vbox = new DC::UI::VBox);
1885 1920
1886 $vbox->add (new CFPlus::UI::FancyFrame 1921 $vbox->add (new DC::UI::FancyFrame
1887 label => "Navigation", 1922 label => "Navigation",
1888 child => (my $buttons = new CFPlus::UI::HBox), 1923 child => (my $buttons = new DC::UI::HBox),
1889 ); 1924 );
1890 $vbox->add (my $viewer = new CFPlus::UI::TextScroller 1925 $vbox->add (my $viewer = new DC::UI::TextScroller
1891 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4); 1926 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
1892 1927
1893 my @history; 1928 my @history;
1894 my @future; 1929 my @future;
1895 my $curnode; 1930 my $curnode;
1897 my $load_node; $load_node = sub { 1932 my $load_node; $load_node = sub {
1898 my ($node, $para) = @_; 1933 my ($node, $para) = @_;
1899 1934
1900 $buttons->clear; 1935 $buttons->clear;
1901 1936
1902 $buttons->add (new CFPlus::UI::Button 1937 $buttons->add (new DC::UI::Button
1903 text => "⇤", 1938 text => "⇤",
1904 tooltip => "back to the starting page", 1939 tooltip => "back to the starting page",
1905 on_activate => sub { 1940 on_activate => sub {
1906 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode; 1941 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1907 unshift @future, @history; 1942 unshift @future, @history;
1909 $load_node->(@{shift @future}); 1944 $load_node->(@{shift @future});
1910 }, 1945 },
1911 ); 1946 );
1912 1947
1913 if (@history) { 1948 if (@history) {
1914 $buttons->add (new CFPlus::UI::Button 1949 $buttons->add (new DC::UI::Button
1915 text => "⋘", 1950 text => "⋘",
1916 tooltip => "back to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $history[-1][0]) . "</i>", 1951 tooltip => "back to <i>" . (DC::asxml DC::Pod::full_path $history[-1][0]) . "</i>",
1917 on_activate => sub { 1952 on_activate => sub {
1918 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode; 1953 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1919 $load_node->(@{pop @history}); 1954 $load_node->(@{pop @history});
1920 }, 1955 },
1921 ); 1956 );
1922 } 1957 }
1923 1958
1924 if (@future) { 1959 if (@future) {
1925 $buttons->add (new CFPlus::UI::Button 1960 $buttons->add (new DC::UI::Button
1926 text => "⋙", 1961 text => "⋙",
1927 tooltip => "forward to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $future[0][0]) . "</i>", 1962 tooltip => "forward to <i>" . (DC::asxml DC::Pod::full_path $future[0][0]) . "</i>",
1928 on_activate => sub { 1963 on_activate => sub {
1929 push @history, [$curnode, $viewer->current_paragraph]; 1964 push @history, [$curnode, $viewer->current_paragraph];
1930 $load_node->(@{shift @future}); 1965 $load_node->(@{shift @future});
1931 }, 1966 },
1932 ); 1967 );
1933 } 1968 }
1934 1969
1935 $buttons->add (new CFPlus::UI::Label text => " "); 1970 $buttons->add (new DC::UI::Label text => " ");
1936 1971
1937 my @path = CFPlus::Pod::full_path_of $node; 1972 my @path = DC::Pod::full_path_of $node;
1938 pop @path; # drop current node 1973 pop @path; # drop current node
1939 1974
1940 for my $node (@path) { 1975 for my $node (@path) {
1941 $buttons->add (new CFPlus::UI::Button 1976 $buttons->add (new DC::UI::Button
1942 text => $node->{kw}[0], 1977 text => $node->{kw}[0],
1943 tooltip => "go to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $node) . "</i>", 1978 tooltip => "go to <i>" . (DC::asxml DC::Pod::full_path $node) . "</i>",
1944 on_activate => sub { 1979 on_activate => sub {
1945 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = (); 1980 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1946 $load_node->($node); 1981 $load_node->($node);
1947 }, 1982 },
1948 ); 1983 );
1949 $buttons->add (new CFPlus::UI::Label text => "/"); 1984 $buttons->add (new DC::UI::Label text => "/");
1950 } 1985 }
1951 1986
1952 $buttons->add (new CFPlus::UI::Label text => $node->{kw}[0], padding_x => 4, padding_y => 4); 1987 $buttons->add (new DC::UI::Label text => $node->{kw}[0], padding_x => 4, padding_y => 4);
1953 1988
1954 $curnode = $node; 1989 $curnode = $node;
1955 1990
1956 $viewer->clear; 1991 $viewer->clear;
1957 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $curnode); 1992 $viewer->add_paragraph (DC::Pod::as_paragraphs DC::Pod::section_of $curnode);
1958 $viewer->scroll_to ($para); 1993 $viewer->scroll_to ($para);
1959 }; 1994 };
1960 1995
1961 $load_node->(CFPlus::Pod::find pod => "mainpage"); 1996 $load_node->(DC::Pod::find pod => "mainpage");
1962 1997
1963 $CFPlus::Pod::goto_document = sub { 1998 $DC::Pod::goto_document = sub {
1964 my (@path) = @_; 1999 my (@path) = @_;
1965 2000
1966 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = (); 2001 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1967 2002
1968 $load_node->((CFPlus::Pod::find @path)[0]); 2003 $load_node->((DC::Pod::find @path)[0]);
1969 $win->show; 2004 $win->show;
1970 }; 2005 };
1971 2006
1972 $win 2007 $win
1973} 2008}
1974 2009
1975sub open_string_query { 2010sub open_string_query {
1976 my ($title, $cb, $txt, $tooltip) = @_; 2011 my ($title, $cb, $txt, $tooltip) = @_;
1977 my $dialog = new CFPlus::UI::Toplevel 2012 my $dialog = new DC::UI::Toplevel
1978 x => "center", 2013 x => "center",
1979 y => "center", 2014 y => "center",
1980 z => 50, 2015 z => 50,
1981 force_w => $WIDTH * 4/5, 2016 force_w => $WIDTH * 4/5,
1982 title => $title; 2017 title => $title;
1983 2018
1984 $dialog->add ( 2019 $dialog->add (
1985 my $e = new CFPlus::UI::Entry 2020 my $e = new DC::UI::Entry
1986 on_activate => sub { $cb->(@_); $dialog->hide; 0 }, 2021 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1987 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 }, 2022 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1988 tooltip => $tooltip 2023 tooltip => $tooltip
1989 ); 2024 );
1990 2025
1993 $dialog->show; 2028 $dialog->show;
1994} 2029}
1995 2030
1996sub open_quit_dialog { 2031sub open_quit_dialog {
1997 unless ($QUIT_DIALOG) { 2032 unless ($QUIT_DIALOG) {
1998 $QUIT_DIALOG = new CFPlus::UI::Toplevel 2033 $QUIT_DIALOG = new DC::UI::Toplevel
1999 x => "center", 2034 x => "center",
2000 y => "center", 2035 y => "center",
2001 z => 50, 2036 z => 50,
2002 title => "Really Quit?", 2037 title => "Really Quit?",
2003 on_key_down => sub { 2038 on_key_down => sub {
2004 my ($dialog, $ev) = @_; 2039 my ($dialog, $ev) = @_;
2005 $ev->{sym} == 27 and $dialog->hide; 2040 $ev->{sym} == 27 and $dialog->hide;
2006 } 2041 }
2007 ; 2042 ;
2008 2043
2009 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1); 2044 $QUIT_DIALOG->add (my $vb = new DC::UI::VBox expand => 1);
2010 2045
2011 $vb->add (new CFPlus::UI::Label 2046 $vb->add (new DC::UI::Label
2012 text => "You should find a savebed and apply it first!", 2047 text => "You should find a savebed and apply it first!",
2013 max_w => $WIDTH * 0.25, 2048 max_w => $WIDTH * 0.25,
2014 ellipsize => 0, 2049 ellipsize => 0,
2015 ); 2050 );
2016 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1); 2051 $vb->add (my $hb = new DC::UI::HBox expand => 1);
2017 $hb->add (new CFPlus::UI::Button 2052 $hb->add (new DC::UI::Button
2018 text => "Ok", 2053 text => "Ok",
2019 expand => 1, 2054 expand => 1,
2020 on_activate => sub { $QUIT_DIALOG->hide; 0 }, 2055 on_activate => sub { $QUIT_DIALOG->hide; 0 },
2021 ); 2056 );
2022 $hb->add (new CFPlus::UI::Button 2057 $hb->add (new DC::UI::Button
2023 text => "Quit anyway", 2058 text => "Quit anyway",
2024 expand => 1, 2059 expand => 1,
2025 on_activate => sub { EV::unloop EV::UNLOOP_ALL }, 2060 on_activate => sub { EV::unloop EV::UNLOOP_ALL },
2026 ); 2061 );
2027 } 2062 }
2030 $QUIT_DIALOG->grab_focus; 2065 $QUIT_DIALOG->grab_focus;
2031} 2066}
2032 2067
2033sub show_tip_of_the_day { 2068sub show_tip_of_the_day {
2034 # find all tips 2069 # find all tips
2035 my @tod = CFPlus::Pod::find tip_of_the_day => "*"; 2070 my @tod = DC::Pod::find tip_of_the_day => "*";
2036 2071
2037 CFPlus::DB::get state => "tip_of_the_day", sub { 2072 DC::DB::get state => "tip_of_the_day", sub {
2038 my ($todindex) = @_; 2073 my ($todindex) = @_;
2039 $todindex = 0 if $todindex >= @tod; 2074 $todindex = 0 if $todindex >= @tod;
2040 CFPlus::DB::put state => tip_of_the_day => $todindex + 1, sub { }; 2075 DC::DB::put state => tip_of_the_day => $todindex + 1, sub { };
2041 2076
2042 # create dialog 2077 # create dialog
2043 my $dialog; 2078 my $dialog;
2044 2079
2045 my $close = sub { 2080 my $close = sub {
2046 $dialog->destroy; 2081 $dialog->destroy;
2047 }; 2082 };
2048 2083
2049 $dialog = new CFPlus::UI::Toplevel 2084 $dialog = new DC::UI::Toplevel
2050 x => "center", 2085 x => "center",
2051 y => "center", 2086 y => "center",
2052 z => 3, 2087 z => 3,
2053 name => 'tip_of_the_day', 2088 name => 'tip_of_the_day',
2054 force_w => int $WIDTH * 4/9, 2089 force_w => int $WIDTH * 4/9,
2055 force_h => int $WIDTH * 2/9, 2090 force_h => int $WIDTH * 2/9,
2056 title => "Tip of the day #" . (1 + $todindex), 2091 title => "Tip of the day #" . (1 + $todindex),
2057 child => my $vbox = new CFPlus::UI::VBox, 2092 child => my $vbox = new DC::UI::VBox,
2058 has_close_button => 1, 2093 has_close_button => 1,
2059 on_delete => $close, 2094 on_delete => $close,
2060 ; 2095 ;
2061 2096
2062 $vbox->add (my $viewer = new CFPlus::UI::TextScroller 2097 $vbox->add (my $viewer = new DC::UI::TextScroller
2063 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4); 2098 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
2064 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $tod[$todindex]); 2099 $viewer->add_paragraph (DC::Pod::as_paragraphs DC::Pod::section_of $tod[$todindex]);
2065 2100
2066 $vbox->add (my $table = new CFPlus::UI::Table col_expand => [0, 1]); 2101 $vbox->add (my $table = new DC::UI::Table col_expand => [0, 1]);
2067 2102
2068 $table->add_at (0, 0, new CFPlus::UI::Button 2103 $table->add_at (0, 0, new DC::UI::Button
2069 text => "Close", 2104 text => "Close",
2070 tooltip => "Close the tip of the day window. To never see it again, disable the tip of the day in the <b>Server Setup</b>.", 2105 tooltip => "Close the tip of the day window. To never see it again, disable the tip of the day in the <b>Server Setup</b>.",
2071 on_activate => $close, 2106 on_activate => $close,
2072 ); 2107 );
2073 2108
2074 $table->add_at (2, 0, new CFPlus::UI::Button 2109 $table->add_at (2, 0, new DC::UI::Button
2075 text => "Next", 2110 text => "Next",
2076 tooltip => "Show the next <b>Tip of the day</b>.", 2111 tooltip => "Show the next <b>Tip of the day</b>.",
2077 on_activate => sub { 2112 on_activate => sub {
2078 $close->(); 2113 $close->();
2079 &show_tip_of_the_day; 2114 &show_tip_of_the_day;
2083 $dialog->show; 2118 $dialog->show;
2084 }; 2119 };
2085} 2120}
2086 2121
2087sub sdl_init { 2122sub sdl_init {
2088 CFPlus::SDL_Init 2123 DC::SDL_Init
2089 and die "SDL::Init failed!\n"; 2124 and die "SDL::Init failed!\n";
2090} 2125}
2091 2126
2092sub video_init { 2127sub video_init {
2093 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} >= @SDL_MODES; 2128 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} >= @SDL_MODES;
2096 2131
2097 ($WIDTH, $HEIGHT, my ($rgb, $alpha)) = @{ $SDL_MODES[$CFG->{sdl_mode}] }; 2132 ($WIDTH, $HEIGHT, my ($rgb, $alpha)) = @{ $SDL_MODES[$CFG->{sdl_mode}] };
2098 $FULLSCREEN = $CFG->{fullscreen}; 2133 $FULLSCREEN = $CFG->{fullscreen};
2099 $FAST = $CFG->{fast}; 2134 $FAST = $CFG->{fast};
2100 2135
2101 CFPlus::SDL_SetVideoMode $WIDTH, $HEIGHT, $rgb, $alpha, $FULLSCREEN 2136 DC::SDL_SetVideoMode $WIDTH, $HEIGHT, $rgb, $alpha, $FULLSCREEN
2102 or die "SDL_SetVideoMode failed: " . (CFPlus::SDL_GetError) . "\n"; 2137 or die "SDL_SetVideoMode failed: " . (DC::SDL_GetError) . "\n";
2103 2138
2104 $SDL_ACTIVE = 1; 2139 $SDL_ACTIVE = 1;
2105 $LAST_REFRESH = time - 0.01; 2140 $LAST_REFRESH = time - 0.01;
2106 2141
2107 CFPlus::OpenGL::init; 2142 DC::OpenGL::init;
2108 CFPlus::Macro::init; 2143 DC::Macro::init;
2109 2144
2110 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize}; 2145 $FONTSIZE = int $HEIGHT / 40 * $CFG->{gui_fontsize};
2111 2146
2112 $CFPlus::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d# 2147 $DC::UI::ROOT->configure (0, 0, $WIDTH, $HEIGHT);#d#
2113 2148
2114 ############################################################################# 2149 #############################################################################
2115 2150
2116 if ($DEBUG_STATUS) { 2151 if ($DEBUG_STATUS) {
2117 CFPlus::UI::rescale_widgets $WIDTH / $old_w, $HEIGHT / $old_h; 2152 DC::UI::rescale_widgets $WIDTH / $old_w, $HEIGHT / $old_h;
2118 } else { 2153 } else {
2119 # create/configure the widgets 2154 # create/configure the widgets
2120 2155
2121 $CFPlus::UI::ROOT->connect (key_down => sub { 2156 $DC::UI::ROOT->connect (key_down => sub {
2122 my (undef, $ev) = @_; 2157 my (undef, $ev) = @_;
2123 2158
2124 if (my @macros = CFPlus::Macro::find $ev) { 2159 if (my @macros = DC::Macro::find $ev) {
2125 CFPlus::Macro::execute $_ for @macros; 2160 DC::Macro::execute $_ for @macros;
2126 2161
2127 return 1; 2162 return 1;
2128 } 2163 }
2129 2164
2130 0 2165 0
2131 }); 2166 });
2132 2167
2133 $DEBUG_STATUS = new CFPlus::UI::Label 2168 $DEBUG_STATUS = new DC::UI::Label
2134 padding => 0, 2169 padding => 0,
2135 z => 100, 2170 z => 100,
2136 force_x => "max", 2171 force_x => "max",
2137 force_y => 0; 2172 force_y => 0;
2138 $DEBUG_STATUS->show; 2173 $DEBUG_STATUS->show;
2139 2174
2140 $STATUSBOX = new CFPlus::UI::Statusbox; 2175 $STATUSBOX = new DC::UI::Statusbox;
2141 $STATUSBOX->add ("Use <b>Alt-Enter</b> to toggle fullscreen mode", timeout => 864000, pri => -100, color => [1, 1, 1, 0.8]);
2142 2176
2177 $MODBOX = new DC::UI::Label
2178 can_events => 1,
2179 can_hover => 1,
2180 markup => "",
2181 align => 0,
2182 font => $FONT_FIXED,
2183 tooltip => "#modifier_box";
2184
2185 update_modbox;
2186
2143 (new CFPlus::UI::Frame 2187 (new DC::UI::Frame
2144 bg => [0, 0, 0, 0.4], 2188 bg => [0, 0, 0, 0.4],
2145 force_x => 0, 2189 force_x => 0,
2146 force_y => "max", 2190 force_y => "max",
2147 child => $STATUSBOX, 2191 child => (my $LR = new DC::UI::VBox),
2148 )->show; 2192 )->show;
2149 2193
2194 $LR->add ($STATUSBOX);
2195 $LR->add ($MODBOX);
2196 $LR->add (new DC::UI::Label
2197 align => 0,
2198 markup => "Use <b>Alt-Enter</b> to toggle fullscreen mode",
2199 fontsize => 0.5,
2200 fg => [1, 1, 0, 0.7],
2201 );
2202
2150 CFPlus::UI::Toplevel->new ( 2203 DC::UI::Toplevel->new (
2151 title => "Minimap", 2204 title => "Minimap",
2152 name => "mapmap", 2205 name => "mapmap",
2153 x => 0, 2206 x => 0,
2154 y => $FONTSIZE + 8, 2207 y => $FONTSIZE + 8,
2155 border_bg => [1, 1, 1, 192/255], 2208 border_bg => [1, 1, 1, 192/255],
2156 bg => [1, 1, 1, 0], 2209 bg => [1, 1, 1, 0],
2157 child => ($MAPMAP = new CFPlus::MapWidget::MapMap 2210 child => ($MAPMAP = new DC::MapWidget::MapMap
2158 tooltip => "<b>Map</b>. On servers that support this feature, this will display an overview of the surrounding areas.", 2211 tooltip => "<b>Map</b>. On servers that support this feature, this will display an overview of the surrounding areas.",
2159 ), 2212 ),
2160 )->show; 2213 )->show;
2161 2214
2162 $MAPWIDGET = new CFPlus::MapWidget; 2215 $MAPWIDGET = new DC::MapWidget;
2163 $MAPWIDGET->connect (activate_console => sub { 2216 $MAPWIDGET->connect (activate_console => sub {
2164 my ($mapwidget, $preset) = @_; 2217 my ($mapwidget, $preset) = @_;
2165 2218
2166 $MESSAGE_WINDOW->activate_console ($preset) 2219 $MESSAGE_DIST->activate_console ($preset)
2167 if $MESSAGE_WINDOW; 2220 if $MESSAGE_DIST;
2168 }); 2221 });
2169 $MAPWIDGET->show; 2222 $MAPWIDGET->show;
2170 $MAPWIDGET->grab_focus; 2223 $MAPWIDGET->grab_focus;
2171 2224
2172 $COMPLETER = new CFPlus::MapWidget::Command:: 2225 $COMPLETER = new DC::MapWidget::Command::
2173 command => { }, 2226 command => { },
2174 tooltip => "#completer_help", 2227 tooltip => "#completer_help",
2175 ; 2228 ;
2176 2229
2177 $SETUP_DIALOG = new CFPlus::UI::Toplevel 2230 $SETUP_DIALOG = new DC::UI::Toplevel
2178 title => "Setup", 2231 title => "Setup",
2179 name => "setup_dialog", 2232 name => "setup_dialog",
2180 x => 'center', 2233 x => 'center',
2181 y => 'center', 2234 y => 'center',
2182 z => 2, 2235 z => 2,
2184 force_h => $::HEIGHT * 0.6, 2237 force_h => $::HEIGHT * 0.6,
2185 has_close_button => 1, 2238 has_close_button => 1,
2186 ; 2239 ;
2187 2240
2188 $METASERVER = metaserver_dialog; 2241 $METASERVER = metaserver_dialog;
2189 $MESSAGE_WINDOW = new CFPlus::UI::MessageWindow; 2242 $MESSAGE_WINDOW = new DC::UI::Dockbar (name => 'message_window', title => 'Messages');
2243 $MESSAGE_DIST = new DC::MessageDistributor dockbar => $MESSAGE_WINDOW;
2190 2244
2191 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new CFPlus::UI::Notebook expand => 1, debug => 1, 2245 $SETUP_DIALOG->add ($SETUP_NOTEBOOK = new DC::UI::Notebook expand => 1, debug => 1,
2192 filter => new CFPlus::UI::ScrolledWindow expand => 1, scroll_y => 1); 2246 filter => new DC::UI::ScrolledWindow expand => 1, scroll_y => 1);
2193 2247
2194 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup, 2248 $SETUP_NOTEBOOK->add_tab (Login => $SETUP_LOGIN = login_setup,
2195 "Configure the server to play on, your username and password."); 2249 "Configure the server to play on, your username and password.");
2196 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup, 2250 $SETUP_NOTEBOOK->add_tab (Server => $SETUP_SERVER = server_setup,
2197 "Configure other server related options."); 2251 "Configure other server related options.");
2209 . "After pressing the combo the binding will be saved automatically and the " 2263 . "After pressing the combo the binding will be saved automatically and the "
2210 . "binding editor closes"); 2264 . "binding editor closes");
2211 $SETUP_NOTEBOOK->add_tab (Debug => debug_setup, 2265 $SETUP_NOTEBOOK->add_tab (Debug => debug_setup,
2212 "Some debuggin' options. Do not ask."); 2266 "Some debuggin' options. Do not ask.");
2213 2267
2214 $BUTTONBAR = new CFPlus::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 2268 $BUTTONBAR = new DC::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
2215 2269
2216 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Setup", other => $SETUP_DIALOG, 2270 $BUTTONBAR->add (new DC::UI::Flopper text => "Setup", other => $SETUP_DIALOG,
2217 tooltip => "Toggles a dialog where you can configure all aspects of this client."); 2271 tooltip => "Toggles a dialog where you can configure all aspects of this client.");
2218 2272
2219 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW, 2273 $BUTTONBAR->add (new DC::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW,
2220 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 2274 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
2221 2275
2222 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D 2276 make_gauge_window->show; # XXX: this has to be set before make_stats_window as make_stats_window calls update_stats_window which updated the gauges also X-D
2223 2277
2224 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Playerbook", other => player_window, 2278 $BUTTONBAR->add (new DC::UI::Flopper text => "Playerbook", other => player_window,
2225 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats."); 2279 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats.");
2226 2280
2227 $BUTTONBAR->add (new CFPlus::UI::Button 2281 $BUTTONBAR->add (new DC::UI::Button
2228 text => "Save Config", 2282 text => "Save Config",
2229 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 2283 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
2230 on_activate => sub { 2284 on_activate => sub {
2231 $::CFG->{layout} = CFPlus::UI::get_layout; 2285 $::CFG->{layout} = DC::UI::get_layout;
2232 CFPlus::write_cfg "$Crossfire::VARDIR/cfplusrc"; 2286 DC::write_cfg "$Deliantra::VARDIR/client.cf";
2233 status "Configuration Saved"; 2287 status "Configuration Saved";
2234 0 2288 0
2235 }, 2289 },
2236 ); 2290 );
2237 2291
2238 $BUTTONBAR->add (new CFPlus::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window, 2292 $BUTTONBAR->add (new DC::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
2239 tooltip => "View Documentation"); 2293 tooltip => "View Documentation");
2240 2294
2241 2295
2242 $BUTTONBAR->add (new CFPlus::UI::Button 2296 $BUTTONBAR->add (new DC::UI::Button
2243 text => "Quit", 2297 text => "Quit",
2244 tooltip => "Terminates the program", 2298 tooltip => "Terminates the program",
2245 on_activate => sub { 2299 on_activate => sub {
2246 if ($CONN) { 2300 if ($CONN) {
2247 open_quit_dialog; 2301 open_quit_dialog;
2259 2313
2260 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); 2314 $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]);
2261} 2315}
2262 2316
2263sub video_shutdown { 2317sub video_shutdown {
2264 CFPlus::OpenGL::shutdown; 2318 DC::OpenGL::shutdown;
2265 2319
2266 undef $SDL_ACTIVE; 2320 undef $SDL_ACTIVE;
2267} 2321}
2268 2322
2269my %animate_object; 2323my %animate_object;
2270my $animate_timer; 2324my $animate_timer;
2271 2325
2272my $fps = 9; 2326my $fps = 9;
2273 2327
2274sub force_refresh { 2328sub force_refresh {
2275 $WANT_REFRESH->stop;
2276
2277 if ($ENV{CFPLUS_DEBUG} & 4) { 2329 if ($ENV{CFPLUS_DEBUG} & 4) {
2278 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02; 2330 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02;
2279 debug sprintf "%3.2f", $fps; 2331 debug sprintf "%3.2f", $fps;
2280 } 2332 }
2281 2333
2334 undef $WANT_REFRESH;
2335 $_[0]->stop;
2336
2282 $CFPlus::UI::ROOT->draw; 2337 $DC::UI::ROOT->draw;
2283 CFPlus::SDL_GL_SwapBuffers; 2338 DC::SDL_GL_SwapBuffers;
2284 $LAST_REFRESH = $NOW; 2339 $LAST_REFRESH = $NOW;
2285} 2340}
2286 2341
2287$WANT_REFRESH = EV::idle_ns \&force_refresh; 2342my $want_refresh = EV::prepare_ns \&force_refresh;
2288 2343
2289my $input = EV::timer 0, 1/60, sub { 2344my $input = EV::periodic 0, 1 / $MAX_FPS, undef, sub {
2290 $NOW = time; 2345 $NOW = EV::now;
2291 2346
2292 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_) 2347 ($SDL_CB{$_->{type}} || sub { warn "unhandled event $_->{type}" })->($_)
2293 for CFPlus::poll_events; 2348 for DC::poll_events;
2294 2349
2295 if (%animate_object) { 2350 if (%animate_object) {
2296 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object; 2351 $_->animate ($LAST_REFRESH - $NOW) for values %animate_object;
2297 $WANT_REFRESH->start; 2352 $WANT_REFRESH = 1;
2298 } 2353 }
2354
2355 $want_refresh->start
2356 if $WANT_REFRESH;
2299}; 2357};
2300 2358
2301sub animation_start { 2359sub animation_start {
2302 my ($widget) = @_; 2360 my ($widget) = @_;
2303 $animate_object{$widget} = $widget; 2361 $animate_object{$widget} = $widget;
2307 my ($widget) = @_; 2365 my ($widget) = @_;
2308 delete $animate_object{$widget}; 2366 delete $animate_object{$widget};
2309} 2367}
2310 2368
2311%SDL_CB = ( 2369%SDL_CB = (
2312 CFPlus::SDL_QUIT => sub { 2370 DC::SDL_QUIT => sub {
2313 EV::unloop EV::UNLOOP_ALL; 2371 EV::unloop EV::UNLOOP_ALL;
2314 }, 2372 },
2315 CFPlus::SDL_VIDEORESIZE => sub { 2373 DC::SDL_VIDEORESIZE => sub {
2316 }, 2374 },
2317 CFPlus::SDL_VIDEOEXPOSE => sub { 2375 DC::SDL_VIDEOEXPOSE => sub {
2318 CFPlus::UI::full_refresh; 2376 DC::UI::full_refresh;
2319 }, 2377 },
2320 CFPlus::SDL_ACTIVEEVENT => sub { 2378 DC::SDL_ACTIVEEVENT => sub {
2321# not useful, as APPACTIVE include sonly iconified state, not unmapped 2379# not useful, as APPACTIVE includes only iconified state, not unmapped
2322# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, CFPlus::SDL_GetAppState;#d# 2380# printf "active %x %x %x\n", $_[0]{gain}, $_[0]{state}, DC::SDL_GetAppState;#d#
2323# printf "a %x\n", CFPlus::SDL_GetAppState & CFPlus::SDL_APPACTIVE;#d# 2381# printf "a %x\n", DC::SDL_GetAppState & DC::SDL_APPACTIVE;#d#
2324# printf "A\n" if $_[0]{state} & CFPlus::SDL_APPACTIVE; 2382# printf "A\n" if $_[0]{state} & DC::SDL_APPACTIVE;
2325# printf "K\n" if $_[0]{state} & CFPlus::SDL_APPINPUTFOCUS; 2383# printf "K\n" if $_[0]{state} & DC::SDL_APPINPUTFOCUS;
2326# printf "M\n" if $_[0]{state} & CFPlus::SDL_APPMOUSEFOCUS; 2384# printf "M\n" if $_[0]{state} & DC::SDL_APPMOUSEFOCUS;
2327 }, 2385 },
2328 CFPlus::SDL_KEYDOWN => sub { 2386 DC::SDL_KEYDOWN => sub {
2329 if ($_[0]{mod} & CFPlus::KMOD_ALT && $_[0]{sym} == 13) { 2387 if ($_[0]{mod} & DC::KMOD_ALT && $_[0]{sym} == 13) {
2330 # alt-enter 2388 # alt-enter
2331 $FULLSCREEN_ENABLE->toggle; 2389 $FULLSCREEN_ENABLE->toggle;
2332 video_shutdown; 2390 video_shutdown;
2333 video_init; 2391 video_init;
2334 } else { 2392 } else {
2335 CFPlus::UI::feed_sdl_key_down_event ($_[0]); 2393 &DC::UI::feed_sdl_key_down_event;
2336 } 2394 }
2395 update_modbox;
2337 }, 2396 },
2338 CFPlus::SDL_KEYUP => \&CFPlus::UI::feed_sdl_key_up_event, 2397 DC::SDL_KEYUP => sub {
2398 &DC::UI::feed_sdl_key_up_event;
2399 update_modbox;
2400 },
2339 CFPlus::SDL_MOUSEMOTION => \&CFPlus::UI::feed_sdl_motion_event, 2401 DC::SDL_MOUSEMOTION => \&DC::UI::feed_sdl_motion_event,
2340 CFPlus::SDL_MOUSEBUTTONDOWN => \&CFPlus::UI::feed_sdl_button_down_event, 2402 DC::SDL_MOUSEBUTTONDOWN => \&DC::UI::feed_sdl_button_down_event,
2341 CFPlus::SDL_MOUSEBUTTONUP => \&CFPlus::UI::feed_sdl_button_up_event, 2403 DC::SDL_MOUSEBUTTONUP => \&DC::UI::feed_sdl_button_up_event,
2342 CFPlus::SDL_USEREVENT => sub { 2404 DC::SDL_USEREVENT => sub {
2343 if ($_[0]{code} == 1) { 2405 if ($_[0]{code} == 1) {
2344 audio_channel_finished $_[0]{data1}; 2406 audio_channel_finished $_[0]{data1};
2345 } elsif ($_[0]{code} == 0) { 2407 } elsif ($_[0]{code} == 0) {
2346 audio_music_finished; 2408 audio_music_finished;
2347 } 2409 }
2354 EV::unloop; 2416 EV::unloop;
2355 #d# TODO calling exit here hangs the process in some futex 2417 #d# TODO calling exit here hangs the process in some futex
2356}; 2418};
2357 2419
2358{ 2420{
2359 CFPlus::read_cfg "$Crossfire::VARDIR/cfplusrc"; 2421 if (-e "$Deliantra::VARDIR/client.cf") {
2422 DC::read_cfg "$Deliantra::VARDIR/client.cf";
2423 } else {
2424 #TODO: compatibility cruft
2425 DC::read_cfg "$Deliantra::OLDDIR/cfplusrc";
2426 print STDERR "INFO: used old configuration file\n";
2427 }
2428
2360 CFPlus::DB::Server::run; 2429 DC::DB::Server::run;
2361 2430
2362 CFPlus::UI::set_layout ($::CFG->{layout}); 2431 DC::UI::set_layout ($::CFG->{layout});
2363 2432
2364 my %DEF_CFG = ( 2433 my %DEF_CFG = (
2365 sdl_mode => 0, 2434 sdl_mode => 0,
2366 fullscreen => 1, 2435 fullscreen => 1,
2367 fast => 0, 2436 fast => 0,
2413 } 2482 }
2414 } 2483 }
2415 2484
2416 sdl_init; 2485 sdl_init;
2417 2486
2418 @SDL_MODES = CFPlus::SDL_ListModes 8, 8; 2487 @SDL_MODES = DC::SDL_ListModes 8, 8;
2419 @SDL_MODES = CFPlus::SDL_ListModes 5, 0 unless @SDL_MODES; 2488 @SDL_MODES = DC::SDL_ListModes 5, 0 unless @SDL_MODES;
2420 @SDL_MODES or CFPlus::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)"; 2489 @SDL_MODES or DC::fatal "Unable to find a usable video mode\n(hardware accelerated opengl fullscreen)";
2421 2490
2422 @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES; 2491 @SDL_MODES = sort { $a->[0] * $a->[1] <=> $b->[0] * $b->[1] } @SDL_MODES;
2423 2492
2424 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES; 2493 $CFG->{sdl_mode} = 0 if $CFG->{sdl_mode} > @SDL_MODES;
2425 2494
2426 { 2495 {
2427 my @fonts = map CFPlus::find_rcfile "fonts/$_", qw( 2496 my @fonts = map DC::find_rcfile "fonts/$_", qw(
2428 DejaVuSans.ttf 2497 DejaVuSans.ttf
2429 DejaVuSansMono.ttf 2498 DejaVuSansMono.ttf
2430 DejaVuSans-Bold.ttf 2499 DejaVuSans-Bold.ttf
2431 DejaVuSansMono-Bold.ttf 2500 DejaVuSansMono-Bold.ttf
2432 DejaVuSans-Oblique.ttf 2501 DejaVuSans-Oblique.ttf
2433 DejaVuSansMono-Oblique.ttf 2502 DejaVuSansMono-Oblique.ttf
2434 DejaVuSans-BoldOblique.ttf 2503 DejaVuSans-BoldOblique.ttf
2435 DejaVuSansMono-BoldOblique.ttf 2504 DejaVuSansMono-BoldOblique.ttf
2436 ); 2505 );
2437 2506
2438 CFPlus::add_font $_ for @fonts; 2507 DC::add_font $_ for @fonts;
2439 2508
2440 CFPlus::pango_init; 2509 DC::pango_init;
2441 2510
2442 $FONT_PROP = new_from_file CFPlus::Font $fonts[0]; 2511 $FONT_PROP = new_from_file DC::Font $fonts[0];
2443 $FONT_FIXED = new_from_file CFPlus::Font $fonts[1]; 2512 $FONT_FIXED = new_from_file DC::Font $fonts[1];
2444 2513
2445 $FONT_PROP->make_default; 2514 $FONT_PROP->make_default;
2446 } 2515 }
2447 2516
2448# compare mono (ft) vs. rgba (cairo) 2517# compare mono (ft) vs. rgba (cairo)
2449# ft - 1.8s, cairo 3s, even in alpha-only mode 2518# ft - 1.8s, cairo 3s, even in alpha-only mode
2450# for my $rgba (0..1) { 2519# for my $rgba (0..1) {
2451# my $t1 = Time::HiRes::time; 2520# my $t1 = Time::HiRes::time;
2452# for (1..1000) { 2521# for (1..1000) {
2453# my $layout = CFPlus::Layout->new ($rgba); 2522# my $layout = DC::Layout->new ($rgba);
2454# $layout->set_text ("hallo" x 100); 2523# $layout->set_text ("hallo" x 100);
2455# $layout->render; 2524# $layout->render;
2456# } 2525# }
2457# my $t2 = Time::HiRes::time; 2526# my $t2 = Time::HiRes::time;
2458# warn $t2-$t1; 2527# warn $t2-$t1;
2471 2540
2472EV::loop; 2541EV::loop;
2473 2542
2474#video_shutdown; 2543#video_shutdown;
2475#audio_shutdown; 2544#audio_shutdown;
2545DC::OpenGL::quit;
2476CFPlus::SDL_Quit; 2546DC::SDL_Quit;
2477CFPlus::DB::Server::stop; 2547DC::DB::Server::stop;
2478 2548
2479=head1 NAME 2549=head1 NAME
2480 2550
2481deliantra - A Deliantra MORPG game client 2551deliantra - A Deliantra MORPG game client
2482 2552

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines