+sub magic_for
+{
+ my $self=shift;
+ my ($x_middle,$mult_x,$y_middle,$mult_y,$sub) = @_;
+ #warn join "\t",($x_middle,$mult_x,$y_middle,$mult_y,$sub);
+ my @return;
+ die "no function" if not ref $sub;
+ my $start_x = $x_middle ? $main::x{$x_middle}-1 - $mult_x+1 : 0;
+ my $stop_x = $x_middle ? $main::x{$x_middle}-1 + $mult_x-1 : $#main::x;
+ my $start_y = $y_middle ? $main::y{$y_middle}-1 - $mult_y+1 : 0;
+ my $stop_y = $y_middle ? $main::y{$y_middle}-1 + $mult_y-1 : $#main::y;
+ for my $x_idx ($start_x..$stop_x)
+ {
+ my $x = $x_idx> $#main::x ? $main::x[$x_idx-@main::x] : $main::x[$x_idx];
+ for my $y_idx ($start_y..$stop_y)
+ {
+ my $y = $y_idx> $#main::y ? $main::y[$y_idx-@main::y] : $main::y[$y_idx];
+ push @return, $sub->($self,$x,$y);
+ }
+ }
+ return @return;
+}
+
+sub set_highlight_selected
+{
+ my ($self,$x,$y) = @_;
+ $self->get_current_player->{highlight}{selected}{$x}{$y}=1;
+}
+
+sub set_shoot
+{
+ my ($self,$x,$y) = @_;
+ my $return;
+ my $player=$self->get_current_player();
+ $player->{highlight}{shoot}->{$x}{$y} = 1;
+ if ($player->{score}->{$x}{$y} eq 's')
+ {
+ $return = 'scored';
+ $player->{score}->{$x}{$y} = 'X';
+ } elsif (not $player->{score}->{$x}{$y}) {
+ $player->{score}->{$x}{$y} = 'o';
+ $return = 'miss';
+ } elsif ($player->{score}->{$x}{$y} eq 'o') {
+ $return = 'scho';
+ }
+ return $return;
+}
+