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

Comparing deliantra/Deliantra/Deliantra.pm (file contents):
Revision 1.59 by root, Sun Mar 26 11:52:31 2006 UTC vs.
Revision 1.63 by root, Fri Mar 31 21:06:47 2006 UTC

102 102
103 body_range body_arm body_torso body_head body_neck body_skill 103 body_range body_arm body_torso body_head body_neck body_skill
104 body_finger body_shoulder body_foot body_hand body_wrist body_waist 104 body_finger body_shoulder body_foot body_hand body_wrist body_waist
105)); 105));
106 106
107our %EVENT_TYPE = (
108 apply => 1,
109 attack => 2,
110 death => 3,
111 drop => 4,
112 pickup => 5,
113 say => 6,
114 stop => 7,
115 time => 8,
116 throw => 9,
117 trigger => 10,
118 close => 11,
119 timer => 12,
120);
121
107sub MOVE_WALK (){ 0x01 } 122sub MOVE_WALK (){ 0x01 }
108sub MOVE_FLY_LOW (){ 0x02 } 123sub MOVE_FLY_LOW (){ 0x02 }
109sub MOVE_FLY_HIGH (){ 0x04 } 124sub MOVE_FLY_HIGH (){ 0x04 }
110sub MOVE_FLYING (){ 0x06 } 125sub MOVE_FLYING (){ 0x06 }
111sub MOVE_SWIM (){ 0x08 } 126sub MOVE_SWIM (){ 0x08 }
115sub MOVE_ALL (){ 0x1001f } # very special value, more PITA 130sub MOVE_ALL (){ 0x1001f } # very special value, more PITA
116 131
117sub load_ref($) { 132sub load_ref($) {
118 my ($path) = @_; 133 my ($path) = @_;
119 134
120 open my $fh, "<", $path 135 open my $fh, "<:raw:perlio", $path
121 or die "$path: $!"; 136 or die "$path: $!";
122 binmode $fh;
123 local $/; 137 local $/;
124 138
125 thaw <$fh> 139 thaw <$fh>
126} 140}
127 141
128sub save_ref($$) { 142sub save_ref($$) {
129 my ($ref, $path) = @_; 143 my ($ref, $path) = @_;
130 144
131 open my $fh, ">", "$path~" 145 open my $fh, ">:raw:perlio", "$path~"
132 or die "$path~: $!"; 146 or die "$path~: $!";
133 binmode $fh;
134 print $fh freeze $ref; 147 print $fh freeze $ref;
135 close $fh; 148 close $fh;
136 rename "$path~", $path 149 rename "$path~", $path
137 or die "$path: $!"; 150 or die "$path: $!";
138} 151}
139 152
153# object as in "Object xxx", i.e. archetypes
140sub normalize_object($) { 154sub normalize_object($) {
141 my ($ob) = @_; 155 my ($ob) = @_;
142 156
157 # nuke outdated or never supported fields
143 delete $ob->{$_} for qw( 158 delete $ob->{$_} for qw(
144 can_knockback can_parry can_impale can_cut can_dam_armour 159 can_knockback can_parry can_impale can_cut can_dam_armour
145 can_apply pass_thru can_pass_thru 160 can_apply pass_thru can_pass_thru
146 ); 161 );
147 162
163 # convert movement strings to bitsets
148 for my $attr (keys %FIELD_MOVEMENT) { 164 for my $attr (keys %FIELD_MOVEMENT) {
149 next unless exists $ob->{$attr}; 165 next unless exists $ob->{$attr};
150 166
151 $ob->{$attr} = MOVE_ALL if $ob->{$attr} == 255; #d# compatibility 167 $ob->{$attr} = MOVE_ALL if $ob->{$attr} == 255; #d# compatibility
152 168
174 } 190 }
175 191
176 $ob->{$attr} = $flags; 192 $ob->{$attr} = $flags;
177 } 193 }
178 194
195 # convert outdated movement flags to new movement sets
179 if (defined (my $v = delete $ob->{no_pass})) { 196 if (defined (my $v = delete $ob->{no_pass})) {
180 $ob->{move_block} = $v ? MOVE_ALL : 0; 197 $ob->{move_block} = $v ? MOVE_ALL : 0;
181 } 198 }
182 if (defined (my $v = delete $ob->{slow_move})) { 199 if (defined (my $v = delete $ob->{slow_move})) {
183 $ob->{move_slow} |= MOVE_WALK; 200 $ob->{move_slow} |= MOVE_WALK;
202 if (defined (my $v = delete $ob->{flying})) { 219 if (defined (my $v = delete $ob->{flying})) {
203 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW 220 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW
204 : $ob->{move_type} & ~MOVE_FLY_LOW; 221 : $ob->{move_type} & ~MOVE_FLY_LOW;
205 } 222 }
206 223
224 # convert idiotic event_xxx things into objects
225 while (my ($event, $subtype) = each %EVENT_TYPE) {
226 if (exists $ob->{"event_${event}_plugin"}) {
227 push @{$ob->{inventory}}, {
228 _name => "event_$event",
229 title => delete $ob->{"event_${event}_plugin"},
230 slaying => delete $ob->{"event_${event}"},
231 name => delete $ob->{"event_${event}_options"},
232 };
233 }
234 }
235
207 $ob 236 $ob
208} 237}
209 238
239# arch as in "arch xxx", ie.. objects
210sub normalize_arch($) { 240sub normalize_arch($) {
211 my ($ob) = @_; 241 my ($ob) = @_;
212 242
213 normalize_object $ob; 243 normalize_object $ob;
214 244
256sub read_pak($) { 286sub read_pak($) {
257 my ($path) = @_; 287 my ($path) = @_;
258 288
259 my %pak; 289 my %pak;
260 290
261 open my $fh, "<", $path 291 open my $fh, "<:raw:perlio", $path
262 or Carp::croak "$_[0]: $!"; 292 or Carp::croak "$_[0]: $!";
263 binmode $fh; 293 binmode $fh;
264 while (<$fh>) { 294 while (<$fh>) {
265 my ($type, $id, $len, $path) = split; 295 my ($type, $id, $len, $path) = split;
266 $path =~ s/.*\///; 296 $path =~ s/.*\///;
274 my ($path) = @_; 304 my ($path) = @_;
275 305
276 my %arc; 306 my %arc;
277 my ($more, $prev); 307 my ($more, $prev);
278 308
279 open my $fh, "<", $path 309 open my $fh, "<:raw:perlio:utf8", $path
280 or Carp::croak "$path: $!"; 310 or Carp::croak "$path: $!";
281 311
282 binmode $fh; 312 binmode $fh;
283 313
284 my $parse_block; $parse_block = sub { 314 my $parse_block; $parse_block = sub {
356sub editor_archs { 386sub editor_archs {
357 my %paths; 387 my %paths;
358 388
359 for (keys %ARCH) { 389 for (keys %ARCH) {
360 my $arch = $ARCH{$_}; 390 my $arch = $ARCH{$_};
361 push @{$paths{$arch->{editor_folder}}}, \$arch; 391 push @{$paths{$arch->{editor_folder}}}, $arch;
362 } 392 }
363 393
364 \%paths 394 \%paths
365} 395}
366 396
431 my $type = $obj->{type} || $arch->{type}; 461 my $type = $obj->{type} || $arch->{type};
432 462
433 if ($type > 0) { 463 if ($type > 0) {
434 $root = $Crossfire::Data::ATTR{$type}; 464 $root = $Crossfire::Data::ATTR{$type};
435 } else { 465 } else {
466 my %a = (%$arch, %$obj);
467
468 if ($a{is_floor} && !$a{alive}) {
469 $root = $Crossfire::Data::TYPE{Floor};
470 } elsif (!$a{is_floor} && $a{alive} && !$a{tear_down}) {
471 $root = $Crossfire::Data::TYPE{"Monster & NPC"};
472 } elsif (!$a{is_floor} && !$a{alive} && $a{move_block}) {
473 $root = $Crossfire::Data::TYPE{Wall};
474 } elsif (!$a{is_floor} && $a{alive} && $a{tear_down}) {
475 $root = $Crossfire::Data::TYPE{"Weak Wall"};
476 } else {
436 $root = $Crossfire::Data::TYPE{Misc}; 477 $root = $Crossfire::Data::TYPE{Misc};
437
438 type:
439 for (@Crossfire::Data::ATTR0) {
440 my $req = $_->{required}
441 or die "internal error: ATTR0 without 'required'";
442
443 keys %$req;
444 while (my ($k, $v) = each %$req) {
445 next type
446 unless $obj->{$k} == $v || $arch->{$k} == $v;
447 }
448
449 $root = $_;
450 } 478 }
451 } 479 }
452 480
453 my @import = ($root); 481 my @import = ($root);
454 482
628 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub { 656 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub {
629 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png" 657 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png"
630 or die "$VARDIR/tilecache.png: $!"; 658 or die "$VARDIR/tilecache.png: $!";
631 *FACE = $_[0]; 659 *FACE = $_[0];
632 }, sub { 660 }, sub {
633 require File::Temp;
634
635 my $tile = read_pak "$LIB/crossfire.0"; 661 my $tile = read_pak "$LIB/crossfire.0";
636 662
637 my %cache; 663 my %cache;
638 664
639 my $idx = 0; 665 my $idx = 0;
640 666
641 for my $name (sort keys %$tile) { 667 for my $name (sort keys %$tile) {
642 my ($fh, $filename) = File::Temp::tempfile (); 668 my $pb = new Gtk2::Gdk::PixbufLoader;
643 print $fh $tile->{$name}; 669 $pb->write ($tile->{$name});
644 close $fh; 670 $pb->close;
645 my $pb = new_from_file Gtk2::Gdk::Pixbuf $filename; 671 my $pb = $pb->get_pixbuf;
646 unlink $filename;
647 672
648 my $tile = $cache{$name} = { 673 my $tile = $cache{$name} = {
649 pb => $pb, 674 pb => $pb,
650 idx => $idx, 675 idx => $idx,
651 w => int $pb->get_width / TILESIZE, 676 w => int $pb->get_width / TILESIZE,
669 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64); 694 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64);
670 } 695 }
671 } 696 }
672 } 697 }
673 698
674 $pb->save ("$VARDIR/tilecache.png", "png"); 699 $pb->save ("$VARDIR/tilecache.png", "png", compression => 1);
675 700
676 \%cache 701 \%cache
677 }; 702 };
678} 703}
679 704

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines