… | |
… | |
21 | res/typenumbers.xml |
21 | res/typenumbers.xml |
22 | |
22 | |
23 | See F<res/README> for more info. |
23 | See F<res/README> for more info. |
24 | |
24 | |
25 | =cut |
25 | =cut |
|
|
26 | |
|
|
27 | package Crossfire::Data; |
26 | |
28 | |
27 | EOF |
29 | EOF |
28 | |
30 | |
29 | use Data::Dumper; |
31 | use Data::Dumper; |
30 | use XML::Parser::Grove; |
32 | use XML::Parser::Grove; |
… | |
… | |
97 | |
99 | |
98 | if ($arch->{type} =~ s/^(bitmask)_(.*)/$1/) { |
100 | if ($arch->{type} =~ s/^(bitmask)_(.*)/$1/) { |
99 | $arch->{value} = $bitmask{$2} ||= {}; |
101 | $arch->{value} = $bitmask{$2} ||= {}; |
100 | } elsif ($arch->{type} =~ s/^(list)_(.*)/$1/) { |
102 | } elsif ($arch->{type} =~ s/^(list)_(.*)/$1/) { |
101 | $arch->{value} = $list{$2} ||= {}; |
103 | $arch->{value} = $list{$2} ||= {}; |
|
|
104 | } elsif ($arch->{type} eq "fixed") { |
|
|
105 | $arch->{value} = $e->attr ("value"); |
102 | } elsif ($arch->{type} =~ s/^bool_special$/bool/) { |
106 | } elsif ($arch->{type} =~ s/^bool_special$/bool/) { |
103 | $arch->{value} = [$e->attr ("false"), $e->attr ("true")]; |
107 | $arch->{value} = [$e->attr ("false"), $e->attr ("true")]; |
104 | } |
108 | } |
105 | |
109 | |
106 | $sect->{$e->attr ("arch") || $e->attr("arch_begin")} = $arch; |
110 | $sect->{$e->attr ("arch") || $e->attr("arch_begin")} = $arch; |
107 | } |
111 | } |
108 | |
112 | |
109 | sub parse_type { |
113 | sub parse_type { |
110 | my ($e, $type) = @_; |
114 | my ($e, $type) = @_; |
|
|
115 | |
|
|
116 | my %main; |
111 | |
117 | |
112 | for my $e (grep ref, @{$e->contents}) { |
118 | for my $e (grep ref, @{$e->contents}) { |
113 | if ($e->name eq "required") { |
119 | if ($e->name eq "required") { |
114 | for my $i (grep ref, @{$e->contents}) { |
120 | for my $i (grep ref, @{$e->contents}) { |
115 | $type->{required}{$i->attr ("arch")} = $i->attr ("value"); |
121 | $type->{required}{$i->attr ("arch")} = $i->attr ("value"); |
116 | } |
122 | } |
117 | } elsif ($e->name eq "attribute") { |
123 | } elsif ($e->name eq "attribute") { |
118 | parse_attr $e, $type->{attr}{Main} ||= {}; |
124 | parse_attr $e, $type->{attr} ||= {}; |
119 | } elsif ($e->name eq "ignore") { |
125 | } elsif ($e->name eq "ignore") { |
120 | for my $i (grep ref, @{$e->contents}) { |
126 | for my $i (grep ref, @{$e->contents}) { |
121 | if ($i->name eq "ignore_list") { |
127 | if ($i->name eq "ignore_list") { |
122 | push @{$type->{ignore}}, $ignore_list{$i->attr ("name")} ||= []; |
128 | push @{$type->{ignore}}, $ignore_list{$i->attr ("name")} ||= []; |
123 | } elsif ($i->name eq "attribute") { |
129 | } elsif ($i->name eq "attribute") { |
… | |
… | |
129 | } elsif ($e->name eq "use") { |
135 | } elsif ($e->name eq "use") { |
130 | $type->{use} = string $e; |
136 | $type->{use} = string $e; |
131 | } elsif ($e->name eq "description") { |
137 | } elsif ($e->name eq "description") { |
132 | $type->{desc} = string $e; |
138 | $type->{desc} = string $e; |
133 | } elsif ($e->name eq "section") { |
139 | } elsif ($e->name eq "section") { |
|
|
140 | my %attr; |
134 | for my $i (grep ref, @{$e->contents}) { |
141 | for my $i (grep ref, @{$e->contents}) { |
135 | parse_attr $i, $type->{attr}{$e->attr ("name")} ||= {}; |
142 | parse_attr $i, \%attr; |
136 | } |
143 | } |
|
|
144 | push @{ $type->{section} }, [$e->attr ("name") => \%attr]; |
137 | } else { |
145 | } else { |
138 | warn "unknown types subelement ", $e->name; |
146 | warn "unknown types subelement ", $e->name; |
139 | } |
147 | } |
140 | } |
148 | } |
141 | |
149 | |
… | |
… | |
160 | } |
168 | } |
161 | } elsif ($e->name eq "default_type") { |
169 | } elsif ($e->name eq "default_type") { |
162 | parse_type $e, \%default_attr; |
170 | parse_type $e, \%default_attr; |
163 | } elsif ($e->name eq "type") { |
171 | } elsif ($e->name eq "type") { |
164 | my $type = $type{$e->attr ("name")} ||= {}; |
172 | my $type = $type{$e->attr ("name")} ||= {}; |
|
|
173 | |
|
|
174 | $type->{name} = $e->attr ("name"); |
|
|
175 | |
165 | parse_type $e, $type; |
176 | parse_type $e, $type; |
166 | #unshift @{$type->{import}}, \%default_attr; |
|
|
167 | |
177 | |
168 | if ($e->attr ("number") > 0) { |
178 | if ($e->attr ("number") > 0) { |
169 | $attr{$e->attr ("number")} = $type; |
179 | $attr{$e->attr ("number")} = $type; |
170 | } elsif ($e->attr ("name") eq "Misc") { |
180 | } elsif ($e->attr ("name") eq "Misc") { |
171 | delete $type->{required}; |
181 | delete $type->{required}; |