--- deliantra/Deliantra-Client/DC.pm 2006/05/21 00:02:00 1.57
+++ deliantra/Deliantra-Client/DC.pm 2006/05/25 21:48:22 1.68
@@ -21,6 +21,8 @@
XSLoader::load "CFClient", $VERSION;
}
+use utf8;
+
use Carp ();
use AnyEvent ();
use BerkeleyDB;
@@ -38,6 +40,7 @@
%GL_EXT = map +($_ => 1), split /\s+/, gl_extensions;
$GL_NPOT = $GL_EXT{GL_ARB_texture_non_power_of_two} || $GL_VERSION >= 2;
+ $GL_NPOT = 0 if gl_vendor =~ /ATI Technologies/; # ATI doesn't get it right...
glDisable GL_COLOR_MATERIAL;
glShadeModel GL_FLAT;
@@ -53,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;
}
}
@@ -108,7 +112,7 @@
-ErrFile => "$Crossfire::VARDIR/pclient/errorlog.txt",
# -ErrPrefix => "DATABASE",
-Verbose => 1,
- -Flags => DB_CREATE | DB_RECOVER_FATAL | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_TXN,
+ -Flags => DB_CREATE | DB_RECOVER | DB_INIT_MPOOL | DB_INIT_LOCK | DB_INIT_TXN,
or die "unable to create/open database home $Crossfire::VARDIR/pclient: $BerkeleyDB::Error";
sub db_table($) {
@@ -132,6 +136,15 @@
$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::PodToPango;
use base Pod::POM::View::Text;
@@ -169,8 +182,13 @@
("\t" x ($indent / 2)) . "$_[1]\n\n"
}
+sub view_head1 {
+ "" . $_[1]->title->present ($_[0]) . "\n\n"
+ . $_[1]->content->present ($_[0])
+};
+
sub view_head2 {
- "" . $_[1]->title->present ($_[0]) . "\n\n"
+ "" . $_[1]->title->present ($_[0]) . "\n\n"
. $_[1]->content->present ($_[0])
};
@@ -201,6 +219,135 @@
$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,
+ anim => $self->{anim},
+ animspeed => $self->{animspeed}, # TODO# must be set at creation time
+ 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,
+ align => -1,
+ 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,
+ align => 0,
+ 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;