1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package Bot::Games::Game::Chess;
use Bot::Games::OO;
with 'Bot::Games::Game::Role::CurrentPlayer';
use Chess::Rep;
use App::Nopaste;
has '+help' => (
default => 'chess help',
);
has game => (
is => 'ro',
isa => 'Chess::Rep',
default => sub { Chess::Rep->new },
);
has turn_count => (
traits => [qw(Counter)],
is => 'ro',
isa => 'Int',
default => 1,
handles => {
inc_turn => 'inc',
}
);
sub turn {
my $self = shift;
my ($player, $move) = @_;
$self->maybe_add_player($player);
return "The game has already begun between " . join ' and ', $self->players
unless $self->has_player($player);
return "It's not your turn"
if $player ne $self->current_player;
my $status = eval { $self->game->go_move($move) };
return $@ if $@;
my $desc = $self->format_turn($status);
$self->inc_turn if $self->game->to_move;
$self->is_active(0) if $self->game->status->{mate}
|| $self->game->status->{stalemate};
$self->current_player($self->next_player);
return "$desc: " . App::Nopaste::nopaste(text => $self->game->dump_pos,
desc => $desc,
nick => $player);
};
around allow_new_player => sub {
my $orig = shift;
my $self = shift;
return if $self->num_players >= 2;
return $self->$orig(@_);
};
command resign => sub {
my $self = shift;
my ($dummy, $args) = @_;
$self->is_active(0);
return "$args->{sender} resigns: "
. App::Nopaste::nopaste(text => $self->game->dump_pos,
nick => $args->{sender})
};
command state => sub {
my $self = shift;
my ($dummy, $args) = @_;
my $player;
if ($self->num_players == 2) {
$player = $self->current_player;
$player .= $self->game->to_move ? ' (white)' : ' (black)';
}
else {
$player = $self->game->to_move ? 'White' : 'Black';
}
return "$player to play: "
. App::Nopaste::nopaste(text => $self->game->dump_pos,
nick => $args->{sender});
};
sub format_turn {
my $self = shift;
my ($turn) = @_;
my $ret = $self->turn_count . ". ";
$ret .= "... " if $self->game->to_move;
$ret .= $turn->{san};
return $ret;
}
__PACKAGE__->meta->make_immutable;
no Bot::Games::OO;
1;
|