ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra/Deliantra/Map.pm
(Generate patch)

Comparing deliantra/Deliantra/Deliantra/Map.pm (file contents):
Revision 1.24 by root, Sun Aug 27 16:33:20 2006 UTC vs.
Revision 1.25 by elmex, Thu Aug 31 21:09:33 2006 UTC

162 \@arch 162 \@arch
163} 163}
164 164
165sub as_mapstring { 165sub 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
255sub write_file { 171sub write_file {
256 my ($self, $path) = @_; 172 my ($self, $path) = @_;
257 173

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines