Early draft of Wildebeest + Grand
[vchess.git] / public / javascripts / variants / Grand.js
1 //https://www.chessvariants.com/large.dir/freeling.html
2 class GrandRules extends ChessRules
3 {
4 static getPpath(b)
5 {
6 const V = VariantRules;
7 return ([V.CAMEL,V.WILDEBEEST].includes(b[1]) ? "Grand/" : "") + b;
8 }
9
10 static get MARSHALL() { return 'm'; } //rook+knight
11 static get CARDINAL() { return 'c'; } //bishop+knight
12
13 // ------> pas les règles exactes, on démarre en 2 avec 1,2 ou 3 cases + enPassant comme Wildebeest
14 // TODO: IN epSquares (return array), not return singleton. Easy. Adapt
15 // just here for now...
16 getEpSquare(move)
17 {
18 const [sx,sy,ex] = [move.start.x,move.start.y,move.end.x];
19 if (this.getPiece(sx,sy) == VariantRules.PAWN && Math.abs(sx - ex) == 2)
20 {
21 return {
22 x: (sx + ex)/2,
23 y: sy
24 };
25 }
26 return undefined; //default
27 }
28
29 getPotentialMovesFrom([x,y])
30 {
31 switch (this.getPiece(x,y))
32 {
33 case VariantRules.MARSHALL:
34 return this.getPotentialMarshallMoves([x,y]);
35 case VariantRules.CARDINAL:
36 return this.getPotentialCardinalMoves([x,y]);
37 default:
38 return super.getPotentialMovesFrom([x,y])
39 }
40 }
41
42 // TODO: quite many changes! Especially promotions, only to friendly pieces already captured. ==> keep track of captured material in initVariables()......
43 getPotentialPawnMoves([x,y])
44 {
45 }
46
47 getPotentialMarshallMoves(sq)
48 {
49 const V = VariantRules;
50 return this.getSlideNJumpMoves(sq, V.steps[V.ROOK]).concat(
51 this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"));
52 }
53
54 getPotentialCardinalMoves(sq)
55 {
56 const V = VariantRules;
57 return this.getSlideNJumpMoves(sq, V.steps[V.BISHOP]).concat(
58 this.getSlideNJumpMoves(sq, V.steps[V.KNIGHT], "oneStep"));
59 }
60
61 isAttacked(sq, colors)
62 {
63 return (super.isAttacked(sq, colors)
64 || this.isAttackedByMarshall(sq, colors)
65 || this.isAttackedByCardinal(sq, colors);
66 }
67
68 isAttackedByMarshall(sq, colors)
69 {
70 const V = VariantRules;
71 return this.isAttackedBySlideNJump(sq, colors, V.MARSHALL, V.steps[V.ROOK])
72 || this.isAttackedBySlideNJump(sq, colors, V.MARSHALL, V.steps[V.KNIGHT], "oneStep");
73 }
74
75 isAttackedByCardinal(sq, colors)
76 {
77 const V = VariantRules;
78 return this.isAttackedBySlideNJump(sq, colors, V.CARDINAL, V.steps[V.BISHOP])
79 || this.isAttackedBySlideNJump(sq, colors, V.CARDINAL, V.steps[V.KNIGHT], "oneStep");
80 }
81
82 static get VALUES() {
83 return Object.assign(
84 ChessRules.VALUES,
85 {'c': 5, 'm': 7} //experimental
86 );
87 }
88
89 // TODO:
90 static GenRandInitFen()
91 {
92 }
93 }