… | |
… | |
7 | |
7 | |
8 | =cut |
8 | =cut |
9 | |
9 | |
10 | use base 'Exporter'; |
10 | use base 'Exporter'; |
11 | |
11 | |
12 | use Crossfire; |
12 | use Deliantra; |
13 | |
13 | |
14 | use Carp (); |
14 | use Carp (); |
15 | use Storable; |
15 | use Storable; |
16 | use List::Util qw(min max); |
16 | use List::Util qw(min max); |
17 | |
17 | |
18 | use Crossfire; |
18 | use Deliantra; |
19 | use Crossfire::MapWidget; |
19 | use Deliantra::MapWidget; |
20 | use File::Spec::Functions; |
20 | use File::Spec::Functions; |
21 | use File::Basename; |
21 | use File::Basename; |
22 | use File::Path; |
22 | use File::Path; |
23 | use HTTP::Request::Common; |
23 | use HTTP::Request::Common; |
24 | use Cwd 'abs_path'; |
24 | use Cwd 'abs_path'; |
… | |
… | |
151 | } |
151 | } |
152 | |
152 | |
153 | sub fill_pb_from_arch { |
153 | sub fill_pb_from_arch { |
154 | my ($pb, $a) = @_; |
154 | my ($pb, $a) = @_; |
155 | |
155 | |
156 | my $o = $Crossfire::ARCH{$a->{_name}} || {}; |
156 | my $o = $Deliantra::ARCH{$a->{_name}} || {}; |
157 | my $face = $Crossfire::FACE{$a->{face} || $o->{face} || "blank.111"}; |
157 | my $face = $Deliantra::FACE{$a->{face} || $o->{face} || "blank.111"}; |
158 | unless ($face) { |
158 | unless ($face) { |
159 | $face = $Crossfire::FACE{"blank.x11"} |
159 | $face = $Deliantra::FACE{"blank.x11"} |
160 | or warn "no gfx found for arch '$a->{_name}'\n"; |
160 | or warn "no gfx found for arch '$a->{_name}'\n"; |
161 | } |
161 | } |
162 | |
162 | |
163 | $face or return; |
163 | $face or return; |
164 | |
164 | |
… | |
… | |
188 | } |
188 | } |
189 | } |
189 | } |
190 | |
190 | |
191 | sub arch_is_exit { |
191 | sub arch_is_exit { |
192 | my ($a) = @_; |
192 | my ($a) = @_; |
193 | my $type = $Crossfire::ARCH{$a->{_name}}->{type}; |
193 | my $type = $Deliantra::ARCH{$a->{_name}}->{type}; |
194 | return $type eq '66' || $type eq '41'; |
194 | return $type eq '66' || $type eq '41'; |
195 | } |
195 | } |
196 | |
196 | |
197 | sub arch_is_floor { |
197 | sub arch_is_floor { |
198 | my ($a) = @_; |
198 | my ($a) = @_; |
199 | my $ar = Crossfire::arch_attr $a; |
199 | my $ar = Deliantra::arch_attr $a; |
200 | return ( |
200 | return ( |
201 | (substr $ar->{name}, 0, 5) eq 'Floor' |
201 | (substr $ar->{name}, 0, 5) eq 'Floor' |
202 | or (substr $ar->{name}, 0, 10) eq 'Shop Floor' |
202 | or (substr $ar->{name}, 0, 10) eq 'Shop Floor' |
203 | ) |
203 | ) |
204 | } |
204 | } |
205 | |
205 | |
206 | sub arch_is_connector { |
206 | sub arch_is_connector { |
207 | my ($a) = @_; |
207 | my ($a) = @_; |
208 | my $ar = Crossfire::arch_attr $a; |
208 | my $ar = Deliantra::arch_attr $a; |
209 | my $has_connect_field = 0; |
209 | my $has_connect_field = 0; |
210 | |
210 | |
211 | TOP: for (@{$ar->{section}}) { |
211 | TOP: for (@{$ar->{section}}) { |
212 | my $name = shift @$_; |
212 | my $name = shift @$_; |
213 | my @r = @$_; |
213 | my @r = @$_; |
… | |
… | |
226 | return $has_connect_field; |
226 | return $has_connect_field; |
227 | } |
227 | } |
228 | |
228 | |
229 | sub arch_is_wall { |
229 | sub arch_is_wall { |
230 | my ($a) = @_; |
230 | my ($a) = @_; |
231 | my $ar = Crossfire::arch_attr $a; |
231 | my $ar = Deliantra::arch_attr $a; |
232 | return $ar->{name} eq 'Wall'; |
232 | return $ar->{name} eq 'Wall'; |
233 | #return $Crossfire::ARCH{$a->{_name}}->{no_pass}; |
233 | #return $Deliantra::ARCH{$a->{_name}}->{no_pass}; |
234 | } |
234 | } |
235 | |
235 | |
236 | sub arch_is_monster { |
236 | sub arch_is_monster { |
237 | my ($a) = @_; |
237 | my ($a) = @_; |
238 | my $arch = $Crossfire::ARCH{$a->{_name}}; |
238 | my $arch = $Deliantra::ARCH{$a->{_name}}; |
239 | return $arch->{alive} and ($arch->{monster} or $arch->{generator}); |
239 | return $arch->{alive} and ($arch->{monster} or $arch->{generator}); |
240 | } |
240 | } |
241 | |
241 | |
242 | sub stack_find { |
242 | sub stack_find { |
243 | my ($stack, $dir, $pred) = @_; |
243 | my ($stack, $dir, $pred) = @_; |
… | |
… | |
286 | return [ $arch ]; |
286 | return [ $arch ]; |
287 | } |
287 | } |
288 | |
288 | |
289 | my @outstack; |
289 | my @outstack; |
290 | |
290 | |
291 | my $l = classify_arch_layer ($Crossfire::ARCH{$arch->{_name}}); |
291 | my $l = classify_arch_layer ($Deliantra::ARCH{$arch->{_name}}); |
292 | |
292 | |
293 | if ($l eq 'between') { |
293 | if ($l eq 'between') { |
294 | |
294 | |
295 | # loop until we reached the first 'between' arch above 'below' arches and the floor |
295 | # loop until we reached the first 'between' arch above 'below' arches and the floor |
296 | while (my $a = shift @$stack) { |
296 | while (my $a = shift @$stack) { |
297 | |
297 | |
298 | unless ($Crossfire::ARCH{$a->{_name}}->{is_floor} |
298 | unless ($Deliantra::ARCH{$a->{_name}}->{is_floor} |
299 | or classify_arch_layer ($Crossfire::ARCH{$a->{_name}}) eq 'below') { |
299 | or classify_arch_layer ($Deliantra::ARCH{$a->{_name}}) eq 'below') { |
300 | |
300 | |
301 | unshift @$stack, $a; |
301 | unshift @$stack, $a; |
302 | last; |
302 | last; |
303 | } |
303 | } |
304 | |
304 | |
… | |
… | |
363 | sub replace_arch_stack_layer { |
363 | sub replace_arch_stack_layer { |
364 | my ($stack, $arch) = @_; |
364 | my ($stack, $arch) = @_; |
365 | |
365 | |
366 | my @outstack; |
366 | my @outstack; |
367 | |
367 | |
368 | my $l = classify_arch_layer ($Crossfire::ARCH{$arch->{_name}}); |
368 | my $l = classify_arch_layer ($Deliantra::ARCH{$arch->{_name}}); |
369 | |
369 | |
370 | if ($l eq 'between') { |
370 | if ($l eq 'between') { |
371 | |
371 | |
372 | while (shift @$stack) { |
372 | while (shift @$stack) { |
373 | last unless $Crossfire::ARCH{$_->{_name}}->{is_floor}; |
373 | last unless $Deliantra::ARCH{$_->{_name}}->{is_floor}; |
374 | push @outstack, $_; |
374 | push @outstack, $_; |
375 | } |
375 | } |
376 | |
376 | |
377 | if (@outstack and $Crossfire::ARCH{$outstack[-1]->{_name}}->{is_floor}) { |
377 | if (@outstack and $Deliantra::ARCH{$outstack[-1]->{_name}}->{is_floor}) { |
378 | pop @outstack; |
378 | pop @outstack; |
379 | } |
379 | } |
380 | |
380 | |
381 | push @outstack, ($arch, @$stack); |
381 | push @outstack, ($arch, @$stack); |
382 | |
382 | |