… | |
… | |
4 | |
4 | |
5 | =cut |
5 | =cut |
6 | |
6 | |
7 | package Crossfire; |
7 | package Crossfire; |
8 | |
8 | |
9 | our $VERSION = '0.1'; |
9 | our $VERSION = '0.9'; |
10 | |
10 | |
11 | use strict; |
11 | use strict; |
12 | |
12 | |
13 | use base 'Exporter'; |
13 | use base 'Exporter'; |
14 | |
14 | |
… | |
… | |
199 | if (defined (my $v = delete $ob->{slow_move})) { |
199 | if (defined (my $v = delete $ob->{slow_move})) { |
200 | $ob->{move_slow} |= MOVE_WALK; |
200 | $ob->{move_slow} |= MOVE_WALK; |
201 | $ob->{move_slow_penalty} = $v; |
201 | $ob->{move_slow_penalty} = $v; |
202 | } |
202 | } |
203 | if (defined (my $v = delete $ob->{walk_on})) { |
203 | if (defined (my $v = delete $ob->{walk_on})) { |
|
|
204 | $ob->{move_on} = MOVE_ALL unless exists $ob->{move_on}; |
204 | $ob->{move_on} = $v ? $ob->{move_on} | MOVE_WALK |
205 | $ob->{move_on} = $v ? $ob->{move_on} | MOVE_WALK |
205 | : $ob->{move_on} & ~MOVE_WALK; |
206 | : $ob->{move_on} & ~MOVE_WALK; |
206 | } |
207 | } |
207 | if (defined (my $v = delete $ob->{walk_off})) { |
208 | if (defined (my $v = delete $ob->{walk_off})) { |
|
|
209 | $ob->{move_off} = MOVE_ALL unless exists $ob->{move_off}; |
208 | $ob->{move_off} = $v ? $ob->{move_off} | MOVE_WALK |
210 | $ob->{move_off} = $v ? $ob->{move_off} | MOVE_WALK |
209 | : $ob->{move_off} & ~MOVE_WALK; |
211 | : $ob->{move_off} & ~MOVE_WALK; |
210 | } |
212 | } |
211 | if (defined (my $v = delete $ob->{fly_on})) { |
213 | if (defined (my $v = delete $ob->{fly_on})) { |
|
|
214 | $ob->{move_on} = MOVE_ALL unless exists $ob->{move_on}; |
212 | $ob->{move_on} = $v ? $ob->{move_on} | MOVE_FLY_LOW |
215 | $ob->{move_on} = $v ? $ob->{move_on} | MOVE_FLY_LOW |
213 | : $ob->{move_on} & ~MOVE_FLY_LOW; |
216 | : $ob->{move_on} & ~MOVE_FLY_LOW; |
214 | } |
217 | } |
215 | if (defined (my $v = delete $ob->{fly_off})) { |
218 | if (defined (my $v = delete $ob->{fly_off})) { |
|
|
219 | $ob->{move_off} = MOVE_ALL unless exists $ob->{move_off}; |
216 | $ob->{move_off} = $v ? $ob->{move_off} | MOVE_FLY_LOW |
220 | $ob->{move_off} = $v ? $ob->{move_off} | MOVE_FLY_LOW |
217 | : $ob->{move_off} & ~MOVE_FLY_LOW; |
221 | : $ob->{move_off} & ~MOVE_FLY_LOW; |
218 | } |
222 | } |
219 | if (defined (my $v = delete $ob->{flying})) { |
223 | if (defined (my $v = delete $ob->{flying})) { |
|
|
224 | $ob->{move_type} = MOVE_ALL unless exists $ob->{move_type}; |
220 | $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW |
225 | $ob->{move_type} = $v ? $ob->{move_type} | MOVE_FLY_LOW |
221 | : $ob->{move_type} & ~MOVE_FLY_LOW; |
226 | : $ob->{move_type} & ~MOVE_FLY_LOW; |
222 | } |
227 | } |
223 | |
228 | |
224 | # convert idiotic event_xxx things into objects |
229 | # convert idiotic event_xxx things into objects |
… | |
… | |
298 | } |
303 | } |
299 | |
304 | |
300 | \%pak |
305 | \%pak |
301 | } |
306 | } |
302 | |
307 | |
303 | sub read_arch($) { |
308 | sub read_arch($;$) { |
304 | my ($path) = @_; |
309 | my ($path, $toplevel) = @_; |
305 | |
310 | |
306 | my %arc; |
311 | my %arc; |
307 | my ($more, $prev); |
312 | my ($more, $prev); |
308 | |
313 | |
309 | open my $fh, "<:raw:perlio:utf8", $path |
314 | open my $fh, "<:raw:perlio:utf8", $path |
310 | or Carp::croak "$path: $!"; |
315 | or Carp::croak "$path: $!"; |
311 | |
316 | |
312 | binmode $fh; |
317 | # binmode $fh; |
313 | |
318 | |
314 | my $parse_block; $parse_block = sub { |
319 | my $parse_block; $parse_block = sub { |
315 | my %arc = @_; |
320 | my %arc = @_; |
316 | |
321 | |
317 | while (<$fh>) { |
322 | while (<$fh>) { |
… | |
… | |
328 | } elsif (/^msg$/i) { |
333 | } elsif (/^msg$/i) { |
329 | while (<$fh>) { |
334 | while (<$fh>) { |
330 | last if /^endmsg\s*$/i; |
335 | last if /^endmsg\s*$/i; |
331 | $arc{msg} .= $_; |
336 | $arc{msg} .= $_; |
332 | } |
337 | } |
|
|
338 | } elsif (/^anim$/i) { |
|
|
339 | while (<$fh>) { |
|
|
340 | last if /^mina\s*$/i; |
|
|
341 | chomp; |
|
|
342 | push @{ $arc{anim} }, $_; |
|
|
343 | } |
333 | } elsif (/^(\S+)\s*(.*)$/) { |
344 | } elsif (/^(\S+)\s*(.*)$/) { |
334 | $arc{lc $1} = $2; |
345 | $arc{lc $1} = $2; |
335 | } elsif (/^\s*($|#)/) { |
346 | } elsif (/^\s*($|#)/) { |
336 | # |
347 | # |
337 | } else { |
348 | } else { |
… | |
… | |
366 | } else { |
377 | } else { |
367 | push @{ $arc{arch} }, $arc; |
378 | push @{ $arc{arch} }, $arc; |
368 | } |
379 | } |
369 | $prev = $arc; |
380 | $prev = $arc; |
370 | $more = undef; |
381 | $more = undef; |
|
|
382 | } elsif ($toplevel && /^(\S+)\s+(.*)$/) { |
|
|
383 | if ($1 eq "lev_array") { |
|
|
384 | while (<$fh>) { |
|
|
385 | last if /^endplst\s*$/; |
|
|
386 | push @{$toplevel->{lev_array}}, $_+0; |
|
|
387 | } |
|
|
388 | } else { |
|
|
389 | $toplevel->{$1} = $2; |
|
|
390 | } |
371 | } elsif (/^\s*($|#)/) { |
391 | } elsif (/^\s*($|#)/) { |
372 | # |
392 | # |
373 | } else { |
393 | } else { |
374 | warn "$path: unparseable top-level line '$_'"; |
394 | die "$path: unparseable top-level line '$_'"; |
375 | } |
395 | } |
376 | } |
396 | } |
377 | |
397 | |
378 | undef $parse_block; # work around bug in perl not freeing $fh etc. |
398 | undef $parse_block; # work around bug in perl not freeing $fh etc. |
379 | |
399 | |