--- Games-Sokoban/Sokoban.pm 2010/05/11 23:48:40 1.5 +++ Games-Sokoban/Sokoban.pm 2010/05/11 23:49:40 1.6 @@ -72,55 +72,59 @@ =item $level->data ([$new_data, [$new_data_format]]]) +Sets the level from the given data. + =cut sub data { - my ($self, $data, $format) = @_; + if (@_ > 1) { + my ($self, $data, $format) = @_; - $format ||= detect_format $data; + $format ||= detect_format $data; - if ($format eq "text" or $format eq "rle") { - $data =~ y/-_|/ \n/; - $data =~ s/(\d)(.)/$2 x $1/ge; - my @lines = split /[\015\012]+/, $data; - my $w = List::Util::max map length, @lines; - - $_ .= " " x ($w - length) - for @lines; - - $self->{data} = join "\n", @lines; - - } elsif ($format eq "binpack") { - (my ($w, $s), $data) = unpack "wwB*", $data; - - my @enc = ('#', '$', '.', ' ', ' ', '###', '*', '# '); - - $data = join "", - map $enc[$_], - unpack "C*", - pack "(b*)*", - unpack "(a3)*", $data; - - # clip extra chars (max. 2) - my $extra = (length $data) % $w; - substr $data, -$extra, $extra, "" if $extra; - - (substr $data, $s, 1) =~ y/ ./@+/; - - $self->{data} = - join "\n", - map "#$_#", - "#" x $w, - (unpack "(a$w)*", $data), - "#" x $w; - - } else { - Carp::croak "$format: unsupported sokoban level format requested"; - } + if ($format eq "text" or $format eq "rle") { + $data =~ y/-_|/ \n/; + $data =~ s/(\d)(.)/$2 x $1/ge; + my @lines = split /[\015\012]+/, $data; + my $w = List::Util::max map length, @lines; + + $_ .= " " x ($w - length) + for @lines; + + $self->{data} = join "\n", @lines; + + } elsif ($format eq "binpack") { + (my ($w, $s), $data) = unpack "wwB*", $data; + + my @enc = ('#', '$', '.', ' ', ' ', '###', '*', '# '); + + $data = join "", + map $enc[$_], + unpack "C*", + pack "(b*)*", + unpack "(a3)*", $data; + + # clip extra chars (max. 2) + my $extra = (length $data) % $w; + substr $data, -$extra, $extra, "" if $extra; + + (substr $data, $s, 1) =~ y/ ./@+/; + + $self->{data} = + join "\n", + map "#$_#", + "#" x $w, + (unpack "(a$w)*", $data), + "#" x $w; + + } else { + Carp::croak "$format: unsupported sokoban level format requested"; + } - $self->update; + $self->update; + } - ($self->{data}) + $_[0]{data} } sub pos2xy {