--- deliantra/Deliantra-Client/DC.pm 2006/07/22 13:20:33 1.102 +++ deliantra/Deliantra-Client/DC.pm 2006/07/24 08:23:27 1.107 @@ -28,6 +28,7 @@ use BerkeleyDB; use Pod::POM (); use Scalar::Util (); +use YAML (); use Storable (); # finally our %STAT_TOOLTIP = ( @@ -47,63 +48,28 @@ WSp => "Weapon Speed, how many attacks you may make per unit of time (0.120s). Higher values indicate faster attack speed. Current weapon and Dex effect the value of weapon speed.", ); -package CFClient::PodToPango; +=item guard { BLOCK } -use base Pod::POM::View::Text; +Returns an object that executes the given block as soon as it is destroyed. -our $VERSION = 1; # bump if resultant formatting changes +=cut -our $indent = 0; - -*view_seq_code = -*view_seq_bold = sub { "$_[1]" }; -*view_seq_italic = sub { "$_[1]" }; -*view_seq_space = -*view_seq_link = -*view_seq_index = sub { CFClient::UI::Label::escape ($_[1]) }; - -sub view_seq_text { - my $text = $_[1]; - $text =~ s/\s+/ /g; - CFClient::UI::Label::escape ($text) -} - -sub view_item { - ("\t" x ($indent / 4)) - . $_[1]->title->present ($_[0]) - . "\n\n" - . $_[1]->content->present ($_[0]) +sub guard(&) { + bless \(my $cb = $_[0]), "CFClient::Guard" } -sub view_verbatim { - (join "", - map +("\t" x ($indent / 2)) . "$_\n", - split /\n/, CFClient::UI::Label::escape ($_[1])) - . "\n" +sub CFClient::Guard::DESTROY { + ${$_[0]}->() } -sub view_textblock { - ("\t" x ($indent / 2)) . "$_[1]\n\n" -} +sub asxml($) { + local $_ = $_[0]; -sub view_head1 { - "\n\n" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; + s/&/&/g; + s/>/>/g; + s/" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; - -sub view_head3 { - "\n" . $_[1]->title->present ($_[0]) . "\n\n" - . $_[1]->content->present ($_[0]) -}; - -sub view_over { - local $indent = $indent + $_[1]->indent; - $_[1]->content->present ($_[0]) + $_ } package CFClient::Database; @@ -141,36 +107,38 @@ die "FATAL: can't find required file $_[0]\n"; } +sub parse_yaml { + my $text = shift; + + utf8::decode $text; + + YAML::Load $text +} + sub read_cfg { my ($file) = @_; - open CFG, $file + open my $fh, $file or return; - my $CFG; - local $/; - $CFG = eval ; - - $::CFG = $CFG; + my $CFG = <$fh>; - close CFG; + if ($CFG =~ /^---/) { + $::CFG = parse_yaml $CFG; + } else { + $::CFG = eval $CFG; + } } sub write_cfg { my ($file) = @_; - open CFG, ">$file" - or return; + $::CFG->{VERSION} = $::VERSION; - { - require Data::Dumper; - local $Data::Dumper::Purity = 1; - $::CFG->{VERSION} = $::VERSION; - print CFG Data::Dumper->Dump ([$::CFG], [qw/CFG/]); - } - - close CFG; + open my $fh, ">:utf8", $file + or return; + print $fh YAML::Dump $::CFG; } our $DB_ENV; @@ -209,51 +177,6 @@ or die "unable to create/open database table $_[0]: $BerkeleyDB::Error" } -my $pod_cache = db_table "pod_cache"; - -sub load_pod($$$$) { - my ($path, $filtertype, $filterversion, $filtercb) = @_; - - stat $path - or die "$path: $!"; - - my $phash = join ",", $filterversion, $CFClient::PodToPango::VERSION, (stat _)[7,9]; - - my ($chash, $pom) = eval { @{ Storable::thaw $pod_cache->get ("$path/$filtertype") } }; - - return $pom if $chash eq $phash; - - my $pod = do { - local $/; - open my $pod, "<:utf8", $_[0] - or die "$_[0]: $!"; - <$pod> - }; - - #utf8::downgrade $pod; - - $pom = $filtercb-> (Pod::POM->new->parse_text ($pod)); - - $pod_cache->put ("$path/$filtertype" => Storable::nfreeze [$phash, $pom]); - - $pom -} - -sub pod_to_pango($) { - my ($pom) = @_; - - $pom->present ("CFClient::PodToPango") -} - -sub pod_to_pango_list($) { - my ($pom) = @_; - - [ - map s/^(\s*)// && [40 * length $1, length $_ ? $_ : " "], - split /\n/, $pom->present ("CFClient::PodToPango") - ] -} - package CFClient::Layout; $CFClient::OpenGL::SHUTDOWN_HOOK{"CFClient::Layout"} = sub { @@ -378,7 +301,7 @@ : ( ["lock", sub { $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) }], ["$move_prefix all", sub { $::CONN->send ("move $targ $self->{tag} 0") }], - ["$move_prefix n", + ["$move_prefix <n>", sub { do_n_dialog (sub { $::CONN->send ("move $targ $self->{tag} $_[0]") }) } @@ -401,6 +324,10 @@ . "Right click - further options" . "\n"; + my $bg = $self->{flags} & F_CURSED ? [1 , 0 , 0, 0.5] + : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5] + : undef; + $self->{face_widget} ||= new CFClient::UI::Face can_events => 1, can_hover => 1, @@ -408,6 +335,7 @@ animspeed => $self->{animspeed}, # TODO# must be set at creation time on_button_down => $button_cb, ; + $self->{face_widget}{bg} = $bg; $self->{face_widget}{face} = $self->{face}; $self->{face_widget}{anim} = $self->{anim}; $self->{face_widget}{animspeed} = $self->{animspeed}; @@ -426,6 +354,7 @@ on_button_down => $button_cb, ; my $desc = CFClient::Item::desc_string $self; + $self->{desc_widget}{bg} = $bg; $self->{desc_widget}->set_text ($desc); $self->{desc_widget}->set_tooltip ("$desc.\n$tooltip_std"); @@ -436,8 +365,8 @@ align => 0, on_button_down => $button_cb, ; + $self->{weight_widget}{bg} = $bg; $self->{weight_widget}->set_text (CFClient::Item::weight_string $self); - $self->{weight_widget}->set_tooltip ( "Weight.\n" . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ")