ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/gde/GCE/Util.pm
(Generate patch)

Comparing deliantra/gde/GCE/Util.pm (file contents):
Revision 1.28 by elmex, Mon Oct 15 13:20:26 2007 UTC vs.
Revision 1.29 by root, Thu Dec 27 22:28:01 2007 UTC

7 7
8=cut 8=cut
9 9
10use base 'Exporter'; 10use base 'Exporter';
11 11
12use Crossfire; 12use Deliantra;
13 13
14use Carp (); 14use Carp ();
15use Storable; 15use Storable;
16use List::Util qw(min max); 16use List::Util qw(min max);
17 17
18use Crossfire; 18use Deliantra;
19use Crossfire::MapWidget; 19use Deliantra::MapWidget;
20use File::Spec::Functions; 20use File::Spec::Functions;
21use File::Basename; 21use File::Basename;
22use File::Path; 22use File::Path;
23use HTTP::Request::Common; 23use HTTP::Request::Common;
24use Cwd 'abs_path'; 24use Cwd 'abs_path';
151} 151}
152 152
153sub fill_pb_from_arch { 153sub 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
191sub arch_is_exit { 191sub 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
197sub arch_is_floor { 197sub 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
206sub arch_is_connector { 206sub 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
229sub arch_is_wall { 229sub 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
236sub arch_is_monster { 236sub 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
242sub stack_find { 242sub 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
363sub replace_arch_stack_layer { 363sub 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines