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.65 by root, Wed May 3 19:34:31 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/.*\///;
268 } 298 }
269 299
270 \%pak 300 \%pak
271} 301}
272 302
273sub read_arch($) { 303sub read_arch($;$) {
274 my ($path) = @_; 304 my ($path, $toplevel) = @_;
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 {
298 } elsif (/^msg$/i) { 328 } elsif (/^msg$/i) {
299 while (<$fh>) { 329 while (<$fh>) {
300 last if /^endmsg\s*$/i; 330 last if /^endmsg\s*$/i;
301 $arc{msg} .= $_; 331 $arc{msg} .= $_;
302 } 332 }
333 } elsif (/^anim$/i) {
334 while (<$fh>) {
335 last if /^mina\s*$/i;
336 chomp;
337 push @{ $arc{anim} }, $_;
338 }
303 } elsif (/^(\S+)\s*(.*)$/) { 339 } elsif (/^(\S+)\s*(.*)$/) {
304 $arc{lc $1} = $2; 340 $arc{lc $1} = $2;
305 } elsif (/^\s*($|#)/) { 341 } elsif (/^\s*($|#)/) {
306 # 342 #
307 } else { 343 } else {
336 } else { 372 } else {
337 push @{ $arc{arch} }, $arc; 373 push @{ $arc{arch} }, $arc;
338 } 374 }
339 $prev = $arc; 375 $prev = $arc;
340 $more = undef; 376 $more = undef;
377 } elsif ($toplevel && /^(\S+)\s+(.*)$/) {
378 if ($1 eq "lev_array") {
379 while (<$fh>) {
380 last if /^endplst\s*$/;
381 push @{$toplevel->{lev_array}}, $_+0;
382 }
383 } else {
384 $toplevel->{$1} = $2;
385 }
341 } elsif (/^\s*($|#)/) { 386 } elsif (/^\s*($|#)/) {
342 # 387 #
343 } else { 388 } else {
344 warn "$path: unparseable top-level line '$_'"; 389 die "$path: unparseable top-level line '$_'";
345 } 390 }
346 } 391 }
347 392
348 undef $parse_block; # work around bug in perl not freeing $fh etc. 393 undef $parse_block; # work around bug in perl not freeing $fh etc.
349 394
356sub editor_archs { 401sub editor_archs {
357 my %paths; 402 my %paths;
358 403
359 for (keys %ARCH) { 404 for (keys %ARCH) {
360 my $arch = $ARCH{$_}; 405 my $arch = $ARCH{$_};
361 push @{$paths{$arch->{editor_folder}}}, \$arch; 406 push @{$paths{$arch->{editor_folder}}}, $arch;
362 } 407 }
363 408
364 \%paths 409 \%paths
365} 410}
366 411
431 my $type = $obj->{type} || $arch->{type}; 476 my $type = $obj->{type} || $arch->{type};
432 477
433 if ($type > 0) { 478 if ($type > 0) {
434 $root = $Crossfire::Data::ATTR{$type}; 479 $root = $Crossfire::Data::ATTR{$type};
435 } else { 480 } else {
481 my %a = (%$arch, %$obj);
482
483 if ($a{is_floor} && !$a{alive}) {
484 $root = $Crossfire::Data::TYPE{Floor};
485 } elsif (!$a{is_floor} && $a{alive} && !$a{tear_down}) {
486 $root = $Crossfire::Data::TYPE{"Monster & NPC"};
487 } elsif (!$a{is_floor} && !$a{alive} && $a{move_block}) {
488 $root = $Crossfire::Data::TYPE{Wall};
489 } elsif (!$a{is_floor} && $a{alive} && $a{tear_down}) {
490 $root = $Crossfire::Data::TYPE{"Weak Wall"};
491 } else {
436 $root = $Crossfire::Data::TYPE{Misc}; 492 $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 } 493 }
451 } 494 }
452 495
453 my @import = ($root); 496 my @import = ($root);
454 497
628 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub { 671 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub {
629 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png" 672 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png"
630 or die "$VARDIR/tilecache.png: $!"; 673 or die "$VARDIR/tilecache.png: $!";
631 *FACE = $_[0]; 674 *FACE = $_[0];
632 }, sub { 675 }, sub {
633 require File::Temp;
634
635 my $tile = read_pak "$LIB/crossfire.0"; 676 my $tile = read_pak "$LIB/crossfire.0";
636 677
637 my %cache; 678 my %cache;
638 679
639 my $idx = 0; 680 my $idx = 0;
640 681
641 for my $name (sort keys %$tile) { 682 for my $name (sort keys %$tile) {
642 my ($fh, $filename) = File::Temp::tempfile (); 683 my $pb = new Gtk2::Gdk::PixbufLoader;
643 print $fh $tile->{$name}; 684 $pb->write ($tile->{$name});
644 close $fh; 685 $pb->close;
645 my $pb = new_from_file Gtk2::Gdk::Pixbuf $filename; 686 my $pb = $pb->get_pixbuf;
646 unlink $filename;
647 687
648 my $tile = $cache{$name} = { 688 my $tile = $cache{$name} = {
649 pb => $pb, 689 pb => $pb,
650 idx => $idx, 690 idx => $idx,
651 w => int $pb->get_width / TILESIZE, 691 w => int $pb->get_width / TILESIZE,
669 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64); 709 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64);
670 } 710 }
671 } 711 }
672 } 712 }
673 713
674 $pb->save ("$VARDIR/tilecache.png", "png"); 714 $pb->save ("$VARDIR/tilecache.png", "png", compression => 1);
675 715
676 \%cache 716 \%cache
677 }; 717 };
678} 718}
679 719

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines