--- deliantra/Deliantra-Client/bin/cfplus 2006/07/15 01:19:55 1.93 +++ deliantra/Deliantra-Client/bin/cfplus 2006/07/19 16:41:51 1.97 @@ -88,6 +88,7 @@ our $LOGIN_BUTTON; our $QUIT_DIALOG; our $HOST_ENTRY; +our $FULLSCREEN_ENABLE; our $PICKUP_ENABLE; our $SERVER_INFO; @@ -101,6 +102,7 @@ our $INVENTORY_PAGE; our $STATS_PAGE; +our $SKILL_PAGE; our $SPELL_PAGE; our $HELP_WINDOW; @@ -418,7 +420,7 @@ my $row = 1; $table->add (0, $row, new CFClient::UI::Label valign => 0, align => 1, text => "Fullscreen"); - $table->add (1, $row++, new CFClient::UI::CheckBox + $table->add (1, $row++, $FULLSCREEN_ENABLE = new CFClient::UI::CheckBox state => $CFG->{fullscreen}, tooltip => "Bring the client into fullscreen mode.", on_changed => sub { my ($self, $value) = @_; $CFG->{fullscreen} = $value; 0 } @@ -644,7 +646,12 @@ } sub stats_window { - my $vb = new CFClient::UI::VBox; + my $r = + new CFClient::UI::ScrolledWindow ( + expand => 1, + scroll_y => 1 + ); + $r->add (my $vb = new CFClient::UI::VBox); $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, can_hover => 1, can_events => 1, @@ -771,125 +778,21 @@ } } - update_stats_window ({}); + #update_stats_window ({}); - $vb + $r } sub skill_window { - my ($self) = @_; - $STATWIDS->{"_skill_tbl"} = new CFClient::UI::Table expand => 1; + my $sw = new CFClient::UI::ScrolledWindow (expand => 1); + $sw->add ($STATWIDS->{skill_tbl} = new CFClient::UI::Table expand => 1, col_expand => [0, 0, 1, 0, 0, 1]); + $sw } sub formsep($) { scalar reverse join ",", unpack "(A3)*", reverse $_[0] * 1 } -sub update_stats_window { - my ($stats) = @_; - - # I love text protocols... - - my $hp = $stats->{+CS_STAT_HP} * 1; - my $hp_m = $stats->{+CS_STAT_MAXHP} * 1; - my $sp = $stats->{+CS_STAT_SP} * 1; - my $sp_m = $stats->{+CS_STAT_MAXSP} * 1; - my $fo = $stats->{+CS_STAT_FOOD} * 1; - my $fo_m = 999; - my $gr = $stats->{+CS_STAT_GRACE} * 1; - my $gr_m = $stats->{+CS_STAT_MAXGRACE} * 1; - - $GAUGES->{hp} ->set_value ($hp, $hp_m); - $GAUGES->{mana} ->set_value ($sp, $sp_m); - $GAUGES->{food} ->set_value ($fo, $fo_m); - $GAUGES->{grace} ->set_value ($gr, $gr_m); - $GAUGES->{exp} ->set_text ("Exp: " . (formsep $stats->{+CS_STAT_EXP64}) - . " (lvl " . ($stats->{+CS_STAT_LEVEL} * 1) . ")"); - my $rng = $stats->{+CS_STAT_RANGE}; - $rng =~ s/^Range: //; # thank you so much dear server - $GAUGES->{range} ->set_text ("Rng: " . $rng); - my $title = $stats->{+CS_STAT_TITLE}; - $title =~ s/^Player: //; - $STATWIDS->{title} ->set_text ("Title: " . $title); - - $STATWIDS->{st_str} ->set_text (sprintf "%d" , $stats->{+CS_STAT_STR}); - $STATWIDS->{st_dex} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DEX}); - $STATWIDS->{st_con} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CON}); - $STATWIDS->{st_int} ->set_text (sprintf "%d" , $stats->{+CS_STAT_INT}); - $STATWIDS->{st_wis} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WIS}); - $STATWIDS->{st_pow} ->set_text (sprintf "%d" , $stats->{+CS_STAT_POW}); - $STATWIDS->{st_cha} ->set_text (sprintf "%d" , $stats->{+CS_STAT_CHA}); - $STATWIDS->{st_wc} ->set_text (sprintf "%d" , $stats->{+CS_STAT_WC}); - $STATWIDS->{st_ac} ->set_text (sprintf "%d" , $stats->{+CS_STAT_AC}); - $STATWIDS->{st_dam} ->set_text (sprintf "%d" , $stats->{+CS_STAT_DAM}); - $STATWIDS->{st_arm} ->set_text (sprintf "%d" , $stats->{+CS_STAT_RES_PHYS}); - $STATWIDS->{st_spd} ->set_text (sprintf "%.1f", $stats->{+CS_STAT_SPEED}); - $STATWIDS->{st_wspd}->set_text (sprintf "%.1f", $stats->{+CS_STAT_WEAP_SP}); - - $STATWIDS->{m_weight}->set_text (sprintf "Max weight: %.1fkg", $stats->{+CS_STAT_WEIGHT_LIM} / 1000); - - my %tbl = ( - phys => CS_STAT_RES_PHYS, - magic => CS_STAT_RES_MAG, - fire => CS_STAT_RES_FIRE, - elec => CS_STAT_RES_ELEC, - cold => CS_STAT_RES_COLD, - conf => CS_STAT_RES_CONF, - acid => CS_STAT_RES_ACID, - drain => CS_STAT_RES_DRAIN, - ghit => CS_STAT_RES_GHOSTHIT, - pois => CS_STAT_RES_POISON, - slow => CS_STAT_RES_SLOW, - para => CS_STAT_RES_PARA, - tund => CS_STAT_TURN_UNDEAD, - fear => CS_STAT_RES_FEAR, - depl => CS_STAT_RES_DEPLETE, - deat => CS_STAT_RES_DEATH, - holyw => CS_STAT_RES_HOLYWORD, - blind => CS_STAT_RES_BLIND, - ); - - if ($::CONN && !$STATWIDS->{_skill_tbl_init}) { - my $sktbl = $STATWIDS->{_skill_tbl}; - $sktbl->clear; - - $sktbl->add (0, 0, new CFClient::UI::Label text => "Exp.", align => 1); - $sktbl->add (1, 0, new CFClient::UI::Label text => "Level", align => 1); - $sktbl->add (2, 0, new CFClient::UI::Label text => "Skillname"); - - my @skills; - - for (my $i = CS_STAT_SKILLINFO; $i < CS_STAT_SKILLINFO+CS_NUM_SKILLS; $i++) { - push @skills, [$i, $::CONN->{skill_info}{$i}]; - } - - my $y = 1; - for (sort { $a->[1] cmp $b->[1] } @skills) { - my ($idx, $name) = @$_; - - unless (defined $STATWIDS->{"sk_xp_$idx"} || !$::CONN->{skill_info}{$idx}) { - $sktbl->add (0, $y, $STATWIDS->{"sk_xp_$idx"} = new CFClient::UI::Label text => "0", align => 1); - $sktbl->add (1, $y, $STATWIDS->{"sk_lvl_$idx"} = new CFClient::UI::Label text => "0", align => 1); - $sktbl->add (2, $y++, new CFClient::UI::Label text => $name); - } - } - - $STATWIDS->{_skill_tbl_init} = 1; - } - - for (my $i = CS_STAT_SKILLINFO; $i < CS_STAT_SKILLINFO+CS_NUM_SKILLS; $i++) { - if (exists $stats->{$i}) { - $STATWIDS->{"sk_xp_$i"}->set_text (formsep $stats->{$i}->[1]) - if $STATWIDS->{"sk_xp_$i"}; - $STATWIDS->{"sk_lvl_$i"}->set_text (sprintf "%d", $stats->{$i}->[0]) - if $STATWIDS->{"sk_lvl_$i"}; - } - } - - $STATWIDS->{"res_$_"}->set_text (sprintf "%d%", $stats->{$tbl{$_}}) - for keys %tbl; -} - my $METASERVER_ATIME; sub update_metaserver { @@ -1335,13 +1238,15 @@ $hb->add (my $vb1 = new CFClient::UI::VBox); $vb1->add (new CFClient::UI::Label align => 0, text => "Player"); - $vb1->add ($INV = new CFClient::UI::Inventory); + $vb1->add (my $sw1 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); + $sw1->add ($INV = new CFClient::UI::Inventory); $hb->add (my $vb2 = new CFClient::UI::VBox); $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox); - $vb2->add ($INVR = new CFClient::UI::Inventory); + $vb2->add (my $sw2 = new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1); + $sw2->add ($INVR = new CFClient::UI::Inventory); # XXX: Call after $INVR = ... because set_opencont sets the items CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); @@ -1373,26 +1278,25 @@ my $ntb = $PL_NOTEBOOK = - new CFClient::UI::Notebook - expand => 1, - debug => 1, - filter => (new CFClient::UI::ScrolledWindow expand => 1, scroll_y => 1), - ; + new CFClient::UI::Notebook expand => 1, debug => 1; $ntb->add ( - "Stats" => $STATS_PAGE = stats_window, + "Statistics (F2)" => $STATS_PAGE = stats_window, "Shows statistics, where all your Stats and Resistances are shown." ); $ntb->add ( - "Skills" => $STATS_PAGE = skill_window, + "Skills (F3)" => $SKILL_PAGE = skill_window, "Shows all your Skills." ); + + my $spellsw = new CFClient::UI::ScrolledWindow (expand => 1, scroll_y => 1); + $spellsw->add ($SPELL_PAGE = new CFClient::UI::SpellList); $ntb->add ( - Spellbook => $SPELL_PAGE = new CFClient::UI::SpellList, + "Spellbook (F4)" => $spellsw, "Displays all spells you have and lets you edit keyboard shortcuts for them." ); $ntb->add ( - Inventory => $INVENTORY_PAGE = inventory_widget, + "Inventory (F5)" => $INVENTORY_PAGE = inventory_widget, "Toggles the inventory window, where you can manage your loot (or treasures :). " . "You can also hit the Tab-key to show/hide the Inventory." ); @@ -1515,6 +1419,83 @@ $vb } +# just weirdness, pls. ignore +sub load_html_page { + my ($viewer, $base) = @_; + + $viewer->clear; + + require LWP::Simple; + require HTML::Parser; + require URI; + + my $page = LWP::Simple::get ($base) + or return; + + my @s = { }; + my %passthrough = map ($_ => undef), qw(b i u s tt big small sub sup); + + my $parser = HTML::Parser->new ( + text_h => [sub { + my ($text) = @_; + $text =~ s/\s+/ /g; + $s[-1]{text} .= CFClient::UI::Label::escape $text; + }, "dtext"], + start_h => [sub { + my ($tag, $attr) = @_; + if ($passthrough{$tag}) { + $s[-1]{text} .= "<$tag>"; + } elsif ($tag eq "h1") { + push @s, { text => "" }; + } elsif ($tag eq "h2") { + push @s, { text => "" }; + } elsif ($tag eq "h3") { + push @s, { text => "" }; + } elsif ($tag eq "a") { + push @s, { text => "", url => $attr->{href} }; + } elsif ($tag eq "p") { + push @s, { }; + } elsif ($tag eq "img") { + eval { + push @{$s[-1]{obj}}, new CFClient::UI::Image + tex => (new_from_image CFClient::Texture LWP::Simple::get (URI->new ($attr->{src}, $base)->abs ($base))); + $s[-1]{text} .= "\x{fffc}"; + }; + } + }, "tagname, attr"], + end_h => [sub { + my ($tag) = @_; + if ($passthrough{$tag}) { + $s[-1]{text} .= ""; + } elsif ($tag =~ /^h\d$/) { + $s[-1]{text} .= ""; + push @s, { }; + } elsif ($tag eq "a") { + my $S = pop @s; + $s[-1]{text} .= "\x{fffc}"; + push @{$s[-1]{obj}}, new CFClient::UI::Label + fg => [0.8, 0.8, 1], + markup => "$S->{text}", + fontsize => 0.8, + can_events => 1, + can_focus => 1, + on_button_up => sub { + load_html_page ($viewer, URI->new ($S->{url}, $base)->abs ($base)); + }, + ; + } + }, "tagname"], + ); + + $parser->parse ($page); + $parser->eof; + + $viewer->add_paragraph ([1, 1, 1, 1], [$_->{text}, @{ $_->{obj} || [] }], $_->{indent}) + for @s; + + $viewer->set_offset (0); +} + sub help_window { my $win = new CFClient::UI::FancyFrame x => 'center', @@ -1542,10 +1523,19 @@ [command_help => "Command Reference"], [dmcommand_help => "DM Commands"], [COPYING => "License Terms"], + [test => "test (do not select)"], #d#TODO ], on_changed => sub { my ($self, $pod) = @_; + if ($pod eq "test") {#d#TODO + eval { + load_html_page $viewer, "http://crossfire.real-time.com/guides/walkthrough/newbie-tower.html"; + }; + warn "$@" if $@; + return; + } + my $pom = CFClient::load_pod CFClient::find_rcfile "pod/$pod.pod", doc_viewer => 1, sub { CFClient::pod_to_pango_list $_[0] }; @@ -1941,8 +1931,8 @@ CFClient::SDL_KEYDOWN => sub { if ($_[0]{mod} & CFClient::KMOD_ALT && $_[0]{sym} == 13) { # alt-enter + $FULLSCREEN_ENABLE->toggle; video_shutdown; - $CFG->{fullscreen} = !$CFG->{fullscreen}; video_init; } else { CFClient::UI::feed_sdl_key_down_event ($_[0]); @@ -1968,7 +1958,7 @@ { local $SIG{__DIE__} = sub { return unless defined $^S && !$^S; - Carp::confess $_[1];#d#TODO: remove when stable + Carp::confess $_[0];#d#TODO: remove when stable CFClient::fatal $_[0]; };