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.54 by root, Thu Mar 23 06:45:23 2006 UTC vs.
Revision 1.62 by root, Tue Mar 28 14:44:52 2006 UTC

37 msg => "endmsg", 37 msg => "endmsg",
38 lore => "endlore", 38 lore => "endlore",
39 maplore => "endmaplore", 39 maplore => "endmaplore",
40); 40);
41 41
42# movement bit type, PITA
43our %FIELD_MOVEMENT = map +($_ => undef),
44 qw(move_type move_block move_allow move_on move_off move_slow);
45
42# same as in server save routine, to (hopefully) be compatible 46# same as in server save routine, to (hopefully) be compatible
43# to the other editors. 47# to the other editors.
48our @FIELD_ORDER_MAP = (qw(
49 name swap_time reset_timeout fixed_resettime difficulty region
50 shopitems shopgreed shopmin shopmax shoprace
51 darkness width height enter_x enter_y msg maplore
52 unique template
53 outdoor temp pressure humid windspeed winddir sky nosmooth
54 tile_path_1 tile_path_2 tile_path_3 tile_path_4
55));
56
44our @FIELD_ORDER = (qw( 57our @FIELD_ORDER = (qw(
58 elevation
59
45 name name_pl custom_name title race 60 name name_pl custom_name title race
46 slaying skill msg lore other_arch face 61 slaying skill msg lore other_arch face
47 #events 62 #todo-events
48 animation is_animated 63 animation is_animated
49 Str Dex Con Wis Pow Cha Int 64 str dex con wis pow cha int
50 hp maxhp sp maxsp grace maxgrace 65 hp maxhp sp maxsp grace maxgrace
51 exp perm_exp expmul 66 exp perm_exp expmul
52 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
53 nrof level direction type subtype 68 nrof level direction type subtype attacktype
54 69
55 resist_physical resist_magic resist_fire resist_electricity 70 resist_physical resist_magic resist_fire resist_electricity
56 resist_cold resist_confusion resist_acid resist_drain 71 resist_cold resist_confusion resist_acid resist_drain
57 resist_weaponmagic resist_ghosthit resist_poison resist_slow 72 resist_weaponmagic resist_ghosthit resist_poison resist_slow
58 resist_paralyze resist_turn_undead resist_fear resist_cancellation 73 resist_paralyze resist_turn_undead resist_fear resist_cancellation
87 102
88 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
89 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
90)); 105));
91 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
92sub MOVE_WALK (){ 0x01 } 122sub MOVE_WALK (){ 0x01 }
93sub MOVE_FLY_LOW (){ 0x02 } 123sub MOVE_FLY_LOW (){ 0x02 }
94sub MOVE_FLY_HIGH (){ 0x04 } 124sub MOVE_FLY_HIGH (){ 0x04 }
95sub MOVE_FLYING (){ 0x06 } 125sub MOVE_FLYING (){ 0x06 }
96sub MOVE_SWIM (){ 0x08 } 126sub MOVE_SWIM (){ 0x08 }
97sub MOVE_BOAT (){ 0x10 } 127sub MOVE_BOAT (){ 0x10 }
128sub MOVE_KNOWN (){ 0x1f } # all of above
98sub MOVE_ALL (){ 0xff } 129sub MOVE_ALLBIT (){ 0x10000 }
130sub MOVE_ALL (){ 0x1001f } # very special value, more PITA
99 131
100sub load_ref($) { 132sub load_ref($) {
101 my ($path) = @_; 133 my ($path) = @_;
102 134
103 open my $fh, "<", $path 135 open my $fh, "<", $path
118 close $fh; 150 close $fh;
119 rename "$path~", $path 151 rename "$path~", $path
120 or die "$path: $!"; 152 or die "$path: $!";
121} 153}
122 154
155# object as in "Object xxx", i.e. archetypes
123sub normalize_object($) { 156sub normalize_object($) {
124 my ($ob) = @_; 157 my ($ob) = @_;
125 158
159 # nuke outdated or never supported fields
126 delete $ob->{$_} for qw( 160 delete $ob->{$_} for qw(
127 can_knockback can_parry can_impale can_cut can_dam_armour 161 can_knockback can_parry can_impale can_cut can_dam_armour
128 can_apply pass_thru can_pass_thru 162 can_apply pass_thru can_pass_thru
129 ); 163 );
130 164
131 for my $attr (qw(move_type move_block move_allow move_on move_off move_slow)) { 165 # convert movement strings to bitsets
166 for my $attr (keys %FIELD_MOVEMENT) {
132 next unless exists $ob->{$attr}; 167 next unless exists $ob->{$attr};
168
169 $ob->{$attr} = MOVE_ALL if $ob->{$attr} == 255; #d# compatibility
170
133 next if $ob->{$attr} =~ /^\d+$/; 171 next if $ob->{$attr} =~ /^\d+$/;
134 172
135 my $flags = 0; 173 my $flags = 0;
136 174
137 # assume list 175 # assume list
154 } 192 }
155 193
156 $ob->{$attr} = $flags; 194 $ob->{$attr} = $flags;
157 } 195 }
158 196
197 # convert outdated movement flags to new movement sets
159 if (defined (my $v = delete $ob->{no_pass})) { 198 if (defined (my $v = delete $ob->{no_pass})) {
160 $ob->{move_block} = $v ? MOVE_ALL : 0; 199 $ob->{move_block} = $v ? MOVE_ALL : 0;
161 } 200 }
162 if (defined (my $v = delete $ob->{slow_move})) { 201 if (defined (my $v = delete $ob->{slow_move})) {
163 $ob->{move_slow} |= MOVE_WALK; 202 $ob->{move_slow} |= MOVE_WALK;
182 if (defined (my $v = delete $ob->{flying})) { 221 if (defined (my $v = delete $ob->{flying})) {
183 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW 222 $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW
184 : $ob->{move_type} & ~MOVE_FLY_LOW; 223 : $ob->{move_type} & ~MOVE_FLY_LOW;
185 } 224 }
186 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
187 $ob 238 $ob
188} 239}
189 240
241# arch as in "arch xxx", ie.. objects
190sub normalize_arch($) { 242sub normalize_arch($) {
191 my ($ob) = @_; 243 my ($ob) = @_;
192 244
193 normalize_object $ob; 245 normalize_object $ob;
194 246
221 delete $ob->{$k}; 273 delete $ob->{$k};
222 } 274 }
223 } 275 }
224 } 276 }
225 277
278 # a speciality for the editor
279 if (exists $ob->{attack_movement}) {
280 my $am = delete $ob->{attack_movement};
281 $ob->{attack_movement_bits_0_3} = $am & 15;
282 $ob->{attack_movement_bits_4_7} = $am & 240;
283 }
284
226 $ob 285 $ob
227} 286}
228 287
229sub read_pak($) { 288sub read_pak($) {
230 my ($path) = @_; 289 my ($path) = @_;
259 318
260 while (<$fh>) { 319 while (<$fh>) {
261 s/\s+$//; 320 s/\s+$//;
262 if (/^end$/i) { 321 if (/^end$/i) {
263 last; 322 last;
264 } elsif (/^arch (\S+)$/) { 323 } elsif (/^arch (\S+)$/i) {
265 push @{ $arc{inventory} }, normalize_arch $parse_block->(_name => $1); 324 push @{ $arc{inventory} }, normalize_arch $parse_block->(_name => $1);
266 } elsif (/^lore$/) { 325 } elsif (/^lore$/i) {
267 while (<$fh>) { 326 while (<$fh>) {
268 last if /^endlore\s*$/i; 327 last if /^endlore\s*$/i;
269 $arc{lore} .= $_; 328 $arc{lore} .= $_;
270 } 329 }
271 } elsif (/^msg$/) { 330 } elsif (/^msg$/i) {
272 while (<$fh>) { 331 while (<$fh>) {
273 last if /^endmsg\s*$/i; 332 last if /^endmsg\s*$/i;
274 $arc{msg} .= $_; 333 $arc{msg} .= $_;
275 } 334 }
276 } elsif (/^(\S+)\s*(.*)$/) { 335 } elsif (/^(\S+)\s*(.*)$/) {
299 $arc{$name} = $arc; 358 $arc{$name} = $arc;
300 } 359 }
301 $prev = $arc; 360 $prev = $arc;
302 $more = undef; 361 $more = undef;
303 } elsif (/^arch (\S+)$/i) { 362 } elsif (/^arch (\S+)$/i) {
363 my $name = $1;
304 push @{ $arc{arch} }, normalize_arch $parse_block->(_name => $1); 364 my $arc = normalize_arch $parse_block->(_name => $name);
365
366 if ($more) {
367 $more->{more} = $arc;
368 } else {
369 push @{ $arc{arch} }, $arc;
370 }
371 $prev = $arc;
372 $more = undef;
305 } elsif (/^\s*($|#)/) { 373 } elsif (/^\s*($|#)/) {
306 # 374 #
307 } else { 375 } else {
308 warn "$path: unparseable top-level line '$_'"; 376 warn "$path: unparseable top-level line '$_'";
309 } 377 }
320sub editor_archs { 388sub editor_archs {
321 my %paths; 389 my %paths;
322 390
323 for (keys %ARCH) { 391 for (keys %ARCH) {
324 my $arch = $ARCH{$_}; 392 my $arch = $ARCH{$_};
325 push @{$paths{$arch->{editor_folder}}}, \$arch; 393 push @{$paths{$arch->{editor_folder}}}, $arch;
326 } 394 }
327 395
328 \%paths 396 \%paths
329} 397}
330 398
395 my $type = $obj->{type} || $arch->{type}; 463 my $type = $obj->{type} || $arch->{type};
396 464
397 if ($type > 0) { 465 if ($type > 0) {
398 $root = $Crossfire::Data::ATTR{$type}; 466 $root = $Crossfire::Data::ATTR{$type};
399 } 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 {
400 $root = $Crossfire::Data::TYPE{Misc}; 479 $root = $Crossfire::Data::TYPE{Misc};
401
402 type:
403 for (@Crossfire::Data::ATTR0) {
404 my $req = $_->{required}
405 or die "internal error: ATTR0 without 'required'";
406
407 keys %$req;
408 while (my ($k, $v) = each %$req) {
409 next type
410 unless $obj->{$k} == $v || $arch->{$k} == $v;
411 }
412
413 $root = $_;
414 } 480 }
415 } 481 }
416 482
417 my @import = ($root); 483 my @import = ($root);
418 484
592 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub { 658 cache_file "$LIB/crossfire.0", "$VARDIR/tilecache.pst", sub {
593 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png" 659 $TILE = new_from_file Gtk2::Gdk::Pixbuf "$VARDIR/tilecache.png"
594 or die "$VARDIR/tilecache.png: $!"; 660 or die "$VARDIR/tilecache.png: $!";
595 *FACE = $_[0]; 661 *FACE = $_[0];
596 }, sub { 662 }, sub {
597 require File::Temp;
598
599 my $tile = read_pak "$LIB/crossfire.0"; 663 my $tile = read_pak "$LIB/crossfire.0";
600 664
601 my %cache; 665 my %cache;
602 666
603 my $idx = 0; 667 my $idx = 0;
604 668
605 for my $name (sort keys %$tile) { 669 for my $name (sort keys %$tile) {
606 my ($fh, $filename) = File::Temp::tempfile (); 670 my $pb = new Gtk2::Gdk::PixbufLoader;
607 print $fh $tile->{$name}; 671 $pb->write ($tile->{$name});
608 close $fh; 672 $pb->close;
609 my $pb = new_from_file Gtk2::Gdk::Pixbuf $filename; 673 my $pb = $pb->get_pixbuf;
610 unlink $filename;
611 674
612 my $tile = $cache{$name} = { 675 my $tile = $cache{$name} = {
613 pb => $pb, 676 pb => $pb,
614 idx => $idx, 677 idx => $idx,
615 w => int $pb->get_width / TILESIZE, 678 w => int $pb->get_width / TILESIZE,
633 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64); 696 $pb, ($idx % 64) * TILESIZE, TILESIZE * int $idx / 64);
634 } 697 }
635 } 698 }
636 } 699 }
637 700
638 $pb->save ("$VARDIR/tilecache.png", "png"); 701 $pb->save ("$VARDIR/tilecache.png", "png", compression => 1);
639 702
640 \%cache 703 \%cache
641 }; 704 };
642} 705}
643 706

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines