… | |
… | |
162 | \@arch |
162 | \@arch |
163 | } |
163 | } |
164 | |
164 | |
165 | sub as_mapstring { |
165 | sub as_mapstring { |
166 | my ($self) = @_; |
166 | my ($self) = @_; |
167 | |
|
|
168 | my $arch = $self->as_archlist; |
167 | my $arch = $self->as_archlist; |
169 | |
168 | Crossfire::archlist_to_string ($arch) |
170 | my $str; |
|
|
171 | |
|
|
172 | my $append; $append = sub { |
|
|
173 | my %a = %{$_[0]}; |
|
|
174 | |
|
|
175 | Crossfire::attr_freeze \%a; |
|
|
176 | Crossfire::normalize_arch \%a; |
|
|
177 | |
|
|
178 | # undo the bit-split we did before |
|
|
179 | if (exists $a{attack_movement_bits_0_3} or exists $a{attack_movement_bits_4_7}) { |
|
|
180 | $a{attack_movement} = (delete $a{attack_movement_bits_0_3}) |
|
|
181 | | (delete $a{attack_movement_bits_4_7}); |
|
|
182 | } |
|
|
183 | |
|
|
184 | $str .= "arch $a{_name}\n"; |
|
|
185 | |
|
|
186 | my $inv = delete $a{inventory}; |
|
|
187 | delete $a{more}; # arches do not support 'more', but old maps can contain some |
|
|
188 | |
|
|
189 | my @kv; |
|
|
190 | |
|
|
191 | for ($a{_name} eq "map" |
|
|
192 | ? @Crossfire::FIELD_ORDER_MAP |
|
|
193 | : @Crossfire::FIELD_ORDER) { |
|
|
194 | push @kv, [$_, delete $a{$_}] |
|
|
195 | if exists $a{$_}; |
|
|
196 | } |
|
|
197 | |
|
|
198 | for (sort keys %a) { |
|
|
199 | next if /^_/; # ignore our _-keys |
|
|
200 | push @kv, [$_, delete $a{$_}]; |
|
|
201 | } |
|
|
202 | |
|
|
203 | for (@kv) { |
|
|
204 | my ($k, $v) = @$_; |
|
|
205 | |
|
|
206 | if (my $end = $Crossfire::FIELD_MULTILINE{$k}) { |
|
|
207 | $v =~ s/\n$//; |
|
|
208 | $str .= "$k\n$v\n$end\n"; |
|
|
209 | } elsif (exists $Crossfire::FIELD_MOVEMENT{$k}) { |
|
|
210 | if ($v & ~Crossfire::MOVE_ALL or !$v) { |
|
|
211 | $str .= "$k $v\n"; |
|
|
212 | |
|
|
213 | } elsif ($v & Crossfire::MOVE_ALLBIT) { |
|
|
214 | $str .= "$k all"; |
|
|
215 | |
|
|
216 | $str .= " -walk" unless $v & Crossfire::MOVE_WALK; |
|
|
217 | $str .= " -fly_low" unless $v & Crossfire::MOVE_FLY_LOW; |
|
|
218 | $str .= " -fly_high" unless $v & Crossfire::MOVE_FLY_HIGH; |
|
|
219 | $str .= " -swim" unless $v & Crossfire::MOVE_SWIM; |
|
|
220 | $str .= " -boat" unless $v & Crossfire::MOVE_BOAT; |
|
|
221 | |
|
|
222 | $str .= "\n"; |
|
|
223 | |
|
|
224 | } else { |
|
|
225 | $str .= $k; |
|
|
226 | |
|
|
227 | $str .= " walk" if $v & Crossfire::MOVE_WALK; |
|
|
228 | $str .= " fly_low" if $v & Crossfire::MOVE_FLY_LOW; |
|
|
229 | $str .= " fly_high" if $v & Crossfire::MOVE_FLY_HIGH; |
|
|
230 | $str .= " swim" if $v & Crossfire::MOVE_SWIM; |
|
|
231 | $str .= " boat" if $v & Crossfire::MOVE_BOAT; |
|
|
232 | |
|
|
233 | $str .= "\n"; |
|
|
234 | } |
|
|
235 | } else { |
|
|
236 | $str .= "$k $v\n"; |
|
|
237 | } |
|
|
238 | } |
|
|
239 | |
|
|
240 | if ($inv) { |
|
|
241 | $append->($_) for @$inv; |
|
|
242 | } |
|
|
243 | |
|
|
244 | $str .= "end\n"; |
|
|
245 | |
|
|
246 | }; |
|
|
247 | |
|
|
248 | for (@$arch) { |
|
|
249 | $append->($_); |
|
|
250 | } |
|
|
251 | |
|
|
252 | $str |
|
|
253 | } |
169 | } |
254 | |
170 | |
255 | sub write_file { |
171 | sub write_file { |
256 | my ($self, $path) = @_; |
172 | my ($self, $path) = @_; |
257 | |
173 | |