ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC.pm
(Generate patch)

Comparing deliantra/Deliantra-Client/DC.pm (file contents):
Revision 1.107 by root, Mon Jul 24 08:23:27 2006 UTC vs.
Revision 1.108 by root, Sun Jul 30 13:16:44 2006 UTC

1=head1 NAME 1=head1 NAME
2 2
3CFClient - undocumented utility garbage for our crossfire client 3CFPlus - undocumented utility garbage for our crossfire client
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use CFClient; 7 use CFPlus;
8 8
9=head1 DESCRIPTION 9=head1 DESCRIPTION
10 10
11=over 4 11=over 4
12 12
13=cut 13=cut
14 14
15package CFClient; 15package CFPlus;
16 16
17BEGIN { 17BEGIN {
18 $VERSION = '0.1'; 18 $VERSION = '0.1';
19 19
20 use XSLoader; 20 use XSLoader;
21 XSLoader::load "CFClient", $VERSION; 21 XSLoader::load "CFPlus", $VERSION;
22} 22}
23 23
24use utf8; 24use utf8;
25 25
26use Carp (); 26use Carp ();
27use AnyEvent (); 27use AnyEvent ();
28use BerkeleyDB; 28use BerkeleyDB;
29use Pod::POM (); 29use Pod::POM ();
30use Scalar::Util (); 30use Scalar::Util ();
31use YAML (); 31use JSON::Syck ();
32use Storable (); # finally 32use Storable (); # finally
33 33
34our %STAT_TOOLTIP = ( 34our %STAT_TOOLTIP = (
35 Str => "<b>Physical Strength</b>, determines damage dealt with weapons, how much you can carry, and how often you can attack", 35 Str => "<b>Physical Strength</b>, determines damage dealt with weapons, how much you can carry, and how often you can attack",
36 Dex => "<b>Dexterity</b>, your physical agility. Determines chance of being hit and affects armor class and speed", 36 Dex => "<b>Dexterity</b>, your physical agility. Determines chance of being hit and affects armor class and speed",
53Returns an object that executes the given block as soon as it is destroyed. 53Returns an object that executes the given block as soon as it is destroyed.
54 54
55=cut 55=cut
56 56
57sub guard(&) { 57sub guard(&) {
58 bless \(my $cb = $_[0]), "CFClient::Guard" 58 bless \(my $cb = $_[0]), "CFPlus::Guard"
59} 59}
60 60
61sub CFClient::Guard::DESTROY { 61sub CFPlus::Guard::DESTROY {
62 ${$_[0]}->() 62 ${$_[0]}->()
63} 63}
64 64
65sub asxml($) { 65sub asxml($) {
66 local $_ = $_[0]; 66 local $_ = $_[0];
70 s/</&lt;/g; 70 s/</&lt;/g;
71 71
72 $_ 72 $_
73} 73}
74 74
75package CFClient::Database; 75package CFPlus::Database;
76 76
77our @ISA = BerkeleyDB::Btree::; 77our @ISA = BerkeleyDB::Btree::;
78 78
79sub get($$) { 79sub get($$) {
80 my $data; 80 my $data;
92 $DB_SYNC{$db} = AnyEvent->timer (after => 5, cb => sub { $db->db_sync }); 92 $DB_SYNC{$db} = AnyEvent->timer (after => 5, cb => sub { $db->db_sync });
93 93
94 $db->db_put ($key => $data) 94 $db->db_put ($key => $data)
95} 95}
96 96
97package CFClient; 97package CFPlus;
98 98
99sub find_rcfile($) { 99sub find_rcfile($) {
100 my $path; 100 my $path;
101 101
102 for (grep !ref, @INC) { 102 for (grep !ref, @INC) {
103 $path = "$_/CFClient/resources/$_[0]"; 103 $path = "$_/CFPlus/resources/$_[0]";
104 return $path if -r $path; 104 return $path if -r $path;
105 } 105 }
106 106
107 die "FATAL: can't find required file $_[0]\n"; 107 die "FATAL: can't find required file $_[0]\n";
108} 108}
109 109
110sub parse_yaml { 110$JSON::Syck::ImplicitUnicode = 1;
111 my $text = shift;
112 111
113 utf8::decode $text; 112sub from_json {
113 JSON::Syck::Load $_[0]
114}
114 115
115 YAML::Load $text 116sub to_json {
117 JSON::Syck::Dump $_[0]
116} 118}
117 119
118sub read_cfg { 120sub read_cfg {
119 my ($file) = @_; 121 my ($file) = @_;
120 122
122 or return; 124 or return;
123 125
124 local $/; 126 local $/;
125 my $CFG = <$fh>; 127 my $CFG = <$fh>;
126 128
129 if ($CFG =~ /^---/) { ## TODO compatibility cruft, remove
130 require YAML;
131 utf8::decode $CFG;
132 $::CFG = YAML::Load ($CFG);
127 if ($CFG =~ /^---/) { 133 } elsif ($CFG =~ /^\{/) {
128 $::CFG = parse_yaml $CFG; 134 $::CFG = from_json $CFG;
129 } else { 135 } else {
130 $::CFG = eval $CFG; 136 $::CFG = eval $CFG; ## todo comaptibility cruft
131 } 137 }
132} 138}
133 139
134sub write_cfg { 140sub write_cfg {
135 my ($file) = @_; 141 my ($file) = @_;
136 142
137 $::CFG->{VERSION} = $::VERSION; 143 $::CFG->{VERSION} = $::VERSION;
138 144
139 open my $fh, ">:utf8", $file 145 open my $fh, ">:utf8", $file
140 or return; 146 or return;
141 print $fh YAML::Dump $::CFG; 147 print $fh to_json $::CFG;
142} 148}
143 149
144our $DB_ENV; 150our $DB_ENV;
145 151
146{ 152{
165sub db_table($) { 171sub db_table($) {
166 my ($table) = @_; 172 my ($table) = @_;
167 173
168 $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge; 174 $table =~ s/([^a-zA-Z0-9_\-])/sprintf "=%x=", ord $1/ge;
169 175
170 new CFClient::Database 176 new CFPlus::Database
171 -Env => $DB_ENV, 177 -Env => $DB_ENV,
172 -Filename => $table, 178 -Filename => $table,
173# -Filename => "database", 179# -Filename => "database",
174# -Subname => $table, 180# -Subname => $table,
175 -Property => DB_CHKSUM, 181 -Property => DB_CHKSUM,
176 -Flags => DB_CREATE | DB_UPGRADE, 182 -Flags => DB_CREATE | DB_UPGRADE,
177 or die "unable to create/open database table $_[0]: $BerkeleyDB::Error" 183 or die "unable to create/open database table $_[0]: $BerkeleyDB::Error"
178} 184}
179 185
180package CFClient::Layout; 186package CFPlus::Layout;
181 187
182$CFClient::OpenGL::SHUTDOWN_HOOK{"CFClient::Layout"} = sub { 188$CFPlus::OpenGL::SHUTDOWN_HOOK{"CFPlus::Layout"} = sub {
183 reset_glyph_cache; 189 reset_glyph_cache;
184}; 190};
185 191
186package CFClient::Item; 192package CFPlus::Item;
187 193
188use strict; 194use strict;
189use Crossfire::Protocol::Constants; 195use Crossfire::Protocol::Constants;
190 196
191my $last_enter_count = 1; 197my $last_enter_count = 1;
225} 231}
226 232
227sub do_n_dialog { 233sub do_n_dialog {
228 my ($cb) = @_; 234 my ($cb) = @_;
229 235
230 my $w = new CFClient::UI::FancyFrame 236 my $w = new CFPlus::UI::FancyFrame
231 on_delete => sub { $_[0]->destroy; 1 }, 237 on_delete => sub { $_[0]->destroy; 1 },
232 has_close_button => 1, 238 has_close_button => 1,
233 ; 239 ;
234 240
235 $w->add (my $vb = new CFClient::UI::VBox x => "center", y => "center"); 241 $w->add (my $vb = new CFPlus::UI::VBox x => "center", y => "center");
236 $vb->add (new CFClient::UI::Label text => "Enter item count:"); 242 $vb->add (new CFPlus::UI::Label text => "Enter item count:");
237 $vb->add (my $entry = new CFClient::UI::Entry 243 $vb->add (my $entry = new CFPlus::UI::Entry
238 text => $last_enter_count, 244 text => $last_enter_count,
239 on_activate => sub { 245 on_activate => sub {
240 my ($entry) = @_; 246 my ($entry) = @_;
241 $last_enter_count = $entry->get_text; 247 $last_enter_count = $entry->get_text;
242 $cb->($last_enter_count); 248 $cb->($last_enter_count);
264 270
265 if ($self->{container} == $::CONN->{player}{tag}) { 271 if ($self->{container} == $::CONN->{player}{tag}) {
266 $targ = $::CONN->{open_container}; 272 $targ = $::CONN->{open_container};
267 } 273 }
268 274
269 if (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 1) { 275 if (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 1) {
270 $::CONN->send ("move $targ $self->{tag} 0") 276 $::CONN->send ("move $targ $self->{tag} 0")
271 if $targ || !($self->{flags} & F_LOCKED); 277 if $targ || !($self->{flags} & F_LOCKED);
272 } elsif (($ev->{mod} & CFClient::KMOD_SHIFT) && $ev->{button} == 2) { 278 } elsif (($ev->{mod} & CFPlus::KMOD_SHIFT) && $ev->{button} == 2) {
273 $self->{flags} & F_LOCKED 279 $self->{flags} & F_LOCKED
274 ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag}) 280 ? $::CONN->send ("lock " . pack "CN", 0, $self->{tag})
275 : $::CONN->send ("lock " . pack "CN", 1, $self->{tag}) 281 : $::CONN->send ("lock " . pack "CN", 1, $self->{tag})
276 } elsif ($ev->{button} == 1) { 282 } elsif ($ev->{button} == 1) {
277 $::CONN->send ("examine $self->{tag}"); 283 $::CONN->send ("examine $self->{tag}");
308 ] 314 ]
309 ) 315 )
310 ), 316 ),
311 ); 317 );
312 318
313 CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev); 319 CFPlus::UI::Menu->new (items => \@menu_items)->popup ($ev);
314 } 320 }
315 321
316 1 322 1
317 }; 323 };
318 324
326 332
327 my $bg = $self->{flags} & F_CURSED ? [1 , 0 , 0, 0.5] 333 my $bg = $self->{flags} & F_CURSED ? [1 , 0 , 0, 0.5]
328 : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5] 334 : $self->{flags} & F_MAGIC ? [0.2, 0.2, 1, 0.5]
329 : undef; 335 : undef;
330 336
331 $self->{face_widget} ||= new CFClient::UI::Face 337 $self->{face_widget} ||= new CFPlus::UI::Face
332 can_events => 1, 338 can_events => 1,
333 can_hover => 1, 339 can_hover => 1,
334 anim => $self->{anim}, 340 anim => $self->{anim},
335 animspeed => $self->{animspeed}, # TODO# must be set at creation time 341 animspeed => $self->{animspeed}, # TODO# must be set at creation time
336 on_button_down => $button_cb, 342 on_button_down => $button_cb,
344 . "Item uses face #$self->{face}. " 350 . "Item uses face #$self->{face}. "
345 . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ") 351 . ($self->{animspeed} ? "Item uses animation #$self->{anim} at " . (1 / $self->{animspeed}) . "fps. " : "Item is not animated. ")
346 . "\n\n$tooltip_std" 352 . "\n\n$tooltip_std"
347 ); 353 );
348 354
349 $self->{desc_widget} ||= new CFClient::UI::Label 355 $self->{desc_widget} ||= new CFPlus::UI::Label
350 can_events => 1, 356 can_events => 1,
351 can_hover => 1, 357 can_hover => 1,
352 ellipsise => 2, 358 ellipsise => 2,
353 align => -1, 359 align => -1,
354 on_button_down => $button_cb, 360 on_button_down => $button_cb,
355 ; 361 ;
356 my $desc = CFClient::Item::desc_string $self; 362 my $desc = CFPlus::Item::desc_string $self;
357 $self->{desc_widget}{bg} = $bg; 363 $self->{desc_widget}{bg} = $bg;
358 $self->{desc_widget}->set_text ($desc); 364 $self->{desc_widget}->set_text ($desc);
359 $self->{desc_widget}->set_tooltip ("<b>$desc</b>.\n$tooltip_std"); 365 $self->{desc_widget}->set_tooltip ("<b>$desc</b>.\n$tooltip_std");
360 366
361 $self->{weight_widget} ||= new CFClient::UI::Label 367 $self->{weight_widget} ||= new CFPlus::UI::Label
362 can_events => 1, 368 can_events => 1,
363 can_hover => 1, 369 can_hover => 1,
364 ellipsise => 0, 370 ellipsise => 0,
365 align => 0, 371 align => 0,
366 on_button_down => $button_cb, 372 on_button_down => $button_cb,
367 ; 373 ;
368 $self->{weight_widget}{bg} = $bg; 374 $self->{weight_widget}{bg} = $bg;
369 $self->{weight_widget}->set_text (CFClient::Item::weight_string $self); 375 $self->{weight_widget}->set_text (CFPlus::Item::weight_string $self);
370 $self->{weight_widget}->set_tooltip ( 376 $self->{weight_widget}->set_tooltip (
371 "<b>Weight</b>.\n" 377 "<b>Weight</b>.\n"
372 . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ") 378 . ($self->{weight} >= 0 ? "One item weighs $self->{weight}g. " : "You have no idea how much this weighs. ")
373 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ") 379 . ($self->{nrof} ? "You have $self->{nrof} of it. " : "Item cannot stack with others of it's kind. ")
374 . "\n\n$tooltip_std" 380 . "\n\n$tooltip_std"

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines