ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Games-Sokoban/Sokoban.pm
(Generate patch)

Comparing Games-Sokoban/Sokoban.pm (file contents):
Revision 1.5 by root, Tue May 11 23:48:40 2010 UTC vs.
Revision 1.6 by root, Tue May 11 23:49:40 2010 UTC

70 Carp::croak "unable to autodetect sokoban level format"; 70 Carp::croak "unable to autodetect sokoban level format";
71} 71}
72 72
73=item $level->data ([$new_data, [$new_data_format]]]) 73=item $level->data ([$new_data, [$new_data_format]]])
74 74
75Sets the level from the given data.
76
75=cut 77=cut
76 78
77sub data { 79sub data {
80 if (@_ > 1) {
78 my ($self, $data, $format) = @_; 81 my ($self, $data, $format) = @_;
79 82
80 $format ||= detect_format $data; 83 $format ||= detect_format $data;
81 84
82 if ($format eq "text" or $format eq "rle") { 85 if ($format eq "text" or $format eq "rle") {
83 $data =~ y/-_|/ \n/; 86 $data =~ y/-_|/ \n/;
84 $data =~ s/(\d)(.)/$2 x $1/ge; 87 $data =~ s/(\d)(.)/$2 x $1/ge;
85 my @lines = split /[\015\012]+/, $data; 88 my @lines = split /[\015\012]+/, $data;
86 my $w = List::Util::max map length, @lines; 89 my $w = List::Util::max map length, @lines;
87 90
88 $_ .= " " x ($w - length) 91 $_ .= " " x ($w - length)
89 for @lines; 92 for @lines;
90 93
91 $self->{data} = join "\n", @lines; 94 $self->{data} = join "\n", @lines;
92 95
93 } elsif ($format eq "binpack") { 96 } elsif ($format eq "binpack") {
94 (my ($w, $s), $data) = unpack "wwB*", $data; 97 (my ($w, $s), $data) = unpack "wwB*", $data;
95 98
96 my @enc = ('#', '$', '.', ' ', ' ', '###', '*', '# '); 99 my @enc = ('#', '$', '.', ' ', ' ', '###', '*', '# ');
97 100
98 $data = join "", 101 $data = join "",
99 map $enc[$_], 102 map $enc[$_],
100 unpack "C*", 103 unpack "C*",
101 pack "(b*)*", 104 pack "(b*)*",
102 unpack "(a3)*", $data; 105 unpack "(a3)*", $data;
103 106
104 # clip extra chars (max. 2) 107 # clip extra chars (max. 2)
105 my $extra = (length $data) % $w; 108 my $extra = (length $data) % $w;
106 substr $data, -$extra, $extra, "" if $extra; 109 substr $data, -$extra, $extra, "" if $extra;
107 110
108 (substr $data, $s, 1) =~ y/ ./@+/; 111 (substr $data, $s, 1) =~ y/ ./@+/;
109 112
110 $self->{data} = 113 $self->{data} =
111 join "\n", 114 join "\n",
112 map "#$_#", 115 map "#$_#",
113 "#" x $w, 116 "#" x $w,
114 (unpack "(a$w)*", $data), 117 (unpack "(a$w)*", $data),
115 "#" x $w; 118 "#" x $w;
116 119
117 } else { 120 } else {
118 Carp::croak "$format: unsupported sokoban level format requested"; 121 Carp::croak "$format: unsupported sokoban level format requested";
119 } 122 }
120 123
121 $self->update; 124 $self->update;
125 }
122 126
123 ($self->{data}) 127 $_[0]{data}
124} 128}
125 129
126sub pos2xy { 130sub pos2xy {
127 use integer; 131 use integer;
128 132

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines