-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtypes.ts
128 lines (104 loc) · 2.18 KB
/
types.ts
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
export const FILE_NAMES = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as const;
export type FileName = typeof FILE_NAMES[number];
export const RANK_NAMES = ['1', '2', '3', '4', '5', '6', '7', '8'] as const;
export type RankName = typeof RANK_NAMES[number];
export type Square = number;
export type SquareName = `${FileName}${RankName}`;
/**
* Indexable by square indices.
*/
export type BySquare<T> = T[];
export const COLORS = ['white', 'black'] as const;
export type Color = typeof COLORS[number];
/**
* Indexable by `white` and `black`.
*/
export type ByColor<T> = {
[color in Color]: T;
};
//curretnly supported pieces, should change to use Role to accept all new peices.
export const ROLES = ['p-piece', 'n-piece', 'b-piece', 'r-piece', 'q-piece', 'k-piece', 'l-piece'] as const;
//export type Role = typeof ROLES[number];
export const letters = [
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
] as const;
export type Letter = typeof letters[number];
export type Role = `${Letter}-piece` | `p${Letter}-piece`;
/**
* Indexable by `pawn`, `knight`, `bishop`, `rook`, `queen`, and `king`.
*/
export type ByRole<T> = {
[role in Role]: T;
};
export const CASTLING_SIDES = ['a', 'h'] as const;
export type CastlingSide = typeof CASTLING_SIDES[number];
/**
* Indexable by `a` and `h`.
*/
export type ByCastlingSide<T> = {
[side in CastlingSide]: T;
};
export interface Piece {
role: Role;
color: Color;
promoted?: boolean;
}
export interface NormalMove {
from: Square;
to: Square;
promotion?: Role;
}
export interface DropMove {
role: Role;
to: Square;
}
export type Move = NormalMove | DropMove;
export function isDrop(v: Move): v is DropMove {
return 'role' in v;
}
export function isNormal(v: Move): v is NormalMove {
return 'from' in v;
}
export const RULES = [
'chess',
'antichess',
'kingofthehill',
'3check',
'5check',
'atomic',
'horde',
'racingkings',
'crazyhouse',
'linesofaction',
'shogi',
'xiangqi',
] as const;
export type Rules = typeof RULES[number];
export interface Outcome {
winner: Color | undefined;
}