File tree Expand file tree Collapse file tree 6 files changed +22
-0
lines changed
Expand file tree Collapse file tree 6 files changed +22
-0
lines changed File renamed without changes.
Original file line number Diff line number Diff 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 );
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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+
521527inline 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;
Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff line change 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
20452046flagRegionBlack = *1
20462047immobilityIllegal = true
20472048mandatoryPiecePromotion = true
2049+
2050+ # Iron pieces demo: pawns are uncapturable; everything else behaves normally.
2051+ [iron-pawns:chess]
2052+ ironPieceTypes = p
You can’t perform that action at this time.
0 commit comments