Skip to content

Commit cd6fab4

Browse files
authored
Merge pull request #8 from Belzedar94/codex/iron-pieces
Add iron/uncapturable pieces support (Fixes fairy-stockfish#606)
2 parents f4f8ef1 + d14c8c4 commit cd6fab4

File tree

6 files changed

+22
-0
lines changed

6 files changed

+22
-0
lines changed
File renamed without changes.

src/parser.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ Variant* VariantParser<DoCheck>::parse(Variant* v) {
419419
parse_attribute("blastOnCapture", v->blastOnCapture);
420420
parse_attribute("blastImmuneTypes", v->blastImmuneTypes, v->pieceToChar);
421421
parse_attribute("mutuallyImmuneTypes", v->mutuallyImmuneTypes, v->pieceToChar);
422+
parse_attribute("ironPieceTypes", v->ironPieceTypes, v->pieceToChar);
422423
parse_attribute("petrifyOnCaptureTypes", v->petrifyOnCaptureTypes, v->pieceToChar);
423424
parse_attribute("petrifyBlastPieces", v->petrifyBlastPieces);
424425
parse_attribute("doubleStep", v->doubleStep);

src/position.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,14 @@ bool Position::legal(Move m) const {
12101210
)
12111211
return false;
12121212

1213+
// Iron pieces: any attempt to capture them is illegal (but they can capture normally)
1214+
if (capture(m)) {
1215+
Square csq = (type_of(m) == EN_PASSANT) ? capture_square(to) : to;
1216+
Piece cpc = piece_on(csq);
1217+
if (cpc != NO_PIECE && (iron_piece_types() & type_of(cpc)))
1218+
return false;
1219+
}
1220+
12131221
// En passant captures are a tricky special case. Because they are rather
12141222
// uncommon, we do it simply by testing whether the king is attacked after
12151223
// the move is made.

src/position.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ class Position {
142142
bool blast_on_capture() const;
143143
PieceSet blast_immune_types() const;
144144
PieceSet mutually_immune_types() const;
145+
PieceSet iron_piece_types() const;
145146
EndgameEval endgame_eval() const;
146147
Bitboard double_step_region(Color c) const;
147148
Bitboard triple_step_region(Color c) const;
@@ -518,6 +519,11 @@ inline PieceSet Position::mutually_immune_types() const {
518519
return var->mutuallyImmuneTypes;
519520
}
520521

522+
inline PieceSet Position::iron_piece_types() const {
523+
assert(var != nullptr);
524+
return var->ironPieceTypes;
525+
}
526+
521527
inline EndgameEval Position::endgame_eval() const {
522528
assert(var != nullptr);
523529
return !count_in_hand(ALL_PIECES) && (var->endgameEval != EG_EVAL_CHESS || count<KING>() == 2) ? var->endgameEval : NO_EG_EVAL;

src/variant.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ struct Variant {
6666
bool blastOnCapture = false;
6767
PieceSet blastImmuneTypes = NO_PIECE_SET;
6868
PieceSet mutuallyImmuneTypes = NO_PIECE_SET;
69+
// Iron pieces: attempts to capture these piece types are illegal
70+
PieceSet ironPieceTypes = NO_PIECE_SET;
6971
PieceSet petrifyOnCaptureTypes = NO_PIECE_SET;
7072
bool petrifyBlastPieces = false;
7173
bool doubleStep = true;

src/variants.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@
185185
# blastOnCapture: captures explode all adjacent non-pawn pieces (e.g., atomic chess) [bool] (default: false)
186186
# blastImmuneTypes: pieces completely immune to explosions (even at ground zero) [PieceSet] (default: none)
187187
# mutuallyImmuneTypes: pieces that can't capture another piece of same types (e.g., kings (commoners) in atomar) [PieceSet] (default: none)
188+
# ironPieceTypes: pieces that are uncapturable (attempting to capture them is illegal) [PieceSet] (default: none)
188189
# petrifyOnCaptureTypes: defined pieces are turned into wall squares when capturing [PieceSet] (default: -)
189190
# petrifyBlastPieces: if petrify and blast combined, should pieces destroyed in the blast be petrified? [bool] (default: false)
190191
# doubleStep: enable pawn double step [bool] (default: true)
@@ -2045,3 +2046,7 @@ flagRegionWhite = *10
20452046
flagRegionBlack = *1
20462047
immobilityIllegal = true
20472048
mandatoryPiecePromotion = true
2049+
2050+
# Iron pieces demo: pawns are uncapturable; everything else behaves normally.
2051+
[iron-pawns:chess]
2052+
ironPieceTypes = p

0 commit comments

Comments
 (0)