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

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.84 by root, Sun Jul 2 18:52:05 2006 UTC vs.
Revision 1.97 by elmex, Wed Jul 19 16:41:51 2006 UTC

40use CFClient::UI; 40use CFClient::UI;
41use CFClient::BindingEditor; 41use CFClient::BindingEditor;
42use CFClient::MapWidget; 42use CFClient::MapWidget;
43 43
44$SIG{QUIT} = sub { Carp::cluck "QUIT" }; 44$SIG{QUIT} = sub { Carp::cluck "QUIT" };
45$SIG{PIPE} = 'IGNORE';
45 46
46$Event::DIED = sub { 47$Event::DIED = sub {
47 # TODO: display dialog box or so 48 # TODO: display dialog box or so
48 Carp::confess $_[1];#d#TODO: remove when stable 49 Carp::confess $_[1];#d#TODO: remove when stable
49 CFClient::error $_[1]; 50 CFClient::error $_[1];
85our $CONSOLE; 86our $CONSOLE;
86our $METASERVER; 87our $METASERVER;
87our $LOGIN_BUTTON; 88our $LOGIN_BUTTON;
88our $QUIT_DIALOG; 89our $QUIT_DIALOG;
89our $HOST_ENTRY; 90our $HOST_ENTRY;
91our $FULLSCREEN_ENABLE;
92our $PICKUP_ENABLE;
90our $SERVER_INFO; 93our $SERVER_INFO;
91 94
92our $SETUP_DIALOG; 95our $SETUP_DIALOG;
93our $SETUP_NOTEBOOK; 96our $SETUP_NOTEBOOK;
94our $SETUP_SERVER; 97our $SETUP_SERVER;
95our $SETUP_KEYBOARD; 98our $SETUP_KEYBOARD;
96our $SETUP_SPELLS;
97 99
100our $PL_NOTEBOOK;
98our $STATS_WINDOW; 101our $PL_WINDOW;
102
103our $INVENTORY_PAGE;
104our $STATS_PAGE;
105our $SKILL_PAGE;
106our $SPELL_PAGE;
107
108our $HELP_WINDOW;
99our $MESSAGE_WINDOW; 109our $MESSAGE_WINDOW;
100our $FLOORBOX; 110our $FLOORBOX;
101our $GAUGES; 111our $GAUGES;
102our $STATWIDS; 112our $STATWIDS;
103 113
110 120
111our $ALT_ENTER_MESSAGE; 121our $ALT_ENTER_MESSAGE;
112our $STATUSBOX; 122our $STATUSBOX;
113our $DEBUG_STATUS; 123our $DEBUG_STATUS;
114 124
115our $INV_WINDOW;
116our $INV; 125our $INV;
117our $INVR; 126our $INVR;
118our $INV_RIGHT_HB; 127our $INV_RIGHT_HB;
119 128
120our $BIND_EDITOR; 129our $BIND_EDITOR;
221 $conn->send ("reply $stat"); 230 $conn->send ("reply $stat");
222 destroy_query_dialog $conn; 231 destroy_query_dialog $conn;
223 return; 232 return;
224 } 233 }
225 234
226 $STATS_WINDOW->show; 235 $STATS_PAGE->show;
227 $MESSAGE_WINDOW->hide; 236 $MESSAGE_WINDOW->hide;
228 237
229 unshift @dialog, new CFClient::UI::Label 238 unshift @dialog, new CFClient::UI::Label
230 max_w => $::WIDTH * 0.4, 239 max_w => $::WIDTH * 0.4,
231 ellipsise => 0, 240 ellipsise => 0,
271 # right: accept 280 # right: accept
272 $table->add (4, 0, new CFClient::UI::Button 281 $table->add (4, 0, new CFClient::UI::Button
273 text => "Accept", 282 text => "Accept",
274 on_activate => sub { 283 on_activate => sub {
275 $conn->send ("reply n"); 284 $conn->send ("reply n");
276 $STATS_WINDOW->hide; 285 $STATS_PAGE->hide;
277 destroy_query_dialog $conn; 286 destroy_query_dialog $conn;
278 0 287 0
279 }, 288 },
280 ); 289 );
281 290
373 382
374sub stop_game { 383sub stop_game {
375 $LOGIN_BUTTON->set_text ("Login"); 384 $LOGIN_BUTTON->set_text ("Login");
376 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER); 385 $SETUP_NOTEBOOK->set_current_page ($SETUP_SERVER);
377 $SETUP_DIALOG->show; 386 $SETUP_DIALOG->show;
378 $INV_WINDOW->hide; 387 $PL_WINDOW->hide;
379 $SETUP_SPELLS->clear_spells; 388 $SPELL_PAGE->clear_spells;
380 389
381 return unless $CONN; 390 return unless $CONN;
382 391
383 status "connection closed"; 392 status "connection closed";
384 393
409 $mode_slider->emit (changed => $mode_slider->{range}[0]); 418 $mode_slider->emit (changed => $mode_slider->{range}[0]);
410 419
411 my $row = 1; 420 my $row = 1;
412 421
413 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen"); 422 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen");
414 $table->add (1, $row++, new CFClient::UI::CheckBox 423 $table->add (1, $row++, $FULLSCREEN_ENABLE = new CFClient::UI::CheckBox
415 state => $CFG->{fullscreen}, 424 state => $CFG->{fullscreen},
416 tooltip => "Bring the client into fullscreen mode.", 425 tooltip => "Bring the client into fullscreen mode.",
417 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } 426 on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 }
418 ); 427 );
419 428
469 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1], 478 range => [$CFG->{log_fontsize}, 0.5, 2, 0, 0.1],
470 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.", 479 tooltip => "The font size used by the <b>message/server log</b> window only. Changes are instant.",
471 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 }, 480 on_changed => sub { $LOGVIEW->set_fontsize ($CFG->{log_fontsize} = $_[1]); 0 },
472 ); 481 );
473 482
474 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Stats Fontsize");
475
476 $table->add (1, $row++, new CFClient::UI::Slider
477 range => [$CFG->{stat_fontsize}, 0.5, 2, 0, 0.1],
478 tooltip => "The font size used by the <b>statistics window</b> only. Changes are instant.",
479 on_changed => sub {
480 $CFG->{stat_fontsize} = $_[1];
481 &set_stats_window_fontsize;
482 0
483 }
484 );
485
486 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize"); 483 $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Gauge fontsize");
487 $table->add (1, $row++, new CFClient::UI::Slider 484 $table->add (1, $row++, new CFClient::UI::Slider
488 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1], 485 range => [$CFG->{gauge_fontsize}, 0.5, 2, 0, 0.1],
489 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.", 486 tooltip => "Adjusts the fontsize of the gauges at the bottom right. Changes are instant.",
490 on_changed => sub { 487 on_changed => sub {
559 ); 556 );
560 557
561 $vbox 558 $vbox
562} 559}
563 560
564sub set_stats_window_fontsize {
565 for (values %{$STATWIDS}) {
566 $_->set_fontsize ($::CFG->{stat_fontsize});
567 }
568}
569
570sub set_gauge_window_fontsize { 561sub set_gauge_window_fontsize {
571 for (map { $GAUGES->{$_} } grep { $_ ne 'win' } keys %{$GAUGES}) { 562 for (map { $GAUGES->{$_} } grep { $_ ne 'win' } keys %{$GAUGES}) {
572 $_->set_fontsize ($::CFG->{gauge_fontsize}); 563 $_->set_fontsize ($::CFG->{gauge_fontsize});
573 } 564 }
574} 565}
653 644
654 $table 645 $table
655} 646}
656 647
657sub stats_window { 648sub stats_window {
658 my $tgw = new CFClient::UI::FancyFrame 649 my $r =
659 y => $HEIGHT * (2/8), 650 new CFClient::UI::ScrolledWindow (
660 x => "max", 651 expand => 1,
661 title => "Stats", 652 scroll_y => 1
662 name => "stats_window", 653 );
663 has_close_button => 1; 654 $r->add (my $vb = new CFClient::UI::VBox);
664 655
665 $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox);
666 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 656 $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
667 can_hover => 1, can_events => 1, 657 can_hover => 1, can_events => 1,
668 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 658 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
669 $vb->add ($STATWIDS->{map} = new CFClient::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, 659 $vb->add ($STATWIDS->{map} = new CFClient::UI::Label valign => 0, align => -1, text => "Map:", expand => 1,
670 can_hover => 1, can_events => 1, 660 can_hover => 1, can_events => 1,
706 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, align => +1, template => $template, tooltip => $tooltip); 696 font => $FONT_FIXED, can_hover => 1, can_events => 1, valign => 0, align => +1, template => $template, tooltip => $tooltip);
707 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFClient::UI::Label 697 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFClient::UI::Label
708 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, align => -1, text => $label, tooltip => $tooltip); 698 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, align => -1, text => $label, tooltip => $tooltip);
709 } 699 }
710 700
711 $hb->add (my $tbl2 = new CFClient::UI::Table expand => 1); 701 $vb->add (my $tbl2 = new CFClient::UI::Table expand => 1);
712 702
713 my $row = 0; 703 my $row = 0;
714 my $col = 0; 704 my $col = 0;
715 705
716 my %resist_names = ( 706 my %resist_names = (
707 slow => ["Slow",
717 slow => "<b>Slow</b> (slows you down when you are hit by the spell. Monsters will have an opportunity to come near you faster and hit you more often.)", 708 "<b>Slow</b> (slows you down when you are hit by the spell. Monsters will have an opportunity to come near you faster and hit you more often.)"],
709 holyw => ["Holy Word",
718 holyw => "<b>Holy Word</b> (resistance you against getting the fear when someone whose god doesn't like you spells the holy word on you.)", 710 "<b>Holy Word</b> (resistance you against getting the fear when someone whose god doesn't like you spells the holy word on you.)"],
711 conf => ["Confusion",
719 conf => "<b>Confusion</b> (If you are hit by confusion you will move into random directions, and likely into monsters.)", 712 "<b>Confusion</b> (If you are hit by confusion you will move into random directions, and likely into monsters.)"],
713 fire => ["Fire",
720 fire => "<b>Fire</b> (just your resistance to fire spells like burning hands, dragonbreath, meteor swarm fire, ...)", 714 "<b>Fire</b> (just your resistance to fire spells like burning hands, dragonbreath, meteor swarm fire, ...)"],
715 depl => ["Depletion",
721 depl => "<b>Depletion</b> (some monsters and other effects can cause stats depletion)", 716 "<b>Depletion</b> (some monsters and other effects can cause stats depletion)"],
717 magic => ["Magic",
722 magic => "<b>Magic</b> (resistance to magic spells like magic missile or similar)", 718 "<b>Magic</b> (resistance to magic spells like magic missile or similar)"],
719 drain => ["Draining",
723 drain => "<b>Draining</b> (some monsters (e.g. vampires) and other effects can steal experience)", 720 "<b>Draining</b> (some monsters (e.g. vampires) and other effects can steal experience)"],
721 acid => ["Acid",
724 acid => "<b>Acid</b> (resistance to acid, acid hurts pretty much and also corrodes your weapons)", 722 "<b>Acid</b> (resistance to acid, acid hurts pretty much and also corrodes your weapons)"],
723 pois => ["Poison",
725 pois => "<b>Poison</b> (resistance to getting poisoned)", 724 "<b>Poison</b> (resistance to getting poisoned)"],
725 para => ["Paralysation",
726 para => "<b>Paralysation</b> (this resistance affects the chance you get paralysed)", 726 "<b>Paralysation</b> (this resistance affects the chance you get paralysed)"],
727 deat => ["Death",
727 deat => "<b>Death</b> (resistance against death spells)", 728 "<b>Death</b> (resistance against death spells)"],
729 phys => ["Physical",
728 phys => "<b>Physical</b> (this is the resistance against physical attacks, like when a monster hit you in melee combat. The value displayed here is also displayed in the 'Arm' field on the left.)", 730 "<b>Physical</b> (this is the resistance against physical attacks, like when a monster hit you in melee combat. The value displayed here is also displayed in the 'Arm' field on the left.)"],
731 blind => ["Blind",
729 blind => "<b>Blind</b> (blind resistance affects the chance of a successful blinding attack)", 732 "<b>Blind</b> (blind resistance affects the chance of a successful blinding attack)"],
733 fear => ["Fear",
730 fear => "<b>Fear</b> (this attack will drive you away from monsters who cast this and hit you successfully, being resistant to this helps a lot when fighting those monsters)", 734 "<b>Fear</b> (this attack will drive you away from monsters who cast this and hit you successfully, being resistant to this helps a lot when fighting those monsters)"],
735 tund => ["Turn undead",
731 tund => "<b>Turn undead</b> (affects your resistancy to various forms of 'turn undead' spells. Only relevant when you are, in fact, undead...", 736 "<b>Turn undead</b> (affects your resistancy to various forms of 'turn undead' spells. Only relevant when you are, in fact, undead..."],
737 elec => ["Electricity",
732 elec => "<b>Electricity</b> (resistance against electricity, spells like large lightning, small lightning, ...)", 738 "<b>Electricity</b> (resistance against electricity, spells like large lightning, small lightning, ...)"],
739 cold => ["Cold",
733 cold => "<b>Cold</b> (this is your resistance against cold spells like icestorm, snowstorm, ...)", 740 "<b>Cold</b> (this is your resistance against cold spells like icestorm, snowstorm, ...)"],
741 ghit => ["Ghost hit",
734 ghit => "<b>Ghost hit</b> (special attack used by ghosts and ghost-like beings)", 742 "<b>Ghost hit</b> (special attack used by ghosts and ghost-like beings)"],
735 ); 743 );
736 for (qw/slow holyw conf fire depl magic 744 for (qw/slow holyw conf fire depl magic
737 drain acid pois para deat phys 745 drain acid pois para deat phys
738 blind fear tund elec cold ghit/) 746 blind fear tund elec cold ghit/)
739 { 747 {
744 template => "-100%", 752 template => "-100%",
745 align => +1, 753 align => +1,
746 valign => 0, 754 valign => 0,
747 can_events => 1, 755 can_events => 1,
748 can_hover => 1, 756 can_hover => 1,
749 tooltip => $resist_names{$_}, 757 tooltip => $resist_names{$_}->[1],
750 ); 758 );
751 $tbl2->add ($col + 1, $row, new CFClient::UI::Image 759 $tbl2->add ($col + 1, $row, new CFClient::UI::Image
752 font => $FONT_FIXED, 760 font => $FONT_FIXED,
753 can_hover => 1, 761 can_hover => 1,
754 can_events => 1, 762 can_events => 1,
755 path => "ui/resist/resist_$_.png", 763 path => "ui/resist/resist_$_.png",
756 tooltip => $resist_names{$_}, 764 tooltip => $resist_names{$_}->[1],
765 );
766 $tbl2->add ($col + 2, $row, new CFClient::UI::Label
767 text => $resist_names{$_}->[0],
768 font => $FONT_FIXED,
769 can_hover => 1,
770 can_events => 1,
771 tooltip => $resist_names{$_}->[1],
757 ); 772 );
758 773
759 $row++; 774 $row++;
760 if ($row % 6 == 0) { 775 if ($row % 6 == 0) {
761 $col += 2; 776 $col += 3;
762 $row = 0; 777 $row = 0;
763 } 778 }
764 } 779 }
765 780
766 &set_stats_window_fontsize;
767 update_stats_window ({}); 781 #update_stats_window ({});
768 782
783 $r
784}
785
786sub skill_window {
787 my $sw = new CFClient::UI::ScrolledWindow (expand => 1);
788 $sw->add ($STATWIDS->{skill_tbl} = new CFClient::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1]);
769 $tgw 789 $sw
770} 790}
771 791
772sub formsep($) { 792sub formsep($) {
773 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1 793 scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1
774}
775
776sub update_stats_window {
777 my ($stats) = @_;
778
779 # I love text protocols...
780
781 my $hp = $stats->{+CS_STAT_HP} * 1;
782 my $hp_m = $stats->{+CS_STAT_MAXHP} * 1;
783 my $sp = $stats->{+CS_STAT_SP} * 1;
784 my $sp_m = $stats->{+CS_STAT_MAXSP} * 1;
785 my $fo = $stats->{+CS_STAT_FOOD} * 1;
786 my $fo_m = 999;
787 my $gr = $stats->{+CS_STAT_GRACE} * 1;
788 my $gr_m = $stats->{+CS_STAT_MAXGRACE} * 1;
789
790 $GAUGES->{hp} ->set_value ($hp, $hp_m);
791 $GAUGES->{mana} ->set_value ($sp, $sp_m);
792 $GAUGES->{food} ->set_value ($fo, $fo_m);
793 $GAUGES->{grace} ->set_value ($gr, $gr_m);
794 $GAUGES->{exp} ->set_text ("Exp: " . (formsep $stats->{+CS_STAT_EXP64})
795 . " (lvl " . ($stats->{+CS_STAT_LEVEL} * 1) . ")");
796 my $rng = $stats->{+CS_STAT_RANGE};
797 $rng =~ s/^Range: //; # thank you so much dear server
798 $GAUGES->{range} ->set_text ("Rng: " . $rng);
799 my $title = $stats->{+CS_STAT_TITLE};
800 $title =~ s/^Player: //;
801 $STATWIDS->{title} ->set_text ("Title: " . $title);
802
803 $STATWIDS->{st_str} ->set_text (sprintf "%d" , $stats->{+CS_STAT_STR});
804 $STATWIDS->{st_dex} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DEX});
805 $STATWIDS->{st_con} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CON});
806 $STATWIDS->{st_int} ->set_text (sprintf "%d" , $stats->{+CS_STAT_INT});
807 $STATWIDS->{st_wis} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WIS});
808 $STATWIDS->{st_pow} ->set_text (sprintf "%d" , $stats->{+CS_STAT_POW});
809 $STATWIDS->{st_cha} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CHA});
810 $STATWIDS->{st_wc} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WC});
811 $STATWIDS->{st_ac} ->set_text (sprintf "%d" , $stats->{+CS_STAT_AC});
812 $STATWIDS->{st_dam} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DAM});
813 $STATWIDS->{st_arm} ->set_text (sprintf "%d" , $stats->{+CS_STAT_RES_PHYS});
814 $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED});
815 $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP});
816
817 $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000);
818
819 my %tbl = (
820 phys => CS_STAT_RES_PHYS,
821 magic => CS_STAT_RES_MAG,
822 fire => CS_STAT_RES_FIRE,
823 elec => CS_STAT_RES_ELEC,
824 cold => CS_STAT_RES_COLD,
825 conf => CS_STAT_RES_CONF,
826 acid => CS_STAT_RES_ACID,
827 drain => CS_STAT_RES_DRAIN,
828 ghit => CS_STAT_RES_GHOSTHIT,
829 pois => CS_STAT_RES_POISON,
830 slow => CS_STAT_RES_SLOW,
831 para => CS_STAT_RES_PARA,
832 tund => CS_STAT_TURN_UNDEAD,
833 fear => CS_STAT_RES_FEAR,
834 depl => CS_STAT_RES_DEPLETE,
835 deat => CS_STAT_RES_DEATH,
836 holyw => CS_STAT_RES_HOLYWORD,
837 blind => CS_STAT_RES_BLIND,
838 );
839
840 $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}})
841 for keys %tbl;
842} 794}
843 795
844my $METASERVER_ATIME; 796my $METASERVER_ATIME;
845 797
846sub update_metaserver { 798sub update_metaserver {
1092sub message_window { 1044sub message_window {
1093 my $window = new CFClient::UI::FancyFrame 1045 my $window = new CFClient::UI::FancyFrame
1094 name => "message_window", 1046 name => "message_window",
1095 title => "Messages", 1047 title => "Messages",
1096 border_bg => [1, 1, 1, 1], 1048 border_bg => [1, 1, 1, 1],
1097 bg => [0, 0, 0, 0.75],
1098 x => "max", 1049 x => "max",
1099 y => 0, 1050 y => 0,
1100 force_w => $::WIDTH * 0.4, 1051 force_w => $::WIDTH * 0.4,
1101 force_h => $::HEIGHT * 0.5, 1052 force_h => $::HEIGHT * 0.5,
1102 child => (my $vbox = new CFClient::UI::VBox), 1053 child => (my $vbox = new CFClient::UI::VBox),
1188sub autopickup_setup { 1139sub autopickup_setup {
1189 my $table = new CFClient::UI::Table; 1140 my $table = new CFClient::UI::Table;
1190 1141
1191 for ( 1142 for (
1192 ["General", 0, 0, 1143 ["General", 0, 0,
1193 ["Enable autopickup" => PICKUP_NEWMODE], 1144 ["Enable autopickup" => PICKUP_NEWMODE, \$PICKUP_ENABLE],
1194 ["Inhibit autopickup" => PICKUP_INHIBIT], 1145 ["Inhibit autopickup" => PICKUP_INHIBIT],
1195 ["Stop before pickup" => PICKUP_STOP], 1146 ["Stop before pickup" => PICKUP_STOP],
1196 ["Debug autopickup" => PICKUP_DEBUG], 1147 ["Debug autopickup" => PICKUP_DEBUG],
1197 ], 1148 ],
1198 ["Weapons", 0, 6, 1149 ["Weapons", 0, 6,
1235 for (@bits) { 1186 for (@bits) {
1236 ++$y; 1187 ++$y;
1237 1188
1238 my $mask = $_->[1]; 1189 my $mask = $_->[1];
1239 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1); 1190 $table->add ($x , $y, new CFClient::UI::Label text => $_->[0], align => 1, expand => 1);
1240 $table->add ($x+1, $y, new CFClient::UI::CheckBox 1191 $table->add ($x+1, $y, my $checkbox = new CFClient::UI::CheckBox
1241 state => $::CFG->{pickup} & $mask, 1192 state => $::CFG->{pickup} & $mask,
1242 on_changed => sub { 1193 on_changed => sub {
1243 my ($box, $value) = @_; 1194 my ($box, $value) = @_;
1244 1195
1245 if ($value) { 1196 if ($value) {
1251 $::CONN->send_command ("pickup $::CFG->{pickup}") 1202 $::CONN->send_command ("pickup $::CFG->{pickup}")
1252 if defined $::CONN; 1203 if defined $::CONN;
1253 1204
1254 0 1205 0
1255 }); 1206 });
1207
1208 ${$_->[2]} = $checkbox if $_->[2];
1256 } 1209 }
1257 } 1210 }
1258 1211
1259 $table->add (2, 18, new CFClient::UI::ValSlider 1212 $table->add (2, 18, new CFClient::UI::ValSlider
1260 range => [$::CFG->{pickup} & 0xF, 0, 16, 1, 1], 1213 range => [$::CFG->{pickup} & 0xF, 0, 16, 1, 1],
1278 }); 1231 });
1279 1232
1280 $table 1233 $table
1281} 1234}
1282 1235
1283sub inventory_window { 1236sub inventory_widget {
1237 my $hb = new CFClient::UI::HBox homogeneous => 1;
1238
1239 $hb->add (my $vb1 = new CFClient::UI::VBox);
1240 $vb1->add (new CFClient::UI::Label align => 0, text => "Player");
1241 $vb1->add (my $sw1 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1242 $sw1->add ($INV = new CFClient::UI::Inventory);
1243
1244 $hb->add (my $vb2 = new CFClient::UI::VBox);
1245
1246 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox);
1247
1248 $vb2->add (my $sw2 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1);
1249 $sw2->add ($INVR = new CFClient::UI::Inventory);
1250
1251 # XXX: Call after $INVR = ... because set_opencont sets the items
1252 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
1253
1254 $hb
1255}
1256
1257sub toggle_player_page {
1258 my ($widget) = @_;
1259
1260 if ($PL_WINDOW->{visible} && $PL_NOTEBOOK->get_current_page == $widget) {
1261 $PL_WINDOW->hide;
1262 } else {
1263 $PL_NOTEBOOK->set_current_page ($widget);
1264 $PL_WINDOW->show;
1265 }
1266}
1267
1268sub player_window {
1284 my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame 1269 my $plwin = $PL_WINDOW = new CFClient::UI::FancyFrame
1285 x => "center", 1270 x => "center",
1286 y => "center", 1271 y => "center",
1287 force_w => $WIDTH * 9/10, 1272 force_w => $WIDTH * 9/10,
1288 force_h => $HEIGHT * 9/10, 1273 force_h => $HEIGHT * 9/10,
1289 title => "Inventory", 1274 title => "Player",
1290 name => "inventory_window", 1275 name => "playerbook",
1291 has_close_button => 1, 1276 has_close_button => 1
1292 ; 1277 ;
1293 1278
1294 $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); 1279 my $ntb =
1280 $PL_NOTEBOOK =
1281 new CFClient::UI::Notebook expand => 1, debug => 1;
1295 1282
1296 $hb->add (my $vb1 = new CFClient::UI::VBox); 1283 $ntb->add (
1297 $vb1->add (new CFClient::UI::Label align => 0, text => "Player"); 1284 "Statistics (F2)" => $STATS_PAGE = stats_window,
1298 $vb1->add ($INV = new CFClient::UI::Inventory expand => 1); 1285 "Shows statistics, where all your Stats and Resistances are shown."
1286 );
1287 $ntb->add (
1288 "Skills (F3)" => $SKILL_PAGE = skill_window,
1289 "Shows all your Skills."
1290 );
1299 1291
1300 $hb->add (my $vb2 = new CFClient::UI::VBox); 1292 my $spellsw = new CFClient::UI::ScrolledWindow (expand => 1, scroll_y => 1);
1293 $spellsw->add ($SPELL_PAGE = new CFClient::UI::SpellList);
1294 $ntb->add (
1295 "Spellbook (F4)" => $spellsw,
1296 "Displays all spells you have and lets you edit keyboard shortcuts for them."
1297 );
1298 $ntb->add (
1299 "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget,
1300 "Toggles the inventory window, where you can manage your loot (or treasures :). "
1301 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory."
1302 );
1301 1303
1302 $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox); 1304 $ntb->set_current_page ($INVENTORY_PAGE);
1303 1305
1304 $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1); 1306 $plwin->add ($ntb);
1305 1307 $plwin
1306 # XXX: Call after $INVR = ... because set_opencont sets the items
1307 CFClient::Protocol::set_opencont ($::CONN, 0, "Floor");
1308
1309 $invwin
1310}
1311
1312sub spell_setup {
1313 new CFClient::UI::SpellList
1314} 1308}
1315 1309
1316sub update_bindings { 1310sub update_bindings {
1317 $BIND_UPD_CB->() if $BIND_UPD_CB; 1311 $BIND_UPD_CB->() if $BIND_UPD_CB;
1318} 1312}
1423 $refresh->(); 1417 $refresh->();
1424 1418
1425 $vb 1419 $vb
1426} 1420}
1427 1421
1422# just weirdness, pls. ignore
1423sub load_html_page {
1424 my ($viewer, $base) = @_;
1425
1426 $viewer->clear;
1427
1428 require LWP::Simple;
1429 require HTML::Parser;
1430 require URI;
1431
1432 my $page = LWP::Simple::get ($base)
1433 or return;
1434
1435 my @s = { };
1436 my %passthrough = map ($_ => undef), qw(b i u s tt big small sub sup);
1437
1438 my $parser = HTML::Parser->new (
1439 text_h => [sub {
1440 my ($text) = @_;
1441 $text =~ s/\s+/ /g;
1442 $s[-1]{text} .= CFClient::UI::Label::escape $text;
1443 }, "dtext"],
1444 start_h => [sub {
1445 my ($tag, $attr) = @_;
1446 if ($passthrough{$tag}) {
1447 $s[-1]{text} .= "<$tag>";
1448 } elsif ($tag eq "h1") {
1449 push @s, { text => "<span foreground='#ffff00' size='x-large'>" };
1450 } elsif ($tag eq "h2") {
1451 push @s, { text => "<span foreground='#ccccff' size='large'>" };
1452 } elsif ($tag eq "h3") {
1453 push @s, { text => "<span size='large'>" };
1454 } elsif ($tag eq "a") {
1455 push @s, { text => "", url => $attr->{href} };
1456 } elsif ($tag eq "p") {
1457 push @s, { };
1458 } elsif ($tag eq "img") {
1459 eval {
1460 push @{$s[-1]{obj}}, new CFClient::UI::Image
1461 tex => (new_from_image CFClient::Texture LWP::Simple::get (URI->new ($attr->{src}, $base)->abs ($base)));
1462 $s[-1]{text} .= "\x{fffc}";
1463 };
1464 }
1465 }, "tagname, attr"],
1466 end_h => [sub {
1467 my ($tag) = @_;
1468 if ($passthrough{$tag}) {
1469 $s[-1]{text} .= "</$tag>";
1470 } elsif ($tag =~ /^h\d$/) {
1471 $s[-1]{text} .= "</span>";
1472 push @s, { };
1473 } elsif ($tag eq "a") {
1474 my $S = pop @s;
1475 $s[-1]{text} .= "\x{fffc}";
1476 push @{$s[-1]{obj}}, new CFClient::UI::Label
1477 fg => [0.8, 0.8, 1],
1478 markup => "<u>$S->{text}</u>",
1479 fontsize => 0.8,
1480 can_events => 1,
1481 can_focus => 1,
1482 on_button_up => sub {
1483 load_html_page ($viewer, URI->new ($S->{url}, $base)->abs ($base));
1484 },
1485 ;
1486 }
1487 }, "tagname"],
1488 );
1489
1490 $parser->parse ($page);
1491 $parser->eof;
1492
1493 $viewer->add_paragraph ([1, 1, 1, 1], [$_->{text}, @{ $_->{obj} || [] }], $_->{indent})
1494 for @s;
1495
1496 $viewer->set_offset (0);
1497}
1498
1428sub help_window { 1499sub help_window {
1429 my $win = new CFClient::UI::FancyFrame 1500 my $win = new CFClient::UI::FancyFrame
1430 x => 'center', 1501 x => 'center',
1431 y => 'center', 1502 y => 'center',
1432 z => 2, 1503 z => 2,
1433 name => 'doc_browser', 1504 name => 'doc_browser',
1434 force_w => int $WIDTH * 7/8, 1505 force_w => int $WIDTH * 7/8,
1435 force_h => int $HEIGHT * 7/8, 1506 force_h => int $HEIGHT * 7/8,
1436 title => "Documentation"; 1507 title => "Help Browser",
1508 has_close_button => 1;
1437 1509
1438 $win->add (my $vbox = new CFClient::UI::VBox); 1510 $win->add (my $vbox = new CFClient::UI::VBox);
1439 1511
1440 $vbox->add (my $buttons = new CFClient::UI::HBox); 1512 $vbox->add (my $buttons = new CFClient::UI::HBox);
1441 $vbox->add (my $viewer = new CFClient::UI::TextScroller 1513 $vbox->add (my $viewer = new CFClient::UI::TextScroller
1449 [manual => "Main Manual"], 1521 [manual => "Main Manual"],
1450 [skill_help => "Skill Reference"], 1522 [skill_help => "Skill Reference"],
1451 [command_help => "Command Reference"], 1523 [command_help => "Command Reference"],
1452 [dmcommand_help => "DM Commands"], 1524 [dmcommand_help => "DM Commands"],
1453 [COPYING => "License Terms"], 1525 [COPYING => "License Terms"],
1526 [test => "test (do not select)"], #d#TODO
1454 ], 1527 ],
1455 on_changed => sub { 1528 on_changed => sub {
1456 my ($self, $pod) = @_; 1529 my ($self, $pod) = @_;
1530
1531 if ($pod eq "test") {#d#TODO
1532 eval {
1533 load_html_page $viewer, "http://crossfire.real-time.com/guides/walkthrough/newbie-tower.html";
1534 };
1535 warn "$@" if $@;
1536 return;
1537 }
1457 1538
1458 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", 1539 my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod",
1459 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; 1540 doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] };
1460 1541
1461 $viewer->clear; 1542 $viewer->clear;
1605 . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor " 1686 . "There is a shortcut for making bindings: <b>Control-Insert</b> opens the binding editor "
1606 . "with nothing set and the recording started. After doing the actions you " 1687 . "with nothing set and the recording started. After doing the actions you "
1607 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. " 1688 . "want to record press <b>Insert</b> and you will be asked to press a key-combo. "
1608 . "After pressing the combo the binding will be saved automatically and the " 1689 . "After pressing the combo the binding will be saved automatically and the "
1609 . "binding editor closes"); 1690 . "binding editor closes");
1610 $SETUP_NOTEBOOK->add (Spells => $SETUP_SPELLS = spell_setup,
1611 "Displays all spells you have and lets you edit keyboard shortcuts for them.");
1612 $SETUP_NOTEBOOK->add (Debug => debug_setup, 1691 $SETUP_NOTEBOOK->add (Debug => debug_setup,
1613 "Some debuggin' options. Do not ask."); 1692 "Some debuggin' options. Do not ask.");
1614 1693
1615 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top 1694 $BUTTONBAR = new CFClient::UI::Buttonbar x => 0, y => 0, z => 200; # put on top
1616 1695
1620 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW = message_window, 1699 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Message Window", other => $MESSAGE_WINDOW = message_window,
1621 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server."); 1700 tooltip => "Toggles the server message log, where the client collects <i>all</i> messages from the server.");
1622 1701
1623 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 1702 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
1624 1703
1625 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Stats Window", other => $STATS_WINDOW = stats_window,
1626 tooltip => "Toggles the statistics window, where all your Stats and Resistances are being displayed at all times.");
1627 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Inventory", other => inventory_window, 1704 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Playerbook", other => player_window,
1628 tooltip => "Toggles the inventory window, where you can manage your loot (or treasures :). " 1705 tooltip => "Toggles the player view, where you can manage Inventory, Spells, Skills and see your Stats.");
1629 . "You can also hit the <b>Tab</b>-key to show/hide the Inventory.");
1630 1706
1631 $BUTTONBAR->add (new CFClient::UI::Button 1707 $BUTTONBAR->add (new CFClient::UI::Button
1632 text => "Save Config", 1708 text => "Save Config",
1633 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.", 1709 tooltip => "Saves the options chosen in the client setting, server settings and the window layout to be restored on later runs.",
1634 on_activate => sub { 1710 on_activate => sub {
1637 status "Configuration Saved"; 1713 status "Configuration Saved";
1638 0 1714 0
1639 }, 1715 },
1640 ); 1716 );
1641 1717
1642 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => help_window, 1718 $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => $HELP_WINDOW = help_window,
1643 tooltip => "View Documentation"); 1719 tooltip => "View Documentation");
1644 1720
1645 $BUTTONBAR->add (new CFClient::UI::Button 1721 $BUTTONBAR->add (new CFClient::UI::Button
1646 text => "Quit", 1722 text => "Quit",
1647 tooltip => "Terminates the program", 1723 tooltip => "Terminates the program",
1853# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d# 1929# printf "active %x %x\n", $SDL_EV->active_gain, $SDL_EV->active_state;#d#
1854 }, 1930 },
1855 CFClient::SDL_KEYDOWN => sub { 1931 CFClient::SDL_KEYDOWN => sub {
1856 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { 1932 if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) {
1857 # alt-enter 1933 # alt-enter
1934 $FULLSCREEN_ENABLE->toggle;
1858 video_shutdown; 1935 video_shutdown;
1859 $CFG->{fullscreen} = !$CFG->{fullscreen};
1860 video_init; 1936 video_init;
1861 } else { 1937 } else {
1862 CFClient::UI::feed_sdl_key_down_event ($_[0]); 1938 CFClient::UI::feed_sdl_key_down_event ($_[0]);
1863 } 1939 }
1864 }, 1940 },
1880$SIG{INT} = $SIG{TERM} = sub { exit }; 1956$SIG{INT} = $SIG{TERM} = sub { exit };
1881 1957
1882{ 1958{
1883 local $SIG{__DIE__} = sub { 1959 local $SIG{__DIE__} = sub {
1884 return unless defined $^S && !$^S; 1960 return unless defined $^S && !$^S;
1885 Carp::confess $_[1];#d#TODO: remove when stable 1961 Carp::confess $_[0];#d#TODO: remove when stable
1886 CFClient::fatal $_[0]; 1962 CFClient::fatal $_[0];
1887 }; 1963 };
1888 1964
1889 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc"; 1965 CFClient::read_cfg "$Crossfire::VARDIR/cfplusrc";
1890 CFClient::UI::set_layout ($::CFG->{layout}); 1966 CFClient::UI::set_layout ($::CFG->{layout});

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines