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.58 by root, Thu Mar 23 20:15:08 2006 UTC vs.
Revision 1.62 by root, Tue Mar 28 14:44:52 2006 UTC

59 59
60 name name_pl custom_name title race 60 name name_pl custom_name title race
61 slaying skill msg lore other_arch face 61 slaying skill msg lore other_arch face
62 #todo-events 62 #todo-events
63 animation is_animated 63 animation is_animated
64 Str Dex Con Wis Pow Cha Int 64 str dex con wis pow cha int
65 hp maxhp sp maxsp grace maxgrace 65 hp maxhp sp maxsp grace maxgrace
66 exp perm_exp expmul 66 exp perm_exp expmul
67 food dam luck wc ac x y speed speed_left move_state attack_movement 67 food dam luck wc ac x y speed speed_left move_state attack_movement
68 nrof level direction type subtype 68 nrof level direction type subtype attacktype
69 69
70 resist_physical resist_magic resist_fire resist_electricity 70 resist_physical resist_magic resist_fire resist_electricity
71 resist_cold resist_confusion resist_acid resist_drain 71 resist_cold resist_confusion resist_acid resist_drain
72 resist_weaponmagic resist_ghosthit resist_poison resist_slow 72 resist_weaponmagic resist_ghosthit resist_poison resist_slow
73 resist_paralyze resist_turn_undead resist_fear resist_cancellation 73 resist_paralyze resist_turn_undead resist_fear resist_cancellation
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 }
135 close $fh; 150 close $fh;
136 rename "$path~", $path 151 rename "$path~", $path
137 or die "$path: $!"; 152 or die "$path: $!";
138} 153}
139 154
155# object as in "Object xxx", i.e. archetypes
140sub normalize_object($) { 156sub normalize_object($) {
141 my ($ob) = @_; 157 my ($ob) = @_;
142 158
159 # nuke outdated or never supported fields
143 delete $ob->{$_} for qw( 160 delete $ob->{$_} for qw(
144 can_knockback can_parry can_impale can_cut can_dam_armour 161 can_knockback can_parry can_impale can_cut can_dam_armour
145 can_apply pass_thru can_pass_thru 162 can_apply pass_thru can_pass_thru
146 ); 163 );
147 164
165 # convert movement strings to bitsets
148 for my $attr (keys %FIELD_MOVEMENT) { 166 for my $attr (keys %FIELD_MOVEMENT) {
149 next unless exists $ob->{$attr}; 167 next unless exists $ob->{$attr};
150 168
151 $ob->{$attr} = MOVE_ALL if $ob->{$attr} == 255; #d# compatibility 169 $ob->{$attr} = MOVE_ALL if $ob->{$attr} == 255; #d# compatibility
152 170
174 } 192 }
175 193
176 $ob->{$attr} = $flags; 194 $ob->{$attr} = $flags;
177 } 195 }
178 196
197 # convert outdated movement flags to new movement sets
179 if (defined (my $v = delete $ob->{no_pass})) { 198 if (defined (my $v = delete $ob->{no_pass})) {
180 $ob->{move_block} = $v ? MOVE_ALL : 0; 199 $ob->{move_block} = $v ? MOVE_ALL : 0;
181 } 200 }
182 if (defined (my $v = delete $ob->{slow_move})) { 201 if (defined (my $v = delete $ob->{slow_move})) {
183 $ob->{move_slow} |= MOVE_WALK; 202 $ob->{move_slow} |= MOVE_WALK;
202 if (defined (my $v = delete $ob->{flying})) { 221 if (defined (my $v = delete $ob->{flying})) {
203 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW 222 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW
204 : $ob->{move_type} & ~MOVE_FLY_LOW; 223 : $ob->{move_type} & ~MOVE_FLY_LOW;
205 } 224 }
206 225
226 # convert idiotic event_xxx things into objects
227 while (my ($event, $subtype) = each %EVENT_TYPE) {
228 if (exists $ob->{"event_${event}_plugin"}) {
229 push @{$ob->{inventory}}, {
230 _name => "event_$event",
231 title => delete $ob->{"event_${event}_plugin"},
232 slaying => delete $ob->{"event_${event}"},
233 name => delete $ob->{"event_${event}_options"},
234 };
235 }
236 }
237
207 $ob 238 $ob
208} 239}
209 240
241# arch as in "arch xxx", ie.. objects
210sub normalize_arch($) { 242sub normalize_arch($) {
211 my ($ob) = @_; 243 my ($ob) = @_;
212 244
213 normalize_object $ob; 245 normalize_object $ob;
214 246
356sub editor_archs { 388sub editor_archs {
357 my %paths; 389 my %paths;
358 390
359 for (keys %ARCH) { 391 for (keys %ARCH) {
360 my $arch = $ARCH{$_}; 392 my $arch = $ARCH{$_};
361 push @{$paths{$arch->{editor_folder}}}, \$arch; 393 push @{$paths{$arch->{editor_folder}}}, $arch;
362 } 394 }
363 395
364 \%paths 396 \%paths
365} 397}
366 398
431 my $type = $obj->{type} || $arch->{type}; 463 my $type = $obj->{type} || $arch->{type};
432 464
433 if ($type > 0) { 465 if ($type > 0) {
434 $root = $Crossfire::Data::ATTR{$type}; 466 $root = $Crossfire::Data::ATTR{$type};
435 } else { 467 } else {
468 my %a = (%$arch, %$obj);
469
470 if ($a{is_floor} && !$a{alive}) {
471 $root = $Crossfire::Data::TYPE{Floor};
472 } elsif (!$a{is_floor} && $a{alive} && !$a{tear_down}) {
473 $root = $Crossfire::Data::TYPE{"Monster & NPC"};
474 } elsif (!$a{is_floor} && !$a{alive} && $a{move_block}) {
475 $root = $Crossfire::Data::TYPE{Wall};
476 } elsif (!$a{is_floor} && $a{alive} && $a{tear_down}) {
477 $root = $Crossfire::Data::TYPE{"Weak Wall"};
478 } else {
436 $root = $Crossfire::Data::TYPE{Misc}; 479 $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 } 480 }
451 } 481 }
452 482
453 my @import = ($root); 483 my @import = ($root);
454 484
628 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub { 658 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub {
629 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png" 659 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png"
630 or die "$VARDIR/tilecache.png: $!"; 660 or die "$VARDIR/tilecache.png: $!";
631 *FACE = $_[0]; 661 *FACE = $_[0];
632 }, sub { 662 }, sub {
633 require File::Temp;
634
635 my $tile = read_pak "$LIB/crossfire.0"; 663 my $tile = read_pak "$LIB/crossfire.0";
636 664
637 my %cache; 665 my %cache;
638 666
639 my $idx = 0; 667 my $idx = 0;
640 668
641 for my $name (sort keys %$tile) { 669 for my $name (sort keys %$tile) {
642 my ($fh, $filename) = File::Temp::tempfile (); 670 my $pb = new Gtk2::Gdk::PixbufLoader;
643 print $fh $tile->{$name}; 671 $pb->write ($tile->{$name});
644 close $fh; 672 $pb->close;
645 my $pb = new_from_file Gtk2::Gdk::Pixbuf $filename; 673 my $pb = $pb->get_pixbuf;
646 unlink $filename;
647 674
648 my $tile = $cache{$name} = { 675 my $tile = $cache{$name} = {
649 pb => $pb, 676 pb => $pb,
650 idx => $idx, 677 idx => $idx,
651 w => int $pb->get_width / TILESIZE, 678 w => int $pb->get_width / TILESIZE,
669 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64); 696 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64);
670 } 697 }
671 } 698 }
672 } 699 }
673 700
674 $pb->save ("$VARDIR/tilecache.png", "png"); 701 $pb->save ("$VARDIR/tilecache.png", "png", compression => 1);
675 702
676 \%cache 703 \%cache
677 }; 704 };
678} 705}
679 706

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines