--- deliantra/Deliantra-Client/DC.pm 2006/07/24 08:23:27 1.107 +++ deliantra/Deliantra-Client/DC.pm 2006/07/30 18:23:50 1.111 @@ -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'; + $VERSION = '0.2'; use XSLoader; - XSLoader::load "CFClient", $VERSION; + XSLoader::load "CFPlus", $VERSION; } use utf8; @@ -28,7 +28,6 @@ use BerkeleyDB; use Pod::POM (); use Scalar::Util (); -use YAML (); use Storable (); # finally our %STAT_TOOLTIP = ( @@ -55,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]}->() } @@ -72,7 +71,7 @@ $_ } -package CFClient::Database; +package CFPlus::Database; our @ISA = BerkeleyDB::Btree::; @@ -94,25 +93,23 @@ $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"; } -sub parse_yaml { - my $text = shift; - - utf8::decode $text; - - YAML::Load $text +BEGIN { + use Crossfire::Protocol::Base (); + *to_json = \&Crossfire::Protocol::Base::to_json; + *from_json = \&Crossfire::Protocol::Base::from_json; } sub read_cfg { @@ -124,10 +121,14 @@ local $/; my $CFG = <$fh>; - if ($CFG =~ /^---/) { - $::CFG = parse_yaml $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; + $::CFG = eval $CFG; ## todo comaptibility cruft } } @@ -138,7 +139,7 @@ open my $fh, ">:utf8", $file or return; - print $fh YAML::Dump $::CFG; + print $fh to_json $::CFG; } our $DB_ENV; @@ -167,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", @@ -177,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; @@ -227,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) = @_; @@ -266,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}) @@ -292,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 @@ -310,7 +320,7 @@ ), ); - CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev); + CFPlus::UI::Menu->new (items => \@menu_items)->popup ($ev); } 1 @@ -328,7 +338,7 @@ : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5] : undef; - $self->{face_widget} ||= new CFClient::UI::Face + $self->{face_widget} ||= new CFPlus::UI::Face can_events => 1, can_hover => 1, anim => $self->{anim}, @@ -346,19 +356,19 @@ . "\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, @@ -366,7 +376,7 @@ on_button_down => $button_cb, ; $self->{weight_widget}{bg} = $bg; - $self->{weight_widget}->set_text (CFClient::Item::weight_string $self); + $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. ")