--- deliantra/Deliantra-Client/DC.pm 2006/07/23 16:11:12 1.105 +++ deliantra/Deliantra-Client/DC.pm 2006/07/30 17:43:26 1.110 @@ -1,10 +1,10 @@ =head1 NAME -CFClient - undocumented utility garbage for our crossfire client +CFPlus - undocumented utility garbage for our crossfire client =head1 SYNOPSIS - use CFClient; + use CFPlus; =head1 DESCRIPTION @@ -12,13 +12,13 @@ =cut -package CFClient; +package CFPlus; BEGIN { $VERSION = '0.1'; use XSLoader; - XSLoader::load "CFClient", $VERSION; + XSLoader::load "CFPlus", $VERSION; } use utf8; @@ -54,10 +54,10 @@ =cut sub guard(&) { - bless \(my $cb = $_[0]), "CFClient::Guard" + bless \(my $cb = $_[0]), "CFPlus::Guard" } -sub CFClient::Guard::DESTROY { +sub CFPlus::Guard::DESTROY { ${$_[0]}->() } @@ -71,7 +71,7 @@ $_ } -package CFClient::Database; +package CFPlus::Database; our @ISA = BerkeleyDB::Btree::; @@ -93,49 +93,53 @@ $db->db_put ($key => $data) } -package CFClient; +package CFPlus; sub find_rcfile($) { my $path; for (grep !ref, @INC) { - $path = "$_/CFClient/resources/$_[0]"; + $path = "$_/CFPlus/resources/$_[0]"; return $path if -r $path; } die "FATAL: can't find required file $_[0]\n"; } +BEGIN { + use Crossfire::Protocol::Base (); + *to_json = \&Crossfire::Protocol::Base::to_json; + *from_json = \&Crossfire::Protocol::Base::from_json; +} + sub read_cfg { my ($file) = @_; - open CFG, $file + open my $fh, $file or return; - my $CFG; - local $/; - $CFG = eval ; + my $CFG = <$fh>; - $::CFG = $CFG; - - close CFG; + if ($CFG =~ /^---/) { ## TODO compatibility cruft, remove + require YAML; + utf8::decode $CFG; + $::CFG = YAML::Load ($CFG); + } elsif ($CFG =~ /^\{/) { + $::CFG = from_json $CFG; + } else { + $::CFG = eval $CFG; ## todo comaptibility cruft + } } 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 to_json $::CFG; } our $DB_ENV; @@ -164,7 +168,7 @@ $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge; - new CFClient::Database + new CFPlus::Database -Env => $DB_ENV, -Filename => $table, # -Filename => "database", @@ -174,13 +178,13 @@ or die "unable to create/open database table $_[0]: $BerkeleyDB::Error" } -package CFClient::Layout; +package CFPlus::Layout; -$CFClient::OpenGL::SHUTDOWN_HOOK{"CFClient::Layout"} = sub { +$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub { reset_glyph_cache; }; -package CFClient::Item; +package CFPlus::Item; use strict; use Crossfire::Protocol::Constants; @@ -224,14 +228,14 @@ sub do_n_dialog { my ($cb) = @_; - my $w = new CFClient::UI::FancyFrame + my $w = new CFPlus::UI::FancyFrame on_delete => sub { $_[0]->destroy; 1 }, has_close_button => 1, ; - $w->add (my $vb = new CFClient::UI::VBox x => "center", y => "center"); - $vb->add (new CFClient::UI::Label text => "Enter item count:"); - $vb->add (my $entry = new CFClient::UI::Entry + $w->add (my $vb = new CFPlus::UI::VBox x => "center", y => "center"); + $vb->add (new CFPlus::UI::Label text => "Enter item count:"); + $vb->add (my $entry = new CFPlus::UI::Entry text => $last_enter_count, on_activate => sub { my ($entry) = @_; @@ -263,10 +267,10 @@ $targ = $::CONN->{open_container}; } - if (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 1) { + if (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 1) { $::CONN->send ("move $targ $self->{tag} 0") if $targ || !($self->{flags} & F_LOCKED); - } elsif (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 2) { + } elsif (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 2) { $self->{flags} & F_LOCKED ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) : $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) @@ -289,6 +293,15 @@ $::CONN->send ("command apply flint and steel"); } ], + ["inscribe", # first try of an easier use of flint&steel + sub { + &::open_string_query ("Text to inscribe", sub { + my ($entry, $txt) = @_; + $::CONN->send ("mark ". pack "N", $self->{tag}); + $::CONN->send ("command use_skill inscription $txt"); + }); + } + ], ["apply", sub { $::CONN->send ("apply $self->{tag}") }], ( $self->{flags} & F_LOCKED @@ -307,7 +320,7 @@ ), ); - CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev); + CFPlus::UI::Menu->new (items => \@menu_items)->popup ($ev); } 1 @@ -321,13 +334,18 @@ . "Right click - further options" . "\n"; - $self->{face_widget} ||= new CFClient::UI::Face + 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 CFPlus::UI::Face can_events => 1, can_hover => 1, anim => $self->{anim}, 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}; @@ -338,26 +356,27 @@ . "\n\n$tooltip_std" ); - $self->{desc_widget} ||= new CFClient::UI::Label + $self->{desc_widget} ||= new CFPlus::UI::Label can_events => 1, can_hover => 1, ellipsise => 2, align => -1, on_button_down => $button_cb, ; - my $desc = CFClient::Item::desc_string $self; + my $desc = CFPlus::Item::desc_string $self; + $self->{desc_widget}{bg} = $bg; $self->{desc_widget}->set_text ($desc); $self->{desc_widget}->set_tooltip ("$desc.\n$tooltip_std"); - $self->{weight_widget} ||= new CFClient::UI::Label + $self->{weight_widget} ||= new CFPlus::UI::Label can_events => 1, can_hover => 1, ellipsise => 0, align => 0, on_button_down => $button_cb, ; - $self->{weight_widget}->set_text (CFClient::Item::weight_string $self); - + $self->{weight_widget}{bg} = $bg; + $self->{weight_widget}->set_text (CFPlus::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. ")