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.61 by root, Mon Mar 27 17:38:18 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines