--- deliantra/Deliantra-Client/DC.pm 2006/05/23 23:14:44 1.60
+++ deliantra/Deliantra-Client/DC.pm 2006/05/25 21:18:09 1.65
@@ -21,6 +21,8 @@
XSLoader::load "CFClient", $VERSION;
}
+use utf8;
+
use Carp ();
use AnyEvent ();
use BerkeleyDB;
@@ -54,7 +56,8 @@
return unless $GL_DEBUG;
if (my $error = glGetError) {
- Carp::cluck sprintf "opengl error %x while %s", $error, &sprintf(@_);
+ my ($format, @args) = @_;
+ Carp::cluck sprintf "opengl error %x while $format", $error, @args;
}
}
@@ -216,6 +219,133 @@
$db->db_put ($key => $data)
}
+package CFClient::Item;
+
+sub desc_string {
+ my ($self) = @_;
+
+ my $desc =
+ $self->{nrof} < 2
+ ? $self->{name}
+ : "$self->{nrof} × $self->{name_pl}";
+
+ $self->{flags} & Crossfire::Protocol::F_OPEN
+ and $desc .= " (open)";
+ $self->{flags} & Crossfire::Protocol::F_APPLIED
+ and $desc .= " (applied)";
+ $self->{flags} & Crossfire::Protocol::F_UNPAID
+ and $desc .= " (unpaid)";
+ $self->{flags} & Crossfire::Protocol::F_MAGIC
+ and $desc .= " (magic)";
+ $self->{flags} & Crossfire::Protocol::F_CURSED
+ and $desc .= " (cursed)";
+ $self->{flags} & Crossfire::Protocol::F_DAMNED
+ and $desc .= " (damned)";
+ $self->{flags} & Crossfire::Protocol::F_LOCKED
+ and $desc .= " *";
+
+ $desc
+}
+
+sub weight_string {
+ my ($self) = @_;
+
+ my $weight = ($self->{nrof} || 1) * $self->{weight};
+
+ $weight < 0 ? "?" : $weight * 0.001
+}
+
+sub update_widgets {
+ my ($self) = @_;
+
+ my $button_cb = sub {
+ my (undef, $ev, $x, $y) = @_;
+
+ if (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 1) {
+ my $targ = $::CONN->{player}{tag};
+
+ if ($self->{container} == $::CONN->{player}{tag}) {
+ $targ = $::CONN->{open_container};
+ }
+
+ $::CONN->send ("move $targ $self->{tag} 0");
+ } elsif ($ev->{button} == 1) {
+ $::CONN->send ("examine $self->{tag}");
+ } elsif ($ev->{button} == 2) {
+ $::CONN->send ("apply $self->{tag}");
+ } elsif ($ev->{button} == 3) {
+ my @menu_items = (
+ ["examine", sub { $::CONN->send ("examine $self->{tag}") }],
+ ["mark", sub { $::CONN->send ("mark ". pack "N", $self->{tag}) }],
+ ["apply", sub { $::CONN->send ("apply $self->{tag}") }],
+ (
+ $self->{flags} & Crossfire::Protocol::F_LOCKED
+ ? (
+ ["unlock", sub { $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) }],
+ )
+ : (
+ ["lock", sub { $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) }],
+ ["drop", sub { $::CONN->send ("move $::CONN->{open_container} $self->{tag} 0") }],
+ )
+ ),
+ );
+
+ CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev);
+ }
+
+ 1
+ };
+
+ my $tooltip_std = ""
+ . "Left click - examine item\n"
+ . "Shift-Left click - " . ($self->{container} ? "move or drop" : "take") . " item\n"
+ . "Middle click - apply\n"
+ . "Right click - further options"
+ . "\n";
+
+ $self->{face_widget} ||= new CFClient::UI::Face
+ can_events => 1,
+ can_hover => 1,
+ connect_button_down => $button_cb,
+ ;
+ $self->{face_widget}{face} = $self->{face};
+ $self->{face_widget}{anim} = $self->{anim};
+ $self->{face_widget}{animspeed} = $self->{animspeed};
+ $self->{face_widget}->set_tooltip (
+ "Face/Animation.\n"
+ . "Item uses face #$self->{face}. "
+ . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ")
+ . "\n\n$tooltip_std"
+ );
+
+ $self->{desc_widget} ||= new CFClient::UI::Label
+ can_events => 1,
+ can_hover => 1,
+ ellipsise => 2,
+ xalign => 0,
+ connect_button_down => $button_cb,
+ ;
+ my $desc = CFClient::Item::desc_string $self;
+ $self->{desc_widget}->set_text ($desc);
+ $self->{desc_widget}->set_tooltip ("$desc.\n$tooltip_std");
+
+ $self->{weight_widget} ||= new CFClient::UI::Label
+ can_events => 1,
+ can_hover => 1,
+ ellipsise => 0,
+ xalign => 0.5,
+ connect_button_down => $button_cb,
+ ;
+ $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. ")
+ . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ")
+ . "\n\n$tooltip_std"
+ );
+}
+
package CFClient::Texture;
use strict;