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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
pub type Figure = usize;
pub const NO_FIGURE: Figure = 0;
pub const PAWN: Figure = 1;
pub const KNIGHT: Figure = 2;
pub const BISHOP: Figure = 3;
pub const ROOK: Figure = 4;
pub const QUEEN: Figure = 5;
pub const KING: Figure = 6;
pub const LANCER: Figure = 7;
pub const LANCERN: Figure = 8;
pub const LANCERNE: Figure = 9;
pub const LANCERE: Figure = 10;
pub const LANCERSE: Figure = 11;
pub const LANCERS: Figure = 12;
pub const LANCERSW: Figure = 13;
pub const LANCERW: Figure = 14;
pub const LANCERNW: Figure = 15;
pub const SENTRY: Figure = 16;
pub const JAILER: Figure = 17;
pub const FIGURE_FEN_SYMBOLS: [&str; 18] = [
".", "p", "n", "p", "r", "q", "k", "l", "ln", "lne", "le", "lse", "ls", "lsw", "lw", "lnw",
"s", "j",
];
pub const FIGURE_SAN_LETTERS: [&str; 18] = [
".", "P", "N", "P", "R", "Q", "K", "L", "L", "L", "L", "L", "L", "L", "L", "L", "S", "J",
];
pub trait FigureTrait {
fn symbol(self) -> &'static str;
}
impl FigureTrait for Figure {
fn symbol(self) -> &'static str {
FIGURE_FEN_SYMBOLS[self]
}
}
pub type Color = usize;
pub const BLACK: Color = 0;
pub const WHITE: Color = 1;
pub type Piece = usize;
pub const PIECE_FEN_SYMBOLS: [&str; 36] = [
".", ".", "p", "P", "n", "N", "p", "P", "r", "R", "q", "Q", "k", "K", "l", "L", "ln", "Ln",
"lne", "Lne", "le", "Le", "lse", "Lse", "ls", "Ls", "lsw", "Lsw", "lw", "Lw", "lnw", "Lnw",
"s", "S", "j", "J",
];
pub fn color_figure(col: Color, fig: Figure) -> Piece {
(2 * fig) + col
}
pub trait PieceTrait {
fn color(self) -> Color;
fn figure(self) -> Figure;
fn fen_symbol(self) -> &'static str;
fn san_symbol(self) -> &'static str;
fn uci_symbol(self) -> &'static str;
fn san_letter(self) -> &'static str;
}
impl PieceTrait for Piece {
fn color(self) -> Color {
return if self & 1 == 0 { BLACK } else { WHITE };
}
fn figure(self) -> Figure {
self >> 1
}
fn fen_symbol(self) -> &'static str {
PIECE_FEN_SYMBOLS[self]
}
fn san_symbol(self) -> &'static str {
return color_figure(WHITE, self.figure()).fen_symbol();
}
fn uci_symbol(self) -> &'static str {
return self.figure().symbol();
}
fn san_letter(self) -> &'static str {
FIGURE_SAN_LETTERS[self.figure()]
}
}