--- deliantra/Deliantra/Deliantra.pm 2006/03/12 16:23:56 1.35 +++ deliantra/Deliantra/Deliantra.pm 2006/03/12 23:21:11 1.36 @@ -17,8 +17,6 @@ use List::Util qw(min max); use Storable; -#XXX: The map_* procedures scream for a map-object - our @EXPORT = qw(read_pak read_arch %ARCH TILESIZE $TILE %FACE editor_archs arch_extents); @@ -313,12 +311,12 @@ require Crossfire::Data; - my $attr; + my $root; if ($arch->{type} > 0) { - $attr = $Crossfire::Data::ATTR{$arch->{type}+0}; + $root = $Crossfire::Data::ATTR{$arch->{type}+0}; } else { - $attr = $Crossfire::Data::TYPE{Misc}; + $root = $Crossfire::Data::TYPE{Misc}; type: for (@Crossfire::Data::ATTR0) { @@ -331,11 +329,56 @@ unless $arch->{$k} == $v; } - $attr = $_; + $root = $_; } } - $attr || \%Crossfire::Data::DEFAULT_ATTR; + my $attr = { }; + + my @import = $root || \%Crossfire::Data::DEFAULT_ATTR; + my (%ignore); + my (@section_order, %section, @attr_order); + + while (my $type = shift @import) { + push @import, @{$type->{import} || []}; + + $attr->{$_} ||= $type->{$_} + for qw(name desc use); + + for (@{$type->{ignore} || []}) { + $ignore{$_}++ for ref $_ ? @$_ : $_; + } + + for ([general => ($type->{attr} || {})], @{$type->{section} || []}) { + my ($name, $attr) = @$_; + push @section_order, $name; + for (@$attr) { + my ($k, $v) = @$_; + push @attr_order, $k; + $section{$name}{$k} ||= $v; + } + } + } + + $attr->{section} = [ + map !exists $section{$_} ? () : do { + my $attr = delete $section{$_}; + + [ + $_, + map exists $attr->{$_} ? [$_ => delete $attr->{$_}] : (), + @attr_order + ] + }, + + exists $section{$_} ? [$_ => delete $section{$_}] : (), + @section_order + ]; + + use PApp::Util; + warn PApp::Util::dumpval $attr; + + $attr } sub arch_edit_sections {